From 79e9d02f307a89d331736925ff49afb2f77661d6 Mon Sep 17 00:00:00 2001 From: Danil Nemirovsky Date: Thu, 21 Nov 2024 16:22:47 +0000 Subject: [PATCH 01/18] fix: Avoid Relayer to use GetBlock for Sealevel (#4883) ### Description Avoid Relayer to use GetBlock for Sealevel. It is a temporary solution until we migrate Sealevel integration to the latest Solana libraries ### Related issues - Contributes into https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/4271 ### Backward compatibility Yes ### Testing E2E Ethereum and Sealevel test --------- Co-authored-by: Danil Nemirovsky <4614623+ameten@users.noreply.github.com> --- rust/main/agents/relayer/src/relayer.rs | 3 + rust/main/agents/scraper/src/agent.rs | 3 + rust/main/agents/validator/src/validator.rs | 1 + .../hyperlane-sealevel/src/interchain_gas.rs | 46 ++++++----- .../chains/hyperlane-sealevel/src/mailbox.rs | 82 ++++++++++--------- rust/main/hyperlane-base/src/settings/base.rs | 15 +++- .../hyperlane-base/src/settings/chains.rs | 72 ++++++++++++---- 7 files changed, 146 insertions(+), 76 deletions(-) diff --git a/rust/main/agents/relayer/src/relayer.rs b/rust/main/agents/relayer/src/relayer.rs index 1ac619792..6bd1a63a8 100644 --- a/rust/main/agents/relayer/src/relayer.rs +++ b/rust/main/agents/relayer/src/relayer.rs @@ -152,6 +152,7 @@ impl BaseAgent for Relayer { dbs.iter() .map(|(d, db)| (d.clone(), Arc::new(db.clone()))) .collect(), + false, ) .await? .into_iter() @@ -166,6 +167,7 @@ impl BaseAgent for Relayer { dbs.iter() .map(|(d, db)| (d.clone(), Arc::new(db.clone()))) .collect(), + false, ) .await? .into_iter() @@ -180,6 +182,7 @@ impl BaseAgent for Relayer { dbs.iter() .map(|(d, db)| (d.clone(), Arc::new(db.clone()))) .collect(), + false, ) .await? .into_iter() diff --git a/rust/main/agents/scraper/src/agent.rs b/rust/main/agents/scraper/src/agent.rs index 97f6bd3db..443d1c7fa 100644 --- a/rust/main/agents/scraper/src/agent.rs +++ b/rust/main/agents/scraper/src/agent.rs @@ -198,6 +198,7 @@ impl Scraper { &metrics.clone(), &contract_sync_metrics.clone(), store.into(), + true, ) .await .unwrap(); @@ -229,6 +230,7 @@ impl Scraper { &metrics.clone(), &contract_sync_metrics.clone(), Arc::new(store.clone()) as _, + true, ) .await .unwrap(); @@ -261,6 +263,7 @@ impl Scraper { &metrics.clone(), &contract_sync_metrics.clone(), Arc::new(store.clone()), + true, ) .await .unwrap(); diff --git a/rust/main/agents/validator/src/validator.rs b/rust/main/agents/validator/src/validator.rs index 2d09bd93f..f7a8b43f5 100644 --- a/rust/main/agents/validator/src/validator.rs +++ b/rust/main/agents/validator/src/validator.rs @@ -109,6 +109,7 @@ impl BaseAgent for Validator { &metrics, &contract_sync_metrics, msg_db.clone().into(), + false, ) .await?; diff --git a/rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs b/rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs index e415e9bc7..4d5e819de 100644 --- a/rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs +++ b/rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs @@ -91,7 +91,8 @@ impl InterchainGasPaymaster for SealevelInterchainGasPaymaster {} pub struct SealevelInterchainGasPaymasterIndexer { rpc_client: SealevelRpcClient, igp: SealevelInterchainGasPaymaster, - _log_meta_composer: LogMetaComposer, + log_meta_composer: LogMetaComposer, + advanced_log_meta: bool, } /// IGP payment data on Sealevel @@ -107,6 +108,7 @@ impl SealevelInterchainGasPaymasterIndexer { pub async fn new( conf: &ConnectionConf, igp_account_locator: ContractLocator<'_>, + advanced_log_meta: bool, ) -> ChainResult { // Set the `processed` commitment at rpc level let rpc_client = SealevelRpcClient::new(conf.url.to_string()); @@ -122,7 +124,8 @@ impl SealevelInterchainGasPaymasterIndexer { Ok(Self { rpc_client, igp, - _log_meta_composer: log_meta_composer, + log_meta_composer, + advanced_log_meta, }) } @@ -168,23 +171,24 @@ impl SealevelInterchainGasPaymasterIndexer { gas_amount: gas_payment_account.gas_amount.into(), }; - // let log_meta = self - // .interchain_payment_log_meta( - // U256::from(sequence_number), - // &valid_payment_pda_pubkey, - // &gas_payment_account.slot, - // ) - // .await?; - - let log_meta = LogMeta { - address: self.igp.program_id.to_bytes().into(), - block_number: gas_payment_account.slot, - // TODO: get these when building out scraper support. - // It's inconvenient to get these :| - block_hash: H256::zero(), - transaction_id: H512::zero(), - transaction_index: 0, - log_index: sequence_number.into(), + let log_meta = if self.advanced_log_meta { + self.interchain_payment_log_meta( + U256::from(sequence_number), + &valid_payment_pda_pubkey, + &gas_payment_account.slot, + ) + .await? + } else { + LogMeta { + address: self.igp.program_id.to_bytes().into(), + block_number: gas_payment_account.slot, + // TODO: get these when building out scraper support. + // It's inconvenient to get these :| + block_hash: H256::zero(), + transaction_id: H512::zero(), + transaction_index: 0, + log_index: sequence_number.into(), + } }; Ok(SealevelGasPayment::new( @@ -212,7 +216,7 @@ impl SealevelInterchainGasPaymasterIndexer { Ok(expected_pubkey) } - async fn _interchain_payment_log_meta( + async fn interchain_payment_log_meta( &self, log_index: U256, payment_pda_pubkey: &Pubkey, @@ -220,7 +224,7 @@ impl SealevelInterchainGasPaymasterIndexer { ) -> ChainResult { let block = self.rpc_client.get_block(*payment_pda_slot).await?; - self._log_meta_composer + self.log_meta_composer .log_meta(block, log_index, payment_pda_pubkey, payment_pda_slot) .map_err(Into::::into) } diff --git a/rust/main/chains/hyperlane-sealevel/src/mailbox.rs b/rust/main/chains/hyperlane-sealevel/src/mailbox.rs index d376801fe..cc88da72f 100644 --- a/rust/main/chains/hyperlane-sealevel/src/mailbox.rs +++ b/rust/main/chains/hyperlane-sealevel/src/mailbox.rs @@ -648,10 +648,15 @@ pub struct SealevelMailboxIndexer { program_id: Pubkey, dispatch_message_log_meta_composer: LogMetaComposer, delivery_message_log_meta_composer: LogMetaComposer, + advanced_log_meta: bool, } impl SealevelMailboxIndexer { - pub fn new(conf: &ConnectionConf, locator: ContractLocator) -> ChainResult { + pub fn new( + conf: &ConnectionConf, + locator: ContractLocator, + advanced_log_meta: bool, + ) -> ChainResult { let program_id = Pubkey::from(<[u8; 32]>::from(locator.address)); let mailbox = SealevelMailbox::new(conf, locator, None)?; @@ -672,6 +677,7 @@ impl SealevelMailboxIndexer { mailbox, dispatch_message_log_meta_composer, delivery_message_log_meta_composer, + advanced_log_meta, }) } @@ -712,23 +718,24 @@ impl SealevelMailboxIndexer { let hyperlane_message = HyperlaneMessage::read_from(&mut &dispatched_message_account.encoded_message[..])?; - // let log_meta = self - // .dispatch_message_log_meta( - // U256::from(nonce), - // &valid_message_storage_pda_pubkey, - // &dispatched_message_account.slot, - // ) - // .await?; - - let log_meta = LogMeta { - address: self.program_id.to_bytes().into(), - block_number: dispatched_message_account.slot, - // TODO: get these when building out scraper support. - // It's inconvenient to get these :| - block_hash: H256::zero(), - transaction_id: H512::zero(), - transaction_index: 0, - log_index: U256::zero(), + let log_meta = if self.advanced_log_meta { + self.dispatch_message_log_meta( + U256::from(nonce), + &valid_message_storage_pda_pubkey, + &dispatched_message_account.slot, + ) + .await? + } else { + LogMeta { + address: self.program_id.to_bytes().into(), + block_number: dispatched_message_account.slot, + // TODO: get these when building out scraper support. + // It's inconvenient to get these :| + block_hash: H256::zero(), + transaction_id: H512::zero(), + transaction_index: 0, + log_index: U256::zero(), + } }; Ok((hyperlane_message.into(), log_meta)) @@ -748,7 +755,7 @@ impl SealevelMailboxIndexer { Ok(expected_pubkey) } - async fn _dispatch_message_log_meta( + async fn dispatch_message_log_meta( &self, log_index: U256, message_storage_pda_pubkey: &Pubkey, @@ -805,23 +812,24 @@ impl SealevelMailboxIndexer { .into_inner(); let message_id = delivered_message_account.message_id; - // let log_meta = self - // .delivered_message_log_meta( - // U256::from(nonce), - // &valid_message_storage_pda_pubkey, - // &delivered_message_account.slot, - // ) - // .await?; - - let log_meta = LogMeta { - address: self.program_id.to_bytes().into(), - block_number: delivered_message_account.slot, - // TODO: get these when building out scraper support. - // It's inconvenient to get these :| - block_hash: H256::zero(), - transaction_id: H512::zero(), - transaction_index: 0, - log_index: U256::zero(), + let log_meta = if self.advanced_log_meta { + self.delivered_message_log_meta( + U256::from(nonce), + &valid_message_storage_pda_pubkey, + &delivered_message_account.slot, + ) + .await? + } else { + LogMeta { + address: self.program_id.to_bytes().into(), + block_number: delivered_message_account.slot, + // TODO: get these when building out scraper support. + // It's inconvenient to get these :| + block_hash: H256::zero(), + transaction_id: H512::zero(), + transaction_index: 0, + log_index: U256::zero(), + } }; Ok((message_id.into(), log_meta)) @@ -839,7 +847,7 @@ impl SealevelMailboxIndexer { Ok(expected_pubkey) } - async fn _delivered_message_log_meta( + async fn delivered_message_log_meta( &self, log_index: U256, message_storage_pda_pubkey: &Pubkey, diff --git a/rust/main/hyperlane-base/src/settings/base.rs b/rust/main/hyperlane-base/src/settings/base.rs index 0320e4eb7..e32771b0e 100644 --- a/rust/main/hyperlane-base/src/settings/base.rs +++ b/rust/main/hyperlane-base/src/settings/base.rs @@ -151,13 +151,14 @@ impl Settings { build_contract_fns!(build_validator_announce, build_validator_announces -> dyn ValidatorAnnounce); build_contract_fns!(build_provider, build_providers -> dyn HyperlaneProvider); - /// Build a contract sync for type `T` using log store `D` + /// Build a contract sync for type `T` using log store `S` pub async fn sequenced_contract_sync( &self, domain: &HyperlaneDomain, metrics: &CoreMetrics, sync_metrics: &ContractSyncMetrics, store: Arc, + advanced_log_meta: bool, ) -> eyre::Result>> where T: Indexable + Debug, @@ -166,7 +167,8 @@ impl Settings { { let setup = self.chain_setup(domain)?; // Currently, all indexers are of the `SequenceIndexer` type - let indexer = SequenceIndexer::::try_from_with_metrics(setup, metrics).await?; + let indexer = + SequenceIndexer::::try_from_with_metrics(setup, metrics, advanced_log_meta).await?; Ok(Arc::new(ContractSync::new( domain.clone(), store.clone() as SequenceAwareLogStore<_>, @@ -175,13 +177,14 @@ impl Settings { ))) } - /// Build a contract sync for type `T` using log store `D` + /// Build a contract sync for type `T` using log store `S` pub async fn watermark_contract_sync( &self, domain: &HyperlaneDomain, metrics: &CoreMetrics, sync_metrics: &ContractSyncMetrics, store: Arc, + advanced_log_meta: bool, ) -> eyre::Result>> where T: Indexable + Debug, @@ -190,7 +193,8 @@ impl Settings { { let setup = self.chain_setup(domain)?; // Currently, all indexers are of the `SequenceIndexer` type - let indexer = SequenceIndexer::::try_from_with_metrics(setup, metrics).await?; + let indexer = + SequenceIndexer::::try_from_with_metrics(setup, metrics, advanced_log_meta).await?; Ok(Arc::new(ContractSync::new( domain.clone(), store.clone() as WatermarkLogStore<_>, @@ -208,6 +212,7 @@ impl Settings { metrics: &CoreMetrics, sync_metrics: &ContractSyncMetrics, stores: HashMap>, + advanced_log_meta: bool, ) -> Result>>> where T: Indexable + Debug + Send + Sync + Clone + Eq + Hash + 'static, @@ -227,6 +232,7 @@ impl Settings { metrics, sync_metrics, stores.get(domain).unwrap().clone(), + advanced_log_meta, ) .await .map(|r| r as Arc>)?, @@ -236,6 +242,7 @@ impl Settings { metrics, sync_metrics, stores.get(domain).unwrap().clone(), + advanced_log_meta, ) .await .map(|r| r as Arc>)?, diff --git a/rust/main/hyperlane-base/src/settings/chains.rs b/rust/main/hyperlane-base/src/settings/chains.rs index 0e08b2d15..33600418b 100644 --- a/rust/main/hyperlane-base/src/settings/chains.rs +++ b/rust/main/hyperlane-base/src/settings/chains.rs @@ -33,7 +33,11 @@ use super::ChainSigner; #[async_trait] pub trait TryFromWithMetrics: Sized { /// Try to convert the chain configuration into the type - async fn try_from_with_metrics(conf: &ChainConf, metrics: &CoreMetrics) -> Result; + async fn try_from_with_metrics( + conf: &ChainConf, + metrics: &CoreMetrics, + advanced_log_meta: bool, + ) -> Result; } /// A chain setup is a domain ID, an address on that chain (where the mailbox is @@ -72,22 +76,38 @@ pub type MerkleTreeHookIndexer = Arc for MessageIndexer { - async fn try_from_with_metrics(conf: &ChainConf, metrics: &CoreMetrics) -> Result { - conf.build_message_indexer(metrics).await.map(Into::into) + async fn try_from_with_metrics( + conf: &ChainConf, + metrics: &CoreMetrics, + advanced_log_meta: bool, + ) -> Result { + conf.build_message_indexer(metrics, advanced_log_meta) + .await + .map(Into::into) } } #[async_trait] impl TryFromWithMetrics for DeliveryIndexer { - async fn try_from_with_metrics(conf: &ChainConf, metrics: &CoreMetrics) -> Result { - conf.build_delivery_indexer(metrics).await.map(Into::into) + async fn try_from_with_metrics( + conf: &ChainConf, + metrics: &CoreMetrics, + advanced_log_meta: bool, + ) -> Result { + conf.build_delivery_indexer(metrics, advanced_log_meta) + .await + .map(Into::into) } } #[async_trait] impl TryFromWithMetrics for IgpIndexer { - async fn try_from_with_metrics(conf: &ChainConf, metrics: &CoreMetrics) -> Result { - conf.build_interchain_gas_payment_indexer(metrics) + async fn try_from_with_metrics( + conf: &ChainConf, + metrics: &CoreMetrics, + advanced_log_meta: bool, + ) -> Result { + conf.build_interchain_gas_payment_indexer(metrics, advanced_log_meta) .await .map(Into::into) } @@ -95,8 +115,12 @@ impl TryFromWithMetrics for IgpIndexer { #[async_trait] impl TryFromWithMetrics for MerkleTreeHookIndexer { - async fn try_from_with_metrics(conf: &ChainConf, metrics: &CoreMetrics) -> Result { - conf.build_merkle_tree_hook_indexer(metrics) + async fn try_from_with_metrics( + conf: &ChainConf, + metrics: &CoreMetrics, + advanced_log_meta: bool, + ) -> Result { + conf.build_merkle_tree_hook_indexer(metrics, advanced_log_meta) .await .map(Into::into) } @@ -266,6 +290,7 @@ impl ChainConf { pub async fn build_message_indexer( &self, metrics: &CoreMetrics, + advanced_log_meta: bool, ) -> Result>> { let ctx = "Building delivery indexer"; let locator = self.locator(self.addresses.mailbox); @@ -284,7 +309,11 @@ impl ChainConf { } ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(conf) => { - let indexer = Box::new(h_sealevel::SealevelMailboxIndexer::new(conf, locator)?); + let indexer = Box::new(h_sealevel::SealevelMailboxIndexer::new( + conf, + locator, + advanced_log_meta, + )?); Ok(indexer as Box>) } ChainConnectionConf::Cosmos(conf) => { @@ -306,6 +335,7 @@ impl ChainConf { pub async fn build_delivery_indexer( &self, metrics: &CoreMetrics, + advanced_log_meta: bool, ) -> Result>> { let ctx = "Building delivery indexer"; let locator = self.locator(self.addresses.mailbox); @@ -324,7 +354,11 @@ impl ChainConf { } ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(conf) => { - let indexer = Box::new(h_sealevel::SealevelMailboxIndexer::new(conf, locator)?); + let indexer = Box::new(h_sealevel::SealevelMailboxIndexer::new( + conf, + locator, + advanced_log_meta, + )?); Ok(indexer as Box>) } ChainConnectionConf::Cosmos(conf) => { @@ -385,6 +419,7 @@ impl ChainConf { pub async fn build_interchain_gas_payment_indexer( &self, metrics: &CoreMetrics, + advanced_log_meta: bool, ) -> Result>> { let ctx = "Building IGP indexer"; let locator = self.locator(self.addresses.interchain_gas_paymaster); @@ -407,7 +442,12 @@ impl ChainConf { ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(conf) => { let indexer = Box::new( - h_sealevel::SealevelInterchainGasPaymasterIndexer::new(conf, locator).await?, + h_sealevel::SealevelInterchainGasPaymasterIndexer::new( + conf, + locator, + advanced_log_meta, + ) + .await?, ); Ok(indexer as Box>) } @@ -428,6 +468,7 @@ impl ChainConf { pub async fn build_merkle_tree_hook_indexer( &self, metrics: &CoreMetrics, + advanced_log_meta: bool, ) -> Result>> { let ctx = "Building merkle tree hook indexer"; let locator = self.locator(self.addresses.merkle_tree_hook); @@ -446,8 +487,11 @@ impl ChainConf { } ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(conf) => { - let mailbox_indexer = - Box::new(h_sealevel::SealevelMailboxIndexer::new(conf, locator)?); + let mailbox_indexer = Box::new(h_sealevel::SealevelMailboxIndexer::new( + conf, + locator, + advanced_log_meta, + )?); let indexer = Box::new(h_sealevel::SealevelMerkleTreeHookIndexer::new( *mailbox_indexer, )); From 111e24153250cf702ba8d31970daa855cf7954ec Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Thu, 21 Nov 2024 18:47:44 +0000 Subject: [PATCH 02/18] feat: nov 21 deploy batch (#4885) ### Description Deploy new core chains: boba, duckchain, superseed, unichain, vana. ### Drive-by changes igp updates ### Related issues ### Backward compatibility ### Testing manual --------- Signed-off-by: pbio <10051819+paulbalaji@users.noreply.github.com> --- .codespell/ignore.txt | 1 + .registryrc | 2 +- rust/main/config/mainnet_config.json | 325 ++++++++++++- .../config/environments/mainnet3/agent.ts | 21 +- .../mainnet3/aw-validators/hyperlane.json | 15 + .../mainnet3/core/verification.json | 350 ++++++++++++++ .../config/environments/mainnet3/funding.ts | 8 +- .../environments/mainnet3/gasPrices.json | 60 ++- .../mainnet3/ism/verification.json | 430 ++++++++++++++++++ .../middleware/accounts/verification.json | 105 +++++ .../mainnet3/supportedChainNames.ts | 5 + .../environments/mainnet3/tokenPrices.json | 173 +++---- .../environments/mainnet3/validators.ts | 51 +++ typescript/sdk/src/consts/multisigIsm.ts | 25 + 14 files changed, 1461 insertions(+), 110 deletions(-) diff --git a/.codespell/ignore.txt b/.codespell/ignore.txt index 85cd6f56a..ec0437cb9 100644 --- a/.codespell/ignore.txt +++ b/.codespell/ignore.txt @@ -5,3 +5,4 @@ receivedFrom ser readded re-use +superseed diff --git a/.registryrc b/.registryrc index 19d87576f..bf93b8106 100644 --- a/.registryrc +++ b/.registryrc @@ -1 +1 @@ -82013508db45dcd55b44d2721414d26817686c8f +3cd1c7d8af8718fcac340027d147ba3c4a6df12c diff --git a/rust/main/config/mainnet_config.json b/rust/main/config/mainnet_config.json index 6e0da5be3..a24d40749 100644 --- a/rust/main/config/mainnet_config.json +++ b/rust/main/config/mainnet_config.json @@ -1839,7 +1839,7 @@ "aggregationHook": "0xF6C1769d5390Be0f77080eF7791fBbA7eF4D5659", "blockExplorers": [ { - "apiUrl": "https://explorer.mintchain.io/api/eth-rpc", + "apiUrl": "https://explorer.mintchain.io/api", "family": "blockscout", "name": "Mint Explorer", "url": "https://explorer.mintchain.io" @@ -5731,6 +5731,329 @@ "testRecipient": "0x545E289B88c6d97b74eC0B96e308cae46Bf5f832", "timelockController": "0x0000000000000000000000000000000000000000", "validatorAnnounce": "0x26A29486480BD74f9B830a9B8dB33cb43C40f496" + }, + "boba": { + "blockExplorers": [ + { + "apiUrl": "https://api.routescan.io/v2/network/mainnet/evm/288/etherscan/api", + "family": "routescan", + "name": "bobascan", + "url": "https://bobascan.com" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 288, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Boba Mainnet", + "domainId": 288, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "boba", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://mainnet.boba.network" + } + ], + "technicalStack": "opstack", + "aggregationHook": "0x4533B9ff84bE4f4009409414aF8b8e9c3f4F52a8", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "interchainSecurityModule": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "pausableIsm": "0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563", + "protocolFee": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "testRecipient": "0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "index": { + "from": 10598389 + } + }, + "duckchain": { + "blockExplorers": [ + { + "apiUrl": "https://scan.duckchain.io/api", + "family": "blockscout", + "name": "DuckChain Explorer", + "url": "https://scan.duckchain.io" + } + ], + "blocks": { + "confirmations": 3, + "estimateBlockTime": 1, + "reorgPeriod": 5 + }, + "chainId": 5545, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "DuckChain", + "domainId": 5545, + "gasCurrencyCoinGeckoId": "the-open-network", + "index": { + "from": 1149918 + }, + "name": "duckchain", + "nativeToken": { + "decimals": 18, + "name": "Toncoin", + "symbol": "TON" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.duckchain.io" + }, + { + "http": "https://rpc-hk.duckchain.io" + } + ], + "technicalStack": "arbitrumnitro", + "aggregationHook": "0x4533B9ff84bE4f4009409414aF8b8e9c3f4F52a8", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "interchainSecurityModule": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "pausableIsm": "0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563", + "protocolFee": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "testRecipient": "0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e" + }, + "superseed": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.superseed.xyz/api", + "family": "blockscout", + "name": "Superseed Explorer", + "url": "https://explorer.superseed.xyz" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 2, + "reorgPeriod": 5 + }, + "chainId": 5330, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Superseed", + "domainId": 5330, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "superseed", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://mainnet.superseed.xyz" + } + ], + "technicalStack": "opstack", + "aggregationHook": "0x4533B9ff84bE4f4009409414aF8b8e9c3f4F52a8", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "interchainSecurityModule": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "pausableIsm": "0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563", + "protocolFee": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "testRecipient": "0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "index": { + "from": 3010957 + } + }, + "unichain": { + "blockExplorers": [ + { + "apiUrl": "https://unichain.blockscout.com/api", + "family": "blockscout", + "name": "Unichain Explorer", + "url": "https://unichain.blockscout.com" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 1, + "reorgPeriod": 5 + }, + "chainId": 130, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Unichain", + "domainId": 130, + "gasCurrencyCoinGeckoId": "ethereum", + "name": "unichain", + "nativeToken": { + "decimals": 18, + "name": "Ether", + "symbol": "ETH" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://mainnet.unichain.org" + } + ], + "technicalStack": "opstack", + "aggregationHook": "0x4533B9ff84bE4f4009409414aF8b8e9c3f4F52a8", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "interchainSecurityModule": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "pausableIsm": "0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563", + "protocolFee": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "testRecipient": "0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "index": { + "from": 1453239 + } + }, + "vana": { + "blockExplorers": [ + { + "apiUrl": "https://vanascan.io/api/eth-rpc", + "family": "blockscout", + "name": "Vana Explorer", + "url": "https://vanascan.io" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 6, + "reorgPeriod": 5 + }, + "chainId": 1480, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "Vana", + "domainId": 1480, + "gasCurrencyCoinGeckoId": "vana", + "name": "vana", + "nativeToken": { + "decimals": 18, + "name": "Vana", + "symbol": "VANA" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.vana.org" + } + ], + "technicalStack": "other", + "aggregationHook": "0x4533B9ff84bE4f4009409414aF8b8e9c3f4F52a8", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "interchainSecurityModule": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "pausableIsm": "0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563", + "protocolFee": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "testRecipient": "0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "index": { + "from": 629917 + } } }, "defaultRpcConsensusType": "fallback" diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 892746c63..e7978e296 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -64,6 +64,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< bitlayer: true, blast: true, bob: true, + boba: true, bsc: true, celo: true, cheesechain: true, @@ -72,6 +73,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< cyber: true, degenchain: true, dogechain: true, + duckchain: true, eclipsemainnet: true, endurance: true, ethereum: true, @@ -124,9 +126,12 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< snaxchain: true, solanamainnet: true, stride: false, + superseed: true, superpositionmainnet: true, taiko: true, tangle: true, + unichain: true, + vana: true, viction: true, worldchain: true, xai: true, @@ -152,6 +157,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< bitlayer: true, blast: true, bob: true, + boba: true, bsc: true, celo: true, cheesechain: true, @@ -160,6 +166,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< cyber: true, degenchain: true, dogechain: true, + duckchain: true, eclipsemainnet: true, endurance: true, ethereum: true, @@ -213,9 +220,12 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< snaxchain: true, solanamainnet: true, stride: true, + superseed: true, superpositionmainnet: true, taiko: true, tangle: true, + unichain: true, + vana: true, viction: true, worldchain: true, xai: true, @@ -241,6 +251,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< bitlayer: true, blast: true, bob: true, + boba: true, bsc: true, celo: true, cheesechain: true, @@ -249,6 +260,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< cyber: true, degenchain: true, dogechain: true, + duckchain: true, // Cannot scrape Sealevel chains eclipsemainnet: false, endurance: true, @@ -303,9 +315,12 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< // Cannot scrape Sealevel chains solanamainnet: false, stride: true, + superseed: true, superpositionmainnet: true, taiko: true, tangle: true, + unichain: true, + vana: true, // Has RPC non-compliance that breaks scraping. viction: false, worldchain: true, @@ -429,7 +444,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '25a927d-20241114-171323', + tag: 'e70431a-20241121-160243', }, gasPaymentEnforcement: gasPaymentEnforcement, metricAppContextsGetter, @@ -438,7 +453,7 @@ const hyperlane: RootAgentConfig = { validators: { docker: { repo, - tag: '75d62ae-20241107-060707', + tag: 'e70431a-20241121-160243', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.Hyperlane), @@ -448,7 +463,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '75d62ae-20241107-060707', + tag: 'e70431a-20241121-160243', }, resources: scraperResources, }, diff --git a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json index fddbdc762..5f9a7348c 100644 --- a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json +++ b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json @@ -53,6 +53,9 @@ "bob": { "validators": ["0x20f283be1eb0e81e22f51705dcb79883cfdd34aa"] }, + "boba": { + "validators": ["0xebeb92c94ca8408e73aa16fd554cb3a7df075c59"] + }, "bsc": { "validators": [ "0x570af9b7b36568c8877eebba6c6727aa9dab7268", @@ -85,6 +88,9 @@ "dogechain": { "validators": ["0xe43f742c37858746e6d7e458bc591180d0cba440"] }, + "duckchain": { + "validators": ["0x91d55fe6dac596a6735d96365e21ce4bca21d83c"] + }, "eclipsemainnet": { "validators": ["0xebb52d7eaa3ff7a5a6260bfe5111ce52d57401d0"] }, @@ -278,6 +284,9 @@ "solanamainnet": { "validators": ["0x28464752829b3ea59a497fca0bdff575c534c3ff"] }, + "superseed": { + "validators": ["0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88"] + }, "superpositionmainnet": { "validators": ["0x3f489acdd341c6b4dd86293fa2cc5ecc8ccf4f84"] }, @@ -287,6 +296,12 @@ "tangle": { "validators": ["0x1ee52cbbfacd7dcb0ba4e91efaa6fbc61602b15b"] }, + "unichain": { + "validators": ["0x9773a382342ebf604a2e5de0a1f462fb499e28b1"] + }, + "vana": { + "validators": ["0xfdf3b0dfd4b822d10cacb15c8ae945ea269e7534"] + }, "viction": { "validators": ["0x1f87c368f8e05a85ef9126d984a980a20930cb9c"] }, diff --git a/typescript/infra/config/environments/mainnet3/core/verification.json b/typescript/infra/config/environments/mainnet3/core/verification.json index 0a9ab38bb..f736c706b 100644 --- a/typescript/infra/config/environments/mainnet3/core/verification.json +++ b/typescript/infra/config/environments/mainnet3/core/verification.json @@ -5376,5 +5376,355 @@ "constructorArguments": "00000000000000000000000096d51cc3f7500d501baeb1a2a62bb96fa03532f8", "isProxy": false } + ], + "boba": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000120", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000009eaac366bfd70430cfee6e70265fefff1cfc9e47", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "constructorArguments": "00000000000000000000000083475ca5beb2eaa59a2ff48a0544ebaa4a32c2de0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de" + }, + { + "name": "ProtocolFee", + "address": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "superseed": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "00000000000000000000000000000000000000000000000000000000000014d2", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000009eaac366bfd70430cfee6e70265fefff1cfc9e47", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "constructorArguments": "00000000000000000000000083475ca5beb2eaa59a2ff48a0544ebaa4a32c2de0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de" + }, + { + "name": "ProtocolFee", + "address": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "unichain": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "0000000000000000000000000000000000000000000000000000000000000082", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000009eaac366bfd70430cfee6e70265fefff1cfc9e47", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "constructorArguments": "00000000000000000000000083475ca5beb2eaa59a2ff48a0544ebaa4a32c2de0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de" + }, + { + "name": "ProtocolFee", + "address": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "duckchain": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "00000000000000000000000000000000000000000000000000000000000015a9", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000009eaac366bfd70430cfee6e70265fefff1cfc9e47", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "constructorArguments": "00000000000000000000000083475ca5beb2eaa59a2ff48a0544ebaa4a32c2de0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de" + }, + { + "name": "ProtocolFee", + "address": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } + ], + "vana": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "00000000000000000000000000000000000000000000000000000000000005c8", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba0000000000000000000000009eaac366bfd70430cfee6e70265fefff1cfc9e47", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", + "constructorArguments": "00000000000000000000000083475ca5beb2eaa59a2ff48a0544ebaa4a32c2de0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de" + }, + { + "name": "ProtocolFee", + "address": "0x99fEFc1119E86Ee0153eb887cF8E8ab2d92A16e8", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } ] } diff --git a/typescript/infra/config/environments/mainnet3/funding.ts b/typescript/infra/config/environments/mainnet3/funding.ts index 03803fefa..262efacaa 100644 --- a/typescript/infra/config/environments/mainnet3/funding.ts +++ b/typescript/infra/config/environments/mainnet3/funding.ts @@ -10,7 +10,7 @@ export const keyFunderConfig: KeyFunderConfig< > = { docker: { repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '1ed620c-20241107-052148', + tag: 'e70431a-20241121-160255', }, // We're currently using the same deployer/key funder key as mainnet2. // To minimize nonce clobbering we offset the key funder cron @@ -40,6 +40,7 @@ export const keyFunderConfig: KeyFunderConfig< bitlayer: '0.002', blast: '0.2', bob: '0.2', + boba: '0.05', bsc: '5', celo: '3', cheesechain: '50', @@ -48,6 +49,7 @@ export const keyFunderConfig: KeyFunderConfig< cyber: '0.05', degenchain: '100', dogechain: '100', + duckchain: '5', endurance: '20', ethereum: '0.5', everclear: '0.05', @@ -96,9 +98,13 @@ export const keyFunderConfig: KeyFunderConfig< snaxchain: '0.05', // ignore non-evm chains stride: '0', + superseed: '0.05', superpositionmainnet: '0.05', taiko: '0.2', tangle: '2', + unichain: '0.05', + // temporarily low until we're able to fund more + vana: '0.001', viction: '3', worldchain: '0.2', xai: '20', diff --git a/typescript/infra/config/environments/mainnet3/gasPrices.json b/typescript/infra/config/environments/mainnet3/gasPrices.json index e0eb03093..a6899a005 100644 --- a/typescript/infra/config/environments/mainnet3/gasPrices.json +++ b/typescript/infra/config/environments/mainnet3/gasPrices.json @@ -12,7 +12,7 @@ "decimals": 9 }, "arbitrum": { - "amount": "0.01", + "amount": "0.123544", "decimals": 9 }, "arbitrumnova": { @@ -24,7 +24,7 @@ "decimals": 9 }, "astarzkevm": { - "amount": "0.078", + "amount": "0.24", "decimals": 9 }, "flame": { @@ -36,11 +36,11 @@ "decimals": 9 }, "b3": { - "amount": "0.001000254", + "amount": "0.001000252", "decimals": 9 }, "base": { - "amount": "0.004893247", + "amount": "0.024525952", "decimals": 9 }, "bitlayer": { @@ -48,13 +48,17 @@ "decimals": 9 }, "blast": { - "amount": "0.005018176", + "amount": "0.005892268", "decimals": 9 }, "bob": { "amount": "0.001000252", "decimals": 9 }, + "boba": { + "amount": "0.001000047", + "decimals": 9 + }, "bsc": { "amount": "1.0", "decimals": 9 @@ -87,6 +91,10 @@ "amount": "250.0", "decimals": 9 }, + "duckchain": { + "amount": "10.0", + "decimals": 9 + }, "eclipsemainnet": { "amount": "0.0000001", "decimals": 1 @@ -96,7 +104,7 @@ "decimals": 9 }, "ethereum": { - "amount": "15.0", + "amount": "30.088451558", "decimals": 9 }, "everclear": { @@ -124,7 +132,7 @@ "decimals": 9 }, "gnosis": { - "amount": "1.500000007", + "amount": "1.500000008", "decimals": 9 }, "gravity": { @@ -136,7 +144,7 @@ "decimals": 9 }, "immutablezkevmmainnet": { - "amount": "10.000000056", + "amount": "10.00000005", "decimals": 9 }, "inevm": { @@ -156,7 +164,7 @@ "decimals": 9 }, "linea": { - "amount": "0.160485013", + "amount": "0.548523195", "decimals": 9 }, "lisk": { @@ -172,7 +180,7 @@ "decimals": 9 }, "mantapacific": { - "amount": "0.003001158", + "amount": "0.0030005", "decimals": 9 }, "mantle": { @@ -208,7 +216,7 @@ "decimals": 9 }, "morph": { - "amount": "0.002", + "amount": "0.014614332", "decimals": 9 }, "neutron": { @@ -220,7 +228,7 @@ "decimals": 9 }, "optimism": { - "amount": "0.001010111", + "amount": "0.001065045", "decimals": 9 }, "orderly": { @@ -232,11 +240,11 @@ "decimals": 1 }, "polygon": { - "amount": "47.07124319", + "amount": "260.197309239", "decimals": 9 }, "polygonzkevm": { - "amount": "0.146", + "amount": "0.451", "decimals": 9 }, "polynomialfi": { @@ -244,7 +252,7 @@ "decimals": 9 }, "prom": { - "amount": "13.1", + "amount": "75.2", "decimals": 9 }, "proofofplay": { @@ -280,7 +288,7 @@ "decimals": 9 }, "shibarium": { - "amount": "0.542811448", + "amount": "3.89327567", "decimals": 9 }, "snaxchain": { @@ -295,24 +303,36 @@ "amount": "0.005", "decimals": 1 }, + "superseed": { + "amount": "0.001000252", + "decimals": 9 + }, "superpositionmainnet": { "amount": "0.01", "decimals": 9 }, "taiko": { - "amount": "0.1323", + "amount": "0.1243284", "decimals": 9 }, "tangle": { "amount": "1.0", "decimals": 9 }, + "unichain": { + "amount": "0.001000252", + "decimals": 9 + }, + "vana": { + "amount": "0.001000007", + "decimals": 9 + }, "viction": { "amount": "0.25", "decimals": 9 }, "worldchain": { - "amount": "0.00100025", + "amount": "0.00100026", "decimals": 9 }, "xai": { @@ -320,7 +340,7 @@ "decimals": 9 }, "xlayer": { - "amount": "7.04", + "amount": "23.05", "decimals": 9 }, "zeronetwork": { @@ -340,7 +360,7 @@ "decimals": 9 }, "zoramainnet": { - "amount": "0.001000269", + "amount": "0.001000252", "decimals": 9 } } diff --git a/typescript/infra/config/environments/mainnet3/ism/verification.json b/typescript/infra/config/environments/mainnet3/ism/verification.json index 928bceb8b..156a5f990 100644 --- a/typescript/infra/config/environments/mainnet3/ism/verification.json +++ b/typescript/infra/config/environments/mainnet3/ism/verification.json @@ -6916,5 +6916,435 @@ "constructorArguments": "", "isProxy": true } + ], + "superseed": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "unichain": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "duckchain": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "vana": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } + ], + "boba": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } ] } diff --git a/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json b/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json index b940665f2..402f7d520 100644 --- a/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json +++ b/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json @@ -1680,5 +1680,110 @@ "isProxy": true, "expectedimplementation": "0x28846fCb579747E8ddad9E93b55BE51b0A1Bf1f3" } + ], + "superseed": [ + { + "name": "InterchainAccountIsm", + "address": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "constructorArguments": "0000000000000000000000000f9d4704e1fb25e416042524e594f1ceac6ff5970000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025eac2007b0d40e3f0af112fd346412321038719000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597" + } + ], + "boba": [ + { + "name": "InterchainAccountIsm", + "address": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "constructorArguments": "0000000000000000000000000f9d4704e1fb25e416042524e594f1ceac6ff5970000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025eac2007b0d40e3f0af112fd346412321038719000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597" + } + ], + "unichain": [ + { + "name": "InterchainAccountIsm", + "address": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "constructorArguments": "0000000000000000000000000f9d4704e1fb25e416042524e594f1ceac6ff5970000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025eac2007b0d40e3f0af112fd346412321038719000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597" + } + ], + "duckchain": [ + { + "name": "InterchainAccountIsm", + "address": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "constructorArguments": "0000000000000000000000000f9d4704e1fb25e416042524e594f1ceac6ff5970000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025eac2007b0d40e3f0af112fd346412321038719000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597" + } + ], + "vana": [ + { + "name": "InterchainAccountIsm", + "address": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "constructorArguments": "0000000000000000000000000f9d4704e1fb25e416042524e594f1ceac6ff5970000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025eac2007b0d40e3f0af112fd346412321038719000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597" + } ] } diff --git a/typescript/infra/config/environments/mainnet3/supportedChainNames.ts b/typescript/infra/config/environments/mainnet3/supportedChainNames.ts index dddc79312..49b4228c6 100644 --- a/typescript/infra/config/environments/mainnet3/supportedChainNames.ts +++ b/typescript/infra/config/environments/mainnet3/supportedChainNames.ts @@ -15,6 +15,7 @@ export const mainnet3SupportedChainNames = [ 'bitlayer', 'blast', 'bob', + 'boba', 'bsc', 'celo', 'cheesechain', @@ -23,6 +24,7 @@ export const mainnet3SupportedChainNames = [ 'cyber', 'degenchain', 'dogechain', + 'duckchain', 'eclipsemainnet', 'endurance', 'ethereum', @@ -75,9 +77,12 @@ export const mainnet3SupportedChainNames = [ 'snaxchain', 'solanamainnet', 'stride', + 'superseed', 'superpositionmainnet', 'taiko', 'tangle', + 'unichain', + 'vana', 'viction', 'worldchain', 'xai', diff --git a/typescript/infra/config/environments/mainnet3/tokenPrices.json b/typescript/infra/config/environments/mainnet3/tokenPrices.json index 106c5831f..905bbf007 100644 --- a/typescript/infra/config/environments/mainnet3/tokenPrices.json +++ b/typescript/infra/config/environments/mainnet3/tokenPrices.json @@ -1,88 +1,93 @@ { - "ancient8": "2901.97", - "alephzeroevmmainnet": "0.352558", - "apechain": "1.021", - "arbitrum": "2901.97", - "arbitrumnova": "2901.97", - "astar": "0.05516", - "astarzkevm": "2901.97", - "flame": "5.14", - "avalanche": "27.43", - "b3": "2901.97", - "base": "2901.97", - "bitlayer": "75858", - "blast": "2901.97", - "bob": "2901.97", - "bsc": "596.14", - "celo": "0.63787", - "cheesechain": "0.00211859", - "chilizmainnet": "0.061174", - "coredao": "0.886582", - "cyber": "2901.97", - "degenchain": "0.00776785", - "dogechain": "0.197113", - "eclipsemainnet": "2901.97", - "endurance": "2.02", - "ethereum": "2901.97", - "everclear": "2901.97", - "fantom": "0.708456", - "flare": "0.01303515", - "flowmainnet": "0.5289", - "fraxtal": "2892.2", - "fusemainnet": "0.02930522", - "gnosis": "1.001", - "gravity": "0.02864739", - "harmony": "0.01246587", - "immutablezkevmmainnet": "1.18", - "inevm": "21.99", - "injective": "21.99", - "kaia": "0.121813", - "kroma": "2901.97", - "linea": "2901.97", - "lisk": "2901.97", - "lukso": "1.48", - "lumia": "1.059", - "mantapacific": "2901.97", - "mantle": "0.651888", - "merlin": "75853", - "metal": "2901.97", - "metis": "44.6", - "mint": "2901.97", - "mode": "2901.97", - "molten": "0.25598", - "moonbeam": "0.169922", - "morph": "2901.97", - "neutron": "0.374494", - "oortmainnet": "0.092246", - "optimism": "2901.97", - "orderly": "2901.97", - "osmosis": "0.43997", - "polygon": "0.343626", - "polygonzkevm": "2901.97", - "polynomialfi": "2901.97", - "prom": "5.38", - "proofofplay": "2901.97", - "rarichain": "2901.97", + "ancient8": "3339.7", + "alephzeroevmmainnet": "0.323087", + "apechain": "1.15", + "arbitrum": "3339.7", + "arbitrumnova": "3339.7", + "astar": "0.065841", + "astarzkevm": "3339.7", + "flame": "5.32", + "avalanche": "35.04", + "b3": "3339.7", + "base": "3339.7", + "bitlayer": "97008", + "blast": "3339.7", + "bob": "3339.7", + "boba": "3339.7", + "bsc": "622.77", + "celo": "0.69886", + "cheesechain": "0.00180143", + "chilizmainnet": "0.074224", + "coredao": "0.954893", + "cyber": "3339.7", + "degenchain": "0.02076785", + "dogechain": "0.386856", + "duckchain": "5.5", + "eclipsemainnet": "3339.7", + "endurance": "2.34", + "ethereum": "3339.7", + "everclear": "3339.7", + "fantom": "0.718323", + "flare": "0.01997817", + "flowmainnet": "0.699342", + "fraxtal": "3330.82", + "fusemainnet": "0.03172781", + "gnosis": "0.995976", + "gravity": "0.03027443", + "harmony": "0.01537487", + "immutablezkevmmainnet": "1.35", + "inevm": "24.39", + "injective": "24.39", + "kaia": "0.148169", + "kroma": "3339.7", + "linea": "3339.7", + "lisk": "3339.7", + "lukso": "1.28", + "lumia": "1.27", + "mantapacific": "3339.7", + "mantle": "0.797424", + "merlin": "97247", + "metal": "3339.7", + "metis": "49.54", + "mint": "3339.7", + "mode": "3339.7", + "molten": "0.255266", + "moonbeam": "0.216341", + "morph": "3339.7", + "neutron": "0.440864", + "oortmainnet": "0.084942", + "optimism": "3339.7", + "orderly": "3339.7", + "osmosis": "0.543778", + "polygon": "0.449905", + "polygonzkevm": "3339.7", + "polynomialfi": "3339.7", + "prom": "5.54", + "proofofplay": "3339.7", + "rarichain": "3339.7", "real": "1", - "redstone": "2901.97", - "rootstockmainnet": "75541", - "sanko": "53.25", - "scroll": "2901.97", - "sei": "0.404683", - "shibarium": "0.407901", - "snaxchain": "2901.97", - "solanamainnet": "199.51", - "stride": "0.583853", - "superpositionmainnet": "2901.97", - "taiko": "2901.97", + "redstone": "3339.7", + "rootstockmainnet": "97164", + "sanko": "48.68", + "scroll": "3339.7", + "sei": "0.488479", + "shibarium": "0.512057", + "snaxchain": "3339.7", + "solanamainnet": "244.09", + "stride": "0.613675", + "superseed": "3339.7", + "superpositionmainnet": "3339.7", + "taiko": "3339.7", "tangle": "1", - "viction": "0.340844", - "worldchain": "2901.97", - "xai": "0.2107", - "xlayer": "40.21", - "zeronetwork": "2901.97", - "zetachain": "0.680925", - "zircuit": "2901.97", - "zksync": "2901.97", - "zoramainnet": "2901.97" + "unichain": "3339.7", + "vana": "1", + "viction": "0.399341", + "worldchain": "3339.7", + "xai": "0.241575", + "xlayer": "45.13", + "zeronetwork": "3339.7", + "zetachain": "0.66842", + "zircuit": "3339.7", + "zksync": "3339.7", + "zoramainnet": "3339.7" } diff --git a/typescript/infra/config/environments/mainnet3/validators.ts b/typescript/infra/config/environments/mainnet3/validators.ts index 05673abf0..e52e97ee7 100644 --- a/typescript/infra/config/environments/mainnet3/validators.ts +++ b/typescript/infra/config/environments/mainnet3/validators.ts @@ -1140,5 +1140,56 @@ export const validatorChainConfig = ( 'prom', ), }, + + boba: { + interval: 5, + reorgPeriod: getReorgPeriod('boba'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xebeb92c94ca8408e73aa16fd554cb3a7df075c59'], + }, + 'boba', + ), + }, + duckchain: { + interval: 5, + reorgPeriod: getReorgPeriod('duckchain'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x91d55fe6dac596a6735d96365e21ce4bca21d83c'], + }, + 'duckchain', + ), + }, + superseed: { + interval: 5, + reorgPeriod: getReorgPeriod('superseed'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88'], + }, + 'superseed', + ), + }, + unichain: { + interval: 5, + reorgPeriod: getReorgPeriod('unichain'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0x9773a382342ebf604a2e5de0a1f462fb499e28b1'], + }, + 'unichain', + ), + }, + vana: { + interval: 5, + reorgPeriod: getReorgPeriod('vana'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xfdf3b0dfd4b822d10cacb15c8ae945ea269e7534'], + }, + 'vana', + ), + }, }; }; diff --git a/typescript/sdk/src/consts/multisigIsm.ts b/typescript/sdk/src/consts/multisigIsm.ts index 5f80ff91a..b71d3c34d 100644 --- a/typescript/sdk/src/consts/multisigIsm.ts +++ b/typescript/sdk/src/consts/multisigIsm.ts @@ -163,6 +163,11 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + boba: { + threshold: 1, + validators: ['0xebeb92c94ca8408e73aa16fd554cb3a7df075c59'], + }, + bsc: { threshold: 3, validators: [ @@ -271,6 +276,11 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + duckchain: { + threshold: 1, + validators: ['0x91d55fe6dac596a6735d96365e21ce4bca21d83c'], + }, + eclipsemainnet: { threshold: 3, validators: [ @@ -905,6 +915,11 @@ export const defaultMultisigConfigs: ChainMap = { validators: ['0x1d3168504b23b73cdf9c27f13bb0a595d7f1a96a'], }, + superseed: { + threshold: 1, + validators: ['0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88'], + }, + taiko: { threshold: 3, validators: [ @@ -929,11 +944,21 @@ export const defaultMultisigConfigs: ChainMap = { validators: ['0x9750849beda0a7870462d4685f953fe39033a5ae'], }, + unichain: { + threshold: 1, + validators: ['0x9773a382342ebf604a2e5de0a1f462fb499e28b1'], + }, + unichaintestnet: { threshold: 1, validators: ['0x5e99961cf71918308c3b17ef21b5f515a4f86fe5'], }, + vana: { + threshold: 1, + validators: ['0xfdf3b0dfd4b822d10cacb15c8ae945ea269e7534'], + }, + viction: { threshold: 2, validators: [ From 81ab4332ffef42ede7ed0e22615a2330bced5f81 Mon Sep 17 00:00:00 2001 From: Lee <6251863+ltyu@users.noreply.github.com> Date: Thu, 21 Nov 2024 16:03:23 -0500 Subject: [PATCH 03/18] chore: Remove ismFactoryAddresses from warpConfig (#4888) ### Description Remove `ismFactoryAddresses`, which was added to the WarpConfig to be used in `WarpModule`, and passed into `IsmModule`. This is tech debt that was added before passing in `addresses` via the constructor as done here: https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/111e24153250cf702ba8d31970daa855cf7954ec/typescript/sdk/src/ism/EvmIsmModule.ts#L65 ### Backward compatibility Yes ### Testing Unit Tests --- .changeset/empty-dodos-clap.md | 6 ++ typescript/cli/src/deploy/warp.ts | 16 ++-- typescript/sdk/src/router/schemas.ts | 2 - .../token/EvmERC20WarpModule.hardhat-test.ts | 19 +++-- .../sdk/src/token/EvmERC20WarpModule.ts | 85 ++++++++++--------- 5 files changed, 76 insertions(+), 52 deletions(-) create mode 100644 .changeset/empty-dodos-clap.md diff --git a/.changeset/empty-dodos-clap.md b/.changeset/empty-dodos-clap.md new file mode 100644 index 000000000..cd2826f71 --- /dev/null +++ b/.changeset/empty-dodos-clap.md @@ -0,0 +1,6 @@ +--- +'@hyperlane-xyz/cli': minor +'@hyperlane-xyz/sdk': minor +--- + +Remove ismFactoryAddresses from warpConfig diff --git a/typescript/cli/src/deploy/warp.ts b/typescript/cli/src/deploy/warp.ts index 508e18f69..026cd594b 100644 --- a/typescript/cli/src/deploy/warp.ts +++ b/typescript/cli/src/deploy/warp.ts @@ -534,7 +534,8 @@ async function updateExistingWarpRoute( ) { logBlue('Updating deployed Warp Routes'); const { multiProvider, registry } = params.context; - const addresses = await registry.getAddresses(); + const registryAddresses = + (await registry.getAddresses()) as ChainMap; const contractVerifier = new ContractVerifier( multiProvider, apiKeys, @@ -553,15 +554,13 @@ async function updateExistingWarpRoute( `Missing artifacts for ${chain}. Probably new deployment. Skipping update...`, ); - config.ismFactoryAddresses = addresses[ - chain - ] as ProxyFactoryFactoriesAddresses; const evmERC20WarpModule = new EvmERC20WarpModule( multiProvider, { config, chain, addresses: { + ...registryAddresses[chain], deployedTokenRoute: deployedConfig.addressOrDenom!, }, }, @@ -646,7 +645,9 @@ async function enrollRemoteRouters( deployedContractsMap: HyperlaneContractsMap, ): Promise { logBlue(`Enrolling deployed routers with each other...`); - const { multiProvider } = params.context; + const { multiProvider, registry } = params.context; + const registryAddresses = + (await registry.getAddresses()) as ChainMap; const deployedRoutersAddresses: ChainMap
= objMap( deployedContractsMap, (_, contracts) => getRouter(contracts).address, @@ -674,7 +675,10 @@ async function enrollRemoteRouters( const evmERC20WarpModule = new EvmERC20WarpModule(multiProvider, { config: mutatedWarpRouteConfig, chain, - addresses: { deployedTokenRoute: router.address }, + addresses: { + ...registryAddresses[chain], + deployedTokenRoute: router.address, + }, }); const otherChains = multiProvider diff --git a/typescript/sdk/src/router/schemas.ts b/typescript/sdk/src/router/schemas.ts index 571cb0d1f..19913aedb 100644 --- a/typescript/sdk/src/router/schemas.ts +++ b/typescript/sdk/src/router/schemas.ts @@ -1,6 +1,5 @@ import { z } from 'zod'; -import { ProxyFactoryFactoriesSchema } from '../deploy/schemas.js'; import { HookConfigSchema } from '../hook/schemas.js'; import { IsmConfigSchema } from '../ism/schemas.js'; import { ZHash } from '../metadata/customZodTypes.js'; @@ -10,7 +9,6 @@ export const MailboxClientConfigSchema = OwnableSchema.extend({ mailbox: ZHash, hook: HookConfigSchema.optional(), interchainSecurityModule: IsmConfigSchema.optional(), - ismFactoryAddresses: ProxyFactoryFactoriesSchema.optional(), }); export const ForeignDeploymentConfigSchema = z.object({ diff --git a/typescript/sdk/src/token/EvmERC20WarpModule.hardhat-test.ts b/typescript/sdk/src/token/EvmERC20WarpModule.hardhat-test.ts index 5895d783f..7ed443eb6 100644 --- a/typescript/sdk/src/token/EvmERC20WarpModule.hardhat-test.ts +++ b/typescript/sdk/src/token/EvmERC20WarpModule.hardhat-test.ts @@ -123,6 +123,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); // Let's derive it's onchain token type @@ -151,6 +152,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); // Let's derive it's onchain token type @@ -187,6 +189,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); // Let's derive it's onchain token type @@ -219,6 +222,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); // Let's derive it's onchain token type @@ -249,6 +253,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const { remoteRouters } = await evmERC20WarpModule.read(); expect(Object.keys(remoteRouters!).length).to.equal(numOfRouters); @@ -285,13 +290,14 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const actualConfig = await evmERC20WarpModule.read(); for (const interchainSecurityModule of ismConfigToUpdate) { const expectedConfig: TokenRouterConfig = { ...actualConfig, - ismFactoryAddresses, + interchainSecurityModule, }; await sendTxs(await evmERC20WarpModule.update(expectedConfig)); @@ -316,6 +322,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const actualConfig = await evmERC20WarpModule.read(); @@ -327,7 +334,6 @@ describe('EvmERC20WarpHyperlaneModule', async () => { }; const expectedConfig: TokenRouterConfig = { ...actualConfig, - ismFactoryAddresses, interchainSecurityModule, }; @@ -374,11 +380,11 @@ describe('EvmERC20WarpHyperlaneModule', async () => { chain, config, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const actualConfig = await evmERC20WarpModule.read(); const expectedConfig: TokenRouterConfig = { ...actualConfig, - ismFactoryAddresses, interchainSecurityModule: { type: IsmType.ROUTING, owner: randomAddress(), @@ -415,6 +421,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { interchainSecurityModule: ismAddress, }, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const numOfRouters = Math.floor(Math.random() * 10); await sendTxs( @@ -446,6 +453,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { interchainSecurityModule: ismAddress, }, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const remoteRouters = randomRemoteRouters(1); await sendTxs( @@ -498,6 +506,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { interchainSecurityModule: ismAddress, }, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const currentConfig = await evmERC20WarpModule.read(); @@ -527,7 +536,6 @@ describe('EvmERC20WarpHyperlaneModule', async () => { ...baseConfig, type: TokenType.native, hook: hookAddress, - ismFactoryAddresses, }; const owner = signer.address.toLowerCase(); @@ -538,6 +546,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { interchainSecurityModule: ismAddress, }, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); const currentConfig = await evmERC20WarpModule.read(); @@ -571,7 +580,6 @@ describe('EvmERC20WarpHyperlaneModule', async () => { ...baseConfig, type: TokenType.native, hook: hookAddress, - ismFactoryAddresses, remoteRouters: { [domain]: randomAddress(), }, @@ -584,6 +592,7 @@ describe('EvmERC20WarpHyperlaneModule', async () => { ...config, }, multiProvider, + proxyFactoryFactories: ismFactoryAddresses, }); await sendTxs( await evmERC20WarpModule.update({ diff --git a/typescript/sdk/src/token/EvmERC20WarpModule.ts b/typescript/sdk/src/token/EvmERC20WarpModule.ts index 2652c7826..729842fca 100644 --- a/typescript/sdk/src/token/EvmERC20WarpModule.ts +++ b/typescript/sdk/src/token/EvmERC20WarpModule.ts @@ -6,7 +6,11 @@ import { TokenRouter__factory, } from '@hyperlane-xyz/core'; import { buildArtifact as coreBuildArtifact } from '@hyperlane-xyz/core/buildArtifact.js'; -import { ContractVerifier, ExplorerLicenseType } from '@hyperlane-xyz/sdk'; +import { + ContractVerifier, + ExplorerLicenseType, + HyperlaneAddresses, +} from '@hyperlane-xyz/sdk'; import { Address, Domain, @@ -25,6 +29,7 @@ import { HyperlaneModule, HyperlaneModuleParams, } from '../core/AbstractHyperlaneModule.js'; +import { ProxyFactoryFactories } from '../deploy/contracts.js'; import { proxyAdminUpdateTxs } from '../deploy/proxy.js'; import { EvmIsmModule } from '../ism/EvmIsmModule.js'; import { DerivedIsmConfig } from '../ism/EvmIsmReader.js'; @@ -40,7 +45,7 @@ import { TokenRouterConfig, TokenRouterConfigSchema } from './schemas.js'; export class EvmERC20WarpModule extends HyperlaneModule< ProtocolType.Ethereum, TokenRouterConfig, - { + HyperlaneAddresses & { deployedTokenRoute: Address; } > { @@ -56,7 +61,7 @@ export class EvmERC20WarpModule extends HyperlaneModule< protected readonly multiProvider: MultiProvider, args: HyperlaneModuleParams< TokenRouterConfig, - { + HyperlaneAddresses & { deployedTokenRoute: Address; } >, @@ -242,36 +247,34 @@ export class EvmERC20WarpModule extends HyperlaneModule< return []; } - if (expectedConfig.ismFactoryAddresses) { - const actualDeployedIsm = ( - actualConfig.interchainSecurityModule as DerivedIsmConfig - ).address; - - // Try to update (may also deploy) Ism with the expected config - const { - deployedIsm: expectedDeployedIsm, - updateTransactions: ismUpdateTransactions, - } = await this.deployOrUpdateIsm(actualConfig, expectedConfig); - - // If an ISM is updated in-place, push the update txs - updateTransactions.push(...ismUpdateTransactions); - - // If a new ISM is deployed, push the setInterchainSecurityModule tx - if (actualDeployedIsm !== expectedDeployedIsm) { - const contractToUpdate = MailboxClient__factory.connect( - this.args.addresses.deployedTokenRoute, - this.multiProvider.getProvider(this.domainId), - ); - updateTransactions.push({ - chainId: this.chainId, - annotation: `Setting ISM for Warp Route to ${expectedDeployedIsm}`, - to: contractToUpdate.address, - data: contractToUpdate.interface.encodeFunctionData( - 'setInterchainSecurityModule', - [expectedDeployedIsm], - ), - }); - } + const actualDeployedIsm = ( + actualConfig.interchainSecurityModule as DerivedIsmConfig + ).address; + + // Try to update (may also deploy) Ism with the expected config + const { + deployedIsm: expectedDeployedIsm, + updateTransactions: ismUpdateTransactions, + } = await this.deployOrUpdateIsm(actualConfig, expectedConfig); + + // If an ISM is updated in-place, push the update txs + updateTransactions.push(...ismUpdateTransactions); + + // If a new ISM is deployed, push the setInterchainSecurityModule tx + if (actualDeployedIsm !== expectedDeployedIsm) { + const contractToUpdate = MailboxClient__factory.connect( + this.args.addresses.deployedTokenRoute, + this.multiProvider.getProvider(this.domainId), + ); + updateTransactions.push({ + chainId: this.chainId, + annotation: `Setting ISM for Warp Route to ${expectedDeployedIsm}`, + to: contractToUpdate.address, + data: contractToUpdate.interface.encodeFunctionData( + 'setInterchainSecurityModule', + [expectedDeployedIsm], + ), + }); } return updateTransactions; @@ -313,10 +316,6 @@ export class EvmERC20WarpModule extends HyperlaneModule< expectedConfig.interchainSecurityModule, 'Ism not derived correctly', ); - assert( - expectedConfig.ismFactoryAddresses, - 'Ism Factories addresses not provided', - ); const ismModule = new EvmIsmModule( this.multiProvider, @@ -324,7 +323,7 @@ export class EvmERC20WarpModule extends HyperlaneModule< chain: this.args.chain, config: expectedConfig.interchainSecurityModule, addresses: { - ...expectedConfig.ismFactoryAddresses, + ...this.args.addresses, mailbox: expectedConfig.mailbox, deployedIsm: ( actualConfig.interchainSecurityModule as DerivedIsmConfig @@ -357,8 +356,15 @@ export class EvmERC20WarpModule extends HyperlaneModule< config: TokenRouterConfig; multiProvider: MultiProvider; contractVerifier?: ContractVerifier; + proxyFactoryFactories: HyperlaneAddresses; }): Promise { - const { chain, config, multiProvider, contractVerifier } = params; + const { + chain, + config, + multiProvider, + contractVerifier, + proxyFactoryFactories, + } = params; const chainName = multiProvider.getChainName(chain); const deployer = new HypERC20Deployer(multiProvider); const deployedContracts = await deployer.deployContracts(chainName, config); @@ -367,6 +373,7 @@ export class EvmERC20WarpModule extends HyperlaneModule< multiProvider, { addresses: { + ...proxyFactoryFactories, deployedTokenRoute: deployedContracts[config.type].address, }, chain, From 3f013d1d8df61ee716fae5a8e79eeefe0150b335 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Mon, 25 Nov 2024 14:41:16 +0000 Subject: [PATCH 04/18] chore: transfer ownership for cbBTC warp deploy on Flow <> Ethereum (#4893) ### Description - Transfers ownership of the cbBTC warp route between flow and ethereum - A fix to ensure that proxy admin ownership is set ### Drive-by changes - a driveby to prevent rebuilding the multiprovider tons of times in the check warp deploy script ### Related issues ### Backward compatibility ### Testing --- .../getEthereumFlowCbBTCWarpConfig.ts | 15 +++++++++------ typescript/infra/scripts/check/check-utils.ts | 7 ++++++- .../infra/scripts/check/check-warp-deploy.ts | 7 +++++++ typescript/infra/src/config/environment.ts | 4 +++- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFlowCbBTCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFlowCbBTCWarpConfig.ts index 3a1cd937e..3c33919e1 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFlowCbBTCWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEthereumFlowCbBTCWarpConfig.ts @@ -12,11 +12,14 @@ import { RouterConfigWithoutOwner, tokens, } from '../../../../../src/config/warp.js'; -import { DEPLOYER } from '../../owners.js'; -// Keep on our deployer for now until we get an address from Flow -const owner = DEPLOYER; -const ownerConfig = getOwnerConfigForAddress(owner); +// Flow team Safe +const ethereumOwner = '0x58C3FB862a4F5f038C24F8506BE378e9415c5B6C'; +const ethereumOwnerConfig = getOwnerConfigForAddress(ethereumOwner); + +// Flow team Safe +const flowOwner = '0xa507DFccA02727B46cBdC600C57E89b2b55E5330'; +const flowOwnerConfig = getOwnerConfigForAddress(flowOwner); export const getEthereumFlowCbBTCWarpConfig = async ( routerConfig: ChainMap, @@ -24,7 +27,7 @@ export const getEthereumFlowCbBTCWarpConfig = async ( ): Promise> => { const ethereum: TokenRouterConfig = { ...routerConfig.ethereum, - ...ownerConfig, + ...ethereumOwnerConfig, type: TokenType.collateral, token: tokens.ethereum.cbBTC, interchainSecurityModule: ethers.constants.AddressZero, @@ -32,7 +35,7 @@ export const getEthereumFlowCbBTCWarpConfig = async ( const flowmainnet: TokenRouterConfig = { ...routerConfig.flowmainnet, - ...ownerConfig, + ...flowOwnerConfig, type: TokenType.synthetic, interchainSecurityModule: ethers.constants.AddressZero, }; diff --git a/typescript/infra/scripts/check/check-utils.ts b/typescript/infra/scripts/check/check-utils.ts index 5925832fb..bac0229f5 100644 --- a/typescript/infra/scripts/check/check-utils.ts +++ b/typescript/infra/scripts/check/check-utils.ts @@ -14,6 +14,7 @@ import { InterchainAccountConfig, InterchainQuery, InterchainQueryChecker, + MultiProvider, attachContractsMapAndGetForeignDeployments, hypERC20factories, proxiedFactories, @@ -72,9 +73,13 @@ export async function getGovernor( chains?: string[], fork?: string, govern?: boolean, + multiProvider: MultiProvider | undefined = undefined, ) { const envConfig = getEnvironmentConfig(environment); - let multiProvider = await envConfig.getMultiProvider(); + // If the multiProvider is not passed in, get it from the environment + if (!multiProvider) { + multiProvider = await envConfig.getMultiProvider(); + } // must rotate to forked provider before building core contracts if (fork) { diff --git a/typescript/infra/scripts/check/check-warp-deploy.ts b/typescript/infra/scripts/check/check-warp-deploy.ts index aa51c7016..f32d53c2b 100644 --- a/typescript/infra/scripts/check/check-warp-deploy.ts +++ b/typescript/infra/scripts/check/check-warp-deploy.ts @@ -4,6 +4,7 @@ import { Gauge, Registry } from 'prom-client'; import { warpConfigGetterMap } from '../../config/warp.js'; import { submitMetrics } from '../../src/utils/metrics.js'; import { Modules } from '../agent-utils.js'; +import { getEnvironmentConfig } from '../core-utils.js'; import { getCheckWarpDeployArgs, @@ -16,6 +17,10 @@ async function main() { const { environment, asDeployer, chains, fork, context, pushMetrics } = await getCheckWarpDeployArgs().argv; + const envConfig = getEnvironmentConfig(environment); + // Get the multiprovider once to avoid recreating it for each warp route + const multiProvider = await envConfig.getMultiProvider(); + const metricsRegister = new Registry(); const checkerViolationsGauge = new Gauge( getCheckerViolationsGaugeObj(metricsRegister), @@ -38,6 +43,8 @@ async function main() { warpRouteId, chains, fork, + false, + multiProvider, ); await governor.check(); diff --git a/typescript/infra/src/config/environment.ts b/typescript/infra/src/config/environment.ts index ecbf1030a..90761e1ad 100644 --- a/typescript/infra/src/config/environment.ts +++ b/typescript/infra/src/config/environment.ts @@ -109,6 +109,8 @@ export function getOwnerConfigForAddress(owner: string): OwnableConfig { return { owner, // To ensure that any other overrides aren't applied - ownerOverrides: {}, + ownerOverrides: { + proxyAdmin: owner, + }, }; } From a94b1600f39a62c72e13b393b13194a726e07ec9 Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Tue, 26 Nov 2024 11:33:41 +0000 Subject: [PATCH 05/18] =?UTF-8?q?feat:=20deploy=20to=20B=C2=B2=20Network?= =?UTF-8?q?=20(#4894)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description feat: deploy to B² Network ### Drive-by changes ### Related issues ### Backward compatibility ### Testing manual --------- Signed-off-by: pbio <10051819+paulbalaji@users.noreply.github.com> --- .registryrc | 2 +- rust/main/config/mainnet_config.json | 83 ++++++++++++++++-- .../config/environments/mainnet3/agent.ts | 9 +- .../mainnet3/aw-validators/hyperlane.json | 3 + .../mainnet3/core/verification.json | 70 +++++++++++++++ .../config/environments/mainnet3/funding.ts | 3 +- .../environments/mainnet3/gasPrices.json | 4 + .../mainnet3/ism/verification.json | 86 +++++++++++++++++++ .../middleware/accounts/verification.json | 21 +++++ .../mainnet3/supportedChainNames.ts | 1 + .../environments/mainnet3/tokenPrices.json | 1 + .../environments/mainnet3/validators.ts | 11 +++ typescript/sdk/src/consts/multisigIsm.ts | 5 ++ 13 files changed, 289 insertions(+), 10 deletions(-) diff --git a/.registryrc b/.registryrc index bf93b8106..7a6a49b40 100644 --- a/.registryrc +++ b/.registryrc @@ -1 +1 @@ -3cd1c7d8af8718fcac340027d147ba3c4a6df12c +fa13e998aceff5a82b1a4e0791fe392791bb0393 diff --git a/rust/main/config/mainnet_config.json b/rust/main/config/mainnet_config.json index a24d40749..284abb823 100644 --- a/rust/main/config/mainnet_config.json +++ b/rust/main/config/mainnet_config.json @@ -5774,7 +5774,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "interchainSecurityModule": "0x9c582a96B7350eEd313560Aeb9aBDff047aeaD36", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -5844,7 +5844,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "interchainSecurityModule": "0x739800B825916456b55CF832A535eE253bC1f358", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -5905,7 +5905,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "interchainSecurityModule": "0x9bdafD7aEd501B30f72b24Ce85d423eB77f51ba0", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -5969,7 +5969,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "interchainSecurityModule": "0xce5718713f019b71F7d37058cD75d12e01dE2611", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -6033,7 +6033,7 @@ "interchainAccountIsm": "0x25EAC2007b0D40E3f0AF112FD346412321038719", "interchainAccountRouter": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", "interchainGasPaymaster": "0x9534122Aae7978dB8f5f10dF4432233c53e820A1", - "interchainSecurityModule": "0x46De8b87577624b9ce63201238982b95ad0d7Ea4", + "interchainSecurityModule": "0xce5718713f019b71F7d37058cD75d12e01dE2611", "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "merkleTreeHook": "0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47", "pausableHook": "0x9eb56085DdbDA60aDf7d2B533AFeD90e38fC9666", @@ -6054,6 +6054,79 @@ "index": { "from": 629917 } + }, + "bsquared": { + "blockExplorers": [ + { + "apiUrl": "https://explorer.bsquared.network/api", + "family": "etherscan", + "name": "B² Network Explorer", + "url": "https://explorer.bsquared.network" + } + ], + "blocks": { + "confirmations": 1, + "estimateBlockTime": 3, + "reorgPeriod": 5 + }, + "chainId": 223, + "deployer": { + "name": "Abacus Works", + "url": "https://www.hyperlane.xyz" + }, + "displayName": "B² Network", + "domainId": 223, + "gasCurrencyCoinGeckoId": "bitcoin", + "name": "bsquared", + "nativeToken": { + "decimals": 18, + "name": "Bitcoin", + "symbol": "BTC" + }, + "protocol": "ethereum", + "rpcUrls": [ + { + "http": "https://rpc.bsquared.network" + }, + { + "http": "https://rpc.ankr.com/b2" + }, + { + "http": "https://mainnet.b2-rpc.com" + }, + { + "http": "https://b2-mainnet.alt.technology" + } + ], + "technicalStack": "other", + "aggregationHook": "0x03D610d916D5D274e4A31c026fd6884281A35d9C", + "domainRoutingIsm": "0xBD70Ea9D599a0FC8158B026797177773C3445730", + "domainRoutingIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "fallbackRoutingHook": "0x60bB6D060393D3C206719A7bD61844cC82891cfB", + "interchainAccountIsm": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "interchainAccountRouter": "0x4D50044335dc1d4D26c343AdeDf6E47808475Deb", + "interchainGasPaymaster": "0x70EbA87Cd15616f32C736B3f3BdCfaeD0713a82B", + "interchainSecurityModule": "0x7dBb82188F553161d4B4ac3a2362Bff3a57e21D2", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "merkleTreeHook": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "pausableHook": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", + "pausableIsm": "0x0D3bD9F1bcDA82bD1682b2C895a907d7aaE45849", + "protocolFee": "0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "staticAggregationHookFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "staticAggregationIsm": "0x7dBb82188F553161d4B4ac3a2362Bff3a57e21D2", + "staticAggregationIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "staticMerkleRootMultisigIsmFactory": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "staticMerkleRootWeightedMultisigIsmFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "staticMessageIdMultisigIsmFactory": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "staticMessageIdWeightedMultisigIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "storageGasOracle": "0x451dF8AB0936D85526D816f0b4dCaDD934A034A4", + "testRecipient": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597", + "timelockController": "0x0000000000000000000000000000000000000000", + "validatorAnnounce": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "index": { + "from": 9687363 + } } }, "defaultRpcConsensusType": "fallback" diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index e7978e296..46ba1a4d7 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -66,6 +66,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< bob: true, boba: true, bsc: true, + bsquared: true, celo: true, cheesechain: true, chilizmainnet: true, @@ -159,6 +160,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< bob: true, boba: true, bsc: true, + bsquared: true, celo: true, cheesechain: true, chilizmainnet: true, @@ -253,6 +255,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< bob: true, boba: true, bsc: true, + bsquared: true, celo: true, cheesechain: true, chilizmainnet: true, @@ -444,7 +447,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'e70431a-20241121-160243', + tag: 'd834d81-20241125-135658', }, gasPaymentEnforcement: gasPaymentEnforcement, metricAppContextsGetter, @@ -453,7 +456,7 @@ const hyperlane: RootAgentConfig = { validators: { docker: { repo, - tag: 'e70431a-20241121-160243', + tag: 'd834d81-20241125-135658', }, rpcConsensusType: RpcConsensusType.Quorum, chains: validatorChainConfig(Contexts.Hyperlane), @@ -463,7 +466,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'e70431a-20241121-160243', + tag: 'd834d81-20241125-135658', }, resources: scraperResources, }, diff --git a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json index 5f9a7348c..c6946b972 100644 --- a/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json +++ b/typescript/infra/config/environments/mainnet3/aw-validators/hyperlane.json @@ -63,6 +63,9 @@ "0x03047213365800f065356b4a2fe97c3c3a52296a" ] }, + "bsquared": { + "validators": ["0xcadc90933c9fbe843358a4e70e46ad2db78e28aa"] + }, "celo": { "validators": [ "0x63478422679303c3e4fc611b771fa4a707ef7f4a", diff --git a/typescript/infra/config/environments/mainnet3/core/verification.json b/typescript/infra/config/environments/mainnet3/core/verification.json index f736c706b..62ee7d5f8 100644 --- a/typescript/infra/config/environments/mainnet3/core/verification.json +++ b/typescript/infra/config/environments/mainnet3/core/verification.json @@ -5726,5 +5726,75 @@ "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", "isProxy": false } + ], + "bsquared": [ + { + "name": "ProxyAdmin", + "address": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "Mailbox", + "address": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D", + "constructorArguments": "00000000000000000000000000000000000000000000000000000000000000df", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "constructorArguments": "000000000000000000000000ea87ae93fa0019a82a727bfd3ebd1cfca8f64f1d0000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D" + }, + { + "name": "MerkleTreeHook", + "address": "0xbb0AE51BCa526cF313b6a95BfaB020794af6C394", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "FallbackRoutingHook", + "address": "0x60bB6D060393D3C206719A7bD61844cC82891cfB", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000bb0ae51bca526cf313b6a95bfab020794af6c394", + "isProxy": false + }, + { + "name": "PausableHook", + "address": "0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StorageGasOracle", + "address": "0x451dF8AB0936D85526D816f0b4dCaDD934A034A4", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "InterchainGasPaymaster", + "address": "0x81EbEdfc1220BE33C3B9c5E09c1FCab849a392A6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x70EbA87Cd15616f32C736B3f3BdCfaeD0713a82B", + "constructorArguments": "00000000000000000000000081ebedfc1220be33c3b9c5e09c1fcab849a392a60000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x81EbEdfc1220BE33C3B9c5E09c1FCab849a392A6" + }, + { + "name": "ProtocolFee", + "address": "0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE", + "constructorArguments": "000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba", + "isProxy": false + }, + { + "name": "ValidatorAnnounce", + "address": "0x25EAC2007b0D40E3f0AF112FD346412321038719", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + } ] } diff --git a/typescript/infra/config/environments/mainnet3/funding.ts b/typescript/infra/config/environments/mainnet3/funding.ts index 262efacaa..95ac6e84f 100644 --- a/typescript/infra/config/environments/mainnet3/funding.ts +++ b/typescript/infra/config/environments/mainnet3/funding.ts @@ -10,7 +10,7 @@ export const keyFunderConfig: KeyFunderConfig< > = { docker: { repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: 'e70431a-20241121-160255', + tag: 'd834d81-20241125-135642', }, // We're currently using the same deployer/key funder key as mainnet2. // To minimize nonce clobbering we offset the key funder cron @@ -42,6 +42,7 @@ export const keyFunderConfig: KeyFunderConfig< bob: '0.2', boba: '0.05', bsc: '5', + bsquared: '0.002', celo: '3', cheesechain: '50', chilizmainnet: '200', diff --git a/typescript/infra/config/environments/mainnet3/gasPrices.json b/typescript/infra/config/environments/mainnet3/gasPrices.json index a6899a005..45daad3a3 100644 --- a/typescript/infra/config/environments/mainnet3/gasPrices.json +++ b/typescript/infra/config/environments/mainnet3/gasPrices.json @@ -63,6 +63,10 @@ "amount": "1.0", "decimals": 9 }, + "bsquared": { + "amount": "0.001000252", + "decimals": 9 + }, "celo": { "amount": "10.0", "decimals": 9 diff --git a/typescript/infra/config/environments/mainnet3/ism/verification.json b/typescript/infra/config/environments/mainnet3/ism/verification.json index 156a5f990..6f9366f4e 100644 --- a/typescript/infra/config/environments/mainnet3/ism/verification.json +++ b/typescript/infra/config/environments/mainnet3/ism/verification.json @@ -7346,5 +7346,91 @@ "constructorArguments": "", "isProxy": true } + ], + "bsquared": [ + { + "name": "StaticMerkleRootMultisigIsmFactory", + "address": "0x2C1FAbEcd7bFBdEBF27CcdB67baADB38b6Df90fC", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootMultisigIsm", + "address": "0x4725F7b8037513915aAf6D6CBDE2920E28540dDc", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdMultisigIsmFactory", + "address": "0x8b83fefd896fAa52057798f6426E9f0B080FCCcE", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdMultisigIsm", + "address": "0xAF03386044373E2fe26C5b1dCedF5a7e854a7a3F", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationIsmFactory", + "address": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationIsm", + "address": "0x882CD0C5D50b6dD74b36Da4BDb059507fddEDdf2", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticAggregationHookFactory", + "address": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticAggregationHook", + "address": "0x19930232E9aFC4f4F09d09fe2375680fAc2100D0", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "DomainRoutingIsmFactory", + "address": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "DomaingRoutingIsm", + "address": "0x12Ed1BbA182CbC63692F813651BD493B7445C874", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMerkleRootWeightedMultisigIsmFactory", + "address": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMerkleRootWeightedMultisigIsm", + "address": "0x3b9f24fD2ecfed0d3A88fa7f0E4e5747671981D7", + "constructorArguments": "", + "isProxy": true + }, + { + "name": "StaticMessageIdWeightedMultisigIsmFactory", + "address": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "constructorArguments": "", + "isProxy": false + }, + { + "name": "StaticMessageIdWeightedMultisigIsm", + "address": "0x71DCcD21B912F7d4f636af0C9eA5DC0C10617354", + "constructorArguments": "", + "isProxy": true + } ] } diff --git a/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json b/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json index 402f7d520..d6349dce9 100644 --- a/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json +++ b/typescript/infra/config/environments/mainnet3/middleware/accounts/verification.json @@ -1785,5 +1785,26 @@ "isProxy": true, "expectedimplementation": "0x0F9d4704E1Fb25e416042524e594F1cEac6fF597" } + ], + "bsquared": [ + { + "name": "InterchainAccountIsm", + "address": "0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "InterchainAccountRouter", + "address": "0x7CE76f5f0C469bBB4cd7Ea6EbabB54437A093127", + "constructorArguments": "0000000000000000000000003a464f746d23ab22155710f44db16dca53e0775e", + "isProxy": false + }, + { + "name": "TransparentUpgradeableProxy", + "address": "0x4D50044335dc1d4D26c343AdeDf6E47808475Deb", + "constructorArguments": "0000000000000000000000007ce76f5f0c469bbb4cd7ea6ebabb54437a0931270000000000000000000000002f2afae1139ce54fefc03593fee8ab2adf4a85a700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff26696dcdb6bbfd27e959b847d4f1399d5bcf64000000000000000000000000a7eccdb9be08178f896c26b7bbd8c3d4e844d9ba00000000000000000000000000000000000000000000000000000000", + "isProxy": true, + "expectedimplementation": "0x7CE76f5f0C469bBB4cd7Ea6EbabB54437A093127" + } ] } diff --git a/typescript/infra/config/environments/mainnet3/supportedChainNames.ts b/typescript/infra/config/environments/mainnet3/supportedChainNames.ts index 49b4228c6..f2f609fc2 100644 --- a/typescript/infra/config/environments/mainnet3/supportedChainNames.ts +++ b/typescript/infra/config/environments/mainnet3/supportedChainNames.ts @@ -17,6 +17,7 @@ export const mainnet3SupportedChainNames = [ 'bob', 'boba', 'bsc', + 'bsquared', 'celo', 'cheesechain', 'chilizmainnet', diff --git a/typescript/infra/config/environments/mainnet3/tokenPrices.json b/typescript/infra/config/environments/mainnet3/tokenPrices.json index 905bbf007..ef91796ec 100644 --- a/typescript/infra/config/environments/mainnet3/tokenPrices.json +++ b/typescript/infra/config/environments/mainnet3/tokenPrices.json @@ -15,6 +15,7 @@ "bob": "3339.7", "boba": "3339.7", "bsc": "622.77", + "bsquared": "98146", "celo": "0.69886", "cheesechain": "0.00180143", "chilizmainnet": "0.074224", diff --git a/typescript/infra/config/environments/mainnet3/validators.ts b/typescript/infra/config/environments/mainnet3/validators.ts index e52e97ee7..beb35ee7f 100644 --- a/typescript/infra/config/environments/mainnet3/validators.ts +++ b/typescript/infra/config/environments/mainnet3/validators.ts @@ -1191,5 +1191,16 @@ export const validatorChainConfig = ( 'vana', ), }, + + bsquared: { + interval: 5, + reorgPeriod: getReorgPeriod('bsquared'), + validators: validatorsConfig( + { + [Contexts.Hyperlane]: ['0xcadc90933c9fbe843358a4e70e46ad2db78e28aa'], + }, + 'bsquared', + ), + }, }; }; diff --git a/typescript/sdk/src/consts/multisigIsm.ts b/typescript/sdk/src/consts/multisigIsm.ts index b71d3c34d..32bd501f3 100644 --- a/typescript/sdk/src/consts/multisigIsm.ts +++ b/typescript/sdk/src/consts/multisigIsm.ts @@ -187,6 +187,11 @@ export const defaultMultisigConfigs: ChainMap = { ], }, + bsquared: { + threshold: 1, + validators: ['0xcadc90933c9fbe843358a4e70e46ad2db78e28aa'], + }, + camptestnet: { threshold: 1, validators: ['0x238f40f055a7ff697ea6dbff3ae943c9eae7a38e'], From 43192bd6a9f90a4a396812960f56cc61a6eeb6b7 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Tue, 26 Nov 2024 12:15:53 +0000 Subject: [PATCH 06/18] feat: basic Safe transaction decoder (#4800) ### Description Basic functionality to verify multisig txs: - Works with multiple txs from multiple chains (though atm, just 1 tx per chain in the output) - Loudly complains if there's anything unknown - Known scenarios are: - Multicalls - ICA txs - router enrollment - default ISM setting Example usage: ``` yarn tsx ./scripts/safes/parse-txs.ts -e mainnet3 --chains ethereum mantapacific bsc arbitrum optimism base blast linea mode fraxtal taiko sei zircuit --txHashes 0x7f9344cc0b3fa68ece139fb9f0d2cf854c983c343a7680c6ab7b4bfb3924c188 0x1e8e00b7375085a3e3579659815611d1e8240aa43c8826d05347a3066603330d 0x39324715341f856466ca2764468bc31c3f057c8191c99ddad284714730f9337b 0x54eeae0cf702f6a9a3929712e196bb51e0d34778f5948ae8562e4456bb649c14 0x425d8fd82fb390a91f170c32a3bb8839dc9182ad9634111d477af85320d04612 0xbd29fe0f7387ac06bea2049eb26fb9c7b62ed4e412f84137de2a94fe917adca3 0xf6f05f757c22af8a306545d20238ecf3326e93d12aaeecf64d1527daa20c1ec6 0xd9bc3cf2f7ab01560fc99e57c25113d07283245554c4c133f8aa501fb0c21147 0xc6ed50e5ccdd001022f953ae31d7f0bbf88af78bc3dae593b62ad11725cfc900 0xb703be9d342b126f7596ce5431f5ead2192a95c92df9f3c1b76f5242ce8bba4f 0x662b126f552cdc5fcdc9fdad382e28c249a511786e0056dca2bb75ac452878a3 0x246e805047ece2522d98c6841cebf7ad1ce83b4503533a77d73e1b4324ea3ce8 0x412f787db9abdc9d4d4cf863b514790b7e57d5c1e2d9a963018c8b9a3a523fb9 ``` Definitely messy and intended to be the basis of better tooling in the future. ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --------- Co-authored-by: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> --- typescript/infra/scripts/agent-utils.ts | 9 + typescript/infra/scripts/safes/parse-txs.ts | 68 +++ .../infra/src/tx/govern-transaction-reader.ts | 531 ++++++++++++++++++ typescript/infra/src/utils/safe.ts | 25 + typescript/sdk/src/index.ts | 3 +- typescript/sdk/src/utils/ism.ts | 2 +- 6 files changed, 636 insertions(+), 2 deletions(-) create mode 100644 typescript/infra/scripts/safes/parse-txs.ts create mode 100644 typescript/infra/src/tx/govern-transaction-reader.ts diff --git a/typescript/infra/scripts/agent-utils.ts b/typescript/infra/scripts/agent-utils.ts index 105fdcf49..f47d13f87 100644 --- a/typescript/infra/scripts/agent-utils.ts +++ b/typescript/infra/scripts/agent-utils.ts @@ -270,6 +270,15 @@ export function withRpcUrls(args: Argv) { .alias('r', 'rpcUrls'); } +export function withTxHashes(args: Argv) { + return args + .describe('txHashes', 'transaction hash') + .string('txHashes') + .array('txHashes') + .demandOption('txHashes') + .alias('t', 'txHashes'); +} + // not requiring to build coreConfig to get agentConfig export async function getAgentConfigsBasedOnArgs(argv?: { environment: DeployEnvironment; diff --git a/typescript/infra/scripts/safes/parse-txs.ts b/typescript/infra/scripts/safes/parse-txs.ts new file mode 100644 index 000000000..0d4a2947e --- /dev/null +++ b/typescript/infra/scripts/safes/parse-txs.ts @@ -0,0 +1,68 @@ +import { BigNumber } from 'ethers'; + +import { AnnotatedEV5Transaction } from '@hyperlane-xyz/sdk'; +import { stringifyObject } from '@hyperlane-xyz/utils'; + +import { GovernTransactionReader } from '../../src/tx/govern-transaction-reader.js'; +import { getSafeTx } from '../../src/utils/safe.js'; +import { + getArgs, + withChainRequired, + withChainsRequired, + withTxHashes, +} from '../agent-utils.js'; +import { getEnvironmentConfig, getHyperlaneCore } from '../core-utils.js'; + +async function main() { + const { environment, chains, txHashes } = await withTxHashes( + withChainsRequired(getArgs()), + ).argv; + + const config = getEnvironmentConfig(environment); + const multiProvider = await config.getMultiProvider(); + const { chainAddresses } = await getHyperlaneCore(environment, multiProvider); + + const reader = new GovernTransactionReader( + environment, + multiProvider, + chainAddresses, + config.core, + ); + + const chainResultEntries = await Promise.all( + chains.map(async (chain, chainIndex) => { + const txHash = txHashes[chainIndex]; + console.log(`Reading tx ${txHash} on ${chain}`); + const safeTx = await getSafeTx(chain, multiProvider, txHash); + const tx: AnnotatedEV5Transaction = { + to: safeTx.to, + data: safeTx.data, + value: BigNumber.from(safeTx.value), + }; + + try { + const results = await reader.read(chain, tx); + console.log(`Finished reading tx ${txHash} on ${chain}`); + return [chain, results]; + } catch (err) { + console.error('Error reading transaction', err, chain, tx); + process.exit(1); + } + }), + ); + + const chainResults = Object.fromEntries(chainResultEntries); + console.log(stringifyObject(chainResults, 'yaml', 2)); + + if (reader.errors.length) { + console.error('❌❌❌❌❌ Encountered fatal errors ❌❌❌❌❌'); + console.log(stringifyObject(reader.errors, 'yaml', 2)); + console.error('❌❌❌❌❌ Encountered fatal errors ❌❌❌❌❌'); + process.exit(1); + } +} + +main().catch((err) => { + console.error('Error:', err); + process.exit(1); +}); diff --git a/typescript/infra/src/tx/govern-transaction-reader.ts b/typescript/infra/src/tx/govern-transaction-reader.ts new file mode 100644 index 000000000..6b0327bba --- /dev/null +++ b/typescript/infra/src/tx/govern-transaction-reader.ts @@ -0,0 +1,531 @@ +import { Result } from '@ethersproject/abi'; +import { decodeMultiSendData } from '@safe-global/protocol-kit/dist/src/utils/index.js'; +import { + MetaTransactionData, + OperationType, +} from '@safe-global/safe-core-sdk-types'; +import { BigNumber, ethers } from 'ethers'; + +import { + AnnotatedEV5Transaction, + ChainMap, + ChainName, + CoreConfig, + DerivedIsmConfig, + EvmIsmReader, + InterchainAccount, + MultiProvider, + coreFactories, + interchainAccountFactories, + normalizeConfig, +} from '@hyperlane-xyz/sdk'; +import { + addressToBytes32, + bytes32ToAddress, + deepEquals, + eqAddress, + retryAsync, +} from '@hyperlane-xyz/utils'; + +import { + icaOwnerChain, + icas, + safes, +} from '../../config/environments/mainnet3/owners.js'; +import { DeployEnvironment } from '../config/environment.js'; +import { getSafeAndService } from '../utils/safe.js'; + +interface GovernTransaction extends Record { + chain: ChainName; +} + +interface MultiSendTransaction { + index: number; + value: string; + operation: string; + decoded: GovernTransaction; +} + +interface MultiSendGovernTransactions extends GovernTransaction { + multisends: MultiSendTransaction[]; +} + +interface SetDefaultIsmInsight { + module: string; + insight: string; +} + +interface IcaRemoteCallInsight { + destination: { + domain: number; + chain: ChainName; + }; + router: { + address: string; + insight: string; + }; + ism: { + address: string; + insight: string; + }; + destinationIca: { + address: string; + insight: string; + }; + calls: GovernTransaction[]; +} + +export class GovernTransactionReader { + errors: any[] = []; + + constructor( + readonly environment: DeployEnvironment, + readonly multiProvider: MultiProvider, + readonly chainAddresses: ChainMap>, + readonly coreConfig: ChainMap, + ) {} + + async read( + chain: ChainName, + tx: AnnotatedEV5Transaction, + ): Promise { + // If it's to an ICA + if (this.isIcaTransaction(chain, tx)) { + return this.readIcaTransaction(chain, tx); + } + + // If it's to a Mailbox + if (this.isMailboxTransaction(chain, tx)) { + return this.readMailboxTransaction(chain, tx); + } + + if (await this.isMultisendTransaction(chain, tx)) { + return this.readMultisendTransaction(chain, tx); + } + + const insight = '⚠️ Unknown transaction type'; + // If we get here, it's an unknown transaction + this.errors.push({ + chain: chain, + tx, + info: insight, + }); + + return { + chain, + insight, + tx, + }; + } + + private async readIcaTransaction( + chain: ChainName, + tx: AnnotatedEV5Transaction, + ): Promise { + if (!tx.data) { + throw new Error('No data in ICA transaction'); + } + const { symbol } = await this.multiProvider.getNativeToken(chain); + const icaInterface = + interchainAccountFactories.interchainAccountRouter.interface; + const decoded = icaInterface.parseTransaction({ + data: tx.data, + value: tx.value, + }); + + const args = formatFunctionFragmentArgs( + decoded.args, + decoded.functionFragment, + ); + let prettyArgs = args; + + if ( + decoded.functionFragment.name === + icaInterface.functions['enrollRemoteRouter(uint32,bytes32)'].name + ) { + prettyArgs = await this.formatRouterEnrollments( + chain, + 'interchainAccountRouter', + args, + ); + } else if ( + decoded.functionFragment.name === + icaInterface.functions[ + 'callRemoteWithOverrides(uint32,bytes32,bytes32,(bytes32,uint256,bytes)[])' + ].name + ) { + prettyArgs = await this.readIcaRemoteCall(chain, args); + } + + return { + to: `ICA Router (${chain} ${this.chainAddresses[chain].interchainAccountRouter})`, + value: `${ethers.utils.formatEther(decoded.value)} ${symbol}`, + signature: decoded.signature, + args: prettyArgs, + chain, + }; + } + + private async formatRouterEnrollments( + chain: ChainName, + routerName: string, + args: Record, + ): Promise { + const { _domains: domains, _addresses: addresses } = args; + return domains.map((domain: number, index: number) => { + const remoteChainName = this.multiProvider.getChainName(domain); + const expectedRouter = this.chainAddresses[remoteChainName][routerName]; + const routerToBeEnrolled = addresses[index]; + const matchesExpectedRouter = + eqAddress(expectedRouter, bytes32ToAddress(routerToBeEnrolled)) && + // Poor man's check that the 12 byte padding is all zeroes + addressToBytes32(bytes32ToAddress(routerToBeEnrolled)) === + routerToBeEnrolled; + + let insight = '✅ matches expected router from artifacts'; + if (!matchesExpectedRouter) { + insight = `❌ fatal mismatch, expected ${expectedRouter}`; + this.errors.push({ + chain: chain, + remoteDomain: domain, + remoteChain: remoteChainName, + router: routerToBeEnrolled, + expected: expectedRouter, + info: 'Incorrect router getting enrolled', + }); + } + + return { + domain: domain, + chainName: remoteChainName, + router: routerToBeEnrolled, + insight, + }; + }); + } + + private async readMailboxTransaction( + chain: ChainName, + tx: AnnotatedEV5Transaction, + ): Promise { + if (!tx.data) { + throw new Error('⚠️ No data in mailbox transaction'); + } + const mailboxInterface = coreFactories.mailbox.interface; + const decoded = mailboxInterface.parseTransaction({ + data: tx.data, + value: tx.value, + }); + + const args = formatFunctionFragmentArgs( + decoded.args, + decoded.functionFragment, + ); + let prettyArgs = args; + if ( + decoded.functionFragment.name === + mailboxInterface.functions['setDefaultIsm(address)'].name + ) { + prettyArgs = await this.formatMailboxSetDefaultIsm(chain, args); + } + + return { + chain, + to: `Mailbox (${chain} ${this.chainAddresses[chain].mailbox})`, + signature: decoded.signature, + args: prettyArgs, + }; + } + + private ismDerivationsInProgress: ChainMap = {}; + + private async deriveIsmConfig( + chain: string, + module: string, + ): Promise { + const reader = new EvmIsmReader(this.multiProvider, chain); + + // Start recording some info about the deriving + const startTime = Date.now(); + console.log('Deriving ISM config...', chain); + this.ismDerivationsInProgress[chain] = true; + + const derivedConfig = await reader.deriveIsmConfig(module); + + // Deriving is done, remove from in progress + delete this.ismDerivationsInProgress[chain]; + console.log( + 'Finished deriving ISM config', + chain, + 'in', + (Date.now() - startTime) / (1000 * 60), + 'mins', + ); + const remainingInProgress = Object.keys(this.ismDerivationsInProgress); + console.log( + 'Remaining derivations in progress:', + remainingInProgress.length, + 'chains', + remainingInProgress, + ); + + return derivedConfig; + } + + private async formatMailboxSetDefaultIsm( + chain: ChainName, + args: Record, + ): Promise { + const { _module: module } = args; + + const derivedConfig = this.deriveIsmConfig(chain, module); + const expectedIsmConfig = this.coreConfig[chain].defaultIsm; + + let insight = '✅ matches expected ISM config'; + const normalizedDerived = normalizeConfig(derivedConfig); + const normalizedExpected = normalizeConfig(expectedIsmConfig); + if (!deepEquals(normalizedDerived, normalizedExpected)) { + this.errors.push({ + chain: chain, + module, + derivedConfig, + expectedIsmConfig, + info: 'Incorrect default ISM being set', + }); + insight = `❌ fatal mismatch of ISM config`; + console.log( + 'Mismatch of ISM config', + chain, + JSON.stringify(normalizedDerived), + JSON.stringify(normalizedExpected), + ); + } + + return { + module, + insight, + }; + } + + private async readIcaRemoteCall( + chain: ChainName, + args: Record, + ): Promise { + const { + _destination: destination, + _router: router, + _ism: ism, + _calls: calls, + } = args; + const remoteChainName = this.multiProvider.getChainName(destination); + + const expectedRouter = + this.chainAddresses[remoteChainName].interchainAccountRouter; + const matchesExpectedRouter = + eqAddress(expectedRouter, bytes32ToAddress(router)) && + // Poor man's check that the 12 byte padding is all zeroes + addressToBytes32(bytes32ToAddress(router)) === router; + let routerInsight = '✅ matches expected router from artifacts'; + if (!matchesExpectedRouter) { + this.errors.push({ + chain: chain, + remoteDomain: destination, + remoteChain: remoteChainName, + router: router, + expected: expectedRouter, + info: 'Incorrect router in ICA call', + }); + routerInsight = `❌ fatal mismatch, expected ${expectedRouter}`; + } + + let ismInsight = '✅ matches expected ISM'; + if (ism !== ethers.constants.HashZero) { + this.errors.push({ + chain: chain, + remoteDomain: destination, + remoteChain: remoteChainName, + ism, + info: 'Incorrect ISM in ICA call, expected zero hash', + }); + ismInsight = `❌ fatal mismatch, expected zero hash`; + } + + const remoteIcaAddress = await InterchainAccount.fromAddressesMap( + this.chainAddresses, + this.multiProvider, + ).getAccount(remoteChainName, { + owner: safes[icaOwnerChain], + origin: icaOwnerChain, + routerOverride: router, + ismOverride: ism, + }); + const expectedRemoteIcaAddress = icas[remoteChainName as keyof typeof icas]; + let remoteIcaInsight = '✅ matches expected ICA'; + if ( + !expectedRemoteIcaAddress || + !eqAddress(remoteIcaAddress, expectedRemoteIcaAddress) + ) { + this.errors.push({ + chain: chain, + remoteDomain: destination, + remoteChain: remoteChainName, + ica: remoteIcaAddress, + expected: expectedRemoteIcaAddress, + info: 'Incorrect destination ICA in ICA call', + }); + remoteIcaInsight = `❌ fatal mismatch, expected ${remoteIcaAddress}`; + } + + const decodedCalls = await Promise.all( + calls.map((call: any) => { + const icaCallAsTx = { + to: bytes32ToAddress(call[0]), + value: BigNumber.from(call[1]), + data: call[2], + }; + return this.read(remoteChainName, icaCallAsTx); + }), + ); + + return { + destination: { + domain: destination, + chain: remoteChainName, + }, + router: { + address: router, + insight: routerInsight, + }, + ism: { + address: ism, + insight: ismInsight, + }, + destinationIca: { + address: remoteIcaAddress, + insight: remoteIcaInsight, + }, + calls: decodedCalls, + }; + } + + private async readMultisendTransaction( + chain: ChainName, + tx: AnnotatedEV5Transaction, + ): Promise { + if (!tx.data) { + throw new Error('No data in multisend transaction'); + } + const multisendDatas = decodeMultiSendData(tx.data); + + const { symbol } = await this.multiProvider.getNativeToken(chain); + + const multisends = await Promise.all( + multisendDatas.map(async (multisend, index) => { + const decoded = await this.read( + chain, + metaTransactionDataToEV5Transaction(multisend), + ); + return { + chain, + index, + value: `${ethers.utils.formatEther(multisend.value)} ${symbol}`, + operation: formatOperationType(multisend.operation), + decoded, + }; + }), + ); + + return { + chain, + multisends, + }; + } + + isIcaTransaction(chain: ChainName, tx: AnnotatedEV5Transaction): boolean { + return ( + tx.to !== undefined && + eqAddress(tx.to, this.chainAddresses[chain].interchainAccountRouter) + ); + } + + isMailboxTransaction(chain: ChainName, tx: AnnotatedEV5Transaction): boolean { + return ( + tx.to !== undefined && + eqAddress(tx.to, this.chainAddresses[chain].mailbox) + ); + } + + async isMultisendTransaction( + chain: ChainName, + tx: AnnotatedEV5Transaction, + ): Promise { + if (tx.to === undefined) { + return false; + } + const multiSendCallOnlyAddress = await this.getMultiSendCallOnlyAddress( + chain, + ); + if (!multiSendCallOnlyAddress) { + return false; + } + + return eqAddress(multiSendCallOnlyAddress, tx.to); + } + + private multiSendCallOnlyAddressCache: ChainMap = {}; + + async getMultiSendCallOnlyAddress( + chain: ChainName, + ): Promise { + if (this.multiSendCallOnlyAddressCache[chain]) { + return this.multiSendCallOnlyAddressCache[chain]; + } + + const safe = safes[chain]; + if (!safe) { + return undefined; + } + + const { safeSdk } = await getSafeAndService( + chain, + this.multiProvider, + safe, + ); + + this.multiSendCallOnlyAddressCache[chain] = + safeSdk.getMultiSendCallOnlyAddress(); + return this.multiSendCallOnlyAddressCache[chain]; + } +} + +function metaTransactionDataToEV5Transaction( + metaTransactionData: MetaTransactionData, +): AnnotatedEV5Transaction { + return { + to: metaTransactionData.to, + value: BigNumber.from(metaTransactionData.value), + data: metaTransactionData.data, + }; +} + +function formatFunctionFragmentArgs( + args: Result, + fragment: ethers.utils.FunctionFragment, +): Record { + const accumulator: Record = {}; + return fragment.inputs.reduce((acc, input, index) => { + acc[input.name] = args[index]; + return acc; + }, accumulator); +} + +function formatOperationType(operation: OperationType | undefined): string { + switch (operation) { + case OperationType.Call: + return 'Call'; + case OperationType.DelegateCall: + return 'Delegate Call'; + default: + return '⚠️ Unknown ⚠️'; + } +} diff --git a/typescript/infra/src/utils/safe.ts b/typescript/infra/src/utils/safe.ts index 08ae74aab..95e27c50e 100644 --- a/typescript/infra/src/utils/safe.ts +++ b/typescript/infra/src/utils/safe.ts @@ -161,6 +161,31 @@ export async function deleteAllPendingSafeTxs( ); } +export async function getSafeTx( + chain: ChainNameOrId, + multiProvider: MultiProvider, + safeTxHash: string, +): Promise { + const txServiceUrl = + multiProvider.getChainMetadata(chain).gnosisSafeTransactionServiceUrl; + + // Fetch the transaction details to get the proposer + const txDetailsUrl = `${txServiceUrl}/api/v1/multisig-transactions/${safeTxHash}/`; + const txDetailsResponse = await fetch(txDetailsUrl, { + method: 'GET', + headers: { 'Content-Type': 'application/json' }, + }); + + if (!txDetailsResponse.ok) { + console.error( + chalk.red(`Failed to fetch transaction details for ${safeTxHash}`), + ); + return; + } + + return txDetailsResponse.json(); +} + export async function deleteSafeTx( chain: ChainNameOrId, multiProvider: MultiProvider, diff --git a/typescript/sdk/src/index.ts b/typescript/sdk/src/index.ts index 1c2146b79..cdb86b504 100644 --- a/typescript/sdk/src/index.ts +++ b/typescript/sdk/src/index.ts @@ -148,7 +148,7 @@ export { PausableHookConfig, ProtocolFeeHookConfig, } from './hook/types.js'; -export { EvmIsmReader } from './ism/EvmIsmReader.js'; +export { DerivedIsmConfig, EvmIsmReader } from './ism/EvmIsmReader.js'; export { HyperlaneIsmFactory } from './ism/HyperlaneIsmFactory.js'; export { buildAggregationIsmConfigs, @@ -500,6 +500,7 @@ export { stopImpersonatingAccount, } from './utils/fork.js'; export { multisigIsmVerificationCost, normalizeConfig } from './utils/ism.js'; +export { HyperlaneReader } from './utils/HyperlaneReader.js'; export { MultiGeneric } from './utils/MultiGeneric.js'; export { SealevelAccountDataWrapper, diff --git a/typescript/sdk/src/utils/ism.ts b/typescript/sdk/src/utils/ism.ts index 92c267e66..669cf7e9d 100644 --- a/typescript/sdk/src/utils/ism.ts +++ b/typescript/sdk/src/utils/ism.ts @@ -25,7 +25,7 @@ function lowerCaseConfig(obj: any): any { } else if (obj !== null && typeof obj === 'object') { const newObj: any = {}; for (const key in obj) { - if (key !== 'address') { + if (key !== 'address' && key !== 'ownerOverrides') { newObj[key] = key === 'type' ? obj[key] : normalizeConfig(obj[key]); } } From d51815760bde3fabe2628a185ceb86ea3635e287 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Tue, 26 Nov 2024 18:05:32 +0000 Subject: [PATCH 07/18] feat: deploy apxETH and ezSOL routes (#4901) ### Description Ownership transfer pending getting addresses ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .changeset/bright-students-exist.md | 5 ++ .registryrc | 2 +- rust/sealevel/client/src/cmd_utils.rs | 21 ++++++++- rust/sealevel/client/src/core.rs | 22 ++++----- .../apxETH-eclipse-ethereum/program-ids.json | 10 ++++ .../apxETH-eclipse-ethereum/token-config.json | 17 +++++++ .../ezSOL-eclipse-solana/program-ids.json | 10 ++++ .../ezSOL-eclipse-solana/token-config.json | 17 +++++++ typescript/cli/src/deploy/warp.ts | 22 +++++++-- typescript/cli/src/utils/balances.ts | 9 +++- .../getEclipseEthereumApxETHWarpConfig.ts | 46 +++++++++++++++++++ .../getEclipseEthereumSolanaUSDCWarpConfig.ts | 3 +- .../getEclipseEthereumSolanaUSDTWarpConfig.ts | 3 +- .../getEclipseEthereumTETHWarpConfig.ts | 4 +- .../getEclipseEthereumWBTCWarpConfig.ts | 3 +- .../getEclipseEthereumWeETHsWarpConfig.ts | 3 +- .../getEclipseStrideSTTIAWarpConfig.ts | 3 +- .../getEclipseStrideTIAWarpConfig.ts | 3 +- .../environments/mainnet3/warp/consts.ts | 2 + .../environments/mainnet3/warp/warpIds.ts | 2 + typescript/infra/config/warp.ts | 6 ++- .../warp-routes/generate-warp-config.ts | 2 +- typescript/infra/src/config/warp.ts | 1 + 23 files changed, 184 insertions(+), 32 deletions(-) create mode 100644 .changeset/bright-students-exist.md create mode 100644 rust/sealevel/environments/mainnet3/warp-routes/apxETH-eclipse-ethereum/program-ids.json create mode 100644 rust/sealevel/environments/mainnet3/warp-routes/apxETH-eclipse-ethereum/token-config.json create mode 100644 rust/sealevel/environments/mainnet3/warp-routes/ezSOL-eclipse-solana/program-ids.json create mode 100644 rust/sealevel/environments/mainnet3/warp-routes/ezSOL-eclipse-solana/token-config.json create mode 100644 typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumApxETHWarpConfig.ts create mode 100644 typescript/infra/config/environments/mainnet3/warp/consts.ts diff --git a/.changeset/bright-students-exist.md b/.changeset/bright-students-exist.md new file mode 100644 index 000000000..84833ecae --- /dev/null +++ b/.changeset/bright-students-exist.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/cli': minor +--- + +Support using the CLI to deploy warp routes that involve foreign deployments diff --git a/.registryrc b/.registryrc index 7a6a49b40..01f6449ff 100644 --- a/.registryrc +++ b/.registryrc @@ -1 +1 @@ -fa13e998aceff5a82b1a4e0791fe392791bb0393 +385b83950adba6f033be836b627bab7d89aae38d diff --git a/rust/sealevel/client/src/cmd_utils.rs b/rust/sealevel/client/src/cmd_utils.rs index e0cd3ff68..f387d3c4f 100644 --- a/rust/sealevel/client/src/cmd_utils.rs +++ b/rust/sealevel/client/src/cmd_utils.rs @@ -17,6 +17,23 @@ use solana_sdk::{ const SOLANA_DOMAIN: u32 = 1399811149; +pub(crate) fn get_compute_unit_price_micro_lamports_for_id(domain: u32) -> u64 { + get_compute_unit_price(domain == SOLANA_DOMAIN) +} + +pub(crate) fn get_compute_unit_price_micro_lamports_for_chain_name(chain_name: &str) -> u64 { + get_compute_unit_price(chain_name == "solanamainnet") +} + +fn get_compute_unit_price(is_solanamainnet: bool) -> u64 { + if is_solanamainnet { + // Generally taking a low/medium value from https://www.quicknode.com/gas-tracker/solana + 500_000 + } else { + 0 + } +} + pub(crate) fn account_exists(client: &RpcClient, account: &Pubkey) -> Result { // Using `get_account_with_commitment` instead of `get_account` so we get Ok(None) when the account // doesn't exist, rather than an error @@ -73,9 +90,9 @@ pub(crate) fn deploy_program( program_keypair_path, ]; + let compute_unit_price = get_compute_unit_price_micro_lamports_for_id(local_domain).to_string(); if local_domain.eq(&SOLANA_DOMAIN) { - // May need tweaking depending on gas prices / available balance - command.append(&mut vec!["--with-compute-unit-price", "550000"]); + command.extend(vec!["--with-compute-unit-price", &compute_unit_price]); } build_cmd(command.as_slice(), None, None); diff --git a/rust/sealevel/client/src/core.rs b/rust/sealevel/client/src/core.rs index 44cf9cb52..e3abedf03 100644 --- a/rust/sealevel/client/src/core.rs +++ b/rust/sealevel/client/src/core.rs @@ -9,26 +9,21 @@ use solana_sdk::{compute_budget, compute_budget::ComputeBudgetInstruction}; use std::collections::HashMap; use std::{fs::File, path::Path}; +use crate::cmd_utils::get_compute_unit_price_micro_lamports_for_chain_name; +use crate::ONE_SOL_IN_LAMPORTS; use crate::{ artifacts::{read_json, write_json}, cmd_utils::{create_and_write_keypair, create_new_directory, deploy_program}, multisig_ism::deploy_multisig_ism_message_id, Context, CoreCmd, CoreDeploy, CoreSubCmd, }; -use crate::{DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT, ONE_SOL_IN_LAMPORTS}; use hyperlane_core::H256; use hyperlane_sealevel_igp::accounts::{SOL_DECIMALS, TOKEN_EXCHANGE_RATE_SCALE}; pub(crate) fn adjust_gas_price_if_needed(chain_name: &str, ctx: &mut Context) { if chain_name.eq("solanamainnet") { + let compute_unit_price = get_compute_unit_price_micro_lamports_for_chain_name(chain_name); let mut initial_instructions = ctx.initial_instructions.borrow_mut(); - const PROCESS_DESIRED_PRIORITIZATION_FEE_LAMPORTS_PER_TX: u64 = 50_000_000; - const MICRO_LAMPORT_FEE_PER_LIMIT: u64 = - // Convert to micro-lamports - (PROCESS_DESIRED_PRIORITIZATION_FEE_LAMPORTS_PER_TX * 1_000_000) - // Divide by the max compute units - / DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT as u64; - for i in initial_instructions.iter_mut() { if i.instruction.program_id != compute_budget::id() { continue; @@ -41,9 +36,8 @@ pub(crate) fn adjust_gas_price_if_needed(chain_name: &str, ctx: &mut Context) { ComputeBudgetInstruction::SetComputeUnitPrice { .. } ) { // The compute unit price has already been set, so we override it and return early - i.instruction = ComputeBudgetInstruction::set_compute_unit_price( - MICRO_LAMPORT_FEE_PER_LIMIT, - ); + i.instruction = + ComputeBudgetInstruction::set_compute_unit_price(compute_unit_price); return; } } @@ -51,10 +45,10 @@ pub(crate) fn adjust_gas_price_if_needed(chain_name: &str, ctx: &mut Context) { initial_instructions.push( ( - ComputeBudgetInstruction::set_compute_unit_price(MICRO_LAMPORT_FEE_PER_LIMIT), + ComputeBudgetInstruction::set_compute_unit_price(compute_unit_price), Some(format!( - "Set compute unit price to {}", - MICRO_LAMPORT_FEE_PER_LIMIT + "Set compute unit price to {} micro-lamports", + compute_unit_price )), ) .into(), diff --git a/rust/sealevel/environments/mainnet3/warp-routes/apxETH-eclipse-ethereum/program-ids.json b/rust/sealevel/environments/mainnet3/warp-routes/apxETH-eclipse-ethereum/program-ids.json new file mode 100644 index 000000000..683a275ab --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/apxETH-eclipse-ethereum/program-ids.json @@ -0,0 +1,10 @@ +{ + "eclipsemainnet": { + "hex": "0x82f7445ccda6396092998c8f841f0d4eb63cca29ba23cfd2609d283f3ee9d13f", + "base58": "9pEgj7m2VkwLtJHPtTw5d8vbB7kfjzcXXCRgdwruW7C2" + }, + "ethereum": { + "hex": "0x000000000000000000000000d34fe1685c28a68bb4b8faaadcb2769962ae737c", + "base58": "1111111111113wkPRLXCJuj9539UEURsN3qhoaYb" + } +} diff --git a/rust/sealevel/environments/mainnet3/warp-routes/apxETH-eclipse-ethereum/token-config.json b/rust/sealevel/environments/mainnet3/warp-routes/apxETH-eclipse-ethereum/token-config.json new file mode 100644 index 000000000..1634a20d3 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/apxETH-eclipse-ethereum/token-config.json @@ -0,0 +1,17 @@ +{ + "eclipsemainnet": { + "type": "synthetic", + "decimals": 9, + "remoteDecimals": 18, + "name": "Autocompounding Pirex Ether", + "symbol": "apxETH", + "uri": "https://raw.githubusercontent.com/hyperlane-xyz/hyperlane-registry/ae7df1bc00af19f8ba692c14e4df3acdbf30497d/deployments/warp_routes/APXETH/metadata.json", + "interchainGasPaymaster": "3Wp4qKkgf4tjXz1soGyTSndCgBPLZFSrZkiDZ8Qp9EEj" + }, + "ethereum": { + "type": "collateral", + "decimals": 18, + "token": "0x9ba021b0a9b958b5e75ce9f6dff97c7ee52cb3e6", + "foreignDeployment": "0xd34FE1685c28A68Bb4B8fAaadCb2769962AE737c" + } +} diff --git a/rust/sealevel/environments/mainnet3/warp-routes/ezSOL-eclipse-solana/program-ids.json b/rust/sealevel/environments/mainnet3/warp-routes/ezSOL-eclipse-solana/program-ids.json new file mode 100644 index 000000000..5a914d4f2 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/ezSOL-eclipse-solana/program-ids.json @@ -0,0 +1,10 @@ +{ + "eclipsemainnet": { + "hex": "0xb06d58417c929a624e9b689e604e6d60ca652168ee76b9a290bd5b974b22b306", + "base58": "CshTfxXWMvnRAwBTCjQ4577bkP5po5ZuNG1QTuQxA5Au" + }, + "solanamainnet": { + "hex": "0x08bb318b88b38cc6f450b185e51a9c42402dc9d36fa6741c19c2aa62464a5eb3", + "base58": "b5pMgizA9vrGRt3hVqnU7vUVGBQUnLpwPzcJhG1ucyQ" + } +} diff --git a/rust/sealevel/environments/mainnet3/warp-routes/ezSOL-eclipse-solana/token-config.json b/rust/sealevel/environments/mainnet3/warp-routes/ezSOL-eclipse-solana/token-config.json new file mode 100644 index 000000000..eef5c8349 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/ezSOL-eclipse-solana/token-config.json @@ -0,0 +1,17 @@ +{ + "solanamainnet": { + "type": "collateral", + "decimals": 9, + "interchainGasPaymaster": "AkeHBbE5JkwVppujCQQ6WuxsVsJtruBAjUo6fDCFp6fF", + "token": "ezSoL6fY1PVdJcJsUpe5CM3xkfmy3zoVCABybm5WtiC", + "splTokenProgram": "token" + }, + "eclipsemainnet": { + "type": "synthetic", + "decimals": 9, + "name": "Renzo Restaked SOL", + "symbol": "ezSOL", + "uri": "https://raw.githubusercontent.com/hyperlane-xyz/hyperlane-registry/ae7df1bc00af19f8ba692c14e4df3acdbf30497d/deployments/warp_routes/EZSOL/metadata.json", + "interchainGasPaymaster": "3Wp4qKkgf4tjXz1soGyTSndCgBPLZFSrZkiDZ8Qp9EEj" + } +} diff --git a/typescript/cli/src/deploy/warp.ts b/typescript/cli/src/deploy/warp.ts index 026cd594b..161d296f8 100644 --- a/typescript/cli/src/deploy/warp.ts +++ b/typescript/cli/src/deploy/warp.ts @@ -136,16 +136,24 @@ export async function runWarpRouteDeploy({ await runDeployPlanStep(deploymentParams); + // Some of the below functions throw if passed non-EVM chains + const ethereumChains = chains.filter( + (chain) => chainMetadata[chain].protocol === ProtocolType.Ethereum, + ); + await runPreflightChecksForChains({ context, - chains, + chains: ethereumChains, minGas: MINIMUM_WARP_DEPLOY_GAS, }); const userAddress = await signer.getAddress(); - const initialBalances = await prepareDeploy(context, userAddress, chains); - + const initialBalances = await prepareDeploy( + context, + userAddress, + ethereumChains, + ); const deployedContracts = await executeDeploy(deploymentParams, apiKeys); const warpCoreConfig = await getWarpCoreConfig( @@ -155,7 +163,13 @@ export async function runWarpRouteDeploy({ await writeDeploymentArtifacts(warpCoreConfig, context); - await completeDeploy(context, 'warp', initialBalances, userAddress, chains); + await completeDeploy( + context, + 'warp', + initialBalances, + userAddress, + ethereumChains, + ); } async function runDeployPlanStep({ context, warpDeployConfig }: DeployParams) { diff --git a/typescript/cli/src/utils/balances.ts b/typescript/cli/src/utils/balances.ts index 5cf801977..4536353e5 100644 --- a/typescript/cli/src/utils/balances.ts +++ b/typescript/cli/src/utils/balances.ts @@ -2,8 +2,9 @@ import { confirm } from '@inquirer/prompts'; import { ethers } from 'ethers'; import { ChainName, MultiProvider } from '@hyperlane-xyz/sdk'; +import { ProtocolType } from '@hyperlane-xyz/utils'; -import { logGreen, logRed } from '../logger.js'; +import { logGray, logGreen, logRed } from '../logger.js'; export async function nativeBalancesAreSufficient( multiProvider: MultiProvider, @@ -15,6 +16,12 @@ export async function nativeBalancesAreSufficient( const sufficientBalances: boolean[] = []; for (const chain of chains) { + // Only Ethereum chains are supported + if (multiProvider.getProtocol(chain) !== ProtocolType.Ethereum) { + logGray(`Skipping balance check for non-EVM chain: ${chain}`); + continue; + } + const provider = multiProvider.getProvider(chain); const gasPrice = await provider.getGasPrice(); const minBalanceWei = gasPrice.mul(minGas).toString(); diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumApxETHWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumApxETHWarpConfig.ts new file mode 100644 index 000000000..517836b52 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumApxETHWarpConfig.ts @@ -0,0 +1,46 @@ +import { ethers } from 'ethers'; + +import { + ChainMap, + OwnableConfig, + TokenRouterConfig, + TokenType, +} from '@hyperlane-xyz/sdk'; + +import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; +import { + RouterConfigWithoutOwner, + tokens, +} from '../../../../../src/config/warp.js'; +import { DEPLOYER } from '../../owners.js'; +import { SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT } from '../consts.js'; + +const ethereumOwner = DEPLOYER; +const eclipseOwner = '9bRSUPjfS3xS6n5EfkJzHFTRDa4AHLda8BU2pP4HoWnf'; + +export async function getEclipseEthereumApxEthWarpConfig( + routerConfig: ChainMap, + _abacusWorksEnvOwnerConfig: ChainMap, +): Promise> { + const eclipsemainnet: TokenRouterConfig = { + ...routerConfig.eclipsemainnet, + ...getOwnerConfigForAddress(eclipseOwner), + type: TokenType.synthetic, + foreignDeployment: '9pEgj7m2VkwLtJHPtTw5d8vbB7kfjzcXXCRgdwruW7C2', + gas: SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + let ethereum: TokenRouterConfig = { + ...routerConfig.ethereum, + ...getOwnerConfigForAddress(ethereumOwner), + type: TokenType.collateral, + token: tokens.ethereum.apxETH, + interchainSecurityModule: ethers.constants.AddressZero, + }; + + return { + eclipsemainnet, + ethereum, + }; +} diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDCWarpConfig.ts index 078c90776..eaaf5749c 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDCWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDCWarpConfig.ts @@ -8,6 +8,7 @@ import { } from '@hyperlane-xyz/sdk'; import { tokens } from '../../../../../src/config/warp.js'; +import { SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT } from '../consts.js'; export const getEclipseEthereumSolanaUSDCWarpConfig = async ( routerConfig: ChainMap, @@ -16,7 +17,7 @@ export const getEclipseEthereumSolanaUSDCWarpConfig = async ( ...routerConfig.eclipsemainnet, type: TokenType.synthetic, foreignDeployment: 'D6k6T3G74ij6atCtBiWBs5TbFa1hFVcrFUSGZHuV7q3Z', - gas: 300_000, + gas: SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT, }; const ethereum: TokenRouterConfig = { diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDTWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDTWarpConfig.ts index fbece7506..bbabe4f5d 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDTWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDTWarpConfig.ts @@ -11,6 +11,7 @@ import { RouterConfigWithoutOwner, tokens, } from '../../../../../src/config/warp.js'; +import { SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT } from '../consts.js'; export const getEclipseEthereumSolanaUSDTWarpConfig = async ( routerConfig: ChainMap, @@ -21,7 +22,7 @@ export const getEclipseEthereumSolanaUSDTWarpConfig = async ( ...abacusWorksEnvOwnerConfig.eclipsemainnet, type: TokenType.synthetic, foreignDeployment: '5g5ujyYUNvdydwyDVCpZwPpgYRqH5RYJRi156cxyE3me', - gas: 300_000, + gas: SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT, interchainSecurityModule: ethers.constants.AddressZero, }; let ethereum: TokenRouterConfig = { diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumTETHWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumTETHWarpConfig.ts index db149da15..ca6138df1 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumTETHWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumTETHWarpConfig.ts @@ -7,6 +7,8 @@ import { TokenType, } from '@hyperlane-xyz/sdk'; +import { SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT } from '../consts.js'; + export const getEthereumEclipseTETHWarpConfig = async ( routerConfig: ChainMap, ): Promise> => { @@ -14,7 +16,7 @@ export const getEthereumEclipseTETHWarpConfig = async ( ...routerConfig.eclipsemainnet, type: TokenType.synthetic, foreignDeployment: 'BJa3fPvvjKx8gRCWunoSrWBbsmieub37gsGpjp4BfTfW', - gas: 300_000, + gas: SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT, }; const ethereum: TokenRouterConfig = { diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWBTCWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWBTCWarpConfig.ts index 4b2a4a7bb..0b1fd2343 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWBTCWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWBTCWarpConfig.ts @@ -11,6 +11,7 @@ import { RouterConfigWithoutOwner, tokens, } from '../../../../../src/config/warp.js'; +import { SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT } from '../consts.js'; export const getEclipseEthereumWBTCWarpConfig = async ( routerConfig: ChainMap, @@ -21,7 +22,7 @@ export const getEclipseEthereumWBTCWarpConfig = async ( ...abacusWorksEnvOwnerConfig.eclipsemainnet, type: TokenType.synthetic, foreignDeployment: 'A7EGCDYFw5R7Jfm6cYtKvY8dmkrYMgwRCJFkyQwpHTYu', - gas: 300_000, + gas: SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT, interchainSecurityModule: ethers.constants.AddressZero, }; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWeETHsWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWeETHsWarpConfig.ts index b4d7885f2..7df68ccba 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWeETHsWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseEthereumWeETHsWarpConfig.ts @@ -13,6 +13,7 @@ import { RouterConfigWithoutOwner, tokens, } from '../../../../../src/config/warp.js'; +import { SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT } from '../consts.js'; // Safe owned by Veda const ethereumOwner = '0xCEA8039076E35a825854c5C2f85659430b06ec96'; @@ -28,7 +29,7 @@ export async function getEclipseEthereumWeEthsWarpConfig( ...getOwnerConfigForAddress(eclipseOwner), type: TokenType.synthetic, foreignDeployment: '7Zx4wU1QAw98MfvnPFqRh1oyumek7G5VAX6TKB3U1tcn', - gas: 300_000, + gas: SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT, interchainSecurityModule: ethers.constants.AddressZero, }; diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideSTTIAWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideSTTIAWarpConfig.ts index 4d8c79a7c..158e6e367 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideSTTIAWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideSTTIAWarpConfig.ts @@ -7,6 +7,7 @@ import { import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js'; +import { SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT } from '../consts.js'; // Stride team const strideOwner = 'stride1k8c2m5cn322akk5wy8lpt87dd2f4yh9azg7jlh'; @@ -20,7 +21,7 @@ export const getEclipseStrideTiaWarpConfig = async ( ...abacusWorksEnvOwnerConfig.eclipsemainnet, type: TokenType.synthetic, foreignDeployment: 'BpXHAiktwjx7fN6M9ST9wr6qKAsH27wZFhdHEhReJsR6', - gas: 300_000, + gas: SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT, }; const stride: TokenRouterConfig = { diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideTIAWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideTIAWarpConfig.ts index d687138b3..936402659 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideTIAWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getEclipseStrideTIAWarpConfig.ts @@ -7,6 +7,7 @@ import { import { getOwnerConfigForAddress } from '../../../../../src/config/environment.js'; import { RouterConfigWithoutOwner } from '../../../../../src/config/warp.js'; +import { SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT } from '../consts.js'; // Stride team const strideOwner = 'stride1k8c2m5cn322akk5wy8lpt87dd2f4yh9azg7jlh'; @@ -20,7 +21,7 @@ export const getEclipseStrideStTiaWarpConfig = async ( ...abacusWorksEnvOwnerConfig.eclipsemainnet, type: TokenType.synthetic, foreignDeployment: 'tKUHyJ5NxhnwU94JUmzh1ekukDcHHX8mZF6fqxbMwX6', - gas: 300_000, + gas: SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT, }; const stride: TokenRouterConfig = { diff --git a/typescript/infra/config/environments/mainnet3/warp/consts.ts b/typescript/infra/config/environments/mainnet3/warp/consts.ts new file mode 100644 index 000000000..f201c1784 --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/warp/consts.ts @@ -0,0 +1,2 @@ +// The amount of gas to pay for when performing a transferRemote to a Sealevel chain. +export const SEALEVEL_WARP_ROUTE_HANDLER_GAS_AMOUNT = 300_000; diff --git a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts index 70246891c..679d53131 100644 --- a/typescript/infra/config/environments/mainnet3/warp/warpIds.ts +++ b/typescript/infra/config/environments/mainnet3/warp/warpIds.ts @@ -5,11 +5,13 @@ export enum WarpRouteIds { ArbitrumEthereumZircuitAMPHRETH = 'AMPHRETH/arbitrum-ethereum-zircuit', ArbitrumNeutronEclip = 'ECLIP/arbitrum-neutron', ArbitrumNeutronTIA = 'TIA/arbitrum-neutron', + EclipseEthereumApxEth = 'APXETH/eclipsemainnet-ethereum', EclipseEthereumSolanaUSDC = 'USDC/eclipsemainnet-ethereum-solanamainnet', EclipseEthereumSolanaUSDT = 'USDT/eclipsemainnet-ethereum-solanamainnet', EclipseEthereumTETH = 'tETH/eclipsemainnet-ethereum', EclipseEthereumWBTC = 'WBTC/eclipsemainnet-ethereum', EclipseEthereumWeETHs = 'weETHs/eclipsemainnet-ethereum', + EclipseSolanaEzSOL = 'EZSOL/eclipsemainnet-solanamainnet', EclipseSolanaORCA = 'ORCA/eclipsemainnet-solanamainnet', EclipseSolanaSOL = 'SOL/eclipsemainnet-solanamainnet', EclipseSolanaWIF = 'WIF/eclipsemainnet-solanamainnet', diff --git a/typescript/infra/config/warp.ts b/typescript/infra/config/warp.ts index 53c202db8..a32dc4228 100644 --- a/typescript/infra/config/warp.ts +++ b/typescript/infra/config/warp.ts @@ -16,6 +16,7 @@ import { getAncient8EthereumUSDCWarpConfig } from './environments/mainnet3/warp/ import { getArbitrumEthereumZircuitAmphrETHWarpConfig } from './environments/mainnet3/warp/configGetters/getArbitrumEthereumZircuitAmphrETHWarpConfig.js'; import { getArbitrumNeutronEclipWarpConfig } from './environments/mainnet3/warp/configGetters/getArbitrumNeutronEclipWarpConfig.js'; import { getArbitrumNeutronTiaWarpConfig } from './environments/mainnet3/warp/configGetters/getArbitrumNeutronTiaWarpConfig.js'; +import { getEclipseEthereumApxEthWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseEthereumApxETHWarpConfig.js'; import { getEclipseEthereumSolanaUSDTWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseEthereumSolanaUSDTWarpConfig.js'; import { getEclipseEthereumWBTCWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseEthereumWBTCWarpConfig.js'; import { getEclipseEthereumWeEthsWarpConfig } from './environments/mainnet3/warp/configGetters/getEclipseEthereumWeETHsWarpConfig.js'; @@ -59,12 +60,13 @@ export const warpConfigGetterMap: Record = { [WarpRouteIds.EthereumZircuitPZETH]: getRenzoPZETHWarpConfig, [WarpRouteIds.EthereumBscLumiaLUMIA]: getEthereumBscLUMIAWarpConfig, [WarpRouteIds.MantapacificNeutronTIA]: getMantapacificNeutronTiaWarpConfig, - [WarpRouteIds.EclipseStrideTIA]: getEclipseStrideTiaWarpConfig, - [WarpRouteIds.EclipseStrideSTTIA]: getEclipseStrideStTiaWarpConfig, + [WarpRouteIds.EclipseEthereumApxEth]: getEclipseEthereumApxEthWarpConfig, [WarpRouteIds.EclipseEthereumSolanaUSDT]: getEclipseEthereumSolanaUSDTWarpConfig, [WarpRouteIds.EclipseEthereumWBTC]: getEclipseEthereumWBTCWarpConfig, [WarpRouteIds.EclipseEthereumWeETHs]: getEclipseEthereumWeEthsWarpConfig, + [WarpRouteIds.EclipseStrideTIA]: getEclipseStrideTiaWarpConfig, + [WarpRouteIds.EclipseStrideSTTIA]: getEclipseStrideStTiaWarpConfig, }; export async function getWarpConfig( diff --git a/typescript/infra/scripts/warp-routes/generate-warp-config.ts b/typescript/infra/scripts/warp-routes/generate-warp-config.ts index 61f1cd46f..077cef0d4 100644 --- a/typescript/infra/scripts/warp-routes/generate-warp-config.ts +++ b/typescript/infra/scripts/warp-routes/generate-warp-config.ts @@ -34,4 +34,4 @@ async function main() { } } -main().catch(console.error).then(console.log); +main().catch((err) => console.error('Error:', err)); diff --git a/typescript/infra/src/config/warp.ts b/typescript/infra/src/config/warp.ts index 51dfaf4d2..e42cd1f03 100644 --- a/typescript/infra/src/config/warp.ts +++ b/typescript/infra/src/config/warp.ts @@ -10,6 +10,7 @@ import { Address } from '@hyperlane-xyz/utils'; export const tokens: ChainMap> = { ethereum: { amphrETH: '0x5fD13359Ba15A84B76f7F87568309040176167cd', + apxETH: '0x9ba021b0a9b958b5e75ce9f6dff97c7ee52cb3e6', cbBTC: '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf', deUSD: '0x15700B564Ca08D9439C58cA5053166E8317aa138', USDC: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', From fa6d5f5c63922c1435f4a5eae59d79c0782d41f7 Mon Sep 17 00:00:00 2001 From: J M Rossy Date: Tue, 26 Nov 2024 14:12:10 -0500 Subject: [PATCH 08/18] chore: Upgrade to ESlint 9 and forbid import cycles (#4897) ### Description - Upgrade from eslint 8 -> 9 - Forbid import cycles and self imports - Fix lint errors caught by v9 but not v8 - Include utils package in CI linting **No semantic changes, just some shuffling of things around to avoid cycles** Fixes https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/4898 https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-cycle.md https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-self-import.md --- .changeset/spotty-pumpkins-buy.md | 5 + .changeset/yellow-baboons-kneel.md | 5 + .eslintignore | 4 - .eslintrc | 65 -- .github/workflows/test.yml | 6 + eslint.config.mjs | 115 +++ package.json | 10 +- typescript/ccip-server/.eslintrc | 6 - typescript/ccip-server/eslint.config.mjs | 17 + typescript/ccip-server/package.json | 3 + typescript/ccip-server/src/server.ts | 14 +- .../src/services/LightClientService.ts | 4 +- .../ccip-server/src/services/ProofsService.ts | 8 +- typescript/ccip-server/tsconfig.json | 9 + typescript/cli/.eslintignore | 2 - typescript/cli/.eslintrc | 6 - typescript/cli/eslint.config.mjs | 20 + typescript/cli/package.json | 11 +- typescript/cli/src/avs/check.ts | 2 +- typescript/cli/src/check/warp.ts | 1 - typescript/cli/src/commands/relayer.ts | 2 +- typescript/cli/src/commands/warp.ts | 2 +- typescript/cli/src/config/agent.ts | 2 +- typescript/cli/src/config/submit.ts | 9 +- typescript/cli/src/deploy/core.ts | 2 +- typescript/cli/src/deploy/dry-run.ts | 3 +- typescript/cli/src/deploy/utils.ts | 4 - typescript/cli/src/deploy/warp.ts | 5 +- typescript/cli/src/read/warp.ts | 2 +- typescript/cli/src/status/message.ts | 2 +- typescript/cli/src/utils/env.ts | 2 +- typescript/cli/src/utils/files.ts | 6 +- typescript/cli/src/utils/input.ts | 43 +- typescript/cli/src/utils/warp.ts | 35 + .../cli/src/validator/preFlightCheck.ts | 4 +- typescript/helloworld/.eslintignore | 5 - typescript/helloworld/.eslintrc | 39 - typescript/helloworld/eslint.config.mjs | 17 + typescript/helloworld/package.json | 13 +- typescript/sdk/.eslintrc | 7 - typescript/sdk/eslint.config.mjs | 25 + typescript/sdk/package.json | 10 +- typescript/sdk/src/consts/.eslintrc | 5 - .../sdk/src/consts/multisigIsmVerifyCosts.ts | 1 - .../sdk/src/core/CoreDeployer.hardhat-test.ts | 4 +- typescript/sdk/src/core/EvmCoreModule.ts | 5 +- typescript/sdk/src/core/HyperlaneRelayer.ts | 8 +- typescript/sdk/src/core/schemas.ts | 4 +- .../sdk/src/deploy/HyperlaneDeployer.ts | 2 +- typescript/sdk/src/deploy/verify/.eslintrc | 5 - .../sdk/src/deploy/verify/ContractVerifier.ts | 2 +- .../sdk/src/gas/adapters/serialization.ts | 1 - typescript/sdk/src/gas/types.ts | 2 +- .../src/hook/EvmHookModule.hardhat-test.ts | 1 - typescript/sdk/src/hook/EvmHookModule.ts | 2 +- typescript/sdk/src/hook/EvmHookReader.test.ts | 1 - typescript/sdk/src/hook/EvmHookReader.ts | 4 +- typescript/sdk/src/hook/schemas.ts | 96 --- typescript/sdk/src/hook/types.ts | 97 ++- typescript/sdk/src/index.ts | 7 +- .../sdk/src/ism/EvmIsmModule.hardhat-test.ts | 1 - typescript/sdk/src/ism/EvmIsmModule.ts | 2 +- typescript/sdk/src/ism/EvmIsmReader.ts | 8 +- typescript/sdk/src/ism/HyperlaneIsmFactory.ts | 2 +- .../sdk/src/ism/metadata/aggregation.ts | 7 +- .../ism/metadata/arbL2ToL1.hardhat-test.ts | 10 +- typescript/sdk/src/ism/metadata/arbL2ToL1.ts | 2 +- .../src/ism/metadata/builder.hardhat-test.ts | 6 +- typescript/sdk/src/ism/metadata/builder.ts | 86 +- typescript/sdk/src/ism/metadata/decode.ts | 41 + typescript/sdk/src/ism/metadata/multisig.ts | 2 +- typescript/sdk/src/ism/metadata/null.ts | 2 +- typescript/sdk/src/ism/metadata/routing.ts | 9 +- typescript/sdk/src/ism/metadata/types.ts | 32 + typescript/sdk/src/ism/schemas.ts | 103 --- .../ism/{schemas.test.ts => types.test.ts} | 3 +- typescript/sdk/src/ism/types.ts | 110 ++- typescript/sdk/src/ism/utils.ts | 2 +- .../src/middleware/liquidity-layer/.eslintrc | 5 - .../liquidity-layer/LiquidityLayerApp.ts | 27 +- .../providers/SmartProvider/SmartProvider.ts | 4 +- .../submitter/builder/TxSubmitterBuilder.ts | 3 +- typescript/sdk/src/router/schemas.ts | 43 - typescript/sdk/src/router/types.ts | 49 +- .../sdk/src/token/EvmERC20WarpRouteReader.ts | 2 +- .../adapters/CosmWasmTokenAdapter.test.ts | 2 - typescript/sdk/src/token/checker.ts | 2 +- typescript/sdk/src/token/deploy.ts | 1 - typescript/sdk/src/token/schemas.ts | 2 +- typescript/sdk/src/utils/.eslintrc | 5 - typescript/sdk/src/utils/gnosisSafe.js | 2 +- typescript/sdk/src/utils/logUtils.ts | 2 +- .../sdk/src/utils/sealevelSerialization.ts | 1 - typescript/utils/eslint.config.mjs | 3 + typescript/utils/package.json | 8 + typescript/utils/src/addresses.ts | 12 +- typescript/utils/src/amount.ts | 2 +- typescript/utils/src/base64.ts | 4 +- typescript/utils/src/big-numbers.ts | 4 +- typescript/utils/src/env.ts | 2 +- typescript/utils/src/index.ts | 2 + typescript/utils/src/strings.ts | 4 + typescript/utils/src/url.ts | 4 +- typescript/widgets/.eslintignore | 6 - typescript/widgets/.eslintrc | 20 - typescript/widgets/eslint.config.mjs | 40 + typescript/widgets/mg.eslint.config.mjs | 38 + typescript/widgets/package.json | 13 +- .../widgets/src/chains/ChainAddMenu.tsx | 2 +- .../widgets/src/chains/ChainDetailsMenu.tsx | 2 +- .../widgets/src/chains/ChainSearchMenu.tsx | 10 +- typescript/widgets/src/components/Button.tsx | 2 +- .../widgets/src/components/IconButton.tsx | 2 +- .../widgets/src/components/LinkButton.tsx | 2 +- .../widgets/src/components/SearchMenu.tsx | 5 +- .../widgets/src/components/TextInput.tsx | 4 +- .../widgets/src/layout/DropdownMenu.tsx | 2 +- typescript/widgets/src/layout/Modal.tsx | 2 +- typescript/widgets/src/layout/Popover.tsx | 2 +- .../src/walletIntegrations/AccountList.tsx | 2 +- .../ConnectWalletButton.tsx | 2 +- yarn.lock | 802 +++++++++++------- 122 files changed, 1341 insertions(+), 1039 deletions(-) create mode 100644 .changeset/spotty-pumpkins-buy.md create mode 100644 .changeset/yellow-baboons-kneel.md delete mode 100644 .eslintignore delete mode 100644 .eslintrc create mode 100644 eslint.config.mjs delete mode 100644 typescript/ccip-server/.eslintrc create mode 100644 typescript/ccip-server/eslint.config.mjs create mode 100644 typescript/ccip-server/tsconfig.json delete mode 100644 typescript/cli/.eslintignore delete mode 100644 typescript/cli/.eslintrc create mode 100644 typescript/cli/eslint.config.mjs create mode 100644 typescript/cli/src/utils/warp.ts delete mode 100644 typescript/helloworld/.eslintignore delete mode 100644 typescript/helloworld/.eslintrc create mode 100644 typescript/helloworld/eslint.config.mjs delete mode 100644 typescript/sdk/.eslintrc create mode 100644 typescript/sdk/eslint.config.mjs delete mode 100644 typescript/sdk/src/consts/.eslintrc delete mode 100644 typescript/sdk/src/deploy/verify/.eslintrc delete mode 100644 typescript/sdk/src/hook/schemas.ts create mode 100644 typescript/sdk/src/ism/metadata/decode.ts create mode 100644 typescript/sdk/src/ism/metadata/types.ts delete mode 100644 typescript/sdk/src/ism/schemas.ts rename typescript/sdk/src/ism/{schemas.test.ts => types.test.ts} (85%) delete mode 100644 typescript/sdk/src/middleware/liquidity-layer/.eslintrc delete mode 100644 typescript/sdk/src/router/schemas.ts delete mode 100644 typescript/sdk/src/utils/.eslintrc create mode 100644 typescript/utils/eslint.config.mjs delete mode 100644 typescript/widgets/.eslintignore delete mode 100644 typescript/widgets/.eslintrc create mode 100644 typescript/widgets/eslint.config.mjs create mode 100644 typescript/widgets/mg.eslint.config.mjs diff --git a/.changeset/spotty-pumpkins-buy.md b/.changeset/spotty-pumpkins-buy.md new file mode 100644 index 000000000..2d8f0fcb3 --- /dev/null +++ b/.changeset/spotty-pumpkins-buy.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/utils': minor +--- + +Add toUpperCamelCase and deepFind functionss diff --git a/.changeset/yellow-baboons-kneel.md b/.changeset/yellow-baboons-kneel.md new file mode 100644 index 000000000..7a7ab6457 --- /dev/null +++ b/.changeset/yellow-baboons-kneel.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': minor +--- + +Add decodeIsmMetadata function diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 4d284e827..000000000 --- a/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules -dist -coverage -*.cts \ No newline at end of file diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index a23e3c2f9..000000000 --- a/.eslintrc +++ /dev/null @@ -1,65 +0,0 @@ -{ - "env": { - "node": true, - "browser": true, - "es2021": true - }, - "root": true, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 12, - "sourceType": "module", - "project": "./tsconfig.json" - }, - "plugins": ["@typescript-eslint","jest"], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - "rules": { - "no-console": ["error"], - "no-eval": ["error"], - "no-extra-boolean-cast": ["error"], - "no-ex-assign": ["error"], - "no-constant-condition": ["off"], - "no-return-await": ["error"], - "no-restricted-imports": ["error", { - "name": "console", - "message": "Please use a logger and/or the utils' package assert" - }, { - "name": "fs", - "message": "Avoid use of node-specific libraries" - }], - "guard-for-in": ["error"], - "@typescript-eslint/ban-ts-comment": ["off"], - "@typescript-eslint/explicit-module-boundary-types": ["off"], - "@typescript-eslint/no-explicit-any": ["off"], - "@typescript-eslint/no-floating-promises": ["error"], - "@typescript-eslint/no-non-null-assertion": ["off"], - "@typescript-eslint/no-require-imports": ["warn"], - "@typescript-eslint/no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_", - "varsIgnorePattern": "^_", - "caughtErrorsIgnorePattern": "^_" - } - ], - "@typescript-eslint/ban-types": [ - "error", - { - "types": { - // Unban the {} type which is a useful shorthand for non-nullish value - "{}": false - }, - "extendDefaults": true - } - ], - "jest/no-disabled-tests": "warn", - "jest/no-focused-tests": "error", - "jest/no-identical-title": "error", - "jest/prefer-to-have-length": "warn", - "jest/valid-expect": "error" - } -} \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 52410ecd6..f46b984ec 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -72,6 +72,12 @@ jobs: .yarn key: ${{ runner.os }}-yarn-4.5.1-cache-${{ hashFiles('./yarn.lock') }} fail-on-cache-miss: true + + # Build required before linting or the intra-monorepo package cycle checking won't work + - name: yarn-build + uses: ./.github/actions/yarn-build-with-cache + with: + ref: ${{ github.event.pull_request.head.sha || github.sha }} - name: lint run: yarn lint diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 000000000..3be951d45 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,115 @@ +import { FlatCompat } from '@eslint/eslintrc'; +import js from '@eslint/js'; +import typescriptEslint from '@typescript-eslint/eslint-plugin'; +import tsParser from '@typescript-eslint/parser'; +import importPlugin from 'eslint-plugin-import'; +import jest from 'eslint-plugin-jest'; +import globals from 'globals'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +export const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all, +}); + +export default [ + { + ignores: [ + '**/node_modules', + '**/dist', + '**/coverage', + '**/*.cjs', + '**/*.cts', + '**/*.mjs', + 'jest.config.js', + ], + }, + ...compat.extends( + 'eslint:recommended', + 'plugin:import/recommended', + 'plugin:import/typescript', + 'plugin:@typescript-eslint/recommended', + 'prettier', + ), + { + plugins: { + import: importPlugin, + '@typescript-eslint': typescriptEslint, + jest, + }, + + languageOptions: { + globals: { + ...globals.node, + ...globals.browser, + }, + + parser: tsParser, + ecmaVersion: 12, + sourceType: 'module', + + parserOptions: { + project: './tsconfig.json', + }, + }, + + settings: { + 'import/resolver': { + typescript: true, + node: true, + }, + }, + + rules: { + 'guard-for-in': ['error'], + 'import/no-cycle': ['error'], + 'import/no-self-import': ['error'], + 'import/no-named-as-default-member': ['off'], + 'no-console': ['error'], + 'no-eval': ['error'], + 'no-extra-boolean-cast': ['error'], + 'no-ex-assign': ['error'], + 'no-constant-condition': ['off'], + 'no-return-await': ['error'], + + 'no-restricted-imports': [ + 'error', + { + name: 'console', + message: 'Please use a logger and/or the utils package assert', + }, + { + name: 'fs', + message: 'Avoid use of node-specific libraries', + }, + ], + + '@typescript-eslint/ban-ts-comment': ['off'], + '@typescript-eslint/explicit-module-boundary-types': ['off'], + '@typescript-eslint/no-explicit-any': ['off'], + '@typescript-eslint/no-floating-promises': ['error'], + '@typescript-eslint/no-non-null-assertion': ['off'], + '@typescript-eslint/no-require-imports': ['warn'], + '@typescript-eslint/no-unused-expressions': ['off'], + '@typescript-eslint/no-empty-object-type': ['off'], + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }, + ], + + 'jest/no-disabled-tests': 'warn', + 'jest/no-focused-tests': 'error', + 'jest/no-identical-title': 'error', + 'jest/prefer-to-have-length': 'warn', + 'jest/valid-expect': 'error', + }, + }, +]; diff --git a/package.json b/package.json index 2a2400e96..ca00bcd3c 100644 --- a/package.json +++ b/package.json @@ -3,11 +3,14 @@ "description": "A yarn workspace of core Hyperlane packages", "version": "0.0.0", "devDependencies": { + "@eslint/js": "^9.15.0", "@trivago/prettier-plugin-sort-imports": "^4.2.1", - "@typescript-eslint/eslint-plugin": "^7.4.0", - "@typescript-eslint/parser": "^7.4.0", - "eslint": "^8.57.0", + "@typescript-eslint/eslint-plugin": "^8.1.6", + "@typescript-eslint/parser": "^8.1.6", + "eslint": "^9.15.0", "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^28.2.0", "husky": "^8.0.0", "lint-staged": "^12.4.3", @@ -41,6 +44,7 @@ "async": "^2.6.4", "fetch-ponyfill": "^7.1", "flat": "^5.0.2", + "globals": "^14.0.0", "lodash": "^4.17.21", "recursive-readdir": "^2.2.3", "underscore": "^1.13", diff --git a/typescript/ccip-server/.eslintrc b/typescript/ccip-server/.eslintrc deleted file mode 100644 index 05936cd4e..000000000 --- a/typescript/ccip-server/.eslintrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "rules": { - "no-console": ["off"] - } - } - \ No newline at end of file diff --git a/typescript/ccip-server/eslint.config.mjs b/typescript/ccip-server/eslint.config.mjs new file mode 100644 index 000000000..17cd27a74 --- /dev/null +++ b/typescript/ccip-server/eslint.config.mjs @@ -0,0 +1,17 @@ +import MonorepoDefaults from '../../eslint.config.mjs'; + +export default [ + ...MonorepoDefaults, + { + files: ['./src/**/*.ts'], + }, + { + rules: { + 'no-console': ['off'], + 'no-restricted-imports': ['off'], + }, + }, + { + ignores: ['**/__mocks__/*','**/tests/*',] + } +]; diff --git a/typescript/ccip-server/package.json b/typescript/ccip-server/package.json index 908936516..7920161da 100644 --- a/typescript/ccip-server/package.json +++ b/typescript/ccip-server/package.json @@ -12,9 +12,11 @@ "node": ">=16" }, "scripts": { + "build": "tsc -p tsconfig.json", "start": "tsx src/server.ts", "dev": "nodemon src/server.ts", "test": "jest", + "lint": "eslint -c ./eslint.config.mjs", "prettier": "prettier --write ./src/* ./tests/" }, "author": "brolee", @@ -22,6 +24,7 @@ "devDependencies": { "@jest/globals": "^29.7.0", "@types/node": "^16.9.1", + "eslint": "^9.15.0", "jest": "^29.7.0", "nodemon": "^3.0.3", "prettier": "^2.8.8", diff --git a/typescript/ccip-server/src/server.ts b/typescript/ccip-server/src/server.ts index 0f69c499f..4151b9864 100644 --- a/typescript/ccip-server/src/server.ts +++ b/typescript/ccip-server/src/server.ts @@ -6,12 +6,14 @@ import { ProofsService } from './services/ProofsService'; // Initialize 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, + { + lightClientAddress: config.LIGHT_CLIENT_ADDR, + stepFunctionId: config.STEP_FN_ID, + platformUrl: config.SUCCINCT_PLATFORM_URL, + apiKey: config.SUCCINCT_API_KEY, + }, + { url: config.RPC_ADDRESS, chainId: config.CHAIN_ID }, + { url: `${config.SERVER_URL_PREFIX}:${config.SERVER_PORT}` }, ); // Initialize Server and add Service handlers diff --git a/typescript/ccip-server/src/services/LightClientService.ts b/typescript/ccip-server/src/services/LightClientService.ts index f3aae5b09..451122966 100644 --- a/typescript/ccip-server/src/services/LightClientService.ts +++ b/typescript/ccip-server/src/services/LightClientService.ts @@ -27,8 +27,8 @@ class LightClientService { * @param slot * @returns */ - async getSyncCommitteePoseidons(slot: bigint): Promise { - return await this.lightClientContract.syncCommitteePoseidons( + getSyncCommitteePoseidons(slot: bigint): Promise { + return this.lightClientContract.syncCommitteePoseidons( this.getSyncCommitteePeriod(slot), ); } diff --git a/typescript/ccip-server/src/services/ProofsService.ts b/typescript/ccip-server/src/services/ProofsService.ts index 1d05e7a3f..5db40c564 100644 --- a/typescript/ccip-server/src/services/ProofsService.ts +++ b/typescript/ccip-server/src/services/ProofsService.ts @@ -4,8 +4,7 @@ import { TelepathyCcipReadIsmAbi } from '../abis/TelepathyCcipReadIsmAbi'; import { HyperlaneService } from './HyperlaneService'; import { LightClientService, SuccinctConfig } from './LightClientService'; -import { RPCService } from './RPCService'; -import { ProofResult } from './RPCService'; +import { ProofResult, RPCService } from './RPCService'; import { ProofStatus } from './common/ProofStatusEnum'; type RPCConfig = { @@ -100,10 +99,7 @@ class ProofsService { ); const slot = await this.lightClientService.calculateSlot(BigInt(timestamp)); const syncCommitteePoseidon = ''; // TODO get from LC - return await this.lightClientService.requestProof( - syncCommitteePoseidon, - slot, - ); + return this.lightClientService.requestProof(syncCommitteePoseidon, slot); } /** diff --git a/typescript/ccip-server/tsconfig.json b/typescript/ccip-server/tsconfig.json new file mode 100644 index 000000000..793d16b8e --- /dev/null +++ b/typescript/ccip-server/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "./dist/", + "rootDir": "./src" + }, + "exclude": ["./node_modules/", "./dist/"], + "include": ["./src/*.ts"] +} diff --git a/typescript/cli/.eslintignore b/typescript/cli/.eslintignore deleted file mode 100644 index 76add878f..000000000 --- a/typescript/cli/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -dist \ No newline at end of file diff --git a/typescript/cli/.eslintrc b/typescript/cli/.eslintrc deleted file mode 100644 index 4d2a6fe74..000000000 --- a/typescript/cli/.eslintrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "rules": { - "no-console": ["off"], - "no-restricted-imports": ["off"] - } -} diff --git a/typescript/cli/eslint.config.mjs b/typescript/cli/eslint.config.mjs new file mode 100644 index 000000000..30f5895c6 --- /dev/null +++ b/typescript/cli/eslint.config.mjs @@ -0,0 +1,20 @@ +import MonorepoDefaults from '../../eslint.config.mjs'; + +export default [ + ...MonorepoDefaults, + { + files: ['./src/**/*.ts', './cli.ts', './env.ts'], + }, + { + rules: { + 'no-console': ['off'], + 'no-restricted-imports': ['off'], + }, + }, + { + ignores: ['./src/tests/**/*.ts'], + rules: { + 'import/no-cycle': ['off'], + }, + }, +]; diff --git a/typescript/cli/package.json b/typescript/cli/package.json index aead4269a..882642198 100644 --- a/typescript/cli/package.json +++ b/typescript/cli/package.json @@ -26,18 +26,21 @@ "zx": "^8.1.4" }, "devDependencies": { + "@eslint/js": "^9.15.0", "@ethersproject/abi": "*", "@ethersproject/providers": "*", "@types/chai-as-promised": "^8", "@types/mocha": "^10.0.1", "@types/node": "^18.14.5", "@types/yargs": "^17.0.24", - "@typescript-eslint/eslint-plugin": "^7.4.0", - "@typescript-eslint/parser": "^7.4.0", + "@typescript-eslint/eslint-plugin": "^8.1.6", + "@typescript-eslint/parser": "^8.1.6", "chai": "^4.5.0", "chai-as-promised": "^8.0.0", - "eslint": "^8.57.0", + "eslint": "^9.15.0", "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-import": "^2.31.0", "mocha": "^10.2.0", "prettier": "^2.8.8", "typescript": "5.3.3" @@ -47,7 +50,7 @@ "build": "yarn version:update && tsc", "dev": "yarn version:update && tsc --watch", "clean": "rm -rf ./dist", - "lint": "eslint . --ext .ts", + "lint": "eslint -c ./eslint.config.mjs", "prettier": "prettier --write ./src ./examples", "test:ci": "yarn mocha --config .mocharc.json", "test:e2e": "./scripts/run-e2e-test.sh", diff --git a/typescript/cli/src/avs/check.ts b/typescript/cli/src/avs/check.ts index 6730463e6..27055c684 100644 --- a/typescript/cli/src/avs/check.ts +++ b/typescript/cli/src/avs/check.ts @@ -429,7 +429,7 @@ const getEcdsaStakeRegistryAddress = ( ): Address | undefined => { try { return avsAddresses[chain]['ecdsaStakeRegistry']; - } catch (err) { + } catch { topLevelErrors.push( `❗️ EcdsaStakeRegistry address not found for ${chain}`, ); diff --git a/typescript/cli/src/check/warp.ts b/typescript/cli/src/check/warp.ts index a31fac62e..f0d147a46 100644 --- a/typescript/cli/src/check/warp.ts +++ b/typescript/cli/src/check/warp.ts @@ -4,7 +4,6 @@ import { WarpRouteDeployConfig, normalizeConfig } from '@hyperlane-xyz/sdk'; import { ObjectDiff, diffObjMerge } from '@hyperlane-xyz/utils'; import { log, logGreen } from '../logger.js'; -import '../utils/output.js'; import { formatYamlViolationsOutput } from '../utils/output.js'; export async function runWarpRouteCheck({ diff --git a/typescript/cli/src/commands/relayer.ts b/typescript/cli/src/commands/relayer.ts index 0d7672e73..c07a4d412 100644 --- a/typescript/cli/src/commands/relayer.ts +++ b/typescript/cli/src/commands/relayer.ts @@ -9,7 +9,7 @@ import { Address } from '@hyperlane-xyz/utils'; import { CommandModuleWithContext } from '../context/types.js'; import { log } from '../logger.js'; import { tryReadJson, writeJson } from '../utils/files.js'; -import { getWarpCoreConfigOrExit } from '../utils/input.js'; +import { getWarpCoreConfigOrExit } from '../utils/warp.js'; import { agentTargetsCommandOption, diff --git a/typescript/cli/src/commands/warp.ts b/typescript/cli/src/commands/warp.ts index c2f4916b0..3cd99fe6a 100644 --- a/typescript/cli/src/commands/warp.ts +++ b/typescript/cli/src/commands/warp.ts @@ -23,8 +23,8 @@ import { removeEndingSlash, writeYamlOrJson, } from '../utils/files.js'; -import { getWarpCoreConfigOrExit } from '../utils/input.js'; import { selectRegistryWarpRoute } from '../utils/tokens.js'; +import { getWarpCoreConfigOrExit } from '../utils/warp.js'; import { runVerifyWarpRoute } from '../verify/warp.js'; import { diff --git a/typescript/cli/src/config/agent.ts b/typescript/cli/src/config/agent.ts index 05fa16559..a176a6f04 100644 --- a/typescript/cli/src/config/agent.ts +++ b/typescript/cli/src/config/agent.ts @@ -99,7 +99,7 @@ async function getStartBlocks( try { const deployedBlock = await mailbox.deployedBlock(); return deployedBlock.toNumber(); - } catch (err) { + } catch { errorRed( `❌ Failed to get deployed block to set an index for ${chain}, this is potentially an issue with rpc provider or a misconfiguration`, ); diff --git a/typescript/cli/src/config/submit.ts b/typescript/cli/src/config/submit.ts index 3b7e3c59e..6ce067a8a 100644 --- a/typescript/cli/src/config/submit.ts +++ b/typescript/cli/src/config/submit.ts @@ -3,9 +3,8 @@ import { stringify as yamlStringify } from 'yaml'; import { AnnotatedEV5Transaction, SubmissionStrategy, - getChainIdFromTxs, } from '@hyperlane-xyz/sdk'; -import { assert, errorToString } from '@hyperlane-xyz/utils'; +import { ProtocolType, assert, errorToString } from '@hyperlane-xyz/utils'; import { WriteCommandContext } from '../context/types.js'; import { logGray, logRed } from '../logger.js'; @@ -27,17 +26,15 @@ export async function runSubmit({ receiptsFilepath: string; submissionStrategy: SubmissionStrategy; }) { - const { chainMetadata, multiProvider } = context; + const { multiProvider } = context; assert( submissionStrategy, 'Submission strategy required to submit transactions.\nPlease create a submission strategy. See examples in cli/examples/submit/strategy/*.', ); const transactions = getTransactions(transactionsFilepath); - const chainId = getChainIdFromTxs(transactions); - const protocol = chainMetadata[chainId].protocol; - const submitterBuilder = await getSubmitterBuilder({ + const submitterBuilder = await getSubmitterBuilder({ submissionStrategy, multiProvider, }); diff --git a/typescript/cli/src/deploy/core.ts b/typescript/cli/src/deploy/core.ts index 28ff4d50e..9bbd7bcbd 100644 --- a/typescript/cli/src/deploy/core.ts +++ b/typescript/cli/src/deploy/core.ts @@ -1,12 +1,12 @@ import { stringify as yamlStringify } from 'yaml'; import { buildArtifact as coreBuildArtifact } from '@hyperlane-xyz/core/buildArtifact.js'; -import { DeployedCoreAddresses } from '@hyperlane-xyz/sdk'; import { ChainMap, ChainName, ContractVerifier, CoreConfig, + DeployedCoreAddresses, EvmCoreModule, ExplorerLicenseType, } from '@hyperlane-xyz/sdk'; diff --git a/typescript/cli/src/deploy/dry-run.ts b/typescript/cli/src/deploy/dry-run.ts index f821dc179..fa0c30972 100644 --- a/typescript/cli/src/deploy/dry-run.ts +++ b/typescript/cli/src/deploy/dry-run.ts @@ -5,12 +5,11 @@ import { resetFork, setFork, } from '@hyperlane-xyz/sdk'; +import { toUpperCamelCase } from '@hyperlane-xyz/utils'; import { logGray, logGreen, warnYellow } from '../logger.js'; import { ENV } from '../utils/env.js'; -import { toUpperCamelCase } from './utils.js'; - /** * Forks a provided network onto MultiProvider * @param multiProvider the MultiProvider to be prepared diff --git a/typescript/cli/src/deploy/utils.ts b/typescript/cli/src/deploy/utils.ts index d8ced32dc..125e7b1e7 100644 --- a/typescript/cli/src/deploy/utils.ts +++ b/typescript/cli/src/deploy/utils.ts @@ -169,10 +169,6 @@ export async function completeDeploy( if (isDryRun) await completeDryRun(command); } -export function toUpperCamelCase(string: string) { - return string.charAt(0).toUpperCase() + string.slice(1); -} - function transformChainMetadataForDisplay(chainMetadata: ChainMetadata) { return { Name: chainMetadata.name, diff --git a/typescript/cli/src/deploy/warp.ts b/typescript/cli/src/deploy/warp.ts index 161d296f8..639d5d5c8 100644 --- a/typescript/cli/src/deploy/warp.ts +++ b/typescript/cli/src/deploy/warp.ts @@ -955,7 +955,7 @@ async function getWarpApplySubmitter({ context: WriteCommandContext; strategyUrl?: string; }): Promise> { - const { chainMetadata, multiProvider } = context; + const { multiProvider } = context; const submissionStrategy: SubmissionStrategy = strategyUrl ? readChainSubmissionStrategy(strategyUrl)[chain] @@ -966,8 +966,7 @@ async function getWarpApplySubmitter({ }, }; - const protocol = chainMetadata[chain].protocol; - return getSubmitterBuilder({ + return getSubmitterBuilder({ submissionStrategy, multiProvider, }); diff --git a/typescript/cli/src/read/warp.ts b/typescript/cli/src/read/warp.ts index 9139d890c..bd5d01e95 100644 --- a/typescript/cli/src/read/warp.ts +++ b/typescript/cli/src/read/warp.ts @@ -15,7 +15,7 @@ import { isAddressEvm, objMap, promiseObjAll } from '@hyperlane-xyz/utils'; import { CommandContext } from '../context/types.js'; import { logGray, logRed, logTable } from '../logger.js'; -import { getWarpCoreConfigOrExit } from '../utils/input.js'; +import { getWarpCoreConfigOrExit } from '../utils/warp.js'; export async function runWarpRouteRead({ context, diff --git a/typescript/cli/src/status/message.ts b/typescript/cli/src/status/message.ts index 2c1e9af96..df3ff1d98 100644 --- a/typescript/cli/src/status/message.ts +++ b/typescript/cli/src/status/message.ts @@ -52,7 +52,7 @@ export async function checkMessageStatus({ } else { try { dispatchedReceipt = await core.getDispatchTx(origin, messageId); - } catch (e) { + } catch { logRed(`Failed to infer dispatch transaction for message ${messageId}`); dispatchTx = await input({ diff --git a/typescript/cli/src/utils/env.ts b/typescript/cli/src/utils/env.ts index 51ab1ce35..a0a5b232f 100644 --- a/typescript/cli/src/utils/env.ts +++ b/typescript/cli/src/utils/env.ts @@ -1,4 +1,4 @@ -import z from 'zod'; +import { z } from 'zod'; const envScheme = z.object({ HYP_KEY: z.string().optional(), diff --git a/typescript/cli/src/utils/files.ts b/typescript/cli/src/utils/files.ts index 9c7cb6216..50f56d1b7 100644 --- a/typescript/cli/src/utils/files.ts +++ b/typescript/cli/src/utils/files.ts @@ -42,7 +42,7 @@ export function isFile(filepath: string) { if (!filepath) return false; try { return fs.existsSync(filepath) && fs.lstatSync(filepath).isFile(); - } catch (error) { + } catch { log(`Error checking for file: ${filepath}`); return false; } @@ -70,7 +70,7 @@ export function readJson(filepath: string): T { export function tryReadJson(filepath: string): T | null { try { return readJson(filepath) as T; - } catch (error) { + } catch { return null; } } @@ -98,7 +98,7 @@ export function readYaml(filepath: string): T { export function tryReadYamlAtPath(filepath: string): T | null { try { return readYaml(filepath); - } catch (error) { + } catch { return null; } } diff --git a/typescript/cli/src/utils/input.ts b/typescript/cli/src/utils/input.ts index 2ccef32db..1466fe692 100644 --- a/typescript/cli/src/utils/input.ts +++ b/typescript/cli/src/utils/input.ts @@ -19,19 +19,13 @@ import ansiEscapes from 'ansi-escapes'; import chalk from 'chalk'; import { ProxyAdmin__factory } from '@hyperlane-xyz/core'; -import { - ChainName, - DeployedOwnableConfig, - WarpCoreConfig, -} from '@hyperlane-xyz/sdk'; +import { ChainName, DeployedOwnableConfig } from '@hyperlane-xyz/sdk'; import { Address, isAddress, rootLogger } from '@hyperlane-xyz/utils'; -import { readWarpCoreConfig } from '../config/warp.js'; import { CommandContext } from '../context/types.js'; -import { logGray, logRed } from '../logger.js'; +import { logGray } from '../logger.js'; import { indentYamlOrJson } from './files.js'; -import { selectRegistryWarpRoute } from './tokens.js'; export async function detectAndConfirmOrPrompt( detect: () => Promise, @@ -52,8 +46,9 @@ export async function detectAndConfirmOrPrompt( return detectedValue; } } - // eslint-disable-next-line no-empty - } catch (e) {} + } catch { + // Fallback to input prompt + } return input({ message: `${prompt} ${label}:`, default: detectedValue }); } @@ -136,34 +131,6 @@ export async function setProxyAdminConfig( } } -/** - * Gets a {@link WarpCoreConfig} based on the provided path or prompts the user to choose one: - * - if `symbol` is provided the user will have to select one of the available warp routes. - * - if `warp` is provided the config will be read by the provided file path. - * - if none is provided the CLI will exit. - */ -export async function getWarpCoreConfigOrExit({ - context, - symbol, - warp, -}: { - context: CommandContext; - symbol?: string; - warp?: string; -}): Promise { - let warpCoreConfig: WarpCoreConfig; - if (symbol) { - warpCoreConfig = await selectRegistryWarpRoute(context.registry, symbol); - } else if (warp) { - warpCoreConfig = readWarpCoreConfig(warp); - } else { - logRed(`Please specify either a symbol or warp config`); - process.exit(0); - } - - return warpCoreConfig; -} - /** * Searchable checkbox code * diff --git a/typescript/cli/src/utils/warp.ts b/typescript/cli/src/utils/warp.ts new file mode 100644 index 000000000..08888628e --- /dev/null +++ b/typescript/cli/src/utils/warp.ts @@ -0,0 +1,35 @@ +import { WarpCoreConfig } from '@hyperlane-xyz/sdk'; + +import { readWarpCoreConfig } from '../config/warp.js'; +import { CommandContext } from '../context/types.js'; +import { logRed } from '../logger.js'; + +import { selectRegistryWarpRoute } from './tokens.js'; + +/** + * Gets a {@link WarpCoreConfig} based on the provided path or prompts the user to choose one: + * - if `symbol` is provided the user will have to select one of the available warp routes. + * - if `warp` is provided the config will be read by the provided file path. + * - if none is provided the CLI will exit. + */ +export async function getWarpCoreConfigOrExit({ + context, + symbol, + warp, +}: { + context: CommandContext; + symbol?: string; + warp?: string; +}): Promise { + let warpCoreConfig: WarpCoreConfig; + if (symbol) { + warpCoreConfig = await selectRegistryWarpRoute(context.registry, symbol); + } else if (warp) { + warpCoreConfig = readWarpCoreConfig(warp); + } else { + logRed(`Please specify either a symbol or warp config`); + process.exit(0); + } + + return warpCoreConfig; +} diff --git a/typescript/cli/src/validator/preFlightCheck.ts b/typescript/cli/src/validator/preFlightCheck.ts index ca0c4d850..ba674b48b 100644 --- a/typescript/cli/src/validator/preFlightCheck.ts +++ b/typescript/cli/src/validator/preFlightCheck.ts @@ -44,7 +44,7 @@ export const checkValidatorSetup = async ( try { validatorStorageLocations = await validatorAnnounce.getAnnouncedStorageLocations(validatorsArray); - } catch (e) { + } catch { errorSet.add('Failed to read announced storage locations on chain.'); } @@ -64,7 +64,7 @@ export const checkValidatorSetup = async ( let s3Validator: S3Validator; try { s3Validator = await S3Validator.fromStorageLocation(s3StorageLocation); - } catch (e) { + } catch { errorRed( `❌ Failed to fetch storage locations for validator ${validator}, this may be due to the storage location not being an S3 bucket\n\n`, ); diff --git a/typescript/helloworld/.eslintignore b/typescript/helloworld/.eslintignore deleted file mode 100644 index d461f0fa8..000000000 --- a/typescript/helloworld/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -dist -coverage -src/types -hardhat.config.ts \ No newline at end of file diff --git a/typescript/helloworld/.eslintrc b/typescript/helloworld/.eslintrc deleted file mode 100644 index 446616f52..000000000 --- a/typescript/helloworld/.eslintrc +++ /dev/null @@ -1,39 +0,0 @@ -{ - "env": { - "node": true, - "browser": true, - "es2021": true - }, - "root": true, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 12, - "sourceType": "module", - "project": "./tsconfig.json" - }, - "plugins": ["@typescript-eslint"], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - "rules": { - "no-eval": ["error"], - "no-ex-assign": ["error"], - "no-constant-condition": ["off"], - "@typescript-eslint/ban-ts-comment": ["off"], - "@typescript-eslint/explicit-module-boundary-types": ["off"], - "@typescript-eslint/no-explicit-any": ["off"], - "@typescript-eslint/no-floating-promises": ["error"], - "@typescript-eslint/no-non-null-assertion": ["off"], - "@typescript-eslint/no-require-imports": ["warn"], - "@typescript-eslint/no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_", - "varsIgnorePattern": "^_", - "caughtErrorsIgnorePattern": "^_" - } - ] - } -} diff --git a/typescript/helloworld/eslint.config.mjs b/typescript/helloworld/eslint.config.mjs new file mode 100644 index 000000000..f88d20815 --- /dev/null +++ b/typescript/helloworld/eslint.config.mjs @@ -0,0 +1,17 @@ +import MonorepoDefaults from '../../eslint.config.mjs'; + +export default [ + ...MonorepoDefaults, + { + files: ['./src/**/*.ts'], + }, + { + ignores: ["**/src/types/*"], + }, + { + ignores: ['./src/scripts'], + rules: { + 'no-console': ['off'], + }, + }, +]; \ No newline at end of file diff --git a/typescript/helloworld/package.json b/typescript/helloworld/package.json index 3191ce213..8d8005181 100644 --- a/typescript/helloworld/package.json +++ b/typescript/helloworld/package.json @@ -10,17 +10,20 @@ "ethers": "^5.7.2" }, "devDependencies": { + "@eslint/js": "^9.15.0", "@nomiclabs/hardhat-ethers": "^2.2.3", "@nomiclabs/hardhat-waffle": "^2.0.6", "@trivago/prettier-plugin-sort-imports": "^4.2.1", "@typechain/ethers-v5": "^11.1.2", "@typechain/ethers-v6": "^0.5.1", "@typechain/hardhat": "^9.1.0", - "@typescript-eslint/eslint-plugin": "^7.4.0", - "@typescript-eslint/parser": "^7.4.0", + "@typescript-eslint/eslint-plugin": "^8.1.6", + "@typescript-eslint/parser": "^8.1.6", "chai": "4.5.0", - "eslint": "^8.57.0", + "eslint": "^9.15.0", "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-import": "^2.31.0", "ethereum-waffle": "^4.0.10", "hardhat": "^2.22.2", "hardhat-gas-reporter": "^1.0.9", @@ -56,7 +59,9 @@ "build": "yarn hardhat-esm compile && tsc", "clean": "yarn hardhat-esm clean && rm -rf dist cache src/types", "coverage": "yarn hardhat-esm coverage", - "lint": "solhint contracts/**/*.sol && eslint . --ext .ts", + "lint": "yarn lint:sol && yarn lint:ts", + "lint:sol": "solhint contracts/**/*.sol", + "lint:ts": "eslint -c ./eslint.config.mjs", "hardhat-esm": "NODE_OPTIONS='--experimental-loader ts-node/esm/transpile-only --no-warnings=ExperimentalWarning' hardhat --config hardhat.config.cts", "prettier": "prettier --write ./contracts ./src", "test": "yarn hardhat-esm test ./src/test/**/*.test.ts", diff --git a/typescript/sdk/.eslintrc b/typescript/sdk/.eslintrc deleted file mode 100644 index a0a684267..000000000 --- a/typescript/sdk/.eslintrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "rules": { - "@typescript-eslint/explicit-module-boundary-types": ["warn", { - "allowArgumentsExplicitlyTypedAsAny": true - }] - } -} diff --git a/typescript/sdk/eslint.config.mjs b/typescript/sdk/eslint.config.mjs new file mode 100644 index 000000000..285548879 --- /dev/null +++ b/typescript/sdk/eslint.config.mjs @@ -0,0 +1,25 @@ +import MonorepoDefaults from '../../eslint.config.mjs'; + +export default [ + ...MonorepoDefaults, + { + files: ['./src/**/*.ts'], + rules: { + '@typescript-eslint/explicit-module-boundary-types': [ + 'warn', + { + allowArgumentsExplicitlyTypedAsAny: true, + }, + ], + }, + }, + { + ignores: ['./src/ism/metadata/**/*.ts'], + rules: { + 'import/no-cycle': ['off'], + }, + }, + { + ignores: ['src/**/*.js'], + }, +]; diff --git a/typescript/sdk/package.json b/typescript/sdk/package.json index 9f4fd0615..33aff0eb4 100644 --- a/typescript/sdk/package.json +++ b/typescript/sdk/package.json @@ -24,6 +24,7 @@ "zod": "^3.21.2" }, "devDependencies": { + "@eslint/js": "^9.15.0", "@nomiclabs/hardhat-ethers": "^2.2.3", "@nomiclabs/hardhat-waffle": "^2.0.6", "@types/mocha": "^10.0.1", @@ -31,9 +32,14 @@ "@types/sinon": "^17.0.1", "@types/sinon-chai": "^3.2.12", "@types/ws": "^8.5.5", + "@typescript-eslint/eslint-plugin": "^8.1.6", + "@typescript-eslint/parser": "^8.1.6", "chai": "4.5.0", "dotenv": "^10.0.0", - "eslint": "^8.57.0", + "eslint": "^9.15.0", + "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-import": "^2.31.0", "ethereum-waffle": "^4.0.10", "hardhat": "^2.22.2", "mocha": "^10.2.0", @@ -70,7 +76,7 @@ "dev": "tsc --watch", "check": "tsc --noEmit", "clean": "rm -rf ./dist ./cache", - "lint": "eslint src --ext .ts", + "lint": "eslint -c ./eslint.config.mjs", "prepublishOnly": "yarn build", "prettier": "prettier --write ./src", "test": "yarn test:unit && yarn test:hardhat && yarn test:foundry", diff --git a/typescript/sdk/src/consts/.eslintrc b/typescript/sdk/src/consts/.eslintrc deleted file mode 100644 index 7242f1241..000000000 --- a/typescript/sdk/src/consts/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "rules": { - "sort-keys": ["error"] - } -} diff --git a/typescript/sdk/src/consts/multisigIsmVerifyCosts.ts b/typescript/sdk/src/consts/multisigIsmVerifyCosts.ts index 2891527b2..16be1a195 100644 --- a/typescript/sdk/src/consts/multisigIsmVerifyCosts.ts +++ b/typescript/sdk/src/consts/multisigIsmVerifyCosts.ts @@ -1,4 +1,3 @@ -/* eslint-disable sort-keys */ export const multisigIsmVerifyCosts = { '1': { '1': 151966, diff --git a/typescript/sdk/src/core/CoreDeployer.hardhat-test.ts b/typescript/sdk/src/core/CoreDeployer.hardhat-test.ts index 525ca4acd..665133ed0 100644 --- a/typescript/sdk/src/core/CoreDeployer.hardhat-test.ts +++ b/typescript/sdk/src/core/CoreDeployer.hardhat-test.ts @@ -195,7 +195,7 @@ describe('core', async () => { try { await deployer.deploy(coreConfig); // eslint-disable-next-line no-empty - } catch (e: any) {} + } catch {} }); afterEach(async () => { @@ -252,7 +252,7 @@ describe('core', async () => { deployer.chainTimeoutMs = 1; try { await deployer.deploy(coreConfig); - } catch (e: any) { + } catch { // TODO: figure out how to test specific error case // expect(e.message).to.include('Timed out in 1ms'); } diff --git a/typescript/sdk/src/core/EvmCoreModule.ts b/typescript/sdk/src/core/EvmCoreModule.ts index a14cdc5fe..0d783aa34 100644 --- a/typescript/sdk/src/core/EvmCoreModule.ts +++ b/typescript/sdk/src/core/EvmCoreModule.ts @@ -21,8 +21,6 @@ import { HyperlaneAddresses, HyperlaneContractsMap, } from '../contracts/types.js'; -import { DeployedCoreAddresses } from '../core/schemas.js'; -import { CoreConfig } from '../core/types.js'; import { HyperlaneProxyFactoryDeployer } from '../deploy/HyperlaneProxyFactoryDeployer.js'; import { ProxyFactoryFactories, @@ -47,7 +45,8 @@ import { EvmCoreReader } from './EvmCoreReader.js'; import { EvmIcaModule } from './EvmIcaModule.js'; import { HyperlaneCoreDeployer } from './HyperlaneCoreDeployer.js'; import { CoreFactories } from './contracts.js'; -import { CoreConfigSchema } from './schemas.js'; +import { CoreConfigSchema, DeployedCoreAddresses } from './schemas.js'; +import { CoreConfig } from './types.js'; export class EvmCoreModule extends HyperlaneModule< ProtocolType.Ethereum, diff --git a/typescript/sdk/src/core/HyperlaneRelayer.ts b/typescript/sdk/src/core/HyperlaneRelayer.ts index 0a1a451eb..48ddfd323 100644 --- a/typescript/sdk/src/core/HyperlaneRelayer.ts +++ b/typescript/sdk/src/core/HyperlaneRelayer.ts @@ -17,10 +17,10 @@ import { } from '@hyperlane-xyz/utils'; import { DerivedHookConfig, EvmHookReader } from '../hook/EvmHookReader.js'; -import { HookConfigSchema } from '../hook/schemas.js'; +import { HookConfigSchema } from '../hook/types.js'; import { DerivedIsmConfig, EvmIsmReader } from '../ism/EvmIsmReader.js'; import { BaseMetadataBuilder } from '../ism/metadata/builder.js'; -import { IsmConfigSchema } from '../ism/schemas.js'; +import { IsmConfigSchema } from '../ism/types.js'; import { MultiProvider } from '../providers/MultiProvider.js'; import { ChainName } from '../types.js'; @@ -307,7 +307,7 @@ export class HyperlaneRelayer { // TODO: handle batching await this.relayMessage(dispatchReceipt, undefined, dispatchMsg); - } catch (error) { + } catch { this.logger.error( `Failed to relay message ${id} (attempt #${attempts + 1})`, ); @@ -320,7 +320,7 @@ export class HyperlaneRelayer { } } - protected whitelistChains() { + protected whitelistChains(): string[] | undefined { return this.whitelist ? Object.keys(this.whitelist) : undefined; } diff --git a/typescript/sdk/src/core/schemas.ts b/typescript/sdk/src/core/schemas.ts index 470df95ab..9959c3024 100644 --- a/typescript/sdk/src/core/schemas.ts +++ b/typescript/sdk/src/core/schemas.ts @@ -1,8 +1,8 @@ import { z } from 'zod'; import { ProxyFactoryFactoriesSchema } from '../deploy/schemas.js'; -import { HookConfigSchema } from '../hook/schemas.js'; -import { IsmConfigSchema } from '../ism/schemas.js'; +import { HookConfigSchema } from '../hook/types.js'; +import { IsmConfigSchema } from '../ism/types.js'; import { DeployedOwnableSchema, OwnableSchema } from '../schemas.js'; export const CoreConfigSchema = OwnableSchema.extend({ diff --git a/typescript/sdk/src/deploy/HyperlaneDeployer.ts b/typescript/sdk/src/deploy/HyperlaneDeployer.ts index c6cd2048c..4deee15ac 100644 --- a/typescript/sdk/src/deploy/HyperlaneDeployer.ts +++ b/typescript/sdk/src/deploy/HyperlaneDeployer.ts @@ -29,7 +29,7 @@ import { HyperlaneFactories, } from '../contracts/types.js'; import { HookConfig } from '../hook/types.js'; -import { HyperlaneIsmFactory } from '../ism/HyperlaneIsmFactory.js'; +import type { HyperlaneIsmFactory } from '../ism/HyperlaneIsmFactory.js'; import { IsmConfig } from '../ism/types.js'; import { moduleMatchesConfig } from '../ism/utils.js'; import { InterchainAccount } from '../middleware/account/InterchainAccount.js'; diff --git a/typescript/sdk/src/deploy/verify/.eslintrc b/typescript/sdk/src/deploy/verify/.eslintrc deleted file mode 100644 index e3f712414..000000000 --- a/typescript/sdk/src/deploy/verify/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "rules": { - "no-console": ["off"] - } -} diff --git a/typescript/sdk/src/deploy/verify/ContractVerifier.ts b/typescript/sdk/src/deploy/verify/ContractVerifier.ts index 992d2de3b..49ecd3098 100644 --- a/typescript/sdk/src/deploy/verify/ContractVerifier.ts +++ b/typescript/sdk/src/deploy/verify/ContractVerifier.ts @@ -183,7 +183,7 @@ export class ContractVerifier { 'Parsing response from explorer...', ); responseJson = JSON.parse(responseTextString); - } catch (error) { + } catch { verificationLogger.trace( { failure: response.statusText, diff --git a/typescript/sdk/src/gas/adapters/serialization.ts b/typescript/sdk/src/gas/adapters/serialization.ts index 70cd80825..e7d34a479 100644 --- a/typescript/sdk/src/gas/adapters/serialization.ts +++ b/typescript/sdk/src/gas/adapters/serialization.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { PublicKey } from '@solana/web3.js'; import { Domain } from '@hyperlane-xyz/utils'; diff --git a/typescript/sdk/src/gas/types.ts b/typescript/sdk/src/gas/types.ts index 55114478d..6cb46630e 100644 --- a/typescript/sdk/src/gas/types.ts +++ b/typescript/sdk/src/gas/types.ts @@ -5,7 +5,7 @@ import { InterchainGasPaymaster } from '@hyperlane-xyz/core'; import type { Address } from '@hyperlane-xyz/utils'; import type { CheckerViolation } from '../deploy/types.js'; -import { IgpSchema } from '../hook/schemas.js'; +import { IgpSchema } from '../hook/types.js'; import { ChainMap } from '../types.js'; export type IgpConfig = z.infer; diff --git a/typescript/sdk/src/hook/EvmHookModule.hardhat-test.ts b/typescript/sdk/src/hook/EvmHookModule.hardhat-test.ts index aa4c9d559..ae66d7adb 100644 --- a/typescript/sdk/src/hook/EvmHookModule.hardhat-test.ts +++ b/typescript/sdk/src/hook/EvmHookModule.hardhat-test.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-console */ import { expect } from 'chai'; import { Signer } from 'ethers'; import hre from 'hardhat'; diff --git a/typescript/sdk/src/hook/EvmHookModule.ts b/typescript/sdk/src/hook/EvmHookModule.ts index 5f6a64e34..a1e82177a 100644 --- a/typescript/sdk/src/hook/EvmHookModule.ts +++ b/typescript/sdk/src/hook/EvmHookModule.ts @@ -56,13 +56,13 @@ import { normalizeConfig } from '../utils/ism.js'; import { EvmHookReader } from './EvmHookReader.js'; import { DeployedHook, HookFactories, hookFactories } from './contracts.js'; -import { HookConfigSchema } from './schemas.js'; import { AggregationHookConfig, ArbL2ToL1HookConfig, DomainRoutingHookConfig, FallbackRoutingHookConfig, HookConfig, + HookConfigSchema, HookType, IgpHookConfig, MUTABLE_HOOK_TYPE, diff --git a/typescript/sdk/src/hook/EvmHookReader.test.ts b/typescript/sdk/src/hook/EvmHookReader.test.ts index befd73a43..3a8bb4576 100644 --- a/typescript/sdk/src/hook/EvmHookReader.test.ts +++ b/typescript/sdk/src/hook/EvmHookReader.test.ts @@ -148,7 +148,6 @@ describe('EvmHookReader', () => { expect(config).to.deep.equal(hookConfig); }); - // eslint-disable-next-line @typescript-eslint/no-empty-function it('should derive op stack config correctly', async () => { const mockAddress = randomAddress(); const mockOwner = randomAddress(); diff --git a/typescript/sdk/src/hook/EvmHookReader.ts b/typescript/sdk/src/hook/EvmHookReader.ts index 9ebcd8ae0..dae0f9d58 100644 --- a/typescript/sdk/src/hook/EvmHookReader.ts +++ b/typescript/sdk/src/hook/EvmHookReader.ts @@ -269,7 +269,7 @@ export class EvmHookReader extends HyperlaneReader implements HookReader { this.provider, ); return oracle.owner(); - } catch (error) { + } catch { this.logger.debug( 'Domain not configured on IGP Hook', domainId, @@ -451,7 +451,7 @@ export class EvmHookReader extends HyperlaneReader implements HookReader { if (domainHook !== ethers.constants.AddressZero) { domainHooks[chainName] = await this.deriveHookConfig(domainHook); } - } catch (error) { + } catch { this.logger.debug( `Domain not configured on ${hook.constructor.name}`, domainId, diff --git a/typescript/sdk/src/hook/schemas.ts b/typescript/sdk/src/hook/schemas.ts deleted file mode 100644 index 16bd01b27..000000000 --- a/typescript/sdk/src/hook/schemas.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { z } from 'zod'; - -import { StorageGasOracleConfigSchema } from '../gas/oracle/types.js'; -import { ZHash } from '../metadata/customZodTypes.js'; -import { OwnableSchema, PausableSchema } from '../schemas.js'; - -import { - AggregationHookConfig, - DomainRoutingHookConfig, - FallbackRoutingHookConfig, - HookType, -} from './types.js'; - -export const ProtocolFeeSchema = OwnableSchema.extend({ - type: z.literal(HookType.PROTOCOL_FEE), - beneficiary: z.string(), - maxProtocolFee: z.string(), - protocolFee: z.string(), -}); - -export const MerkleTreeSchema = z.object({ - type: z.literal(HookType.MERKLE_TREE), -}); - -export const PausableHookSchema = PausableSchema.extend({ - type: z.literal(HookType.PAUSABLE), -}); - -export const OpStackHookSchema = OwnableSchema.extend({ - type: z.literal(HookType.OP_STACK), - nativeBridge: z.string(), - destinationChain: z.string(), -}); - -export const ArbL2ToL1HookSchema = z.object({ - type: z.literal(HookType.ARB_L2_TO_L1), - arbSys: z - .string() - .describe( - 'precompile for sending messages to L1, interface here: https://github.com/OffchainLabs/nitro-contracts/blob/90037b996509312ef1addb3f9352457b8a99d6a6/src/precompiles/ArbSys.sol#L12', - ), - bridge: z - .string() - .optional() - .describe( - 'address of the bridge contract on L1, optional only needed for non @arbitrum/sdk chains', - ), - destinationChain: z.string(), - childHook: z.lazy((): z.ZodSchema => HookConfigSchema), -}); - -export const IgpSchema = OwnableSchema.extend({ - type: z.literal(HookType.INTERCHAIN_GAS_PAYMASTER), - beneficiary: z.string(), - oracleKey: z.string(), - overhead: z.record(z.number()), - oracleConfig: z.record(StorageGasOracleConfigSchema), -}); - -export const DomainRoutingHookConfigSchema: z.ZodSchema = - z.lazy(() => - OwnableSchema.extend({ - type: z.literal(HookType.ROUTING), - domains: z.record(HookConfigSchema), - }), - ); - -export const FallbackRoutingHookConfigSchema: z.ZodSchema = - z.lazy(() => - OwnableSchema.extend({ - type: z.literal(HookType.FALLBACK_ROUTING), - domains: z.record(HookConfigSchema), - fallback: HookConfigSchema, - }), - ); - -export const AggregationHookConfigSchema: z.ZodSchema = - z.lazy(() => - z.object({ - type: z.literal(HookType.AGGREGATION), - hooks: z.array(HookConfigSchema), - }), - ); - -export const HookConfigSchema = z.union([ - ZHash, - ProtocolFeeSchema, - PausableHookSchema, - OpStackHookSchema, - MerkleTreeSchema, - IgpSchema, - DomainRoutingHookConfigSchema, - FallbackRoutingHookConfigSchema, - AggregationHookConfigSchema, - ArbL2ToL1HookSchema, -]); diff --git a/typescript/sdk/src/hook/types.ts b/typescript/sdk/src/hook/types.ts index 01d5b0df7..3cfd824b7 100644 --- a/typescript/sdk/src/hook/types.ts +++ b/typescript/sdk/src/hook/types.ts @@ -1,18 +1,11 @@ import { z } from 'zod'; import { OwnableConfig } from '../deploy/types.js'; +import { StorageGasOracleConfigSchema } from '../gas/oracle/types.js'; +import { ZHash } from '../metadata/customZodTypes.js'; +import { OwnableSchema, PausableSchema } from '../schemas.js'; import { ChainMap } from '../types.js'; -import { - ArbL2ToL1HookSchema, - HookConfigSchema, - IgpSchema, - MerkleTreeSchema, - OpStackHookSchema, - PausableHookSchema, - ProtocolFeeSchema, -} from './schemas.js'; - // As found in IPostDispatchHook.sol export enum OnchainHookType { UNUSED, @@ -75,3 +68,87 @@ export const MUTABLE_HOOK_TYPE = [ HookType.FALLBACK_ROUTING, HookType.PAUSABLE, ]; + +export const ProtocolFeeSchema = OwnableSchema.extend({ + type: z.literal(HookType.PROTOCOL_FEE), + beneficiary: z.string(), + maxProtocolFee: z.string(), + protocolFee: z.string(), +}); + +export const MerkleTreeSchema = z.object({ + type: z.literal(HookType.MERKLE_TREE), +}); + +export const PausableHookSchema = PausableSchema.extend({ + type: z.literal(HookType.PAUSABLE), +}); + +export const OpStackHookSchema = OwnableSchema.extend({ + type: z.literal(HookType.OP_STACK), + nativeBridge: z.string(), + destinationChain: z.string(), +}); + +export const ArbL2ToL1HookSchema = z.object({ + type: z.literal(HookType.ARB_L2_TO_L1), + arbSys: z + .string() + .describe( + 'precompile for sending messages to L1, interface here: https://github.com/OffchainLabs/nitro-contracts/blob/90037b996509312ef1addb3f9352457b8a99d6a6/src/precompiles/ArbSys.sol#L12', + ), + bridge: z + .string() + .optional() + .describe( + 'address of the bridge contract on L1, optional only needed for non @arbitrum/sdk chains', + ), + destinationChain: z.string(), + childHook: z.lazy((): z.ZodSchema => HookConfigSchema), +}); + +export const IgpSchema = OwnableSchema.extend({ + type: z.literal(HookType.INTERCHAIN_GAS_PAYMASTER), + beneficiary: z.string(), + oracleKey: z.string(), + overhead: z.record(z.number()), + oracleConfig: z.record(StorageGasOracleConfigSchema), +}); + +export const DomainRoutingHookConfigSchema: z.ZodSchema = + z.lazy(() => + OwnableSchema.extend({ + type: z.literal(HookType.ROUTING), + domains: z.record(HookConfigSchema), + }), + ); + +export const FallbackRoutingHookConfigSchema: z.ZodSchema = + z.lazy(() => + OwnableSchema.extend({ + type: z.literal(HookType.FALLBACK_ROUTING), + domains: z.record(HookConfigSchema), + fallback: HookConfigSchema, + }), + ); + +export const AggregationHookConfigSchema: z.ZodSchema = + z.lazy(() => + z.object({ + type: z.literal(HookType.AGGREGATION), + hooks: z.array(HookConfigSchema), + }), + ); + +export const HookConfigSchema = z.union([ + ZHash, + ProtocolFeeSchema, + PausableHookSchema, + OpStackHookSchema, + MerkleTreeSchema, + IgpSchema, + DomainRoutingHookConfigSchema, + FallbackRoutingHookConfigSchema, + AggregationHookConfigSchema, + ArbL2ToL1HookSchema, +]); diff --git a/typescript/sdk/src/index.ts b/typescript/sdk/src/index.ts index cdb86b504..61495f53c 100644 --- a/typescript/sdk/src/index.ts +++ b/typescript/sdk/src/index.ts @@ -135,12 +135,12 @@ export { } from './gas/types.js'; export { EvmHookReader } from './hook/EvmHookReader.js'; export { HyperlaneHookDeployer } from './hook/HyperlaneHookDeployer.js'; -export { HookConfigSchema } from './hook/schemas.js'; export { AggregationHookConfig, DomainRoutingHookConfig, FallbackRoutingHookConfig, HookConfig, + HookConfigSchema, HookType, IgpHookConfig, MerkleTreeHookConfig, @@ -150,6 +150,7 @@ export { } from './hook/types.js'; export { DerivedIsmConfig, EvmIsmReader } from './ism/EvmIsmReader.js'; export { HyperlaneIsmFactory } from './ism/HyperlaneIsmFactory.js'; +export { decodeIsmMetadata } from './ism/metadata/decode.js'; export { buildAggregationIsmConfigs, buildMultisigIsmConfigs, @@ -522,8 +523,8 @@ export { AggregationIsmConfigSchema, IsmConfigSchema, MultisigIsmConfigSchema, -} from './ism/schemas.js'; -export { MailboxClientConfigSchema as mailboxClientConfigSchema } from './router/schemas.js'; +} from './ism/types.js'; +export { MailboxClientConfigSchema as mailboxClientConfigSchema } from './router/types.js'; export { CollateralConfig, NativeConfig, diff --git a/typescript/sdk/src/ism/EvmIsmModule.hardhat-test.ts b/typescript/sdk/src/ism/EvmIsmModule.hardhat-test.ts index 00c31fc71..4f815138c 100644 --- a/typescript/sdk/src/ism/EvmIsmModule.hardhat-test.ts +++ b/typescript/sdk/src/ism/EvmIsmModule.hardhat-test.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-console */ import assert from 'assert'; import { expect } from 'chai'; import { Signer } from 'ethers'; diff --git a/typescript/sdk/src/ism/EvmIsmModule.ts b/typescript/sdk/src/ism/EvmIsmModule.ts index 2f4e1ee1d..6cb059354 100644 --- a/typescript/sdk/src/ism/EvmIsmModule.ts +++ b/typescript/sdk/src/ism/EvmIsmModule.ts @@ -28,10 +28,10 @@ import { normalizeConfig } from '../utils/ism.js'; import { EvmIsmReader } from './EvmIsmReader.js'; import { HyperlaneIsmFactory } from './HyperlaneIsmFactory.js'; -import { IsmConfigSchema } from './schemas.js'; import { DeployedIsm, IsmConfig, + IsmConfigSchema, IsmType, MUTABLE_ISM_TYPE, RoutingIsmConfig, diff --git a/typescript/sdk/src/ism/EvmIsmReader.ts b/typescript/sdk/src/ism/EvmIsmReader.ts index 06493cb45..6257e7a6e 100644 --- a/typescript/sdk/src/ism/EvmIsmReader.ts +++ b/typescript/sdk/src/ism/EvmIsmReader.ts @@ -158,7 +158,7 @@ export class EvmIsmReader extends HyperlaneReader implements IsmReader { let ismType = IsmType.FALLBACK_ROUTING; try { await ism.mailbox(); - } catch (error) { + } catch { ismType = IsmType.ROUTING; this.logger.debug( 'Error accessing mailbox property, implying this is not a fallback routing ISM.', @@ -248,7 +248,7 @@ export class EvmIsmReader extends HyperlaneReader implements IsmReader { relayer, type: IsmType.TRUSTED_RELAYER, }; - } catch (error) { + } catch { this.logger.debug( 'Error accessing "trustedRelayer" property, implying this is not a Trusted Relayer ISM.', address, @@ -266,7 +266,7 @@ export class EvmIsmReader extends HyperlaneReader implements IsmReader { type: IsmType.PAUSABLE, paused, }; - } catch (error) { + } catch { this.logger.debug( 'Error accessing "paused" property, implying this is not a Pausable ISM.', address, @@ -283,7 +283,7 @@ export class EvmIsmReader extends HyperlaneReader implements IsmReader { origin: address, nativeBridge: '', // no way to extract native bridge from the ism }; - } catch (error) { + } catch { this.logger.debug( 'Error accessing "VERIFIED_MASK_INDEX" property, implying this is not an OP Stack ISM.', address, diff --git a/typescript/sdk/src/ism/HyperlaneIsmFactory.ts b/typescript/sdk/src/ism/HyperlaneIsmFactory.ts index 2835e4a35..246f3d27f 100644 --- a/typescript/sdk/src/ism/HyperlaneIsmFactory.ts +++ b/typescript/sdk/src/ism/HyperlaneIsmFactory.ts @@ -466,7 +466,7 @@ export class HyperlaneIsmFactory extends HyperlaneApp { .map((log) => { try { return domainRoutingIsmFactory.interface.parseLog(log); - } catch (e) { + } catch { return undefined; } }) diff --git a/typescript/sdk/src/ism/metadata/aggregation.ts b/typescript/sdk/src/ism/metadata/aggregation.ts index 5c347a600..0f35e7e2c 100644 --- a/typescript/sdk/src/ism/metadata/aggregation.ts +++ b/typescript/sdk/src/ism/metadata/aggregation.ts @@ -10,12 +10,13 @@ import { import { DerivedIsmConfig } from '../EvmIsmReader.js'; import { AggregationIsmConfig, IsmType } from '../types.js'; +import type { BaseMetadataBuilder } from './builder.js'; +import { decodeIsmMetadata } from './decode.js'; import { - BaseMetadataBuilder, MetadataBuilder, MetadataContext, StructuredMetadata, -} from './builder.js'; +} from './types.js'; // null indicates that metadata is NOT INCLUDED for this submodule // empty or 0x string indicates that metadata is INCLUDED but NULL @@ -137,7 +138,7 @@ export class AggregationMetadataBuilder implements MetadataBuilder { const range = this.metadataRange(metadata, index); if (range.start == 0) return null; if (typeof ism === 'string') return range.encoded; - return BaseMetadataBuilder.decode(range.encoded, { + return decodeIsmMetadata(range.encoded, { ...context, ism: ism as DerivedIsmConfig, }); diff --git a/typescript/sdk/src/ism/metadata/arbL2ToL1.hardhat-test.ts b/typescript/sdk/src/ism/metadata/arbL2ToL1.hardhat-test.ts index f2b66d9cb..e186da5c9 100644 --- a/typescript/sdk/src/ism/metadata/arbL2ToL1.hardhat-test.ts +++ b/typescript/sdk/src/ism/metadata/arbL2ToL1.hardhat-test.ts @@ -16,8 +16,12 @@ import { MockArbSys__factory, TestRecipient, } from '@hyperlane-xyz/core'; -import { Address, WithAddress, objMap } from '@hyperlane-xyz/utils'; -import { bytes32ToAddress } from '@hyperlane-xyz/utils'; +import { + Address, + WithAddress, + bytes32ToAddress, + objMap, +} from '@hyperlane-xyz/utils'; import { testChains } from '../../consts/testChains.js'; import { @@ -38,7 +42,7 @@ import { HyperlaneIsmFactory } from '../HyperlaneIsmFactory.js'; import { ArbL2ToL1IsmConfig } from '../types.js'; import { ArbL2ToL1MetadataBuilder } from './arbL2ToL1.js'; -import { MetadataContext } from './builder.js'; +import { MetadataContext } from './types.js'; describe('ArbL2ToL1MetadataBuilder', () => { const origin: ChainName = 'test4'; diff --git a/typescript/sdk/src/ism/metadata/arbL2ToL1.ts b/typescript/sdk/src/ism/metadata/arbL2ToL1.ts index 9b12010eb..5279f1daf 100644 --- a/typescript/sdk/src/ism/metadata/arbL2ToL1.ts +++ b/typescript/sdk/src/ism/metadata/arbL2ToL1.ts @@ -20,7 +20,7 @@ import { ArbL2ToL1HookConfig } from '../../hook/types.js'; import { findMatchingLogEvents } from '../../utils/logUtils.js'; import { ArbL2ToL1IsmConfig, IsmType } from '../types.js'; -import { MetadataBuilder, MetadataContext } from './builder.js'; +import type { MetadataBuilder, MetadataContext } from './types.js'; export type NitroChildToParentTransactionEvent = EventArgs; export type ArbL2ToL1Metadata = Omit< diff --git a/typescript/sdk/src/ism/metadata/builder.hardhat-test.ts b/typescript/sdk/src/ism/metadata/builder.hardhat-test.ts index fbda40a5b..53fc89d3d 100644 --- a/typescript/sdk/src/ism/metadata/builder.hardhat-test.ts +++ b/typescript/sdk/src/ism/metadata/builder.hardhat-test.ts @@ -39,7 +39,9 @@ import { EvmIsmReader } from '../EvmIsmReader.js'; import { randomIsmConfig } from '../HyperlaneIsmFactory.hardhat-test.js'; import { HyperlaneIsmFactory } from '../HyperlaneIsmFactory.js'; -import { BaseMetadataBuilder, MetadataContext } from './builder.js'; +import { BaseMetadataBuilder } from './builder.js'; +import { decodeIsmMetadata } from './decode.js'; +import { MetadataContext } from './types.js'; const MAX_ISM_DEPTH = 5; const MAX_NUM_VALIDATORS = 10; @@ -198,7 +200,7 @@ describe('BaseMetadataBuilder', () => { }); it(`should decode metadata for random ism config (${i})`, async () => { - BaseMetadataBuilder.decode(metadata, context); + decodeIsmMetadata(metadata, context); }); } }); diff --git a/typescript/sdk/src/ism/metadata/builder.ts b/typescript/sdk/src/ism/metadata/builder.ts index e290f390f..c316c20db 100644 --- a/typescript/sdk/src/ism/metadata/builder.ts +++ b/typescript/sdk/src/ism/metadata/builder.ts @@ -1,53 +1,30 @@ -/* eslint-disable no-case-declarations */ -import { TransactionReceipt } from '@ethersproject/providers'; - -import { WithAddress, assert, rootLogger } from '@hyperlane-xyz/utils'; +import { + WithAddress, + assert, + deepFind, + rootLogger, +} from '@hyperlane-xyz/utils'; -import { deepFind } from '../../../../utils/dist/objects.js'; import { HyperlaneCore } from '../../core/HyperlaneCore.js'; -import { DispatchedMessage } from '../../core/types.js'; -import { DerivedHookConfig } from '../../hook/EvmHookReader.js'; import { ArbL2ToL1HookConfig, HookType, MerkleTreeHookConfig, } from '../../hook/types.js'; import { MultiProvider } from '../../providers/MultiProvider.js'; -import { DerivedIsmConfig } from '../EvmIsmReader.js'; import { IsmType } from '../types.js'; -import { - AggregationMetadata, - AggregationMetadataBuilder, -} from './aggregation.js'; -import { ArbL2ToL1Metadata, ArbL2ToL1MetadataBuilder } from './arbL2ToL1.js'; -import { MultisigMetadata, MultisigMetadataBuilder } from './multisig.js'; -import { NullMetadata, NullMetadataBuilder } from './null.js'; -import { - DefaultFallbackRoutingMetadataBuilder, - RoutingMetadata, -} from './routing.js'; - -export type StructuredMetadata = - | NullMetadata - | MultisigMetadata - | ArbL2ToL1Metadata - | AggregationMetadata - | RoutingMetadata; - -export interface MetadataContext< - IsmContext = DerivedIsmConfig, - HookContext = DerivedHookConfig, -> { - message: DispatchedMessage; - dispatchTx: TransactionReceipt; - ism: IsmContext; - hook: HookContext; -} - -export interface MetadataBuilder { - build(context: MetadataContext): Promise; -} +import { AggregationMetadataBuilder } from './aggregation.js'; +import { ArbL2ToL1MetadataBuilder } from './arbL2ToL1.js'; +import { decodeIsmMetadata } from './decode.js'; +import { MultisigMetadataBuilder } from './multisig.js'; +import { NullMetadataBuilder } from './null.js'; +import { DefaultFallbackRoutingMetadataBuilder } from './routing.js'; +import type { + MetadataBuilder, + MetadataContext, + StructuredMetadata, +} from './types.js'; export class BaseMetadataBuilder implements MetadataBuilder { public nullMetadataBuilder: NullMetadataBuilder; @@ -91,6 +68,7 @@ export class BaseMetadataBuilder implements MetadataBuilder { if (typeof hook === 'string') { throw new Error('Hook context must be an object (for multisig ISM)'); } + // eslint-disable-next-line no-case-declarations const merkleTreeHook = deepFind( hook, (v): v is WithAddress => @@ -137,32 +115,6 @@ export class BaseMetadataBuilder implements MetadataBuilder { metadata: string, context: MetadataContext, ): StructuredMetadata { - const { ism } = context; - switch (ism.type) { - case IsmType.TRUSTED_RELAYER: - return NullMetadataBuilder.decode(ism); - - case IsmType.MERKLE_ROOT_MULTISIG: - case IsmType.MESSAGE_ID_MULTISIG: - return MultisigMetadataBuilder.decode(metadata, ism.type); - - case IsmType.AGGREGATION: - return AggregationMetadataBuilder.decode(metadata, { ...context, ism }); - - case IsmType.ROUTING: - return DefaultFallbackRoutingMetadataBuilder.decode(metadata, { - ...context, - ism, - }); - - case IsmType.ARB_L2_TO_L1: - return ArbL2ToL1MetadataBuilder.decode(metadata, { - ...context, - ism, - }); - - default: - throw new Error(`Unsupported ISM type: ${ism.type}`); - } + return decodeIsmMetadata(metadata, context); } } diff --git a/typescript/sdk/src/ism/metadata/decode.ts b/typescript/sdk/src/ism/metadata/decode.ts new file mode 100644 index 000000000..cdd4c6194 --- /dev/null +++ b/typescript/sdk/src/ism/metadata/decode.ts @@ -0,0 +1,41 @@ +import { IsmType } from '../types.js'; + +import { AggregationMetadataBuilder } from './aggregation.js'; +import { ArbL2ToL1MetadataBuilder } from './arbL2ToL1.js'; +import { MultisigMetadataBuilder } from './multisig.js'; +import { NullMetadataBuilder } from './null.js'; +import { DefaultFallbackRoutingMetadataBuilder } from './routing.js'; +import { MetadataContext, StructuredMetadata } from './types.js'; + +export function decodeIsmMetadata( + metadata: string, + context: MetadataContext, +): StructuredMetadata { + const { ism } = context; + switch (ism.type) { + case IsmType.TRUSTED_RELAYER: + return NullMetadataBuilder.decode(ism); + + case IsmType.MERKLE_ROOT_MULTISIG: + case IsmType.MESSAGE_ID_MULTISIG: + return MultisigMetadataBuilder.decode(metadata, ism.type); + + case IsmType.AGGREGATION: + return AggregationMetadataBuilder.decode(metadata, { ...context, ism }); + + case IsmType.ROUTING: + return DefaultFallbackRoutingMetadataBuilder.decode(metadata, { + ...context, + ism, + }); + + case IsmType.ARB_L2_TO_L1: + return ArbL2ToL1MetadataBuilder.decode(metadata, { + ...context, + ism, + }); + + default: + throw new Error(`Unsupported ISM type: ${ism.type}`); + } +} diff --git a/typescript/sdk/src/ism/metadata/multisig.ts b/typescript/sdk/src/ism/metadata/multisig.ts index 1de554fa5..74e50e355 100644 --- a/typescript/sdk/src/ism/metadata/multisig.ts +++ b/typescript/sdk/src/ism/metadata/multisig.ts @@ -26,7 +26,7 @@ import { MerkleTreeHookConfig } from '../../hook/types.js'; import { ChainName } from '../../types.js'; import { IsmType, MultisigIsmConfig } from '../types.js'; -import { MetadataBuilder, MetadataContext } from './builder.js'; +import type { MetadataBuilder, MetadataContext } from './types.js'; interface MessageIdMultisigMetadata { type: IsmType.MESSAGE_ID_MULTISIG; diff --git a/typescript/sdk/src/ism/metadata/null.ts b/typescript/sdk/src/ism/metadata/null.ts index ed66277ce..e4be778b7 100644 --- a/typescript/sdk/src/ism/metadata/null.ts +++ b/typescript/sdk/src/ism/metadata/null.ts @@ -3,7 +3,7 @@ import { WithAddress, assert, eqAddress } from '@hyperlane-xyz/utils'; import { MultiProvider } from '../../providers/MultiProvider.js'; import { IsmType, NullIsmConfig } from '../types.js'; -import { MetadataBuilder, MetadataContext } from './builder.js'; +import type { MetadataBuilder, MetadataContext } from './types.js'; export const NULL_METADATA = '0x'; diff --git a/typescript/sdk/src/ism/metadata/routing.ts b/typescript/sdk/src/ism/metadata/routing.ts index 36fd69e60..6a2e2168c 100644 --- a/typescript/sdk/src/ism/metadata/routing.ts +++ b/typescript/sdk/src/ism/metadata/routing.ts @@ -5,12 +5,13 @@ import { ChainName } from '../../types.js'; import { DerivedIsmConfig, EvmIsmReader } from '../EvmIsmReader.js'; import { IsmType, RoutingIsmConfig } from '../types.js'; -import { - BaseMetadataBuilder, +import type { BaseMetadataBuilder } from './builder.js'; +import { decodeIsmMetadata } from './decode.js'; +import type { MetadataBuilder, MetadataContext, StructuredMetadata, -} from './builder.js'; +} from './types.js'; export type RoutingMetadata = { type: IsmType.ROUTING; @@ -45,7 +46,7 @@ export class RoutingMetadataBuilder implements MetadataBuilder { const originMetadata = typeof ism === 'string' ? metadata - : BaseMetadataBuilder.decode(metadata, { + : decodeIsmMetadata(metadata, { ...context, ism: ism as DerivedIsmConfig, }); diff --git a/typescript/sdk/src/ism/metadata/types.ts b/typescript/sdk/src/ism/metadata/types.ts new file mode 100644 index 000000000..104ef5757 --- /dev/null +++ b/typescript/sdk/src/ism/metadata/types.ts @@ -0,0 +1,32 @@ +import type { providers } from 'ethers'; + +import type { DispatchedMessage } from '../../core/types.js'; +import type { DerivedHookConfig } from '../../hook/EvmHookReader.js'; +import type { DerivedIsmConfig } from '../EvmIsmReader.js'; + +import type { AggregationMetadata } from './aggregation.js'; +import type { ArbL2ToL1Metadata } from './arbL2ToL1.js'; +import type { MultisigMetadata } from './multisig.js'; +import type { NullMetadata } from './null.js'; +import type { RoutingMetadata } from './routing.js'; + +export type StructuredMetadata = + | NullMetadata + | MultisigMetadata + | ArbL2ToL1Metadata + | AggregationMetadata + | RoutingMetadata; + +export interface MetadataContext< + IsmContext = DerivedIsmConfig, + HookContext = DerivedHookConfig, +> { + message: DispatchedMessage; + dispatchTx: providers.TransactionReceipt; + ism: IsmContext; + hook: HookContext; +} + +export interface MetadataBuilder { + build(context: MetadataContext): Promise; +} diff --git a/typescript/sdk/src/ism/schemas.ts b/typescript/sdk/src/ism/schemas.ts deleted file mode 100644 index e9d2e1cda..000000000 --- a/typescript/sdk/src/ism/schemas.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { z } from 'zod'; - -import { ZHash } from '../metadata/customZodTypes.js'; -import { OwnableSchema, PausableSchema } from '../schemas.js'; - -import { AggregationIsmConfig, IsmType, RoutingIsmConfig } from './types.js'; - -const ValidatorInfoSchema = z.object({ - signingAddress: ZHash, - weight: z.number(), -}); - -export const TestIsmConfigSchema = z.object({ - type: z.literal(IsmType.TEST_ISM), -}); - -export const MultisigConfigSchema = z.object({ - validators: z.array(ZHash), - threshold: z.number(), -}); - -export const WeightedMultisigConfigSchema = z.object({ - validators: z.array(ValidatorInfoSchema), - thresholdWeight: z.number(), -}); - -export const TrustedRelayerIsmConfigSchema = z.object({ - type: z.literal(IsmType.TRUSTED_RELAYER), - relayer: z.string(), -}); - -export const OpStackIsmConfigSchema = z.object({ - type: z.literal(IsmType.OP_STACK), - origin: z.string(), - nativeBridge: z.string(), -}); - -export const ArbL2ToL1IsmConfigSchema = z.object({ - type: z.literal(IsmType.ARB_L2_TO_L1), - bridge: z.string(), -}); - -export const PausableIsmConfigSchema = PausableSchema.and( - z.object({ - type: z.literal(IsmType.PAUSABLE), - }), -); - -export const MultisigIsmConfigSchema = MultisigConfigSchema.and( - z.object({ - type: z.union([ - z.literal(IsmType.MERKLE_ROOT_MULTISIG), - z.literal(IsmType.MESSAGE_ID_MULTISIG), - z.literal(IsmType.STORAGE_MERKLE_ROOT_MULTISIG), - z.literal(IsmType.STORAGE_MESSAGE_ID_MULTISIG), - ]), - }), -); - -export const WeightedMultisigIsmConfigSchema = WeightedMultisigConfigSchema.and( - z.object({ - type: z.union([ - z.literal(IsmType.WEIGHTED_MERKLE_ROOT_MULTISIG), - z.literal(IsmType.WEIGHTED_MESSAGE_ID_MULTISIG), - ]), - }), -); - -export const RoutingIsmConfigSchema: z.ZodSchema = z.lazy( - () => - OwnableSchema.extend({ - type: z.union([ - z.literal(IsmType.ROUTING), - z.literal(IsmType.FALLBACK_ROUTING), - ]), - domains: z.record(IsmConfigSchema), - }), -); - -export const AggregationIsmConfigSchema: z.ZodSchema = z - .lazy(() => - z.object({ - type: z.literal(IsmType.AGGREGATION), - modules: z.array(IsmConfigSchema), - threshold: z.number(), - }), - ) - .refine((data) => data.threshold <= data.modules.length, { - message: 'Threshold must be less than or equal to the number of modules', - }); - -export const IsmConfigSchema = z.union([ - ZHash, - TestIsmConfigSchema, - OpStackIsmConfigSchema, - PausableIsmConfigSchema, - TrustedRelayerIsmConfigSchema, - MultisigIsmConfigSchema, - WeightedMultisigIsmConfigSchema, - RoutingIsmConfigSchema, - AggregationIsmConfigSchema, - ArbL2ToL1IsmConfigSchema, -]); diff --git a/typescript/sdk/src/ism/schemas.test.ts b/typescript/sdk/src/ism/types.test.ts similarity index 85% rename from typescript/sdk/src/ism/schemas.test.ts rename to typescript/sdk/src/ism/types.test.ts index 7605382c2..9c57ebf04 100644 --- a/typescript/sdk/src/ism/schemas.test.ts +++ b/typescript/sdk/src/ism/types.test.ts @@ -1,8 +1,7 @@ import { expect } from 'chai'; import { ethers } from 'ethers'; -import { AggregationIsmConfigSchema } from './schemas.js'; -import { IsmType } from './types.js'; +import { AggregationIsmConfigSchema, IsmType } from './types.js'; const SOME_ADDRESS = ethers.Wallet.createRandom().address; describe('AggregationIsmConfigSchema refine', () => { diff --git a/typescript/sdk/src/ism/types.ts b/typescript/sdk/src/ism/types.ts index 82e025a04..c215c346d 100644 --- a/typescript/sdk/src/ism/types.ts +++ b/typescript/sdk/src/ism/types.ts @@ -15,19 +15,10 @@ import { import type { Address, Domain, ValueOf } from '@hyperlane-xyz/utils'; import { OwnableConfig } from '../deploy/types.js'; +import { ZHash } from '../metadata/customZodTypes.js'; +import { OwnableSchema, PausableSchema } from '../schemas.js'; import { ChainMap } from '../types.js'; -import { - ArbL2ToL1IsmConfigSchema, - IsmConfigSchema, - MultisigIsmConfigSchema, - OpStackIsmConfigSchema, - PausableIsmConfigSchema, - TestIsmConfigSchema, - TrustedRelayerIsmConfigSchema, - WeightedMultisigIsmConfigSchema, -} from './schemas.js'; - // this enum should match the IInterchainSecurityModule.sol enum // meant for the relayer export enum ModuleType { @@ -167,3 +158,100 @@ export type RoutingIsmDelta = { owner?: Address; // is the owner different mailbox?: Address; // is the mailbox different (only for fallback routing) }; + +const ValidatorInfoSchema = z.object({ + signingAddress: ZHash, + weight: z.number(), +}); + +export const TestIsmConfigSchema = z.object({ + type: z.literal(IsmType.TEST_ISM), +}); + +export const MultisigConfigSchema = z.object({ + validators: z.array(ZHash), + threshold: z.number(), +}); + +export const WeightedMultisigConfigSchema = z.object({ + validators: z.array(ValidatorInfoSchema), + thresholdWeight: z.number(), +}); + +export const TrustedRelayerIsmConfigSchema = z.object({ + type: z.literal(IsmType.TRUSTED_RELAYER), + relayer: z.string(), +}); + +export const OpStackIsmConfigSchema = z.object({ + type: z.literal(IsmType.OP_STACK), + origin: z.string(), + nativeBridge: z.string(), +}); + +export const ArbL2ToL1IsmConfigSchema = z.object({ + type: z.literal(IsmType.ARB_L2_TO_L1), + bridge: z.string(), +}); + +export const PausableIsmConfigSchema = PausableSchema.and( + z.object({ + type: z.literal(IsmType.PAUSABLE), + }), +); + +export const MultisigIsmConfigSchema = MultisigConfigSchema.and( + z.object({ + type: z.union([ + z.literal(IsmType.MERKLE_ROOT_MULTISIG), + z.literal(IsmType.MESSAGE_ID_MULTISIG), + z.literal(IsmType.STORAGE_MERKLE_ROOT_MULTISIG), + z.literal(IsmType.STORAGE_MESSAGE_ID_MULTISIG), + ]), + }), +); + +export const WeightedMultisigIsmConfigSchema = WeightedMultisigConfigSchema.and( + z.object({ + type: z.union([ + z.literal(IsmType.WEIGHTED_MERKLE_ROOT_MULTISIG), + z.literal(IsmType.WEIGHTED_MESSAGE_ID_MULTISIG), + ]), + }), +); + +export const RoutingIsmConfigSchema: z.ZodSchema = z.lazy( + () => + OwnableSchema.extend({ + type: z.union([ + z.literal(IsmType.ROUTING), + z.literal(IsmType.FALLBACK_ROUTING), + ]), + domains: z.record(IsmConfigSchema), + }), +); + +export const AggregationIsmConfigSchema: z.ZodSchema = z + .lazy(() => + z.object({ + type: z.literal(IsmType.AGGREGATION), + modules: z.array(IsmConfigSchema), + threshold: z.number(), + }), + ) + .refine((data) => data.threshold <= data.modules.length, { + message: 'Threshold must be less than or equal to the number of modules', + }); + +export const IsmConfigSchema = z.union([ + ZHash, + TestIsmConfigSchema, + OpStackIsmConfigSchema, + PausableIsmConfigSchema, + TrustedRelayerIsmConfigSchema, + MultisigIsmConfigSchema, + WeightedMultisigIsmConfigSchema, + RoutingIsmConfigSchema, + AggregationIsmConfigSchema, + ArbL2ToL1IsmConfigSchema, +]); diff --git a/typescript/sdk/src/ism/utils.ts b/typescript/sdk/src/ism/utils.ts index 7c28d757a..4ad265798 100644 --- a/typescript/sdk/src/ism/utils.ts +++ b/typescript/sdk/src/ism/utils.ts @@ -270,7 +270,7 @@ export async function moduleMatchesConfig( let mailboxAddress; try { mailboxAddress = await client.mailbox(); - } catch (error) { + } catch { matches = false; break; } diff --git a/typescript/sdk/src/middleware/liquidity-layer/.eslintrc b/typescript/sdk/src/middleware/liquidity-layer/.eslintrc deleted file mode 100644 index e3f712414..000000000 --- a/typescript/sdk/src/middleware/liquidity-layer/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "rules": { - "no-console": ["off"] - } -} diff --git a/typescript/sdk/src/middleware/liquidity-layer/LiquidityLayerApp.ts b/typescript/sdk/src/middleware/liquidity-layer/LiquidityLayerApp.ts index 93e324a24..6e2698934 100644 --- a/typescript/sdk/src/middleware/liquidity-layer/LiquidityLayerApp.ts +++ b/typescript/sdk/src/middleware/liquidity-layer/LiquidityLayerApp.ts @@ -11,6 +11,7 @@ import { addressToBytes32, ensure0x, eqAddress, + rootLogger, strip0x, } from '@hyperlane-xyz/utils'; @@ -23,6 +24,8 @@ import { fetchWithTimeout } from '../../utils/fetch.js'; import { BridgeAdapterConfig } from './LiquidityLayerRouterDeployer.js'; import { liquidityLayerFactories } from './contracts.js'; +const logger = rootLogger.child({ module: 'LiquidityLayerApp' }); + const PORTAL_VAA_SERVICE_TESTNET_BASE_URL = 'https://wormhole-v2-testnet-api.certus.one/v1/signed_vaa/'; const CIRCLE_ATTESTATIONS_TESTNET_BASE_URL = @@ -77,7 +80,7 @@ export class LiquidityLayerApp extends HyperlaneApp< } async fetchCircleMessageTransactions(chain: ChainName): Promise { - console.log(`Fetch circle messages for ${chain}`); + logger.info(`Fetch circle messages for ${chain}`); const url = new URL(this.multiProvider.getExplorerApiUrl(chain)); url.searchParams.set('module', 'logs'); url.searchParams.set('action', 'getLogs'); @@ -140,7 +143,7 @@ export class LiquidityLayerApp extends HyperlaneApp< chain: ChainName, txHash: string, ): Promise { - console.debug(`Parse Circle messages for chain ${chain} ${txHash}`); + logger.debug(`Parse Circle messages for chain ${chain} ${txHash}`); const provider = this.multiProvider.getProvider(chain); const receipt = await provider.getTransactionReceipt(txHash); const matchingLogs = receipt.logs @@ -207,7 +210,7 @@ export class LiquidityLayerApp extends HyperlaneApp< await destinationPortalAdapter.portalTransfersProcessed(transferId); if (!eqAddress(transferTokenAddress, ethers.constants.AddressZero)) { - console.log( + logger.info( `Transfer with nonce ${message.nonce} from ${message.origin} to ${message.destination} already processed`, ); return; @@ -229,11 +232,11 @@ export class LiquidityLayerApp extends HyperlaneApp< ).then((response) => response.json()); if (vaa.code && vaa.code === PORTAL_VAA_SERVICE_SUCCESS_CODE) { - console.log(`VAA not yet found for nonce ${message.nonce}`); + logger.info(`VAA not yet found for nonce ${message.nonce}`); return; } - console.debug( + logger.debug( `Complete portal transfer for nonce ${message.nonce} on ${message.destination}`, ); @@ -246,10 +249,10 @@ export class LiquidityLayerApp extends HyperlaneApp< ); } catch (error: any) { if (error?.error?.reason?.includes('no wrapper for this token')) { - console.log( + logger.info( 'No wrapper for this token, you should register the token at https://wormhole-foundation.github.io/example-token-bridge-ui/#/register', ); - console.log(message); + logger.info(message); return; } throw error; @@ -268,11 +271,11 @@ export class LiquidityLayerApp extends HyperlaneApp< const alreadyProcessed = await transmitter.usedNonces(message.nonceHash); if (alreadyProcessed) { - console.log(`Message sent on ${message.txHash} was already processed`); + logger.info(`Message sent on ${message.txHash} was already processed`); return; } - console.log(`Attempt Circle message delivery`, JSON.stringify(message)); + logger.info(`Attempt Circle message delivery`, JSON.stringify(message)); const messageHash = ethers.utils.keccak256(message.message); const baseurl = this.multiProvider.getChainMetadata(message.chain).isTestnet @@ -282,19 +285,19 @@ export class LiquidityLayerApp extends HyperlaneApp< const attestations = await attestationsB.json(); if (attestations.status !== 'complete') { - console.log( + logger.info( `Attestations not available for message nonce ${message.nonce} on ${message.txHash}`, ); return; } - console.log(`Ready to submit attestations for message ${message.nonce}`); + logger.info(`Ready to submit attestations for message ${message.nonce}`); const tx = await transmitter.receiveMessage( message.message, attestations.attestation, ); - console.log( + logger.info( `Submitted attestations in ${this.multiProvider.tryGetExplorerTxUrl( message.remoteChain, tx, diff --git a/typescript/sdk/src/providers/SmartProvider/SmartProvider.ts b/typescript/sdk/src/providers/SmartProvider/SmartProvider.ts index 58ee3e7ef..d30f9ddd1 100644 --- a/typescript/sdk/src/providers/SmartProvider/SmartProvider.ts +++ b/typescript/sdk/src/providers/SmartProvider/SmartProvider.ts @@ -1,5 +1,5 @@ import { BigNumber, errors as EthersError, providers, utils } from 'ethers'; -import pino, { Logger } from 'pino'; +import { Logger, pino } from 'pino'; import { raceWithContext, @@ -126,7 +126,7 @@ export class HyperlaneSmartProvider async getPriorityFee(): Promise { try { return BigNumber.from(await this.perform('maxPriorityFeePerGas', {})); - } catch (error) { + } catch { return BigNumber.from('1500000000'); } } diff --git a/typescript/sdk/src/providers/transactions/submitter/builder/TxSubmitterBuilder.ts b/typescript/sdk/src/providers/transactions/submitter/builder/TxSubmitterBuilder.ts index 53d1b4452..61616ff3c 100644 --- a/typescript/sdk/src/providers/transactions/submitter/builder/TxSubmitterBuilder.ts +++ b/typescript/sdk/src/providers/transactions/submitter/builder/TxSubmitterBuilder.ts @@ -1,7 +1,6 @@ import { Logger } from 'pino'; -import { Annotated, rootLogger } from '@hyperlane-xyz/utils'; -import { ProtocolType } from '@hyperlane-xyz/utils'; +import { Annotated, ProtocolType, rootLogger } from '@hyperlane-xyz/utils'; import { ProtocolTypedReceipt, diff --git a/typescript/sdk/src/router/schemas.ts b/typescript/sdk/src/router/schemas.ts deleted file mode 100644 index 19913aedb..000000000 --- a/typescript/sdk/src/router/schemas.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { z } from 'zod'; - -import { HookConfigSchema } from '../hook/schemas.js'; -import { IsmConfigSchema } from '../ism/schemas.js'; -import { ZHash } from '../metadata/customZodTypes.js'; -import { DeployedOwnableSchema, OwnableSchema } from '../schemas.js'; - -export const MailboxClientConfigSchema = OwnableSchema.extend({ - mailbox: ZHash, - hook: HookConfigSchema.optional(), - interchainSecurityModule: IsmConfigSchema.optional(), -}); - -export const ForeignDeploymentConfigSchema = z.object({ - foreignDeployment: z.string().optional(), -}); - -const RemoteRouterDomain = z.string(); -const RemoteRouterRouter = z.string().startsWith('0x'); -export const RemoteRoutersSchema = z.record( - RemoteRouterDomain, - RemoteRouterRouter, -); - -export const RouterConfigSchema = MailboxClientConfigSchema.merge( - ForeignDeploymentConfigSchema, -).merge( - z.object({ - remoteRouters: RemoteRoutersSchema.optional(), - proxyAdmin: DeployedOwnableSchema.optional(), - }), -); - -const DestinationGasDomain = z.string(); -const DestinationGasAmount = z.string(); // This must be a string type to match Ether's type -export const DestinationGasSchema = z.record( - DestinationGasDomain, - DestinationGasAmount, -); -export const GasRouterConfigSchema = RouterConfigSchema.extend({ - gas: z.number().optional(), - destinationGas: DestinationGasSchema.optional(), -}); diff --git a/typescript/sdk/src/router/types.ts b/typescript/sdk/src/router/types.ts index 17e36ead6..d950e43a3 100644 --- a/typescript/sdk/src/router/types.ts +++ b/typescript/sdk/src/router/types.ts @@ -11,16 +11,12 @@ import { Address, AddressBytes32 } from '@hyperlane-xyz/utils'; import { HyperlaneFactories } from '../contracts/types.js'; import { UpgradeConfig } from '../deploy/proxy.js'; import { CheckerViolation } from '../deploy/types.js'; +import { HookConfigSchema } from '../hook/types.js'; +import { IsmConfigSchema } from '../ism/types.js'; +import { ZHash } from '../metadata/customZodTypes.js'; +import { DeployedOwnableSchema, OwnableSchema } from '../schemas.js'; import { ChainMap } from '../types.js'; -import { - DestinationGasSchema, - GasRouterConfigSchema, - MailboxClientConfigSchema, - RemoteRoutersSchema, - RouterConfigSchema, -} from './schemas.js'; - export type RouterAddress = { router: Address; }; @@ -68,3 +64,40 @@ export interface RouterViolation extends CheckerViolation { export type RemoteRouters = z.infer; export type DestinationGas = z.infer; + +export const MailboxClientConfigSchema = OwnableSchema.extend({ + mailbox: ZHash, + hook: HookConfigSchema.optional(), + interchainSecurityModule: IsmConfigSchema.optional(), +}); + +export const ForeignDeploymentConfigSchema = z.object({ + foreignDeployment: z.string().optional(), +}); + +const RemoteRouterDomain = z.string(); +const RemoteRouterRouter = z.string().startsWith('0x'); +export const RemoteRoutersSchema = z.record( + RemoteRouterDomain, + RemoteRouterRouter, +); + +export const RouterConfigSchema = MailboxClientConfigSchema.merge( + ForeignDeploymentConfigSchema, +).merge( + z.object({ + remoteRouters: RemoteRoutersSchema.optional(), + proxyAdmin: DeployedOwnableSchema.optional(), + }), +); + +const DestinationGasDomain = z.string(); +const DestinationGasAmount = z.string(); // This must be a string type to match Ether's type +export const DestinationGasSchema = z.record( + DestinationGasDomain, + DestinationGasAmount, +); +export const GasRouterConfigSchema = RouterConfigSchema.extend({ + gas: z.number().optional(), + destinationGas: DestinationGasSchema.optional(), +}); diff --git a/typescript/sdk/src/token/EvmERC20WarpRouteReader.ts b/typescript/sdk/src/token/EvmERC20WarpRouteReader.ts index df2ab1aff..d65f4fad7 100644 --- a/typescript/sdk/src/token/EvmERC20WarpRouteReader.ts +++ b/typescript/sdk/src/token/EvmERC20WarpRouteReader.ts @@ -124,7 +124,7 @@ export class EvmERC20WarpRouteReader extends HyperlaneReader { const warpRoute = factory.connect(warpRouteAddress, this.provider); await warpRoute[method](); return tokenType as TokenType; - } catch (e) { + } catch { continue; } finally { this.setSmartProviderLogLevel(getLogLevel()); // returns to original level defined by rootLogger diff --git a/typescript/sdk/src/token/adapters/CosmWasmTokenAdapter.test.ts b/typescript/sdk/src/token/adapters/CosmWasmTokenAdapter.test.ts index 1205d123b..f699780c6 100644 --- a/typescript/sdk/src/token/adapters/CosmWasmTokenAdapter.test.ts +++ b/typescript/sdk/src/token/adapters/CosmWasmTokenAdapter.test.ts @@ -1,5 +1,3 @@ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ - /* eslint-disable no-console */ import { CosmWasmClient, diff --git a/typescript/sdk/src/token/checker.ts b/typescript/sdk/src/token/checker.ts index 9dcc0569b..156658ddc 100644 --- a/typescript/sdk/src/token/checker.ts +++ b/typescript/sdk/src/token/checker.ts @@ -73,7 +73,7 @@ export class HypERC20Checker extends ProxiedRouterChecker< from: await this.multiProvider.getSignerAddress(chain), value: BigNumber.from(1), }); - } catch (e) { + } catch { const violation: TokenMismatchViolation = { type: 'deployed token not payable', chain, diff --git a/typescript/sdk/src/token/deploy.ts b/typescript/sdk/src/token/deploy.ts index aa7376c88..87f77bc88 100644 --- a/typescript/sdk/src/token/deploy.ts +++ b/typescript/sdk/src/token/deploy.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { constants } from 'ethers'; import { diff --git a/typescript/sdk/src/token/schemas.ts b/typescript/sdk/src/token/schemas.ts index ae9ee15a4..7c975530f 100644 --- a/typescript/sdk/src/token/schemas.ts +++ b/typescript/sdk/src/token/schemas.ts @@ -2,7 +2,7 @@ import { z } from 'zod'; import { objMap } from '@hyperlane-xyz/utils'; -import { GasRouterConfigSchema } from '../router/schemas.js'; +import { GasRouterConfigSchema } from '../router/types.js'; import { isCompliant } from '../utils/schemas.js'; import { TokenType } from './config.js'; diff --git a/typescript/sdk/src/utils/.eslintrc b/typescript/sdk/src/utils/.eslintrc deleted file mode 100644 index ba8754a12..000000000 --- a/typescript/sdk/src/utils/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "rules": { - "@typescript-eslint/explicit-module-boundary-types": ["off"] - } -} diff --git a/typescript/sdk/src/utils/gnosisSafe.js b/typescript/sdk/src/utils/gnosisSafe.js index c5c14fca8..51235e212 100644 --- a/typescript/sdk/src/utils/gnosisSafe.js +++ b/typescript/sdk/src/utils/gnosisSafe.js @@ -103,7 +103,7 @@ export async function canProposeSafeTransactions( let safeService; try { safeService = getSafeService(chain, multiProvider); - } catch (e) { + } catch { return false; } const safe = await getSafe(chain, multiProvider, safeAddress); diff --git a/typescript/sdk/src/utils/logUtils.ts b/typescript/sdk/src/utils/logUtils.ts index 5e2eeb366..b35a8e51a 100644 --- a/typescript/sdk/src/utils/logUtils.ts +++ b/typescript/sdk/src/utils/logUtils.ts @@ -10,7 +10,7 @@ export function findMatchingLogEvents( .map((log) => { try { return iface.parseLog(log); - } catch (e) { + } catch { return undefined; } }) diff --git a/typescript/sdk/src/utils/sealevelSerialization.ts b/typescript/sdk/src/utils/sealevelSerialization.ts index 13b3dcacd..8d0907c22 100644 --- a/typescript/sdk/src/utils/sealevelSerialization.ts +++ b/typescript/sdk/src/utils/sealevelSerialization.ts @@ -10,7 +10,6 @@ export class SealevelAccountDataWrapper { initialized!: boolean; discriminator?: unknown; data!: T; - // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types constructor(public readonly fields: any) { Object.assign(this, fields); } diff --git a/typescript/utils/eslint.config.mjs b/typescript/utils/eslint.config.mjs new file mode 100644 index 000000000..b82e3eedb --- /dev/null +++ b/typescript/utils/eslint.config.mjs @@ -0,0 +1,3 @@ +import MonorepoDefaults from '../../eslint.config.mjs'; + +export default [...MonorepoDefaults, { files: ['./src/**/*.ts'] }]; diff --git a/typescript/utils/package.json b/typescript/utils/package.json index bbc326da3..0a757dd0e 100644 --- a/typescript/utils/package.json +++ b/typescript/utils/package.json @@ -12,11 +12,18 @@ "yaml": "2.4.5" }, "devDependencies": { + "@eslint/js": "^9.15.0", "@types/lodash-es": "^4.17.12", "@types/mocha": "^10.0.1", "@types/sinon": "^17.0.1", "@types/sinon-chai": "^3.2.12", + "@typescript-eslint/eslint-plugin": "^8.1.6", + "@typescript-eslint/parser": "^8.1.6", "chai": "4.5.0", + "eslint": "^9.15.0", + "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-import": "^2.31.0", "mocha": "^10.2.0", "prettier": "^2.8.8", "sinon": "^13.0.2", @@ -36,6 +43,7 @@ "build": "tsc", "clean": "rm -rf ./dist", "check": "tsc --noEmit", + "lint": "eslint -c ./eslint.config.mjs", "prettier": "prettier --write ./src", "test": "mocha --config .mocharc.json './src/**/*.test.ts'", "test:ci": "yarn test" diff --git a/typescript/utils/src/addresses.ts b/typescript/utils/src/addresses.ts index 01f9fdb10..29a35b6b8 100644 --- a/typescript/utils/src/addresses.ts +++ b/typescript/utils/src/addresses.ts @@ -80,7 +80,7 @@ export function isValidAddressEvm(address: Address) { try { const isValid = address && ethersUtils.isAddress(address); return !!isValid; - } catch (error) { + } catch { return false; } } @@ -90,7 +90,7 @@ export function isValidAddressSealevel(address: Address) { try { const isValid = address && new PublicKey(address).toBase58(); return !!isValid; - } catch (error) { + } catch { return false; } } @@ -104,7 +104,7 @@ export function isValidAddressCosmos(address: Address) { COSMOS_FACTORY_TOKEN_REGEX.test(address) || fromBech32(address)); return !!isValid; - } catch (error) { + } catch { return false; } } @@ -126,7 +126,7 @@ export function normalizeAddressEvm(address: Address) { if (isZeroishAddress(address)) return address; try { return ethersUtils.getAddress(address); - } catch (error) { + } catch { return address; } } @@ -135,7 +135,7 @@ export function normalizeAddressSealevel(address: Address) { if (isZeroishAddress(address)) return address; try { return new PublicKey(address).toBase58(); - } catch (error) { + } catch { return address; } } @@ -144,7 +144,7 @@ export function normalizeAddressCosmos(address: Address) { if (isZeroishAddress(address)) return address; try { return normalizeBech32(address); - } catch (error) { + } catch { return address; } } diff --git a/typescript/utils/src/amount.ts b/typescript/utils/src/amount.ts index f415c268d..ab8a3b334 100644 --- a/typescript/utils/src/amount.ts +++ b/typescript/utils/src/amount.ts @@ -82,7 +82,7 @@ export function tryParseAmount( const parsed = BigNumber(value); if (!parsed || parsed.isNaN() || !parsed.isFinite()) return null; else return parsed; - } catch (error) { + } catch { return null; } } diff --git a/typescript/utils/src/base64.ts b/typescript/utils/src/base64.ts index 1d2ae02fa..d09c4502e 100644 --- a/typescript/utils/src/base64.ts +++ b/typescript/utils/src/base64.ts @@ -4,7 +4,7 @@ export function toBase64(data: any): string | undefined { try { if (!data) throw new Error('No data to encode'); return btoa(JSON.stringify(data)); - } catch (error) { + } catch { rootLogger.error('Unable to serialize + encode data to base64', data); return undefined; } @@ -15,7 +15,7 @@ export function fromBase64(data: string | string[]): T | undefined { if (!data) throw new Error('No data to decode'); const msg = Array.isArray(data) ? data[0] : data; return JSON.parse(atob(msg)); - } catch (error) { + } catch { rootLogger.error('Unable to decode + deserialize data from base64', data); return undefined; } diff --git a/typescript/utils/src/big-numbers.ts b/typescript/utils/src/big-numbers.ts index fa20e0759..51e7a31ba 100644 --- a/typescript/utils/src/big-numbers.ts +++ b/typescript/utils/src/big-numbers.ts @@ -15,7 +15,7 @@ export function isBigNumberish( try { const val = BigNumber(value!); return !val.isNaN() && val.isFinite() && BigNumber.isBigNumber(val); - } catch (error) { + } catch { return false; } } @@ -28,7 +28,7 @@ export function isBigNumberish( export function isZeroish(value: BigNumber.Value): boolean { try { return BigNumber(value).isZero(); - } catch (error) { + } catch { return false; } } diff --git a/typescript/utils/src/env.ts b/typescript/utils/src/env.ts index ff24f2486..8841f56a8 100644 --- a/typescript/utils/src/env.ts +++ b/typescript/utils/src/env.ts @@ -3,7 +3,7 @@ export function safelyAccessEnvVar(name: string, toLowerCase = false) { try { return toLowerCase ? process.env[name]?.toLowerCase() : process.env[name]; - } catch (error) { + } catch { return undefined; } } diff --git a/typescript/utils/src/index.ts b/typescript/utils/src/index.ts index ff226449f..e665e9ce8 100644 --- a/typescript/utils/src/index.ts +++ b/typescript/utils/src/index.ts @@ -108,6 +108,7 @@ export { arrayToObject, deepCopy, deepEquals, + deepFind, diffObjMerge, invertKeysAndValues, isObjEmpty, @@ -139,6 +140,7 @@ export { streamToString, toHexString, toTitleCase, + toUpperCamelCase, trimToLength, } from './strings.js'; export { isNullish, isNumeric } from './typeof.js'; diff --git a/typescript/utils/src/strings.ts b/typescript/utils/src/strings.ts index 26d40838a..bc50107bb 100644 --- a/typescript/utils/src/strings.ts +++ b/typescript/utils/src/strings.ts @@ -6,6 +6,10 @@ export function toTitleCase(str: string) { }); } +export function toUpperCamelCase(string: string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} + // Only allows letters and numbers const alphanumericRgex = /[^a-zA-Z0-9]/gi; export function sanitizeString(str: string) { diff --git a/typescript/utils/src/url.ts b/typescript/utils/src/url.ts index 98f9ee412..0d1c2b0ab 100644 --- a/typescript/utils/src/url.ts +++ b/typescript/utils/src/url.ts @@ -3,7 +3,7 @@ export function isUrl(value?: string | null) { if (!value) return false; const url = new URL(value); return !!url.hostname; - } catch (error) { + } catch { return false; } } @@ -13,7 +13,7 @@ export function isHttpsUrl(value?: string | null) { if (!value) return false; const url = new URL(value); return url.protocol === 'https:'; - } catch (error) { + } catch { return false; } } diff --git a/typescript/widgets/.eslintignore b/typescript/widgets/.eslintignore deleted file mode 100644 index c047b2694..000000000 --- a/typescript/widgets/.eslintignore +++ /dev/null @@ -1,6 +0,0 @@ -node_modules -dist -coverage -tailwind.config.js -postcss.config.js -src/stories/**/*.stories.tsx diff --git a/typescript/widgets/.eslintrc b/typescript/widgets/.eslintrc deleted file mode 100644 index 9041f842f..000000000 --- a/typescript/widgets/.eslintrc +++ /dev/null @@ -1,20 +0,0 @@ -{ - "extends": [ - "plugin:react/recommended", - "plugin:react-hooks/recommended", - "prettier" - ], - "plugins": ["react", "react-hooks"], - "rules": { - "react/react-in-jsx-scope": "off", - "react/prop-types": "off", - "react-hooks/rules-of-hooks": "error", - "react-hooks/exhaustive-deps": "warn" - }, - "settings": { - "react": { - "version": "18", - "defaultVersion": "18" - } - } -} diff --git a/typescript/widgets/eslint.config.mjs b/typescript/widgets/eslint.config.mjs new file mode 100644 index 000000000..e9f4b3ff3 --- /dev/null +++ b/typescript/widgets/eslint.config.mjs @@ -0,0 +1,40 @@ +import react from 'eslint-plugin-react'; +import reactHooks from 'eslint-plugin-react-hooks'; + +import MonorepoDefaults, {compat} from '../../eslint.config.mjs'; + +export default [ + ...MonorepoDefaults, + ...compat.extends("plugin:react/recommended", "plugin:react-hooks/recommended"), + { + settings: { + react: { + version: '18', + defaultVersion: '18', + }, + }, + }, + { + files: ['./src/**/*.ts', './src/**/*.tsx'], + plugins: { + react, + 'react-hooks': reactHooks, + }, + + + rules: { + 'react/react-in-jsx-scope': 'off', + 'react/prop-types': 'off', + 'react-hooks/rules-of-hooks': 'error', + 'react-hooks/exhaustive-deps': 'warn', + }, + }, + { + ignores: [ + '**/src/stories/*', + 'tailwind.config.js', + 'postcss.config.js', + '.storybook/*', + ], + }, +]; diff --git a/typescript/widgets/mg.eslint.config.mjs b/typescript/widgets/mg.eslint.config.mjs new file mode 100644 index 000000000..a66e159b3 --- /dev/null +++ b/typescript/widgets/mg.eslint.config.mjs @@ -0,0 +1,38 @@ +import { fixupConfigRules, fixupPluginRules } from "@eslint/compat"; +import react from "eslint-plugin-react"; +import reactHooks from "eslint-plugin-react-hooks"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import js from "@eslint/js"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all +}); + +export default [...fixupConfigRules( + compat.extends("plugin:react/recommended", "plugin:react-hooks/recommended", "prettier"), +), { + plugins: { + react: fixupPluginRules(react), + "react-hooks": fixupPluginRules(reactHooks), + }, + + settings: { + react: { + version: "18", + defaultVersion: "18", + }, + }, + + rules: { + "react/react-in-jsx-scope": "off", + "react/prop-types": "off", + "react-hooks/rules-of-hooks": "error", + "react-hooks/exhaustive-deps": "warn", + }, +}]; \ No newline at end of file diff --git a/typescript/widgets/package.json b/typescript/widgets/package.json index 8a4331ef0..0fb329903 100644 --- a/typescript/widgets/package.json +++ b/typescript/widgets/package.json @@ -26,6 +26,7 @@ "@cosmjs/cosmwasm-stargate": "^0.32.4", "@emotion/react": "^11.13.3", "@emotion/styled": "^11.13.0", + "@eslint/js": "^9.15.0", "@hyperlane-xyz/registry": "6.1.0", "@storybook/addon-essentials": "^7.6.14", "@storybook/addon-interactions": "^7.6.14", @@ -40,14 +41,16 @@ "@types/react": "^18.0.27", "@types/react-dom": "^18.0.10", "@types/ws": "^8.5.5", - "@typescript-eslint/eslint-plugin": "^7.4.0", - "@typescript-eslint/parser": "^7.4.0", + "@typescript-eslint/eslint-plugin": "^8.1.6", + "@typescript-eslint/parser": "^8.1.6", "babel-loader": "^8.3.0", - "eslint": "^8.57.0", + "eslint": "^9.15.0", "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-react": "^7.37.2", "eslint-plugin-react-hooks": "^5.0.0", - "eslint-plugin-storybook": "^0.6.15", + "eslint-plugin-storybook": "^0.11.1", "framer-motion": "^10.16.4", "postcss": "^8.4.21", "prettier": "^2.8.8", @@ -86,7 +89,7 @@ "build:ts": "tsc", "build:css": "tailwindcss -c ./tailwind.config.cjs -i ./src/styles.css -o ./dist/styles.css --minify", "clean": "rm -rf ./dist ./cache ./storybook-static", - "lint": "eslint ./src --ext '.ts,.tsx'", + "lint": "eslint -c ./eslint.config.mjs", "prettier": "prettier --write ./src", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build" diff --git a/typescript/widgets/src/chains/ChainAddMenu.tsx b/typescript/widgets/src/chains/ChainAddMenu.tsx index 9b3c4065c..032366f01 100644 --- a/typescript/widgets/src/chains/ChainAddMenu.tsx +++ b/typescript/widgets/src/chains/ChainAddMenu.tsx @@ -1,4 +1,4 @@ -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { useState } from 'react'; import { DEFAULT_GITHUB_REGISTRY } from '@hyperlane-xyz/registry'; diff --git a/typescript/widgets/src/chains/ChainDetailsMenu.tsx b/typescript/widgets/src/chains/ChainDetailsMenu.tsx index 7c175d0d8..468b60a8e 100644 --- a/typescript/widgets/src/chains/ChainDetailsMenu.tsx +++ b/typescript/widgets/src/chains/ChainDetailsMenu.tsx @@ -1,4 +1,4 @@ -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { PropsWithChildren, useEffect, useMemo, useState } from 'react'; import { stringify as yamlStringify } from 'yaml'; diff --git a/typescript/widgets/src/chains/ChainSearchMenu.tsx b/typescript/widgets/src/chains/ChainSearchMenu.tsx index 59532e9f6..a945e4bd9 100644 --- a/typescript/widgets/src/chains/ChainSearchMenu.tsx +++ b/typescript/widgets/src/chains/ChainSearchMenu.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useMemo } from 'react'; +import React, { useCallback, useMemo, useState } from 'react'; import { ChainMap, @@ -77,11 +77,11 @@ export function ChainSearchMenu({ showAddChainMenu, defaultSortField, }: ChainSearchMenuProps) { - const [drilldownChain, setDrilldownChain] = React.useState< - ChainName | undefined - >(showChainDetails); + const [drilldownChain, setDrilldownChain] = useState( + showChainDetails, + ); - const [addChain, setAddChain] = React.useState(showAddChainMenu || false); + const [addChain, setAddChain] = useState(showAddChainMenu || false); const { listData, mergedMetadata } = useMemo(() => { const mergedMetadata = mergeChainMetadataMap( diff --git a/typescript/widgets/src/components/Button.tsx b/typescript/widgets/src/components/Button.tsx index 3177af05b..e983bd564 100644 --- a/typescript/widgets/src/components/Button.tsx +++ b/typescript/widgets/src/components/Button.tsx @@ -1,4 +1,4 @@ -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { ButtonHTMLAttributes, PropsWithChildren } from 'react'; type Props = PropsWithChildren>; diff --git a/typescript/widgets/src/components/IconButton.tsx b/typescript/widgets/src/components/IconButton.tsx index 314ba40fa..eeeddc57d 100644 --- a/typescript/widgets/src/components/IconButton.tsx +++ b/typescript/widgets/src/components/IconButton.tsx @@ -1,4 +1,4 @@ -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { ButtonHTMLAttributes, PropsWithChildren } from 'react'; type Props = PropsWithChildren> & { diff --git a/typescript/widgets/src/components/LinkButton.tsx b/typescript/widgets/src/components/LinkButton.tsx index 026bf6ba1..5fb6c53c9 100644 --- a/typescript/widgets/src/components/LinkButton.tsx +++ b/typescript/widgets/src/components/LinkButton.tsx @@ -1,4 +1,4 @@ -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { ButtonHTMLAttributes, PropsWithChildren } from 'react'; type Props = PropsWithChildren>; diff --git a/typescript/widgets/src/components/SearchMenu.tsx b/typescript/widgets/src/components/SearchMenu.tsx index 44c1c2c79..750d2bfb3 100644 --- a/typescript/widgets/src/components/SearchMenu.tsx +++ b/typescript/widgets/src/components/SearchMenu.tsx @@ -1,6 +1,7 @@ -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { ComponentType, + forwardRef, useCallback, useEffect, useMemo, @@ -184,7 +185,7 @@ export function SearchMenu< ); } -const SearchBar = React.forwardRef(function SearchBar( +const SearchBar = forwardRef(function SearchBar( { onChange, value, ...props }: InputProps, ref: React.Ref, ) { diff --git a/typescript/widgets/src/components/TextInput.tsx b/typescript/widgets/src/components/TextInput.tsx index e2dfa8e8e..42f74f199 100644 --- a/typescript/widgets/src/components/TextInput.tsx +++ b/typescript/widgets/src/components/TextInput.tsx @@ -1,4 +1,4 @@ -import React, { ChangeEvent, InputHTMLAttributes } from 'react'; +import React, { ChangeEvent, InputHTMLAttributes, forwardRef } from 'react'; export type InputProps = Omit< InputHTMLAttributes, @@ -28,4 +28,4 @@ export function _TextInput( ); } -export const TextInput = React.forwardRef(_TextInput); +export const TextInput = forwardRef(_TextInput); diff --git a/typescript/widgets/src/layout/DropdownMenu.tsx b/typescript/widgets/src/layout/DropdownMenu.tsx index 837a219e7..6dbca2248 100644 --- a/typescript/widgets/src/layout/DropdownMenu.tsx +++ b/typescript/widgets/src/layout/DropdownMenu.tsx @@ -1,5 +1,5 @@ import { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react'; -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { ComponentProps, ReactNode } from 'react'; export type DropdownMenuProps = { diff --git a/typescript/widgets/src/layout/Modal.tsx b/typescript/widgets/src/layout/Modal.tsx index bc0b872f0..12a774bbe 100644 --- a/typescript/widgets/src/layout/Modal.tsx +++ b/typescript/widgets/src/layout/Modal.tsx @@ -4,7 +4,7 @@ import { DialogPanel, DialogTitle, } from '@headlessui/react'; -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { ComponentProps, PropsWithChildren, useState } from 'react'; import { IconButton } from '../components/IconButton.js'; diff --git a/typescript/widgets/src/layout/Popover.tsx b/typescript/widgets/src/layout/Popover.tsx index 34e7793fb..f0f1b8229 100644 --- a/typescript/widgets/src/layout/Popover.tsx +++ b/typescript/widgets/src/layout/Popover.tsx @@ -3,7 +3,7 @@ import { PopoverPanel, Popover as _Popover, } from '@headlessui/react'; -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { ComponentProps, ReactNode } from 'react'; export type PopoverProps = { diff --git a/typescript/widgets/src/walletIntegrations/AccountList.tsx b/typescript/widgets/src/walletIntegrations/AccountList.tsx index db99a33a4..63d08baad 100644 --- a/typescript/widgets/src/walletIntegrations/AccountList.tsx +++ b/typescript/widgets/src/walletIntegrations/AccountList.tsx @@ -1,4 +1,4 @@ -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { ButtonHTMLAttributes } from 'react'; import { MultiProtocolProvider } from '@hyperlane-xyz/sdk'; diff --git a/typescript/widgets/src/walletIntegrations/ConnectWalletButton.tsx b/typescript/widgets/src/walletIntegrations/ConnectWalletButton.tsx index 8ecc32f84..1d64e9cf7 100644 --- a/typescript/widgets/src/walletIntegrations/ConnectWalletButton.tsx +++ b/typescript/widgets/src/walletIntegrations/ConnectWalletButton.tsx @@ -1,4 +1,4 @@ -import clsx from 'clsx'; +import { clsx } from 'clsx'; import React, { ButtonHTMLAttributes } from 'react'; import { MultiProtocolProvider } from '@hyperlane-xyz/sdk'; diff --git a/yarn.lock b/yarn.lock index 1a658284c..751611cc3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7061,34 +7061,68 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.10.0 - resolution: "@eslint-community/regexpp@npm:4.10.0" - checksum: 10/8c36169c815fc5d726078e8c71a5b592957ee60d08c6470f9ce0187c8046af1a00afbda0a065cc40ff18d5d83f82aed9793c6818f7304a74a7488dc9f3ecbd42 +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10/c08f1dd7dd18fbb60bdd0d85820656d1374dd898af9be7f82cb00451313402a22d5e30569c150315b4385907cdbca78c22389b2a72ab78883b3173be317620cc languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/eslintrc@npm:2.1.4" +"@eslint/config-array@npm:^0.19.0": + version: 0.19.0 + resolution: "@eslint/config-array@npm:0.19.0" + dependencies: + "@eslint/object-schema": "npm:^2.1.4" + debug: "npm:^4.3.1" + minimatch: "npm:^3.1.2" + checksum: 10/16e4ec468ebcb10255ab8c61234c1b3e7ac5506016e432fb489a1c5528cace7a60ddb07515516e7fc166b1dbe6c407d8a6bfbaa2e7531d445d8feb845c989913 + languageName: node + linkType: hard + +"@eslint/core@npm:^0.9.0": + version: 0.9.0 + resolution: "@eslint/core@npm:0.9.0" + checksum: 10/2d11e9c6fac14cfa817c7a9939fd6b79f2120928e4933952d061651db93797e0fcd67c858a14980ac26e90f6e0e49051436aefa4a4b06a26f24e3028366f73d9 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^3.2.0": + version: 3.2.0 + resolution: "@eslint/eslintrc@npm:3.2.0" dependencies: ajv: "npm:^6.12.4" debug: "npm:^4.3.2" - espree: "npm:^9.6.0" - globals: "npm:^13.19.0" + espree: "npm:^10.0.1" + globals: "npm:^14.0.0" ignore: "npm:^5.2.0" import-fresh: "npm:^3.2.1" js-yaml: "npm:^4.1.0" minimatch: "npm:^3.1.2" strip-json-comments: "npm:^3.1.1" - checksum: 10/7a3b14f4b40fc1a22624c3f84d9f467a3d9ea1ca6e9a372116cb92507e485260359465b58e25bcb6c9981b155416b98c9973ad9b796053fd7b3f776a6946bce8 + checksum: 10/b32dd90ce7da68e89b88cd729db46b27aac79a2e6cb1fa75d25a6b766d586b443bfbf59622489efbd3c6f696f147b51111e81ec7cd23d70f215c5d474cad0261 + languageName: node + linkType: hard + +"@eslint/js@npm:9.15.0, @eslint/js@npm:^9.15.0": + version: 9.15.0 + resolution: "@eslint/js@npm:9.15.0" + checksum: 10/cdea71574a8be164147f426ffa5eca05a9c7fbfbae98387ed0cf772292fc9fb5ded69ce96eac110aaa633f6b7504ec551e1d33f2d6690ae95b11ec395553bae1 + languageName: node + linkType: hard + +"@eslint/object-schema@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/object-schema@npm:2.1.4" + checksum: 10/221e8d9f281c605948cd6e030874aacce83fe097f8f9c1964787037bccf08e82b7aa9eff1850a30fffac43f1d76555727ec22a2af479d91e268e89d1e035131e languageName: node linkType: hard -"@eslint/js@npm:8.57.0": - version: 8.57.0 - resolution: "@eslint/js@npm:8.57.0" - checksum: 10/3c501ce8a997cf6cbbaf4ed358af5492875e3550c19b9621413b82caa9ae5382c584b0efa79835639e6e0ddaa568caf3499318e5bdab68643ef4199dce5eb0a0 +"@eslint/plugin-kit@npm:^0.2.3": + version: 0.2.3 + resolution: "@eslint/plugin-kit@npm:0.2.3" + dependencies: + levn: "npm:^0.4.1" + checksum: 10/0d0653ef840823fd5c0354ef8f1937e7763dbe830173eb6d2d55a19374bf04a06dff0e5214330c10a9425cf38655f632bb0d7d0666249b366e506ae291d82f7e languageName: node linkType: hard @@ -8389,14 +8423,20 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.14": - version: 0.11.14 - resolution: "@humanwhocodes/config-array@npm:0.11.14" +"@humanfs/core@npm:^0.19.1": + version: 0.19.1 + resolution: "@humanfs/core@npm:0.19.1" + checksum: 10/270d936be483ab5921702623bc74ce394bf12abbf57d9145a69e8a0d1c87eb1c768bd2d93af16c5705041e257e6d9cc7529311f63a1349f3678abc776fc28523 + languageName: node + linkType: hard + +"@humanfs/node@npm:^0.16.6": + version: 0.16.6 + resolution: "@humanfs/node@npm:0.16.6" dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.2" - debug: "npm:^4.3.1" - minimatch: "npm:^3.0.5" - checksum: 10/3ffb24ecdfab64014a230e127118d50a1a04d11080cbb748bc21629393d100850496456bbcb4e8c438957fe0934430d731042f1264d6a167b62d32fc2863580a + "@humanfs/core": "npm:^0.19.1" + "@humanwhocodes/retry": "npm:^0.3.0" + checksum: 10/6d43c6727463772d05610aa05c83dab2bfbe78291022ee7a92cb50999910b8c720c76cc312822e2dea2b497aa1b3fef5fe9f68803fc45c9d4ed105874a65e339 languageName: node linkType: hard @@ -8407,10 +8447,17 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.2": - version: 2.0.2 - resolution: "@humanwhocodes/object-schema@npm:2.0.2" - checksum: 10/ef915e3e2f34652f3d383b28a9a99cfea476fa991482370889ab14aac8ecd2b38d47cc21932526c6d949da0daf4a4a6bf629d30f41b0caca25e146819cbfa70e +"@humanwhocodes/retry@npm:^0.3.0": + version: 0.3.1 + resolution: "@humanwhocodes/retry@npm:0.3.1" + checksum: 10/eb457f699529de7f07649679ec9e0353055eebe443c2efe71c6dd950258892475a038e13c6a8c5e13ed1fb538cdd0a8794faa96b24b6ffc4c87fb1fc9f70ad7f + languageName: node + linkType: hard + +"@humanwhocodes/retry@npm:^0.4.1": + version: 0.4.1 + resolution: "@humanwhocodes/retry@npm:0.4.1" + checksum: 10/39fafc7319e88f61befebd5e1b4f0136534ea6a9bd10d74366698187bd63544210ec5d79a87ed4d91297f1cc64c4c53d45fb0077a2abfdce212cf0d3862d5f04 languageName: node linkType: hard @@ -8422,6 +8469,7 @@ __metadata: "@jest/globals": "npm:^29.7.0" "@types/node": "npm:^16.9.1" dotenv-flow: "npm:^4.1.0" + eslint: "npm:^9.15.0" ethers: "npm:5.7.2" jest: "npm:^29.7.0" nodemon: "npm:^3.0.3" @@ -8439,6 +8487,7 @@ __metadata: dependencies: "@aws-sdk/client-kms": "npm:^3.577.0" "@aws-sdk/client-s3": "npm:^3.577.0" + "@eslint/js": "npm:^9.15.0" "@ethersproject/abi": "npm:*" "@ethersproject/providers": "npm:*" "@hyperlane-xyz/registry": "npm:6.1.0" @@ -8451,16 +8500,18 @@ __metadata: "@types/mocha": "npm:^10.0.1" "@types/node": "npm:^18.14.5" "@types/yargs": "npm:^17.0.24" - "@typescript-eslint/eslint-plugin": "npm:^7.4.0" - "@typescript-eslint/parser": "npm:^7.4.0" + "@typescript-eslint/eslint-plugin": "npm:^8.1.6" + "@typescript-eslint/parser": "npm:^8.1.6" ansi-escapes: "npm:^7.0.0" asn1.js: "npm:^5.4.1" bignumber.js: "npm:^9.1.1" chai: "npm:^4.5.0" chai-as-promised: "npm:^8.0.0" chalk: "npm:^5.3.0" - eslint: "npm:^8.57.0" + eslint: "npm:^9.15.0" eslint-config-prettier: "npm:^9.1.0" + eslint-import-resolver-typescript: "npm:^3.6.3" + eslint-plugin-import: "npm:^2.31.0" ethers: "npm:^5.7.2" latest-version: "npm:^8.0.0" mocha: "npm:^10.2.0" @@ -8539,6 +8590,7 @@ __metadata: version: 0.0.0-use.local resolution: "@hyperlane-xyz/helloworld@workspace:typescript/helloworld" dependencies: + "@eslint/js": "npm:^9.15.0" "@hyperlane-xyz/core": "npm:5.8.1" "@hyperlane-xyz/registry": "npm:6.1.0" "@hyperlane-xyz/sdk": "npm:7.1.0" @@ -8549,11 +8601,13 @@ __metadata: "@typechain/ethers-v5": "npm:^11.1.2" "@typechain/ethers-v6": "npm:^0.5.1" "@typechain/hardhat": "npm:^9.1.0" - "@typescript-eslint/eslint-plugin": "npm:^7.4.0" - "@typescript-eslint/parser": "npm:^7.4.0" + "@typescript-eslint/eslint-plugin": "npm:^8.1.6" + "@typescript-eslint/parser": "npm:^8.1.6" chai: "npm:4.5.0" - eslint: "npm:^8.57.0" + eslint: "npm:^9.15.0" eslint-config-prettier: "npm:^9.1.0" + eslint-import-resolver-typescript: "npm:^3.6.3" + eslint-plugin-import: "npm:^2.31.0" ethereum-waffle: "npm:^4.0.10" ethers: "npm:^5.7.2" hardhat: "npm:^2.22.2" @@ -8634,11 +8688,14 @@ __metadata: resolution: "@hyperlane-xyz/monorepo@workspace:." dependencies: "@changesets/cli": "npm:^2.26.2" + "@eslint/js": "npm:^9.15.0" "@trivago/prettier-plugin-sort-imports": "npm:^4.2.1" - "@typescript-eslint/eslint-plugin": "npm:^7.4.0" - "@typescript-eslint/parser": "npm:^7.4.0" - eslint: "npm:^8.57.0" + "@typescript-eslint/eslint-plugin": "npm:^8.1.6" + "@typescript-eslint/parser": "npm:^8.1.6" + eslint: "npm:^9.15.0" eslint-config-prettier: "npm:^9.1.0" + eslint-import-resolver-typescript: "npm:^3.6.3" + eslint-plugin-import: "npm:^2.31.0" eslint-plugin-jest: "npm:^28.2.0" husky: "npm:^8.0.0" lint-staged: "npm:^12.4.3" @@ -8666,6 +8723,7 @@ __metadata: "@chain-registry/types": "npm:^0.50.14" "@cosmjs/cosmwasm-stargate": "npm:^0.32.4" "@cosmjs/stargate": "npm:^0.32.4" + "@eslint/js": "npm:^9.15.0" "@hyperlane-xyz/core": "npm:5.8.1" "@hyperlane-xyz/utils": "npm:7.1.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" @@ -8680,12 +8738,17 @@ __metadata: "@types/sinon": "npm:^17.0.1" "@types/sinon-chai": "npm:^3.2.12" "@types/ws": "npm:^8.5.5" + "@typescript-eslint/eslint-plugin": "npm:^8.1.6" + "@typescript-eslint/parser": "npm:^8.1.6" bignumber.js: "npm:^9.1.1" chai: "npm:4.5.0" cosmjs-types: "npm:^0.9.0" cross-fetch: "npm:^3.1.5" dotenv: "npm:^10.0.0" - eslint: "npm:^8.57.0" + eslint: "npm:^9.15.0" + eslint-config-prettier: "npm:^9.1.0" + eslint-import-resolver-typescript: "npm:^3.6.3" + eslint-plugin-import: "npm:^2.31.0" ethereum-waffle: "npm:^4.0.10" ethers: "npm:^5.7.2" hardhat: "npm:^2.22.2" @@ -8710,13 +8773,20 @@ __metadata: resolution: "@hyperlane-xyz/utils@workspace:typescript/utils" dependencies: "@cosmjs/encoding": "npm:^0.32.4" + "@eslint/js": "npm:^9.15.0" "@solana/web3.js": "npm:^1.95.4" "@types/lodash-es": "npm:^4.17.12" "@types/mocha": "npm:^10.0.1" "@types/sinon": "npm:^17.0.1" "@types/sinon-chai": "npm:^3.2.12" + "@typescript-eslint/eslint-plugin": "npm:^8.1.6" + "@typescript-eslint/parser": "npm:^8.1.6" bignumber.js: "npm:^9.1.1" chai: "npm:4.5.0" + eslint: "npm:^9.15.0" + eslint-config-prettier: "npm:^9.1.0" + eslint-import-resolver-typescript: "npm:^3.6.3" + eslint-plugin-import: "npm:^2.31.0" ethers: "npm:^5.7.2" lodash-es: "npm:^4.17.21" mocha: "npm:^10.2.0" @@ -8737,6 +8807,7 @@ __metadata: "@cosmos-kit/react": "npm:^2.18.0" "@emotion/react": "npm:^11.13.3" "@emotion/styled": "npm:^11.13.0" + "@eslint/js": "npm:^9.15.0" "@headlessui/react": "npm:^2.1.8" "@hyperlane-xyz/registry": "npm:6.1.0" "@hyperlane-xyz/sdk": "npm:7.1.0" @@ -8759,15 +8830,17 @@ __metadata: "@types/react": "npm:^18.0.27" "@types/react-dom": "npm:^18.0.10" "@types/ws": "npm:^8.5.5" - "@typescript-eslint/eslint-plugin": "npm:^7.4.0" - "@typescript-eslint/parser": "npm:^7.4.0" + "@typescript-eslint/eslint-plugin": "npm:^8.1.6" + "@typescript-eslint/parser": "npm:^8.1.6" babel-loader: "npm:^8.3.0" clsx: "npm:^2.1.1" - eslint: "npm:^8.57.0" + eslint: "npm:^9.15.0" eslint-config-prettier: "npm:^9.1.0" + eslint-import-resolver-typescript: "npm:^3.6.3" + eslint-plugin-import: "npm:^2.31.0" eslint-plugin-react: "npm:^7.37.2" eslint-plugin-react-hooks: "npm:^5.0.0" - eslint-plugin-storybook: "npm:^0.6.15" + eslint-plugin-storybook: "npm:^0.11.1" framer-motion: "npm:^10.16.4" postcss: "npm:^8.4.21" prettier: "npm:^2.8.8" @@ -10368,7 +10441,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": +"@nodelib/fs.walk@npm:^1.2.3": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -10378,6 +10451,13 @@ __metadata: languageName: node linkType: hard +"@nolyfill/is-core-module@npm:1.0.39": + version: 1.0.39 + resolution: "@nolyfill/is-core-module@npm:1.0.39" + checksum: 10/0d6e098b871eca71d875651288e1f0fa770a63478b0b50479c99dc760c64175a56b5b04f58d5581bbcc6b552b8191ab415eada093d8df9597ab3423c8cac1815 + languageName: node + linkType: hard + "@nomicfoundation/edr-darwin-arm64@npm:0.3.3": version: 0.3.3 resolution: "@nomicfoundation/edr-darwin-arm64@npm:0.3.3" @@ -13839,6 +13919,13 @@ __metadata: languageName: node linkType: hard +"@rtsao/scc@npm:^1.1.0": + version: 1.1.0 + resolution: "@rtsao/scc@npm:1.1.0" + checksum: 10/17d04adf404e04c1e61391ed97bca5117d4c2767a76ae3e879390d6dec7b317fcae68afbf9e98badee075d0b64fa60f287729c4942021b4d19cd01db77385c01 + languageName: node + linkType: hard + "@safe-global/api-kit@npm:1.3.0": version: 1.3.0 resolution: "@safe-global/api-kit@npm:1.3.0" @@ -15847,16 +15934,7 @@ __metadata: languageName: node linkType: hard -"@storybook/csf@npm:^0.0.1": - version: 0.0.1 - resolution: "@storybook/csf@npm:0.0.1" - dependencies: - lodash: "npm:^4.17.15" - checksum: 10/f6bb019bccd8abc14e45a85258158b7bd8cc525887ac8dc9151ed8c4908be3b5f5523da8a7a9b96ff11b13b6c1744e1a0e070560d63d836b950f595f9a5719d4 - languageName: node - linkType: hard - -"@storybook/csf@npm:^0.1.2": +"@storybook/csf@npm:^0.1.11, @storybook/csf@npm:^0.1.2": version: 0.1.11 resolution: "@storybook/csf@npm:0.1.11" dependencies: @@ -16605,6 +16683,13 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:^1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10/9d35d475095199c23e05b431bcdd1f6fec7380612aed068b14b2a08aa70494de8a9026765a5a91b1073f636fb0368f6d8973f518a31391d519e20c59388ed88d + languageName: node + linkType: hard + "@types/express-serve-static-core@npm:^4.17.33": version: 4.19.5 resolution: "@types/express-serve-static-core@npm:4.19.5" @@ -16729,7 +16814,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.5": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10/1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 @@ -16743,6 +16828,13 @@ __metadata: languageName: node linkType: hard +"@types/json5@npm:^0.0.29": + version: 0.0.29 + resolution: "@types/json5@npm:0.0.29" + checksum: 10/4e5aed58cabb2bbf6f725da13421aa50a49abb6bc17bfab6c31b8774b073fa7b50d557c61f961a09a85f6056151190f8ac95f13f5b48136ba5841f7d4484ec56 + languageName: node + linkType: hard + "@types/jsonfile@npm:*": version: 6.1.4 resolution: "@types/jsonfile@npm:6.1.4" @@ -17183,7 +17275,7 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.3.12, @types/semver@npm:^7.3.4": +"@types/semver@npm:^7.3.4": version: 7.5.8 resolution: "@types/semver@npm:7.5.8" checksum: 10/3496808818ddb36deabfe4974fd343a78101fa242c4690044ccdc3b95dcf8785b494f5d628f2f47f38a702f8db9c53c67f47d7818f2be1b79f2efb09692e1178 @@ -17363,56 +17455,44 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^7.4.0": - version: 7.4.0 - resolution: "@typescript-eslint/eslint-plugin@npm:7.4.0" +"@typescript-eslint/eslint-plugin@npm:^8.1.6": + version: 8.16.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.16.0" dependencies: - "@eslint-community/regexpp": "npm:^4.5.1" - "@typescript-eslint/scope-manager": "npm:7.4.0" - "@typescript-eslint/type-utils": "npm:7.4.0" - "@typescript-eslint/utils": "npm:7.4.0" - "@typescript-eslint/visitor-keys": "npm:7.4.0" - debug: "npm:^4.3.4" + "@eslint-community/regexpp": "npm:^4.10.0" + "@typescript-eslint/scope-manager": "npm:8.16.0" + "@typescript-eslint/type-utils": "npm:8.16.0" + "@typescript-eslint/utils": "npm:8.16.0" + "@typescript-eslint/visitor-keys": "npm:8.16.0" graphemer: "npm:^1.4.0" - ignore: "npm:^5.2.4" + ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" - semver: "npm:^7.5.4" - ts-api-utils: "npm:^1.0.1" + ts-api-utils: "npm:^1.3.0" peerDependencies: - "@typescript-eslint/parser": ^7.0.0 - eslint: ^8.56.0 + "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10/9bd8852c7e4e9608c3fded94f7c60506cc7d2b6d8a8c1cad6d48969a7363751b20282874e55ccdf180635cf204cb10b3e1e5c3d1cff34d4fcd07762be3fc138e + checksum: 10/aa3d551d4f09940eee0c08328cb0db3a2391a8bba6d044f6bb38c51ac864896519c647d4b8fd99f7c094cc677bcf22454b27322014a08b2f2fb25695a43820db languageName: node linkType: hard -"@typescript-eslint/parser@npm:^7.4.0": - version: 7.4.0 - resolution: "@typescript-eslint/parser@npm:7.4.0" +"@typescript-eslint/parser@npm:^8.1.6": + version: 8.16.0 + resolution: "@typescript-eslint/parser@npm:8.16.0" dependencies: - "@typescript-eslint/scope-manager": "npm:7.4.0" - "@typescript-eslint/types": "npm:7.4.0" - "@typescript-eslint/typescript-estree": "npm:7.4.0" - "@typescript-eslint/visitor-keys": "npm:7.4.0" + "@typescript-eslint/scope-manager": "npm:8.16.0" + "@typescript-eslint/types": "npm:8.16.0" + "@typescript-eslint/typescript-estree": "npm:8.16.0" + "@typescript-eslint/visitor-keys": "npm:8.16.0" debug: "npm:^4.3.4" peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10/142a9e1187d305ed43b4fef659c36fa4e28359467198c986f0955c70b4067c9799f4c85d9881fbf099c55dfb265e30666e28b3ef290520e242b45ca7cb8e4ca9 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/scope-manager@npm:5.62.0" - dependencies: - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/visitor-keys": "npm:5.62.0" - checksum: 10/e827770baa202223bc0387e2fd24f630690809e460435b7dc9af336c77322290a770d62bd5284260fa881c86074d6a9fd6c97b07382520b115f6786b8ed499da + checksum: 10/ac1e2bfdbfe212da470bb17915b5228f7a6b027332b05eb8bcbbad440a81b2476c649e54e232084838e1edc005e6d7dc7a44899587d73672dd3d5484d9dbf9f8 languageName: node linkType: hard @@ -17426,37 +17506,30 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:7.4.0": - version: 7.4.0 - resolution: "@typescript-eslint/scope-manager@npm:7.4.0" +"@typescript-eslint/scope-manager@npm:8.16.0": + version: 8.16.0 + resolution: "@typescript-eslint/scope-manager@npm:8.16.0" dependencies: - "@typescript-eslint/types": "npm:7.4.0" - "@typescript-eslint/visitor-keys": "npm:7.4.0" - checksum: 10/8cf9292444f9731017a707cac34bef5ae0eb33b5cd42ed07fcd046e981d97889d9201d48e02f470f2315123f53771435e10b1dc81642af28a11df5352a8e8be2 + "@typescript-eslint/types": "npm:8.16.0" + "@typescript-eslint/visitor-keys": "npm:8.16.0" + checksum: 10/e0aea61f248b39049d4ce21c19f9c8af1a8024f4f92abc8c1d5b79ea65b013c6c4ff41efb92995050036aa95b6a705601917b56809d9ec1fbbab387054aeb269 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:7.4.0": - version: 7.4.0 - resolution: "@typescript-eslint/type-utils@npm:7.4.0" +"@typescript-eslint/type-utils@npm:8.16.0": + version: 8.16.0 + resolution: "@typescript-eslint/type-utils@npm:8.16.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:7.4.0" - "@typescript-eslint/utils": "npm:7.4.0" + "@typescript-eslint/typescript-estree": "npm:8.16.0" + "@typescript-eslint/utils": "npm:8.16.0" debug: "npm:^4.3.4" - ts-api-utils: "npm:^1.0.1" + ts-api-utils: "npm:^1.3.0" peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10/a8bd0929d8237679b2b8a7817f070a4b9658ee976882fba8ff37e4a70dd33f87793e1b157771104111fe8054eaa8ad437a010b6aa465072fbdb932647125db2d - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/types@npm:5.62.0" - checksum: 10/24e8443177be84823242d6729d56af2c4b47bfc664dd411a1d730506abf2150d6c31bdefbbc6d97c8f91043e3a50e0c698239dcb145b79bb6b0c34469aaf6c45 + checksum: 10/b91f6cef6af7e4f82a1dba9622d5ec9f46d1983eecfb88a1adbd310c7f980fedf5c8a198bfe968aae59fc386e4c437f55a7533988252eb9cbb0bdac8321e3dba languageName: node linkType: hard @@ -17467,28 +17540,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:7.4.0": - version: 7.4.0 - resolution: "@typescript-eslint/types@npm:7.4.0" - checksum: 10/2782c5bf65cd3dfa9cd32bc3023676bbca22144987c3f6c6b67fd96c73d4a60b85a57458c49fd11b9971ac6531824bb3ae0664491e7a6de25d80c523c9be92b7 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" - dependencies: - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/visitor-keys": "npm:5.62.0" - debug: "npm:^4.3.4" - globby: "npm:^11.1.0" - is-glob: "npm:^4.0.3" - semver: "npm:^7.3.7" - tsutils: "npm:^3.21.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10/06c975eb5f44b43bd19fadc2e1023c50cf87038fe4c0dd989d4331c67b3ff509b17fa60a3251896668ab4d7322bdc56162a9926971218d2e1a1874d2bef9a52e +"@typescript-eslint/types@npm:8.16.0": + version: 8.16.0 + resolution: "@typescript-eslint/types@npm:8.16.0" + checksum: 10/b37b26cd0e45b0cd6f7d492a07af583e4877d798495ab5fc1cfacb3c561b6d7981e3166f0475bb997e6c6d56ef903e160895174c7e63c08322dbb42d026cf7dc languageName: node linkType: hard @@ -17511,57 +17566,39 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:7.4.0": - version: 7.4.0 - resolution: "@typescript-eslint/typescript-estree@npm:7.4.0" +"@typescript-eslint/typescript-estree@npm:8.16.0": + version: 8.16.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.16.0" dependencies: - "@typescript-eslint/types": "npm:7.4.0" - "@typescript-eslint/visitor-keys": "npm:7.4.0" + "@typescript-eslint/types": "npm:8.16.0" + "@typescript-eslint/visitor-keys": "npm:8.16.0" debug: "npm:^4.3.4" - globby: "npm:^11.1.0" + fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" - minimatch: "npm:9.0.3" - semver: "npm:^7.5.4" - ts-api-utils: "npm:^1.0.1" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^1.3.0" peerDependenciesMeta: typescript: optional: true - checksum: 10/162ec9d7582f45588342e1be36fdb60e41f50bbdfbc3035c91b517ff5d45244f776921c88d88e543e1c7d0f1e6ada5474a8316b78f1b0e6d2233b101bc45b166 + checksum: 10/823cf55d331cf7283547a2860a5d7bfd7dbd497be6e87b226dd7456b36db214de1504855afbbaef8d89932c11a1e589d4cb2a4093b6f1c542a4ce8319d988006 languageName: node linkType: hard -"@typescript-eslint/utils@npm:7.4.0": - version: 7.4.0 - resolution: "@typescript-eslint/utils@npm:7.4.0" +"@typescript-eslint/utils@npm:8.16.0, @typescript-eslint/utils@npm:^8.8.1": + version: 8.16.0 + resolution: "@typescript-eslint/utils@npm:8.16.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@types/json-schema": "npm:^7.0.12" - "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:7.4.0" - "@typescript-eslint/types": "npm:7.4.0" - "@typescript-eslint/typescript-estree": "npm:7.4.0" - semver: "npm:^7.5.4" - peerDependencies: - eslint: ^8.56.0 - checksum: 10/ffed27e770c486cd000ff892d9049b0afe8b9d6318452a5355b78a37436cbb414bceacae413a2ac813f3e584684825d5e0baa2e6376b7ad6013a108ac91bc19d - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:^5.45.0": - version: 5.62.0 - resolution: "@typescript-eslint/utils@npm:5.62.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.2.0" - "@types/json-schema": "npm:^7.0.9" - "@types/semver": "npm:^7.3.12" - "@typescript-eslint/scope-manager": "npm:5.62.0" - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/typescript-estree": "npm:5.62.0" - eslint-scope: "npm:^5.1.1" - semver: "npm:^7.3.7" + "@typescript-eslint/scope-manager": "npm:8.16.0" + "@typescript-eslint/types": "npm:8.16.0" + "@typescript-eslint/typescript-estree": "npm:8.16.0" peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10/15ef13e43998a082b15f85db979f8d3ceb1f9ce4467b8016c267b1738d5e7cdb12aa90faf4b4e6dd6486c236cf9d33c463200465cf25ff997dbc0f12358550a1 + eslint: ^8.57.0 || ^9.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/80ba35b97a8e80ac2b54a56ac041b4f4583328d764e1693e7d3750de383cbcefcb7e838b75e550e8aa4df446f4b41460da6dc83543517280a4e3a61546c1a8dc languageName: node linkType: hard @@ -17582,16 +17619,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" - dependencies: - "@typescript-eslint/types": "npm:5.62.0" - eslint-visitor-keys: "npm:^3.3.0" - checksum: 10/dc613ab7569df9bbe0b2ca677635eb91839dfb2ca2c6fa47870a5da4f160db0b436f7ec0764362e756d4164e9445d49d5eb1ff0b87f4c058946ae9d8c92eb388 - languageName: node - linkType: hard - "@typescript-eslint/visitor-keys@npm:6.21.0": version: 6.21.0 resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" @@ -17602,20 +17629,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:7.4.0": - version: 7.4.0 - resolution: "@typescript-eslint/visitor-keys@npm:7.4.0" +"@typescript-eslint/visitor-keys@npm:8.16.0": + version: 8.16.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.16.0" dependencies: - "@typescript-eslint/types": "npm:7.4.0" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10/70dc99f2ad116c6e2d9e55af249e4453e06bba2ceea515adef2d2e86e97e557865bb1b1d467667462443eb0d624baba36f7442fd1082f3874339bbc381c26e93 - languageName: node - linkType: hard - -"@ungap/structured-clone@npm:^1.2.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 10/c6fe89a505e513a7592e1438280db1c075764793a2397877ff1351721fe8792a966a5359769e30242b3cd023f2efb9e63ca2ca88019d73b564488cc20e3eab12 + "@typescript-eslint/types": "npm:8.16.0" + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10/e3f231a3e8ca2f7a3dc0e9ebdc3ea1f51a377b1285727413b4c89c44dbfaf342f2574b1b4e7f478f295963045a6058e27b4827816fe2a5a2d09f565eb68522c7 languageName: node linkType: hard @@ -18485,7 +18505,16 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.4.1, acorn@npm:^8.9.0": +"acorn@npm:^8.14.0": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" + bin: + acorn: bin/acorn + checksum: 10/6df29c35556782ca9e632db461a7f97947772c6c1d5438a81f0c873a3da3a792487e83e404d1c6c25f70513e91aa18745f6eafb1fcc3a43ecd1920b21dd173d2 + languageName: node + linkType: hard + +"acorn@npm:^8.4.1": version: 8.11.3 resolution: "acorn@npm:8.11.3" bin: @@ -18998,7 +19027,21 @@ __metadata: languageName: node linkType: hard -"array.prototype.flat@npm:^1.2.3, array.prototype.flat@npm:^1.3.1": +"array.prototype.findlastindex@npm:^1.2.5": + version: 1.2.5 + resolution: "array.prototype.findlastindex@npm:1.2.5" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10/7c5c821f357cd53ab6cc305de8086430dd8d7a2485db87b13f843e868055e9582b1fd338f02338f67fc3a1603ceaf9610dd2a470b0b506f9d18934780f95b246 + languageName: node + linkType: hard + +"array.prototype.flat@npm:^1.2.3, array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.2": version: 1.3.2 resolution: "array.prototype.flat@npm:1.3.2" dependencies: @@ -21442,7 +21485,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" dependencies: @@ -21453,6 +21496,17 @@ __metadata: languageName: node linkType: hard +"cross-spawn@npm:^7.0.5": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10/0d52657d7ae36eb130999dffff1168ec348687b48dd38e2ff59992ed916c88d328cf1d07ff4a4a10bc78de5e1c23f04b306d569e42f7a2293915c081e4dfee86 + languageName: node + linkType: hard + "crossws@npm:>=0.2.0 <0.4.0": version: 0.3.1 resolution: "crossws@npm:0.3.1" @@ -21658,7 +21712,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.1.0": +"debug@npm:^3.1.0, debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -21667,7 +21721,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:~4.3.1, debug@npm:~4.3.2": +"debug@npm:^4.3.5, debug@npm:~4.3.1, debug@npm:~4.3.2": version: 4.3.7 resolution: "debug@npm:4.3.7" dependencies: @@ -22465,6 +22519,16 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^5.15.0": + version: 5.17.1 + resolution: "enhanced-resolve@npm:5.17.1" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10/e8e03cb7a4bf3c0250a89afbd29e5ec20e90ba5fcd026066232a0754864d7d0a393fa6fc0e5379314a6529165a1834b36731147080714459d98924520410d8f5 + languageName: node + linkType: hard + "enquirer@npm:^2.3.0": version: 2.3.6 resolution: "enquirer@npm:2.3.6" @@ -23354,6 +23418,83 @@ __metadata: languageName: node linkType: hard +"eslint-import-resolver-node@npm:^0.3.9": + version: 0.3.9 + resolution: "eslint-import-resolver-node@npm:0.3.9" + dependencies: + debug: "npm:^3.2.7" + is-core-module: "npm:^2.13.0" + resolve: "npm:^1.22.4" + checksum: 10/d52e08e1d96cf630957272e4f2644dcfb531e49dcfd1edd2e07e43369eb2ec7a7d4423d417beee613201206ff2efa4eb9a582b5825ee28802fc7c71fcd53ca83 + languageName: node + linkType: hard + +"eslint-import-resolver-typescript@npm:^3.6.3": + version: 3.6.3 + resolution: "eslint-import-resolver-typescript@npm:3.6.3" + dependencies: + "@nolyfill/is-core-module": "npm:1.0.39" + debug: "npm:^4.3.5" + enhanced-resolve: "npm:^5.15.0" + eslint-module-utils: "npm:^2.8.1" + fast-glob: "npm:^3.3.2" + get-tsconfig: "npm:^4.7.5" + is-bun-module: "npm:^1.0.2" + is-glob: "npm:^4.0.3" + peerDependencies: + eslint: "*" + eslint-plugin-import: "*" + eslint-plugin-import-x: "*" + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + checksum: 10/5f9956dbbd0becc3d6c6cb945dad0e5e6f529cfd0f488d5688f3c59840cd7f4a44ab6aee0f54b5c4188134dab9a01cb63c1201767bde7fc330b7c1a14747f8ac + languageName: node + linkType: hard + +"eslint-module-utils@npm:^2.12.0, eslint-module-utils@npm:^2.8.1": + version: 2.12.0 + resolution: "eslint-module-utils@npm:2.12.0" + dependencies: + debug: "npm:^3.2.7" + peerDependenciesMeta: + eslint: + optional: true + checksum: 10/dd27791147eca17366afcb83f47d6825b6ce164abb256681e5de4ec1d7e87d8605641eb869298a0dbc70665e2446dbcc2f40d3e1631a9475dd64dd23d4ca5dee + languageName: node + linkType: hard + +"eslint-plugin-import@npm:^2.31.0": + version: 2.31.0 + resolution: "eslint-plugin-import@npm:2.31.0" + dependencies: + "@rtsao/scc": "npm:^1.1.0" + array-includes: "npm:^3.1.8" + array.prototype.findlastindex: "npm:^1.2.5" + array.prototype.flat: "npm:^1.3.2" + array.prototype.flatmap: "npm:^1.3.2" + debug: "npm:^3.2.7" + doctrine: "npm:^2.1.0" + eslint-import-resolver-node: "npm:^0.3.9" + eslint-module-utils: "npm:^2.12.0" + hasown: "npm:^2.0.2" + is-core-module: "npm:^2.15.1" + is-glob: "npm:^4.0.3" + minimatch: "npm:^3.1.2" + object.fromentries: "npm:^2.0.8" + object.groupby: "npm:^1.0.3" + object.values: "npm:^1.2.0" + semver: "npm:^6.3.1" + string.prototype.trimend: "npm:^1.0.8" + tsconfig-paths: "npm:^3.15.0" + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + checksum: 10/6b76bd009ac2db0615d9019699d18e2a51a86cb8c1d0855a35fb1b418be23b40239e6debdc6e8c92c59f1468ed0ea8d7b85c817117a113d5cc225be8a02ad31c + languageName: node + linkType: hard + "eslint-plugin-jest@npm:^28.2.0": version: 28.2.0 resolution: "eslint-plugin-jest@npm:28.2.0" @@ -23409,37 +23550,26 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-storybook@npm:^0.6.15": - version: 0.6.15 - resolution: "eslint-plugin-storybook@npm:0.6.15" +"eslint-plugin-storybook@npm:^0.11.1": + version: 0.11.1 + resolution: "eslint-plugin-storybook@npm:0.11.1" dependencies: - "@storybook/csf": "npm:^0.0.1" - "@typescript-eslint/utils": "npm:^5.45.0" - requireindex: "npm:^1.1.0" + "@storybook/csf": "npm:^0.1.11" + "@typescript-eslint/utils": "npm:^8.8.1" ts-dedent: "npm:^2.2.0" peerDependencies: eslint: ">=6" - checksum: 10/0c278594c8474ce2f176ffc6610240ae9d6c8f9dafbff02be61e6ae05f15081ce858c5b16e64d8995a3a3777c9d1725953fcde4312efab9118aa544a75b27c46 + checksum: 10/3a8757e403227665566a9ee35a735bf72529a8eb2d6ba270c99e6df140601984b43e7fcf274ebee601fe3d946c76edfeefcce4200077da53edc26212ba5bd03c languageName: node linkType: hard -"eslint-scope@npm:^5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: "npm:^4.3.0" - estraverse: "npm:^4.1.1" - checksum: 10/c541ef384c92eb5c999b7d3443d80195fcafb3da335500946f6db76539b87d5826c8f2e1d23bf6afc3154ba8cd7c8e566f8dc00f1eea25fdf3afc8fb9c87b238 - languageName: node - linkType: hard - -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" +"eslint-scope@npm:^8.2.0": + version: 8.2.0 + resolution: "eslint-scope@npm:8.2.0" dependencies: esrecurse: "npm:^4.3.0" estraverse: "npm:^5.2.0" - checksum: 10/5c660fb905d5883ad018a6fea2b49f3cb5b1cbf2cd4bd08e98646e9864f9bc2c74c0839bed2d292e90a4a328833accc197c8f0baed89cbe8d605d6f918465491 + checksum: 10/cd9ab60d5a68f3a0fcac04d1cff5a7383d0f331964d5f1c446259123caec5b3ccc542284d07846e4f4d1389da77750821cc9a6e1ce18558c674977351666f9a6 languageName: node linkType: hard @@ -23457,69 +23587,70 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.4.3": - version: 3.4.3 - resolution: "eslint-visitor-keys@npm:3.4.3" - checksum: 10/3f357c554a9ea794b094a09bd4187e5eacd1bc0d0653c3adeb87962c548e6a1ab8f982b86963ae1337f5d976004146536dcee5d0e2806665b193fbfbf1a9231b +"eslint-visitor-keys@npm:^4.2.0": + version: 4.2.0 + resolution: "eslint-visitor-keys@npm:4.2.0" + checksum: 10/9651b3356b01760e586b4c631c5268c0e1a85236e3292bf754f0472f465bf9a856c0ddc261fceace155334118c0151778effafbab981413dbf9288349343fa25 languageName: node linkType: hard -"eslint@npm:^8.57.0": - version: 8.57.0 - resolution: "eslint@npm:8.57.0" +"eslint@npm:^9.15.0": + version: 9.15.0 + resolution: "eslint@npm:9.15.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.6.1" - "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.57.0" - "@humanwhocodes/config-array": "npm:^0.11.14" + "@eslint-community/regexpp": "npm:^4.12.1" + "@eslint/config-array": "npm:^0.19.0" + "@eslint/core": "npm:^0.9.0" + "@eslint/eslintrc": "npm:^3.2.0" + "@eslint/js": "npm:9.15.0" + "@eslint/plugin-kit": "npm:^0.2.3" + "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" - "@nodelib/fs.walk": "npm:^1.2.8" - "@ungap/structured-clone": "npm:^1.2.0" + "@humanwhocodes/retry": "npm:^0.4.1" + "@types/estree": "npm:^1.0.6" + "@types/json-schema": "npm:^7.0.15" ajv: "npm:^6.12.4" chalk: "npm:^4.0.0" - cross-spawn: "npm:^7.0.2" + cross-spawn: "npm:^7.0.5" debug: "npm:^4.3.2" - doctrine: "npm:^3.0.0" escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^7.2.2" - eslint-visitor-keys: "npm:^3.4.3" - espree: "npm:^9.6.1" - esquery: "npm:^1.4.2" + eslint-scope: "npm:^8.2.0" + eslint-visitor-keys: "npm:^4.2.0" + espree: "npm:^10.3.0" + esquery: "npm:^1.5.0" esutils: "npm:^2.0.2" fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^6.0.1" + file-entry-cache: "npm:^8.0.0" find-up: "npm:^5.0.0" glob-parent: "npm:^6.0.2" - globals: "npm:^13.19.0" - graphemer: "npm:^1.4.0" ignore: "npm:^5.2.0" imurmurhash: "npm:^0.1.4" is-glob: "npm:^4.0.0" - is-path-inside: "npm:^3.0.3" - js-yaml: "npm:^4.1.0" json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.4.1" lodash.merge: "npm:^4.6.2" minimatch: "npm:^3.1.2" natural-compare: "npm:^1.4.0" optionator: "npm:^0.9.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true bin: eslint: bin/eslint.js - checksum: 10/00496e218b23747a7a9817bf58b522276d0dc1f2e546dceb4eea49f9871574088f72f1f069a6b560ef537efa3a75261b8ef70e51ef19033da1cc4c86a755ef15 + checksum: 10/7ac1a2e6070bae64b2b0588fabad528cd3e478a6ba5e9f8185d8d9f2dce17a36630bd019b5d32d1052ea177444ab9c83f3c08baa76121c13e1ed0584ef158956 languageName: node linkType: hard -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" +"espree@npm:^10.0.1, espree@npm:^10.3.0": + version: 10.3.0 + resolution: "espree@npm:10.3.0" dependencies: - acorn: "npm:^8.9.0" + acorn: "npm:^8.14.0" acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10/255ab260f0d711a54096bdeda93adff0eadf02a6f9b92f02b323e83a2b7fc258797919437ad331efec3930475feb0142c5ecaaf3cdab4befebd336d47d3f3134 + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10/3412d44d4204c9e29d6b5dd0277400cfa0cd68495dc09eae1b9ce79d0c8985c1c5cc09cb9ba32a1cd963f48a49b0c46bdb7736afe395a300aa6bb1c0d86837e8 languageName: node linkType: hard @@ -23543,12 +23674,12 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.2": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" +"esquery@npm:^1.5.0": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" dependencies: estraverse: "npm:^5.1.0" - checksum: 10/e65fcdfc1e0ff5effbf50fb4f31ea20143ae5df92bb2e4953653d8d40aa4bc148e0d06117a592ce4ea53eeab1dafdfded7ea7e22a5be87e82d73757329a1b01d + checksum: 10/c587fb8ec9ed83f2b1bc97cf2f6854cc30bf784a79d62ba08c6e358bf22280d69aee12827521cf38e69ae9761d23fb7fde593ce315610f85655c139d99b05e5a languageName: node linkType: hard @@ -23568,13 +23699,6 @@ __metadata: languageName: node linkType: hard -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: 10/3f67ad02b6dbfaddd9ea459cf2b6ef4ecff9a6082a7af9d22e445b9abc082ad9ca47e1825557b293fcdae477f4714e561123e30bb6a5b2f184fb2bad4a9497eb - languageName: node - linkType: hard - "estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": version: 5.3.0 resolution: "estraverse@npm:5.3.0" @@ -24285,7 +24409,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.3.0": +"fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2": version: 3.3.2 resolution: "fast-glob@npm:3.3.2" dependencies: @@ -24396,12 +24520,12 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" dependencies: - flat-cache: "npm:^3.0.4" - checksum: 10/099bb9d4ab332cb93c48b14807a6918a1da87c45dce91d4b61fd40e6505d56d0697da060cb901c729c90487067d93c9243f5da3dc9c41f0358483bfdebca736b + flat-cache: "npm:^4.0.0" + checksum: 10/afe55c4de4e0d226a23c1eae62a7219aafb390859122608a89fa4df6addf55c7fd3f1a2da6f5b41e7cdff496e4cf28bbd215d53eab5c817afa96d2b40c81bfb0 languageName: node linkType: hard @@ -24557,13 +24681,13 @@ __metadata: languageName: node linkType: hard -"flat-cache@npm:^3.0.4": - version: 3.0.4 - resolution: "flat-cache@npm:3.0.4" +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" dependencies: - flatted: "npm:^3.1.0" - rimraf: "npm:^3.0.2" - checksum: 10/9fe5d0cb97c988e3b25242e71346965fae22757674db3fca14206850af2efa3ca3b04a3ba0eba8d5e20fd8a3be80a2e14b1c2917e70ffe1acb98a8c3327e4c9f + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.4" + checksum: 10/58ce851d9045fffc7871ce2bd718bc485ad7e777bf748c054904b87c351ff1080c2c11da00788d78738bfb51b71e4d5ea12d13b98eb36e3358851ffe495b62dc languageName: node linkType: hard @@ -24576,10 +24700,10 @@ __metadata: languageName: node linkType: hard -"flatted@npm:^3.1.0": - version: 3.2.5 - resolution: "flatted@npm:3.2.5" - checksum: 10/eed01f72ad0317561e4d6187f7408dc391f7849d9cd6700520ce06155d1859539b6899afdfefc815ce51ec48f97d1015350287c541b5302a49581cf25cec1cd2 +"flatted@npm:^3.2.9": + version: 3.3.2 + resolution: "flatted@npm:3.3.2" + checksum: 10/ac3c159742e01d0e860a861164bcfd35bb567ccbebb8a0dd041e61cf3c64a435b917dd1e7ed1c380c2ebca85735fb16644485ec33665bc6aafc3b316aa1eed44 languageName: node linkType: hard @@ -25520,19 +25644,10 @@ __metadata: languageName: node linkType: hard -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 10/9f054fa38ff8de8fa356502eb9d2dae0c928217b8b5c8de1f09f5c9b6c8a96d8b9bd3afc49acbcd384a98a81fea713c859e1b09e214c60509517bb8fc2bc13c2 - languageName: node - linkType: hard - -"globals@npm:^13.19.0": - version: 13.20.0 - resolution: "globals@npm:13.20.0" - dependencies: - type-fest: "npm:^0.20.2" - checksum: 10/9df85cde2f0dce6ac9b3a5e08bec109d2f3b38ddd055a83867e0672c55704866d53ce6a4265859fa630624baadd46f50ca38602a13607ad86be853a8c179d3e7 +"globals@npm:^14.0.0": + version: 14.0.0 + resolution: "globals@npm:14.0.0" + checksum: 10/03939c8af95c6df5014b137cac83aa909090c3a3985caef06ee9a5a669790877af8698ab38007e4c0186873adc14c0b13764acc754b16a754c216cc56aa5f021 languageName: node linkType: hard @@ -26528,6 +26643,13 @@ __metadata: languageName: node linkType: hard +"ignore@npm:^5.3.1": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10/cceb6a457000f8f6a50e1196429750d782afce5680dd878aa4221bd79972d68b3a55b4b1458fc682be978f4d3c6a249046aa0880637367216444ab7b014cfc98 + languageName: node + linkType: hard + "immediate@npm:^3.2.3": version: 3.3.0 resolution: "immediate@npm:3.3.0" @@ -26810,6 +26932,15 @@ __metadata: languageName: node linkType: hard +"is-bun-module@npm:^1.0.2": + version: 1.2.1 + resolution: "is-bun-module@npm:1.2.1" + dependencies: + semver: "npm:^7.6.3" + checksum: 10/1c2cbcf1a76991add1b640d2d7fe09848e8697a76f96e1289dff44133a48c97f5dc601d4a66d3f3a86217a77178d72d33d10d0c9e14194e58e70ec8df3eae41a + languageName: node + linkType: hard + "is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.4": version: 1.2.4 resolution: "is-callable@npm:1.2.4" @@ -26855,6 +26986,15 @@ __metadata: languageName: node linkType: hard +"is-core-module@npm:^2.15.1": + version: 2.15.1 + resolution: "is-core-module@npm:2.15.1" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10/77316d5891d5743854bcef2cd2f24c5458fb69fbc9705c12ca17d54a2017a67d0693bbf1ba8c77af376c0eef6bf6d1b27a4ab08e4db4e69914c3789bdf2ceec5 + languageName: node + linkType: hard + "is-core-module@npm:^2.8.1": version: 2.9.0 resolution: "is-core-module@npm:2.9.0" @@ -27085,7 +27225,7 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^3.0.2, is-path-inside@npm:^3.0.3": +"is-path-inside@npm:^3.0.2": version: 3.0.3 resolution: "is-path-inside@npm:3.0.3" checksum: 10/abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 @@ -28267,6 +28407,17 @@ __metadata: languageName: node linkType: hard +"json5@npm:^1.0.2": + version: 1.0.2 + resolution: "json5@npm:1.0.2" + dependencies: + minimist: "npm:^1.2.0" + bin: + json5: lib/cli.js + checksum: 10/a78d812dbbd5642c4f637dd130954acfd231b074965871c3e28a5bbd571f099d623ecf9161f1960c4ddf68e0cc98dee8bebfdb94a71ad4551f85a1afc94b63f6 + languageName: node + linkType: hard + "json5@npm:^2.1.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" @@ -28430,7 +28581,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.3": +"keyv@npm:^4.5.3, keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -30836,6 +30987,17 @@ __metadata: languageName: node linkType: hard +"object.groupby@npm:^1.0.3": + version: 1.0.3 + resolution: "object.groupby@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + checksum: 10/44cb86dd2c660434be65f7585c54b62f0425b0c96b5c948d2756be253ef06737da7e68d7106e35506ce4a44d16aa85a413d11c5034eb7ce5579ec28752eb42d0 + languageName: node + linkType: hard + "object.values@npm:^1.1.6, object.values@npm:^1.2.0": version: 1.2.0 resolution: "object.values@npm:1.2.0" @@ -33280,13 +33442,6 @@ __metadata: languageName: node linkType: hard -"requireindex@npm:^1.1.0": - version: 1.2.0 - resolution: "requireindex@npm:1.2.0" - checksum: 10/266d1cb31f6cbc4b6cf2e898f5bbc45581f7919bcf61bba5c45d0adb69b722b9ff5a13727be3350cde4520d7cd37f39df45d58a29854baaa4552cd6b05ae4a1a - languageName: node - linkType: hard - "resolve-alpn@npm:^1.2.0": version: 1.2.1 resolution: "resolve-alpn@npm:1.2.1" @@ -33367,7 +33522,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.2, resolve@npm:^1.22.8": +"resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.2, resolve@npm:^1.22.4, resolve@npm:^1.22.8": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -33422,7 +33577,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": +"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -34062,7 +34217,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.8, semver@npm:^7.5.0, semver@npm:^7.5.1": +"semver@npm:^7.3.8, semver@npm:^7.5.0, semver@npm:^7.5.1, semver@npm:^7.6.0, semver@npm:^7.6.3": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: @@ -35694,6 +35849,13 @@ __metadata: languageName: node linkType: hard +"tapable@npm:^2.2.0": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: 10/1769336dd21481ae6347611ca5fca47add0962fd8e80466515032125eca0084a4f0ede11e65341b9c0018ef4e1cf1ad820adbb0fba7cc99865c6005734000b0a + languageName: node + linkType: hard + "tar-fs@npm:^2.0.0, tar-fs@npm:^2.1.1": version: 2.1.1 resolution: "tar-fs@npm:2.1.1" @@ -36089,6 +36251,15 @@ __metadata: languageName: node linkType: hard +"ts-api-utils@npm:^1.3.0": + version: 1.4.1 + resolution: "ts-api-utils@npm:1.4.1" + peerDependencies: + typescript: ">=4.2.0" + checksum: 10/2f32698ed1c06e57d934704ff2579a905895441ef0a29f732242d3d3f651abd5d09610f702c656e85b73457582a1ded43adeef82e9f6d665ae0fb66497cf39f6 + languageName: node + linkType: hard + "ts-command-line-args@npm:^2.2.0": version: 2.3.1 resolution: "ts-command-line-args@npm:2.3.1" @@ -36223,7 +36394,19 @@ __metadata: languageName: node linkType: hard -"tslib@npm:1.14.1, tslib@npm:^1.11.1, tslib@npm:^1.13.0, tslib@npm:^1.8.1, tslib@npm:^1.9.0, tslib@npm:^1.9.3": +"tsconfig-paths@npm:^3.15.0": + version: 3.15.0 + resolution: "tsconfig-paths@npm:3.15.0" + dependencies: + "@types/json5": "npm:^0.0.29" + json5: "npm:^1.0.2" + minimist: "npm:^1.2.6" + strip-bom: "npm:^3.0.0" + checksum: 10/2041beaedc6c271fc3bedd12e0da0cc553e65d030d4ff26044b771fac5752d0460944c0b5e680f670c2868c95c664a256cec960ae528888db6ded83524e33a14 + languageName: node + linkType: hard + +"tslib@npm:1.14.1, tslib@npm:^1.11.1, tslib@npm:^1.13.0, tslib@npm:^1.9.0, tslib@npm:^1.9.3": version: 1.14.1 resolution: "tslib@npm:1.14.1" checksum: 10/7dbf34e6f55c6492637adb81b555af5e3b4f9cc6b998fb440dac82d3b42bdc91560a35a5fb75e20e24a076c651438234da6743d139e4feabf0783f3cdfe1dddb @@ -36272,17 +36455,6 @@ __metadata: languageName: node linkType: hard -"tsutils@npm:^3.21.0": - version: 3.21.0 - resolution: "tsutils@npm:3.21.0" - dependencies: - tslib: "npm:^1.8.1" - peerDependencies: - typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - checksum: 10/ea036bec1dd024e309939ffd49fda7a351c0e87a1b8eb049570dd119d447250e2c56e0e6c00554e8205760e7417793fdebff752a46e573fbe07d4f375502a5b2 - languageName: node - linkType: hard - "tsx@npm:^4.19.1": version: 4.19.1 resolution: "tsx@npm:4.19.1" From e32ee592d791ddf2780d4dd7df7884b956aae8c8 Mon Sep 17 00:00:00 2001 From: J M Rossy Date: Tue, 26 Nov 2024 16:23:23 -0500 Subject: [PATCH 09/18] chore: Setup Syncpack (#4902) ### Description - Setup Syncpack which can check for package version inconsistencies across the monorepo - Run `yarn syncpack fix-mismatches` to fix existing issues ### Backward compatibility Yes --- .github/workflows/test.yml | 4 + .syncpackrc | 3 + package.json | 3 +- solidity/package.json | 4 +- typescript/ccip-server/package.json | 6 +- typescript/cli/package.json | 4 +- typescript/cli/src/utils/input.ts | 7 +- typescript/github-proxy/package.json | 2 +- typescript/helloworld/package.json | 2 +- typescript/infra/package.json | 18 +- .../funding/fund-keys-from-deployer.ts | 6 +- typescript/sdk/package.json | 8 +- typescript/utils/package.json | 2 +- typescript/widgets/package.json | 4 +- yarn.lock | 2128 ++++------------- 15 files changed, 547 insertions(+), 1654 deletions(-) create mode 100644 .syncpackrc diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f46b984ec..664f93612 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -54,6 +54,10 @@ jobs: exit 1 fi + # Check for mismatched dep versions across the monorepo + - name: syncpack + run: yarn syncpack list-mismatches + lint-prettier: runs-on: ubuntu-latest needs: [yarn-install] diff --git a/.syncpackrc b/.syncpackrc new file mode 100644 index 000000000..7c4fd6c9d --- /dev/null +++ b/.syncpackrc @@ -0,0 +1,3 @@ +{ + "dependencyTypes": ["prod", "dev"] +} \ No newline at end of file diff --git a/package.json b/package.json index ca00bcd3c..92d5b4b5d 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "husky": "^8.0.0", "lint-staged": "^12.4.3", "prettier": "^2.8.8", - "tsx": "^4.7.1" + "syncpack": "^13.0.0", + "tsx": "^4.19.1" }, "dependencies": { "@changesets/cli": "^2.26.2" diff --git a/solidity/package.json b/solidity/package.json index 3133af171..d56a148a3 100644 --- a/solidity/package.json +++ b/solidity/package.json @@ -8,7 +8,7 @@ "@hyperlane-xyz/utils": "7.1.0", "@layerzerolabs/lz-evm-oapp-v2": "2.0.2", "@openzeppelin/contracts": "^4.9.3", - "@openzeppelin/contracts-upgradeable": "^v4.9.3", + "@openzeppelin/contracts-upgradeable": "^4.9.3", "fx-portal": "^1.0.3" }, "devDependencies": { @@ -19,7 +19,7 @@ "@typechain/ethers-v6": "^0.5.1", "@typechain/hardhat": "^9.1.0", "@types/node": "^18.14.5", - "chai": "4.5.0", + "chai": "^4.5.0", "ethereum-waffle": "^4.0.10", "ethers": "^5.7.2", "hardhat": "^2.22.2", diff --git a/typescript/ccip-server/package.json b/typescript/ccip-server/package.json index 7920161da..58e7a3e55 100644 --- a/typescript/ccip-server/package.json +++ b/typescript/ccip-server/package.json @@ -23,19 +23,19 @@ "license": "Apache-2.0", "devDependencies": { "@jest/globals": "^29.7.0", - "@types/node": "^16.9.1", + "@types/node": "^18.14.5", "eslint": "^9.15.0", "jest": "^29.7.0", "nodemon": "^3.0.3", "prettier": "^2.8.8", "ts-jest": "^29.1.2", "ts-node": "^10.8.0", - "tsx": "^4.7.1", + "tsx": "^4.19.1", "typescript": "5.3.3" }, "dependencies": { "@chainlink/ccip-read-server": "^0.2.1", "dotenv-flow": "^4.1.0", - "ethers": "5.7.2" + "ethers": "^5.7.2" } } diff --git a/typescript/cli/package.json b/typescript/cli/package.json index 882642198..5b6765de3 100644 --- a/typescript/cli/package.json +++ b/typescript/cli/package.json @@ -10,7 +10,7 @@ "@hyperlane-xyz/utils": "7.1.0", "@inquirer/core": "9.0.10", "@inquirer/figures": "1.0.5", - "@inquirer/prompts": "^3.0.0", + "@inquirer/prompts": "3.3.2", "ansi-escapes": "^7.0.0", "asn1.js": "^5.4.1", "bignumber.js": "^9.1.1", @@ -18,7 +18,7 @@ "ethers": "^5.7.2", "latest-version": "^8.0.0", "terminal-link": "^3.0.0", - "tsx": "^4.7.1", + "tsx": "^4.19.1", "yaml": "2.4.5", "yargs": "^17.7.2", "zod": "^3.21.2", diff --git a/typescript/cli/src/utils/input.ts b/typescript/cli/src/utils/input.ts index 1466fe692..eb197c1ac 100644 --- a/typescript/cli/src/utils/input.ts +++ b/typescript/cli/src/utils/input.ts @@ -14,7 +14,7 @@ import { } from '@inquirer/core'; import figures from '@inquirer/figures'; import { KeypressEvent, confirm, input, isSpaceKey } from '@inquirer/prompts'; -import type { PartialDeep } from '@inquirer/type'; +import type { PartialDeep, Prompt } from '@inquirer/type'; import ansiEscapes from 'ansi-escapes'; import chalk from 'chalk'; @@ -464,7 +464,10 @@ function isDownKey(key: KeypressEvent): boolean { return key.name === 'down'; } -export const searchableCheckBox = createPrompt( +export const searchableCheckBox: Prompt< + any, + SearchableCheckboxConfig +> = createPrompt( ( config: SearchableCheckboxConfig, done: (value: Array) => void, diff --git a/typescript/github-proxy/package.json b/typescript/github-proxy/package.json index 1536432c7..b6604be0e 100644 --- a/typescript/github-proxy/package.json +++ b/typescript/github-proxy/package.json @@ -27,7 +27,7 @@ "@cloudflare/vitest-pool-workers": "^0.4.5", "@cloudflare/workers-types": "^4.20240821.1", "@faker-js/faker": "^8.4.1", - "chai": "4.5.0", + "chai": "^4.5.0", "prettier": "^2.8.8", "typescript": "5.3.3", "vitest": "1.4.0", diff --git a/typescript/helloworld/package.json b/typescript/helloworld/package.json index 8d8005181..964795370 100644 --- a/typescript/helloworld/package.json +++ b/typescript/helloworld/package.json @@ -19,7 +19,7 @@ "@typechain/hardhat": "^9.1.0", "@typescript-eslint/eslint-plugin": "^8.1.6", "@typescript-eslint/parser": "^8.1.6", - "chai": "4.5.0", + "chai": "^4.5.0", "eslint": "^9.15.0", "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-typescript": "^3.6.3", diff --git a/typescript/infra/package.json b/typescript/infra/package.json index b4fc7948e..400bb1154 100644 --- a/typescript/infra/package.json +++ b/typescript/infra/package.json @@ -3,27 +3,27 @@ "description": "Infrastructure utilities for the Hyperlane Network", "version": "7.1.0", "dependencies": { - "@arbitrum/sdk": "^3.0.0", + "@arbitrum/sdk": "^4.0.0", "@aws-sdk/client-iam": "^3.74.0", - "@aws-sdk/client-kms": "3.48.0", - "@aws-sdk/client-s3": "^3.74.0", + "@aws-sdk/client-kms": "^3.577.0", + "@aws-sdk/client-s3": "^3.577.0", "@cosmjs/amino": "^0.32.4", "@eth-optimism/sdk": "^3.1.6", "@ethersproject/experimental": "^5.7.0", "@ethersproject/hardware-wallets": "^5.7.0", - "@ethersproject/providers": "^5.7.2", + "@ethersproject/providers": "*", "@google-cloud/secret-manager": "^5.5.0", "@hyperlane-xyz/helloworld": "7.1.0", "@hyperlane-xyz/registry": "6.1.0", "@hyperlane-xyz/sdk": "7.1.0", "@hyperlane-xyz/utils": "7.1.0", - "@inquirer/prompts": "^5.3.8", + "@inquirer/prompts": "3.3.2", "@nomiclabs/hardhat-etherscan": "^3.0.3", "@safe-global/api-kit": "1.3.0", "@safe-global/protocol-kit": "1.3.0", "@safe-global/safe-core-sdk-types": "2.3.0", "@solana/web3.js": "^1.95.4", - "asn1.js": "5.4.1", + "asn1.js": "^5.4.1", "aws-kms-ethers-signer": "^0.1.3", "deep-object-diff": "^1.1.9", "dotenv": "^10.0.0", @@ -39,17 +39,17 @@ "@types/chai": "^4.2.21", "@types/json-stable-stringify": "^1.0.36", "@types/mocha": "^10.0.1", - "@types/node": "^16.9.1", + "@types/node": "^18.14.5", "@types/prompts": "^2.0.14", "@types/sinon-chai": "^3.2.12", "@types/yargs": "^17.0.24", - "chai": "4.5.0", + "chai": "^4.5.0", "ethereum-waffle": "^4.0.10", "ethers": "^5.7.2", "hardhat": "^2.22.2", "mocha": "^10.2.0", "prettier": "^2.8.8", - "tsx": "^4.7.1", + "tsx": "^4.19.1", "typescript": "5.3.3" }, "private": true, diff --git a/typescript/infra/scripts/funding/fund-keys-from-deployer.ts b/typescript/infra/scripts/funding/fund-keys-from-deployer.ts index 4601dc702..dabb1fbd2 100644 --- a/typescript/infra/scripts/funding/fund-keys-from-deployer.ts +++ b/typescript/infra/scripts/funding/fund-keys-from-deployer.ts @@ -1,4 +1,4 @@ -import { EthBridger, getL2Network } from '@arbitrum/sdk'; +import { EthBridger, getArbitrumNetwork } from '@arbitrum/sdk'; import { CrossChainMessenger } from '@eth-optimism/sdk'; import { Connection, PublicKey } from '@solana/web3.js'; import { BigNumber, ethers } from 'ethers'; @@ -841,13 +841,13 @@ class ContextFunder { private async bridgeToArbitrum(l2Chain: ChainName, amount: BigNumber) { const l1Chain = L2ToL1[l2Chain]; - const l2Network = await getL2Network( + const l2Network = await getArbitrumNetwork( this.multiProvider.getEvmChainId(l2Chain), ); const ethBridger = new EthBridger(l2Network); return ethBridger.deposit({ amount, - l1Signer: this.multiProvider.getSigner(l1Chain), + parentSigner: this.multiProvider.getSigner(l1Chain), overrides: this.multiProvider.getTransactionOverrides(l1Chain), }); } diff --git a/typescript/sdk/package.json b/typescript/sdk/package.json index 33aff0eb4..0c621a763 100644 --- a/typescript/sdk/package.json +++ b/typescript/sdk/package.json @@ -4,7 +4,7 @@ "version": "7.1.0", "dependencies": { "@arbitrum/sdk": "^4.0.0", - "@aws-sdk/client-s3": "^3.74.0", + "@aws-sdk/client-s3": "^3.577.0", "@chain-registry/types": "^0.50.14", "@cosmjs/cosmwasm-stargate": "^0.32.4", "@cosmjs/stargate": "^0.32.4", @@ -28,13 +28,13 @@ "@nomiclabs/hardhat-ethers": "^2.2.3", "@nomiclabs/hardhat-waffle": "^2.0.6", "@types/mocha": "^10.0.1", - "@types/node": "^16.9.1", + "@types/node": "^18.14.5", "@types/sinon": "^17.0.1", "@types/sinon-chai": "^3.2.12", "@types/ws": "^8.5.5", "@typescript-eslint/eslint-plugin": "^8.1.6", "@typescript-eslint/parser": "^8.1.6", - "chai": "4.5.0", + "chai": "^4.5.0", "dotenv": "^10.0.0", "eslint": "^9.15.0", "eslint-config-prettier": "^9.1.0", @@ -46,7 +46,7 @@ "prettier": "^2.8.8", "sinon": "^13.0.2", "ts-node": "^10.8.0", - "tsx": "^4.7.1", + "tsx": "^4.19.1", "typescript": "5.3.3", "yaml": "2.4.5" }, diff --git a/typescript/utils/package.json b/typescript/utils/package.json index 0a757dd0e..4da150a92 100644 --- a/typescript/utils/package.json +++ b/typescript/utils/package.json @@ -19,7 +19,7 @@ "@types/sinon-chai": "^3.2.12", "@typescript-eslint/eslint-plugin": "^8.1.6", "@typescript-eslint/parser": "^8.1.6", - "chai": "4.5.0", + "chai": "^4.5.0", "eslint": "^9.15.0", "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-typescript": "^3.6.3", diff --git a/typescript/widgets/package.json b/typescript/widgets/package.json index 0fb329903..ec40cfe6d 100644 --- a/typescript/widgets/package.json +++ b/typescript/widgets/package.json @@ -18,7 +18,7 @@ "@solana/web3.js": "^1.95.4", "clsx": "^2.1.1", "react-tooltip": "^5.28.0", - "viem": "^2.21.41", + "viem": "^2.21.45", "wagmi": "^2.12.26" }, "devDependencies": { @@ -37,7 +37,7 @@ "@storybook/react-vite": "^7.6.14", "@storybook/test": "^7.6.14", "@tanstack/react-query": "^5.59.20", - "@types/node": "^18.11.18", + "@types/node": "^18.14.5", "@types/react": "^18.0.27", "@types/react-dom": "^18.0.10", "@types/ws": "^8.5.5", diff --git a/yarn.lock b/yarn.lock index 751611cc3..bc7551faf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -55,18 +55,6 @@ __metadata: languageName: node linkType: hard -"@arbitrum/sdk@npm:^3.0.0": - version: 3.0.0 - resolution: "@arbitrum/sdk@npm:3.0.0" - dependencies: - "@ethersproject/address": "npm:^5.0.8" - "@ethersproject/bignumber": "npm:^5.1.1" - "@ethersproject/bytes": "npm:^5.0.8" - ethers: "npm:^5.1.0" - checksum: 10/f4f7d05631d2014546cccff85926a638e3725e522e2c9c73c70caafec8f14cf7b22f58c8f942ced2f8bd44ea545b63c99cf5044c833edd0d52934afdddbf1d40 - languageName: node - linkType: hard - "@arbitrum/sdk@npm:^4.0.0": version: 4.0.1 resolution: "@arbitrum/sdk@npm:4.0.1" @@ -91,17 +79,6 @@ __metadata: languageName: node linkType: hard -"@aws-crypto/crc32@npm:2.0.0": - version: 2.0.0 - resolution: "@aws-crypto/crc32@npm:2.0.0" - dependencies: - "@aws-crypto/util": "npm:^2.0.0" - "@aws-sdk/types": "npm:^3.1.0" - tslib: "npm:^1.11.1" - checksum: 10/da8e32353f958775b4476150c6b457ce1a04b962cdb227842f8a3fa52cb996eb979b2858d19abd6703256c0befc08ee80e3ce48e02d39900640dc6696b151701 - languageName: node - linkType: hard - "@aws-crypto/crc32@npm:3.0.0": version: 3.0.0 resolution: "@aws-crypto/crc32@npm:3.0.0" @@ -113,17 +90,6 @@ __metadata: languageName: node linkType: hard -"@aws-crypto/crc32c@npm:2.0.0": - version: 2.0.0 - resolution: "@aws-crypto/crc32c@npm:2.0.0" - dependencies: - "@aws-crypto/util": "npm:^2.0.0" - "@aws-sdk/types": "npm:^3.1.0" - tslib: "npm:^1.11.1" - checksum: 10/04496af8f9a4822bf09793c7df20fbebbdda75484eb1c8a89e98b41ab4e0b57ce9e33b4b30d6b741d85c2f751298fc39919184b5985c66e252d180ddc6f30ab1 - languageName: node - linkType: hard - "@aws-crypto/crc32c@npm:3.0.0": version: 3.0.0 resolution: "@aws-crypto/crc32c@npm:3.0.0" @@ -153,20 +119,6 @@ __metadata: languageName: node linkType: hard -"@aws-crypto/sha1-browser@npm:2.0.0": - version: 2.0.0 - resolution: "@aws-crypto/sha1-browser@npm:2.0.0" - dependencies: - "@aws-crypto/ie11-detection": "npm:^2.0.0" - "@aws-crypto/supports-web-crypto": "npm:^2.0.0" - "@aws-sdk/types": "npm:^3.1.0" - "@aws-sdk/util-locate-window": "npm:^3.0.0" - "@aws-sdk/util-utf8-browser": "npm:^3.0.0" - tslib: "npm:^1.11.1" - checksum: 10/7a1e828741339effdb26e89b28d30010f954192c75dc197fe9856faf46d9fd998b3a8c473c3f8b86ebc259ef1162191c6bd4c9c23803ea0b66b3abcff511917a - languageName: node - linkType: hard - "@aws-crypto/sha1-browser@npm:3.0.0": version: 3.0.0 resolution: "@aws-crypto/sha1-browser@npm:3.0.0" @@ -319,16 +271,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/abort-controller@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/abort-controller@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/97a5a4dfb433be2738a4ca11b830e434df1e7af9448dbbce3bd11d9f13f1e29eb987a859163250b8d49e3f0e8b8cbc5199131138b5e16a2f99daa9c2a1454f79 - languageName: node - linkType: hard - "@aws-sdk/abort-controller@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/abort-controller@npm:3.78.0" @@ -339,25 +281,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/chunked-blob-reader-native@npm:3.58.0": - version: 3.58.0 - resolution: "@aws-sdk/chunked-blob-reader-native@npm:3.58.0" - dependencies: - "@aws-sdk/util-base64-browser": "npm:3.58.0" - tslib: "npm:^2.3.1" - checksum: 10/7826f67d2f1f4af0939ae0d764ee617e02fd4e46e14e12714b559043c9ab77dcd7287ec94636bc2849b2b179803058313a1902944d647a4afe81989730c5de08 - languageName: node - linkType: hard - -"@aws-sdk/chunked-blob-reader@npm:3.55.0": - version: 3.55.0 - resolution: "@aws-sdk/chunked-blob-reader@npm:3.55.0" - dependencies: - tslib: "npm:^2.3.1" - checksum: 10/e19fcff0162b2b28a46a3c3c4936f4e7ae7c2588aac0948ec2796ac6b0d51ae8e3d50bd855f7b07230c80e00708283352435d024e16834b61d7d353b22120d73 - languageName: node - linkType: hard - "@aws-sdk/client-iam@npm:^3.74.0": version: 3.107.0 resolution: "@aws-sdk/client-iam@npm:3.107.0" @@ -403,47 +326,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-kms@npm:3.48.0": - version: 3.48.0 - resolution: "@aws-sdk/client-kms@npm:3.48.0" - dependencies: - "@aws-crypto/sha256-browser": "npm:2.0.0" - "@aws-crypto/sha256-js": "npm:2.0.0" - "@aws-sdk/client-sts": "npm:3.48.0" - "@aws-sdk/config-resolver": "npm:3.47.2" - "@aws-sdk/credential-provider-node": "npm:3.48.0" - "@aws-sdk/fetch-http-handler": "npm:3.47.2" - "@aws-sdk/hash-node": "npm:3.47.2" - "@aws-sdk/invalid-dependency": "npm:3.47.2" - "@aws-sdk/middleware-content-length": "npm:3.47.2" - "@aws-sdk/middleware-host-header": "npm:3.47.2" - "@aws-sdk/middleware-logger": "npm:3.47.2" - "@aws-sdk/middleware-retry": "npm:3.47.2" - "@aws-sdk/middleware-serde": "npm:3.47.2" - "@aws-sdk/middleware-signing": "npm:3.47.2" - "@aws-sdk/middleware-stack": "npm:3.47.2" - "@aws-sdk/middleware-user-agent": "npm:3.47.2" - "@aws-sdk/node-config-provider": "npm:3.47.2" - "@aws-sdk/node-http-handler": "npm:3.47.2" - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/smithy-client": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/url-parser": "npm:3.47.2" - "@aws-sdk/util-base64-browser": "npm:3.47.1" - "@aws-sdk/util-base64-node": "npm:3.47.2" - "@aws-sdk/util-body-length-browser": "npm:3.47.1" - "@aws-sdk/util-body-length-node": "npm:3.47.1" - "@aws-sdk/util-defaults-mode-browser": "npm:3.47.2" - "@aws-sdk/util-defaults-mode-node": "npm:3.47.2" - "@aws-sdk/util-user-agent-browser": "npm:3.47.2" - "@aws-sdk/util-user-agent-node": "npm:3.47.2" - "@aws-sdk/util-utf8-browser": "npm:3.47.1" - "@aws-sdk/util-utf8-node": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/eff5d95d51bddcefe533dbab1c45cc06e1cd4b6549ae9cc2e1cbfb23dec21292649e5d9335751cfb773674e73507e35fc026245878d7e61c903ed12242f76e9b - languageName: node - linkType: hard - "@aws-sdk/client-kms@npm:^3.28.0, @aws-sdk/client-kms@npm:^3.39.0": version: 3.142.0 resolution: "@aws-sdk/client-kms@npm:3.142.0" @@ -601,68 +483,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-s3@npm:^3.74.0": - version: 3.107.0 - resolution: "@aws-sdk/client-s3@npm:3.107.0" - dependencies: - "@aws-crypto/sha1-browser": "npm:2.0.0" - "@aws-crypto/sha256-browser": "npm:2.0.0" - "@aws-crypto/sha256-js": "npm:2.0.0" - "@aws-sdk/client-sts": "npm:3.105.0" - "@aws-sdk/config-resolver": "npm:3.80.0" - "@aws-sdk/credential-provider-node": "npm:3.105.0" - "@aws-sdk/eventstream-serde-browser": "npm:3.78.0" - "@aws-sdk/eventstream-serde-config-resolver": "npm:3.78.0" - "@aws-sdk/eventstream-serde-node": "npm:3.78.0" - "@aws-sdk/fetch-http-handler": "npm:3.78.0" - "@aws-sdk/hash-blob-browser": "npm:3.78.0" - "@aws-sdk/hash-node": "npm:3.78.0" - "@aws-sdk/hash-stream-node": "npm:3.78.0" - "@aws-sdk/invalid-dependency": "npm:3.78.0" - "@aws-sdk/md5-js": "npm:3.78.0" - "@aws-sdk/middleware-bucket-endpoint": "npm:3.80.0" - "@aws-sdk/middleware-content-length": "npm:3.78.0" - "@aws-sdk/middleware-expect-continue": "npm:3.78.0" - "@aws-sdk/middleware-flexible-checksums": "npm:3.78.0" - "@aws-sdk/middleware-host-header": "npm:3.78.0" - "@aws-sdk/middleware-location-constraint": "npm:3.78.0" - "@aws-sdk/middleware-logger": "npm:3.78.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.105.0" - "@aws-sdk/middleware-retry": "npm:3.80.0" - "@aws-sdk/middleware-sdk-s3": "npm:3.105.0" - "@aws-sdk/middleware-serde": "npm:3.78.0" - "@aws-sdk/middleware-signing": "npm:3.78.0" - "@aws-sdk/middleware-ssec": "npm:3.78.0" - "@aws-sdk/middleware-stack": "npm:3.78.0" - "@aws-sdk/middleware-user-agent": "npm:3.78.0" - "@aws-sdk/node-config-provider": "npm:3.80.0" - "@aws-sdk/node-http-handler": "npm:3.94.0" - "@aws-sdk/protocol-http": "npm:3.78.0" - "@aws-sdk/signature-v4-multi-region": "npm:3.88.0" - "@aws-sdk/smithy-client": "npm:3.99.0" - "@aws-sdk/types": "npm:3.78.0" - "@aws-sdk/url-parser": "npm:3.78.0" - "@aws-sdk/util-base64-browser": "npm:3.58.0" - "@aws-sdk/util-base64-node": "npm:3.55.0" - "@aws-sdk/util-body-length-browser": "npm:3.55.0" - "@aws-sdk/util-body-length-node": "npm:3.55.0" - "@aws-sdk/util-defaults-mode-browser": "npm:3.99.0" - "@aws-sdk/util-defaults-mode-node": "npm:3.99.0" - "@aws-sdk/util-stream-browser": "npm:3.78.0" - "@aws-sdk/util-stream-node": "npm:3.78.0" - "@aws-sdk/util-user-agent-browser": "npm:3.78.0" - "@aws-sdk/util-user-agent-node": "npm:3.80.0" - "@aws-sdk/util-utf8-browser": "npm:3.55.0" - "@aws-sdk/util-utf8-node": "npm:3.55.0" - "@aws-sdk/util-waiter": "npm:3.78.0" - "@aws-sdk/xml-builder": "npm:3.55.0" - entities: "npm:2.2.0" - fast-xml-parser: "npm:3.19.0" - tslib: "npm:^2.3.1" - checksum: 10/827f4fae394677bba41f581c851effc438935e49480d99a26c15c3315ea7a1a696c15163b2de44ef0b40e7bb05396c372e3b200e974133e238d262c33fbe6f1d - languageName: node - linkType: hard - "@aws-sdk/client-sso-oidc@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/client-sso-oidc@npm:3.577.0" @@ -789,44 +609,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.48.0": - version: 3.48.0 - resolution: "@aws-sdk/client-sso@npm:3.48.0" - dependencies: - "@aws-crypto/sha256-browser": "npm:2.0.0" - "@aws-crypto/sha256-js": "npm:2.0.0" - "@aws-sdk/config-resolver": "npm:3.47.2" - "@aws-sdk/fetch-http-handler": "npm:3.47.2" - "@aws-sdk/hash-node": "npm:3.47.2" - "@aws-sdk/invalid-dependency": "npm:3.47.2" - "@aws-sdk/middleware-content-length": "npm:3.47.2" - "@aws-sdk/middleware-host-header": "npm:3.47.2" - "@aws-sdk/middleware-logger": "npm:3.47.2" - "@aws-sdk/middleware-retry": "npm:3.47.2" - "@aws-sdk/middleware-serde": "npm:3.47.2" - "@aws-sdk/middleware-stack": "npm:3.47.2" - "@aws-sdk/middleware-user-agent": "npm:3.47.2" - "@aws-sdk/node-config-provider": "npm:3.47.2" - "@aws-sdk/node-http-handler": "npm:3.47.2" - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/smithy-client": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/url-parser": "npm:3.47.2" - "@aws-sdk/util-base64-browser": "npm:3.47.1" - "@aws-sdk/util-base64-node": "npm:3.47.2" - "@aws-sdk/util-body-length-browser": "npm:3.47.1" - "@aws-sdk/util-body-length-node": "npm:3.47.1" - "@aws-sdk/util-defaults-mode-browser": "npm:3.47.2" - "@aws-sdk/util-defaults-mode-node": "npm:3.47.2" - "@aws-sdk/util-user-agent-browser": "npm:3.47.2" - "@aws-sdk/util-user-agent-node": "npm:3.47.2" - "@aws-sdk/util-utf8-browser": "npm:3.47.1" - "@aws-sdk/util-utf8-node": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/917bb56fdc67a324aa7c933f0dc9405036f98306ddf4a8cccade01801d91a8becde30f5b979a7f4f8084fddc3b028292a8c3fce03d9d1f60c9ed450e602aa607 - languageName: node - linkType: hard - "@aws-sdk/client-sso@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/client-sso@npm:3.577.0" @@ -961,49 +743,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-sts@npm:3.48.0": - version: 3.48.0 - resolution: "@aws-sdk/client-sts@npm:3.48.0" - dependencies: - "@aws-crypto/sha256-browser": "npm:2.0.0" - "@aws-crypto/sha256-js": "npm:2.0.0" - "@aws-sdk/config-resolver": "npm:3.47.2" - "@aws-sdk/credential-provider-node": "npm:3.48.0" - "@aws-sdk/fetch-http-handler": "npm:3.47.2" - "@aws-sdk/hash-node": "npm:3.47.2" - "@aws-sdk/invalid-dependency": "npm:3.47.2" - "@aws-sdk/middleware-content-length": "npm:3.47.2" - "@aws-sdk/middleware-host-header": "npm:3.47.2" - "@aws-sdk/middleware-logger": "npm:3.47.2" - "@aws-sdk/middleware-retry": "npm:3.47.2" - "@aws-sdk/middleware-sdk-sts": "npm:3.47.2" - "@aws-sdk/middleware-serde": "npm:3.47.2" - "@aws-sdk/middleware-signing": "npm:3.47.2" - "@aws-sdk/middleware-stack": "npm:3.47.2" - "@aws-sdk/middleware-user-agent": "npm:3.47.2" - "@aws-sdk/node-config-provider": "npm:3.47.2" - "@aws-sdk/node-http-handler": "npm:3.47.2" - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/smithy-client": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/url-parser": "npm:3.47.2" - "@aws-sdk/util-base64-browser": "npm:3.47.1" - "@aws-sdk/util-base64-node": "npm:3.47.2" - "@aws-sdk/util-body-length-browser": "npm:3.47.1" - "@aws-sdk/util-body-length-node": "npm:3.47.1" - "@aws-sdk/util-defaults-mode-browser": "npm:3.47.2" - "@aws-sdk/util-defaults-mode-node": "npm:3.47.2" - "@aws-sdk/util-user-agent-browser": "npm:3.47.2" - "@aws-sdk/util-user-agent-node": "npm:3.47.2" - "@aws-sdk/util-utf8-browser": "npm:3.47.1" - "@aws-sdk/util-utf8-node": "npm:3.47.2" - entities: "npm:2.2.0" - fast-xml-parser: "npm:3.19.0" - tslib: "npm:^2.3.0" - checksum: 10/2ee2017400b1fc8113a2b74325f3bbc5f333143df910c78ad9dd3ab109ec1e1066b713d54192791966dfe7497e69b675938ddd9a896a125eada237f0d2bd2152 - languageName: node - linkType: hard - "@aws-sdk/client-sts@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/client-sts@npm:3.577.0" @@ -1065,18 +804,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/config-resolver@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/config-resolver@npm:3.47.2" - dependencies: - "@aws-sdk/signature-v4": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/util-config-provider": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/7e4f342261a12bb8c041fdc8ab76f9e1b2a2370e607f50a7a099cba174a3d11a32640399d344ed312ace34d7e118b71ca7c4c83df595989718b501cecc894413 - languageName: node - linkType: hard - "@aws-sdk/config-resolver@npm:3.80.0": version: 3.80.0 resolution: "@aws-sdk/config-resolver@npm:3.80.0" @@ -1116,17 +843,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-env@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/credential-provider-env@npm:3.47.2" - dependencies: - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/11416fb43d27a60c5c3b493f4145adabb6e4277642e94e429eb770c5ee9029a49230ac63b9088a9465c8bf93acf48673c289ae1666a7e34ab6c6f9d58539e08e - languageName: node - linkType: hard - "@aws-sdk/credential-provider-env@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/credential-provider-env@npm:3.577.0" @@ -1180,19 +896,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-imds@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/credential-provider-imds@npm:3.47.2" - dependencies: - "@aws-sdk/node-config-provider": "npm:3.47.2" - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/url-parser": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/37745d9957be76f2edcb73c7668e1af35c7e532f0dec477927222a692ebf84dcaa4393d8c27b8460eb2fdf7d8a4bbf1f959ac9dd3a8f05f0884d5bb20b2f2663 - languageName: node - linkType: hard - "@aws-sdk/credential-provider-imds@npm:3.81.0": version: 3.81.0 resolution: "@aws-sdk/credential-provider-imds@npm:3.81.0" @@ -1238,23 +941,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.48.0": - version: 3.48.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.48.0" - dependencies: - "@aws-sdk/credential-provider-env": "npm:3.47.2" - "@aws-sdk/credential-provider-imds": "npm:3.47.2" - "@aws-sdk/credential-provider-sso": "npm:3.48.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.47.2" - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/shared-ini-file-loader": "npm:3.47.1" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/util-credentials": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/9c2d58944e5d6dd9076b82d6858562e7a5b4766b32d8a4a23040b6d0933b8cb8481a97939d1c53a29a26dd6b2486601e466146b0f2e99b37afd21cc58ae19537 - languageName: node - linkType: hard - "@aws-sdk/credential-provider-ini@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/credential-provider-ini@npm:3.577.0" @@ -1311,25 +997,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.48.0": - version: 3.48.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.48.0" - dependencies: - "@aws-sdk/credential-provider-env": "npm:3.47.2" - "@aws-sdk/credential-provider-imds": "npm:3.47.2" - "@aws-sdk/credential-provider-ini": "npm:3.48.0" - "@aws-sdk/credential-provider-process": "npm:3.47.2" - "@aws-sdk/credential-provider-sso": "npm:3.48.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.47.2" - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/shared-ini-file-loader": "npm:3.47.1" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/util-credentials": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/6b038691cffad9a8cd54a1e7cb4da927205fea7e5ba2add4788216f2af4280635d1e6b0c63927866fc0ba6f156b76485643670a462dacfb841e9abba91fb4584 - languageName: node - linkType: hard - "@aws-sdk/credential-provider-node@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/credential-provider-node@npm:3.577.0" @@ -1362,19 +1029,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-process@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/credential-provider-process@npm:3.47.2" - dependencies: - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/shared-ini-file-loader": "npm:3.47.1" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/util-credentials": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/d59d900f443b8fd2f8b74902bc0c0d6bdf0156a8d44981165e051e6856793d80b84ba43b87f77c24fe1569426365bfb226e3599d60e589abbe2349de00e32666 - languageName: node - linkType: hard - "@aws-sdk/credential-provider-process@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/credential-provider-process@npm:3.577.0" @@ -1426,20 +1080,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.48.0": - version: 3.48.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.48.0" - dependencies: - "@aws-sdk/client-sso": "npm:3.48.0" - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/shared-ini-file-loader": "npm:3.47.1" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/util-credentials": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/0c012e75023687c72fcf8945b0b83242d8d2e2f526b2c241f77ab9b1ab462292f836b5e1866966b6bf5db3ff2c1fba2a554304651e8257ccbe2e47d3bc1f8db1 - languageName: node - linkType: hard - "@aws-sdk/credential-provider-sso@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/credential-provider-sso@npm:3.577.0" @@ -1466,17 +1106,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-web-identity@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.47.2" - dependencies: - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/eb85ea63ad1875dccb1efec76cb8c297a256fa9988a45141d242812e0ea059fa9b41ab4a912aea96c66a25321cc7c003ab834c707df96949c6380c6ca1111929 - languageName: node - linkType: hard - "@aws-sdk/credential-provider-web-identity@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/credential-provider-web-identity@npm:3.577.0" @@ -1502,63 +1131,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/eventstream-marshaller@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/eventstream-marshaller@npm:3.78.0" - dependencies: - "@aws-crypto/crc32": "npm:2.0.0" - "@aws-sdk/types": "npm:3.78.0" - "@aws-sdk/util-hex-encoding": "npm:3.58.0" - tslib: "npm:^2.3.1" - checksum: 10/e62d0792d28d2bc9b7ce04c95442d698f2d7043872bfc0c91422ed4e3a5b38fa1284148dc4be06545aaa0d52107650bb53da9a37733f23e30ff83ca83a93652d - languageName: node - linkType: hard - -"@aws-sdk/eventstream-serde-browser@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/eventstream-serde-browser@npm:3.78.0" - dependencies: - "@aws-sdk/eventstream-marshaller": "npm:3.78.0" - "@aws-sdk/eventstream-serde-universal": "npm:3.78.0" - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/f2be29f11c2c02c41fd161495edab2b2a90a0087840626aa8d5209e005e6be510d48cf543871a77e508db472c47922823101fda35dd9f1f2e65401ce652edfb5 - languageName: node - linkType: hard - -"@aws-sdk/eventstream-serde-config-resolver@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/eventstream-serde-config-resolver@npm:3.78.0" - dependencies: - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/38bf3a5a496bedf5f5bb1a32da4934dbfe720594fb0d3028da861428f1d0fba2091d1d634eada9e132019486682a5d318648120bf5ca87ddfe38b8a3be7c0c62 - languageName: node - linkType: hard - -"@aws-sdk/eventstream-serde-node@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/eventstream-serde-node@npm:3.78.0" - dependencies: - "@aws-sdk/eventstream-marshaller": "npm:3.78.0" - "@aws-sdk/eventstream-serde-universal": "npm:3.78.0" - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/d0eb279d27d4757c33e7ccb69ff31036ab1d5573570daebeabac773a708e89fa85c0bf8569c6d6faf976734ef4e09d5375f589723819e095d076090ff68361c7 - languageName: node - linkType: hard - -"@aws-sdk/eventstream-serde-universal@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/eventstream-serde-universal@npm:3.78.0" - dependencies: - "@aws-sdk/eventstream-marshaller": "npm:3.78.0" - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/fe8f7f219ce43d8920ff8a1434507f1504b652e03b18a53f01f7d9d60a1f0ccf6d5d0abff8c3317be20e93c317491ae140af404f5175f6b8056cf315ceb9cb86 - languageName: node - linkType: hard - "@aws-sdk/fetch-http-handler@npm:3.131.0": version: 3.131.0 resolution: "@aws-sdk/fetch-http-handler@npm:3.131.0" @@ -1572,19 +1144,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/fetch-http-handler@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/fetch-http-handler@npm:3.47.2" - dependencies: - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/querystring-builder": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/util-base64-browser": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/a37cc6cce12ab8d1a280d7f9c60e97972ed4bc9d7677418af65cd0ea18e8db4d01561a6d8d4ce8da643256b5e9087369d881532001c7076d85810a60143de69b - languageName: node - linkType: hard - "@aws-sdk/fetch-http-handler@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/fetch-http-handler@npm:3.78.0" @@ -1598,18 +1157,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/hash-blob-browser@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/hash-blob-browser@npm:3.78.0" - dependencies: - "@aws-sdk/chunked-blob-reader": "npm:3.55.0" - "@aws-sdk/chunked-blob-reader-native": "npm:3.58.0" - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/5e257b36f93bfa3af233c061f8cb2f8be28d1a21a176654acffc90b0040174fff6d181012d33729a59d7e991f0e960dfbd455a34181c1298ede52418ad606a58 - languageName: node - linkType: hard - "@aws-sdk/hash-node@npm:3.127.0": version: 3.127.0 resolution: "@aws-sdk/hash-node@npm:3.127.0" @@ -1621,17 +1168,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/hash-node@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/hash-node@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/util-buffer-from": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/b240e43e4bd4744e32e7f578118435cc9e0d069e50ec9c9669beb8813582fb1f0ddb5d58948593d7227d7cce4d2fe416255b91c8c5c8ee7385e7f7520b0a9e10 - languageName: node - linkType: hard - "@aws-sdk/hash-node@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/hash-node@npm:3.78.0" @@ -1643,16 +1179,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/hash-stream-node@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/hash-stream-node@npm:3.78.0" - dependencies: - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/dba65ef684458e45c03b9555d6ecb16747299bc30be3341b34f542f1b511bbda685df384dc729717254e4ae1756b775e2743b3e93e1635cf6d8dd34a90f167ac - languageName: node - linkType: hard - "@aws-sdk/invalid-dependency@npm:3.127.0": version: 3.127.0 resolution: "@aws-sdk/invalid-dependency@npm:3.127.0" @@ -1663,16 +1189,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/invalid-dependency@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/invalid-dependency@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/a5808f8e4d4d696610a3be8e6dee2ad387187eef9a05edaf008b4af12838f9f5cb900729698228fdeaed5ededdae080d91d1c2607cc30d650cb92dd09a8c7b05 - languageName: node - linkType: hard - "@aws-sdk/invalid-dependency@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/invalid-dependency@npm:3.78.0" @@ -1683,15 +1199,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/is-array-buffer@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/is-array-buffer@npm:3.47.1" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/5287771b7ca6e1d8b02e32c62fb7065cd6c827ea9ef030a5868cfacc7cf88aec9d9d6fc65ab216326e00184c423a9e574d93704b8cbc63338c2a378a00fdd02b - languageName: node - linkType: hard - "@aws-sdk/is-array-buffer@npm:3.55.0": version: 3.55.0 resolution: "@aws-sdk/is-array-buffer@npm:3.55.0" @@ -1701,18 +1208,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/md5-js@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/md5-js@npm:3.78.0" - dependencies: - "@aws-sdk/types": "npm:3.78.0" - "@aws-sdk/util-utf8-browser": "npm:3.55.0" - "@aws-sdk/util-utf8-node": "npm:3.55.0" - tslib: "npm:^2.3.1" - checksum: 10/03967189ad87b6e5b234f8125cee0da890e024517e7d58474c4714fcc134069233bae65e949cd285b1e963be07c06500b1a82481880836fe978788002f3360c3 - languageName: node - linkType: hard - "@aws-sdk/middleware-bucket-endpoint@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.577.0" @@ -1728,19 +1223,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-bucket-endpoint@npm:3.80.0": - version: 3.80.0 - resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.80.0" - dependencies: - "@aws-sdk/protocol-http": "npm:3.78.0" - "@aws-sdk/types": "npm:3.78.0" - "@aws-sdk/util-arn-parser": "npm:3.55.0" - "@aws-sdk/util-config-provider": "npm:3.55.0" - tslib: "npm:^2.3.1" - checksum: 10/06ba62bcb728d16bc70079af23385902880580f2f69f1a7fb3dc24012157974989a846047a9f08424f3b7e662089b34b09b4d560017785d699fa71e8da3cbb05 - languageName: node - linkType: hard - "@aws-sdk/middleware-content-length@npm:3.127.0": version: 3.127.0 resolution: "@aws-sdk/middleware-content-length@npm:3.127.0" @@ -1752,17 +1234,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-content-length@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/middleware-content-length@npm:3.47.2" - dependencies: - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/0c76fd9c82e9cc568fb6431b3ef34e97bd03a0a1827800363acab75bf1a47384b05fe1d9377becd4781f075de3f95fc089b083791595a01c4deca95f3db626df - languageName: node - linkType: hard - "@aws-sdk/middleware-content-length@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/middleware-content-length@npm:3.78.0" @@ -1786,18 +1257,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-expect-continue@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/middleware-expect-continue@npm:3.78.0" - dependencies: - "@aws-sdk/middleware-header-default": "npm:3.78.0" - "@aws-sdk/protocol-http": "npm:3.78.0" - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/6db82f13c17a66a1e897419b707480298608caa32b5543229d29a2d1e2ef266d4dfda397164429ca1fe87e730da4d7c4f2a537a0ab0b4aa9d41b88509fd4c8f9 - languageName: node - linkType: hard - "@aws-sdk/middleware-flexible-checksums@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.577.0" @@ -1814,31 +1273,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-flexible-checksums@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.78.0" - dependencies: - "@aws-crypto/crc32": "npm:2.0.0" - "@aws-crypto/crc32c": "npm:2.0.0" - "@aws-sdk/is-array-buffer": "npm:3.55.0" - "@aws-sdk/protocol-http": "npm:3.78.0" - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/5062b9f8fbd3f8700aa0ee221d6be08e10715b3b473ae1251ff33df7751b995c1efaed52a20d116fa96c517066b696fce1fb29ecf0dddc2bd5fd696c45a46f56 - languageName: node - linkType: hard - -"@aws-sdk/middleware-header-default@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/middleware-header-default@npm:3.78.0" - dependencies: - "@aws-sdk/protocol-http": "npm:3.78.0" - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/fba1438bbc32e39120a7657d6d0204e616c4170f564638ed7b33c122ee229a9199f2d74b4efaa380e3da59aa2896b7f365c41d5fef7c7aa8ad0e0edb3a2e3e9d - languageName: node - linkType: hard - "@aws-sdk/middleware-host-header@npm:3.127.0": version: 3.127.0 resolution: "@aws-sdk/middleware-host-header@npm:3.127.0" @@ -1850,17 +1284,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/middleware-host-header@npm:3.47.2" - dependencies: - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/8f17bf82fa35a175a2443188860e21c52dbdd1cdf7be2dff685f12e32f6b7b7cbda749a45900a5b78cb7392d8b15f6893f22bbb16dfd5737a1e56a59741021fb - languageName: node - linkType: hard - "@aws-sdk/middleware-host-header@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/middleware-host-header@npm:3.577.0" @@ -1895,16 +1318,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-location-constraint@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/middleware-location-constraint@npm:3.78.0" - dependencies: - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/88e2aa48c49af4cacbe44022b4729c52dc173ec1c7672f44326641b7169e298e6cff435d1e1502455982521b407d1df5ab7cf33e7770bcf5c947427ec5e160f5 - languageName: node - linkType: hard - "@aws-sdk/middleware-logger@npm:3.127.0": version: 3.127.0 resolution: "@aws-sdk/middleware-logger@npm:3.127.0" @@ -1915,16 +1328,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/middleware-logger@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/515f84cbd57346d9599d12e3cb9dd7b80a353ef79dba4601e3d37a32db2d2abc0066d397658dbb5c6f93c5ca49ae6e91b9e3ca76dc9ab6feb23ddbf081383612 - languageName: node - linkType: hard - "@aws-sdk/middleware-logger@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/middleware-logger@npm:3.577.0" @@ -1994,19 +1397,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-retry@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/middleware-retry@npm:3.47.2" - dependencies: - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/service-error-classification": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - uuid: "npm:^8.3.2" - checksum: 10/e9f56166045ca3446f864ee75d7226cbf665c9a21d2237daba87c7bbeea9aa1035c05fc03dc9153a92fe780b4a3469277e8ebb33fa1b57233573c1a0f066462b - languageName: node - linkType: hard - "@aws-sdk/middleware-retry@npm:3.80.0": version: 3.80.0 resolution: "@aws-sdk/middleware-retry@npm:3.80.0" @@ -2021,18 +1411,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-sdk-s3@npm:3.105.0": - version: 3.105.0 - resolution: "@aws-sdk/middleware-sdk-s3@npm:3.105.0" - dependencies: - "@aws-sdk/protocol-http": "npm:3.78.0" - "@aws-sdk/types": "npm:3.78.0" - "@aws-sdk/util-arn-parser": "npm:3.55.0" - tslib: "npm:^2.3.1" - checksum: 10/bf7d38974d8ff75e01f6ade411e9b09e3e90ad57a78bf21c45762b4eea78fe9741b36395c418c9bccf6b17020a678d519575300bd6a0296769b576a5c8865d5c - languageName: node - linkType: hard - "@aws-sdk/middleware-sdk-s3@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/middleware-sdk-s3@npm:3.577.0" @@ -2064,20 +1442,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-sdk-sts@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/middleware-sdk-sts@npm:3.47.2" - dependencies: - "@aws-sdk/middleware-signing": "npm:3.47.2" - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/signature-v4": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/135c88d46b6350a13485c046a1ca27a7d44dc9fea3ea9206785b418a59f9cbbb4d7ca79c75d1521ed8920a7d57acd588d77b8d1e14ab4e5fddaccf87c559dea2 - languageName: node - linkType: hard - "@aws-sdk/middleware-sdk-sts@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/middleware-sdk-sts@npm:3.78.0" @@ -2102,16 +1466,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-serde@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/middleware-serde@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/89f0b72750e1f4f25f94277381d8e4c7ee1694570f99830edd5ef4c21f714737b49eb206c6d78139ae0cfb861831dbfcbc29c66cf565ec59468189ca3003fedb - languageName: node - linkType: hard - "@aws-sdk/middleware-serde@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/middleware-serde@npm:3.78.0" @@ -2135,19 +1489,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-signing@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/middleware-signing@npm:3.47.2" - dependencies: - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/signature-v4": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/1127e94e56efb3caad0b1bc5ccddb80daae0ca810a6b75a5b6b12d1da9812ec0734e15f80d33e7a94a173debf0a8135a5d31c7f308cf7fe99bb2ee56df9335d7 - languageName: node - linkType: hard - "@aws-sdk/middleware-signing@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/middleware-signing@npm:3.577.0" @@ -2187,16 +1528,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-ssec@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/middleware-ssec@npm:3.78.0" - dependencies: - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/fa9b087bd6c718f0c5f04f7f75ad8afcba743a95231e50c9b913ab1202bc23b5a96e0c81363457889c4184ed0342818a7c2f90f977379bce22e03865a6f6ce42 - languageName: node - linkType: hard - "@aws-sdk/middleware-stack@npm:3.127.0": version: 3.127.0 resolution: "@aws-sdk/middleware-stack@npm:3.127.0" @@ -2206,15 +1537,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-stack@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/middleware-stack@npm:3.47.2" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/427ed4888602ebd342c0443eb992f0daf419ea5cbe50b715b9d89dd99529ec14603d171e29d9adda11121e2bb84bafd586c2719b631aae5e396038c99a2e669a - languageName: node - linkType: hard - "@aws-sdk/middleware-stack@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/middleware-stack@npm:3.78.0" @@ -2235,17 +1557,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/middleware-user-agent@npm:3.47.2" - dependencies: - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/fb4620b773d8927236308eacb58422cac3792558a3cef307580e67412cc8f1bf9af18509f29417238078fb8b6334205c63b7cdce81921e4b678278f7b346ae44 - languageName: node - linkType: hard - "@aws-sdk/middleware-user-agent@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/middleware-user-agent@npm:3.577.0" @@ -2282,18 +1593,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/node-config-provider@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/node-config-provider@npm:3.47.2" - dependencies: - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/shared-ini-file-loader": "npm:3.47.1" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/17a83bd6b259d627ab6869a889ea7a21197d629ba320004c3d6fe771e8ff162e275445fa7eda9007a5ae761af53a3d9586d1c8fbb45e11c5a2d41601b3bbda23 - languageName: node - linkType: hard - "@aws-sdk/node-config-provider@npm:3.80.0": version: 3.80.0 resolution: "@aws-sdk/node-config-provider@npm:3.80.0" @@ -2319,19 +1618,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/node-http-handler@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/node-http-handler@npm:3.47.2" - dependencies: - "@aws-sdk/abort-controller": "npm:3.47.2" - "@aws-sdk/protocol-http": "npm:3.47.2" - "@aws-sdk/querystring-builder": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/c864b92c35a6d7955af3c4764538324e02d7aa34f54c78dd3679515d989ca151e7ba55a65de7e5686a311aa3070c12c331fd88210aadb008925134bd31afe4ef - languageName: node - linkType: hard - "@aws-sdk/node-http-handler@npm:3.94.0": version: 3.94.0 resolution: "@aws-sdk/node-http-handler@npm:3.94.0" @@ -2355,16 +1641,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/property-provider@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/property-provider@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/e731ed31300fa0352744a5209e5f476a5ec82390ad2bbe1d58ded4a6de7ce3ec299e9580d07d4bddebe626ef3069c5806a0e060f63ce419f7a5dc48b6967cc9a - languageName: node - linkType: hard - "@aws-sdk/property-provider@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/property-provider@npm:3.78.0" @@ -2385,16 +1661,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/protocol-http@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/protocol-http@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/8d6cfcbe620256480198f0782a1f7a51f954ad076593ec09d01ffb23bf7f069c7716e629221b9793d2ab2903268d21597e4e386d9aacdd3d8ea2bdaa8a657d16 - languageName: node - linkType: hard - "@aws-sdk/protocol-http@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/protocol-http@npm:3.78.0" @@ -2416,17 +1682,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/querystring-builder@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/querystring-builder@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/util-uri-escape": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/4408739767ae6ef17c00d8df3b3936ba8a49737af34d1bd3e67e0a855b6fece11a75b539e7955ab6404688176f1ff6d6625528eae90518bf91e78bb9ce3f7ee7 - languageName: node - linkType: hard - "@aws-sdk/querystring-builder@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/querystring-builder@npm:3.78.0" @@ -2448,16 +1703,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/querystring-parser@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/querystring-parser@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/a975024dd2df3391c19ea468fa826fdb2c1dca2947993978a1e461db60f232c689da4a413d1205cbcac53c64f8cea9fbcfe1f10459bd2cc3cc86c9c95ae75d98 - languageName: node - linkType: hard - "@aws-sdk/querystring-parser@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/querystring-parser@npm:3.78.0" @@ -2489,13 +1734,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/service-error-classification@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/service-error-classification@npm:3.47.2" - checksum: 10/f7be80e30f7fc5f980a58e73c9a54e93217de05c9146eed7649bff6f28d4568da4aeeed927801512ddcc55664756d7caab2f62c9dd814185188c0b761611c7bf - languageName: node - linkType: hard - "@aws-sdk/service-error-classification@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/service-error-classification@npm:3.78.0" @@ -2512,15 +1750,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/shared-ini-file-loader@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/shared-ini-file-loader@npm:3.47.1" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/1068855025162e82bcef8eeaeea7b2f2e3ec5d488c7ea361616f8f40447c0ac34ad27ddbe89adfb9dcb20e6ef8986dc5a42632636a9e541e25247d135dc42548 - languageName: node - linkType: hard - "@aws-sdk/shared-ini-file-loader@npm:3.80.0": version: 3.80.0 resolution: "@aws-sdk/shared-ini-file-loader@npm:3.80.0" @@ -2544,24 +1773,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/signature-v4-multi-region@npm:3.88.0": - version: 3.88.0 - resolution: "@aws-sdk/signature-v4-multi-region@npm:3.88.0" - dependencies: - "@aws-sdk/protocol-http": "npm:3.78.0" - "@aws-sdk/signature-v4": "npm:3.78.0" - "@aws-sdk/types": "npm:3.78.0" - "@aws-sdk/util-arn-parser": "npm:3.55.0" - tslib: "npm:^2.3.1" - peerDependencies: - "@aws-sdk/signature-v4-crt": ^3.79.0 - peerDependenciesMeta: - "@aws-sdk/signature-v4-crt": - optional: true - checksum: 10/2382e05d517f18a4229ceef89e975e84eb94630afd9a11793deb70b5ea26446f50311caae586b38016ee5e1bb6d17b316774b93263be6c74994b2704ea03347b - languageName: node - linkType: hard - "@aws-sdk/signature-v4@npm:3.130.0": version: 3.130.0 resolution: "@aws-sdk/signature-v4@npm:3.130.0" @@ -2576,19 +1787,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/signature-v4@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/signature-v4@npm:3.47.2" - dependencies: - "@aws-sdk/is-array-buffer": "npm:3.47.1" - "@aws-sdk/types": "npm:3.47.1" - "@aws-sdk/util-hex-encoding": "npm:3.47.1" - "@aws-sdk/util-uri-escape": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/281e618b58c2ec5e508cabafa965d3f66ce6f310ac612f39458a4aa2622a8ab978585a24effa0c2eb70e8aaf1d5ac47658878bd6fbac363e515727c5e766909c - languageName: node - linkType: hard - "@aws-sdk/signature-v4@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/signature-v4@npm:3.78.0" @@ -2614,17 +1812,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/smithy-client@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/smithy-client@npm:3.47.2" - dependencies: - "@aws-sdk/middleware-stack": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/b3a3bf3182542d93bbd4badcce4a5656dbbfb42f675c213441bdfc8de27df13ca802aa5940fcad6158e77372cdffe205993d2aaf802d55427b71197b72330a8e - languageName: node - linkType: hard - "@aws-sdk/smithy-client@npm:3.99.0": version: 3.99.0 resolution: "@aws-sdk/smithy-client@npm:3.99.0" @@ -2658,13 +1845,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/types@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/types@npm:3.47.1" - checksum: 10/6a799ce69fe87aa52c931ba86337a1b280ddfddbd59abebf4222113e2e2757c64f18dbcbc680ec88a1a14ce7b3a84a60fda3f6a55c6d0ab0665453720e976874 - languageName: node - linkType: hard - "@aws-sdk/types@npm:3.577.0, @aws-sdk/types@npm:^3.222.0": version: 3.577.0 resolution: "@aws-sdk/types@npm:3.577.0" @@ -2693,17 +1873,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/url-parser@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/url-parser@npm:3.47.2" - dependencies: - "@aws-sdk/querystring-parser": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/c286c19a2768b529dcf8477aa4c97c64f1e756211ef402707adc393b45bfebcc44e6c660acb11e722e12975a86e6b43e6c006a65174828284fdc3f26c2c7e33c - languageName: node - linkType: hard - "@aws-sdk/url-parser@npm:3.78.0": version: 3.78.0 resolution: "@aws-sdk/url-parser@npm:3.78.0" @@ -2715,15 +1884,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-arn-parser@npm:3.55.0": - version: 3.55.0 - resolution: "@aws-sdk/util-arn-parser@npm:3.55.0" - dependencies: - tslib: "npm:^2.3.1" - checksum: 10/d8e56df636218c247ba3c6d1bc5c96ad853cdd5660f74bd0c43bcde4ddc1d6d6f2ee975f78772d99371d3d7315730cf03da73d47e90f32fdfc54359ee2e54915 - languageName: node - linkType: hard - "@aws-sdk/util-arn-parser@npm:3.568.0": version: 3.568.0 resolution: "@aws-sdk/util-arn-parser@npm:3.568.0" @@ -2742,15 +1902,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-base64-browser@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/util-base64-browser@npm:3.47.1" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/f79516ee53849cd7995a3372a25c5309456c719aa2f6444fe68807ee82dc0b4aba7990f30d4a1f1a504501201f67ab5b28826115c664930f33cb6856ca423194 - languageName: node - linkType: hard - "@aws-sdk/util-base64-browser@npm:3.58.0": version: 3.58.0 resolution: "@aws-sdk/util-base64-browser@npm:3.58.0" @@ -2760,16 +1911,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-base64-node@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/util-base64-node@npm:3.47.2" - dependencies: - "@aws-sdk/util-buffer-from": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/abcea31871d4666fb59fc49432ce5c57ebe8f732b01e5fe6270df4a8926d794a7fb88282011543d96938686899bedffb9373bb2e0412460ff3dbed4b03007406 - languageName: node - linkType: hard - "@aws-sdk/util-base64-node@npm:3.55.0": version: 3.55.0 resolution: "@aws-sdk/util-base64-node@npm:3.55.0" @@ -2780,15 +1921,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-body-length-browser@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/util-body-length-browser@npm:3.47.1" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/273caa8cba716ed61235695554d59c940224035a53b5188891bb09d0bdbf13bd9e40603040a682c77b47e3e30764aed8649c49929bfcbc024a2b4404e2bb5a0d - languageName: node - linkType: hard - "@aws-sdk/util-body-length-browser@npm:3.55.0": version: 3.55.0 resolution: "@aws-sdk/util-body-length-browser@npm:3.55.0" @@ -2798,15 +1930,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-body-length-node@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/util-body-length-node@npm:3.47.1" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/1e226859ea45fbb2cc5f4ac694fc8b4b0f531ff7df64621f1b43c7412c44a85e9d5e8fdd0de48d73d10cbb35c8aece52e6ad5e0858c886e66c22315f075c2811 - languageName: node - linkType: hard - "@aws-sdk/util-body-length-node@npm:3.55.0": version: 3.55.0 resolution: "@aws-sdk/util-body-length-node@npm:3.55.0" @@ -2816,16 +1939,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-buffer-from@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/util-buffer-from@npm:3.47.2" - dependencies: - "@aws-sdk/is-array-buffer": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/bacddc53a02b1e601c34601685d2bc829856f257f531d3e969a2b9ca5523244c314b214ce680ac7f8d411e58ed4800dd1a08eb18ccd697561f153d766416692a - languageName: node - linkType: hard - "@aws-sdk/util-buffer-from@npm:3.55.0": version: 3.55.0 resolution: "@aws-sdk/util-buffer-from@npm:3.55.0" @@ -2845,15 +1958,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-config-provider@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/util-config-provider@npm:3.47.1" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/747ab73fd87dc99dadacad255d36a1766d4eb15cf2a553050d46bff48fb66e906d099bf1594049fe79ba1353fa51d5225af2a67703ec2ec98759beae981a55b7 - languageName: node - linkType: hard - "@aws-sdk/util-config-provider@npm:3.55.0": version: 3.55.0 resolution: "@aws-sdk/util-config-provider@npm:3.55.0" @@ -2863,16 +1967,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-credentials@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/util-credentials@npm:3.47.2" - dependencies: - "@aws-sdk/shared-ini-file-loader": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/801cd30e796e8b09873beab22cc02ca941b3eb93e0f8241bf473bc26ddd3bd87cdfe7f289e9846fa68a5dad0032cf2bca011cce63eecc3a635ef0aa0c2117f73 - languageName: node - linkType: hard - "@aws-sdk/util-defaults-mode-browser@npm:3.142.0": version: 3.142.0 resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.142.0" @@ -2885,18 +1979,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-browser@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.47.2" - dependencies: - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - bowser: "npm:^2.11.0" - tslib: "npm:^2.3.0" - checksum: 10/d987d132b6e0efb8d5b27f72dfa7ea5f642b2f6f9a13bec6bceb4d37c5345f04ce9e5ef296e83fc4f68d4f2d5bd08f656fe28390a57a0b86a87f7e3de909d6cd - languageName: node - linkType: hard - "@aws-sdk/util-defaults-mode-browser@npm:3.99.0": version: 3.99.0 resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.99.0" @@ -2923,20 +2005,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-node@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/util-defaults-mode-node@npm:3.47.2" - dependencies: - "@aws-sdk/config-resolver": "npm:3.47.2" - "@aws-sdk/credential-provider-imds": "npm:3.47.2" - "@aws-sdk/node-config-provider": "npm:3.47.2" - "@aws-sdk/property-provider": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/dfb2892338a3b0f2b58ab7569fc6271eaae5b0bf2889ca87fc6f1deffe59813c70e8874a8a8ec45882cbf97d5e56536b157022249bcc951f7f29a098a1623412 - languageName: node - linkType: hard - "@aws-sdk/util-defaults-mode-node@npm:3.99.0": version: 3.99.0 resolution: "@aws-sdk/util-defaults-mode-node@npm:3.99.0" @@ -2972,15 +2040,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-hex-encoding@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/util-hex-encoding@npm:3.47.1" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/9a76516009af3f32eecbf69062de7178ba61dac9f4a9203337712cd2a31a723f74bf452d864cb8d3b1351d548acb9ae12bfd43429df53e354d4993c393d4f0ee - languageName: node - linkType: hard - "@aws-sdk/util-hex-encoding@npm:3.58.0": version: 3.58.0 resolution: "@aws-sdk/util-hex-encoding@npm:3.58.0" @@ -3017,35 +2076,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-stream-browser@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/util-stream-browser@npm:3.78.0" - dependencies: - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/b7ffa0c49561c816625a1d147b3958c9320f90469cb2bbbc475a99c7ec6bc009e4a8a05032d55e91d4d51a54743ab6eeb96ee91b867985bc688364340bbe2550 - languageName: node - linkType: hard - -"@aws-sdk/util-stream-node@npm:3.78.0": - version: 3.78.0 - resolution: "@aws-sdk/util-stream-node@npm:3.78.0" - dependencies: - "@aws-sdk/types": "npm:3.78.0" - tslib: "npm:^2.3.1" - checksum: 10/2054d281919c54a1b85ce04de3d8e4c0a6273ee88f7d3073cfaefe0fd1d815203eebefe17f550d5a7e4884f66c03faa6c60ac94ca34d1eaa274590f562d20b28 - languageName: node - linkType: hard - -"@aws-sdk/util-uri-escape@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/util-uri-escape@npm:3.47.1" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/68fc6e1909d884c2ef7d019428c003f61fc70971e020aa1656a12012a6e8e0a04df844a0b16ee20b757b3940c40ddeb27f8b35739bfef23b9629f74cf195e0e3 - languageName: node - linkType: hard - "@aws-sdk/util-uri-escape@npm:3.55.0": version: 3.55.0 resolution: "@aws-sdk/util-uri-escape@npm:3.55.0" @@ -3066,17 +2096,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.47.2" - dependencies: - "@aws-sdk/types": "npm:3.47.1" - bowser: "npm:^2.11.0" - tslib: "npm:^2.3.0" - checksum: 10/d174e3cc9f1ccc771d816ff0d509673252f2950a097ed0752a1d323834b8bcc2e4598d4bd18b1f9bc07dcc7648e9c4e023461bace2dc55469babf09700baa421 - languageName: node - linkType: hard - "@aws-sdk/util-user-agent-browser@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/util-user-agent-browser@npm:3.577.0" @@ -3116,17 +2135,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/util-user-agent-node@npm:3.47.2" - dependencies: - "@aws-sdk/node-config-provider": "npm:3.47.2" - "@aws-sdk/types": "npm:3.47.1" - tslib: "npm:^2.3.0" - checksum: 10/3fdaf3e174ead8b08029b7c30c9802a27b6a61b02581f11bb2c0fa3b66b9eafd3739c9bdeb6df554473e3a75d680553f1a98adb48d035b858c20b379341d5bfc - languageName: node - linkType: hard - "@aws-sdk/util-user-agent-node@npm:3.577.0": version: 3.577.0 resolution: "@aws-sdk/util-user-agent-node@npm:3.577.0" @@ -3164,15 +2172,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-utf8-browser@npm:3.47.1": - version: 3.47.1 - resolution: "@aws-sdk/util-utf8-browser@npm:3.47.1" - dependencies: - tslib: "npm:^2.3.0" - checksum: 10/c6a7eeef1ddf9a08621c08036b2f44fe6dd700feb4beb71e150c3060c493c907df6b745663bc18d53ce03483c54fae55532b479ba34440bbfb8dcb385013bbd1 - languageName: node - linkType: hard - "@aws-sdk/util-utf8-browser@npm:3.55.0, @aws-sdk/util-utf8-browser@npm:^3.0.0": version: 3.55.0 resolution: "@aws-sdk/util-utf8-browser@npm:3.55.0" @@ -3192,16 +2191,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-utf8-node@npm:3.47.2": - version: 3.47.2 - resolution: "@aws-sdk/util-utf8-node@npm:3.47.2" - dependencies: - "@aws-sdk/util-buffer-from": "npm:3.47.2" - tslib: "npm:^2.3.0" - checksum: 10/eaf0696d0430e7c4084a08adf305e1ff9840bb1a6c30df5687b822802d550f82d4ade355d6d62a1955f397f094ee582c3e37e0a5f0bf37a2cab95e9e02d7c970 - languageName: node - linkType: hard - "@aws-sdk/util-utf8-node@npm:3.55.0": version: 3.55.0 resolution: "@aws-sdk/util-utf8-node@npm:3.55.0" @@ -3223,15 +2212,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/xml-builder@npm:3.55.0": - version: 3.55.0 - resolution: "@aws-sdk/xml-builder@npm:3.55.0" - dependencies: - tslib: "npm:^2.3.1" - checksum: 10/0924d5725921c1e6fa6685a9dba135747f977457dc9d957e35e7b92f4bccfc80b9a57d0d044179dcd73be4029fb0c3826571595dcaaf7da30016641e9e81f3d4 - languageName: node - linkType: hard - "@aws-sdk/xml-builder@npm:3.575.0": version: 3.575.0 resolution: "@aws-sdk/xml-builder@npm:3.575.0" @@ -6069,6 +5049,17 @@ __metadata: languageName: node linkType: hard +"@effect/schema@npm:0.71.1": + version: 0.71.1 + resolution: "@effect/schema@npm:0.71.1" + dependencies: + fast-check: "npm:^3.21.0" + peerDependencies: + effect: ^3.6.5 + checksum: 10/d8ef78980409ce6fbe3de5ccba976cdcce86014916613a12dc9826ee27ad64e8f94579718a3099c6a9fc460aaafd471f573e75f74dfeaafb89b98275b4d2ed70 + languageName: node + linkType: hard + "@emotion/babel-plugin@npm:^11.12.0": version: 11.12.0 resolution: "@emotion/babel-plugin@npm:11.12.0" @@ -6252,13 +5243,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/aix-ppc64@npm:0.19.12" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - "@esbuild/aix-ppc64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/aix-ppc64@npm:0.21.5" @@ -6287,13 +5271,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-arm64@npm:0.19.12" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/android-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/android-arm64@npm:0.21.5" @@ -6322,13 +5299,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-arm@npm:0.19.12" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - "@esbuild/android-arm@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/android-arm@npm:0.21.5" @@ -6357,13 +5327,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-x64@npm:0.19.12" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - "@esbuild/android-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/android-x64@npm:0.21.5" @@ -6392,13 +5355,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/darwin-arm64@npm:0.19.12" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/darwin-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/darwin-arm64@npm:0.21.5" @@ -6427,13 +5383,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/darwin-x64@npm:0.19.12" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - "@esbuild/darwin-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/darwin-x64@npm:0.21.5" @@ -6462,13 +5411,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/freebsd-arm64@npm:0.19.12" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/freebsd-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/freebsd-arm64@npm:0.21.5" @@ -6497,13 +5439,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/freebsd-x64@npm:0.19.12" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/freebsd-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/freebsd-x64@npm:0.21.5" @@ -6532,13 +5467,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-arm64@npm:0.19.12" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/linux-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-arm64@npm:0.21.5" @@ -6567,13 +5495,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-arm@npm:0.19.12" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - "@esbuild/linux-arm@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-arm@npm:0.21.5" @@ -6602,13 +5523,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-ia32@npm:0.19.12" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/linux-ia32@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-ia32@npm:0.21.5" @@ -6637,13 +5551,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-loong64@npm:0.19.12" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - "@esbuild/linux-loong64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-loong64@npm:0.21.5" @@ -6672,13 +5579,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-mips64el@npm:0.19.12" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - "@esbuild/linux-mips64el@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-mips64el@npm:0.21.5" @@ -6707,13 +5607,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-ppc64@npm:0.19.12" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - "@esbuild/linux-ppc64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-ppc64@npm:0.21.5" @@ -6742,13 +5635,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-riscv64@npm:0.19.12" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - "@esbuild/linux-riscv64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-riscv64@npm:0.21.5" @@ -6777,13 +5663,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-s390x@npm:0.19.12" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - "@esbuild/linux-s390x@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-s390x@npm:0.21.5" @@ -6812,13 +5691,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-x64@npm:0.19.12" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - "@esbuild/linux-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-x64@npm:0.21.5" @@ -6847,13 +5719,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/netbsd-x64@npm:0.19.12" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/netbsd-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/netbsd-x64@npm:0.21.5" @@ -6889,13 +5754,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/openbsd-x64@npm:0.19.12" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/openbsd-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/openbsd-x64@npm:0.21.5" @@ -6924,13 +5782,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/sunos-x64@npm:0.19.12" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - "@esbuild/sunos-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/sunos-x64@npm:0.21.5" @@ -6959,13 +5810,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-arm64@npm:0.19.12" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/win32-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/win32-arm64@npm:0.21.5" @@ -6994,13 +5838,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-ia32@npm:0.19.12" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/win32-ia32@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/win32-ia32@npm:0.21.5" @@ -7029,13 +5866,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-x64@npm:0.19.12" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@esbuild/win32-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/win32-x64@npm:0.21.5" @@ -8467,16 +7297,16 @@ __metadata: dependencies: "@chainlink/ccip-read-server": "npm:^0.2.1" "@jest/globals": "npm:^29.7.0" - "@types/node": "npm:^16.9.1" + "@types/node": "npm:^18.14.5" dotenv-flow: "npm:^4.1.0" eslint: "npm:^9.15.0" - ethers: "npm:5.7.2" + ethers: "npm:^5.7.2" 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" - tsx: "npm:^4.7.1" + tsx: "npm:^4.19.1" typescript: "npm:5.3.3" languageName: unknown linkType: soft @@ -8495,7 +7325,7 @@ __metadata: "@hyperlane-xyz/utils": "npm:7.1.0" "@inquirer/core": "npm:9.0.10" "@inquirer/figures": "npm:1.0.5" - "@inquirer/prompts": "npm:^3.0.0" + "@inquirer/prompts": "npm:3.3.2" "@types/chai-as-promised": "npm:^8" "@types/mocha": "npm:^10.0.1" "@types/node": "npm:^18.14.5" @@ -8517,7 +7347,7 @@ __metadata: mocha: "npm:^10.2.0" prettier: "npm:^2.8.8" terminal-link: "npm:^3.0.0" - tsx: "npm:^4.7.1" + tsx: "npm:^4.19.1" typescript: "npm:5.3.3" yaml: "npm:2.4.5" yargs: "npm:^17.7.2" @@ -8541,12 +7371,12 @@ __metadata: "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@openzeppelin/contracts": "npm:^4.9.3" - "@openzeppelin/contracts-upgradeable": "npm:^v4.9.3" + "@openzeppelin/contracts-upgradeable": "npm:^4.9.3" "@typechain/ethers-v5": "npm:^11.1.2" "@typechain/ethers-v6": "npm:^0.5.1" "@typechain/hardhat": "npm:^9.1.0" "@types/node": "npm:^18.14.5" - chai: "npm:4.5.0" + chai: "npm:^4.5.0" ethereum-waffle: "npm:^4.0.10" ethers: "npm:^5.7.2" fx-portal: "npm:^1.0.3" @@ -8578,7 +7408,7 @@ __metadata: "@cloudflare/vitest-pool-workers": "npm:^0.4.5" "@cloudflare/workers-types": "npm:^4.20240821.1" "@faker-js/faker": "npm:^8.4.1" - chai: "npm:4.5.0" + chai: "npm:^4.5.0" prettier: "npm:^2.8.8" typescript: "npm:5.3.3" vitest: "npm:1.4.0" @@ -8603,7 +7433,7 @@ __metadata: "@typechain/hardhat": "npm:^9.1.0" "@typescript-eslint/eslint-plugin": "npm:^8.1.6" "@typescript-eslint/parser": "npm:^8.1.6" - chai: "npm:4.5.0" + chai: "npm:^4.5.0" eslint: "npm:^9.15.0" eslint-config-prettier: "npm:^9.1.0" eslint-import-resolver-typescript: "npm:^3.6.3" @@ -8632,21 +7462,21 @@ __metadata: version: 0.0.0-use.local resolution: "@hyperlane-xyz/infra@workspace:typescript/infra" dependencies: - "@arbitrum/sdk": "npm:^3.0.0" + "@arbitrum/sdk": "npm:^4.0.0" "@aws-sdk/client-iam": "npm:^3.74.0" - "@aws-sdk/client-kms": "npm:3.48.0" - "@aws-sdk/client-s3": "npm:^3.74.0" + "@aws-sdk/client-kms": "npm:^3.577.0" + "@aws-sdk/client-s3": "npm:^3.577.0" "@cosmjs/amino": "npm:^0.32.4" "@eth-optimism/sdk": "npm:^3.1.6" "@ethersproject/experimental": "npm:^5.7.0" "@ethersproject/hardware-wallets": "npm:^5.7.0" - "@ethersproject/providers": "npm:^5.7.2" + "@ethersproject/providers": "npm:*" "@google-cloud/secret-manager": "npm:^5.5.0" "@hyperlane-xyz/helloworld": "npm:7.1.0" "@hyperlane-xyz/registry": "npm:6.1.0" "@hyperlane-xyz/sdk": "npm:7.1.0" "@hyperlane-xyz/utils": "npm:7.1.0" - "@inquirer/prompts": "npm:^5.3.8" + "@inquirer/prompts": "npm:3.3.2" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-etherscan": "npm:^3.0.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" @@ -8657,13 +7487,13 @@ __metadata: "@types/chai": "npm:^4.2.21" "@types/json-stable-stringify": "npm:^1.0.36" "@types/mocha": "npm:^10.0.1" - "@types/node": "npm:^16.9.1" + "@types/node": "npm:^18.14.5" "@types/prompts": "npm:^2.0.14" "@types/sinon-chai": "npm:^3.2.12" "@types/yargs": "npm:^17.0.24" - asn1.js: "npm:5.4.1" + asn1.js: "npm:^5.4.1" aws-kms-ethers-signer: "npm:^0.1.3" - chai: "npm:4.5.0" + chai: "npm:^4.5.0" deep-object-diff: "npm:^1.1.9" dotenv: "npm:^10.0.0" ethereum-waffle: "npm:^4.0.10" @@ -8674,7 +7504,7 @@ __metadata: prettier: "npm:^2.8.8" prom-client: "npm:^14.0.1" prompts: "npm:^2.4.2" - tsx: "npm:^4.7.1" + tsx: "npm:^4.19.1" typescript: "npm:5.3.3" yaml: "npm:2.4.5" yargs: "npm:^17.7.2" @@ -8700,7 +7530,8 @@ __metadata: husky: "npm:^8.0.0" lint-staged: "npm:^12.4.3" prettier: "npm:^2.8.8" - tsx: "npm:^4.7.1" + syncpack: "npm:^13.0.0" + tsx: "npm:^4.19.1" languageName: unknown linkType: soft @@ -8719,7 +7550,7 @@ __metadata: resolution: "@hyperlane-xyz/sdk@workspace:typescript/sdk" dependencies: "@arbitrum/sdk": "npm:^4.0.0" - "@aws-sdk/client-s3": "npm:^3.74.0" + "@aws-sdk/client-s3": "npm:^3.577.0" "@chain-registry/types": "npm:^0.50.14" "@cosmjs/cosmwasm-stargate": "npm:^0.32.4" "@cosmjs/stargate": "npm:^0.32.4" @@ -8734,14 +7565,14 @@ __metadata: "@solana/spl-token": "npm:^0.4.9" "@solana/web3.js": "npm:^1.95.4" "@types/mocha": "npm:^10.0.1" - "@types/node": "npm:^16.9.1" + "@types/node": "npm:^18.14.5" "@types/sinon": "npm:^17.0.1" "@types/sinon-chai": "npm:^3.2.12" "@types/ws": "npm:^8.5.5" "@typescript-eslint/eslint-plugin": "npm:^8.1.6" "@typescript-eslint/parser": "npm:^8.1.6" bignumber.js: "npm:^9.1.1" - chai: "npm:4.5.0" + chai: "npm:^4.5.0" cosmjs-types: "npm:^0.9.0" cross-fetch: "npm:^3.1.5" dotenv: "npm:^10.0.0" @@ -8757,7 +7588,7 @@ __metadata: prettier: "npm:^2.8.8" sinon: "npm:^13.0.2" ts-node: "npm:^10.8.0" - tsx: "npm:^4.7.1" + tsx: "npm:^4.19.1" typescript: "npm:5.3.3" viem: "npm:^2.21.45" yaml: "npm:2.4.5" @@ -8782,7 +7613,7 @@ __metadata: "@typescript-eslint/eslint-plugin": "npm:^8.1.6" "@typescript-eslint/parser": "npm:^8.1.6" bignumber.js: "npm:^9.1.1" - chai: "npm:4.5.0" + chai: "npm:^4.5.0" eslint: "npm:^9.15.0" eslint-config-prettier: "npm:^9.1.0" eslint-import-resolver-typescript: "npm:^3.6.3" @@ -8826,7 +7657,7 @@ __metadata: "@storybook/react-vite": "npm:^7.6.14" "@storybook/test": "npm:^7.6.14" "@tanstack/react-query": "npm:^5.59.20" - "@types/node": "npm:^18.11.18" + "@types/node": "npm:^18.14.5" "@types/react": "npm:^18.0.27" "@types/react-dom": "npm:^18.0.10" "@types/ws": "npm:^8.5.5" @@ -8851,7 +7682,7 @@ __metadata: tailwindcss: "npm:^3.4.13" ts-node: "npm:^10.8.0" typescript: "npm:5.3.3" - viem: "npm:^2.21.41" + viem: "npm:^2.21.45" vite: "npm:^5.1.1" wagmi: "npm:^2.12.26" peerDependencies: @@ -8860,54 +7691,31 @@ __metadata: languageName: unknown linkType: soft -"@inquirer/checkbox@npm:^1.3.5": - version: 1.3.5 - resolution: "@inquirer/checkbox@npm:1.3.5" +"@inquirer/checkbox@npm:^1.5.2": + version: 1.5.2 + resolution: "@inquirer/checkbox@npm:1.5.2" dependencies: - "@inquirer/core": "npm:^3.0.0" - "@inquirer/type": "npm:^1.1.1" + "@inquirer/core": "npm:^6.0.0" + "@inquirer/type": "npm:^1.1.6" ansi-escapes: "npm:^4.3.2" chalk: "npm:^4.1.2" figures: "npm:^3.2.0" - checksum: 10/e7e984ef44afe2dcdcf2bb56f24065ca15954ee0a16edbc0d614df8de383123a0e956c7c22e1786b60bc0dfb41f98fbcfb89fd33adabff26e223c5acd918aac1 + checksum: 10/00e4dd403c739ce91368915d08ad98000a8dc7a83fe6fca12a4445b47768beb1c86dd99c675d79df6658a93cebca54286e34415c51f8926e6ffb338a2feb4db5 languageName: node linkType: hard -"@inquirer/checkbox@npm:^2.4.7": - version: 2.4.7 - resolution: "@inquirer/checkbox@npm:2.4.7" - dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/figures": "npm:^1.0.5" - "@inquirer/type": "npm:^1.5.2" - ansi-escapes: "npm:^4.3.2" - yoctocolors-cjs: "npm:^2.1.2" - checksum: 10/9bc0d6e9d6db90bcda3771d6b96e885e8c4e1f03d96a4fcd04b4eab2fafbecfafbced7a5cc24eca73f677452f9e354505f9cfb79a884dcf06772550845014d6f - languageName: node - linkType: hard - -"@inquirer/confirm@npm:^2.0.6": - version: 2.0.6 - resolution: "@inquirer/confirm@npm:2.0.6" +"@inquirer/confirm@npm:^2.0.17": + version: 2.0.17 + resolution: "@inquirer/confirm@npm:2.0.17" dependencies: - "@inquirer/core": "npm:^3.0.0" - "@inquirer/type": "npm:^1.1.1" + "@inquirer/core": "npm:^6.0.0" + "@inquirer/type": "npm:^1.1.6" chalk: "npm:^4.1.2" - checksum: 10/efbfeca4c2750ec65fd603d041039356d1f3f5b321305e11fefe40ebc7aa69e8e82fde42f216967462541a9a742768b8f816e4b5c86b3e82c0c886f7227e65ac - languageName: node - linkType: hard - -"@inquirer/confirm@npm:^3.1.22": - version: 3.1.22 - resolution: "@inquirer/confirm@npm:3.1.22" - dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/type": "npm:^1.5.2" - checksum: 10/14e547ae3194c6447d41bb87135c03aa5598fd340fced19e4e8bae1be4ae54a9ad3cf335a9c3c6dc54e2ffb7928319e0f4b428531b8ce720cd23d2444292ca36 + checksum: 10/76cdf50881c21bcab4813600502fb3975cbed56a85ad6deaaf06832b92b78b9c932842ffda0e911f29d7dee79dd9dc4724735bd1d60562a509c8ef6317c28c69 languageName: node linkType: hard -"@inquirer/core@npm:9.0.10, @inquirer/core@npm:^9.0.10": +"@inquirer/core@npm:9.0.10": version: 9.0.10 resolution: "@inquirer/core@npm:9.0.10" dependencies: @@ -8928,71 +7736,49 @@ __metadata: languageName: node linkType: hard -"@inquirer/core@npm:^3.0.0": - version: 3.0.0 - resolution: "@inquirer/core@npm:3.0.0" +"@inquirer/core@npm:^6.0.0": + version: 6.0.0 + resolution: "@inquirer/core@npm:6.0.0" dependencies: - "@inquirer/type": "npm:^1.1.1" - "@types/mute-stream": "npm:^0.0.1" - "@types/node": "npm:^20.4.2" + "@inquirer/type": "npm:^1.1.6" + "@types/mute-stream": "npm:^0.0.4" + "@types/node": "npm:^20.10.7" "@types/wrap-ansi": "npm:^3.0.0" ansi-escapes: "npm:^4.3.2" chalk: "npm:^4.1.2" - cli-spinners: "npm:^2.8.0" - cli-width: "npm:^4.0.0" + cli-spinners: "npm:^2.9.2" + cli-width: "npm:^4.1.0" figures: "npm:^3.2.0" mute-stream: "npm:^1.0.0" run-async: "npm:^3.0.0" - string-width: "npm:^4.2.3" + signal-exit: "npm:^4.1.0" strip-ansi: "npm:^6.0.1" - wrap-ansi: "npm:^6.0.1" - checksum: 10/7524c15d004e1686c5b66086fe70b50ab50983dd6f887a90fa765cc4f9ae2ba7e063dbf0cb740233d55ee1c8b60f10a7b957245bee95223e755e9632c77a9ca4 + wrap-ansi: "npm:^6.2.0" + checksum: 10/a9f79fe538deab439afc845e16fa8832872b4562be6e39a5de8b50eca3e2b27be0e470fc4ee014f202a750213adc8a06068402d51d6d7b34b118b12b08200f85 languageName: node linkType: hard -"@inquirer/editor@npm:^1.2.4": - version: 1.2.4 - resolution: "@inquirer/editor@npm:1.2.4" +"@inquirer/editor@npm:^1.2.15": + version: 1.2.15 + resolution: "@inquirer/editor@npm:1.2.15" dependencies: - "@inquirer/core": "npm:^3.0.0" - "@inquirer/type": "npm:^1.1.1" + "@inquirer/core": "npm:^6.0.0" + "@inquirer/type": "npm:^1.1.6" chalk: "npm:^4.1.2" - external-editor: "npm:^3.0.3" - checksum: 10/a3dac45256d334f79061b0e79b8e9427ee5d5b244367ac582811148f0fe2c7fc3bfaec3aab5fda0ea0293ff23c3c2ef2e66fdf6f6f9b56cf628b265d9cab5afd - languageName: node - linkType: hard - -"@inquirer/editor@npm:^2.1.22": - version: 2.1.22 - resolution: "@inquirer/editor@npm:2.1.22" - dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/type": "npm:^1.5.2" external-editor: "npm:^3.1.0" - checksum: 10/d36255567c88ea48bf1071b00c502d6a32bc1402966db4f9ae1be59d41d64d11e02111317d880d0bdc42fbfb1b819240fb229c89b07dfb804a6d5fb176ab8bb0 + checksum: 10/fbb79f9972aae4cbf7a2e4c36995cf7c6e77b235c47cdd1a05e69f71626aa1ac48ddb3adc3a118568eea2bf5322bfafea71bd62a7969c883c15dbf71e9630e39 languageName: node linkType: hard -"@inquirer/expand@npm:^1.1.5": - version: 1.1.5 - resolution: "@inquirer/expand@npm:1.1.5" +"@inquirer/expand@npm:^1.1.16": + version: 1.1.16 + resolution: "@inquirer/expand@npm:1.1.16" dependencies: - "@inquirer/core": "npm:^3.0.0" - "@inquirer/type": "npm:^1.1.1" + "@inquirer/core": "npm:^6.0.0" + "@inquirer/type": "npm:^1.1.6" chalk: "npm:^4.1.2" figures: "npm:^3.2.0" - checksum: 10/04df9f1713864a965bfaff12358cbd4de97f58363dfb0b625ba4c4b4736bdb1cef38b5a726024ea41b0a55cdbdd1d271fbb6659a8e7fce8927383a8d1bf77562 - languageName: node - linkType: hard - -"@inquirer/expand@npm:^2.1.22": - version: 2.1.22 - resolution: "@inquirer/expand@npm:2.1.22" - dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/type": "npm:^1.5.2" - yoctocolors-cjs: "npm:^2.1.2" - checksum: 10/f997ba916d3ddcc6e2563158805e2ae7a7a6f98e24cf0a08e23d4101b7d78f78e7dce28e648b85ca7f41759eeefdf1c6f6abf2bce0f041fbda54aacf68522454 + checksum: 10/5158f8eb807bd1d55e7e7ca9288051f5947970b32b1a33cd9c94ea228c03cdb18508be5ecd0237061276721f5c9ca96741b3e2c288123c526cdd5049cdf566db languageName: node linkType: hard @@ -9003,158 +7789,76 @@ __metadata: languageName: node linkType: hard -"@inquirer/input@npm:^1.2.5": - version: 1.2.5 - resolution: "@inquirer/input@npm:1.2.5" - dependencies: - "@inquirer/core": "npm:^3.0.0" - "@inquirer/type": "npm:^1.1.1" - chalk: "npm:^4.1.2" - checksum: 10/6a524e231e19f9d2dc80b475722c25b94cfdbc3f4e70491f70f9bdd92409eb1a4f6c856f21d76953c4b6880ce5b657a8acfd12a5cfa7fe2b38f460df8729ce56 - languageName: node - linkType: hard - -"@inquirer/input@npm:^2.2.9": - version: 2.2.9 - resolution: "@inquirer/input@npm:2.2.9" - dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/type": "npm:^1.5.2" - checksum: 10/9d0c97da9cc6972d4fb5bcb077e00e581aae90f6891d33c1c5e2f0324023c1772c6d5b03cd30ec7d4f71d22791d38bf45c47bafbe7dd9f74446693e7b120a2b0 - languageName: node - linkType: hard - -"@inquirer/number@npm:^1.0.10": - version: 1.0.10 - resolution: "@inquirer/number@npm:1.0.10" - dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/type": "npm:^1.5.2" - checksum: 10/0f9323b581e1c35ee8fbf2acde301c3e354896aeac83f6854e9672575090e0d092d19aadadb3477659079c403e63a3206bf668dd4c87e86834f775744f57c955 - languageName: node - linkType: hard - -"@inquirer/password@npm:^1.1.5": - version: 1.1.5 - resolution: "@inquirer/password@npm:1.1.5" +"@inquirer/input@npm:^1.2.16": + version: 1.2.16 + resolution: "@inquirer/input@npm:1.2.16" dependencies: - "@inquirer/input": "npm:^1.2.5" - "@inquirer/type": "npm:^1.1.1" + "@inquirer/core": "npm:^6.0.0" + "@inquirer/type": "npm:^1.1.6" chalk: "npm:^4.1.2" - checksum: 10/81aa1a101cfffdcaab6e12487ffc672e5a5cad0c4e2c504f0c56b7bf3119077826d6df5b0a35a2a938c1ff888618d68e656f7acc5103abd5d7b2b56e97aa5ff3 + checksum: 10/b4b189832ee900b9e088f43a1ce3a959c493ffb06bb112ff166603962e79981086cdf809b63ad908e1f531b52cd467c0681a8dae98005fc0eebe7cee43e41286 languageName: node linkType: hard -"@inquirer/password@npm:^2.1.22": - version: 2.1.22 - resolution: "@inquirer/password@npm:2.1.22" +"@inquirer/password@npm:^1.1.16": + version: 1.1.16 + resolution: "@inquirer/password@npm:1.1.16" dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/type": "npm:^1.5.2" + "@inquirer/core": "npm:^6.0.0" + "@inquirer/type": "npm:^1.1.6" ansi-escapes: "npm:^4.3.2" - checksum: 10/ce4e7c268f267c7436cf3a1b2890a9c92fddc2928bbe141d48f2f5a5daedbb3a2c601e44b0fe4e255792676ed241118ba69756b0d0b7d4492e0b7ee8fc548b90 - languageName: node - linkType: hard - -"@inquirer/prompts@npm:^3.0.0": - version: 3.0.0 - resolution: "@inquirer/prompts@npm:3.0.0" - dependencies: - "@inquirer/checkbox": "npm:^1.3.5" - "@inquirer/confirm": "npm:^2.0.6" - "@inquirer/core": "npm:^3.0.0" - "@inquirer/editor": "npm:^1.2.4" - "@inquirer/expand": "npm:^1.1.5" - "@inquirer/input": "npm:^1.2.5" - "@inquirer/password": "npm:^1.1.5" - "@inquirer/rawlist": "npm:^1.2.5" - "@inquirer/select": "npm:^1.2.5" - checksum: 10/aa35f8543f78f52b8cb939ac8fefd994fa3b118414525209c0993c40ecff856797c3050b8974bfec49eecadfdd25a6ecb50bb122ffc253ae2b0e4e9b5af1043b - languageName: node - linkType: hard - -"@inquirer/prompts@npm:^5.3.8": - version: 5.3.8 - resolution: "@inquirer/prompts@npm:5.3.8" - dependencies: - "@inquirer/checkbox": "npm:^2.4.7" - "@inquirer/confirm": "npm:^3.1.22" - "@inquirer/editor": "npm:^2.1.22" - "@inquirer/expand": "npm:^2.1.22" - "@inquirer/input": "npm:^2.2.9" - "@inquirer/number": "npm:^1.0.10" - "@inquirer/password": "npm:^2.1.22" - "@inquirer/rawlist": "npm:^2.2.4" - "@inquirer/search": "npm:^1.0.7" - "@inquirer/select": "npm:^2.4.7" - checksum: 10/e60eba0d64590c96fed722107962f433fbd8ff13f5d8a3ad6ba56964db69c8bc6b91a439b4e90209184090aacf73d84b0504e8c5a6a0f778ced70deb580ac1cd - languageName: node - linkType: hard - -"@inquirer/rawlist@npm:^1.2.5": - version: 1.2.5 - resolution: "@inquirer/rawlist@npm:1.2.5" - dependencies: - "@inquirer/core": "npm:^3.0.0" - "@inquirer/type": "npm:^1.1.1" chalk: "npm:^4.1.2" - checksum: 10/e94388228305b0d1b49b4f4c6b744c89614c7f413cae2098ff5f7d685ae485b9ad3af9f93796061fad2c8bfa816e7daa9e349ee2499398011744d7c03f6718c3 + checksum: 10/f40309775c690a1d4d39fba1c1bb2a2b4b1beb8b20b1956a4541d4191d7b5eab8ac663c0d0c01caff413cecdf3b2e36e527c391f3aa9a8fc1931f329056e0a81 languageName: node linkType: hard -"@inquirer/rawlist@npm:^2.2.4": - version: 2.2.4 - resolution: "@inquirer/rawlist@npm:2.2.4" +"@inquirer/prompts@npm:3.3.2": + version: 3.3.2 + resolution: "@inquirer/prompts@npm:3.3.2" dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/type": "npm:^1.5.2" - yoctocolors-cjs: "npm:^2.1.2" - checksum: 10/dd9d34a5cca081d53a9798cdfed2fdb61455dcfa856f54bc036dc5f57aceb95a7484487632c157bdba75e50de24990ebb3bb178ee765b8c0a735ff61b29cebf4 + "@inquirer/checkbox": "npm:^1.5.2" + "@inquirer/confirm": "npm:^2.0.17" + "@inquirer/core": "npm:^6.0.0" + "@inquirer/editor": "npm:^1.2.15" + "@inquirer/expand": "npm:^1.1.16" + "@inquirer/input": "npm:^1.2.16" + "@inquirer/password": "npm:^1.1.16" + "@inquirer/rawlist": "npm:^1.2.16" + "@inquirer/select": "npm:^1.3.3" + checksum: 10/d8b18c1fc87fd6774d6934600d2d7eda493bb3cceeb7f9d079acfac507d851b66cf9e9cd2dee3146649bf72db5d1788dacd7e22708bbcebc4c5a00fd94f08b67 languageName: node linkType: hard -"@inquirer/search@npm:^1.0.7": - version: 1.0.7 - resolution: "@inquirer/search@npm:1.0.7" +"@inquirer/rawlist@npm:^1.2.16": + version: 1.2.16 + resolution: "@inquirer/rawlist@npm:1.2.16" dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/figures": "npm:^1.0.5" - "@inquirer/type": "npm:^1.5.2" - yoctocolors-cjs: "npm:^2.1.2" - checksum: 10/3cd401cc1a7b01772e0e50ee27a0560cc647900f475d28a4f9b07843d4a85e1555c6adc1d7bc38ad2ef3546c524ca82c60272490d0bb159632c03cbe01f52bb1 + "@inquirer/core": "npm:^6.0.0" + "@inquirer/type": "npm:^1.1.6" + chalk: "npm:^4.1.2" + checksum: 10/a4acefb0f54e4d4c3f7c44d35971cb0b8cbf2acd6dbe490576cd24369f3304ff4a36255cd4cc851c2de7c037cf70f71c129bc6c8c5c80dce495998e6168904fd languageName: node linkType: hard -"@inquirer/select@npm:^1.2.5": - version: 1.2.5 - resolution: "@inquirer/select@npm:1.2.5" +"@inquirer/select@npm:^1.3.3": + version: 1.3.3 + resolution: "@inquirer/select@npm:1.3.3" dependencies: - "@inquirer/core": "npm:^3.0.0" - "@inquirer/type": "npm:^1.1.1" + "@inquirer/core": "npm:^6.0.0" + "@inquirer/type": "npm:^1.1.6" ansi-escapes: "npm:^4.3.2" chalk: "npm:^4.1.2" figures: "npm:^3.2.0" - checksum: 10/42dec9663740db98d043d39aa799f1292d08ed12725520b316bbe3f7cb48d55e3587725072bdf5720220a2d29befb6f80544e914aa5e54bdfb4d4e00c9299f7d + checksum: 10/0f33c51ab69c156b96092bfb107d08dd0f4227274917b9406aa23877e3ba94fd6738800fb973c44c051aaebdba72d07dc328df4b76e6e1285f68aa01a7ed0ed8 languageName: node linkType: hard -"@inquirer/select@npm:^2.4.7": - version: 2.4.7 - resolution: "@inquirer/select@npm:2.4.7" +"@inquirer/type@npm:^1.1.6": + version: 1.5.5 + resolution: "@inquirer/type@npm:1.5.5" dependencies: - "@inquirer/core": "npm:^9.0.10" - "@inquirer/figures": "npm:^1.0.5" - "@inquirer/type": "npm:^1.5.2" - ansi-escapes: "npm:^4.3.2" - yoctocolors-cjs: "npm:^2.1.2" - checksum: 10/854a3d0393073913f9bd3bf2e4ec7b8d114dfb48308a0a6698cf5c2c627da2700db5bdb69d054eaec89bd4e52a1274e493fa78d4fa26a5893972d91825456047 - languageName: node - linkType: hard - -"@inquirer/type@npm:^1.1.1": - version: 1.1.1 - resolution: "@inquirer/type@npm:1.1.1" - checksum: 10/1fcce0bd6c92611ed67ee9252deebba0fa9a54aeb4e37fc349ec736c8e1ffaa58f3a02dbe84489ff9a90bebc6b1080a19169ef30c16a18128cf8f42d06a49f51 + mute-stream: "npm:^1.0.0" + checksum: 10/bd3f3d7510785af4ad599e042e99e4be6380f52f79f3db140fe6fed0a605acf27b1a0a20fb5cc688eaf7b8aa0c36dacb1d89c7bba4586f38cbf58ba9f159e7b5 languageName: node linkType: hard @@ -10982,7 +9686,7 @@ __metadata: languageName: node linkType: hard -"@openzeppelin/contracts-upgradeable@npm:^4.9.3, @openzeppelin/contracts-upgradeable@npm:^v4.9.3": +"@openzeppelin/contracts-upgradeable@npm:^4.9.3": version: 4.9.3 resolution: "@openzeppelin/contracts-upgradeable@npm:4.9.3" checksum: 10/d8fd6fd9d2271fbdd3958c20769b72a241687883ecd3bea05a3969568cdcabdee9d53c21ac776a651c397507d9c22d8db0a4fb970d27bdab918979fae7285a2f @@ -14206,6 +12910,13 @@ __metadata: languageName: node linkType: hard +"@sindresorhus/merge-streams@npm:^2.1.0": + version: 2.3.0 + resolution: "@sindresorhus/merge-streams@npm:2.3.0" + checksum: 10/798bcb53cd1ace9df84fcdd1ba86afdc9e0cd84f5758d26ae9b1eefd8e8887e5fc30051132b9e74daf01bb41fa5a2faf1369361f83d76a3b3d7ee938058fd71c + languageName: node + linkType: hard + "@sinonjs/commons@npm:^1.6.0, @sinonjs/commons@npm:^1.7.0, @sinonjs/commons@npm:^1.8.3": version: 1.8.3 resolution: "@sinonjs/commons@npm:1.8.3" @@ -16968,15 +15679,6 @@ __metadata: languageName: node linkType: hard -"@types/mute-stream@npm:^0.0.1": - version: 0.0.1 - resolution: "@types/mute-stream@npm:0.0.1" - dependencies: - "@types/node": "npm:*" - checksum: 10/01bb9f45a77b691538cba7f0c89166a5bfb112993056ae06a8218cd47d417a5f6a5cfc31f0d31293790c647d27564fe6aa39aa9cb2ef08792d42ed40f18de8d5 - languageName: node - linkType: hard - "@types/mute-stream@npm:^0.0.4": version: 0.0.4 resolution: "@types/mute-stream@npm:0.0.4" @@ -17068,14 +15770,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^16.9.1": - version: 16.18.38 - resolution: "@types/node@npm:16.18.38" - checksum: 10/233cc3c4ebbfb011ecd68a552080d4879ced7f66558ecab07d5adc504b3d52181ef31ce7be03c1a616afbc187530aac38f0016ce274d6b8fb89f79365b7c721a - languageName: node - linkType: hard - -"@types/node@npm:^18.0.0, @types/node@npm:^18.11.18": +"@types/node@npm:^18.0.0": version: 18.19.42 resolution: "@types/node@npm:18.19.42" dependencies: @@ -17091,10 +15786,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^20.4.2": - version: 20.4.5 - resolution: "@types/node@npm:20.4.5" - checksum: 10/aa31081f82a2d377f00cfd7ced73925753db1f542fca19e6b0442585a7322b8eacd957fdccaaff65d9976454d213af0980c12390c59a975cf8a368e3f872717a +"@types/node@npm:^20.10.7": + version: 20.17.8 + resolution: "@types/node@npm:20.17.8" + dependencies: + undici-types: "npm:~6.19.2" + checksum: 10/e3e968b327abc70fd437a223f8950dd4436047e954aa7db09abde5df1f58a5c49f33d6f14524e256d09719e1960d22bf072d62e4bda7375f7895a092c7eb2f9d languageName: node linkType: hard @@ -19145,7 +17842,7 @@ __metadata: languageName: node linkType: hard -"asn1.js@npm:5.4.1, asn1.js@npm:^5.4.1": +"asn1.js@npm:^5.4.1": version: 5.4.1 resolution: "asn1.js@npm:5.4.1" dependencies: @@ -20447,7 +19144,7 @@ __metadata: languageName: node linkType: hard -"chai@npm:4.5.0, chai@npm:^4.3.10, chai@npm:^4.3.7, chai@npm:^4.5.0": +"chai@npm:^4.3.10, chai@npm:^4.3.7, chai@npm:^4.5.0": version: 4.5.0 resolution: "chai@npm:4.5.0" dependencies: @@ -20492,6 +19189,22 @@ __metadata: languageName: node linkType: hard +"chalk-template@npm:1.1.0": + version: 1.1.0 + resolution: "chalk-template@npm:1.1.0" + dependencies: + chalk: "npm:^5.2.0" + checksum: 10/868aae8d4e7556ad2f35de4e04fe65dbe1ea6c5c80ad783f1c156d0a5c33f444c6814f49cbb68fe348c78e99daf2bcf566b47ad7e13603e4691ca78b2f422824 + languageName: node + linkType: hard + +"chalk@npm:5.3.0, chalk@npm:^5.2.0, chalk@npm:^5.3.0": + version: 5.3.0 + resolution: "chalk@npm:5.3.0" + checksum: 10/6373caaab21bd64c405bfc4bd9672b145647fc9482657b5ea1d549b3b2765054e9d3d928870cdf764fb4aad67555f5061538ff247b8310f110c5c888d92397ea + languageName: node + linkType: hard + "chalk@npm:^2.0.0, chalk@npm:^2.1.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -20523,13 +19236,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^5.3.0": - version: 5.3.0 - resolution: "chalk@npm:5.3.0" - checksum: 10/6373caaab21bd64c405bfc4bd9672b145647fc9482657b5ea1d549b3b2765054e9d3d928870cdf764fb4aad67555f5061538ff247b8310f110c5c888d92397ea - languageName: node - linkType: hard - "char-regex@npm:^1.0.2": version: 1.0.2 resolution: "char-regex@npm:1.0.2" @@ -20756,6 +19462,15 @@ __metadata: languageName: node linkType: hard +"cli-cursor@npm:^4.0.0": + version: 4.0.0 + resolution: "cli-cursor@npm:4.0.0" + dependencies: + restore-cursor: "npm:^4.0.0" + checksum: 10/ab3f3ea2076e2176a1da29f9d64f72ec3efad51c0960898b56c8a17671365c26e67b735920530eaf7328d61f8bd41c27f46b9cf6e4e10fe2fa44b5e8c0e392cc + languageName: node + linkType: hard + "cli-spinners@npm:^2.5.0, cli-spinners@npm:^2.9.2": version: 2.9.2 resolution: "cli-spinners@npm:2.9.2" @@ -20763,13 +19478,6 @@ __metadata: languageName: node linkType: hard -"cli-spinners@npm:^2.8.0": - version: 2.9.0 - resolution: "cli-spinners@npm:2.9.0" - checksum: 10/457497ccef70eec3f1d0825e4a3396ba43f6833a4900c2047c0efe2beecb1c0df476949ea378bcb6595754f7508e28ae943eeb30bbda807f59f547b270ec334c - languageName: node - linkType: hard - "cli-table3@npm:^0.5.0": version: 0.5.1 resolution: "cli-table3@npm:0.5.1" @@ -20830,13 +19538,6 @@ __metadata: languageName: node linkType: hard -"cli-width@npm:^4.0.0": - version: 4.0.0 - resolution: "cli-width@npm:4.0.0" - checksum: 10/6de44fee34dadfc95a68ba012ea4d06d776289c251a283473e5ee240f26bbade4816766eb699c78b91804943c405097155bddf8c3e492daf1da7d9ab38a89878 - languageName: node - linkType: hard - "cli-width@npm:^4.1.0": version: 4.1.0 resolution: "cli-width@npm:4.1.0" @@ -21070,6 +19771,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:12.1.0, commander@npm:^12.1.0": + version: 12.1.0 + resolution: "commander@npm:12.1.0" + checksum: 10/cdaeb672d979816853a4eed7f1310a9319e8b976172485c2a6b437ed0db0a389a44cfb222bfbde772781efa9f215bdd1b936f80d6b249485b465c6cb906e1f93 + languageName: node + linkType: hard + "commander@npm:3.0.2": version: 3.0.2 resolution: "commander@npm:3.0.2" @@ -21084,13 +19792,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:^12.1.0": - version: 12.1.0 - resolution: "commander@npm:12.1.0" - checksum: 10/cdaeb672d979816853a4eed7f1310a9319e8b976172485c2a6b437ed0db0a389a44cfb222bfbde772781efa9f215bdd1b936f80d6b249485b465c6cb906e1f93 - languageName: node - linkType: hard - "commander@npm:^2.20.3": version: 2.20.3 resolution: "commander@npm:2.20.3" @@ -21346,6 +20047,23 @@ __metadata: languageName: node linkType: hard +"cosmiconfig@npm:9.0.0": + version: 9.0.0 + resolution: "cosmiconfig@npm:9.0.0" + dependencies: + env-paths: "npm:^2.2.1" + import-fresh: "npm:^3.3.0" + js-yaml: "npm:^4.1.0" + parse-json: "npm:^5.2.0" + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/8bdf1dfbb6fdb3755195b6886dc0649a3c742ec75afa4cb8da7b070936aed22a4f4e5b7359faafe03180358f311dbc300d248fd6586c458203d376a40cc77826 + languageName: node + linkType: hard + "cosmiconfig@npm:^7.0.0": version: 7.1.0 resolution: "cosmiconfig@npm:7.1.0" @@ -22358,6 +21076,13 @@ __metadata: languageName: node linkType: hard +"effect@npm:3.6.5": + version: 3.6.5 + resolution: "effect@npm:3.6.5" + checksum: 10/e722cc1d262dfcff85b3e43d11edafb03d68e0acf670ed0d709d32218e6bf2ae7084ac627430094b1be6aee6ffdeec061b1d097d2216fce18ebc7264087ab2f0 + languageName: node + linkType: hard + "ejs@npm:^3.1.8": version: 3.1.10 resolution: "ejs@npm:3.1.10" @@ -22427,6 +21152,13 @@ __metadata: languageName: node linkType: hard +"emoji-regex@npm:^10.3.0": + version: 10.4.0 + resolution: "emoji-regex@npm:10.4.0" + checksum: 10/76bb92c5bcf0b6980d37e535156231e4a9d0aa6ab3b9f5eabf7690231d5aa5d5b8e516f36e6804cbdd0f1c23dfef2a60c40ab7bb8aedd890584281a565b97c50 + languageName: node + linkType: hard + "emoji-regex@npm:^7.0.1": version: 7.0.3 resolution: "emoji-regex@npm:7.0.3" @@ -22529,22 +21261,22 @@ __metadata: languageName: node linkType: hard -"enquirer@npm:^2.3.0": - version: 2.3.6 - resolution: "enquirer@npm:2.3.6" +"enquirer@npm:2.4.1, enquirer@npm:^2.3.6": + version: 2.4.1 + resolution: "enquirer@npm:2.4.1" dependencies: ansi-colors: "npm:^4.1.1" - checksum: 10/751d14f037eb7683997e696fb8d5fe2675e0b0cde91182c128cf598acf3f5bd9005f35f7c2a9109e291140af496ebec237b6dac86067d59a9b44f3688107f426 + strip-ansi: "npm:^6.0.1" + checksum: 10/b3726486cd98f0d458a851a03326a2a5dd4d84f37ff94ff2a2960c915e0fc865865da3b78f0877dc36ac5c1189069eca603e82ec63d5bc6b0dd9985bf6426d7a languageName: node linkType: hard -"enquirer@npm:^2.3.6": - version: 2.4.1 - resolution: "enquirer@npm:2.4.1" +"enquirer@npm:^2.3.0": + version: 2.3.6 + resolution: "enquirer@npm:2.3.6" dependencies: ansi-colors: "npm:^4.1.1" - strip-ansi: "npm:^6.0.1" - checksum: 10/b3726486cd98f0d458a851a03326a2a5dd4d84f37ff94ff2a2960c915e0fc865865da3b78f0877dc36ac5c1189069eca603e82ec63d5bc6b0dd9985bf6426d7a + checksum: 10/751d14f037eb7683997e696fb8d5fe2675e0b0cde91182c128cf598acf3f5bd9005f35f7c2a9109e291140af496ebec237b6dac86067d59a9b44f3688107f426 languageName: node linkType: hard @@ -22555,7 +21287,7 @@ __metadata: languageName: node linkType: hard -"env-paths@npm:^2.2.0": +"env-paths@npm:^2.2.0, env-paths@npm:^2.2.1": version: 2.2.1 resolution: "env-paths@npm:2.2.1" checksum: 10/65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e @@ -23165,86 +21897,6 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:~0.19.10": - version: 0.19.12 - resolution: "esbuild@npm:0.19.12" - dependencies: - "@esbuild/aix-ppc64": "npm:0.19.12" - "@esbuild/android-arm": "npm:0.19.12" - "@esbuild/android-arm64": "npm:0.19.12" - "@esbuild/android-x64": "npm:0.19.12" - "@esbuild/darwin-arm64": "npm:0.19.12" - "@esbuild/darwin-x64": "npm:0.19.12" - "@esbuild/freebsd-arm64": "npm:0.19.12" - "@esbuild/freebsd-x64": "npm:0.19.12" - "@esbuild/linux-arm": "npm:0.19.12" - "@esbuild/linux-arm64": "npm:0.19.12" - "@esbuild/linux-ia32": "npm:0.19.12" - "@esbuild/linux-loong64": "npm:0.19.12" - "@esbuild/linux-mips64el": "npm:0.19.12" - "@esbuild/linux-ppc64": "npm:0.19.12" - "@esbuild/linux-riscv64": "npm:0.19.12" - "@esbuild/linux-s390x": "npm:0.19.12" - "@esbuild/linux-x64": "npm:0.19.12" - "@esbuild/netbsd-x64": "npm:0.19.12" - "@esbuild/openbsd-x64": "npm:0.19.12" - "@esbuild/sunos-x64": "npm:0.19.12" - "@esbuild/win32-arm64": "npm:0.19.12" - "@esbuild/win32-ia32": "npm:0.19.12" - "@esbuild/win32-x64": "npm:0.19.12" - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10/861fa8eb2428e8d6521a4b7c7930139e3f45e8d51a86985cc29408172a41f6b18df7b3401e7e5e2d528cdf83742da601ddfdc77043ddc4f1c715a8ddb2d8a255 - languageName: node - linkType: hard - "esbuild@npm:~0.23.0": version: 0.23.1 resolution: "esbuild@npm:0.23.1" @@ -23976,7 +22628,24 @@ __metadata: languageName: node linkType: hard -"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": +"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: 10/a4cec0254f940a0fb118317d23676faa46eb5540fc0a3b9177b8aef71318f509ed19b8264f102b1a2a32d0256274ecc526fd926bd22a4a4ac25cd8e0e6560f12 + languageName: node + linkType: hard + +"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: @@ -24014,23 +22683,6 @@ __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: 10/a4cec0254f940a0fb118317d23676faa46eb5540fc0a3b9177b8aef71318f509ed19b8264f102b1a2a32d0256274ecc526fd926bd22a4a4ac25cd8e0e6560f12 - languageName: node - linkType: hard - "ethjs-unit@npm:0.1.6": version: 0.1.6 resolution: "ethjs-unit@npm:0.1.6" @@ -24322,7 +22974,7 @@ __metadata: languageName: node linkType: hard -"external-editor@npm:^3.0.3, external-editor@npm:^3.1.0": +"external-editor@npm:^3.1.0": version: 3.1.0 resolution: "external-editor@npm:3.1.0" dependencies: @@ -24375,6 +23027,24 @@ __metadata: languageName: node linkType: hard +"fast-check@npm:3.21.0": + version: 3.21.0 + resolution: "fast-check@npm:3.21.0" + dependencies: + pure-rand: "npm:^6.1.0" + checksum: 10/64e221858d5d98c6ea10c81e6a1a66760565bca41883466891974197a5439c7f0fe1dc293b8d887eaf959d0ff85197cc9d76813ae6215b018cde313254db7d53 + languageName: node + linkType: hard + +"fast-check@npm:^3.21.0": + version: 3.23.1 + resolution: "fast-check@npm:3.23.1" + dependencies: + pure-rand: "npm:^6.1.0" + checksum: 10/03720c2d4adf02701a2e974b83d6439477851a6524c5980df0870dc0032f0200cc5e157f47641afa79dc42733b05058f2333df54291d5ac39d108d317a62e6c0 + languageName: node + linkType: hard + "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -25243,6 +23913,13 @@ __metadata: languageName: node linkType: hard +"get-east-asian-width@npm:^1.0.0": + version: 1.3.0 + resolution: "get-east-asian-width@npm:1.3.0" + checksum: 10/8e8e779eb28701db7fdb1c8cab879e39e6ae23f52dadd89c8aed05869671cee611a65d4f8557b83e981428623247d8bc5d0c7a4ef3ea7a41d826e73600112ad8 + languageName: node + linkType: hard + "get-func-name@npm:^2.0.0": version: 2.0.0 resolution: "get-func-name@npm:2.0.0" @@ -25396,15 +24073,6 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.7.2": - version: 4.7.3 - resolution: "get-tsconfig@npm:4.7.3" - dependencies: - resolve-pkg-maps: "npm:^1.0.0" - checksum: 10/7397bb4f8aef936df4d9016555b662dcf5279f3c46428b7c7c1ff5e94ab2b87d018b3dda0f4bc1a28b154d5affd0eac5d014511172c085fd8a9cdff9ea7fe043 - languageName: node - linkType: hard - "get-tsconfig@npm:^4.7.5": version: 4.8.1 resolution: "get-tsconfig@npm:4.8.1" @@ -25670,6 +24338,20 @@ __metadata: languageName: node linkType: hard +"globby@npm:14.0.2": + version: 14.0.2 + resolution: "globby@npm:14.0.2" + dependencies: + "@sindresorhus/merge-streams": "npm:^2.1.0" + fast-glob: "npm:^3.3.2" + ignore: "npm:^5.2.4" + path-type: "npm:^5.0.0" + slash: "npm:^5.1.0" + unicorn-magic: "npm:^0.1.0" + checksum: 10/67660da70fc1223f7170c1a62ba6c373385e9e39765d952b6518606dec15ed8c7958e9dae6ba5752a31dbc1e9126f146938b830ad680fe794141734ffc3fbb75 + languageName: node + linkType: hard + "globby@npm:^10.0.1": version: 10.0.2 resolution: "globby@npm:10.0.2" @@ -26386,6 +25068,15 @@ __metadata: languageName: node linkType: hard +"hosted-git-info@npm:^7.0.0": + version: 7.0.2 + resolution: "hosted-git-info@npm:7.0.2" + dependencies: + lru-cache: "npm:^10.0.1" + checksum: 10/8f085df8a4a637d995f357f48b1e3f6fc1f9f92e82b33fb406415b5741834ed431a510a09141071001e8deea2eee43ce72786463e2aa5e5a70db8648c0eedeab + languageName: node + linkType: hard + "html-escaper@npm:^2.0.0": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" @@ -27157,6 +25848,13 @@ __metadata: languageName: node linkType: hard +"is-interactive@npm:^2.0.0": + version: 2.0.0 + resolution: "is-interactive@npm:2.0.0" + checksum: 10/e8d52ad490bed7ae665032c7675ec07732bbfe25808b0efbc4d5a76b1a1f01c165f332775c63e25e9a03d319ebb6b24f571a9e902669fc1e40b0a60b5be6e26c + languageName: node + linkType: hard + "is-lambda@npm:^1.0.1": version: 1.0.1 resolution: "is-lambda@npm:1.0.1" @@ -27397,6 +26095,20 @@ __metadata: languageName: node linkType: hard +"is-unicode-supported@npm:^1.3.0": + version: 1.3.0 + resolution: "is-unicode-supported@npm:1.3.0" + checksum: 10/20a1fc161afafaf49243551a5ac33b6c4cf0bbcce369fcd8f2951fbdd000c30698ce320de3ee6830497310a8f41880f8066d440aa3eb0a853e2aa4836dd89abc + languageName: node + linkType: hard + +"is-unicode-supported@npm:^2.0.0": + version: 2.1.0 + resolution: "is-unicode-supported@npm:2.1.0" + checksum: 10/f254e3da6b0ab1a57a94f7273a7798dd35d1d45b227759f600d0fa9d5649f9c07fa8d3c8a6360b0e376adf916d151ec24fc9a50c5295c58bae7ca54a76a063f9 + languageName: node + linkType: hard + "is-url@npm:^1.2.4": version: 1.2.4 resolution: "is-url@npm:1.2.4" @@ -28240,7 +26952,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:4.1.0, js-yaml@npm:^4.1.0": +"js-yaml@npm:4.1.0, js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" dependencies: @@ -28427,6 +27139,13 @@ __metadata: languageName: node linkType: hard +"jsonc-parser@npm:3.3.1": + version: 3.3.1 + resolution: "jsonc-parser@npm:3.3.1" + checksum: 10/9b0dc391f20b47378f843ef1e877e73ec652a5bdc3c5fa1f36af0f119a55091d147a86c1ee86a232296f55c929bba174538c2bf0312610e0817a22de131cc3f4 + languageName: node + linkType: hard + "jsonfile@npm:^2.1.0": version: 2.4.0 resolution: "jsonfile@npm:2.4.0" @@ -29155,6 +27874,16 @@ __metadata: languageName: node linkType: hard +"log-symbols@npm:^6.0.0": + version: 6.0.0 + resolution: "log-symbols@npm:6.0.0" + dependencies: + chalk: "npm:^5.3.0" + is-unicode-supported: "npm:^1.3.0" + checksum: 10/510cdda36700cbcd87a2a691ea08d310a6c6b449084018f7f2ec4f732ca5e51b301ff1327aadd96f53c08318e616276c65f7fe22f2a16704fb0715d788bc3c33 + languageName: node + linkType: hard + "log-update@npm:^4.0.0": version: 4.0.0 resolution: "log-update@npm:4.0.0" @@ -29231,7 +27960,7 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.2.0, lru-cache@npm:^10.4.3": +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.4.3": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" checksum: 10/e6e90267360476720fa8e83cc168aa2bf0311f3f2eea20a6ba78b90a885ae72071d9db132f40fda4129c803e7dcec3a6b6a6fbb44ca90b081630b810b5d6a41a @@ -29818,6 +28547,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:9.0.5, minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10/dd6a8927b063aca6d910b119e1f2df6d2ce7d36eab91de83167dd136bb85e1ebff97b0d3de1cb08bd1f7e018ca170b4962479fefab5b2a69e2ae12cb2edc8348 + languageName: node + linkType: hard + "minimatch@npm:^5.0.1": version: 5.1.0 resolution: "minimatch@npm:5.1.0" @@ -29836,15 +28574,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.4": - version: 9.0.5 - resolution: "minimatch@npm:9.0.5" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10/dd6a8927b063aca6d910b119e1f2df6d2ce7d36eab91de83167dd136bb85e1ebff97b0d3de1cb08bd1f7e018ca170b4962479fefab5b2a69e2ae12cb2edc8348 - languageName: node - linkType: hard - "minimist-options@npm:^4.0.2": version: 4.1.0 resolution: "minimist-options@npm:4.1.0" @@ -30766,6 +29495,18 @@ __metadata: languageName: node linkType: hard +"npm-package-arg@npm:11.0.3": + version: 11.0.3 + resolution: "npm-package-arg@npm:11.0.3" + dependencies: + hosted-git-info: "npm:^7.0.0" + proc-log: "npm:^4.0.0" + semver: "npm:^7.3.5" + validate-npm-package-name: "npm:^5.0.0" + checksum: 10/bacc863907edf98940286edc2fd80327901c1e8b34426d538cdc708ed66bc6567f06d742d838eaf35db6804347bb4ba56ca9cef032c4b52743b33e7a22a2678e + languageName: node + linkType: hard + "npm-run-path@npm:^4.0.1": version: 4.0.1 resolution: "npm-run-path@npm:4.0.1" @@ -31156,6 +29897,23 @@ __metadata: languageName: node linkType: hard +"ora@npm:8.0.1": + version: 8.0.1 + resolution: "ora@npm:8.0.1" + dependencies: + chalk: "npm:^5.3.0" + cli-cursor: "npm:^4.0.0" + cli-spinners: "npm:^2.9.2" + is-interactive: "npm:^2.0.0" + is-unicode-supported: "npm:^2.0.0" + log-symbols: "npm:^6.0.0" + stdin-discarder: "npm:^0.2.1" + string-width: "npm:^7.0.0" + strip-ansi: "npm:^7.1.0" + checksum: 10/3d37bb3f53e965e5176004af319f82feef7323ee0b2428db5ee6f689b9b9ba939d7b1e81691d4614333c4fb9e294790eb049db9c1e990b14b9bbe150c6f09993 + languageName: node + linkType: hard + "ora@npm:^5.4.1": version: 5.4.1 resolution: "ora@npm:5.4.1" @@ -31555,6 +30313,13 @@ __metadata: languageName: node linkType: hard +"path-type@npm:^5.0.0": + version: 5.0.0 + resolution: "path-type@npm:5.0.0" + checksum: 10/15ec24050e8932c2c98d085b72cfa0d6b4eeb4cbde151a0a05726d8afae85784fc5544f733d8dfc68536587d5143d29c0bd793623fad03d7e61cc00067291cd5 + languageName: node + linkType: hard + "pathe@npm:^1.1.1, pathe@npm:^1.1.2": version: 1.1.2 resolution: "pathe@npm:1.1.2" @@ -32090,6 +30855,13 @@ __metadata: languageName: node linkType: hard +"proc-log@npm:^4.0.0": + version: 4.2.0 + resolution: "proc-log@npm:4.2.0" + checksum: 10/4e1394491b717f6c1ade15c570ecd4c2b681698474d3ae2d303c1e4b6ab9455bd5a81566211e82890d5a5ae9859718cc6954d5150bb18b09b72ecb297beae90a + languageName: node + linkType: hard + "process-nextick-args@npm:~2.0.0": version: 2.0.1 resolution: "process-nextick-args@npm:2.0.1" @@ -32160,7 +30932,7 @@ __metadata: languageName: node linkType: hard -"prompts@npm:^2.0.1, prompts@npm:^2.4.0, prompts@npm:^2.4.2": +"prompts@npm:2.4.2, prompts@npm:^2.0.1, prompts@npm:^2.4.0, prompts@npm:^2.4.2": version: 2.4.2 resolution: "prompts@npm:2.4.2" dependencies: @@ -32408,6 +31180,13 @@ __metadata: languageName: node linkType: hard +"pure-rand@npm:^6.1.0": + version: 6.1.0 + resolution: "pure-rand@npm:6.1.0" + checksum: 10/256aa4bcaf9297256f552914e03cbdb0039c8fe1db11fa1e6d3f80790e16e563eb0a859a1e61082a95e224fc0c608661839439f8ecc6a3db4e48d46d99216ee4 + languageName: node + linkType: hard + "pvtsutils@npm:^1.3.2": version: 1.3.2 resolution: "pvtsutils@npm:1.3.2" @@ -33032,6 +31811,16 @@ __metadata: languageName: node linkType: hard +"read-yaml-file@npm:2.1.0": + version: 2.1.0 + resolution: "read-yaml-file@npm:2.1.0" + dependencies: + js-yaml: "npm:^4.0.0" + strip-bom: "npm:^4.0.0" + checksum: 10/52765eb183e79466f51eebeb19b933cc0f0e907052d062d67300b97e79910064a24b370cdb0b5dd8b05afff3d0ec57282670fd9070dc608e13b11820ac79183d + languageName: node + linkType: hard + "read-yaml-file@npm:^1.1.0": version: 1.1.0 resolution: "read-yaml-file@npm:1.1.0" @@ -33631,6 +32420,16 @@ __metadata: languageName: node linkType: hard +"restore-cursor@npm:^4.0.0": + version: 4.0.0 + resolution: "restore-cursor@npm:4.0.0" + dependencies: + onetime: "npm:^5.1.0" + signal-exit: "npm:^3.0.2" + checksum: 10/5b675c5a59763bf26e604289eab35711525f11388d77f409453904e1e69c0d37ae5889295706b2c81d23bd780165084d040f9b68fffc32cc921519031c4fa4af + languageName: node + linkType: hard + "retry-request@npm:^7.0.0": version: 7.0.2 resolution: "retry-request@npm:7.0.2" @@ -34179,6 +32978,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:7.6.3, semver@npm:^7.3.8, semver@npm:^7.5.0, semver@npm:^7.5.1, semver@npm:^7.6.0, semver@npm:^7.6.3": + version: 7.6.3 + resolution: "semver@npm:7.6.3" + bin: + semver: bin/semver.js + checksum: 10/36b1fbe1a2b6f873559cd57b238f1094a053dbfd997ceeb8757d79d1d2089c56d1321b9f1069ce263dc64cfa922fa1d2ad566b39426fe1ac6c723c1487589e10 + languageName: node + linkType: hard + "semver@npm:^5.4.1, semver@npm:^5.5.0, semver@npm:^5.7.0": version: 5.7.1 resolution: "semver@npm:5.7.1" @@ -34217,15 +33025,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.8, semver@npm:^7.5.0, semver@npm:^7.5.1, semver@npm:^7.6.0, semver@npm:^7.6.3": - version: 7.6.3 - resolution: "semver@npm:7.6.3" - bin: - semver: bin/semver.js - checksum: 10/36b1fbe1a2b6f873559cd57b238f1094a053dbfd997ceeb8757d79d1d2089c56d1321b9f1069ce263dc64cfa922fa1d2ad566b39426fe1ac6c723c1487589e10 - 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" @@ -34578,6 +33377,13 @@ __metadata: languageName: node linkType: hard +"slash@npm:^5.1.0": + version: 5.1.0 + resolution: "slash@npm:5.1.0" + checksum: 10/2c41ec6fb1414cd9bba0fa6b1dd00e8be739e3fe85d079c69d4b09ca5f2f86eafd18d9ce611c0c0f686428638a36c272a6ac14799146a8295f259c10cc45cde4 + languageName: node + linkType: hard + "slice-ansi@npm:^3.0.0": version: 3.0.0 resolution: "slice-ansi@npm:3.0.0" @@ -35156,6 +33962,13 @@ __metadata: languageName: node linkType: hard +"stdin-discarder@npm:^0.2.1": + version: 0.2.2 + resolution: "stdin-discarder@npm:0.2.2" + checksum: 10/642ffd05bd5b100819d6b24a613d83c6e3857c6de74eb02fc51506fa61dc1b0034665163831873868157c4538d71e31762bcf319be86cea04c3aba5336470478 + languageName: node + linkType: hard + "stealthy-require@npm:^1.1.1": version: 1.1.1 resolution: "stealthy-require@npm:1.1.1" @@ -35322,6 +34135,17 @@ __metadata: languageName: node linkType: hard +"string-width@npm:^7.0.0": + version: 7.2.0 + resolution: "string-width@npm:7.2.0" + dependencies: + emoji-regex: "npm:^10.3.0" + get-east-asian-width: "npm:^1.0.0" + strip-ansi: "npm:^7.1.0" + checksum: 10/42f9e82f61314904a81393f6ef75b832c39f39761797250de68c041d8ba4df2ef80db49ab6cd3a292923a6f0f409b8c9980d120f7d32c820b4a8a84a2598a295 + languageName: node + linkType: hard + "string.prototype.matchall@npm:^4.0.11": version: 4.0.11 resolution: "string.prototype.matchall@npm:4.0.11" @@ -35504,6 +34328,15 @@ __metadata: languageName: node linkType: hard +"strip-ansi@npm:^7.1.0": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: 10/475f53e9c44375d6e72807284024ac5d668ee1d06010740dec0b9744f2ddf47de8d7151f80e5f6190fc8f384e802fdf9504b76a7e9020c9faee7103623338be2 + languageName: node + linkType: hard + "strip-bom@npm:^3.0.0": version: 3.0.0 resolution: "strip-bom@npm:3.0.0" @@ -35764,6 +34597,43 @@ __metadata: languageName: node linkType: hard +"syncpack@npm:^13.0.0": + version: 13.0.0 + resolution: "syncpack@npm:13.0.0" + dependencies: + "@effect/schema": "npm:0.71.1" + chalk: "npm:5.3.0" + chalk-template: "npm:1.1.0" + commander: "npm:12.1.0" + cosmiconfig: "npm:9.0.0" + effect: "npm:3.6.5" + enquirer: "npm:2.4.1" + fast-check: "npm:3.21.0" + globby: "npm:14.0.2" + jsonc-parser: "npm:3.3.1" + minimatch: "npm:9.0.5" + npm-package-arg: "npm:11.0.3" + ora: "npm:8.0.1" + prompts: "npm:2.4.2" + read-yaml-file: "npm:2.1.0" + semver: "npm:7.6.3" + tightrope: "npm:0.2.0" + ts-toolbelt: "npm:9.6.0" + bin: + syncpack: dist/bin.js + syncpack-fix-mismatches: dist/bin-fix-mismatches/index.js + syncpack-format: dist/bin-format/index.js + syncpack-lint: dist/bin-lint/index.js + syncpack-lint-semver-ranges: dist/bin-lint-semver-ranges/index.js + syncpack-list: dist/bin-list/index.js + syncpack-list-mismatches: dist/bin-list-mismatches/index.js + syncpack-prompt: dist/bin-prompt/index.js + syncpack-set-semver-ranges: dist/bin-set-semver-ranges/index.js + syncpack-update: dist/bin-update/index.js + checksum: 10/c80f60faaad640f38de4e1fb5e7daf5dac62963def211b7b3989186c503dec8800c197d3051798553998331c0b0e05ab4b96dd765cd51c7c6cd3651f87c559ed + languageName: node + linkType: hard + "system-architecture@npm:^0.1.0": version: 0.1.0 resolution: "system-architecture@npm:0.1.0" @@ -36098,6 +34968,13 @@ __metadata: languageName: node linkType: hard +"tightrope@npm:0.2.0": + version: 0.2.0 + resolution: "tightrope@npm:0.2.0" + checksum: 10/b57a6dec1a83d1d9b9395bca21f0b2dc4ff84d97a2302f43af240d312573bc04327e8e40394b4c2ac7172993b76ba31b34d0295b79f4f8abe9195a051782bff6 + languageName: node + linkType: hard + "timed-out@npm:^4.0.0, timed-out@npm:^4.0.1": version: 4.0.1 resolution: "timed-out@npm:4.0.1" @@ -36394,6 +35271,13 @@ __metadata: languageName: node linkType: hard +"ts-toolbelt@npm:9.6.0": + version: 9.6.0 + resolution: "ts-toolbelt@npm:9.6.0" + checksum: 10/2c2dea2631dbd7372a79cccc6d09a377a6ca2f319f767fd239d2e312cd1d9165a90f8c1777a047227bfdcda6aeba3addbadce88fdfc7f43caf4534d385a43c82 + languageName: node + linkType: hard + "tsconfig-paths@npm:^3.15.0": version: 3.15.0 resolution: "tsconfig-paths@npm:3.15.0" @@ -36420,7 +35304,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:2.4.0, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0": +"tslib@npm:2.4.0, tslib@npm:^2.1.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0": version: 2.4.0 resolution: "tslib@npm:2.4.0" checksum: 10/d8379e68b36caf082c1905ec25d17df8261e1d68ddc1abfd6c91158a064f6e4402039ae7c02cf4c81d12e3a2a2c7cd8ea2f57b233eb80136a2e3e7279daf2911 @@ -36471,22 +35355,6 @@ __metadata: languageName: node linkType: hard -"tsx@npm:^4.7.1": - version: 4.7.1 - resolution: "tsx@npm:4.7.1" - dependencies: - esbuild: "npm:~0.19.10" - fsevents: "npm:~2.3.3" - get-tsconfig: "npm:^4.7.2" - dependenciesMeta: - fsevents: - optional: true - bin: - tsx: dist/cli.mjs - checksum: 10/3a462b595f31ae58b31f9c6e8c450577dc87660b1225012bd972b6b58d7d2f6c4034728763ebc53bb731acff68de8b0fa50586e4c1ec4c086226f1788ccf9b7d - languageName: node - linkType: hard - "tty-table@npm:^4.1.5": version: 4.2.3 resolution: "tty-table@npm:4.2.3" @@ -37029,6 +35897,13 @@ __metadata: languageName: node linkType: hard +"unicorn-magic@npm:^0.1.0": + version: 0.1.0 + resolution: "unicorn-magic@npm:0.1.0" + checksum: 10/9b4d0e9809807823dc91d0920a4a4c0cff2de3ebc54ee87ac1ee9bc75eafd609b09d1f14495e0173aef26e01118706196b6ab06a75fe0841028b3983a8af313f + languageName: node + linkType: hard + "unique-filename@npm:^1.1.1": version: 1.1.1 resolution: "unique-filename@npm:1.1.1" @@ -37491,6 +36366,13 @@ __metadata: languageName: node linkType: hard +"validate-npm-package-name@npm:^5.0.0": + version: 5.0.1 + resolution: "validate-npm-package-name@npm:5.0.1" + checksum: 10/0d583a1af23aeffea7748742cf22b6802458736fb8b60323ba5949763824d46f796474b0e1b9206beb716f9d75269e19dbd7795d6b038b29d561be95dd827381 + languageName: node + linkType: hard + "valtio@npm:1.11.2": version: 1.11.2 resolution: "valtio@npm:1.11.2" @@ -37534,7 +36416,7 @@ __metadata: languageName: node linkType: hard -"viem@npm:^2.1.1, viem@npm:^2.21.41, viem@npm:^2.21.45": +"viem@npm:^2.1.1, viem@npm:^2.21.45": version: 2.21.45 resolution: "viem@npm:2.21.45" dependencies: @@ -38515,7 +37397,7 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^6.0.1, wrap-ansi@npm:^6.2.0": +"wrap-ansi@npm:^6.2.0": version: 6.2.0 resolution: "wrap-ansi@npm:6.2.0" dependencies: From 4b3537470eff0139163a2a7aa1d19fc708a992c6 Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Wed, 27 Nov 2024 12:08:16 +0000 Subject: [PATCH 10/18] feat: add validator operator aliases to default multisig config (#4896) ### Description feat: add validator operator aliases to default multisig config tldr: updated this type and anywhere it's been used ![image](https://github.com/user-attachments/assets/ab055c4f-2fef-4513-a0ff-c574021859c8) - updates `MultisigConfig.validators` type from Address[] to ValidatorConfig[] - `ValidatorConfig` includes both an address + an alias, to be able to track the operator aliases in-code - update any usage of `defaultMultisigConfigs` and `MultisigConfig` type - add `multisigConfigToIsmConfig` helper method to easily convert to `MultisigIsmConfig` format (ie. no aliases) this will simplify the logic in https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/4774, and enable us to auto-generate the default ISMs docs page after an SDK update ### Drive-by changes ### Related issues ### Backward compatibility ### Testing - added extra tests to ensure address/aliases are somewhat sound - `yarn tsx scripts/check/check-validator-announce.ts -e mainnet3` still looks good --------- Signed-off-by: pbio <10051819+paulbalaji@users.noreply.github.com> --- .changeset/four-meals-cheat.md | 6 + typescript/cli/src/config/multisig.ts | 6 +- .../config/environments/mainnet3/core.ts | 13 +- .../configGetters/getRenzoEZETHWarpConfig.ts | 87 +- .../config/environments/testnet4/core.ts | 13 +- typescript/infra/config/multisigIsm.ts | 6 +- .../infra/config/rcMultisigIsmConfigs.ts | 93 +- .../scripts/check/check-validator-announce.ts | 4 +- .../cosmos-helpers/deploy-ism-payload.ts | 2 +- typescript/sdk/src/consts/multisigIsm.test.ts | 25 +- typescript/sdk/src/consts/multisigIsm.ts | 1405 ++++++++++++----- typescript/sdk/src/index.ts | 6 +- .../ism/adapters/CosmWasmMultisigAdapter.ts | 6 +- typescript/sdk/src/ism/multisig.ts | 27 +- typescript/sdk/src/ism/types.ts | 7 +- .../adapters/CosmWasmTokenAdapter.test.ts | 26 +- 16 files changed, 1275 insertions(+), 457 deletions(-) create mode 100644 .changeset/four-meals-cheat.md diff --git a/.changeset/four-meals-cheat.md b/.changeset/four-meals-cheat.md new file mode 100644 index 000000000..f0c4e4fc3 --- /dev/null +++ b/.changeset/four-meals-cheat.md @@ -0,0 +1,6 @@ +--- +'@hyperlane-xyz/cli': minor +'@hyperlane-xyz/sdk': minor +--- + +Changed the type of defaultMultisigConfigs, to track validator aliases in addition to their addresses. diff --git a/typescript/cli/src/config/multisig.ts b/typescript/cli/src/config/multisig.ts index 28648b271..ae645de80 100644 --- a/typescript/cli/src/config/multisig.ts +++ b/typescript/cli/src/config/multisig.ts @@ -1,7 +1,7 @@ import { confirm, input } from '@inquirer/prompts'; import { z } from 'zod'; -import { ChainMap, MultisigConfig, ZHash } from '@hyperlane-xyz/sdk'; +import { ChainMap, MultisigIsmConfig, ZHash } from '@hyperlane-xyz/sdk'; import { Address, isValidAddress, @@ -33,7 +33,7 @@ export function readMultisigConfig(filePath: string) { ); } const parsedConfig = result.data; - const formattedConfig: ChainMap = objMap( + const formattedConfig: ChainMap> = objMap( parsedConfig, (_, config) => { if (config.threshold > config.validators.length) @@ -50,7 +50,7 @@ export function readMultisigConfig(filePath: string) { return { threshold: config.threshold, validators: validators, - } as MultisigConfig; + }; }, ); logGreen(`All multisig configs in ${filePath} are valid`); diff --git a/typescript/infra/config/environments/mainnet3/core.ts b/typescript/infra/config/environments/mainnet3/core.ts index 761c4f37d..b0655ae78 100644 --- a/typescript/infra/config/environments/mainnet3/core.ts +++ b/typescript/infra/config/environments/mainnet3/core.ts @@ -16,6 +16,7 @@ import { ProtocolFeeHookConfig, RoutingIsmConfig, defaultMultisigConfigs, + multisigConfigToIsmConfig, } from '@hyperlane-xyz/sdk'; import { Address, objMap } from '@hyperlane-xyz/utils'; @@ -32,15 +33,11 @@ export const core: ChainMap = objMap( .map((origin) => [origin, defaultMultisigConfigs[origin]]), ); - const merkleRoot = (multisig: MultisigConfig): MultisigIsmConfig => ({ - type: IsmType.MERKLE_ROOT_MULTISIG, - ...multisig, - }); + const merkleRoot = (multisig: MultisigConfig): MultisigIsmConfig => + multisigConfigToIsmConfig(IsmType.MERKLE_ROOT_MULTISIG, multisig); - const messageIdIsm = (multisig: MultisigConfig): MultisigIsmConfig => ({ - type: IsmType.MESSAGE_ID_MULTISIG, - ...multisig, - }); + const messageIdIsm = (multisig: MultisigConfig): MultisigIsmConfig => + multisigConfigToIsmConfig(IsmType.MESSAGE_ID_MULTISIG, multisig); const routingIsm: RoutingIsmConfig = { type: IsmType.ROUTING, diff --git a/typescript/infra/config/environments/mainnet3/warp/configGetters/getRenzoEZETHWarpConfig.ts b/typescript/infra/config/environments/mainnet3/warp/configGetters/getRenzoEZETHWarpConfig.ts index 7e6e31c6f..198a708d1 100644 --- a/typescript/infra/config/environments/mainnet3/warp/configGetters/getRenzoEZETHWarpConfig.ts +++ b/typescript/infra/config/environments/mainnet3/warp/configGetters/getRenzoEZETHWarpConfig.ts @@ -1,6 +1,7 @@ import { ChainMap, IsmType, + MultisigConfig, TokenRouterConfig, TokenType, buildAggregationIsmConfigs, @@ -42,89 +43,125 @@ const xERC20: Record<(typeof chainsToDeploy)[number], string> = { sei: '0x6DCfbF4729890043DFd34A93A2694E5303BA2703', // redEth }; -export const ezEthValidators = { +export const ezEthValidators: ChainMap = { arbitrum: { threshold: 1, validators: [ - '0x9bccfad3bd12ef0ee8ae839dd9ed7835bccadc9d', // Everclear - '0xc27032c6bbd48c20005f552af3aaa0dbf14260f3', // Renzo + { + address: '0x9bccfad3bd12ef0ee8ae839dd9ed7835bccadc9d', + alias: 'Everclear', + }, + { address: '0xc27032c6bbd48c20005f552af3aaa0dbf14260f3', alias: 'Renzo' }, ], }, optimism: { threshold: 1, validators: [ - '0x6f4cb8e96db5d44422a4495faa73fffb9d30e9e2', // Everclear - '0xe2593d205f5e7f74a50fa900824501084e092ebd', // Renzo + { + address: '0x6f4cb8e96db5d44422a4495faa73fffb9d30e9e2', + alias: 'Everclear', + }, + { address: '0xe2593d205f5e7f74a50fa900824501084e092ebd', alias: 'Renzo' }, ], }, base: { threshold: 1, validators: [ - '0x25ba4ee5268cbfb8d69bac531aa10368778702bd', // Renzo - '0x9ec803b503e9c7d2611e231521ef3fde73f7a21c', // Everclear + { address: '0x25ba4ee5268cbfb8d69bac531aa10368778702bd', alias: 'Renzo' }, + { + address: '0x9ec803b503e9c7d2611e231521ef3fde73f7a21c', + alias: 'Everclear', + }, ], }, blast: { threshold: 1, validators: [ - '0x1652d8ba766821cf01aeea34306dfc1cab964a32', // Everclear - '0x54bb0036f777202371429e062fe6aee0d59442f9', // Renzo + { + address: '0x1652d8ba766821cf01aeea34306dfc1cab964a32', + alias: 'Everclear', + }, + { address: '0x54bb0036f777202371429e062fe6aee0d59442f9', alias: 'Renzo' }, ], }, bsc: { threshold: 1, validators: [ - '0x3156db97a3b3e2dcc3d69fddfd3e12dc7c937b6d', // Renzo - '0x9a0326c43e4713ae2477f09e0f28ffedc24d8266', // Everclear + { address: '0x3156db97a3b3e2dcc3d69fddfd3e12dc7c937b6d', alias: 'Renzo' }, + { + address: '0x9a0326c43e4713ae2477f09e0f28ffedc24d8266', + alias: 'Everclear', + }, ], }, mode: { threshold: 1, validators: [ - '0x456fbbe05484fc9f2f38ea09648424f54d6872be', // Everclear - '0x7e29608c6e5792bbf9128599ca309be0728af7b4', // Renzo + { + address: '0x456fbbe05484fc9f2f38ea09648424f54d6872be', + alias: 'Everclear', + }, + { address: '0x7e29608c6e5792bbf9128599ca309be0728af7b4', alias: 'Renzo' }, ], }, linea: { threshold: 1, validators: [ - '0x06a5a2a429560034d38bf62ca6d470942535947e', // Everclear - '0xcb3e44edd2229860bdbaa58ba2c3817d111bee9a', // Renzo + { + address: '0x06a5a2a429560034d38bf62ca6d470942535947e', + alias: 'Everclear', + }, + { address: '0xcb3e44edd2229860bdbaa58ba2c3817d111bee9a', alias: 'Renzo' }, ], }, ethereum: { threshold: 1, validators: [ - '0x1fd889337f60986aa57166bc5ac121efd13e4fdd', // Everclear - '0xc7f7b94a6baf2fffa54dfe1dde6e5fcbb749e04f', // Renzo + { + address: '0x1fd889337f60986aa57166bc5ac121efd13e4fdd', + alias: 'Everclear', + }, + { address: '0xc7f7b94a6baf2fffa54dfe1dde6e5fcbb749e04f', alias: 'Renzo' }, ], }, fraxtal: { threshold: 1, validators: [ - '0x25b3a88f7cfd3c9f7d7e32b295673a16a6ddbd91', // luganodes - '0xe986f457965227a05dcf984c8d0c29e01253c44d', // Renzo + { + address: '0x25b3a88f7cfd3c9f7d7e32b295673a16a6ddbd91', + alias: 'Luganodes', + }, + { address: '0xe986f457965227a05dcf984c8d0c29e01253c44d', alias: 'Renzo' }, ], }, zircuit: { threshold: 1, validators: [ - '0x1da9176c2ce5cc7115340496fa7d1800a98911ce', // Renzo - '0x7ac6584c068eb2a72d4db82a7b7cd5ab34044061', // luganodes + { address: '0x1da9176c2ce5cc7115340496fa7d1800a98911ce', alias: 'Renzo' }, + { + address: '0x7ac6584c068eb2a72d4db82a7b7cd5ab34044061', + alias: 'Luganodes', + }, ], }, taiko: { threshold: 1, validators: [ - '0x2f007c82672f2bb97227d4e3f80ac481bfb40a2a', // luganodes - '0xd4F6000d8e1108bd4998215d51d5dF559BdB43a1', // Renzo + { + address: '0x2f007c82672f2bb97227d4e3f80ac481bfb40a2a', + alias: 'Luganodes', + }, + { address: '0xd4F6000d8e1108bd4998215d51d5dF559BdB43a1', alias: 'Renzo' }, ], }, sei: { threshold: 1, validators: [ - '0x7a0f4a8672f603e0c12468551db03f3956d10910', // luganodes - '0x952df7f0cb8611573a53dd7cbf29768871d9f8b0', // Renzo + { + address: '0x7a0f4a8672f603e0c12468551db03f3956d10910', + alias: 'Luganodes', + }, + { address: '0x952df7f0cb8611573a53dd7cbf29768871d9f8b0', alias: 'Renzo' }, ], }, }; diff --git a/typescript/infra/config/environments/testnet4/core.ts b/typescript/infra/config/environments/testnet4/core.ts index 121bcc90e..e40fafb05 100644 --- a/typescript/infra/config/environments/testnet4/core.ts +++ b/typescript/infra/config/environments/testnet4/core.ts @@ -16,6 +16,7 @@ import { ProtocolFeeHookConfig, RoutingIsmConfig, defaultMultisigConfigs, + multisigConfigToIsmConfig, } from '@hyperlane-xyz/sdk'; import { Address, ProtocolType, objMap } from '@hyperlane-xyz/utils'; @@ -35,15 +36,11 @@ export const core: ChainMap = objMap( .map((origin) => [origin, defaultMultisigConfigs[origin]]), ); - const merkleRoot = (multisig: MultisigConfig): MultisigIsmConfig => ({ - type: IsmType.MERKLE_ROOT_MULTISIG, - ...multisig, - }); + const merkleRoot = (multisig: MultisigConfig): MultisigIsmConfig => + multisigConfigToIsmConfig(IsmType.MERKLE_ROOT_MULTISIG, multisig); - const messageIdIsm = (multisig: MultisigConfig): MultisigIsmConfig => ({ - type: IsmType.MESSAGE_ID_MULTISIG, - ...multisig, - }); + const messageIdIsm = (multisig: MultisigConfig): MultisigIsmConfig => + multisigConfigToIsmConfig(IsmType.MESSAGE_ID_MULTISIG, multisig); const routingIsm: RoutingIsmConfig = { type: IsmType.ROUTING, diff --git a/typescript/infra/config/multisigIsm.ts b/typescript/infra/config/multisigIsm.ts index 418abd7e4..d647018d9 100644 --- a/typescript/infra/config/multisigIsm.ts +++ b/typescript/infra/config/multisigIsm.ts @@ -4,6 +4,7 @@ import { MultisigIsmConfig, buildMultisigIsmConfigs, defaultMultisigConfigs, + multisigConfigToIsmConfig, } from '@hyperlane-xyz/sdk'; import { DeployEnvironment } from '../src/config/environment.js'; @@ -40,8 +41,5 @@ export const multisigIsm = ( ? rcMultisigIsmConfigs : defaultMultisigConfigs; - return { - ...configs[remote], - type, - }; + return multisigConfigToIsmConfig(type, configs[remote]); }; diff --git a/typescript/infra/config/rcMultisigIsmConfigs.ts b/typescript/infra/config/rcMultisigIsmConfigs.ts index 91222c041..9f54880c6 100644 --- a/typescript/infra/config/rcMultisigIsmConfigs.ts +++ b/typescript/infra/config/rcMultisigIsmConfigs.ts @@ -1,84 +1,145 @@ -import { ChainMap, MultisigConfig } from '@hyperlane-xyz/sdk'; +import { + AW_VALIDATOR_ALIAS, + ChainMap, + MultisigConfig, +} from '@hyperlane-xyz/sdk'; export const rcMultisigIsmConfigs: ChainMap = { // ----------------- Mainnets ----------------- celo: { threshold: 1, validators: [ - '0xe7a82e210f512f8e9900d6bc2acbf7981c63e66e', // abacus + { + address: '0xe7a82e210f512f8e9900d6bc2acbf7981c63e66e', + alias: AW_VALIDATOR_ALIAS, + }, ], }, ethereum: { threshold: 1, validators: [ - '0xaea1adb1c687b061e5b60b9da84cb69e7b5fab44', // abacus + { + address: '0xaea1adb1c687b061e5b60b9da84cb69e7b5fab44', + alias: AW_VALIDATOR_ALIAS, + }, ], }, avalanche: { threshold: 1, validators: [ - '0x706976391e23dea28152e0207936bd942aba01ce', // abacus + { + address: '0x706976391e23dea28152e0207936bd942aba01ce', + alias: AW_VALIDATOR_ALIAS, + }, ], }, polygon: { threshold: 1, validators: [ - '0xef372f6ff7775989b3ac884506ee31c79638c989', // abacus + { + address: '0xef372f6ff7775989b3ac884506ee31c79638c989', + alias: AW_VALIDATOR_ALIAS, + }, ], }, bsc: { threshold: 1, validators: [ - '0x0823081031a4a6f97c6083775c191d17ca96d0ab', // abacus + { + address: '0x0823081031a4a6f97c6083775c191d17ca96d0ab', + alias: AW_VALIDATOR_ALIAS, + }, ], }, arbitrum: { threshold: 1, validators: [ - '0x1a95b35fb809d57faf1117c1cc29a6c5df289df1', // abacus + { + address: '0x1a95b35fb809d57faf1117c1cc29a6c5df289df1', + alias: AW_VALIDATOR_ALIAS, + }, ], }, optimism: { threshold: 1, validators: [ - '0x60e938bf280bbc21bacfd8bf435459d9003a8f98', // abacus + { + address: '0x60e938bf280bbc21bacfd8bf435459d9003a8f98', + alias: AW_VALIDATOR_ALIAS, + }, ], }, moonbeam: { threshold: 1, validators: [ - '0x0df7140811e309dc69638352545151ebb9d5e0fd', // abacus + { + address: '0x0df7140811e309dc69638352545151ebb9d5e0fd', + alias: AW_VALIDATOR_ALIAS, + }, ], }, gnosis: { threshold: 1, validators: [ - '0x15f48e78092a4f79febface509cfd76467c6cdbb', // abacus + { + address: '0x15f48e78092a4f79febface509cfd76467c6cdbb', + alias: AW_VALIDATOR_ALIAS, + }, ], }, // ----------------- Testnets ----------------- alfajores: { threshold: 1, - validators: ['0xace978aaa61d9ee44fe3ab147fd227e0e66b8909'], + validators: [ + { + address: '0xace978aaa61d9ee44fe3ab147fd227e0e66b8909', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, fuji: { threshold: 1, - validators: ['0xfc419f9ba3c56c55e28844ade491d428f5a77d55'], + validators: [ + { + address: '0xfc419f9ba3c56c55e28844ade491d428f5a77d55', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, chiado: { threshold: 1, - validators: ['0x7572ffd8af1abc02cc1d234ac750d387fd6768a0'], + validators: [ + { + address: '0x7572ffd8af1abc02cc1d234ac750d387fd6768a0', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, bsctestnet: { threshold: 1, - validators: ['0x6353c7402626054c824bd0eca721f82b725e2b4d'], + validators: [ + { + address: '0x6353c7402626054c824bd0eca721f82b725e2b4d', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, scrollsepolia: { threshold: 1, - validators: ['0x50d939d66f114350f322eb8b2e9f01fbc401d4c9'], + validators: [ + { + address: '0x50d939d66f114350f322eb8b2e9f01fbc401d4c9', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, sepolia: { threshold: 1, - validators: ['0x49f253c0dab33be1573d6c2769b3d9e584d91f82'], + validators: [ + { + address: '0x49f253c0dab33be1573d6c2769b3d9e584d91f82', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, }; diff --git a/typescript/infra/scripts/check/check-validator-announce.ts b/typescript/infra/scripts/check/check-validator-announce.ts index 0f484329f..a57e89e8f 100644 --- a/typescript/infra/scripts/check/check-validator-announce.ts +++ b/typescript/infra/scripts/check/check-validator-announce.ts @@ -36,7 +36,9 @@ async function main() { const announcedValidators = await validatorAnnounce.getAnnouncedValidators(); - const validators = defaultMultisigConfigs[chain].validators || []; + const defaultValidatorConfigs = + defaultMultisigConfigs[chain].validators || []; + const validators = defaultValidatorConfigs.map((v) => v.address); const unannouncedValidators = validators.filter( (validator) => !announcedValidators.some((x) => eqAddress(x, validator)), diff --git a/typescript/infra/scripts/cosmos-helpers/deploy-ism-payload.ts b/typescript/infra/scripts/cosmos-helpers/deploy-ism-payload.ts index 9f35775cd..36784e457 100644 --- a/typescript/infra/scripts/cosmos-helpers/deploy-ism-payload.ts +++ b/typescript/infra/scripts/cosmos-helpers/deploy-ism-payload.ts @@ -47,7 +47,7 @@ async function main() { multiProvider.getDomainId(chain), { // Must strip 0x from addresses for compatibility with cosmos tooling - addrs: multisig.validators.map(strip0x), + addrs: multisig.validators.map(({ address }) => strip0x(address)), threshold: multisig.threshold, }, ]; diff --git a/typescript/sdk/src/consts/multisigIsm.test.ts b/typescript/sdk/src/consts/multisigIsm.test.ts index 53f93dc16..aae80376c 100644 --- a/typescript/sdk/src/consts/multisigIsm.test.ts +++ b/typescript/sdk/src/consts/multisigIsm.test.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { isAddress } from '@hyperlane-xyz/utils'; +import { isAddress, isZeroishAddress } from '@hyperlane-xyz/utils'; import { defaultMultisigConfigs } from './multisigIsm.js'; @@ -28,12 +28,31 @@ describe('MultisigIsm', () => { it('has valid EVM addresses for each validator', async () => { for (const [chain, config] of Object.entries(defaultMultisigConfigs)) { for (const validator of config.validators) { - expect(isAddress(validator)).to.equal( + expect(isAddress(validator.address)).to.equal( true, - `Validator address ${validator} for ${chain} is not a valid EVM address`, + `Validator address ${validator.address} for ${chain} is not a valid EVM address`, ); } } }); + + it('has no zeroish addresses for validators', async () => { + for (const [chain, config] of Object.entries(defaultMultisigConfigs)) { + for (const validator of config.validators) { + expect(isZeroishAddress(validator.address)).to.equal( + false, + `Validator address ${validator.address} for ${chain} is a zeroish address`, + ); + } + } + }); + + it('has valid aliases for each validator', async () => { + for (const config of Object.values(defaultMultisigConfigs)) { + for (const validator of config.validators) { + expect(validator.alias).to.not.be.empty; + } + } + }); }); }); diff --git a/typescript/sdk/src/consts/multisigIsm.ts b/typescript/sdk/src/consts/multisigIsm.ts index 32bd501f3..b16aedb08 100644 --- a/typescript/sdk/src/consts/multisigIsm.ts +++ b/typescript/sdk/src/consts/multisigIsm.ts @@ -1,1051 +1,1730 @@ -import { MultisigConfig } from '../ism/types.js'; +import { MultisigConfig, ValidatorConfig } from '../ism/types.js'; import { ChainMap } from '../types.js'; +export const AW_VALIDATOR_ALIAS = 'Abacus Works'; + +const DEFAULT_MERKLY_VALIDATOR: ValidatorConfig = { + address: '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', + alias: 'Merkly', +}; +const DEFAULT_MITOSIS_VALIDATOR: ValidatorConfig = { + address: '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', + alias: 'Mitosis', +}; +const DEFAULT_ZEE_PRIME_VALIDATOR: ValidatorConfig = { + address: '0x5450447aee7b544c462c9352bef7cad049b0c2dc', + alias: 'Zee Prime', +}; +const DEFAULT_EVERSTAKE_VALIDATOR: ValidatorConfig = { + address: '0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8', + alias: 'Everstake', +}; +const DEFAULT_STAKED_VALIDATOR: ValidatorConfig = { + address: '0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b', + alias: 'Staked', +}; +const DEFAULT_TESSELLATED_VALIDATOR: ValidatorConfig = { + address: '0x0d4c1394a255568ec0ecd11795b28d1bda183ca4', + alias: 'Tessellated', +}; +const DEFAULT_BWARE_LABS_VALIDATOR: ValidatorConfig = { + address: '0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3', + alias: 'Bware Labs', +}; + // TODO: consider migrating these to the registry too export const defaultMultisigConfigs: ChainMap = { abstracttestnet: { threshold: 1, - validators: ['0x7655bc4c9802bfcb3132b8822155b60a4fbbce3e'], + validators: [ + { + address: '0x7655bc4c9802bfcb3132b8822155b60a4fbbce3e', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, alephzeroevmmainnet: { threshold: 2, validators: [ - '0x33f20e6e775747d60301c6ea1c50e51f0389740c', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x33f20e6e775747d60301c6ea1c50e51f0389740c', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, alephzeroevmtestnet: { threshold: 1, - validators: ['0x556cd94bcb6e5773e8df75e7eb3f91909d266a26'], + validators: [ + { + address: '0x556cd94bcb6e5773e8df75e7eb3f91909d266a26', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, alfajores: { threshold: 2, validators: [ - '0x2233a5ce12f814bd64c9cdd73410bb8693124d40', - '0xba279f965489d90f90490e3c49e860e0b43c2ae6', - '0x86485dcec5f7bb8478dd251676372d054dea6653', + { + address: '0x2233a5ce12f814bd64c9cdd73410bb8693124d40', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0xba279f965489d90f90490e3c49e860e0b43c2ae6', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0x86485dcec5f7bb8478dd251676372d054dea6653', + alias: AW_VALIDATOR_ALIAS, + }, ], }, ancient8: { threshold: 2, validators: [ - '0xbb5842ae0e05215b53df4787a29144efb7e67551', - '0xa5a56e97fb46f0ac3a3d261e404acb998d9a6969', // coin98 - '0x95c7bf235837cb5a609fe6c95870410b9f68bcff', // ancient8 + { + address: '0xbb5842ae0e05215b53df4787a29144efb7e67551', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0xa5a56e97fb46f0ac3a3d261e404acb998d9a6969', + alias: 'Coin98', + }, + { + address: '0x95c7bf235837cb5a609fe6c95870410b9f68bcff', + alias: 'Ancient8', + }, ], }, apechain: { threshold: 2, validators: [ - '0x773d7fe6ffb1ba4de814c28044ff9a2d83a48221', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x773d7fe6ffb1ba4de814c28044ff9a2d83a48221', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, arbitrum: { threshold: 3, validators: [ - '0x4d966438fe9e2b1e7124c87bbb90cb4f0f6c59a1', - '0xec68258a7c882ac2fc46b81ce80380054ffb4ef2', // dsrv - '0x5450447aee7b544c462c9352bef7cad049b0c2dc', // zeeprime - '0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8', // everstake - '0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b', // staked + { + address: '0x4d966438fe9e2b1e7124c87bbb90cb4f0f6c59a1', + alias: AW_VALIDATOR_ALIAS, + }, + { address: '0xec68258a7c882ac2fc46b81ce80380054ffb4ef2', alias: 'DSRV' }, + DEFAULT_ZEE_PRIME_VALIDATOR, + DEFAULT_EVERSTAKE_VALIDATOR, + DEFAULT_STAKED_VALIDATOR, ], }, arbitrumnova: { threshold: 2, validators: [ - '0xd2a5e9123308d187383c87053811a2c21bd8af1f', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xd2a5e9123308d187383c87053811a2c21bd8af1f', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, arbitrumsepolia: { threshold: 1, - validators: ['0x09fabfbca0b8bf042e2a1161ee5010d147b0f603'], + validators: [ + { + address: '0x09fabfbca0b8bf042e2a1161ee5010d147b0f603', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, arcadiatestnet2: { threshold: 1, - validators: ['0xd39cd388ce3f616bc81be6dd3ec9348d7cdf4dff'], + validators: [ + { + address: '0xd39cd388ce3f616bc81be6dd3ec9348d7cdf4dff', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, astar: { threshold: 2, validators: [ - '0x4d1b2cade01ee3493f44304653d8e352c66ec3e7', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x4d1b2cade01ee3493f44304653d8e352c66ec3e7', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, astarzkevm: { threshold: 2, validators: [ - '0x89ecdd6caf138934bf3a2fb7b323984d72fd66de', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x89ecdd6caf138934bf3a2fb7b323984d72fd66de', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, avalanche: { threshold: 2, validators: [ - '0x3fb8263859843bffb02950c492d492cae169f4cf', - '0x402e0f8c6e4210d408b6ac00d197d4a099fcd25a', // dsrv - '0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8', // everstake + { + address: '0x3fb8263859843bffb02950c492d492cae169f4cf', + alias: AW_VALIDATOR_ALIAS, + }, + { address: '0x402e0f8c6e4210d408b6ac00d197d4a099fcd25a', alias: 'DSRV' }, + DEFAULT_EVERSTAKE_VALIDATOR, ], }, b3: { threshold: 2, validators: [ - '0xd77b516730a836fc41934e7d5864e72c165b934e', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xd77b516730a836fc41934e7d5864e72c165b934e', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, base: { threshold: 3, validators: [ - '0xb9453d675e0fa3c178a17b4ce1ad5b1a279b3af9', - '0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b', // staked - '0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8', // everstake - '0xcff391b4e516452d424db66beb9052b041a9ed79', // dsrv - '0x5450447aee7b544c462c9352bef7cad049b0c2dc', // zeeprime + { + address: '0xb9453d675e0fa3c178a17b4ce1ad5b1a279b3af9', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_STAKED_VALIDATOR, + DEFAULT_EVERSTAKE_VALIDATOR, + { address: '0xcff391b4e516452d424db66beb9052b041a9ed79', alias: 'DSRV' }, + DEFAULT_ZEE_PRIME_VALIDATOR, ], }, basesepolia: { threshold: 1, - validators: ['0x82e3b437a2944e3ff00258c93e72cd1ba5e0e921'], + validators: [ + { + address: '0x82e3b437a2944e3ff00258c93e72cd1ba5e0e921', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, berabartio: { threshold: 1, - validators: ['0x541dd3cb282cf869d72883557badae245b63e1fd'], + validators: [ + { + address: '0x541dd3cb282cf869d72883557badae245b63e1fd', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, bitlayer: { threshold: 2, validators: [ - '0x1d9b0f4ea80dbfc71cb7d64d8005eccf7c41e75f', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x1d9b0f4ea80dbfc71cb7d64d8005eccf7c41e75f', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, blast: { threshold: 2, validators: [ - '0xf20c0b09f597597c8d2430d3d72dfddaf09177d1', - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis - '0xae53467a5c2a9d9420c188d10fef5e1d9b9a5b80', // superform + { + address: '0xf20c0b09f597597c8d2430d3d72dfddaf09177d1', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MITOSIS_VALIDATOR, + { + address: '0xae53467a5c2a9d9420c188d10fef5e1d9b9a5b80', + alias: 'Superform', + }, ], }, bob: { threshold: 2, validators: [ - '0x20f283be1eb0e81e22f51705dcb79883cfdd34aa', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x20f283be1eb0e81e22f51705dcb79883cfdd34aa', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, boba: { threshold: 1, - validators: ['0xebeb92c94ca8408e73aa16fd554cb3a7df075c59'], + validators: [ + { + address: '0xebeb92c94ca8408e73aa16fd554cb3a7df075c59', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, bsc: { threshold: 3, validators: [ - '0x570af9b7b36568c8877eebba6c6727aa9dab7268', - '0x8292b1a53907ece0f76af8a50724e9492bcdc8a3', // dsrv - '0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8', // everstake - '0x5450447aee7b544c462c9352bef7cad049b0c2dc', // zeeprime + { + address: '0x570af9b7b36568c8877eebba6c6727aa9dab7268', + alias: AW_VALIDATOR_ALIAS, + }, + { address: '0x8292b1a53907ece0f76af8a50724e9492bcdc8a3', alias: 'DSRV' }, + DEFAULT_EVERSTAKE_VALIDATOR, + DEFAULT_ZEE_PRIME_VALIDATOR, ], }, bsctestnet: { threshold: 2, validators: [ - '0x242d8a855a8c932dec51f7999ae7d1e48b10c95e', - '0xf620f5e3d25a3ae848fec74bccae5de3edcd8796', - '0x1f030345963c54ff8229720dd3a711c15c554aeb', + { + address: '0x242d8a855a8c932dec51f7999ae7d1e48b10c95e', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0xf620f5e3d25a3ae848fec74bccae5de3edcd8796', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0x1f030345963c54ff8229720dd3a711c15c554aeb', + alias: AW_VALIDATOR_ALIAS, + }, ], }, bsquared: { threshold: 1, - validators: ['0xcadc90933c9fbe843358a4e70e46ad2db78e28aa'], + validators: [ + { + address: '0xcadc90933c9fbe843358a4e70e46ad2db78e28aa', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, camptestnet: { threshold: 1, - validators: ['0x238f40f055a7ff697ea6dbff3ae943c9eae7a38e'], + validators: [ + { + address: '0x238f40f055a7ff697ea6dbff3ae943c9eae7a38e', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, celo: { threshold: 3, validators: [ - '0x63478422679303c3e4fc611b771fa4a707ef7f4a', - '0x622e43baf06ad808ca8399360d9a2d9a1a12688b', // dsrv - '0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8', // everstake - '0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b', // staked - '0x5450447aee7b544c462c9352bef7cad049b0c2dc', // zeeprime + { + address: '0x63478422679303c3e4fc611b771fa4a707ef7f4a', + alias: AW_VALIDATOR_ALIAS, + }, + { address: '0x622e43baf06ad808ca8399360d9a2d9a1a12688b', alias: 'DSRV' }, + DEFAULT_EVERSTAKE_VALIDATOR, + DEFAULT_STAKED_VALIDATOR, + DEFAULT_ZEE_PRIME_VALIDATOR, ], }, cheesechain: { threshold: 2, validators: [ - '0x478fb53c6860ae8fc35235ba0d38d49b13128226', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x101cE77261245140A0871f9407d6233C8230Ec47', // blockhunters + { + address: '0x478fb53c6860ae8fc35235ba0d38d49b13128226', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + { + address: '0x101cE77261245140A0871f9407d6233C8230Ec47', + alias: 'Blockhunters', + }, ], }, chiado: { threshold: 2, validators: [ - '0x06c3757a4b7a912828e523bb8a5f980ddc297356', - '0x0874967a145d70b799ebe9ed861ab7c93faef95a', - '0xd767ea1206b8295d7e1267ddd00e56d34f278db6', + { + address: '0x06c3757a4b7a912828e523bb8a5f980ddc297356', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0x0874967a145d70b799ebe9ed861ab7c93faef95a', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0xd767ea1206b8295d7e1267ddd00e56d34f278db6', + alias: AW_VALIDATOR_ALIAS, + }, ], }, chilizmainnet: { threshold: 2, validators: [ - '0x7403e5d58b48b0f5f715d9c78fbc581f01a625cb', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x7403e5d58b48b0f5f715d9c78fbc581f01a625cb', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, citreatestnet: { threshold: 1, - validators: ['0x60d7380a41eb95c49be18f141efd2fde5e3dba20'], + validators: [ + { + address: '0x60d7380a41eb95c49be18f141efd2fde5e3dba20', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, connextsepolia: { threshold: 1, - validators: ['0xffbbec8c499585d80ef69eb613db624d27e089ab'], + validators: [ + { + address: '0xffbbec8c499585d80ef69eb613db624d27e089ab', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, coredao: { threshold: 2, validators: [ - '0xbd6e158a3f5830d99d7d2bce192695bc4a148de2', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xbd6e158a3f5830d99d7d2bce192695bc4a148de2', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, cyber: { threshold: 2, validators: [ - '0x94d7119ceeb802173b6924e6cc8c4cd731089a27', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x94d7119ceeb802173b6924e6cc8c4cd731089a27', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, degenchain: { threshold: 2, validators: [ - '0x433e311f19524cd64fb2123ad0aa1579a4e1fc83', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x433e311f19524cd64fb2123ad0aa1579a4e1fc83', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, dogechain: { threshold: 2, validators: [ - '0xe43f742c37858746e6d7e458bc591180d0cba440', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xe43f742c37858746e6d7e458bc591180d0cba440', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, duckchain: { threshold: 1, - validators: ['0x91d55fe6dac596a6735d96365e21ce4bca21d83c'], + validators: [ + { + address: '0x91d55fe6dac596a6735d96365e21ce4bca21d83c', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, eclipsemainnet: { threshold: 3, validators: [ - '0xebb52d7eaa3ff7a5a6260bfe5111ce52d57401d0', - '0x3571223e745dc0fcbdefa164c9b826b90c0d2dac', // luganodes - '0xea83086a62617a7228ce4206fae2ea8b0ab23513', // imperator - '0x4d4629f5bfeabe66edc7a78da26ef5273c266f97', // eclipse + { + address: '0xebb52d7eaa3ff7a5a6260bfe5111ce52d57401d0', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0x3571223e745dc0fcbdefa164c9b826b90c0d2dac', + alias: 'Luganodes', + }, + { + address: '0xea83086a62617a7228ce4206fae2ea8b0ab23513', + alias: 'Imperator', + }, + { + address: '0x4d4629f5bfeabe66edc7a78da26ef5273c266f97', + alias: 'Eclipse', + }, ], }, eclipsetestnet: { threshold: 1, - validators: ['0xf344f34abca9a444545b5295066348a0ae22dda3'], + validators: [ + { + address: '0xf344f34abca9a444545b5295066348a0ae22dda3', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, ecotestnet: { threshold: 1, - validators: ['0xb3191420d463c2af8bd9b4a395e100ec5c05915a'], + validators: [ + { + address: '0xb3191420d463c2af8bd9b4a395e100ec5c05915a', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, endurance: { threshold: 2, validators: [ - '0x28c5b322da06f184ebf68693c5d19df4d4af13e5', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x7419021c0de2772b763e554480158a82a291c1f2', // fusionist + { + address: '0x28c5b322da06f184ebf68693c5d19df4d4af13e5', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + { + address: '0x7419021c0de2772b763e554480158a82a291c1f2', + alias: 'Fusionist', + }, ], }, ethereum: { threshold: 4, validators: [ - '0x03c842db86a6a3e524d4a6615390c1ea8e2b9541', - '0x94438a7de38d4548ae54df5c6010c4ebc5239eae', // dsrv - '0x5450447aee7b544c462c9352bef7cad049b0c2dc', // zeeprime - '0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8', // everstake - '0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b', // staked - '0xb683b742b378632a5f73a2a5a45801b3489bba44', // avs: luganodes - '0xbf1023eff3dba21263bf2db2add67a0d6bcda2de', // avs: pier two + { + address: '0x03c842db86a6a3e524d4a6615390c1ea8e2b9541', + alias: AW_VALIDATOR_ALIAS, + }, + { address: '0x94438a7de38d4548ae54df5c6010c4ebc5239eae', alias: 'DSRV' }, + DEFAULT_ZEE_PRIME_VALIDATOR, + DEFAULT_EVERSTAKE_VALIDATOR, + DEFAULT_STAKED_VALIDATOR, + { + address: '0xb683b742b378632a5f73a2a5a45801b3489bba44', + alias: 'AVS: Luganodes', + }, + { + address: '0xbf1023eff3dba21263bf2db2add67a0d6bcda2de', + alias: 'AVS: Pier Two', + }, ], }, everclear: { threshold: 2, validators: [ - '0xeff20ae3d5ab90abb11e882cfce4b92ea6c74837', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0xD79DFbF56ee2268f061cc613027a44A880f61Ba2', // everclear + { + address: '0xeff20ae3d5ab90abb11e882cfce4b92ea6c74837', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + { + address: '0xD79DFbF56ee2268f061cc613027a44A880f61Ba2', + alias: 'Everclear', + }, ], }, fantom: { threshold: 2, validators: [ - '0xa779572028e634e16f26af5dfd4fa685f619457d', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xa779572028e634e16f26af5dfd4fa685f619457d', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, flame: { threshold: 2, validators: [ - '0x1fa928ce884fa16357d4b8866e096392d4d81f43', - '0xa6c998f0db2b56d7a63faf30a9b677c8b9b6faab', // p-ops - '0x0d4c1394a255568ec0ecd11795b28d1bda183ca4', // tessellated + { + address: '0x1fa928ce884fa16357d4b8866e096392d4d81f43', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0xa6c998f0db2b56d7a63faf30a9b677c8b9b6faab', + alias: 'P-OPS', + }, + DEFAULT_TESSELLATED_VALIDATOR, ], }, flare: { threshold: 2, validators: [ - '0xb65e52be342dba3ab2c088ceeb4290c744809134', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xb65e52be342dba3ab2c088ceeb4290c744809134', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, flowmainnet: { threshold: 3, validators: [ - '0xe132235c958ca1f3f24d772e5970dd58da4c0f6e', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis - '0x14ADB9e3598c395Fe3290f3ba706C3816Aa78F59', // flow foundation + { + address: '0xe132235c958ca1f3f24d772e5970dd58da4c0f6e', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + { + address: '0x14ADB9e3598c395Fe3290f3ba706C3816Aa78F59', + alias: 'Flow Foundation', + }, ], }, formtestnet: { threshold: 1, - validators: ['0x72ad7fddf16d17ff902d788441151982fa31a7bc'], + validators: [ + { + address: '0x72ad7fddf16d17ff902d788441151982fa31a7bc', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, fraxtal: { threshold: 4, validators: [ - '0x4bce180dac6da60d0f3a2bdf036ffe9004f944c1', - '0x0d4c1394a255568ec0ecd11795B28D1BdA183Ca4', // tessellated (superlane) - '0x1c3C3013B863Cf666499Da1A61949AE396E3Ab82', // enigma (superlane) - '0x573e960e07ad74ea2c5f1e3c31b2055994b12797', // imperator (superlane) - '0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3', // bware (superlane) - '0x25b3a88f7cfd3c9f7d7e32b295673a16a6ddbd91', // luganodes (superlane) + { + address: '0x4bce180dac6da60d0f3a2bdf036ffe9004f944c1', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_TESSELLATED_VALIDATOR, + { + address: '0x1c3C3013B863Cf666499Da1A61949AE396E3Ab82', + alias: 'Superlane: Enigma', + }, + { + address: '0x573e960e07ad74ea2c5f1e3c31b2055994b12797', + alias: 'Superlane: Imperator', + }, + DEFAULT_BWARE_LABS_VALIDATOR, + { + address: '0x25b3a88f7cfd3c9f7d7e32b295673a16a6ddbd91', + alias: 'Superlane: Luganodes', + }, ], }, fuji: { threshold: 2, validators: [ - '0xd8154f73d04cc7f7f0c332793692e6e6f6b2402e', - '0x895ae30bc83ff1493b9cf7781b0b813d23659857', - '0x43e915573d9f1383cbf482049e4a012290759e7f', + { + address: '0xd8154f73d04cc7f7f0c332793692e6e6f6b2402e', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0x895ae30bc83ff1493b9cf7781b0b813d23659857', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0x43e915573d9f1383cbf482049e4a012290759e7f', + alias: AW_VALIDATOR_ALIAS, + }, ], }, fusemainnet: { threshold: 2, validators: [ - '0x770c8ec9aac8cec4b2ead583b49acfbc5a1cf8a9', - '0x6760226b34213d262D41D5291Ed57E81a68b4E0b', // fuse - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly + { + address: '0x770c8ec9aac8cec4b2ead583b49acfbc5a1cf8a9', + alias: AW_VALIDATOR_ALIAS, + }, + { address: '0x6760226b34213d262D41D5291Ed57E81a68b4E0b', alias: 'Fuse' }, + DEFAULT_MERKLY_VALIDATOR, ], }, gnosis: { threshold: 3, validators: [ - '0xd4df66a859585678f2ea8357161d896be19cc1ca', - '0x19fb7e04a1be6b39b6966a0b0c60b929a93ed672', // dsrv - '0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8', // everstake - '0x5450447aee7b544c462c9352bef7cad049b0c2dc', // zeeprime + { + address: '0xd4df66a859585678f2ea8357161d896be19cc1ca', + alias: AW_VALIDATOR_ALIAS, + }, + { address: '0x19fb7e04a1be6b39b6966a0b0c60b929a93ed672', alias: 'DSRV' }, + DEFAULT_EVERSTAKE_VALIDATOR, + DEFAULT_ZEE_PRIME_VALIDATOR, ], }, gravity: { threshold: 2, validators: [ - '0x23d549bf757a02a6f6068e9363196ecd958c974e', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x23d549bf757a02a6f6068e9363196ecd958c974e', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, harmony: { threshold: 2, validators: [ - '0xd677803a67651974b1c264171b5d7ca8838db8d5', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xd677803a67651974b1c264171b5d7ca8838db8d5', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, holesky: { threshold: 1, - validators: ['0x7ab28ad88bb45867137ea823af88e2cb02359c03'], // TODO + validators: [ + { + address: '0x7ab28ad88bb45867137ea823af88e2cb02359c03', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, hyperliquidevmtestnet: { threshold: 1, - validators: ['0xea673a92a23ca319b9d85cc16b248645cd5158da'], + validators: [ + { + address: '0xea673a92a23ca319b9d85cc16b248645cd5158da', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, immutablezkevmmainnet: { threshold: 2, validators: [ - '0xbdda85b19a5efbe09e52a32db1a072f043dd66da', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xbdda85b19a5efbe09e52a32db1a072f043dd66da', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, inevm: { threshold: 2, validators: [ - '0xf9e35ee88e4448a3673b4676a4e153e3584a08eb', - '0x0d4e7e64f3a032db30b75fe7acae4d2c877883bc', // decentrio - '0x9ab11f38a609940153850df611c9a2175dcffe0f', // imperator + { + address: '0xf9e35ee88e4448a3673b4676a4e153e3584a08eb', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0x0d4e7e64f3a032db30b75fe7acae4d2c877883bc', + alias: 'Decentrio', + }, + { + address: '0x9ab11f38a609940153850df611c9a2175dcffe0f', + alias: 'Imperator', + }, ], }, injective: { threshold: 2, validators: [ - '0xbfb8911b72cfb138c7ce517c57d9c691535dc517', - '0x6B1d09A97b813D53e9D4b7523DA36604C0B52242', // caldera - '0x9e551b6694bbd295d7d6e6a2540c7d41ce70a3b9', // imperator + { + address: '0xbfb8911b72cfb138c7ce517c57d9c691535dc517', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0x6B1d09A97b813D53e9D4b7523DA36604C0B52242', + alias: 'Caldera', + }, + { + address: '0x9e551b6694bbd295d7d6e6a2540c7d41ce70a3b9', + alias: 'Imperator', + }, ], }, inksepolia: { threshold: 1, - validators: ['0xe61c846aee275070207fcbf43674eb254f06097a'], + validators: [ + { + address: '0xe61c846aee275070207fcbf43674eb254f06097a', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, kaia: { threshold: 2, validators: [ - '0x9de0b3abb221d19719882fa4d61f769fdc2be9a4', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x9de0b3abb221d19719882fa4d61f769fdc2be9a4', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, kroma: { threshold: 2, validators: [ - '0x71b83c21342787d758199e4b8634d3a15f02dc6e', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x71b83c21342787d758199e4b8634d3a15f02dc6e', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, linea: { threshold: 2, validators: [ - '0xf2d5409a59e0f5ae7635aff73685624904a77d94', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xf2d5409a59e0f5ae7635aff73685624904a77d94', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, lisk: { threshold: 4, validators: [ - '0xc0b282aa5bac43fee83cf71dc3dd1797c1090ea5', - '0x0d4c1394a255568ec0ecd11795b28d1bda183ca4', // tessellated (superlane) - '0x3DA4ee2801Ec6CC5faD73DBb94B10A203ADb3d9e', // enigma (superlane) - '0x4df6e8878992c300e7bfe98cac6bf7d3408b9cbf', // imperator (superlane) - '0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3', // bware (superlane) - '0xf0da628f3fb71652d48260bad4691054045832ce', // luganodes (superlane) + { + address: '0xc0b282aa5bac43fee83cf71dc3dd1797c1090ea5', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_TESSELLATED_VALIDATOR, + { + address: '0x3DA4ee2801Ec6CC5faD73DBb94B10A203ADb3d9e', + alias: 'Superlane: Enigma', + }, + { + address: '0x4df6e8878992c300e7bfe98cac6bf7d3408b9cbf', + alias: 'Superlane: Imperator', + }, + DEFAULT_BWARE_LABS_VALIDATOR, + { + address: '0xf0da628f3fb71652d48260bad4691054045832ce', + alias: 'Superlane: Luganodes', + }, ], }, lukso: { threshold: 2, validators: [ - '0xa5e953701dcddc5b958b5defb677a829d908df6d', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x101cE77261245140A0871f9407d6233C8230Ec47', // blockhunters + { + address: '0xa5e953701dcddc5b958b5defb677a829d908df6d', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + { + address: '0x101cE77261245140A0871f9407d6233C8230Ec47', + alias: 'Blockhunters', + }, ], }, lumia: { threshold: 2, validators: [ - '0x9e283254ed2cd2c80f007348c2822fc8e5c2fa5f', - '0xCF0211faFBb91FD9D06D7E306B30032DC3A1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x9e283254ed2cd2c80f007348c2822fc8e5c2fa5f', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, mantapacific: { threshold: 5, validators: [ - '0x8e668c97ad76d0e28375275c41ece4972ab8a5bc', //abacusworks - '0x521a3e6bf8d24809fde1c1fd3494a859a16f132c', //cosmostation - '0x14025fe092f5f8a401dd9819704d9072196d2125', //p2p - '0x25b9a0961c51e74fd83295293bc029131bf1e05a', //neutron - '0xa0eE95e280D46C14921e524B075d0C341e7ad1C8', //cosmos spaces - '0xcc9a0b6de7fe314bd99223687d784730a75bb957', //dsrv - '0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf', //sg-1 + { + address: '0x8e668c97ad76d0e28375275c41ece4972ab8a5bc', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0x521a3e6bf8d24809fde1c1fd3494a859a16f132c', + alias: 'Cosmostation', + }, + { address: '0x14025fe092f5f8a401dd9819704d9072196d2125', alias: 'P2P' }, + { + address: '0x25b9a0961c51e74fd83295293bc029131bf1e05a', + alias: 'Neutron', + }, + { + address: '0xa0eE95e280D46C14921e524B075d0C341e7ad1C8', + alias: 'Cosmos Spaces', + }, + { address: '0xcc9a0b6de7fe314bd99223687d784730a75bb957', alias: 'DSRV' }, + { address: '0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf', alias: 'SG-1' }, ], }, mantle: { threshold: 2, validators: [ - '0xf930636c5a1a8bf9302405f72e3af3c96ebe4a52', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xf930636c5a1a8bf9302405f72e3af3c96ebe4a52', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, merlin: { threshold: 2, validators: [ - '0xc1d6600cb9326ed2198cc8c4ba8d6668e8671247', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xc1d6600cb9326ed2198cc8c4ba8d6668e8671247', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, metal: { threshold: 2, validators: [ - '0xd9f7f1a05826197a93df51e86cefb41dfbfb896a', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xd9f7f1a05826197a93df51e86cefb41dfbfb896a', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, metis: { threshold: 2, validators: [ - '0xc4a3d25107060e800a43842964546db508092260', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xc4a3d25107060e800a43842964546db508092260', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, mint: { threshold: 2, validators: [ - '0xfed01ccdd7a65e8a6ad867b7fb03b9eb47777ac9', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x0230505530b80186f8cdccfaf9993eb97aebe98a', // mint + { + address: '0xfed01ccdd7a65e8a6ad867b7fb03b9eb47777ac9', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + { address: '0x0230505530b80186f8cdccfaf9993eb97aebe98a', alias: 'Mint' }, ], }, mode: { threshold: 4, validators: [ - '0x7eb2e1920a4166c19d6884c1cec3d2cf356fc9b7', - '0x0d4c1394a255568ec0ecd11795b28d1bda183ca4', // tessellated (superlane) - '0x65C140e3a05F33192384AffEF985696Fe3cDDE42', // enigma (superlane) - '0x20eade18ea2af6dfd54d72b3b5366b40fcb47f4b', // imperator (superlane) - '0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3', // bware (superlane) - '0x485a4f0009d9afbbf44521016f9b8cdd718e36ea', // luganodes (superlane) + { + address: '0x7eb2e1920a4166c19d6884c1cec3d2cf356fc9b7', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_TESSELLATED_VALIDATOR, + { + address: '0x65C140e3a05F33192384AffEF985696Fe3cDDE42', + alias: 'Superlane: Enigma', + }, + { + address: '0x20eade18ea2af6dfd54d72b3b5366b40fcb47f4b', + alias: 'Superlane: Imperator', + }, + DEFAULT_BWARE_LABS_VALIDATOR, + { + address: '0x485a4f0009d9afbbf44521016f9b8cdd718e36ea', + alias: 'Superlane: Luganodes', + }, ], }, molten: { threshold: 2, validators: [ - '0xad5aa33f0d67f6fa258abbe75458ea4908f1dc9f', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xad5aa33f0d67f6fa258abbe75458ea4908f1dc9f', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, moonbeam: { threshold: 3, validators: [ - '0x2225e2f4e9221049456da93b71d2de41f3b6b2a8', - '0x645428d198d2e76cbd9c1647f5c80740bb750b97', // dsrv - '0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8', // everstake - '0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b', // staked + { + address: '0x2225e2f4e9221049456da93b71d2de41f3b6b2a8', + alias: AW_VALIDATOR_ALIAS, + }, + { address: '0x645428d198d2e76cbd9c1647f5c80740bb750b97', alias: 'DSRV' }, + DEFAULT_EVERSTAKE_VALIDATOR, + DEFAULT_STAKED_VALIDATOR, ], }, morph: { threshold: 2, validators: [ - '0x4884535f393151ec419add872100d352f71af380', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x4884535f393151ec419add872100d352f71af380', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, neutron: { threshold: 4, validators: [ - '0xa9b8c1f4998f781f958c63cfcd1708d02f004ff0', - '0xb65438a014fb05fbadcfe35bc6e25d372b6ba460', // cosmostation - '0x42fa752defe92459370a052b6387a87f7de9b80c', // p2p - '0xc79503a3e3011535a9c60f6d21f76f59823a38bd', // neutron - '0x47aa126e05933b95c5eb90b26e6b668d84f4b25a', // dsrv - '0x54b2cca5091b098a1a993dec03c4d1ee9af65999', // cosmos spaces - '0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf', // sg-1 + { + address: '0xa9b8c1f4998f781f958c63cfcd1708d02f004ff0', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0xb65438a014fb05fbadcfe35bc6e25d372b6ba460', + alias: 'Cosmostation', + }, + { address: '0x42fa752defe92459370a052b6387a87f7de9b80c', alias: 'P2P' }, + { + address: '0xc79503a3e3011535a9c60f6d21f76f59823a38bd', + alias: 'Neutron', + }, + { address: '0x47aa126e05933b95c5eb90b26e6b668d84f4b25a', alias: 'DSRV' }, + { + address: '0x54b2cca5091b098a1a993dec03c4d1ee9af65999', + alias: 'Cosmos Spaces', + }, + { address: '0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf', alias: 'SG-1' }, ], }, odysseytestnet: { threshold: 1, - validators: ['0xcc0a6e2d6aa8560b45b384ced7aa049870b66ea3'], + validators: [ + { + address: '0xcc0a6e2d6aa8560b45b384ced7aa049870b66ea3', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, oortmainnet: { threshold: 2, validators: [ - '0x9b7ff56cd9aa69006f73f1c5b8c63390c706a5d7', - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis - '0x032dE4f94676bF9314331e7D83E8Db4aC74c9E21', // oort + { + address: '0x9b7ff56cd9aa69006f73f1c5b8c63390c706a5d7', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MITOSIS_VALIDATOR, + { address: '0x032dE4f94676bF9314331e7D83E8Db4aC74c9E21', alias: 'Oort' }, ], }, optimism: { threshold: 4, validators: [ - '0x20349eadc6c72e94ce38268b96692b1a5c20de4f', - '0x0d4c1394a255568ec0ecd11795b28d1bda183ca4', // tessellated (superlane) - '0xd8c1cCbfF28413CE6c6ebe11A3e29B0D8384eDbB', // enigma (superlane) - '0x1b9e5f36c4bfdb0e3f0df525ef5c888a4459ef99', // imperator (superlane) - '0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3', // bware (superlane) - '0xf9dfaa5c20ae1d84da4b2696b8dc80c919e48b12', // luganodes (superlane) + { + address: '0x20349eadc6c72e94ce38268b96692b1a5c20de4f', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_TESSELLATED_VALIDATOR, + { + address: '0xd8c1cCbfF28413CE6c6ebe11A3e29B0D8384eDbB', + alias: 'Superlane: Enigma', + }, + { + address: '0x1b9e5f36c4bfdb0e3f0df525ef5c888a4459ef99', + alias: 'Superlane: Imperator', + }, + DEFAULT_BWARE_LABS_VALIDATOR, + { + address: '0xf9dfaa5c20ae1d84da4b2696b8dc80c919e48b12', + alias: 'Superlane: Luganodes', + }, ], }, optimismsepolia: { threshold: 1, - validators: ['0x03efe4d0632ee15685d7e8f46dea0a874304aa29'], + validators: [ + { + address: '0x03efe4d0632ee15685d7e8f46dea0a874304aa29', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, orderly: { threshold: 2, validators: [ - '0xec3dc91f9fa2ad35edf5842aa764d5573b778bb6', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xec3dc91f9fa2ad35edf5842aa764d5573b778bb6', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, osmosis: { threshold: 1, - validators: ['0xea483af11c19fa41b16c31d1534c2a486a92bcac'], + validators: [ + { + address: '0xea483af11c19fa41b16c31d1534c2a486a92bcac', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, plumetestnet: { threshold: 1, - validators: ['0xe765a214849f3ecdf00793b97d00422f2d408ea6'], + validators: [ + { + address: '0xe765a214849f3ecdf00793b97d00422f2d408ea6', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, polygon: { threshold: 3, validators: [ - '0x12ecb319c7f4e8ac5eb5226662aeb8528c5cefac', - '0x008f24cbb1cc30ad0f19f2516ca75730e37efb5f', // dsrv - '0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8', // everstake - '0x5450447aee7b544c462c9352bef7cad049b0c2dc', // zeeprime + { + address: '0x12ecb319c7f4e8ac5eb5226662aeb8528c5cefac', + alias: AW_VALIDATOR_ALIAS, + }, + { address: '0x008f24cbb1cc30ad0f19f2516ca75730e37efb5f', alias: 'DSRV' }, + DEFAULT_EVERSTAKE_VALIDATOR, + DEFAULT_ZEE_PRIME_VALIDATOR, ], }, polygonamoy: { threshold: 1, - validators: ['0xf0290b06e446b320bd4e9c4a519420354d7ddccd'], + validators: [ + { + address: '0xf0290b06e446b320bd4e9c4a519420354d7ddccd', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, polygonzkevm: { threshold: 2, validators: [ - '0x86f2a44592bb98da766e880cfd70d3bbb295e61a', - '0x865818fe1db986036d5fd0466dcd462562436d1a', // dsrv - '0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8', // everstake + { + address: '0x86f2a44592bb98da766e880cfd70d3bbb295e61a', + alias: AW_VALIDATOR_ALIAS, + }, + { address: '0x865818fe1db986036d5fd0466dcd462562436d1a', alias: 'DSRV' }, + DEFAULT_EVERSTAKE_VALIDATOR, ], }, polynomialfi: { threshold: 2, validators: [ - '0x23d348c2d365040e56f3fee07e6897122915f513', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x23d348c2d365040e56f3fee07e6897122915f513', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, prom: { threshold: 2, validators: [ - '0xb0c4042b7c9a95345be8913f4cdbf4043b923d98', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xb0c4042b7c9a95345be8913f4cdbf4043b923d98', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, proofofplay: { threshold: 2, validators: [ - '0xcda40baa71970a06e5f55e306474de5ca4e21c3b', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xcda40baa71970a06e5f55e306474de5ca4e21c3b', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, rarichain: { threshold: 2, validators: [ - '0xeac012df7530720dd7d6f9b727e4fe39807d1516', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xeac012df7530720dd7d6f9b727e4fe39807d1516', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, real: { threshold: 2, validators: [ - '0xaebadd4998c70b05ce8715cf0c3cb8862fe0beec', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xaebadd4998c70b05ce8715cf0c3cb8862fe0beec', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, redstone: { threshold: 3, validators: [ - '0x1400b9737007f7978d8b4bbafb4a69c83f0641a7', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis - '0x101cE77261245140A0871f9407d6233C8230Ec47', // blockhunters + { + address: '0x1400b9737007f7978d8b4bbafb4a69c83f0641a7', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + { + address: '0x101cE77261245140A0871f9407d6233C8230Ec47', + alias: 'Blockhunters', + }, ], }, rootstockmainnet: { threshold: 2, validators: [ - '0x8675eb603d62ab64e3efe90df914e555966e04ac', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x8675eb603d62ab64e3efe90df914e555966e04ac', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, sanko: { threshold: 2, validators: [ - '0x795c37d5babbc44094b084b0c89ed9db9b5fae39', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x795c37d5babbc44094b084b0c89ed9db9b5fae39', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, scroll: { threshold: 3, validators: [ - '0xad557170a9f2f21c35e03de07cb30dcbcc3dff63', - '0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b', // staked - '0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8', // everstake - '0xbac4ac39f1d8b5ef15f26fdb1294a7c9aba3f948', // dsrv + { + address: '0xad557170a9f2f21c35e03de07cb30dcbcc3dff63', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_STAKED_VALIDATOR, + DEFAULT_EVERSTAKE_VALIDATOR, + { address: '0xbac4ac39f1d8b5ef15f26fdb1294a7c9aba3f948', alias: 'DSRV' }, ], }, scrollsepolia: { threshold: 2, validators: [ - '0xbe18dbd758afb367180260b524e6d4bcd1cb6d05', - '0x9a11ed23ae962974018ab45bc133caabff7b3271', - '0x7867bea3c9761fe64e6d124b171f91fd5dd79644', + { + address: '0xbe18dbd758afb367180260b524e6d4bcd1cb6d05', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0x9a11ed23ae962974018ab45bc133caabff7b3271', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0x7867bea3c9761fe64e6d124b171f91fd5dd79644', + alias: AW_VALIDATOR_ALIAS, + }, ], }, sei: { threshold: 3, validators: [ - '0x9920d2dbf6c85ffc228fdc2e810bf895732c6aa5', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x101cE77261245140A0871f9407d6233C8230Ec47', // blockhunters - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x9920d2dbf6c85ffc228fdc2e810bf895732c6aa5', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + { + address: '0x101cE77261245140A0871f9407d6233C8230Ec47', + alias: 'Blockhunters', + }, + DEFAULT_MITOSIS_VALIDATOR, ], }, sepolia: { threshold: 2, validators: [ - '0xb22b65f202558adf86a8bb2847b76ae1036686a5', - '0x469f0940684d147defc44f3647146cb90dd0bc8e', - '0xd3c75dcf15056012a4d74c483a0c6ea11d8c2b83', + { + address: '0xb22b65f202558adf86a8bb2847b76ae1036686a5', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0x469f0940684d147defc44f3647146cb90dd0bc8e', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0xd3c75dcf15056012a4d74c483a0c6ea11d8c2b83', + alias: AW_VALIDATOR_ALIAS, + }, ], }, shibarium: { threshold: 2, validators: [ - '0xfa33391ee38597cbeef72ccde8c9e13e01e78521', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xfa33391ee38597cbeef72ccde8c9e13e01e78521', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, snaxchain: { threshold: 2, validators: [ - '0x2c25829ae32a772d2a49f6c4b34f8b01fd03ef9e', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x2c25829ae32a772d2a49f6c4b34f8b01fd03ef9e', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, solanadevnet: { threshold: 2, validators: [ - '0xec0f73dbc5b1962a20f7dcbe07c98414025b0c43', - '0x9c20a149dfa09ea9f77f5a7ca09ed44f9c025133', - '0x967c5ecdf2625ae86580bd203b630abaaf85cd62', + { + address: '0xec0f73dbc5b1962a20f7dcbe07c98414025b0c43', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0x9c20a149dfa09ea9f77f5a7ca09ed44f9c025133', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0x967c5ecdf2625ae86580bd203b630abaaf85cd62', + alias: AW_VALIDATOR_ALIAS, + }, ], }, solanamainnet: { threshold: 3, validators: [ - '0x28464752829b3ea59a497fca0bdff575c534c3ff', - '0x2b7514a2f77bd86bbf093fe6bb67d8611f51c659', // luganodes - '0xd90ea26ff731d967c5ea660851f7d63cb04ab820', // dsrv - '0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8', // everstake - '0xcb6bcbd0de155072a7ff486d9d7286b0f71dcc2d', // eclipse + { + address: '0x28464752829b3ea59a497fca0bdff575c534c3ff', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0x2b7514a2f77bd86bbf093fe6bb67d8611f51c659', + alias: 'Luganodes', + }, + { address: '0xd90ea26ff731d967c5ea660851f7d63cb04ab820', alias: 'DSRV' }, + DEFAULT_EVERSTAKE_VALIDATOR, + { + address: '0xcb6bcbd0de155072a7ff486d9d7286b0f71dcc2d', + alias: 'Eclipse', + }, ], }, solanatestnet: { threshold: 1, - validators: ['0xd4ce8fa138d4e083fc0e480cca0dbfa4f5f30bd5'], + validators: [ + { + address: '0xd4ce8fa138d4e083fc0e480cca0dbfa4f5f30bd5', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, soneiumtestnet: { threshold: 1, - validators: ['0x2e2101020ccdbe76aeda1c27823b0150f43d0c63'], + validators: [ + { + address: '0x2e2101020ccdbe76aeda1c27823b0150f43d0c63', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, sonictestnet: { threshold: 1, - validators: ['0x62e6591d00daec3fb658c3d19403828b4e9ddbb3'], + validators: [ + { + address: '0x62e6591d00daec3fb658c3d19403828b4e9ddbb3', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, stride: { threshold: 6, validators: [ - '0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8', // everstake - '0x88f0E5528131b10e3463C4c68108217Dd33462ac', // cosmostation - '0xa3eaa1216827ad63dd9db43f6168258a89177990', // DSRV - '0x3f869C36110F00D10dC74cca3ac1FB133cf019ad', // polkachu - '0x502dC6135d16E74056f609FBAF76846814C197D3', // strangelove - '0xc36979780c1aD43275182600a61Ce41f1C390FbE', // imperator - '0x87460dcEd16a75AECdBffD4189111d30B099f5b0', // enigma - '0xf54982134e52Eb7253236943FBffE0886C5bde0C', // L5 - '0x5937b7cE1029C3Ec4bD8e1AaCc0C0f9422654D7d', // stakecito - '0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b', // staked + DEFAULT_EVERSTAKE_VALIDATOR, + { + address: '0x88f0E5528131b10e3463C4c68108217Dd33462ac', + alias: 'Cosmostation', + }, + { address: '0xa3eaa1216827ad63dd9db43f6168258a89177990', alias: 'DSRV' }, + { + address: '0x3f869C36110F00D10dC74cca3ac1FB133cf019ad', + alias: 'Polkachu', + }, + { + address: '0x502dC6135d16E74056f609FBAF76846814C197D3', + alias: 'Strangelove', + }, + { + address: '0xc36979780c1aD43275182600a61Ce41f1C390FbE', + alias: 'Imperator', + }, + { + address: '0x87460dcEd16a75AECdBffD4189111d30B099f5b0', + alias: 'Enigma', + }, + { address: '0xf54982134e52Eb7253236943FBffE0886C5bde0C', alias: 'L5' }, + { + address: '0x5937b7cE1029C3Ec4bD8e1AaCc0C0f9422654D7d', + alias: 'Stakecito', + }, + DEFAULT_STAKED_VALIDATOR, ], }, suavetoliman: { threshold: 1, - validators: ['0xf58f6e30aabba34e8dd7f79b3168507192e2cc9b'], + validators: [ + { + address: '0xf58f6e30aabba34e8dd7f79b3168507192e2cc9b', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, superpositionmainnet: { threshold: 2, validators: [ - '0x3f489acdd341c6b4dd86293fa2cc5ecc8ccf4f84', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x3f489acdd341c6b4dd86293fa2cc5ecc8ccf4f84', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, superpositiontestnet: { threshold: 1, - validators: ['0x1d3168504b23b73cdf9c27f13bb0a595d7f1a96a'], + validators: [ + { + address: '0x1d3168504b23b73cdf9c27f13bb0a595d7f1a96a', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, superseed: { threshold: 1, - validators: ['0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88'], + validators: [ + { + address: '0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, taiko: { threshold: 3, validators: [ - '0xa930073c8f2d0b2f7423ea32293e0d1362e65d79', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis - '0x2F007c82672F2Bb97227D4e3F80Ac481bfB40A2a', // luganodes + { + address: '0xa930073c8f2d0b2f7423ea32293e0d1362e65d79', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + { + address: '0x2F007c82672F2Bb97227D4e3F80Ac481bfB40A2a', + alias: 'Luganodes', + }, ], }, tangle: { threshold: 2, validators: [ - '0x1ee52cbbfacd7dcb0ba4e91efaa6fbc61602b15b', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0xe271ef9a6e312540f099a378865432fa73f26689', // tangle + { + address: '0x1ee52cbbfacd7dcb0ba4e91efaa6fbc61602b15b', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + { + address: '0xe271ef9a6e312540f099a378865432fa73f26689', + alias: 'Tangle', + }, ], }, treasuretopaz: { threshold: 1, - validators: ['0x9750849beda0a7870462d4685f953fe39033a5ae'], + validators: [ + { + address: '0x9750849beda0a7870462d4685f953fe39033a5ae', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, unichain: { threshold: 1, - validators: ['0x9773a382342ebf604a2e5de0a1f462fb499e28b1'], + validators: [ + { + address: '0x9773a382342ebf604a2e5de0a1f462fb499e28b1', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, unichaintestnet: { threshold: 1, - validators: ['0x5e99961cf71918308c3b17ef21b5f515a4f86fe5'], + validators: [ + { + address: '0x5e99961cf71918308c3b17ef21b5f515a4f86fe5', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, vana: { threshold: 1, - validators: ['0xfdf3b0dfd4b822d10cacb15c8ae945ea269e7534'], + validators: [ + { + address: '0xfdf3b0dfd4b822d10cacb15c8ae945ea269e7534', + alias: AW_VALIDATOR_ALIAS, + }, + ], }, viction: { threshold: 2, validators: [ - '0x4E53dA92cD5Bf0a032b6B4614b986926456756A7', // blockpi - '0xa3f93fe365bf99f431d8fde740b140615e24f99b', // rockx - '0x1f87c368f8e05a85ef9126d984a980a20930cb9c', + { + address: '0x4E53dA92cD5Bf0a032b6B4614b986926456756A7', + alias: 'BlockPi', + }, + { address: '0xa3f93fe365bf99f431d8fde740b140615e24f99b', alias: 'RockX' }, + { + address: '0x1f87c368f8e05a85ef9126d984a980a20930cb9c', + alias: AW_VALIDATOR_ALIAS, + }, ], }, worldchain: { threshold: 2, validators: [ - '0x31048785845325b22817448b68d08f8a8fe36854', - '0x11e2a683e83617f186614071e422b857256a9aae', // imperator - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly + { + address: '0x31048785845325b22817448b68d08f8a8fe36854', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0x11e2a683e83617f186614071e422b857256a9aae', + alias: 'Imperator', + }, + DEFAULT_MERKLY_VALIDATOR, ], }, xai: { threshold: 2, validators: [ - '0xe993f01fea86eb64cda45ae5af1d5be40ac0c7e9', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xe993f01fea86eb64cda45ae5af1d5be40ac0c7e9', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, xlayer: { threshold: 2, validators: [ - '0xa2ae7c594703e988f23d97220717c513db638ea3', - '0xfed056cC0967F5BC9C6350F6C42eE97d3983394d', // imperator - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly + { + address: '0xa2ae7c594703e988f23d97220717c513db638ea3', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0xfed056cC0967F5BC9C6350F6C42eE97d3983394d', + alias: 'Imperator', + }, + DEFAULT_MERKLY_VALIDATOR, ], }, zeronetwork: { threshold: 2, validators: [ - '0x1bd9e3f8a90ea1a13b0f2838a1858046368aad87', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x1bd9e3f8a90ea1a13b0f2838a1858046368aad87', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, zetachain: { threshold: 3, validators: [ - '0xa3bca0b80317dbf9c7dce16a16ac89f4ff2b23ef', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x101cE77261245140A0871f9407d6233C8230Ec47', // blockhunters - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0xa3bca0b80317dbf9c7dce16a16ac89f4ff2b23ef', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + { + address: '0x101cE77261245140A0871f9407d6233C8230Ec47', + alias: 'Blockhunters', + }, + DEFAULT_MITOSIS_VALIDATOR, ], }, zircuit: { threshold: 3, validators: [ - '0x169ec400cc758fef3df6a0d6c51fbc6cdd1015bb', - '0x7aC6584c068eb2A72d4Db82A7B7cd5AB34044061', // luganodes - '0x0180444c9342BD672867Df1432eb3dA354413a6E', // hashkey cloud - '0x1da9176C2CE5cC7115340496fa7D1800a98911CE', // renzo + { + address: '0x169ec400cc758fef3df6a0d6c51fbc6cdd1015bb', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0x7aC6584c068eb2A72d4Db82A7B7cd5AB34044061', + alias: 'Luganodes', + }, + { + address: '0x0180444c9342BD672867Df1432eb3dA354413a6E', + alias: 'Hashkey Cloud', + }, + { address: '0x1da9176C2CE5cC7115340496fa7D1800a98911CE', alias: 'Renzo' }, ], }, zksync: { threshold: 3, validators: [ - '0xadd1d39ce7a687e32255ac457cf99a6d8c5b5d1a', - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis - '0x75237d42ce8ea27349a0254ada265db94157e0c1', // imperator + { + address: '0xadd1d39ce7a687e32255ac457cf99a6d8c5b5d1a', + alias: AW_VALIDATOR_ALIAS, + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, + { + address: '0x75237d42ce8ea27349a0254ada265db94157e0c1', + alias: 'Imperator', + }, ], }, zoramainnet: { threshold: 3, validators: [ - '0x35130945b625bb69b28aee902a3b9a76fa67125f', - '0x7089b6352d37d23fb05a7fee4229c78e038fba09', // imperator - '0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f', // merkly - '0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36', // mitosis + { + address: '0x35130945b625bb69b28aee902a3b9a76fa67125f', + alias: AW_VALIDATOR_ALIAS, + }, + { + address: '0x7089b6352d37d23fb05a7fee4229c78e038fba09', + alias: 'Imperator', + }, + DEFAULT_MERKLY_VALIDATOR, + DEFAULT_MITOSIS_VALIDATOR, ], }, }; diff --git a/typescript/sdk/src/index.ts b/typescript/sdk/src/index.ts index 61495f53c..fe9977443 100644 --- a/typescript/sdk/src/index.ts +++ b/typescript/sdk/src/index.ts @@ -13,7 +13,10 @@ export { TOKEN_EXCHANGE_RATE_SCALE, } from './consts/igp.js'; export { MAILBOX_VERSION } from './consts/mailbox.js'; -export { defaultMultisigConfigs } from './consts/multisigIsm.js'; +export { + AW_VALIDATOR_ALIAS, + defaultMultisigConfigs, +} from './consts/multisigIsm.js'; export { SEALEVEL_SPL_NOOP_ADDRESS } from './consts/sealevel.js'; export { TestChainName, @@ -154,6 +157,7 @@ export { decodeIsmMetadata } from './ism/metadata/decode.js'; export { buildAggregationIsmConfigs, buildMultisigIsmConfigs, + multisigConfigToIsmConfig, } from './ism/multisig.js'; export { AggregationIsmConfig, diff --git a/typescript/sdk/src/ism/adapters/CosmWasmMultisigAdapter.ts b/typescript/sdk/src/ism/adapters/CosmWasmMultisigAdapter.ts index aaeb89985..b4cb82374 100644 --- a/typescript/sdk/src/ism/adapters/CosmWasmMultisigAdapter.ts +++ b/typescript/sdk/src/ism/adapters/CosmWasmMultisigAdapter.ts @@ -13,7 +13,7 @@ import { ExecuteMsg as MultisigExecute, QueryMsg as MultisigQuery, } from '../../cw-types/IsmMultisig.types.js'; -import { MultisigConfig } from '../../ism/types.js'; +import { MultisigConfig, MultisigIsmConfig } from '../../ism/types.js'; import { MultiProtocolProvider } from '../../providers/MultiProtocolProvider.js'; import { ChainMap, ChainName } from '../../types.js'; @@ -39,7 +39,7 @@ export class CosmWasmMultisigAdapter extends BaseCosmWasmAdapter { return response; } - async getConfig(chain: ChainName): Promise { + async getConfig(chain: ChainName): Promise> { return this.queryMultisig({ multisig_ism: { enrolled_validators: { @@ -67,7 +67,7 @@ export class CosmWasmMultisigAdapter extends BaseCosmWasmAdapter { ([origin, config]) => { const domain = this.multiProvider.getDomainId(origin); const configuredSet = new Set(configuredMap[origin].validators); - const configSet = new Set(config.validators); + const configSet = new Set(config.validators.map((v) => v.address)); const unenrollList = Array.from( difference(configuredSet, configSet).values(), ); diff --git a/typescript/sdk/src/ism/multisig.ts b/typescript/sdk/src/ism/multisig.ts index 83025f198..6d0394562 100644 --- a/typescript/sdk/src/ism/multisig.ts +++ b/typescript/sdk/src/ism/multisig.ts @@ -9,6 +9,16 @@ import { MultisigIsmConfig, } from './types.js'; +// Convert a MultisigConfig to a MultisigIsmConfig with the specified ISM type +export const multisigConfigToIsmConfig = ( + type: MultisigIsmConfig['type'], + config: MultisigConfig, +): MultisigIsmConfig => ({ + type, + threshold: config.threshold, + validators: config.validators.map((v) => v.address), +}); + // build multisigIsmConfig from multisigConfig // eg. for { sepolia (local), arbitrumsepolia, scrollsepolia } // arbitrumsepolia => Ism, scrollsepolia => Ism @@ -21,13 +31,10 @@ export const buildMultisigIsmConfigs = ( return objMap( objFilter( multisigConfigs, - (chain, config): config is MultisigConfig => + (chain, _): _ is MultisigConfig => chain !== local && chains.includes(chain), ), - (_, config) => ({ - ...config, - type, - }), + (_, config) => multisigConfigToIsmConfig(type, config), ); }; @@ -45,14 +52,8 @@ export const buildAggregationIsmConfigs = ( (_, config): AggregationIsmConfig => ({ type: IsmType.AGGREGATION, modules: [ - { - ...config, - type: IsmType.MESSAGE_ID_MULTISIG, - }, - { - ...config, - type: IsmType.MERKLE_ROOT_MULTISIG, - }, + multisigConfigToIsmConfig(IsmType.MESSAGE_ID_MULTISIG, config), + multisigConfigToIsmConfig(IsmType.MERKLE_ROOT_MULTISIG, config), ], threshold: 1, }), diff --git a/typescript/sdk/src/ism/types.ts b/typescript/sdk/src/ism/types.ts index c215c346d..c9b3f8302 100644 --- a/typescript/sdk/src/ism/types.ts +++ b/typescript/sdk/src/ism/types.ts @@ -94,8 +94,13 @@ export function ismTypeToModuleType(ismType: IsmType): ModuleType { } } +export type ValidatorConfig = { + address: Address; + alias: string; +}; + export type MultisigConfig = { - validators: Array
; + validators: Array; threshold: number; }; diff --git a/typescript/sdk/src/token/adapters/CosmWasmTokenAdapter.test.ts b/typescript/sdk/src/token/adapters/CosmWasmTokenAdapter.test.ts index f699780c6..fbdd42e9d 100644 --- a/typescript/sdk/src/token/adapters/CosmWasmTokenAdapter.test.ts +++ b/typescript/sdk/src/token/adapters/CosmWasmTokenAdapter.test.ts @@ -370,13 +370,25 @@ export async function rotateValidators() { [TestChainName.test1]: { threshold: 5, validators: [ - '8e668c97ad76d0e28375275c41ece4972ab8a5bc', // hyperlane - '521a3e6bf8d24809fde1c1fd3494a859a16f132c', // cosmosstation - '25b9a0961c51e74fd83295293bc029131bf1e05a', // neutron (pablo) - '14025fe092f5f8a401dd9819704d9072196d2125', // p2p - 'a0ee95e280d46c14921e524b075d0c341e7ad1c8', // cosmos spaces - 'cc9a0b6de7fe314bd99223687d784730a75bb957', // dsrv - '42b6de2edbaa62c2ea2309ad85d20b3e37d38acf', // sg-1 + { + address: '8e668c97ad76d0e28375275c41ece4972ab8a5bc', + alias: 'hyperlane', + }, + { + address: '521a3e6bf8d24809fde1c1fd3494a859a16f132c', + alias: 'cosmosstation', + }, + { + address: '25b9a0961c51e74fd83295293bc029131bf1e05a', + alias: 'neutron (pablo)', + }, + { address: '14025fe092f5f8a401dd9819704d9072196d2125', alias: 'p2p' }, + { + address: 'a0ee95e280d46c14921e524b075d0c341e7ad1c8', + alias: 'cosmos spaces', + }, + { address: 'cc9a0b6de7fe314bd99223687d784730a75bb957', alias: 'dsrv' }, + { address: '42b6de2edbaa62c2ea2309ad85d20b3e37d38acf', alias: 'sg-1' }, ], }, }); From 935747609ddff327d2ce2cfed01ee6b7064a7158 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 27 Nov 2024 16:47:46 +0000 Subject: [PATCH 11/18] Version Packages (#4879) This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @hyperlane-xyz/cli@7.2.0 ### Minor Changes - d51815760: Support using the CLI to deploy warp routes that involve foreign deployments - 81ab4332f: Remove ismFactoryAddresses from warpConfig - 4b3537470: Changed the type of defaultMultisigConfigs, to track validator aliases in addition to their addresses. ### Patch Changes - Updated dependencies [81ab4332f] - Updated dependencies [4b3537470] - Updated dependencies [fa6d5f5c6] - Updated dependencies [fa6d5f5c6] - @hyperlane-xyz/sdk@7.2.0 - @hyperlane-xyz/utils@7.2.0 ## @hyperlane-xyz/sdk@7.2.0 ### Minor Changes - 81ab4332f: Remove ismFactoryAddresses from warpConfig - 4b3537470: Changed the type of defaultMultisigConfigs, to track validator aliases in addition to their addresses. - fa6d5f5c6: Add decodeIsmMetadata function ### Patch Changes - Updated dependencies [fa6d5f5c6] - @hyperlane-xyz/utils@7.2.0 - @hyperlane-xyz/core@5.8.2 ## @hyperlane-xyz/utils@7.2.0 ### Minor Changes - fa6d5f5c6: Add toUpperCamelCase and deepFind functionss ## @hyperlane-xyz/core@5.8.2 ### Patch Changes - Updated dependencies [fa6d5f5c6] - @hyperlane-xyz/utils@7.2.0 ## @hyperlane-xyz/helloworld@7.2.0 ### Patch Changes - Updated dependencies [81ab4332f] - Updated dependencies [4b3537470] - Updated dependencies [fa6d5f5c6] - @hyperlane-xyz/sdk@7.2.0 - @hyperlane-xyz/core@5.8.2 ## @hyperlane-xyz/widgets@7.2.0 ### Patch Changes - Updated dependencies [81ab4332f] - Updated dependencies [4b3537470] - Updated dependencies [fa6d5f5c6] - Updated dependencies [fa6d5f5c6] - @hyperlane-xyz/sdk@7.2.0 - @hyperlane-xyz/utils@7.2.0 ## @hyperlane-xyz/infra@7.2.0 ### Patch Changes - Updated dependencies [81ab4332f] - Updated dependencies [4b3537470] - Updated dependencies [fa6d5f5c6] - Updated dependencies [fa6d5f5c6] - @hyperlane-xyz/sdk@7.2.0 - @hyperlane-xyz/utils@7.2.0 - @hyperlane-xyz/helloworld@7.2.0 ## @hyperlane-xyz/ccip-server@7.2.0 ## @hyperlane-xyz/github-proxy@7.2.0 --------- Co-authored-by: github-actions[bot] --- .changeset/bright-students-exist.md | 5 ---- .changeset/empty-dodos-clap.md | 6 ----- .changeset/four-meals-cheat.md | 6 ----- .changeset/spotty-pumpkins-buy.md | 5 ---- .changeset/yellow-baboons-kneel.md | 5 ---- solidity/CHANGELOG.md | 7 ++++++ solidity/contracts/PackageVersioned.sol | 2 +- solidity/package.json | 4 ++-- typescript/ccip-server/CHANGELOG.md | 2 ++ typescript/ccip-server/package.json | 2 +- typescript/cli/CHANGELOG.md | 17 +++++++++++++ typescript/cli/package.json | 6 ++--- typescript/cli/src/version.ts | 2 +- typescript/github-proxy/CHANGELOG.md | 2 ++ typescript/github-proxy/package.json | 2 +- typescript/helloworld/CHANGELOG.md | 10 ++++++++ typescript/helloworld/package.json | 6 ++--- typescript/infra/CHANGELOG.md | 12 ++++++++++ typescript/infra/package.json | 8 +++---- typescript/sdk/CHANGELOG.md | 14 +++++++++++ typescript/sdk/package.json | 6 ++--- typescript/utils/CHANGELOG.md | 6 +++++ typescript/utils/package.json | 2 +- typescript/widgets/CHANGELOG.md | 11 +++++++++ typescript/widgets/package.json | 6 ++--- yarn.lock | 32 ++++++++++++------------- 26 files changed, 120 insertions(+), 66 deletions(-) delete mode 100644 .changeset/bright-students-exist.md delete mode 100644 .changeset/empty-dodos-clap.md delete mode 100644 .changeset/four-meals-cheat.md delete mode 100644 .changeset/spotty-pumpkins-buy.md delete mode 100644 .changeset/yellow-baboons-kneel.md diff --git a/.changeset/bright-students-exist.md b/.changeset/bright-students-exist.md deleted file mode 100644 index 84833ecae..000000000 --- a/.changeset/bright-students-exist.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/cli': minor ---- - -Support using the CLI to deploy warp routes that involve foreign deployments diff --git a/.changeset/empty-dodos-clap.md b/.changeset/empty-dodos-clap.md deleted file mode 100644 index cd2826f71..000000000 --- a/.changeset/empty-dodos-clap.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@hyperlane-xyz/cli': minor -'@hyperlane-xyz/sdk': minor ---- - -Remove ismFactoryAddresses from warpConfig diff --git a/.changeset/four-meals-cheat.md b/.changeset/four-meals-cheat.md deleted file mode 100644 index f0c4e4fc3..000000000 --- a/.changeset/four-meals-cheat.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@hyperlane-xyz/cli': minor -'@hyperlane-xyz/sdk': minor ---- - -Changed the type of defaultMultisigConfigs, to track validator aliases in addition to their addresses. diff --git a/.changeset/spotty-pumpkins-buy.md b/.changeset/spotty-pumpkins-buy.md deleted file mode 100644 index 2d8f0fcb3..000000000 --- a/.changeset/spotty-pumpkins-buy.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/utils': minor ---- - -Add toUpperCamelCase and deepFind functionss diff --git a/.changeset/yellow-baboons-kneel.md b/.changeset/yellow-baboons-kneel.md deleted file mode 100644 index 7a7ab6457..000000000 --- a/.changeset/yellow-baboons-kneel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': minor ---- - -Add decodeIsmMetadata function diff --git a/solidity/CHANGELOG.md b/solidity/CHANGELOG.md index 0ba5c201e..c89664651 100644 --- a/solidity/CHANGELOG.md +++ b/solidity/CHANGELOG.md @@ -1,5 +1,12 @@ # @hyperlane-xyz/core +## 5.8.2 + +### Patch Changes + +- Updated dependencies [fa6d5f5c6] + - @hyperlane-xyz/utils@7.2.0 + ## 5.8.1 ### Patch Changes diff --git a/solidity/contracts/PackageVersioned.sol b/solidity/contracts/PackageVersioned.sol index 476985336..19ee043e4 100644 --- a/solidity/contracts/PackageVersioned.sol +++ b/solidity/contracts/PackageVersioned.sol @@ -7,5 +7,5 @@ pragma solidity >=0.6.11; **/ abstract contract PackageVersioned { // GENERATED CODE - DO NOT EDIT - string public constant PACKAGE_VERSION = "5.8.1"; + string public constant PACKAGE_VERSION = "5.8.2"; } diff --git a/solidity/package.json b/solidity/package.json index d56a148a3..b7da3c521 100644 --- a/solidity/package.json +++ b/solidity/package.json @@ -1,11 +1,11 @@ { "name": "@hyperlane-xyz/core", "description": "Core solidity contracts for Hyperlane", - "version": "5.8.1", + "version": "5.8.2", "dependencies": { "@arbitrum/nitro-contracts": "^1.2.1", "@eth-optimism/contracts": "^0.6.0", - "@hyperlane-xyz/utils": "7.1.0", + "@hyperlane-xyz/utils": "7.2.0", "@layerzerolabs/lz-evm-oapp-v2": "2.0.2", "@openzeppelin/contracts": "^4.9.3", "@openzeppelin/contracts-upgradeable": "^4.9.3", diff --git a/typescript/ccip-server/CHANGELOG.md b/typescript/ccip-server/CHANGELOG.md index 5bfabb5d4..19fb8981b 100644 --- a/typescript/ccip-server/CHANGELOG.md +++ b/typescript/ccip-server/CHANGELOG.md @@ -1,5 +1,7 @@ # @hyperlane-xyz/ccip-server +## 7.2.0 + ## 7.1.0 ## 7.0.0 diff --git a/typescript/ccip-server/package.json b/typescript/ccip-server/package.json index 58e7a3e55..abf2fd252 100644 --- a/typescript/ccip-server/package.json +++ b/typescript/ccip-server/package.json @@ -1,6 +1,6 @@ { "name": "@hyperlane-xyz/ccip-server", - "version": "7.1.0", + "version": "7.2.0", "description": "CCIP server", "typings": "dist/index.d.ts", "typedocMain": "src/index.ts", diff --git a/typescript/cli/CHANGELOG.md b/typescript/cli/CHANGELOG.md index 9e82984e4..e56e03eb2 100644 --- a/typescript/cli/CHANGELOG.md +++ b/typescript/cli/CHANGELOG.md @@ -1,5 +1,22 @@ # @hyperlane-xyz/cli +## 7.2.0 + +### Minor Changes + +- d51815760: Support using the CLI to deploy warp routes that involve foreign deployments +- 81ab4332f: Remove ismFactoryAddresses from warpConfig +- 4b3537470: Changed the type of defaultMultisigConfigs, to track validator aliases in addition to their addresses. + +### Patch Changes + +- Updated dependencies [81ab4332f] +- Updated dependencies [4b3537470] +- Updated dependencies [fa6d5f5c6] +- Updated dependencies [fa6d5f5c6] + - @hyperlane-xyz/sdk@7.2.0 + - @hyperlane-xyz/utils@7.2.0 + ## 7.1.0 ### Minor Changes diff --git a/typescript/cli/package.json b/typescript/cli/package.json index 5b6765de3..669f5796f 100644 --- a/typescript/cli/package.json +++ b/typescript/cli/package.json @@ -1,13 +1,13 @@ { "name": "@hyperlane-xyz/cli", - "version": "7.1.0", + "version": "7.2.0", "description": "A command-line utility for common Hyperlane operations", "dependencies": { "@aws-sdk/client-kms": "^3.577.0", "@aws-sdk/client-s3": "^3.577.0", "@hyperlane-xyz/registry": "6.1.0", - "@hyperlane-xyz/sdk": "7.1.0", - "@hyperlane-xyz/utils": "7.1.0", + "@hyperlane-xyz/sdk": "7.2.0", + "@hyperlane-xyz/utils": "7.2.0", "@inquirer/core": "9.0.10", "@inquirer/figures": "1.0.5", "@inquirer/prompts": "3.3.2", diff --git a/typescript/cli/src/version.ts b/typescript/cli/src/version.ts index e882c3c6f..4d429cc34 100644 --- a/typescript/cli/src/version.ts +++ b/typescript/cli/src/version.ts @@ -1 +1 @@ -export const VERSION = '7.1.0'; +export const VERSION = '7.2.0'; diff --git a/typescript/github-proxy/CHANGELOG.md b/typescript/github-proxy/CHANGELOG.md index a522bb6d5..4bf7cd405 100644 --- a/typescript/github-proxy/CHANGELOG.md +++ b/typescript/github-proxy/CHANGELOG.md @@ -1,5 +1,7 @@ # @hyperlane-xyz/github-proxy +## 7.2.0 + ## 7.1.0 ## 7.0.0 diff --git a/typescript/github-proxy/package.json b/typescript/github-proxy/package.json index b6604be0e..f25270af3 100644 --- a/typescript/github-proxy/package.json +++ b/typescript/github-proxy/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/github-proxy", "description": "Github proxy that adds the API key to requests", - "version": "7.1.0", + "version": "7.2.0", "private": true, "scripts": { "deploy": "wrangler deploy", diff --git a/typescript/helloworld/CHANGELOG.md b/typescript/helloworld/CHANGELOG.md index fe9c0b3da..4ff380704 100644 --- a/typescript/helloworld/CHANGELOG.md +++ b/typescript/helloworld/CHANGELOG.md @@ -1,5 +1,15 @@ # @hyperlane-xyz/helloworld +## 7.2.0 + +### Patch Changes + +- Updated dependencies [81ab4332f] +- Updated dependencies [4b3537470] +- Updated dependencies [fa6d5f5c6] + - @hyperlane-xyz/sdk@7.2.0 + - @hyperlane-xyz/core@5.8.2 + ## 7.1.0 ### Patch Changes diff --git a/typescript/helloworld/package.json b/typescript/helloworld/package.json index 964795370..027782383 100644 --- a/typescript/helloworld/package.json +++ b/typescript/helloworld/package.json @@ -1,11 +1,11 @@ { "name": "@hyperlane-xyz/helloworld", "description": "A basic skeleton of an Hyperlane app", - "version": "7.1.0", + "version": "7.2.0", "dependencies": { - "@hyperlane-xyz/core": "5.8.1", + "@hyperlane-xyz/core": "5.8.2", "@hyperlane-xyz/registry": "6.1.0", - "@hyperlane-xyz/sdk": "7.1.0", + "@hyperlane-xyz/sdk": "7.2.0", "@openzeppelin/contracts-upgradeable": "^4.9.3", "ethers": "^5.7.2" }, diff --git a/typescript/infra/CHANGELOG.md b/typescript/infra/CHANGELOG.md index d533e66b3..67f5a826c 100644 --- a/typescript/infra/CHANGELOG.md +++ b/typescript/infra/CHANGELOG.md @@ -1,5 +1,17 @@ # @hyperlane-xyz/infra +## 7.2.0 + +### Patch Changes + +- Updated dependencies [81ab4332f] +- Updated dependencies [4b3537470] +- Updated dependencies [fa6d5f5c6] +- Updated dependencies [fa6d5f5c6] + - @hyperlane-xyz/sdk@7.2.0 + - @hyperlane-xyz/utils@7.2.0 + - @hyperlane-xyz/helloworld@7.2.0 + ## 7.1.0 ### Minor Changes diff --git a/typescript/infra/package.json b/typescript/infra/package.json index 400bb1154..cecef4332 100644 --- a/typescript/infra/package.json +++ b/typescript/infra/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/infra", "description": "Infrastructure utilities for the Hyperlane Network", - "version": "7.1.0", + "version": "7.2.0", "dependencies": { "@arbitrum/sdk": "^4.0.0", "@aws-sdk/client-iam": "^3.74.0", @@ -13,10 +13,10 @@ "@ethersproject/hardware-wallets": "^5.7.0", "@ethersproject/providers": "*", "@google-cloud/secret-manager": "^5.5.0", - "@hyperlane-xyz/helloworld": "7.1.0", + "@hyperlane-xyz/helloworld": "7.2.0", "@hyperlane-xyz/registry": "6.1.0", - "@hyperlane-xyz/sdk": "7.1.0", - "@hyperlane-xyz/utils": "7.1.0", + "@hyperlane-xyz/sdk": "7.2.0", + "@hyperlane-xyz/utils": "7.2.0", "@inquirer/prompts": "3.3.2", "@nomiclabs/hardhat-etherscan": "^3.0.3", "@safe-global/api-kit": "1.3.0", diff --git a/typescript/sdk/CHANGELOG.md b/typescript/sdk/CHANGELOG.md index 2395e197f..32548ed29 100644 --- a/typescript/sdk/CHANGELOG.md +++ b/typescript/sdk/CHANGELOG.md @@ -1,5 +1,19 @@ # @hyperlane-xyz/sdk +## 7.2.0 + +### Minor Changes + +- 81ab4332f: Remove ismFactoryAddresses from warpConfig +- 4b3537470: Changed the type of defaultMultisigConfigs, to track validator aliases in addition to their addresses. +- fa6d5f5c6: Add decodeIsmMetadata function + +### Patch Changes + +- Updated dependencies [fa6d5f5c6] + - @hyperlane-xyz/utils@7.2.0 + - @hyperlane-xyz/core@5.8.2 + ## 7.1.0 ### Minor Changes diff --git a/typescript/sdk/package.json b/typescript/sdk/package.json index 0c621a763..7104d6b42 100644 --- a/typescript/sdk/package.json +++ b/typescript/sdk/package.json @@ -1,15 +1,15 @@ { "name": "@hyperlane-xyz/sdk", "description": "The official SDK for the Hyperlane Network", - "version": "7.1.0", + "version": "7.2.0", "dependencies": { "@arbitrum/sdk": "^4.0.0", "@aws-sdk/client-s3": "^3.577.0", "@chain-registry/types": "^0.50.14", "@cosmjs/cosmwasm-stargate": "^0.32.4", "@cosmjs/stargate": "^0.32.4", - "@hyperlane-xyz/core": "5.8.1", - "@hyperlane-xyz/utils": "7.1.0", + "@hyperlane-xyz/core": "5.8.2", + "@hyperlane-xyz/utils": "7.2.0", "@safe-global/api-kit": "1.3.0", "@safe-global/protocol-kit": "1.3.0", "@safe-global/safe-deployments": "1.37.8", diff --git a/typescript/utils/CHANGELOG.md b/typescript/utils/CHANGELOG.md index 9d852ab86..325b17be9 100644 --- a/typescript/utils/CHANGELOG.md +++ b/typescript/utils/CHANGELOG.md @@ -1,5 +1,11 @@ # @hyperlane-xyz/utils +## 7.2.0 + +### Minor Changes + +- fa6d5f5c6: Add toUpperCamelCase and deepFind functionss + ## 7.1.0 ### Minor Changes diff --git a/typescript/utils/package.json b/typescript/utils/package.json index 4da150a92..327ec241a 100644 --- a/typescript/utils/package.json +++ b/typescript/utils/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/utils", "description": "General utilities and types for the Hyperlane network", - "version": "7.1.0", + "version": "7.2.0", "dependencies": { "@cosmjs/encoding": "^0.32.4", "@solana/web3.js": "^1.95.4", diff --git a/typescript/widgets/CHANGELOG.md b/typescript/widgets/CHANGELOG.md index bcfbecee3..ba6dd93bd 100644 --- a/typescript/widgets/CHANGELOG.md +++ b/typescript/widgets/CHANGELOG.md @@ -1,5 +1,16 @@ # @hyperlane-xyz/widgets +## 7.2.0 + +### Patch Changes + +- Updated dependencies [81ab4332f] +- Updated dependencies [4b3537470] +- Updated dependencies [fa6d5f5c6] +- Updated dependencies [fa6d5f5c6] + - @hyperlane-xyz/sdk@7.2.0 + - @hyperlane-xyz/utils@7.2.0 + ## 7.1.0 ### Minor Changes diff --git a/typescript/widgets/package.json b/typescript/widgets/package.json index ec40cfe6d..90e1e6778 100644 --- a/typescript/widgets/package.json +++ b/typescript/widgets/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/widgets", "description": "Common react components for Hyperlane projects", - "version": "7.1.0", + "version": "7.2.0", "peerDependencies": { "react": "^18", "react-dom": "^18" @@ -9,8 +9,8 @@ "dependencies": { "@cosmos-kit/react": "^2.18.0", "@headlessui/react": "^2.1.8", - "@hyperlane-xyz/sdk": "7.1.0", - "@hyperlane-xyz/utils": "7.1.0", + "@hyperlane-xyz/sdk": "7.2.0", + "@hyperlane-xyz/utils": "7.2.0", "@interchain-ui/react": "^1.23.28", "@rainbow-me/rainbowkit": "^2.2.0", "@solana/wallet-adapter-react": "^0.15.32", diff --git a/yarn.lock b/yarn.lock index bc7551faf..22d4776b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7321,8 +7321,8 @@ __metadata: "@ethersproject/abi": "npm:*" "@ethersproject/providers": "npm:*" "@hyperlane-xyz/registry": "npm:6.1.0" - "@hyperlane-xyz/sdk": "npm:7.1.0" - "@hyperlane-xyz/utils": "npm:7.1.0" + "@hyperlane-xyz/sdk": "npm:7.2.0" + "@hyperlane-xyz/utils": "npm:7.2.0" "@inquirer/core": "npm:9.0.10" "@inquirer/figures": "npm:1.0.5" "@inquirer/prompts": "npm:3.3.2" @@ -7359,13 +7359,13 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/core@npm:5.8.1, @hyperlane-xyz/core@workspace:solidity": +"@hyperlane-xyz/core@npm:5.8.2, @hyperlane-xyz/core@workspace:solidity": version: 0.0.0-use.local resolution: "@hyperlane-xyz/core@workspace:solidity" dependencies: "@arbitrum/nitro-contracts": "npm:^1.2.1" "@eth-optimism/contracts": "npm:^0.6.0" - "@hyperlane-xyz/utils": "npm:7.1.0" + "@hyperlane-xyz/utils": "npm:7.2.0" "@layerzerolabs/lz-evm-oapp-v2": "npm:2.0.2" "@layerzerolabs/solidity-examples": "npm:^1.1.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" @@ -7416,14 +7416,14 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/helloworld@npm:7.1.0, @hyperlane-xyz/helloworld@workspace:typescript/helloworld": +"@hyperlane-xyz/helloworld@npm:7.2.0, @hyperlane-xyz/helloworld@workspace:typescript/helloworld": version: 0.0.0-use.local resolution: "@hyperlane-xyz/helloworld@workspace:typescript/helloworld" dependencies: "@eslint/js": "npm:^9.15.0" - "@hyperlane-xyz/core": "npm:5.8.1" + "@hyperlane-xyz/core": "npm:5.8.2" "@hyperlane-xyz/registry": "npm:6.1.0" - "@hyperlane-xyz/sdk": "npm:7.1.0" + "@hyperlane-xyz/sdk": "npm:7.2.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@openzeppelin/contracts-upgradeable": "npm:^4.9.3" @@ -7472,10 +7472,10 @@ __metadata: "@ethersproject/hardware-wallets": "npm:^5.7.0" "@ethersproject/providers": "npm:*" "@google-cloud/secret-manager": "npm:^5.5.0" - "@hyperlane-xyz/helloworld": "npm:7.1.0" + "@hyperlane-xyz/helloworld": "npm:7.2.0" "@hyperlane-xyz/registry": "npm:6.1.0" - "@hyperlane-xyz/sdk": "npm:7.1.0" - "@hyperlane-xyz/utils": "npm:7.1.0" + "@hyperlane-xyz/sdk": "npm:7.2.0" + "@hyperlane-xyz/utils": "npm:7.2.0" "@inquirer/prompts": "npm:3.3.2" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-etherscan": "npm:^3.0.3" @@ -7545,7 +7545,7 @@ __metadata: languageName: node linkType: hard -"@hyperlane-xyz/sdk@npm:7.1.0, @hyperlane-xyz/sdk@workspace:typescript/sdk": +"@hyperlane-xyz/sdk@npm:7.2.0, @hyperlane-xyz/sdk@workspace:typescript/sdk": version: 0.0.0-use.local resolution: "@hyperlane-xyz/sdk@workspace:typescript/sdk" dependencies: @@ -7555,8 +7555,8 @@ __metadata: "@cosmjs/cosmwasm-stargate": "npm:^0.32.4" "@cosmjs/stargate": "npm:^0.32.4" "@eslint/js": "npm:^9.15.0" - "@hyperlane-xyz/core": "npm:5.8.1" - "@hyperlane-xyz/utils": "npm:7.1.0" + "@hyperlane-xyz/core": "npm:5.8.2" + "@hyperlane-xyz/utils": "npm:7.2.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@safe-global/api-kit": "npm:1.3.0" @@ -7599,7 +7599,7 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/utils@npm:7.1.0, @hyperlane-xyz/utils@workspace:typescript/utils": +"@hyperlane-xyz/utils@npm:7.2.0, @hyperlane-xyz/utils@workspace:typescript/utils": version: 0.0.0-use.local resolution: "@hyperlane-xyz/utils@workspace:typescript/utils" dependencies: @@ -7641,8 +7641,8 @@ __metadata: "@eslint/js": "npm:^9.15.0" "@headlessui/react": "npm:^2.1.8" "@hyperlane-xyz/registry": "npm:6.1.0" - "@hyperlane-xyz/sdk": "npm:7.1.0" - "@hyperlane-xyz/utils": "npm:7.1.0" + "@hyperlane-xyz/sdk": "npm:7.2.0" + "@hyperlane-xyz/utils": "npm:7.2.0" "@interchain-ui/react": "npm:^1.23.28" "@rainbow-me/rainbowkit": "npm:^2.2.0" "@solana/wallet-adapter-react": "npm:^0.15.32" From 93a6166658cb36dffd8f8522fb4769a9d90dcb91 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion <131957285+ljankovic-txfusion@users.noreply.github.com> Date: Wed, 27 Nov 2024 19:00:39 +0100 Subject: [PATCH 12/18] feat: Multi EVM Chain Signers (#4869) ### Description This PR introduces a series of changes focused on: - Introducing the Strategy `init` and `read` CLI command for creating a strategy config file in .hyperlane folder or user provided path. - Asks to save private key/address to config when choosing jsonRpc submitter type - supports all `TxSubmitterTypes` - excludes the `transforms` object creation in the CLI - Implementing middleware to resolve chains necessary for creating a signer based on the provided Hyperlane CLI command. - Creating an EVM Signer based on the signer strategy extracted from the `chain` (Ethereum protocol -> `ethers.Wallet`). - Instantiating an EVM signer by reading the private key from the strategy config, the `--key` flag, or environment variables (ENV). - Introducing the `MultiProtocolSigner` class that can attach signers to `MultiProvider` and to lay the groundwork for supporting other VM signers. ### Drive-by changes - Replaced `context.signer()` with `multiProvider.getSigner(chain)` to align with the above mentioned changes - Updated comments, naming conventions, and made minor fixes to improve readability and consistency. ### Related issues None ### Backward compatibility Yes ### Testing Manual testing and existing E2E CLI tests were performed. No additional CLI tests were added. --------- Co-authored-by: Morteza Shojaei <31728528+mortezashojaei@users.noreply.github.com> --- .changeset/chilly-balloons-rule.md | 5 + .changeset/spicy-gifts-hear.md | 5 + typescript/cli/cli.ts | 7 +- typescript/cli/src/commands/config.ts | 15 ++ typescript/cli/src/commands/options.ts | 5 +- typescript/cli/src/commands/signCommands.ts | 21 +- typescript/cli/src/commands/strategy.ts | 70 ++++++ typescript/cli/src/config/strategy.ts | 186 ++++++++++++++++ typescript/cli/src/config/warp.ts | 30 ++- typescript/cli/src/context/context.ts | 53 ++++- .../strategies/chain/ChainResolverFactory.ts | 34 +++ .../strategies/chain/MultiChainResolver.ts | 200 ++++++++++++++++++ .../strategies/chain/SingleChainResolver.ts | 25 +++ .../cli/src/context/strategies/chain/types.ts | 10 + .../signer/BaseMultiProtocolSigner.ts | 22 ++ .../signer/MultiProtocolSignerFactory.ts | 79 +++++++ .../signer/MultiProtocolSignerManager.ts | 153 ++++++++++++++ typescript/cli/src/context/types.ts | 4 + typescript/cli/src/deploy/agent.ts | 1 + typescript/cli/src/deploy/core.ts | 6 +- typescript/cli/src/deploy/utils.ts | 30 ++- typescript/cli/src/deploy/warp.ts | 17 +- typescript/cli/src/read/warp.ts | 12 +- typescript/cli/src/send/transfer.ts | 24 ++- typescript/cli/src/tests/commands/helpers.ts | 7 + typescript/cli/src/utils/balances.ts | 5 +- typescript/cli/src/utils/chains.ts | 33 +++ typescript/cli/src/utils/output.ts | 47 ++++ .../submitter/ethersV5/schemas.ts | 2 + typescript/utils/src/addresses.ts | 10 +- typescript/utils/src/index.ts | 1 + 31 files changed, 1053 insertions(+), 66 deletions(-) create mode 100644 .changeset/chilly-balloons-rule.md create mode 100644 .changeset/spicy-gifts-hear.md create mode 100644 typescript/cli/src/commands/strategy.ts create mode 100644 typescript/cli/src/config/strategy.ts create mode 100644 typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts create mode 100644 typescript/cli/src/context/strategies/chain/MultiChainResolver.ts create mode 100644 typescript/cli/src/context/strategies/chain/SingleChainResolver.ts create mode 100644 typescript/cli/src/context/strategies/chain/types.ts create mode 100644 typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts create mode 100644 typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts create mode 100644 typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts diff --git a/.changeset/chilly-balloons-rule.md b/.changeset/chilly-balloons-rule.md new file mode 100644 index 000000000..b339b7569 --- /dev/null +++ b/.changeset/chilly-balloons-rule.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/utils': minor +--- + +Added `isPrivateKeyEvm` function for validating EVM private keys diff --git a/.changeset/spicy-gifts-hear.md b/.changeset/spicy-gifts-hear.md new file mode 100644 index 000000000..37d4efa28 --- /dev/null +++ b/.changeset/spicy-gifts-hear.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/cli': minor +--- + +Added strategy management CLI commands and MultiProtocolSigner implementation for flexible cross-chain signer configuration and management diff --git a/typescript/cli/cli.ts b/typescript/cli/cli.ts index 77be0b86f..45cad33bb 100644 --- a/typescript/cli/cli.ts +++ b/typescript/cli/cli.ts @@ -19,15 +19,17 @@ import { overrideRegistryUriCommandOption, registryUriCommandOption, skipConfirmationOption, + strategyCommandOption, } from './src/commands/options.js'; import { registryCommand } from './src/commands/registry.js'; import { relayerCommand } from './src/commands/relayer.js'; import { sendCommand } from './src/commands/send.js'; import { statusCommand } from './src/commands/status.js'; +import { strategyCommand } from './src/commands/strategy.js'; import { submitCommand } from './src/commands/submit.js'; import { validatorCommand } from './src/commands/validator.js'; import { warpCommand } from './src/commands/warp.js'; -import { contextMiddleware } from './src/context/context.js'; +import { contextMiddleware, signerMiddleware } from './src/context/context.js'; import { configureLogger, errorRed } from './src/logger.js'; import { checkVersion } from './src/utils/version-check.js'; import { VERSION } from './src/version.js'; @@ -49,12 +51,14 @@ try { .option('key', keyCommandOption) .option('disableProxy', disableProxyCommandOption) .option('yes', skipConfirmationOption) + .option('strategy', strategyCommandOption) .global(['log', 'verbosity', 'registry', 'overrides', 'yes']) .middleware([ (argv) => { configureLogger(argv.log as LogFormat, argv.verbosity as LogLevel); }, contextMiddleware, + signerMiddleware, ]) .command(avsCommand) .command(configCommand) @@ -66,6 +70,7 @@ try { .command(relayerCommand) .command(sendCommand) .command(statusCommand) + .command(strategyCommand) .command(submitCommand) .command(validatorCommand) .command(warpCommand) diff --git a/typescript/cli/src/commands/config.ts b/typescript/cli/src/commands/config.ts index e72b72452..4a5c6b580 100644 --- a/typescript/cli/src/commands/config.ts +++ b/typescript/cli/src/commands/config.ts @@ -3,6 +3,7 @@ import { CommandModule } from 'yargs'; import { readChainConfigs } from '../config/chain.js'; import { readIsmConfig } from '../config/ism.js'; import { readMultisigConfig } from '../config/multisig.js'; +import { readChainSubmissionStrategyConfig } from '../config/strategy.js'; import { readWarpRouteDeployConfig } from '../config/warp.js'; import { CommandModuleWithContext } from '../context/types.js'; import { log, logGreen } from '../logger.js'; @@ -31,6 +32,7 @@ const validateCommand: CommandModule = { .command(validateChainCommand) .command(validateIsmCommand) .command(validateIsmAdvancedCommand) + .command(validateStrategyCommand) .command(validateWarpCommand) .version(false) .demandCommand(), @@ -76,6 +78,19 @@ const validateIsmAdvancedCommand: CommandModuleWithContext<{ path: string }> = { }, }; +const validateStrategyCommand: CommandModuleWithContext<{ path: string }> = { + command: 'strategy', + describe: 'Validates a Strategy config file', + builder: { + path: inputFileCommandOption(), + }, + handler: async ({ path }) => { + await readChainSubmissionStrategyConfig(path); + logGreen('Config is valid'); + process.exit(0); + }, +}; + const validateWarpCommand: CommandModuleWithContext<{ path: string }> = { command: 'warp', describe: 'Validate a Warp Route deployment config file', diff --git a/typescript/cli/src/commands/options.ts b/typescript/cli/src/commands/options.ts index f23194c80..baf0fa847 100644 --- a/typescript/cli/src/commands/options.ts +++ b/typescript/cli/src/commands/options.ts @@ -95,6 +95,7 @@ export const DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH = './configs/warp-route-deployment.yaml'; export const DEFAULT_CORE_DEPLOYMENT_CONFIG_PATH = './configs/core-config.yaml'; +export const DEFAULT_STRATEGY_CONFIG_PATH = `${os.homedir()}/.hyperlane/strategies/default-strategy.yaml`; export const warpDeploymentConfigCommandOption: Options = { type: 'string', @@ -196,8 +197,8 @@ export const transactionsCommandOption: Options = { export const strategyCommandOption: Options = { type: 'string', description: 'The submission strategy input file path.', - alias: 's', - demandOption: true, + alias: ['s', 'strategy'], + demandOption: false, }; export const addressCommandOption = ( diff --git a/typescript/cli/src/commands/signCommands.ts b/typescript/cli/src/commands/signCommands.ts index 37d83096a..6bd617302 100644 --- a/typescript/cli/src/commands/signCommands.ts +++ b/typescript/cli/src/commands/signCommands.ts @@ -1,7 +1,14 @@ // Commands that send tx and require a key to sign. // It's useful to have this listed here so the context // middleware can request keys up front when required. -export const SIGN_COMMANDS = ['deploy', 'send', 'status', 'submit', 'relayer']; +export const SIGN_COMMANDS = [ + 'apply', + 'deploy', + 'send', + 'status', + 'submit', + 'relayer', +]; export function isSignCommand(argv: any): boolean { return ( @@ -9,3 +16,15 @@ export function isSignCommand(argv: any): boolean { (argv._.length > 1 && SIGN_COMMANDS.includes(argv._[1])) ); } + +export enum CommandType { + WARP_DEPLOY = 'warp:deploy', + WARP_SEND = 'warp:send', + WARP_APPLY = 'warp:apply', + WARP_READ = 'warp:read', + SEND_MESSAGE = 'send:message', + AGENT_KURTOSIS = 'deploy:kurtosis-agents', + STATUS = 'status:', + SUBMIT = 'submit:', + RELAYER = 'relayer:', +} diff --git a/typescript/cli/src/commands/strategy.ts b/typescript/cli/src/commands/strategy.ts new file mode 100644 index 000000000..414a3d48e --- /dev/null +++ b/typescript/cli/src/commands/strategy.ts @@ -0,0 +1,70 @@ +import { stringify as yamlStringify } from 'yaml'; +import { CommandModule } from 'yargs'; + +import { + createStrategyConfig, + readChainSubmissionStrategyConfig, +} from '../config/strategy.js'; +import { CommandModuleWithWriteContext } from '../context/types.js'; +import { log, logCommandHeader } from '../logger.js'; +import { indentYamlOrJson } from '../utils/files.js'; +import { maskSensitiveData } from '../utils/output.js'; + +import { + DEFAULT_STRATEGY_CONFIG_PATH, + outputFileCommandOption, + strategyCommandOption, +} from './options.js'; + +/** + * Parent command + */ +export const strategyCommand: CommandModule = { + command: 'strategy', + describe: 'Manage Hyperlane deployment strategies', + builder: (yargs) => + yargs.command(init).command(read).version(false).demandCommand(), + handler: () => log('Command required'), +}; + +export const init: CommandModuleWithWriteContext<{ + out: string; +}> = { + command: 'init', + describe: 'Creates strategy configuration', + builder: { + out: outputFileCommandOption(DEFAULT_STRATEGY_CONFIG_PATH), + }, + handler: async ({ context, out }) => { + logCommandHeader(`Hyperlane Strategy Init`); + + await createStrategyConfig({ + context, + outPath: out, + }); + process.exit(0); + }, +}; + +export const read: CommandModuleWithWriteContext<{ + strategy: string; +}> = { + command: 'read', + describe: 'Reads strategy configuration', + builder: { + strategy: { + ...strategyCommandOption, + demandOption: true, + default: DEFAULT_STRATEGY_CONFIG_PATH, + }, + }, + handler: async ({ strategy: strategyUrl }) => { + logCommandHeader(`Hyperlane Strategy Read`); + + const strategy = await readChainSubmissionStrategyConfig(strategyUrl); + const maskedConfig = maskSensitiveData(strategy); + log(indentYamlOrJson(yamlStringify(maskedConfig, null, 2), 4)); + + process.exit(0); + }, +}; diff --git a/typescript/cli/src/config/strategy.ts b/typescript/cli/src/config/strategy.ts new file mode 100644 index 000000000..f57c7d337 --- /dev/null +++ b/typescript/cli/src/config/strategy.ts @@ -0,0 +1,186 @@ +import { confirm, input, password, select } from '@inquirer/prompts'; +import { Wallet } from 'ethers'; +import { stringify as yamlStringify } from 'yaml'; + +import { + ChainSubmissionStrategy, + ChainSubmissionStrategySchema, + TxSubmitterType, +} from '@hyperlane-xyz/sdk'; +import { + ProtocolType, + assert, + errorToString, + isAddress, + isPrivateKeyEvm, +} from '@hyperlane-xyz/utils'; + +import { CommandContext } from '../context/types.js'; +import { errorRed, log, logBlue, logGreen, logRed } from '../logger.js'; +import { runSingleChainSelectionStep } from '../utils/chains.js'; +import { + indentYamlOrJson, + isFile, + readYamlOrJson, + writeYamlOrJson, +} from '../utils/files.js'; +import { maskSensitiveData } from '../utils/output.js'; + +/** + * Reads and validates a chain submission strategy configuration from a file + */ +export async function readChainSubmissionStrategyConfig( + filePath: string, +): Promise { + log(`Reading submission strategy in ${filePath}`); + try { + const strategyConfig = readYamlOrJson(filePath); + + const parseResult = ChainSubmissionStrategySchema.parse(strategyConfig); + + return parseResult; + } catch (error) { + logRed(`⛔️ Error reading strategy config:`, errorToString(error)); + throw error; // Re-throw to let caller handle the error + } +} + +/** + * Safely reads chain submission strategy config, returns empty object if any errors occur + */ +export async function safeReadChainSubmissionStrategyConfig( + filePath: string, +): Promise { + try { + const trimmedFilePath = filePath.trim(); + if (!isFile(trimmedFilePath)) { + logBlue(`File ${trimmedFilePath} does not exist, returning empty config`); + return {}; + } + return await readChainSubmissionStrategyConfig(trimmedFilePath); + } catch (error) { + logRed( + `Failed to read strategy config, defaulting to empty config:`, + errorToString(error), + ); + return {}; + } +} + +export async function createStrategyConfig({ + context, + outPath, +}: { + context: CommandContext; + outPath: string; +}) { + let strategy: ChainSubmissionStrategy; + try { + const strategyObj = await readYamlOrJson(outPath); + strategy = ChainSubmissionStrategySchema.parse(strategyObj); + } catch { + strategy = writeYamlOrJson(outPath, {}, 'yaml'); + } + + const chain = await runSingleChainSelectionStep(context.chainMetadata); + const chainProtocol = context.chainMetadata[chain].protocol; + + if ( + !context.skipConfirmation && + strategy && + Object.prototype.hasOwnProperty.call(strategy, chain) + ) { + const isConfirmed = await confirm({ + message: `Default strategy for chain ${chain} already exists. Are you sure you want to overwrite existing strategy config?`, + default: false, + }); + + assert(isConfirmed, 'Strategy initialization cancelled by user.'); + } + + const isEthereum = chainProtocol === ProtocolType.Ethereum; + const submitterType = isEthereum + ? await select({ + message: 'Select the submitter type', + choices: Object.values(TxSubmitterType).map((value) => ({ + name: value, + value: value, + })), + }) + : TxSubmitterType.JSON_RPC; // Do other non-evm chains support gnosis and account impersonation? + + const submitter: Record = { type: submitterType }; + + switch (submitterType) { + case TxSubmitterType.JSON_RPC: + submitter.privateKey = await password({ + message: 'Enter the private key for JSON-RPC submission:', + validate: (pk) => (isEthereum ? isPrivateKeyEvm(pk) : true), + }); + + submitter.userAddress = isEthereum + ? await new Wallet(submitter.privateKey).getAddress() + : await input({ + message: 'Enter the user address for JSON-RPC submission:', + }); + + submitter.chain = chain; + break; + + case TxSubmitterType.IMPERSONATED_ACCOUNT: + submitter.userAddress = await input({ + message: 'Enter the user address to impersonate', + validate: (address) => + isAddress(address) ? true : 'Invalid Ethereum address', + }); + assert( + submitter.userAddress, + 'User address is required for impersonated account', + ); + break; + + case TxSubmitterType.GNOSIS_SAFE: + case TxSubmitterType.GNOSIS_TX_BUILDER: + submitter.safeAddress = await input({ + message: 'Enter the Safe address', + validate: (address) => + isAddress(address) ? true : 'Invalid Safe address', + }); + + submitter.chain = chain; + + if (submitterType === TxSubmitterType.GNOSIS_TX_BUILDER) { + submitter.version = await input({ + message: 'Enter the Safe version (default: 1.0)', + default: '1.0', + }); + } + break; + + default: + throw new Error(`Unsupported submitter type: ${submitterType}`); + } + + const strategyResult: ChainSubmissionStrategy = { + ...strategy, + [chain]: { + submitter: submitter as ChainSubmissionStrategy[string]['submitter'], + }, + }; + + try { + const strategyConfig = ChainSubmissionStrategySchema.parse(strategyResult); + logBlue(`Strategy configuration is valid. Writing to file ${outPath}:\n`); + + const maskedConfig = maskSensitiveData(strategyConfig); + log(indentYamlOrJson(yamlStringify(maskedConfig, null, 2), 4)); + + writeYamlOrJson(outPath, strategyConfig); + logGreen('✅ Successfully created a new strategy configuration.'); + } catch { + // don't log error since it may contain sensitive data + errorRed( + `The strategy configuration is invalid. Please review the submitter settings.`, + ); + } +} diff --git a/typescript/cli/src/config/warp.ts b/typescript/cli/src/config/warp.ts index 1174d0156..a2cd19d57 100644 --- a/typescript/cli/src/config/warp.ts +++ b/typescript/cli/src/config/warp.ts @@ -21,6 +21,8 @@ import { promiseObjAll, } from '@hyperlane-xyz/utils'; +import { DEFAULT_STRATEGY_CONFIG_PATH } from '../commands/options.js'; +import { MultiProtocolSignerManager } from '../context/strategies/signer/MultiProtocolSignerManager.js'; import { CommandContext } from '../context/types.js'; import { errorRed, log, logBlue, logGreen } from '../logger.js'; import { runMultiChainSelectionStep } from '../utils/chains.js'; @@ -35,6 +37,7 @@ import { } from '../utils/input.js'; import { createAdvancedIsmConfig } from './ism.js'; +import { readChainSubmissionStrategyConfig } from './strategy.js'; const TYPE_DESCRIPTIONS: Record = { [TokenType.synthetic]: 'A new ERC20 with remote transfer functionality', @@ -122,13 +125,6 @@ export async function createWarpRouteDeployConfig({ }) { logBlue('Creating a new warp route deployment config...'); - const owner = await detectAndConfirmOrPrompt( - async () => context.signer?.getAddress(), - 'Enter the desired', - 'owner address', - 'signer', - ); - const warpChains = await runMultiChainSelectionStep({ chainMetadata: context.chainMetadata, message: 'Select chains to connect', @@ -138,11 +134,31 @@ export async function createWarpRouteDeployConfig({ requiresConfirmation: !context.skipConfirmation, }); + const strategyConfig = await readChainSubmissionStrategyConfig( + context.strategyPath ?? DEFAULT_STRATEGY_CONFIG_PATH, + ); + + const multiProtocolSigner = new MultiProtocolSignerManager( + strategyConfig, + warpChains, + context.multiProvider, + { key: context.key }, + ); + + const multiProviderWithSigners = await multiProtocolSigner.getMultiProvider(); + const result: WarpRouteDeployConfig = {}; let typeChoices = TYPE_CHOICES; for (const chain of warpChains) { logBlue(`${chain}: Configuring warp route...`); + const owner = await detectAndConfirmOrPrompt( + async () => multiProviderWithSigners.getSigner(chain).getAddress(), + 'Enter the desired', + 'owner address', + 'signer', + ); + // default to the mailbox from the registry and if not found ask to the user to submit one const chainAddresses = await context.registry.getChainAddresses(chain); diff --git a/typescript/cli/src/context/context.ts b/typescript/cli/src/context/context.ts index f9dfb34ab..0d1084fcc 100644 --- a/typescript/cli/src/context/context.ts +++ b/typescript/cli/src/context/context.ts @@ -16,14 +16,18 @@ import { } from '@hyperlane-xyz/sdk'; import { isHttpsUrl, isNullish, rootLogger } from '@hyperlane-xyz/utils'; +import { DEFAULT_STRATEGY_CONFIG_PATH } from '../commands/options.js'; import { isSignCommand } from '../commands/signCommands.js'; +import { safeReadChainSubmissionStrategyConfig } from '../config/strategy.js'; import { PROXY_DEPLOYED_URL } from '../consts.js'; import { forkNetworkToMultiProvider, verifyAnvil } from '../deploy/dry-run.js'; import { logBlue } from '../logger.js'; import { runSingleChainSelectionStep } from '../utils/chains.js'; import { detectAndConfirmOrPrompt } from '../utils/input.js'; -import { getImpersonatedSigner, getSigner } from '../utils/keys.js'; +import { getImpersonatedSigner } from '../utils/keys.js'; +import { ChainResolverFactory } from './strategies/chain/ChainResolverFactory.js'; +import { MultiProtocolSignerManager } from './strategies/signer/MultiProtocolSignerManager.js'; import { CommandContext, ContextSettings, @@ -41,6 +45,7 @@ export async function contextMiddleware(argv: Record) { requiresKey, disableProxy: argv.disableProxy, skipConfirmation: argv.yes, + strategyPath: argv.strategy, }; if (!isDryRun && settings.fromAddress) throw new Error( @@ -52,6 +57,44 @@ export async function contextMiddleware(argv: Record) { argv.context = context; } +export async function signerMiddleware(argv: Record) { + const { key, requiresKey, multiProvider, strategyPath } = argv.context; + + if (!requiresKey && !key) return argv; + + const strategyConfig = await safeReadChainSubmissionStrategyConfig( + strategyPath ?? DEFAULT_STRATEGY_CONFIG_PATH, + ); + + /** + * Intercepts Hyperlane command to determine chains. + */ + const chainStrategy = ChainResolverFactory.getStrategy(argv); + + /** + * Resolves chains based on the chain strategy. + */ + const chains = await chainStrategy.resolveChains(argv); + + /** + * Extracts signer config + */ + const multiProtocolSigner = new MultiProtocolSignerManager( + strategyConfig, + chains, + multiProvider, + { key }, + ); + + /** + * @notice Attaches signers to MultiProvider and assigns it to argv.multiProvider + */ + argv.multiProvider = await multiProtocolSigner.getMultiProvider(); + argv.multiProtocolSigner = multiProtocolSigner; + + return argv; +} + /** * Retrieves context for the user-selected command * @returns context for the current command @@ -66,18 +109,14 @@ export async function getContext({ }: ContextSettings): Promise { const registry = getRegistry(registryUri, registryOverrideUri, !disableProxy); - let signer: ethers.Wallet | undefined = undefined; - if (key || requiresKey) { - ({ key, signer } = await getSigner({ key, skipConfirmation })); - } - const multiProvider = await getMultiProvider(registry, signer); + const multiProvider = await getMultiProvider(registry); return { registry, + requiresKey, chainMetadata: multiProvider.metadata, multiProvider, key, - signer, skipConfirmation: !!skipConfirmation, } as CommandContext; } diff --git a/typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts b/typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts new file mode 100644 index 000000000..eb9fa135a --- /dev/null +++ b/typescript/cli/src/context/strategies/chain/ChainResolverFactory.ts @@ -0,0 +1,34 @@ +import { CommandType } from '../../../commands/signCommands.js'; + +import { MultiChainResolver } from './MultiChainResolver.js'; +import { SingleChainResolver } from './SingleChainResolver.js'; +import { ChainResolver } from './types.js'; + +/** + * @class ChainResolverFactory + * @description Intercepts commands to determine the appropriate chain resolver strategy based on command type. + */ +export class ChainResolverFactory { + private static strategyMap: Map ChainResolver> = new Map([ + [CommandType.WARP_DEPLOY, () => MultiChainResolver.forWarpRouteConfig()], + [CommandType.WARP_SEND, () => MultiChainResolver.forOriginDestination()], + [CommandType.WARP_APPLY, () => MultiChainResolver.forWarpRouteConfig()], + [CommandType.WARP_READ, () => MultiChainResolver.forWarpCoreConfig()], + [CommandType.SEND_MESSAGE, () => MultiChainResolver.forOriginDestination()], + [CommandType.AGENT_KURTOSIS, () => MultiChainResolver.forAgentKurtosis()], + [CommandType.STATUS, () => MultiChainResolver.forOriginDestination()], + [CommandType.SUBMIT, () => MultiChainResolver.forStrategyConfig()], + [CommandType.RELAYER, () => MultiChainResolver.forRelayer()], + ]); + + /** + * @param argv - Command line arguments. + * @returns ChainResolver - The appropriate chain resolver strategy based on the command type. + */ + static getStrategy(argv: Record): ChainResolver { + const commandKey = `${argv._[0]}:${argv._[1] || ''}`.trim() as CommandType; + const createStrategy = + this.strategyMap.get(commandKey) || (() => new SingleChainResolver()); + return createStrategy(); + } +} diff --git a/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts b/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts new file mode 100644 index 000000000..c6d96b5dc --- /dev/null +++ b/typescript/cli/src/context/strategies/chain/MultiChainResolver.ts @@ -0,0 +1,200 @@ +import { ChainMap, ChainName } from '@hyperlane-xyz/sdk'; +import { assert } from '@hyperlane-xyz/utils'; + +import { DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH } from '../../../commands/options.js'; +import { readChainSubmissionStrategyConfig } from '../../../config/strategy.js'; +import { logRed } from '../../../logger.js'; +import { + extractChainsFromObj, + runMultiChainSelectionStep, + runSingleChainSelectionStep, +} from '../../../utils/chains.js'; +import { + isFile, + readYamlOrJson, + runFileSelectionStep, +} from '../../../utils/files.js'; +import { getWarpCoreConfigOrExit } from '../../../utils/warp.js'; + +import { ChainResolver } from './types.js'; + +enum ChainSelectionMode { + ORIGIN_DESTINATION, + AGENT_KURTOSIS, + WARP_CONFIG, + WARP_READ, + STRATEGY, + RELAYER, +} + +// This class could be broken down into multiple strategies + +/** + * @title MultiChainResolver + * @notice Resolves chains based on the specified selection mode. + */ +export class MultiChainResolver implements ChainResolver { + constructor(private mode: ChainSelectionMode) {} + + async resolveChains(argv: ChainMap): Promise { + switch (this.mode) { + case ChainSelectionMode.WARP_CONFIG: + return this.resolveWarpRouteConfigChains(argv); + case ChainSelectionMode.WARP_READ: + return this.resolveWarpCoreConfigChains(argv); + case ChainSelectionMode.AGENT_KURTOSIS: + return this.resolveAgentChains(argv); + case ChainSelectionMode.STRATEGY: + return this.resolveStrategyChains(argv); + case ChainSelectionMode.RELAYER: + return this.resolveRelayerChains(argv); + case ChainSelectionMode.ORIGIN_DESTINATION: + default: + return this.resolveOriginDestinationChains(argv); + } + } + + private async resolveWarpRouteConfigChains( + argv: Record, + ): Promise { + argv.config ||= DEFAULT_WARP_ROUTE_DEPLOYMENT_CONFIG_PATH; + argv.context.chains = await this.getWarpRouteConfigChains( + argv.config.trim(), + argv.skipConfirmation, + ); + return argv.context.chains; + } + + private async resolveWarpCoreConfigChains( + argv: Record, + ): Promise { + if (argv.symbol || argv.warp) { + const warpCoreConfig = await getWarpCoreConfigOrExit({ + context: argv.context, + warp: argv.warp, + symbol: argv.symbol, + }); + argv.context.warpCoreConfig = warpCoreConfig; + const chains = extractChainsFromObj(warpCoreConfig); + return chains; + } else if (argv.chain) { + return [argv.chain]; + } else { + throw new Error( + `Please specify either a symbol, chain and address or warp file`, + ); + } + } + + private async resolveAgentChains( + argv: Record, + ): Promise { + const { chainMetadata } = argv.context; + argv.origin = + argv.origin ?? + (await runSingleChainSelectionStep( + chainMetadata, + 'Select the origin chain', + )); + + if (!argv.targets) { + const selectedRelayChains = await runMultiChainSelectionStep({ + chainMetadata: chainMetadata, + message: 'Select chains to relay between', + requireNumber: 2, + }); + argv.targets = selectedRelayChains.join(','); + } + + return [argv.origin, ...argv.targets]; + } + + private async resolveOriginDestinationChains( + argv: Record, + ): Promise { + const { chainMetadata } = argv.context; + + argv.origin = + argv.origin ?? + (await runSingleChainSelectionStep( + chainMetadata, + 'Select the origin chain', + )); + + argv.destination = + argv.destination ?? + (await runSingleChainSelectionStep( + chainMetadata, + 'Select the destination chain', + )); + + return [argv.origin, argv.destination]; + } + + private async resolveStrategyChains( + argv: Record, + ): Promise { + const strategy = await readChainSubmissionStrategyConfig(argv.strategy); + return extractChainsFromObj(strategy); + } + + private async resolveRelayerChains( + argv: Record, + ): Promise { + return argv.chains.split(',').map((item: string) => item.trim()); + } + + private async getWarpRouteConfigChains( + configPath: string, + skipConfirmation: boolean, + ): Promise { + if (!configPath || !isFile(configPath)) { + assert(!skipConfirmation, 'Warp route deployment config is required'); + configPath = await runFileSelectionStep( + './configs', + 'Warp route deployment config', + 'warp', + ); + } else { + logRed(`Using warp route deployment config at ${configPath}`); + } + + // Alternative to readWarpRouteDeployConfig that doesn't use context for signer and zod validation + const warpRouteConfig = (await readYamlOrJson(configPath)) as Record< + string, + any + >; + + const chains = Object.keys(warpRouteConfig) as ChainName[]; + assert( + chains.length !== 0, + 'No chains found in warp route deployment config', + ); + + return chains; + } + + static forAgentKurtosis(): MultiChainResolver { + return new MultiChainResolver(ChainSelectionMode.AGENT_KURTOSIS); + } + + static forOriginDestination(): MultiChainResolver { + return new MultiChainResolver(ChainSelectionMode.ORIGIN_DESTINATION); + } + + static forRelayer(): MultiChainResolver { + return new MultiChainResolver(ChainSelectionMode.RELAYER); + } + + static forStrategyConfig(): MultiChainResolver { + return new MultiChainResolver(ChainSelectionMode.STRATEGY); + } + + static forWarpRouteConfig(): MultiChainResolver { + return new MultiChainResolver(ChainSelectionMode.WARP_CONFIG); + } + + static forWarpCoreConfig(): MultiChainResolver { + return new MultiChainResolver(ChainSelectionMode.WARP_READ); + } +} diff --git a/typescript/cli/src/context/strategies/chain/SingleChainResolver.ts b/typescript/cli/src/context/strategies/chain/SingleChainResolver.ts new file mode 100644 index 000000000..8dddaf3c4 --- /dev/null +++ b/typescript/cli/src/context/strategies/chain/SingleChainResolver.ts @@ -0,0 +1,25 @@ +import { ChainMap, ChainName } from '@hyperlane-xyz/sdk'; + +import { runSingleChainSelectionStep } from '../../../utils/chains.js'; + +import { ChainResolver } from './types.js'; + +/** + * @title SingleChainResolver + * @notice Strategy implementation for managing single-chain operations + * @dev Primarily used for operations like 'core:apply' and 'warp:read' + */ +export class SingleChainResolver implements ChainResolver { + /** + * @notice Determines the chain to be used for signing operations + * @dev Either uses the chain specified in argv or prompts for interactive selection + */ + async resolveChains(argv: ChainMap): Promise { + argv.chain ||= await runSingleChainSelectionStep( + argv.context.chainMetadata, + 'Select chain to connect:', + ); + + return [argv.chain]; // Explicitly return as single-item array + } +} diff --git a/typescript/cli/src/context/strategies/chain/types.ts b/typescript/cli/src/context/strategies/chain/types.ts new file mode 100644 index 000000000..9318bed8c --- /dev/null +++ b/typescript/cli/src/context/strategies/chain/types.ts @@ -0,0 +1,10 @@ +import { ChainMap, ChainName } from '@hyperlane-xyz/sdk'; + +export interface ChainResolver { + /** + * Determines the chains to be used for signing + * @param argv Command arguments + * @returns Array of chain names + */ + resolveChains(argv: ChainMap): Promise; +} diff --git a/typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts b/typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts new file mode 100644 index 000000000..b91242b42 --- /dev/null +++ b/typescript/cli/src/context/strategies/signer/BaseMultiProtocolSigner.ts @@ -0,0 +1,22 @@ +import { Signer } from 'ethers'; + +import { ChainName, ChainSubmissionStrategy } from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +export interface SignerConfig { + privateKey: string; + address?: Address; // For chains like StarkNet that require address + extraParams?: Record; // For any additional chain-specific params +} + +export interface IMultiProtocolSigner { + getSignerConfig(chain: ChainName): Promise | SignerConfig; + getSigner(config: SignerConfig): Signer; +} + +export abstract class BaseMultiProtocolSigner implements IMultiProtocolSigner { + constructor(protected config: ChainSubmissionStrategy) {} + + abstract getSignerConfig(chain: ChainName): Promise; + abstract getSigner(config: SignerConfig): Signer; +} diff --git a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts new file mode 100644 index 000000000..030f11b5f --- /dev/null +++ b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerFactory.ts @@ -0,0 +1,79 @@ +import { password } from '@inquirer/prompts'; +import { Signer, Wallet } from 'ethers'; + +import { + ChainName, + ChainSubmissionStrategy, + ChainTechnicalStack, + MultiProvider, + TxSubmitterType, +} from '@hyperlane-xyz/sdk'; +import { ProtocolType } from '@hyperlane-xyz/utils'; + +import { + BaseMultiProtocolSigner, + IMultiProtocolSigner, + SignerConfig, +} from './BaseMultiProtocolSigner.js'; + +export class MultiProtocolSignerFactory { + static getSignerStrategy( + chain: ChainName, + strategyConfig: ChainSubmissionStrategy, + multiProvider: MultiProvider, + ): IMultiProtocolSigner { + const { protocol, technicalStack } = multiProvider.getChainMetadata(chain); + + switch (protocol) { + case ProtocolType.Ethereum: + if (technicalStack === ChainTechnicalStack.ZkSync) + return new ZKSyncSignerStrategy(strategyConfig); + return new EthereumSignerStrategy(strategyConfig); + default: + throw new Error(`Unsupported protocol: ${protocol}`); + } + } +} + +class EthereumSignerStrategy extends BaseMultiProtocolSigner { + async getSignerConfig(chain: ChainName): Promise { + const submitter = this.config[chain]?.submitter as { + type: TxSubmitterType.JSON_RPC; + privateKey?: string; + }; + + const privateKey = + submitter?.privateKey ?? + (await password({ + message: `Please enter the private key for chain ${chain}`, + })); + + return { privateKey }; + } + + getSigner(config: SignerConfig): Signer { + return new Wallet(config.privateKey); + } +} + +// 99% overlap with EthereumSignerStrategy for the sake of keeping MultiProtocolSignerFactory clean +// TODO: import ZKSync signer +class ZKSyncSignerStrategy extends BaseMultiProtocolSigner { + async getSignerConfig(chain: ChainName): Promise { + const submitter = this.config[chain]?.submitter as { + privateKey?: string; + }; + + const privateKey = + submitter?.privateKey ?? + (await password({ + message: `Please enter the private key for chain ${chain}`, + })); + + return { privateKey }; + } + + getSigner(config: SignerConfig): Signer { + return new Wallet(config.privateKey); + } +} diff --git a/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts new file mode 100644 index 000000000..12f9c0f81 --- /dev/null +++ b/typescript/cli/src/context/strategies/signer/MultiProtocolSignerManager.ts @@ -0,0 +1,153 @@ +import { Signer } from 'ethers'; +import { Logger } from 'pino'; + +import { + ChainName, + ChainSubmissionStrategy, + MultiProvider, +} from '@hyperlane-xyz/sdk'; +import { assert, rootLogger } from '@hyperlane-xyz/utils'; + +import { ENV } from '../../../utils/env.js'; + +import { IMultiProtocolSigner } from './BaseMultiProtocolSigner.js'; +import { MultiProtocolSignerFactory } from './MultiProtocolSignerFactory.js'; + +export interface MultiProtocolSignerOptions { + logger?: Logger; + key?: string; +} + +/** + * @title MultiProtocolSignerManager + * @dev Context manager for signers across multiple protocols + */ +export class MultiProtocolSignerManager { + protected readonly signerStrategies: Map; + protected readonly signers: Map; + public readonly logger: Logger; + + constructor( + protected readonly submissionStrategy: ChainSubmissionStrategy, + protected readonly chains: ChainName[], + protected readonly multiProvider: MultiProvider, + protected readonly options: MultiProtocolSignerOptions = {}, + ) { + this.logger = + options?.logger || + rootLogger.child({ + module: 'MultiProtocolSignerManager', + }); + this.signerStrategies = new Map(); + this.signers = new Map(); + this.initializeStrategies(); + } + + /** + * @notice Sets up chain-specific signer strategies + */ + protected initializeStrategies(): void { + for (const chain of this.chains) { + const strategy = MultiProtocolSignerFactory.getSignerStrategy( + chain, + this.submissionStrategy, + this.multiProvider, + ); + this.signerStrategies.set(chain, strategy); + } + } + + /** + * @dev Configures signers for EVM chains in MultiProvider + */ + async getMultiProvider(): Promise { + for (const chain of this.chains) { + const signer = await this.initSigner(chain); + this.multiProvider.setSigner(chain, signer); + } + + return this.multiProvider; + } + + /** + * @notice Creates signer for specific chain + */ + async initSigner(chain: ChainName): Promise { + const { privateKey } = await this.resolveConfig(chain); + + const signerStrategy = this.signerStrategies.get(chain); + assert(signerStrategy, `No signer strategy found for chain ${chain}`); + + return signerStrategy.getSigner({ privateKey }); + } + + /** + * @notice Creates signers for all chains + */ + async initAllSigners(): Promise { + const signerConfigs = await this.resolveAllConfigs(); + + for (const { chain, privateKey } of signerConfigs) { + const signerStrategy = this.signerStrategies.get(chain); + if (signerStrategy) { + this.signers.set(chain, signerStrategy.getSigner({ privateKey })); + } + } + + return this.signers; + } + + /** + * @notice Resolves all chain configurations + */ + private async resolveAllConfigs(): Promise< + Array<{ chain: ChainName; privateKey: string }> + > { + return Promise.all(this.chains.map((chain) => this.resolveConfig(chain))); + } + + /** + * @notice Resolves single chain configuration + */ + private async resolveConfig( + chain: ChainName, + ): Promise<{ chain: ChainName; privateKey: string }> { + const signerStrategy = this.signerStrategies.get(chain); + assert(signerStrategy, `No signer strategy found for chain ${chain}`); + + let privateKey: string; + + if (this.options.key) { + this.logger.info( + `Using private key passed via CLI --key flag for chain ${chain}`, + ); + privateKey = this.options.key; + } else if (ENV.HYP_KEY) { + this.logger.info(`Using private key from .env for chain ${chain}`); + privateKey = ENV.HYP_KEY; + } else { + privateKey = await this.extractPrivateKey(chain, signerStrategy); + } + + return { chain, privateKey }; + } + + /** + * @notice Gets private key from strategy + */ + private async extractPrivateKey( + chain: ChainName, + signerStrategy: IMultiProtocolSigner, + ): Promise { + const strategyConfig = await signerStrategy.getSignerConfig(chain); + assert( + strategyConfig.privateKey, + `No private key found for chain ${chain}`, + ); + + this.logger.info( + `Extracting private key from strategy config/user prompt for chain ${chain}`, + ); + return strategyConfig.privateKey; + } +} diff --git a/typescript/cli/src/context/types.ts b/typescript/cli/src/context/types.ts index 6c3a17c5f..783797289 100644 --- a/typescript/cli/src/context/types.ts +++ b/typescript/cli/src/context/types.ts @@ -6,6 +6,7 @@ import type { ChainMap, ChainMetadata, MultiProvider, + WarpCoreConfig, } from '@hyperlane-xyz/sdk'; export interface ContextSettings { @@ -16,6 +17,7 @@ export interface ContextSettings { requiresKey?: boolean; disableProxy?: boolean; skipConfirmation?: boolean; + strategyPath?: string; } export interface CommandContext { @@ -25,6 +27,8 @@ export interface CommandContext { skipConfirmation: boolean; key?: string; signer?: ethers.Signer; + warpCoreConfig?: WarpCoreConfig; + strategyPath?: string; } export interface WriteCommandContext extends CommandContext { diff --git a/typescript/cli/src/deploy/agent.ts b/typescript/cli/src/deploy/agent.ts index ca490fc5f..a36955a3f 100644 --- a/typescript/cli/src/deploy/agent.ts +++ b/typescript/cli/src/deploy/agent.ts @@ -21,6 +21,7 @@ export async function runKurtosisAgentDeploy({ relayChains?: string; agentConfigurationPath?: string; }) { + // Future works: decide what to do with this, since its handled in MultiChainResolver - AGENT_KURTOSIS mode if (!originChain) { originChain = await runSingleChainSelectionStep( context.chainMetadata, diff --git a/typescript/cli/src/deploy/core.ts b/typescript/cli/src/deploy/core.ts index 9bbd7bcbd..afd586646 100644 --- a/typescript/cli/src/deploy/core.ts +++ b/typescript/cli/src/deploy/core.ts @@ -43,7 +43,6 @@ export async function runCoreDeploy(params: DeployParams) { let chain = params.chain; const { - signer, isDryRun, chainMetadata, dryRunChain, @@ -62,13 +61,14 @@ export async function runCoreDeploy(params: DeployParams) { 'Select chain to connect:', ); } - let apiKeys: ChainMap = {}; if (!skipConfirmation) apiKeys = await requestAndSaveApiKeys([chain], chainMetadata, registry); + const signer = multiProvider.getSigner(chain); + const deploymentParams: DeployParams = { - context, + context: { ...context, signer }, chain, config, }; diff --git a/typescript/cli/src/deploy/utils.ts b/typescript/cli/src/deploy/utils.ts index 125e7b1e7..f5ac01a17 100644 --- a/typescript/cli/src/deploy/utils.ts +++ b/typescript/cli/src/deploy/utils.ts @@ -41,7 +41,7 @@ export async function runPreflightChecksForChains({ chainsToGasCheck?: ChainName[]; }) { log('Running pre-flight checks for chains...'); - const { signer, multiProvider } = context; + const { multiProvider } = context; if (!chains?.length) throw new Error('Empty chain selection'); for (const chain of chains) { @@ -49,15 +49,14 @@ export async function runPreflightChecksForChains({ if (!metadata) throw new Error(`No chain config found for ${chain}`); if (metadata.protocol !== ProtocolType.Ethereum) throw new Error('Only Ethereum chains are supported for now'); + const signer = multiProvider.getSigner(chain); + assertSigner(signer); + logGreen(`✅ ${chain} signer is valid`); } logGreen('✅ Chains are valid'); - assertSigner(signer); - logGreen('✅ Signer is valid'); - await nativeBalancesAreSufficient( multiProvider, - signer, chainsToGasCheck ?? chains, minGas, ); @@ -70,8 +69,13 @@ export async function runDeployPlanStep({ context: WriteCommandContext; chain: ChainName; }) { - const { signer, chainMetadata: chainMetadataMap, skipConfirmation } = context; - const address = await signer.getAddress(); + const { + chainMetadata: chainMetadataMap, + multiProvider, + skipConfirmation, + } = context; + + const address = await multiProvider.getSigner(chain).getAddress(); logBlue('\nDeployment plan'); logGray('==============='); @@ -124,7 +128,7 @@ export function isZODISMConfig(filepath: string): boolean { export async function prepareDeploy( context: WriteCommandContext, - userAddress: Address, + userAddress: Address | null, chains: ChainName[], ): Promise> { const { multiProvider, isDryRun } = context; @@ -134,7 +138,9 @@ export async function prepareDeploy( const provider = isDryRun ? getLocalProvider(ENV.ANVIL_IP_ADDR, ENV.ANVIL_PORT) : multiProvider.getProvider(chain); - const currentBalance = await provider.getBalance(userAddress); + const address = + userAddress ?? (await multiProvider.getSigner(chain).getAddress()); + const currentBalance = await provider.getBalance(address); initialBalances[chain] = currentBalance; }), ); @@ -145,7 +151,7 @@ export async function completeDeploy( context: WriteCommandContext, command: string, initialBalances: Record, - userAddress: Address, + userAddress: Address | null, chains: ChainName[], ) { const { multiProvider, isDryRun } = context; @@ -154,7 +160,9 @@ export async function completeDeploy( const provider = isDryRun ? getLocalProvider(ENV.ANVIL_IP_ADDR, ENV.ANVIL_PORT) : multiProvider.getProvider(chain); - const currentBalance = await provider.getBalance(userAddress); + const address = + userAddress ?? (await multiProvider.getSigner(chain).getAddress()); + const currentBalance = await provider.getBalance(address); const balanceDelta = initialBalances[chain].sub(currentBalance); if (isDryRun && balanceDelta.lt(0)) break; logPink( diff --git a/typescript/cli/src/deploy/warp.ts b/typescript/cli/src/deploy/warp.ts index 639d5d5c8..a7827b5dc 100644 --- a/typescript/cli/src/deploy/warp.ts +++ b/typescript/cli/src/deploy/warp.ts @@ -100,7 +100,7 @@ export async function runWarpRouteDeploy({ context: WriteCommandContext; warpRouteDeploymentConfigPath?: string; }) { - const { signer, skipConfirmation, chainMetadata, registry } = context; + const { skipConfirmation, chainMetadata, registry } = context; if ( !warpRouteDeploymentConfigPath || @@ -147,13 +147,8 @@ export async function runWarpRouteDeploy({ minGas: MINIMUM_WARP_DEPLOY_GAS, }); - const userAddress = await signer.getAddress(); + const initialBalances = await prepareDeploy(context, null, ethereumChains); - const initialBalances = await prepareDeploy( - context, - userAddress, - ethereumChains, - ); const deployedContracts = await executeDeploy(deploymentParams, apiKeys); const warpCoreConfig = await getWarpCoreConfig( @@ -163,13 +158,7 @@ export async function runWarpRouteDeploy({ await writeDeploymentArtifacts(warpCoreConfig, context); - await completeDeploy( - context, - 'warp', - initialBalances, - userAddress, - ethereumChains, - ); + await completeDeploy(context, 'warp', initialBalances, null, ethereumChains!); } async function runDeployPlanStep({ context, warpDeployConfig }: DeployParams) { diff --git a/typescript/cli/src/read/warp.ts b/typescript/cli/src/read/warp.ts index bd5d01e95..169593c5e 100644 --- a/typescript/cli/src/read/warp.ts +++ b/typescript/cli/src/read/warp.ts @@ -34,11 +34,13 @@ export async function runWarpRouteRead({ let addresses: ChainMap; if (symbol || warp) { - const warpCoreConfig = await getWarpCoreConfigOrExit({ - context, - warp, - symbol, - }); + const warpCoreConfig = + context.warpCoreConfig ?? // this case is be handled by MultiChainHandler.forWarpCoreConfig() interceptor + (await getWarpCoreConfigOrExit({ + context, + warp, + symbol, + })); // TODO: merge with XERC20TokenAdapter and WarpRouteReader const xerc20Limits = await Promise.all( diff --git a/typescript/cli/src/send/transfer.ts b/typescript/cli/src/send/transfer.ts index a89eb6aa9..2929b09c6 100644 --- a/typescript/cli/src/send/transfer.ts +++ b/typescript/cli/src/send/transfer.ts @@ -40,8 +40,8 @@ export async function sendTestTransfer({ }: { context: WriteCommandContext; warpCoreConfig: WarpCoreConfig; - origin?: ChainName; - destination?: ChainName; + origin?: ChainName; // resolved in signerMiddleware + destination?: ChainName; // resolved in signerMiddleware amount: string; recipient?: string; timeoutSec: number; @@ -106,10 +106,15 @@ async function executeDelivery({ skipWaitForDelivery: boolean; selfRelay?: boolean; }) { - const { signer, multiProvider, registry } = context; + const { multiProvider, registry } = context; + const signer = multiProvider.getSigner(origin); + const recipientSigner = multiProvider.getSigner(destination); + + const recipientAddress = await recipientSigner.getAddress(); const signerAddress = await signer.getAddress(); - recipient ||= signerAddress; + + recipient ||= recipientAddress; const chainAddresses = await registry.getAddresses(); @@ -136,12 +141,11 @@ async function executeDelivery({ token = warpCore.findToken(origin, routerAddress)!; } - const senderAddress = await signer.getAddress(); const errors = await warpCore.validateTransfer({ originTokenAmount: token.amount(amount), destination, - recipient: recipient ?? senderAddress, - sender: senderAddress, + recipient, + sender: signerAddress, }); if (errors) { logRed('Error validating transfer', JSON.stringify(errors)); @@ -152,8 +156,8 @@ async function executeDelivery({ const transferTxs = await warpCore.getTransferRemoteTxs({ originTokenAmount: new TokenAmount(amount, token), destination, - sender: senderAddress, - recipient: recipient ?? senderAddress, + sender: signerAddress, + recipient, }); const txReceipts = []; @@ -172,7 +176,7 @@ async function executeDelivery({ const parsed = parseWarpRouteMessage(message.parsed.body); logBlue( - `Sent transfer from sender (${senderAddress}) on ${origin} to recipient (${recipient}) on ${destination}.`, + `Sent transfer from sender (${signerAddress}) on ${origin} to recipient (${recipient}) on ${destination}.`, ); logBlue(`Message ID: ${message.id}`); log(`Message:\n${indentYamlOrJson(yamlStringify(message, null, 2), 4)}`); diff --git a/typescript/cli/src/tests/commands/helpers.ts b/typescript/cli/src/tests/commands/helpers.ts index 8cb6be027..8d24cce50 100644 --- a/typescript/cli/src/tests/commands/helpers.ts +++ b/typescript/cli/src/tests/commands/helpers.ts @@ -1,3 +1,4 @@ +import { ethers } from 'ethers'; import { $ } from 'zx'; import { ERC20Test__factory, ERC4626Test__factory } from '@hyperlane-xyz/core'; @@ -142,6 +143,9 @@ export async function deployToken(privateKey: string, chain: string) { key: privateKey, }); + // Future works: make signer compatible with protocol/chain stack + multiProvider.setSigner(chain, new ethers.Wallet(privateKey)); + const token = await new ERC20Test__factory( multiProvider.getSigner(chain), ).deploy('token', 'token', '100000000000000000000', 18); @@ -161,6 +165,9 @@ export async function deploy4626Vault( key: privateKey, }); + // Future works: make signer compatible with protocol/chain stack + multiProvider.setSigner(chain, new ethers.Wallet(privateKey)); + const vault = await new ERC4626Test__factory( multiProvider.getSigner(chain), ).deploy(tokenAddress, 'VAULT', 'VAULT'); diff --git a/typescript/cli/src/utils/balances.ts b/typescript/cli/src/utils/balances.ts index 4536353e5..2a6e6fcb8 100644 --- a/typescript/cli/src/utils/balances.ts +++ b/typescript/cli/src/utils/balances.ts @@ -8,12 +8,9 @@ import { logGray, logGreen, logRed } from '../logger.js'; export async function nativeBalancesAreSufficient( multiProvider: MultiProvider, - signer: ethers.Signer, chains: ChainName[], minGas: string, ) { - const address = await signer.getAddress(); - const sufficientBalances: boolean[] = []; for (const chain of chains) { // Only Ethereum chains are supported @@ -21,7 +18,7 @@ export async function nativeBalancesAreSufficient( logGray(`Skipping balance check for non-EVM chain: ${chain}`); continue; } - + const address = multiProvider.getSigner(chain).getAddress(); const provider = multiProvider.getProvider(chain); const gasPrice = await provider.getGasPrice(); const minBalanceWei = gasPrice.mul(minGas).toString(); diff --git a/typescript/cli/src/utils/chains.ts b/typescript/cli/src/utils/chains.ts index add11203d..7e2eaccd0 100644 --- a/typescript/cli/src/utils/chains.ts +++ b/typescript/cli/src/utils/chains.ts @@ -171,3 +171,36 @@ function handleNewChain(chainNames: string[]) { process.exit(0); } } + +/** + * @notice Extracts chain names from a nested configuration object + * @param config Object to search for chain names + * @return Array of discovered chain names + */ +export function extractChainsFromObj(config: Record): string[] { + const chains: string[] = []; + + // Recursively search for chain/chainName fields + function findChainFields(obj: any) { + if (obj === null || typeof obj !== 'object') return; + + if (Array.isArray(obj)) { + obj.forEach((item) => findChainFields(item)); + return; + } + + if ('chain' in obj) { + chains.push(obj.chain); + } + + if ('chainName' in obj) { + chains.push(obj.chainName); + } + + // Recursively search in all nested values + Object.values(obj).forEach((value) => findChainFields(value)); + } + + findChainFields(config); + return chains; +} diff --git a/typescript/cli/src/utils/output.ts b/typescript/cli/src/utils/output.ts index 442b8a090..2e1acfdf4 100644 --- a/typescript/cli/src/utils/output.ts +++ b/typescript/cli/src/utils/output.ts @@ -54,3 +54,50 @@ export function formatYamlViolationsOutput( return highlightedLines.join('\n'); } + +/** + * @notice Masks sensitive key with dots + * @param key Sensitive key to mask + * @return Masked key + */ +export function maskSensitiveKey(key: string): string { + if (!key) return key; + const middle = '•'.repeat(key.length); + return `${middle}`; +} + +const SENSITIVE_PATTERNS = [ + 'privatekey', + 'key', + 'secret', + 'secretkey', + 'password', +]; + +const isSensitiveKey = (key: string) => { + const lowerKey = key.toLowerCase(); + return SENSITIVE_PATTERNS.some((pattern) => lowerKey.includes(pattern)); +}; + +/** + * @notice Recursively masks sensitive data in objects + * @param obj Object with potential sensitive data + * @return Object with masked sensitive data + */ +export function maskSensitiveData(obj: any): any { + if (!obj) return obj; + + if (typeof obj === 'object') { + const masked = { ...obj }; + for (const [key, value] of Object.entries(masked)) { + if (isSensitiveKey(key) && typeof value === 'string') { + masked[key] = maskSensitiveKey(value); + } else if (typeof value === 'object') { + masked[key] = maskSensitiveData(value); + } + } + return masked; + } + + return obj; +} diff --git a/typescript/sdk/src/providers/transactions/submitter/ethersV5/schemas.ts b/typescript/sdk/src/providers/transactions/submitter/ethersV5/schemas.ts index 1586ec6b2..cef774e73 100644 --- a/typescript/sdk/src/providers/transactions/submitter/ethersV5/schemas.ts +++ b/typescript/sdk/src/providers/transactions/submitter/ethersV5/schemas.ts @@ -15,6 +15,8 @@ export const EV5GnosisSafeTxBuilderPropsSchema = z.object({ export const EV5JsonRpcTxSubmitterPropsSchema = z.object({ chain: ZChainName, + userAddress: ZHash.optional(), + privateKey: ZHash.optional(), }); export const EV5ImpersonatedAccountTxSubmitterPropsSchema = diff --git a/typescript/utils/src/addresses.ts b/typescript/utils/src/addresses.ts index 29a35b6b8..a244c810b 100644 --- a/typescript/utils/src/addresses.ts +++ b/typescript/utils/src/addresses.ts @@ -1,6 +1,6 @@ import { fromBech32, normalizeBech32, toBech32 } from '@cosmjs/encoding'; import { PublicKey } from '@solana/web3.js'; -import { utils as ethersUtils } from 'ethers'; +import { Wallet, utils as ethersUtils } from 'ethers'; import { isNullish } from './typeof.js'; import { Address, HexString, ProtocolType } from './types.js'; @@ -380,3 +380,11 @@ export function ensure0x(hexstr: string) { export function strip0x(hexstr: string) { return hexstr.startsWith('0x') ? hexstr.slice(2) : hexstr; } + +export function isPrivateKeyEvm(privateKey: string): boolean { + try { + return new Wallet(privateKey).privateKey === privateKey; + } catch { + throw new Error('Provided Private Key is not EVM compatible!'); + } +} diff --git a/typescript/utils/src/index.ts b/typescript/utils/src/index.ts index e665e9ce8..3c4c413f7 100644 --- a/typescript/utils/src/index.ts +++ b/typescript/utils/src/index.ts @@ -26,6 +26,7 @@ export { isValidAddressCosmos, isValidAddressEvm, isValidAddressSealevel, + isPrivateKeyEvm, isValidTransactionHash, isValidTransactionHashCosmos, isValidTransactionHashEvm, From 4c74affecf569d656b401ec3bcf458694b911fd6 Mon Sep 17 00:00:00 2001 From: J M Rossy Date: Wed, 27 Nov 2024 15:13:53 -0500 Subject: [PATCH 13/18] fix: Correct typo in utils changelog (#4908) --- typescript/utils/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typescript/utils/CHANGELOG.md b/typescript/utils/CHANGELOG.md index 325b17be9..62f8c8939 100644 --- a/typescript/utils/CHANGELOG.md +++ b/typescript/utils/CHANGELOG.md @@ -4,7 +4,7 @@ ### Minor Changes -- fa6d5f5c6: Add toUpperCamelCase and deepFind functionss +- fa6d5f5c6: Add toUpperCamelCase and deepFind functions ## 7.1.0 From 2f77bb0601855dc29f25f6d31ba0970fa09671ac Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Thu, 28 Nov 2024 10:28:40 +0000 Subject: [PATCH 14/18] feat: add Everclear relayer app context (#4912) ### Description Tracks messages from the hub/spoke contracts here https://docs.everclear.org/resources/contracts/mainnet (HubGateway (Everclear hub) <> EverclearSpoke (all other spoke chains)). Went with sender tracking to help us flag if there are other new spokes that pop up ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .../config/environments/mainnet3/agent.ts | 7 +++++++ .../everclear-sender-addresses.json | 20 +++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 typescript/infra/config/environments/mainnet3/misc-artifacts/everclear-sender-addresses.json diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 46ba1a4d7..5b5665ad6 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -22,6 +22,7 @@ import { getDomainId } from '../../registry.js'; import { environment } from './chains.js'; import { helloWorld } from './helloworld.js'; import aaveSenderAddresses from './misc-artifacts/aave-sender-addresses.json'; +import everclearSenderAddresses from './misc-artifacts/everclear-sender-addresses.json'; import merklyEthAddresses from './misc-artifacts/merkly-eth-addresses.json'; import merklyNftAddresses from './misc-artifacts/merkly-eth-addresses.json'; import merklyErc20Addresses from './misc-artifacts/merkly-eth-addresses.json'; @@ -413,6 +414,12 @@ const metricAppContextsGetter = (): MetricAppContext[] => { name: 'aave', matchingList: senderMatchingList(aaveSenderAddresses), }, + { + // https://docs.everclear.org/resources/contracts/mainnet + // Messages between HubGateway (Everclear hub) <> EverclearSpoke (all other spoke chains) + name: 'everclear_gateway', + matchingList: senderMatchingList(everclearSenderAddresses), + }, ]; }; diff --git a/typescript/infra/config/environments/mainnet3/misc-artifacts/everclear-sender-addresses.json b/typescript/infra/config/environments/mainnet3/misc-artifacts/everclear-sender-addresses.json new file mode 100644 index 000000000..10ccf021d --- /dev/null +++ b/typescript/infra/config/environments/mainnet3/misc-artifacts/everclear-sender-addresses.json @@ -0,0 +1,20 @@ +{ + "everclear": { + "sender": "0xEFfAB7cCEBF63FbEFB4884964b12259d4374FaAa" + }, + "ethereum": { + "sender": "0x9ADA72CCbAfe94248aFaDE6B604D1bEAacc899A7" + }, + "optimism": { + "sender": "0x9ADA72CCbAfe94248aFaDE6B604D1bEAacc899A7" + }, + "bsc": { + "sender": "0x9ADA72CCbAfe94248aFaDE6B604D1bEAacc899A7" + }, + "base": { + "sender": "0x9ADA72CCbAfe94248aFaDE6B604D1bEAacc899A7" + }, + "arbitrum": { + "sender": "0x9ADA72CCbAfe94248aFaDE6B604D1bEAacc899A7" + } +} From ef33b5b6b246b9d8de8ea1068592c299e219f904 Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Thu, 28 Nov 2024 11:30:29 +0000 Subject: [PATCH 15/18] feat: script to check versions of default validators (#4774) ### Description feat: script to check versions of default validators also prints age of the commit for mismatched validators ### Drive-by changes update s3 validator to return `metadata_latest.json` ### Related issues na ### Backward compatibility ye ### Testing manual --------- Signed-off-by: pbio <10051819+paulbalaji@users.noreply.github.com> --- .../scripts/check/check-validator-version.ts | 213 ++++++++++++++++++ typescript/sdk/src/aws/validator.ts | 11 + typescript/utils/src/index.ts | 1 + typescript/utils/src/types.ts | 4 + 4 files changed, 229 insertions(+) create mode 100644 typescript/infra/scripts/check/check-validator-version.ts diff --git a/typescript/infra/scripts/check/check-validator-version.ts b/typescript/infra/scripts/check/check-validator-version.ts new file mode 100644 index 000000000..1bf58d8bd --- /dev/null +++ b/typescript/infra/scripts/check/check-validator-version.ts @@ -0,0 +1,213 @@ +import { execSync } from 'child_process'; + +import { ValidatorAnnounce__factory } from '@hyperlane-xyz/core'; +import { + ChainName, + S3Validator, + defaultMultisigConfigs, +} from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + +import { isEthereumProtocolChain } from '../../src/utils/utils.js'; +import { getArgs, withChains } from '../agent-utils.js'; +import { getEnvironmentConfig, getHyperlaneCore } from '../core-utils.js'; + +// prettier-ignore +const acceptableValidatorVersions: Record = { + // Aug 27 deploy + '72d498fa984750b9137c1211fef6c80a3e594ce7': 'aug-27-batch', + // Sep 9 deploy + 'd71dd4e5ed7eb69cc4041813ef444e37d881cdda': 'sep-9-batch', + // Oct 27 deploy + '45399a314cec85723bbb5d2360531c96a3aa261e': 'oct-27-batch', + // Nov 7 deploy + '75d62ae7bbdeb77730c6d343c4fc1df97a08abe4': 'nov-7-batch', + // Nov 21 deploy + 'e70431a85965d8d21681e6f4856ed3ac9bd2ba27': 'nov-21-batch', + // Nov 21 bsquared deploy + 'd834d8147628584acd78a81e344bff76472d707e': 'nov-21-bsquared', + // Rolled out only to AW infra before 1.0.0, just 1 commit behind 1.0.0 + 'a64af8be9a76120d0cfc727bb70660fa07e70cce': 'pre-1.0.0', + // 1.0.0 + 'ffbe1dd82e2452dbc111b6fb469a34fb870da8f1': '1.0.0', + // Tessellated's Own Build + '79453fcd972a1e62ba8ee604f0a4999c7b938582': 'tesselated-special-build', +}; + +type ValidatorInfo = { + chain: ChainName; + validator: Address; + alias: string; + version: string; + age?: string; +}; + +function sortValidatorInfo(a: ValidatorInfo, b: ValidatorInfo) { + // First sort by alias + if (a.alias && !b.alias) return -1; + if (!a.alias && b.alias) return 1; + if (a.alias && b.alias) { + const aliasCompare = a.alias.localeCompare(b.alias); + if (aliasCompare !== 0) return aliasCompare; + } + // Then sort by validator address + return a.chain.localeCompare(b.chain); +} + +function getCommitDate(sha: string): string | undefined { + try { + // Try to fetch the commit first if we don't have it + try { + execSync(`git fetch origin ${sha}`, { stdio: 'ignore' }); + } catch { + // Ignore fetch errors - commit might be local or unreachable + } + + // Use %cd for date and customize format with --date=format + const date = execSync( + `git show -s --date=format:'%Y-%m-%d %H:%M UTC' --format=%cd ${sha}`, + { encoding: 'utf-8' }, + ).trim(); + return date; + } catch { + return undefined; + } +} + +function getCommitAge(sha: string): string | undefined { + const commitDateString = getCommitDate(sha); + if (!commitDateString) { + return undefined; + } + + const commitDate = new Date(commitDateString); + if (isNaN(commitDate.getTime())) { + return undefined; + } + + const msToNow = Date.now() - commitDate.getTime(); + const days = Math.floor(msToNow / (1000 * 60 * 60 * 24)); + const hours = Math.floor( + (msToNow % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60), + ); + + const dayText = days === 1 ? 'day' : 'days'; + const hourText = hours === 1 ? 'hour' : 'hours'; + return days > 0 + ? `${days} ${dayText} ${hours} ${hourText} old` + : `${hours} ${hourText} old`; +} + +async function main() { + const { environment, chains, showUpdated } = await withChains(getArgs()) + .describe( + 'show-updated', + 'If enabled, prints a table with all updated validators', + ) + .boolean('show-updated') + .default('show-updated', false).argv; + + const config = getEnvironmentConfig(environment); + const { core } = await getHyperlaneCore(environment); + + const targetNetworks = ( + chains && chains.length > 0 ? chains : config.supportedChainNames + ).filter(isEthereumProtocolChain); + + const mismatchedValidators: ValidatorInfo[] = []; + const upgradedValidators: ValidatorInfo[] = []; + + // Manually add validator announce for OG Lumia chain deployment + const lumiaValidatorAnnounce = ValidatorAnnounce__factory.connect( + '0x989B7307d266151BE763935C856493D968b2affF', + core.multiProvider.getProvider('lumia'), + ); + + await Promise.all( + targetNetworks.map(async (chain) => { + const validatorAnnounce = + chain === 'lumia' + ? lumiaValidatorAnnounce + : core.getContracts(chain).validatorAnnounce; + const expectedValidators = defaultMultisigConfigs[chain].validators || []; + const storageLocations = + await validatorAnnounce.getAnnouncedStorageLocations( + expectedValidators.map((v) => v.address), + ); + + // For each validator on this chain + for (let i = 0; i < expectedValidators.length; i++) { + const { address: validator, alias } = expectedValidators[i]; + const location = storageLocations[i][0]; + + // Get metadata from each storage location + try { + const validatorInstance = await S3Validator.fromStorageLocation( + location, + ); + + const metadata = await validatorInstance.getMetadata(); + const gitSha = metadata?.git_sha; + + if (Object.keys(acceptableValidatorVersions).includes(gitSha)) { + upgradedValidators.push({ + chain, + validator, + alias, + version: acceptableValidatorVersions[gitSha], + }); + } else { + mismatchedValidators.push({ + chain, + validator, + alias, + version: gitSha ? gitSha.slice(0, 7) : 'missing', + age: getCommitAge(gitSha), + }); + } + } catch (error) { + console.warn( + `Error getting metadata for validator ${validator} on chain ${chain}: ${error}`, + ); + mismatchedValidators.push({ + chain, + validator, + alias, + version: ` ??? `, + }); + } + } + }), + ); + + const showUpdatedValidators = () => { + if (showUpdated) { + console.log( + `\n✅ ${upgradedValidators.length} Validators with expected git SHA:`, + ); + console.table(upgradedValidators.sort(sortValidatorInfo)); + } + }; + + if (mismatchedValidators.length > 0) { + console.log( + 'Expecting validators to have one of the following git SHA:\n' + + Object.entries(acceptableValidatorVersions) + .map(([key, value]) => ` • ${key} (${value})`) + .join('\n'), + ); + console.log( + `\n⚠️ ${mismatchedValidators.length} Validators with mismatched git SHA:`, + ); + console.table(mismatchedValidators.sort(sortValidatorInfo)); + + showUpdatedValidators(); + process.exit(1); + } + + showUpdatedValidators(); + console.log('\n✅ All validators running expected git SHA!'); + process.exit(0); +} + +main().catch(console.error); diff --git a/typescript/sdk/src/aws/validator.ts b/typescript/sdk/src/aws/validator.ts index 32ae9613c..b1a385549 100644 --- a/typescript/sdk/src/aws/validator.ts +++ b/typescript/sdk/src/aws/validator.ts @@ -4,6 +4,7 @@ import { S3Announcement, S3CheckpointWithId, ValidatorConfig, + ValidatorMetadata, isS3CheckpointWithId, } from '@hyperlane-xyz/utils'; @@ -13,6 +14,7 @@ const checkpointWithMessageIdKey = (checkpointIndex: number) => `checkpoint_${checkpointIndex}_with_id.json`; const LATEST_KEY = 'checkpoint_latest_index.json'; const ANNOUNCEMENT_KEY = 'announcement.json'; +const METADATA_KEY = 'metadata_latest.json'; const LOCATION_PREFIX = 's3://'; /** @@ -76,6 +78,15 @@ export class S3Validator extends BaseValidator { return resp.data; } + async getMetadata(): Promise { + const resp = await this.s3Bucket.getS3Obj(METADATA_KEY); + if (!resp) { + throw new Error(`No metadata found for ${this.config.localDomain}`); + } + + return resp.data; + } + async getCheckpoint(index: number): Promise { const key = checkpointWithMessageIdKey(index); const s3Object = await this.s3Bucket.getS3Obj(key); diff --git a/typescript/utils/src/index.ts b/typescript/utils/src/index.ts index 3c4c413f7..f4bd9779c 100644 --- a/typescript/utils/src/index.ts +++ b/typescript/utils/src/index.ts @@ -171,6 +171,7 @@ export { S3CheckpointWithId, SignatureLike, TokenCaip19Id, + ValidatorMetadata, WithAddress, } from './types.js'; export { isHttpsUrl, isRelativeUrl, isUrl } from './url.js'; diff --git a/typescript/utils/src/types.ts b/typescript/utils/src/types.ts index c2a3a1fcf..c0b7ddee6 100644 --- a/typescript/utils/src/types.ts +++ b/typescript/utils/src/types.ts @@ -116,3 +116,7 @@ export type ParsedLegacyMultisigIsmMetadata = { export type Annotated = T & { annotation?: string; }; + +export type ValidatorMetadata = { + git_sha: string; +}; From 24784af958a71546d7988c7c7deb00ce9614a56c Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Thu, 28 Nov 2024 12:06:51 +0000 Subject: [PATCH 16/18] feat: add GcpValidator using GcpStorageWrapper (#4878) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description Introduce GcpValidator for retrieving announcements, checkpoints and metadata for a Validator posting to a GCP bucket. Uses GcpStorageWrapper for bucket operations. ### Drive-by changes update `check-validator-version` to read gcp buckets too ### Related issues ### Backward compatibility yes ### Testing manual before: ``` Error getting metadata for validator 0x14ADB9e3598c395Fe3290f3ba706C3816Aa78F59 on chain flowmainnet: Error: Unable to parse location gs://ff-hyperlane-validator-1/gcsAnnouncementKey │ 18 │ 'flowmainnet' │ '0x14ADB9e3598c395Fe3290f3ba706C3816Aa78F59' │ 'flow foundation' │ 'UNKNOWN' │ ``` after: ``` │ 22 │ 'flowmainnet' │ '0x14ADB9e3598c395Fe3290f3ba706C3816Aa78F59' │ 'flow foundation' │ 'nov-7-batch' │ ``` --- .changeset/polite-beds-begin.md | 5 + .../scripts/check/check-validator-version.ts | 10 +- typescript/sdk/package.json | 1 + typescript/sdk/src/aws/validator.ts | 8 +- typescript/sdk/src/gcp/storage.ts | 91 ++++++++++++ typescript/sdk/src/gcp/validator.ts | 132 ++++++++++++++++++ typescript/sdk/src/index.ts | 2 + typescript/sdk/src/utils/validator.ts | 12 ++ yarn.lock | 106 +++++++++++++- 9 files changed, 355 insertions(+), 12 deletions(-) create mode 100644 .changeset/polite-beds-begin.md create mode 100644 typescript/sdk/src/gcp/storage.ts create mode 100644 typescript/sdk/src/gcp/validator.ts create mode 100644 typescript/sdk/src/utils/validator.ts diff --git a/.changeset/polite-beds-begin.md b/.changeset/polite-beds-begin.md new file mode 100644 index 000000000..b710426be --- /dev/null +++ b/.changeset/polite-beds-begin.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': minor +--- + +Introduce GcpValidator for retrieving announcements, checkpoints and metadata for a Validator posting to a GCP bucket. Uses GcpStorageWrapper for bucket operations. diff --git a/typescript/infra/scripts/check/check-validator-version.ts b/typescript/infra/scripts/check/check-validator-version.ts index 1bf58d8bd..e997a1664 100644 --- a/typescript/infra/scripts/check/check-validator-version.ts +++ b/typescript/infra/scripts/check/check-validator-version.ts @@ -3,8 +3,8 @@ import { execSync } from 'child_process'; import { ValidatorAnnounce__factory } from '@hyperlane-xyz/core'; import { ChainName, - S3Validator, defaultMultisigConfigs, + getValidatorFromStorageLocation, } from '@hyperlane-xyz/sdk'; import { Address } from '@hyperlane-xyz/utils'; @@ -31,7 +31,7 @@ const acceptableValidatorVersions: Record = { // 1.0.0 'ffbe1dd82e2452dbc111b6fb469a34fb870da8f1': '1.0.0', // Tessellated's Own Build - '79453fcd972a1e62ba8ee604f0a4999c7b938582': 'tesselated-special-build', + '9b855686d3e2b3d6b81238ce51a576ff5e0f770f': 'tesselated-special-build', }; type ValidatorInfo = { @@ -142,7 +142,7 @@ async function main() { // Get metadata from each storage location try { - const validatorInstance = await S3Validator.fromStorageLocation( + const validatorInstance = await getValidatorFromStorageLocation( location, ); @@ -167,7 +167,7 @@ async function main() { } } catch (error) { console.warn( - `Error getting metadata for validator ${validator} on chain ${chain}: ${error}`, + `Error getting metadata for ${validator} on chain ${chain}: ${error}`, ); mismatchedValidators.push({ chain, @@ -191,7 +191,7 @@ async function main() { if (mismatchedValidators.length > 0) { console.log( - 'Expecting validators to have one of the following git SHA:\n' + + '\nExpecting validators to have one of the following git SHA:\n' + Object.entries(acceptableValidatorVersions) .map(([key, value]) => ` • ${key} (${value})`) .join('\n'), diff --git a/typescript/sdk/package.json b/typescript/sdk/package.json index 7104d6b42..98c9679bd 100644 --- a/typescript/sdk/package.json +++ b/typescript/sdk/package.json @@ -8,6 +8,7 @@ "@chain-registry/types": "^0.50.14", "@cosmjs/cosmwasm-stargate": "^0.32.4", "@cosmjs/stargate": "^0.32.4", + "@google-cloud/storage": "7.14.0", "@hyperlane-xyz/core": "5.8.2", "@hyperlane-xyz/utils": "7.2.0", "@safe-global/api-kit": "1.3.0", diff --git a/typescript/sdk/src/aws/validator.ts b/typescript/sdk/src/aws/validator.ts index b1a385549..008584c3e 100644 --- a/typescript/sdk/src/aws/validator.ts +++ b/typescript/sdk/src/aws/validator.ts @@ -15,7 +15,7 @@ const checkpointWithMessageIdKey = (checkpointIndex: number) => const LATEST_KEY = 'checkpoint_latest_index.json'; const ANNOUNCEMENT_KEY = 'announcement.json'; const METADATA_KEY = 'metadata_latest.json'; -const LOCATION_PREFIX = 's3://'; +export const S3_LOCATION_PREFIX = 's3://'; /** * Extension of BaseValidator that includes AWS S3 utilities. @@ -34,8 +34,8 @@ export class S3Validator extends BaseValidator { static async fromStorageLocation( storageLocation: string, ): Promise { - if (storageLocation.startsWith(LOCATION_PREFIX)) { - const suffix = storageLocation.slice(LOCATION_PREFIX.length); + if (storageLocation.startsWith(S3_LOCATION_PREFIX)) { + const suffix = storageLocation.slice(S3_LOCATION_PREFIX.length); const pieces = suffix.split('/'); if (pieces.length >= 2) { const s3Config = { @@ -112,7 +112,7 @@ export class S3Validator extends BaseValidator { } storageLocation(): string { - return `${LOCATION_PREFIX}/${this.s3Bucket.config.bucket}/${this.s3Bucket.config.region}`; + return `${S3_LOCATION_PREFIX}/${this.s3Bucket.config.bucket}/${this.s3Bucket.config.region}`; } getLatestCheckpointUrl(): string { diff --git a/typescript/sdk/src/gcp/storage.ts b/typescript/sdk/src/gcp/storage.ts new file mode 100644 index 000000000..96c2a3fd7 --- /dev/null +++ b/typescript/sdk/src/gcp/storage.ts @@ -0,0 +1,91 @@ +import { Storage } from '@google-cloud/storage'; + +export const GCS_BUCKET_REGEX = + /^(?:(?:https?:\/\/)?([^/]+)\.storage\.googleapis\.com\/?|gs:\/\/([^/]+))$/; + +export interface StorageReceipt { + data: T; + modified: Date; +} + +export interface StorageConfig { + bucket: string; + folder?: string; + caching?: boolean; + // Optional credentials config + projectId?: string; + keyFilename?: string; +} + +export class GcpStorageWrapper { + private readonly client: Storage; + private readonly bucket: string; + private cache: Record> | undefined; + + static fromBucketUrl(bucketUrl: string): GcpStorageWrapper { + const match = bucketUrl.match(GCS_BUCKET_REGEX); + if (!match) throw new Error('Could not parse bucket url'); + return new GcpStorageWrapper({ + bucket: match[1], + caching: true, + }); + } + + constructor(readonly config: StorageConfig) { + this.client = new Storage({ + projectId: config.projectId, + keyFilename: config.keyFilename, + }); + this.bucket = config.bucket; + if (config.caching) { + this.cache = {}; + } + } + + formatKey(key: string): string { + return this.config.folder ? `${this.config.folder}/${key}` : key; + } + + async getObject(key: string): Promise | undefined> { + const Key = this.formatKey(key); + if (this.cache?.[Key]) { + return this.cache![Key]; + } + + try { + const bucket = this.client.bucket(this.bucket); + const file = bucket.file(Key); + const [exists] = await file.exists(); + + if (!exists) { + return undefined; + } + + const [metadata] = await file.getMetadata(); + const [contents] = await file.download(); + const body = contents.toString('utf-8'); + + const result = { + data: JSON.parse(body), + // If no updated date is provided, use the Unix epoch start + // 0 = Unix epoch start (1970-01-01T00:00:00.000Z) + modified: new Date(metadata.updated ?? 0), + }; + + if (this.cache) { + this.cache[Key] = result; + } + return result; + } catch (e: any) { + if (e.code === 404) { + return undefined; + } + throw e; + } + } + + url(key: string): string { + const formattedKey = this.formatKey(key); + return `https://storage.googleapis.com/${this.bucket}/${formattedKey}`; + } +} diff --git a/typescript/sdk/src/gcp/validator.ts b/typescript/sdk/src/gcp/validator.ts new file mode 100644 index 000000000..e335ca270 --- /dev/null +++ b/typescript/sdk/src/gcp/validator.ts @@ -0,0 +1,132 @@ +import { + Announcement, + BaseValidator, + S3Announcement, + S3CheckpointWithId, + ValidatorConfig, + ValidatorMetadata, + isS3CheckpointWithId, +} from '@hyperlane-xyz/utils'; + +import { GcpStorageWrapper, StorageConfig } from './storage.js'; + +const checkpointWithMessageIdKey = (checkpointIndex: number) => + `checkpoint_${checkpointIndex}_with_id.json`; +const LATEST_KEY = 'gcsLatestIndexKey'; +const ANNOUNCEMENT_KEY = 'gcsAnnouncementKey'; +const METADATA_KEY = 'gcsMetadataKey'; +export const GCP_LOCATION_PREFIX = 'gs://'; + +/** + * Extension of BaseValidator that includes GCP Cloud Storage utilities. + */ +export class GcpValidator extends BaseValidator { + public storage: GcpStorageWrapper; + + constructor( + public validatorConfig: ValidatorConfig, + public storageConfig: StorageConfig, + ) { + super(validatorConfig); + this.storage = new GcpStorageWrapper(storageConfig); + } + + static async fromStorageLocation( + storageLocation: string, + ): Promise { + // Remove trailing key if present + if (storageLocation.endsWith(ANNOUNCEMENT_KEY)) { + storageLocation = storageLocation.slice(0, -ANNOUNCEMENT_KEY.length); + // Remove trailing slash if present after removing key + if (storageLocation.endsWith('/')) { + storageLocation = storageLocation.slice(0, -1); + } + } + if (storageLocation.startsWith(GCP_LOCATION_PREFIX)) { + const bucketName = storageLocation.slice(GCP_LOCATION_PREFIX.length); + const pieces = bucketName.split('/'); + if (pieces.length >= 1) { + const storageFolder = + pieces.length > 1 ? pieces.slice(1).join('/') : undefined; + const storageConfig = { + bucket: pieces[0], + folder: storageFolder, + caching: true, + }; + const storage = new GcpStorageWrapper(storageConfig); + const announcement = await storage.getObject( + ANNOUNCEMENT_KEY, + ); + if (!announcement) { + throw new Error('No announcement found'); + } + + const validatorConfig = { + address: announcement.data.value.validator, + localDomain: announcement.data.value.mailbox_domain, + mailbox: announcement.data.value.mailbox_address, + }; + + return new GcpValidator(validatorConfig, storageConfig); + } + } + throw new Error(`Unable to parse location ${storageLocation}`); + } + + async getAnnouncement(): Promise { + const { value } = await this.getSignedAnnouncement(); + return value; + } + + async getSignedAnnouncement(): Promise { + const resp = await this.storage.getObject(ANNOUNCEMENT_KEY); + if (!resp) { + throw new Error(`No announcement found for ${this.config.localDomain}`); + } + + return resp.data; + } + + async getMetadata(): Promise { + const resp = await this.storage.getObject(METADATA_KEY); + if (!resp) { + throw new Error(`No metadata found for ${this.config.localDomain}`); + } + + return resp.data; + } + + async getCheckpoint(index: number): Promise { + const key = checkpointWithMessageIdKey(index); + const checkpoint = await this.storage.getObject(key); + if (!checkpoint) { + return; + } + + if (isS3CheckpointWithId(checkpoint.data)) { + return checkpoint.data; + } else { + throw new Error('Failed to parse checkpoint'); + } + } + + async getLatestCheckpointIndex(): Promise { + const latestCheckpointIndex = await this.storage.getObject( + LATEST_KEY, + ); + + if (!latestCheckpointIndex) return -1; + + return latestCheckpointIndex.data; + } + + storageLocation(): string { + return `${GCP_LOCATION_PREFIX}${this.storage.config.bucket}${ + this.storage.config.folder ? '/' + this.storage.config.folder : '' + }`; + } + + getLatestCheckpointUrl(): string { + return this.storage.url(LATEST_KEY); + } +} diff --git a/typescript/sdk/src/index.ts b/typescript/sdk/src/index.ts index fe9977443..efbbb00c6 100644 --- a/typescript/sdk/src/index.ts +++ b/typescript/sdk/src/index.ts @@ -513,6 +513,7 @@ export { getSealevelAccountDataSchema, } from './utils/sealevelSerialization.js'; export { getChainIdFromTxs } from './utils/transactions.js'; +export { getValidatorFromStorageLocation } from './utils/validator.js'; export { FeeConstantConfig, RouteBlacklist, @@ -575,3 +576,4 @@ export { export { EvmIsmModule } from './ism/EvmIsmModule.js'; export { AnnotatedEV5Transaction } from './providers/ProviderType.js'; export { EvmERC20WarpModule } from './token/EvmERC20WarpModule.js'; +export { GcpValidator } from './gcp/validator.js'; diff --git a/typescript/sdk/src/utils/validator.ts b/typescript/sdk/src/utils/validator.ts new file mode 100644 index 000000000..c49612f8a --- /dev/null +++ b/typescript/sdk/src/utils/validator.ts @@ -0,0 +1,12 @@ +import { S3Validator, S3_LOCATION_PREFIX } from '../aws/validator.js'; +import { GCP_LOCATION_PREFIX, GcpValidator } from '../gcp/validator.js'; + +export async function getValidatorFromStorageLocation(location: string) { + if (location.startsWith(GCP_LOCATION_PREFIX)) { + return GcpValidator.fromStorageLocation(location); + } else if (location.startsWith(S3_LOCATION_PREFIX)) { + return S3Validator.fromStorageLocation(location); + } else { + throw new Error('Invalid storage location'); + } +} diff --git a/yarn.lock b/yarn.lock index 22d4776b5..fa67f8b2c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7205,6 +7205,30 @@ __metadata: languageName: node linkType: hard +"@google-cloud/paginator@npm:^5.0.0": + version: 5.0.2 + resolution: "@google-cloud/paginator@npm:5.0.2" + dependencies: + arrify: "npm:^2.0.0" + extend: "npm:^3.0.2" + checksum: 10/b64ba2029b77fdcf3c827aea0b6d128122fd1d2f4aa8c1ba70747cba0659d4216a283769fb3bbeb8f726176f5282624637f02c30f118a010e05838411da0cb76 + languageName: node + linkType: hard + +"@google-cloud/projectify@npm:^4.0.0": + version: 4.0.0 + resolution: "@google-cloud/projectify@npm:4.0.0" + checksum: 10/fdccdda0b50855c35541d71c46a6603f3302ff1a00108d946272cb2167435da00e2a2da5963fe489f4f5a4a9eb6320abeb97d3269974a972ae89f5df8451922d + languageName: node + linkType: hard + +"@google-cloud/promisify@npm:^4.0.0": + version: 4.0.0 + resolution: "@google-cloud/promisify@npm:4.0.0" + checksum: 10/c5de81321b3a5c567edcbe0b941fb32644611147f3ba22f20575918c225a979988a99bc2ebda05ac914fa8714b0a54c69be72c3f46c7a64c3b19db7d7fba8d04 + languageName: node + linkType: hard + "@google-cloud/secret-manager@npm:^5.5.0": version: 5.5.0 resolution: "@google-cloud/secret-manager@npm:5.5.0" @@ -7214,6 +7238,29 @@ __metadata: languageName: node linkType: hard +"@google-cloud/storage@npm:7.14.0": + version: 7.14.0 + resolution: "@google-cloud/storage@npm:7.14.0" + dependencies: + "@google-cloud/paginator": "npm:^5.0.0" + "@google-cloud/projectify": "npm:^4.0.0" + "@google-cloud/promisify": "npm:^4.0.0" + abort-controller: "npm:^3.0.0" + async-retry: "npm:^1.3.3" + duplexify: "npm:^4.1.3" + fast-xml-parser: "npm:^4.4.1" + gaxios: "npm:^6.0.2" + google-auth-library: "npm:^9.6.3" + html-entities: "npm:^2.5.2" + mime: "npm:^3.0.0" + p-limit: "npm:^3.0.1" + retry-request: "npm:^7.0.0" + teeny-request: "npm:^9.0.0" + uuid: "npm:^8.0.0" + checksum: 10/0726fde2697da696637fab91ebd756354a58c1331f6a0b9ecc5011de4aae72cd9e1fe3e9564aee15c6a2118e45ed0ae8c3ac9685c6581db6107080f906a949e9 + languageName: node + linkType: hard + "@grpc/grpc-js@npm:~1.10.3": version: 1.10.8 resolution: "@grpc/grpc-js@npm:1.10.8" @@ -7555,6 +7602,7 @@ __metadata: "@cosmjs/cosmwasm-stargate": "npm:^0.32.4" "@cosmjs/stargate": "npm:^0.32.4" "@eslint/js": "npm:^9.15.0" + "@google-cloud/storage": "npm:7.14.0" "@hyperlane-xyz/core": "npm:5.8.2" "@hyperlane-xyz/utils": "npm:7.2.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" @@ -17826,6 +17874,13 @@ __metadata: languageName: node linkType: hard +"arrify@npm:^2.0.0": + version: 2.0.1 + resolution: "arrify@npm:2.0.1" + checksum: 10/067c4c1afd182806a82e4c1cb8acee16ab8b5284fbca1ce29408e6e91281c36bb5b612f6ddfbd40a0f7a7e0c75bf2696eb94c027f6e328d6e9c52465c98e4209 + languageName: node + linkType: hard + "as-table@npm:^1.0.36": version: 1.0.55 resolution: "as-table@npm:1.0.55" @@ -21019,7 +21074,7 @@ __metadata: languageName: node linkType: hard -"duplexify@npm:^4.0.0, duplexify@npm:^4.1.2": +"duplexify@npm:^4.0.0, duplexify@npm:^4.1.2, duplexify@npm:^4.1.3": version: 4.1.3 resolution: "duplexify@npm:4.1.3" dependencies: @@ -23147,6 +23202,17 @@ __metadata: languageName: node linkType: hard +"fast-xml-parser@npm:^4.4.1": + version: 4.5.0 + resolution: "fast-xml-parser@npm:4.5.0" + dependencies: + strnum: "npm:^1.0.5" + bin: + fxparser: src/cli/cli.js + checksum: 10/dc9571c10e7b57b5be54bcd2d92f50c446eb42ea5df347d253e94dd14eb99b5300a6d172e840f151e0721933ca2406165a8d9b316a6d777bf0596dc4fe1df756 + languageName: node + linkType: hard + "fastq@npm:^1.6.0": version: 1.13.0 resolution: "fastq@npm:1.13.0" @@ -23889,6 +23955,19 @@ __metadata: languageName: node linkType: hard +"gaxios@npm:^6.0.2": + version: 6.7.1 + resolution: "gaxios@npm:6.7.1" + dependencies: + extend: "npm:^3.0.2" + https-proxy-agent: "npm:^7.0.1" + is-stream: "npm:^2.0.0" + node-fetch: "npm:^2.6.9" + uuid: "npm:^9.0.1" + checksum: 10/c85599162208884eadee91215ebbfa1faa412551df4044626cb561300e15193726e8f23d63b486533e066dadad130f58ed872a23acab455238d8d48b531a0695 + languageName: node + linkType: hard + "gcp-metadata@npm:^6.1.0": version: 6.1.0 resolution: "gcp-metadata@npm:6.1.0" @@ -24396,6 +24475,20 @@ __metadata: languageName: node linkType: hard +"google-auth-library@npm:^9.6.3": + version: 9.15.0 + resolution: "google-auth-library@npm:9.15.0" + dependencies: + base64-js: "npm:^1.3.0" + ecdsa-sig-formatter: "npm:^1.0.11" + gaxios: "npm:^6.1.1" + gcp-metadata: "npm:^6.1.0" + gtoken: "npm:^7.0.0" + jws: "npm:^4.0.0" + checksum: 10/fba2db9732bbf1b3a3a2e2b45131ba8e8aba297377f1c104d0b2ab3386bbc1e02047f20b8a7afca1c6308492da1540104618f1c7b5cd539703552e10399c560e + languageName: node + linkType: hard + "google-gax@npm:^4.0.3": version: 4.3.3 resolution: "google-gax@npm:4.3.3" @@ -25077,6 +25170,13 @@ __metadata: languageName: node linkType: hard +"html-entities@npm:^2.5.2": + version: 2.5.2 + resolution: "html-entities@npm:2.5.2" + checksum: 10/4ec12ebdf2d5ba8192c68e1aef3c1e4a4f36b29246a0a88464fe278a54517d0196d3489af46a3145c7ecacb4fc5fd50497be19eb713b810acab3f0efcf36fdc2 + languageName: node + linkType: hard + "html-escaper@npm:^2.0.0": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" @@ -30013,7 +30113,7 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": +"p-limit@npm:^3.0.1, p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": version: 3.1.0 resolution: "p-limit@npm:3.1.0" dependencies: @@ -36311,7 +36411,7 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^8.3.2": +"uuid@npm:^8.0.0, uuid@npm:^8.3.2": version: 8.3.2 resolution: "uuid@npm:8.3.2" bin: From ff9e8a72b895be06037218087b419f8ed0e654ba Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Thu, 28 Nov 2024 12:41:37 +0000 Subject: [PATCH 17/18] feat: track ATA payer balances in warp monitors instead of key funder (#4913) ### Description - We need to track balances of "ATA payer" accounts, which are accounts that have balances that are used to pay for rent for recipients that have never received a particular token before. The balance is in the native token as that's what the SVM uses to charge rent. Previously, we were tracking these in the key funder in a very manual and annoying process. Now, this is tracked automatically when a warp route monitor is set up. - Removed the old logic in the key funder - Consolidated some code to ensure the same gauge is used to track wallet balances throughout TS What I'll do after this is merged: - deploy an updated key funder to no longer track ATA payers - deploy new warp route monitors with this Example of the metric now included in the warp monitor: ``` # HELP hyperlane_wallet_balance Current balance of a wallet for a token # TYPE hyperlane_wallet_balance gauge hyperlane_wallet_balance{chain="eclipsemainnet",wallet_address="CijxTbPs9JZxTUfo8Hmz2imxzHtKnDFD3kZP3RPy34uJ",wallet_name="SOL/eclipsemainnet-solanamainnet/ata-payer",token_symbol="Native",token_name="Native"} 0.039941128 ``` ### Drive-by changes - Some drive-bys to allow you to omit a warp route ID as a CLI arg to some scripts to get an interactive prompt. Found this useful as it's annoying to remember and type out the warp route ID structure ### Related issues ### Backward compatibility ### Testing --- .changeset/tough-roses-allow.md | 5 + .../config/environments/mainnet3/funding.ts | 2 +- typescript/infra/scripts/agent-utils.ts | 36 ++++ typescript/infra/scripts/check/check-utils.ts | 3 +- .../funding/fund-keys-from-deployer.ts | 165 ++---------------- typescript/infra/scripts/helloworld/kathy.ts | 19 +- .../warp-routes/deploy-warp-monitor.ts | 23 +-- .../scripts/warp-routes/monitor/metrics.ts | 21 ++- .../monitor/monitor-warp-route-balances.ts | 81 ++++++++- .../scripts/warp-routes/monitor/types.ts | 10 ++ typescript/infra/src/utils/metrics.ts | 23 ++- typescript/infra/src/warp/helm.ts | 2 +- typescript/sdk/src/index.ts | 1 + .../token/adapters/SealevelTokenAdapter.ts | 12 ++ 14 files changed, 198 insertions(+), 205 deletions(-) create mode 100644 .changeset/tough-roses-allow.md diff --git a/.changeset/tough-roses-allow.md b/.changeset/tough-roses-allow.md new file mode 100644 index 000000000..5a0d53534 --- /dev/null +++ b/.changeset/tough-roses-allow.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': minor +--- + +Added a getter to derive ATA payer accounts on Sealevel warp routes diff --git a/typescript/infra/config/environments/mainnet3/funding.ts b/typescript/infra/config/environments/mainnet3/funding.ts index 95ac6e84f..a46e267fd 100644 --- a/typescript/infra/config/environments/mainnet3/funding.ts +++ b/typescript/infra/config/environments/mainnet3/funding.ts @@ -10,7 +10,7 @@ export const keyFunderConfig: KeyFunderConfig< > = { docker: { repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: 'd834d81-20241125-135642', + tag: 'aac6787-20241128-103715', }, // We're currently using the same deployer/key funder key as mainnet2. // To minimize nonce clobbering we offset the key funder cron diff --git a/typescript/infra/scripts/agent-utils.ts b/typescript/infra/scripts/agent-utils.ts index f47d13f87..a1c214208 100644 --- a/typescript/infra/scripts/agent-utils.ts +++ b/typescript/infra/scripts/agent-utils.ts @@ -1,3 +1,4 @@ +import { checkbox, select } from '@inquirer/prompts'; import path, { join } from 'path'; import yargs, { Argv } from 'yargs'; @@ -23,6 +24,7 @@ import { import { Contexts } from '../config/contexts.js'; import { agents } from '../config/environments/agents.js'; +import { WarpRouteIds } from '../config/environments/mainnet3/warp/warpIds.js'; import { validatorBaseConfigsFn } from '../config/environments/utils.js'; import { getChain, @@ -279,6 +281,40 @@ export function withTxHashes(args: Argv) { .alias('t', 'txHashes'); } +// Interactively gets a single warp route ID +export async function getWarpRouteIdInteractive() { + const choices = Object.values(WarpRouteIds).map((id) => ({ + value: id, + })); + return select({ + message: 'Select Warp Route ID', + choices, + pageSize: 30, + }); +} + +// Interactively gets multiple warp route IDs +export async function getWarpRouteIdsInteractive() { + const choices = Object.values(WarpRouteIds).map((id) => ({ + value: id, + })); + + let selection: WarpRouteIds[] = []; + + while (!selection.length) { + selection = await checkbox({ + message: 'Select Warp Route IDs', + choices, + pageSize: 30, + }); + if (!selection.length) { + console.log('Please select at least one Warp Route ID'); + } + } + + return selection; +} + // not requiring to build coreConfig to get agentConfig export async function getAgentConfigsBasedOnArgs(argv?: { environment: DeployEnvironment; diff --git a/typescript/infra/scripts/check/check-utils.ts b/typescript/infra/scripts/check/check-utils.ts index bac0229f5..2d0b6b030 100644 --- a/typescript/infra/scripts/check/check-utils.ts +++ b/typescript/infra/scripts/check/check-utils.ts @@ -38,6 +38,7 @@ import { logViolationDetails } from '../../src/utils/violation.js'; import { Modules, getArgs as getRootArgs, + getWarpRouteIdInteractive, withAsDeployer, withChains, withContext, @@ -192,7 +193,7 @@ export async function getGovernor( governor = new ProxiedRouterGovernor(checker); } else if (module === Modules.WARP) { if (!warpRouteId) { - throw new Error('Warp route id required for warp module'); + warpRouteId = await getWarpRouteIdInteractive(); } const config = await getWarpConfig(multiProvider, envConfig, warpRouteId); const warpAddresses = getWarpAddresses(warpRouteId); diff --git a/typescript/infra/scripts/funding/fund-keys-from-deployer.ts b/typescript/infra/scripts/funding/fund-keys-from-deployer.ts index dabb1fbd2..27ae62bc9 100644 --- a/typescript/infra/scripts/funding/fund-keys-from-deployer.ts +++ b/typescript/infra/scripts/funding/fund-keys-from-deployer.ts @@ -33,7 +33,10 @@ import { KeyFunderConfig, } from '../../src/config/funding.js'; import { FundableRole, Role } from '../../src/roles.js'; -import { submitMetrics } from '../../src/utils/metrics.js'; +import { + getWalletBalanceGauge, + submitMetrics, +} from '../../src/utils/metrics.js'; import { assertContext, assertFundableRole, @@ -65,30 +68,19 @@ const L2ToL1: ChainMap = { base: 'ethereum', }; +// Manually adding these labels as we are using a push gateway, +// and ordinarily these labels would be added via K8s annotations const constMetricLabels = { - // this needs to get set in main because of async reasons hyperlane_deployment: '', hyperlane_context: 'hyperlane', }; const metricsRegister = new Registry(); -const walletBalanceGauge = new Gauge({ - // Mirror the rust/main/ethers-prometheus `wallet_balance` gauge metric. - name: 'hyperlane_wallet_balance', - help: 'Current balance of eth and other tokens in the `tokens` map for the wallet addresses in the `wallets` set', - registers: [metricsRegister], - labelNames: [ - 'chain', - 'wallet_address', - 'wallet_name', - 'token_address', - 'token_symbol', - 'token_name', - ...(Object.keys(constMetricLabels) as (keyof typeof constMetricLabels)[]), - ], -}); -metricsRegister.registerMetric(walletBalanceGauge); +const walletBalanceGauge = getWalletBalanceGauge( + metricsRegister, + Object.keys(constMetricLabels), +); // Min delta is 50% of the desired balance const MIN_DELTA_NUMERATOR = ethers.BigNumber.from(5); @@ -98,88 +90,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); -interface SealevelAccount { - pubkey: PublicKey; - walletName: string; -} - -const sealevelAccountsToTrack: ChainMap = { - solanamainnet: [ - { - // WIF warp route ATA payer - pubkey: new PublicKey('R5oMfxcbjx4ZYK1B2Aic1weqwt2tQsRzFEGe5WJfAxh'), - walletName: 'WIF/eclipsemainnet-solanamainnet/ata-payer', - }, - { - // USDC warp route ATA payer - pubkey: new PublicKey('A1XtL9mAzkNEpBPinrCpDRrPqVAFjgaxDk4ATFVoQVyc'), - walletName: 'USDC/eclipsemainnet-ethereum-solanamainnet/ata-payer', - }, - { - // USDT warp route ATA payer - pubkey: new PublicKey('9i3kYQqMtkm4sw1w5SQ8ebKMmh4LPVYKZRMPaZeRfn37'), - walletName: 'USDT/eclipsemainnet-ethereum-solanamainnet/ata-payer', - }, - { - // ORCA warp route ATA payer - pubkey: new PublicKey('HqAVwQA6rh1TGdyUHi2XqmCtBSyG3DZjjsCLRXWqyNuU'), - walletName: 'ORCA/eclipsemainnet-solanamainnet/ata-payer', - }, - ], - eclipsemainnet: [ - { - // WIF warp route ATA payer - pubkey: new PublicKey('HCQAfDd5ytAEidzR9g7CipjEGv2ZrSSZq1UY34oDFv8h'), - walletName: 'WIF/eclipsemainnet-solanamainnet/ata-payer', - }, - { - // USDC warp route ATA payer - pubkey: new PublicKey('7arS1h8nwVVmmTVWSsu9rQ4WjLBN8iAi4DvHi8gWjBNC'), - walletName: 'USDC/eclipsemainnet-ethereum-solanamainnet/ata-payer', - }, - { - // tETH warp route ATA payer - pubkey: new PublicKey('Hyy4jryRxgZm5pvuSx29fXxJ9J55SuDtXiCo89kmNuz5'), - walletName: 'tETH/eclipsemainnet-ethereum/ata-payer', - }, - { - // SOL warp route ATA payer - pubkey: new PublicKey('CijxTbPs9JZxTUfo8Hmz2imxzHtKnDFD3kZP3RPy34uJ'), - walletName: 'SOL/eclipsemainnet-solanamainnet/ata-payer', - }, - { - // stTIA warp route ATA payer - pubkey: new PublicKey('Bg3bAM3gEhdam5mbPqkiMi3mLZkoAieakMRdMHo6mbcn'), - walletName: 'stTIA/eclipsemainnet-stride/ata-payer', - }, - { - // TIA warp route ATA payer - pubkey: new PublicKey('AZs4Rw6H6YwJBKoHBCfChCitHnHvQcVGgrJwGh4bKmAf'), - walletName: 'TIA/eclipsemainnet-stride/ata-payer', - }, - { - // USDT warp route ATA payer - pubkey: new PublicKey('78s5TD48q89EZqHNC2bfsswQXn6n3sn1ecGgqXgJe4hL'), - walletName: 'USDT/eclipsemainnet-ethereum-solanamainnet/ata-payer', - }, - { - // ORCA warp route ATA payer - pubkey: new PublicKey('3ZyZHoDRzfYg4ug6Tx4Zywe6M5Vt19vPZFx9Ag8qqnXu'), - walletName: 'ORCA/eclipsemainnet-solanamainnet/ata-payer', - }, - { - // WBTC warp route ATA payer - pubkey: new PublicKey('BH9VfgYaCWbwuupzsTfSy67yR4dwuCbXmFRrm6aAH2NQ'), - walletName: 'WBTC/eclipsemainnet-ethereum/ata-payer', - }, - // weETHs warp route ATA payer - { - pubkey: new PublicKey('F4Y6kHrq9qVnmkQhQibxh8nCU2quw5y25z7u8jSHMvtq'), - walletName: 'weETHs/eclipsemainnet-ethereum/ata-payer', - }, - ], -}; - // Funds key addresses for multiple contexts from the deployer key of the context // specified via the `--context` flag. // The --contexts-and-roles flag is used to specify the contexts and the key roles @@ -556,13 +466,6 @@ class ContextFunder { false, ); - if ( - this.environment === 'mainnet3' && - this.context === Contexts.Hyperlane - ) { - await this.updateSolanaWalletBalanceGauge(); - } - return failureOccurred; } @@ -909,54 +812,6 @@ class ContextFunder { ), ); } - - private async updateSolanaWalletBalanceGauge() { - for (const chain of Object.keys(sealevelAccountsToTrack) as ChainName[]) { - await this.updateSealevelWalletBalanceAccounts( - chain, - sealevelAccountsToTrack[chain], - ); - } - } - - private async updateSealevelWalletBalanceAccounts( - chain: ChainName, - accounts: SealevelAccount[], - ) { - const rpcUrls = await getSecretRpcEndpoints(this.environment, chain); - const provider = new Connection(rpcUrls[0], 'confirmed'); - - for (const { pubkey, walletName } of accounts) { - logger.info( - { - chain, - pubkey: pubkey.toString(), - walletName, - }, - 'Fetching sealevel wallet balance', - ); - const balance = await provider.getBalance(pubkey); - logger.info( - { - balance, - chain, - pubkey: pubkey.toString(), - walletName, - }, - 'Retrieved sealevel chain wallet balance', - ); - walletBalanceGauge - .labels({ - chain, - wallet_address: pubkey.toString(), - wallet_name: walletName, - token_symbol: 'Native', - token_name: 'Native', - ...constMetricLabels, - }) - .set(balance / 1e9); - } - } } async function getAddressInfo( diff --git a/typescript/infra/scripts/helloworld/kathy.ts b/typescript/infra/scripts/helloworld/kathy.ts index dfed8fe6b..678e2bb75 100644 --- a/typescript/infra/scripts/helloworld/kathy.ts +++ b/typescript/infra/scripts/helloworld/kathy.ts @@ -35,7 +35,10 @@ import { owners } from '../../config/environments/testnet4/owners.js'; import { CloudAgentKey } from '../../src/agents/keys.js'; import { DeployEnvironment } from '../../src/config/environment.js'; import { Role } from '../../src/roles.js'; -import { startMetricsServer } from '../../src/utils/metrics.js'; +import { + getWalletBalanceGauge, + startMetricsServer, +} from '../../src/utils/metrics.js'; import { assertChain, diagonalize } from '../../src/utils/utils.js'; import { getArgs, withContext } from '../agent-utils.js'; import { getEnvironmentConfig } from '../core-utils.js'; @@ -70,19 +73,7 @@ const messageReceiptSeconds = new Counter({ registers: [metricsRegister], labelNames: ['origin', 'remote'], }); -const walletBalance = new Gauge({ - name: 'hyperlane_wallet_balance', - help: 'Current balance of eth and other tokens in the `tokens` map for the wallet addresses in the `wallets` set', - registers: [metricsRegister], - labelNames: [ - 'chain', - 'wallet_address', - 'wallet_name', - 'token_address', - 'token_symbol', - 'token_name', - ], -}); +const walletBalance = getWalletBalanceGauge(metricsRegister); /** The maximum number of messages we will allow to get queued up if we are sending too slowly. */ const MAX_MESSAGES_ALLOWED_TO_SEND = 5; diff --git a/typescript/infra/scripts/warp-routes/deploy-warp-monitor.ts b/typescript/infra/scripts/warp-routes/deploy-warp-monitor.ts index e7714778c..29fd16b9a 100644 --- a/typescript/infra/scripts/warp-routes/deploy-warp-monitor.ts +++ b/typescript/infra/scripts/warp-routes/deploy-warp-monitor.ts @@ -1,5 +1,4 @@ import { checkbox } from '@inquirer/prompts'; -import yargs from 'yargs'; import { Contexts } from '../../config/contexts.js'; import { WarpRouteIds } from '../../config/environments/mainnet3/warp/warpIds.js'; @@ -9,6 +8,7 @@ import { assertCorrectKubeContext, getAgentConfig, getArgs, + getWarpRouteIdsInteractive, withWarpRouteId, } from '../agent-utils.js'; import { getEnvironmentConfig } from '../core-utils.js'; @@ -41,27 +41,6 @@ async function main() { } } -async function getWarpRouteIdsInteractive() { - const choices = Object.values(WarpRouteIds).map((id) => ({ - value: id, - })); - - let selection: WarpRouteIds[] = []; - - while (!selection.length) { - selection = await checkbox({ - message: 'Select Warp Route IDs to deploy', - choices, - pageSize: 30, - }); - if (!selection.length) { - console.log('Please select at least one Warp Route ID'); - } - } - - return selection; -} - main() .then(() => console.log('Deploy successful!')) .catch(console.error); diff --git a/typescript/infra/scripts/warp-routes/monitor/metrics.ts b/typescript/infra/scripts/warp-routes/monitor/metrics.ts index eec6738ab..52c2604f9 100644 --- a/typescript/infra/scripts/warp-routes/monitor/metrics.ts +++ b/typescript/infra/scripts/warp-routes/monitor/metrics.ts @@ -3,7 +3,9 @@ import { Gauge, Registry } from 'prom-client'; import { createWarpRouteConfigId } from '@hyperlane-xyz/registry'; import { ChainName, Token, TokenStandard, WarpCore } from '@hyperlane-xyz/sdk'; -import { WarpRouteBalance, XERC20Limit } from './types.js'; +import { getWalletBalanceGauge } from '../../../src/utils/metrics.js'; + +import { NativeWalletBalance, WarpRouteBalance, XERC20Limit } from './types.js'; import { logger } from './utils.js'; export const metricsRegister = new Registry(); @@ -44,6 +46,8 @@ const warpRouteCollateralValue = new Gauge({ labelNames: warpRouteMetricLabels, }); +const walletBalanceGauge = getWalletBalanceGauge(metricsRegister); + const xERC20LimitsGauge = new Gauge({ name: 'hyperlane_xerc20_limits', help: 'Current minting and burning limits of xERC20 tokens', @@ -94,6 +98,21 @@ export function updateTokenBalanceMetrics( } } +export function updateNativeWalletBalanceMetrics(balance: NativeWalletBalance) { + walletBalanceGauge + .labels({ + chain: balance.chain, + wallet_address: balance.walletAddress, + wallet_name: balance.walletName, + token_symbol: 'Native', + token_name: 'Native', + }) + .set(balance.balance); + logger.info('Native wallet balance updated', { + balanceInfo: balance, + }); +} + export function updateXERC20LimitsMetrics(token: Token, limits: XERC20Limit) { for (const [limitType, limit] of Object.entries(limits)) { xERC20LimitsGauge diff --git a/typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts b/typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts index 7a8fdb645..1591d92b3 100644 --- a/typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts +++ b/typescript/infra/scripts/warp-routes/monitor/monitor-warp-route-balances.ts @@ -1,5 +1,6 @@ import { PopulatedTransaction } from 'ethers'; +import { createWarpRouteConfigId } from '@hyperlane-xyz/registry'; import { ChainMap, ChainMetadata, @@ -9,6 +10,7 @@ import { IHypXERC20Adapter, MultiProtocolProvider, RouterConfig, + SealevelHypTokenAdapter, Token, TokenStandard, WarpCore, @@ -22,25 +24,35 @@ import { } from '../../../src/config/environment.js'; import { fetchGCPSecret } from '../../../src/utils/gcloud.js'; import { startMetricsServer } from '../../../src/utils/metrics.js'; -import { getArgs, withWarpRouteIdRequired } from '../../agent-utils.js'; +import { + getArgs, + getWarpRouteIdInteractive, + withWarpRouteId, +} from '../../agent-utils.js'; import { getEnvironmentConfig } from '../../core-utils.js'; import { metricsRegister, + updateNativeWalletBalanceMetrics, updateTokenBalanceMetrics, updateXERC20LimitsMetrics, } from './metrics.js'; -import { WarpRouteBalance, XERC20Limit } from './types.js'; +import { NativeWalletBalance, WarpRouteBalance, XERC20Limit } from './types.js'; import { logger, tryFn } from './utils.js'; async function main() { - const { checkFrequency, environment, warpRouteId } = - await withWarpRouteIdRequired(getArgs()) - .describe('checkFrequency', 'frequency to check balances in ms') - .demandOption('checkFrequency') - .alias('v', 'checkFrequency') // v as in Greek letter nu - .number('checkFrequency') - .parse(); + const { + checkFrequency, + environment, + warpRouteId: warpRouteIdArg, + } = await withWarpRouteId(getArgs()) + .describe('checkFrequency', 'frequency to check balances in ms') + .demandOption('checkFrequency') + .alias('v', 'checkFrequency') // v as in Greek letter nu + .number('checkFrequency') + .parse(); + + const warpRouteId = warpRouteIdArg || (await getWarpRouteIdInteractive()); startMetricsServer(metricsRegister); @@ -110,6 +122,19 @@ async function updateTokenMetrics( }, 'Getting bridged balance and value'), ]; + // For Sealevel collateral and synthetic tokens, there is an + // "Associated Token Account" (ATA) rent payer that has a balance + // that's used to pay for rent for the accounts that store user balances. + // This is necessary if the recipient has never received any tokens before. + if (token.protocol === ProtocolType.Sealevel && !token.isNative()) { + promises.push( + tryFn(async () => { + const balance = await getSealevelAtaPayerBalance(warpCore, token); + updateNativeWalletBalanceMetrics(balance); + }, 'Getting ATA payer balance'), + ); + } + if (token.isXerc20()) { promises.push( tryFn(async () => { @@ -156,6 +181,44 @@ async function getTokenBridgedBalance( }; } +// Gets the native balance of the ATA payer, which is used to pay for +// rent when delivering tokens to an account that previously didn't +// have a balance. +// Only intended for Collateral or Synthetic Sealevel tokens. +async function getSealevelAtaPayerBalance( + warpCore: WarpCore, + token: Token, +): Promise { + if (token.protocol !== ProtocolType.Sealevel || token.isNative()) { + throw new Error( + `Unsupported ATA payer protocol type ${token.protocol} or standard ${token.standard}`, + ); + } + const adapter = token.getHypAdapter( + warpCore.multiProvider, + ) as SealevelHypTokenAdapter; + + const ataPayer = adapter.deriveAtaPayerAccount().toString(); + const nativeToken = Token.FromChainMetadataNativeToken( + warpCore.multiProvider.getChainMetadata(token.chainName), + ); + const ataPayerBalance = await nativeToken.getBalance( + warpCore.multiProvider, + ataPayer, + ); + + const warpRouteId = createWarpRouteConfigId( + token.symbol, + warpCore.getTokenChains(), + ); + return { + chain: token.chainName, + walletAddress: ataPayer.toString(), + walletName: `${warpRouteId}/ata-payer`, + balance: ataPayerBalance.getDecimalFormattedAmount(), + }; +} + async function getXERC20Limits( warpCore: WarpCore, token: Token, diff --git a/typescript/infra/scripts/warp-routes/monitor/types.ts b/typescript/infra/scripts/warp-routes/monitor/types.ts index 5a2d87749..976224d1c 100644 --- a/typescript/infra/scripts/warp-routes/monitor/types.ts +++ b/typescript/infra/scripts/warp-routes/monitor/types.ts @@ -1,3 +1,6 @@ +import { ChainName } from '@hyperlane-xyz/sdk'; +import { Address } from '@hyperlane-xyz/utils'; + export interface XERC20Limit { mint: number; burn: number; @@ -9,3 +12,10 @@ export interface WarpRouteBalance { balance: number; valueUSD?: number; } + +export interface NativeWalletBalance { + chain: ChainName; + walletAddress: Address; + walletName: string; + balance: number; +} diff --git a/typescript/infra/src/utils/metrics.ts b/typescript/infra/src/utils/metrics.ts index ace2fbf1b..a9f274caa 100644 --- a/typescript/infra/src/utils/metrics.ts +++ b/typescript/infra/src/utils/metrics.ts @@ -1,5 +1,5 @@ import http from 'http'; -import { Pushgateway, Registry } from 'prom-client'; +import { Gauge, Pushgateway, Registry } from 'prom-client'; import { format } from 'util'; import { rootLogger } from '@hyperlane-xyz/utils'; @@ -66,3 +66,24 @@ export function startMetricsServer(register: Registry): http.Server { }) .listen(parseInt(process.env['PROMETHEUS_PORT'] || '9090')); } + +export function getWalletBalanceGauge( + register: Registry, + additionalLabels: string[] = [], +) { + return new Gauge({ + // Mirror the rust/main/ethers-prometheus `wallet_balance` gauge metric. + name: 'hyperlane_wallet_balance', + help: 'Current balance of a wallet for a token', + registers: [register], + labelNames: [ + 'chain', + 'wallet_address', + 'wallet_name', + 'token_address', + 'token_symbol', + 'token_name', + ...additionalLabels, + ], + }); +} diff --git a/typescript/infra/src/warp/helm.ts b/typescript/infra/src/warp/helm.ts index fb9db10ee..ce6c90120 100644 --- a/typescript/infra/src/warp/helm.ts +++ b/typescript/infra/src/warp/helm.ts @@ -22,7 +22,7 @@ export class WarpRouteMonitorHelmManager extends HelmManager { return { image: { repository: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '4d0de30-20241119-171012', + tag: 'aac6787-20241128-103715', }, warpRouteId: this.warpRouteId, fullnameOverride: this.helmReleaseName, diff --git a/typescript/sdk/src/index.ts b/typescript/sdk/src/index.ts index efbbb00c6..c31822b01 100644 --- a/typescript/sdk/src/index.ts +++ b/typescript/sdk/src/index.ts @@ -446,6 +446,7 @@ export { SealevelHypCollateralAdapter, SealevelHypNativeAdapter, SealevelHypSyntheticAdapter, + SealevelHypTokenAdapter, SealevelNativeTokenAdapter, SealevelTokenAdapter, } from './token/adapters/SealevelTokenAdapter.js'; diff --git a/typescript/sdk/src/token/adapters/SealevelTokenAdapter.ts b/typescript/sdk/src/token/adapters/SealevelTokenAdapter.ts index 788fa5f91..a9539cab9 100644 --- a/typescript/sdk/src/token/adapters/SealevelTokenAdapter.ts +++ b/typescript/sdk/src/token/adapters/SealevelTokenAdapter.ts @@ -526,6 +526,14 @@ export abstract class SealevelHypTokenAdapter ); } + // Should match https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/4b3537470eff0139163a2a7aa1d19fc708a992c6/rust/sealevel/programs/hyperlane-sealevel-token/src/plugin.rs#L43-L51 + deriveAtaPayerAccount(): PublicKey { + return super.derivePda( + ['hyperlane_token', '-', 'ata_payer'], + this.warpProgramPubKey, + ); + } + /** * Fetches the median prioritization fee for transfers of the collateralAddress token. * @returns The median prioritization fee in micro-lamports @@ -633,6 +641,10 @@ export class SealevelHypNativeAdapter extends SealevelHypTokenAdapter { this.warpProgramPubKey, ); } + + deriveAtaPayerAccount(): PublicKey { + throw new Error('No ATA payer is used for native warp routes'); + } } // Interacts with Hyp Collateral token programs From 8f8853bcd7105a6dd7af3a45c413b137ded6e888 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Thu, 28 Nov 2024 13:53:03 +0000 Subject: [PATCH 18/18] feat: env var to set Jito tip as a stopgap (#4916) ### Description - Intending to follow up with a more legit way of figuring out fees ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- rust/main/chains/hyperlane-sealevel/src/mailbox.rs | 7 ++++++- typescript/infra/config/environments/mainnet3/agent.ts | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/rust/main/chains/hyperlane-sealevel/src/mailbox.rs b/rust/main/chains/hyperlane-sealevel/src/mailbox.rs index cc88da72f..6c87ad4fa 100644 --- a/rust/main/chains/hyperlane-sealevel/src/mailbox.rs +++ b/rust/main/chains/hyperlane-sealevel/src/mailbox.rs @@ -501,6 +501,11 @@ impl Mailbox for SealevelMailbox { // If we're using Jito, we need to send a tip to the Jito fee account. // Otherwise, we need to set the compute unit price. if self.use_jito() { + let tip: u64 = std::env::var("JITO_TIP_LAMPORTS") + .ok() + .and_then(|s| s.parse::().ok()) + .unwrap_or(PROCESS_DESIRED_PRIORITIZATION_FEE_LAMPORTS_PER_TX); + // The tip is a standalone transfer to a Jito fee account. // See https://github.com/jito-labs/mev-protos/blob/master/json_rpc/http.md#sendbundle. instructions.push(solana_sdk::system_instruction::transfer( @@ -508,7 +513,7 @@ impl Mailbox for SealevelMailbox { // A random Jito fee account, taken from the getFeeAccount RPC response: // https://github.com/jito-labs/mev-protos/blob/master/json_rpc/http.md#gettipaccounts &solana_sdk::pubkey!("DfXygSm4jCyNCybVYYK6DwvWqjKee8pbDmJGcLWNDXjh"), - PROCESS_DESIRED_PRIORITIZATION_FEE_LAMPORTS_PER_TX, + tip, )); } // "processed" level commitment does not guarantee finality. diff --git a/typescript/infra/config/environments/mainnet3/agent.ts b/typescript/infra/config/environments/mainnet3/agent.ts index 5b5665ad6..9d443c085 100644 --- a/typescript/infra/config/environments/mainnet3/agent.ts +++ b/typescript/infra/config/environments/mainnet3/agent.ts @@ -454,7 +454,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'd834d81-20241125-135658', + tag: 'da277d9-20241128-121942', }, gasPaymentEnforcement: gasPaymentEnforcement, metricAppContextsGetter,