From 00f3b0c2b0ddf527c17ea62bf0d7fdb15e4d42e8 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Fri, 3 Nov 2023 11:37:47 +0000 Subject: [PATCH] refactor: make signer optional, remove more unwraps --- .../hyperlane-cosmos/src/aggregation_ism.rs | 4 +-- .../hyperlane-cosmos/src/interchain_gas.rs | 4 +-- .../src/interchain_security_module.rs | 4 +-- rust/chains/hyperlane-cosmos/src/mailbox.rs | 17 ++++++---- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 6 ++-- .../hyperlane-cosmos/src/multisig_ism.rs | 8 ++--- .../hyperlane-cosmos/src/providers/grpc.rs | 30 +++++++++-------- .../hyperlane-cosmos/src/routing_ism.rs | 4 +-- .../src/validator_announce.rs | 8 ++--- rust/hyperlane-base/src/settings/chains.rs | 33 ++++++++----------- 10 files changed, 57 insertions(+), 61 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs b/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs index 373d71a1fc..4b700ff1ff 100644 --- a/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs @@ -23,8 +23,8 @@ pub struct CosmosAggregationIsm { impl CosmosAggregationIsm { /// create new Cosmos AggregationIsm agent - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); Self { domain: locator.domain.clone(), diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index 621f76fa7b..a1be3cca62 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -44,8 +44,8 @@ impl InterchainGasPaymaster for CosmosInterchainGasPaymaster {} impl CosmosInterchainGasPaymaster { /// create new Cosmos InterchainGasPaymaster agent - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); Self { domain: locator.domain.clone(), diff --git a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs index 5b122e2c02..510a309558 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs @@ -28,9 +28,9 @@ pub struct CosmosInterchainSecurityModule { /// The Cosmos Interchain Security Module Implementation. impl CosmosInterchainSecurityModule { /// Creates a new Cosmos Interchain Security Module. - pub fn new(conf: &ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { + pub fn new(conf: &ConnectionConf, locator: ContractLocator, signer: Option) -> Self { let provider: WasmGrpcProvider = - WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); Self { domain: locator.domain.clone(), diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index e0bfe8c565..a25e6c7b99 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -35,25 +35,30 @@ use tracing::{instrument, warn}; /// A reference to a Mailbox contract on some Cosmos chain pub struct CosmosMailbox { + config: ConnectionConf, domain: HyperlaneDomain, address: H256, - signer: Signer, provider: Box, } impl CosmosMailbox { /// Create a reference to a mailbox at a specific Ethereum address on some /// chain - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { - let provider = WasmGrpcProvider::new(conf, locator.clone(), signer.clone()); + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); Self { + config: conf, domain: locator.domain.clone(), address: locator.address, - signer, provider: Box::new(provider), } } + + /// Prefix used in the bech32 address encoding + pub fn prefix(&self) -> String { + self.config.get_prefix() + } } impl HyperlaneContract for CosmosMailbox { @@ -136,7 +141,7 @@ impl Mailbox for CosmosMailbox { #[instrument(err, ret, skip(self))] async fn recipient_ism(&self, recipient: H256) -> ChainResult { - let address = CosmosAddress::from_h256(recipient, &self.signer.prefix)?.address(); + let address = CosmosAddress::from_h256(recipient, &self.prefix())?.address(); let payload = mailbox::RecipientIsmRequest { recipient_ism: mailbox::RecipientIsmRequestInner { @@ -256,7 +261,7 @@ impl CosmosMailboxIndexer { pub fn new( conf: ConnectionConf, locator: ContractLocator, - signer: Signer, + signer: Option, reorg_period: u32, ) -> ChainResult { let mailbox = CosmosMailbox::new(conf.clone(), locator.clone(), signer.clone()); diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index b972d3383e..37cc02669a 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -38,8 +38,8 @@ pub struct CosmosMerkleTreeHook { impl CosmosMerkleTreeHook { /// create new Cosmos MerkleTreeHook agent - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); Self { domain: locator.domain.clone(), @@ -189,7 +189,7 @@ impl CosmosMerkleTreeHookIndexer { pub fn new( conf: ConnectionConf, locator: ContractLocator, - signer: Signer, + signer: Option, reorg_period: u32, ) -> ChainResult { let indexer = CosmosWasmIndexer::new( diff --git a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs index 7277c7737e..0af9065eb0 100644 --- a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs @@ -17,23 +17,19 @@ use crate::payloads::multisig_ism::{self, VerifyInfoRequest, VerifyInfoRequestIn /// A reference to a MultisigIsm contract on some Cosmos chain #[derive(Debug)] pub struct CosmosMultisigIsm { - _conf: ConnectionConf, domain: HyperlaneDomain, address: H256, - _signer: Signer, provider: Box, } impl CosmosMultisigIsm { /// create a new instance of CosmosMultisigIsm - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); Self { - _conf: conf, domain: locator.domain.clone(), address: locator.address, - _signer: signer, provider: Box::new(provider), } } diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index a39db5a8b0..91626bd609 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -19,9 +19,7 @@ use cosmrs::proto::traits::Message; use cosmrs::tx::{self, Fee, MessageExt, SignDoc, SignerInfo}; use cosmrs::{Amount, Coin}; -use hyperlane_core::{ - ChainCommunicationError, ChainResult, ContractLocator, HyperlaneDomain, H256, U256, -}; +use hyperlane_core::{ChainCommunicationError, ChainResult, ContractLocator, H256, U256}; use serde::Serialize; use crate::address::CosmosAddress; @@ -86,17 +84,15 @@ pub trait WasmProvider: Send + Sync { /// Cosmwasm GRPC Provider pub struct WasmGrpcProvider { conf: ConnectionConf, - _domain: HyperlaneDomain, address: H256, - signer: Signer, + signer: Option, } impl WasmGrpcProvider { /// create new Cosmwasm GRPC Provider - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { Self { conf, - _domain: locator.domain.clone(), address: locator.address, signer, } @@ -110,6 +106,12 @@ impl WasmGrpcProvider { let cosmos_address = CosmosAddress::from_h256(self.address, &self.conf.get_prefix())?; Ok(cosmos_address.address()) } + + fn get_signer(&self) -> ChainResult { + self.signer + .clone() + .ok_or(ChainCommunicationError::SignerUnavailable) + } } #[async_trait] @@ -219,14 +221,14 @@ impl WasmProvider for WasmGrpcProvider { where I: IntoIterator + Send + Sync, { - let account_info = self.account_query(self.signer.address.clone()).await?; + let signer = self.get_signer()?; + let account_info = self.account_query(signer.address.clone()).await?; - let private_key = self.signer.signing_key()?; + let private_key = signer.signing_key()?; let public_key = private_key.public_key(); let tx_body = tx::Body::new(msgs, "", 9000000u32); - let signer_info = - SignerInfo::single_direct(Some(self.signer.public_key), account_info.sequence); + let signer_info = SignerInfo::single_direct(Some(signer.public_key), account_info.sequence); let gas_limit: u64 = gas_limit.unwrap_or(U256::from(300000u64)).as_u64(); @@ -255,10 +257,11 @@ impl WasmProvider for WasmGrpcProvider { where T: Serialize + Send + Sync, { + let signer = self.get_signer()?; let mut client = TxServiceClient::connect(self.get_conn_url()?).await?; let msgs = vec![MsgExecuteContract { - sender: self.signer.address.clone(), + sender: signer.address, contract: self.get_contract_addr()?, msg: serde_json::to_string(&payload)?.as_bytes().to_vec(), funds: vec![], @@ -289,8 +292,9 @@ impl WasmProvider for WasmGrpcProvider { where T: Serialize + Send + Sync, { + let signer = self.get_signer()?; let msg = MsgExecuteContract { - sender: self.signer.address.clone(), + sender: signer.address, contract: self.get_contract_addr()?, msg: serde_json::to_string(&payload)?.as_bytes().to_vec(), funds: vec![], diff --git a/rust/chains/hyperlane-cosmos/src/routing_ism.rs b/rust/chains/hyperlane-cosmos/src/routing_ism.rs index 497aedcc87..dc0a8e1041 100644 --- a/rust/chains/hyperlane-cosmos/src/routing_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/routing_ism.rs @@ -27,8 +27,8 @@ pub struct CosmosRoutingIsm { impl CosmosRoutingIsm { /// create a new instance of CosmosRoutingIsm - pub fn new(conf: &ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + pub fn new(conf: &ConnectionConf, locator: ContractLocator, signer: Option) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); Self { domain: locator.domain.clone(), diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index 59a98a7462..aa39eee5b6 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -20,23 +20,19 @@ use crate::{ /// A reference to a ValidatorAnnounce contract on some Cosmos chain #[derive(Debug)] pub struct CosmosValidatorAnnounce { - _conf: ConnectionConf, domain: HyperlaneDomain, address: H256, - _signer: Signer, provider: Box, } impl CosmosValidatorAnnounce { /// create a new instance of CosmosValidatorAnnounce - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); Self { - _conf: conf, domain: locator.domain.clone(), address: locator.address, - _signer: signer, provider: Box::new(provider), } } diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index 8ca4a1cda1..88120f3f27 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -149,7 +149,7 @@ impl ChainConf { Ok(Box::new(h_cosmos::CosmosMailbox::new( conf.clone(), locator.clone(), - signer.clone().expect("Cosmos signer not configured"), + signer.clone(), )) as Box) } } @@ -184,12 +184,9 @@ impl ChainConf { .map_err(Into::into) } ChainConnectionConf::Cosmos(conf) => { - let signer = self.cosmos_signer().await.context(ctx)?.unwrap(); - let hook = h_cosmos::CosmosMerkleTreeHook::new( - conf.clone(), - locator.clone(), - signer.clone(), - ); + let signer = self.cosmos_signer().await.context(ctx)?; + let hook = + h_cosmos::CosmosMerkleTreeHook::new(conf.clone(), locator.clone(), signer); Ok(Box::new(hook) as Box) } @@ -223,11 +220,11 @@ impl ChainConf { Ok(indexer as Box>) } ChainConnectionConf::Cosmos(conf) => { - let signer = self.cosmos_signer().await.context(ctx)?.unwrap(); + let signer = self.cosmos_signer().await.context(ctx)?; let indexer = Box::new(h_cosmos::CosmosMailboxIndexer::new( conf.clone(), locator, - signer.clone(), + signer, self.reorg_period, )?); Ok(indexer as Box>) @@ -262,7 +259,7 @@ impl ChainConf { Ok(indexer as Box>) } ChainConnectionConf::Cosmos(conf) => { - let signer = self.cosmos_signer().await.context(ctx)?.unwrap(); + let signer = self.cosmos_signer().await.context(ctx)?; let indexer = Box::new(h_cosmos::CosmosMailboxIndexer::new( conf.clone(), locator, @@ -306,7 +303,7 @@ impl ChainConf { let paymaster = Box::new(h_cosmos::CosmosInterchainGasPaymaster::new( conf.clone(), locator.clone(), - signer.unwrap().clone(), + signer, )); Ok(paymaster as Box) } @@ -389,7 +386,7 @@ impl ChainConf { conf.clone(), locator, // TODO: remove signer requirement entirely - signer.unwrap().clone(), + signer, self.reorg_period, )?); Ok(indexer as Box>) @@ -420,7 +417,7 @@ impl ChainConf { let va = Box::new(h_cosmos::CosmosValidatorAnnounce::new( conf.clone(), locator.clone(), - signer.unwrap().clone(), + signer, )); Ok(va as Box) @@ -460,9 +457,7 @@ impl ChainConf { ChainConnectionConf::Cosmos(conf) => { let signer = self.cosmos_signer().await.context(ctx)?; let ism = Box::new(h_cosmos::CosmosInterchainSecurityModule::new( - conf, - locator, - signer.unwrap(), + conf, locator, signer, )); Ok(ism as Box) } @@ -496,7 +491,7 @@ impl ChainConf { let ism = Box::new(h_cosmos::CosmosMultisigIsm::new( conf.clone(), locator.clone(), - signer.unwrap().clone(), + signer, )); Ok(ism as Box) } @@ -530,7 +525,7 @@ impl ChainConf { let ism = Box::new(h_cosmos::CosmosRoutingIsm::new( &conf.clone(), locator.clone(), - signer.unwrap().clone(), + signer, )); Ok(ism as Box) } @@ -564,7 +559,7 @@ impl ChainConf { let ism = Box::new(h_cosmos::CosmosAggregationIsm::new( conf.clone(), locator.clone(), - signer.unwrap().clone(), + signer, )); Ok(ism as Box)