From 8fa2fa07091ec1383796b4f3342876d71025223d Mon Sep 17 00:00:00 2001 From: yito88 Date: Sat, 1 Jun 2024 00:53:39 +0200 Subject: [PATCH 1/5] gas estimation --- crates/relayer/src/chain/namada/error.rs | 4 ++ crates/relayer/src/chain/namada/query.rs | 6 ++ crates/relayer/src/chain/namada/tx.rs | 80 +++++++++++++++++++++++- 3 files changed, 87 insertions(+), 3 deletions(-) diff --git a/crates/relayer/src/chain/namada/error.rs b/crates/relayer/src/chain/namada/error.rs index 85f5d46527..4de21c83c2 100644 --- a/crates/relayer/src/chain/namada/error.rs +++ b/crates/relayer/src/chain/namada/error.rs @@ -6,6 +6,10 @@ define_error! { { raw: String } |e| { format!("Namada address decoding failed for {}", e.raw) }, + AmountParseError + [ TraceError ] + |_| { "Amount parse error" }, + DenomNotFound { denom: String } |e| { format!("No denom for {}", e.denom) }, diff --git a/crates/relayer/src/chain/namada/query.rs b/crates/relayer/src/chain/namada/query.rs index 222f6f3db3..6f2942fa2e 100644 --- a/crates/relayer/src/chain/namada/query.rs +++ b/crates/relayer/src/chain/namada/query.rs @@ -11,6 +11,7 @@ use namada_sdk::events::Event as NamadaEvent; use namada_sdk::queries::{Client as SdkClient, RPC}; use namada_sdk::rpc; use namada_sdk::storage::{BlockHeight, Epoch, Key, PrefixValue}; +use namada_sdk::token::Denomination; use namada_sdk::tx::data::ResultCode; use namada_sdk::tx::event::Code as CodeAttr; use namada_sdk::Namada; @@ -293,4 +294,9 @@ impl NamadaChain { String::try_from_slice(&pair.value).map_err(|e| Error::namada(NamadaError::borsh_decode(e))) } + + /// Query the denomination of the given token + pub fn query_token_denom(&self, token: &Address) -> Option { + self.rt.block_on(rpc::query_denom(self.ctx.client(), token)) + } } diff --git a/crates/relayer/src/chain/namada/tx.rs b/crates/relayer/src/chain/namada/tx.rs index defa6e6e78..c1bb814382 100644 --- a/crates/relayer/src/chain/namada/tx.rs +++ b/crates/relayer/src/chain/namada/tx.rs @@ -6,6 +6,7 @@ use std::time::Instant; use ibc_proto::google::protobuf::Any; use itertools::Itertools; +use namada_ibc::{MsgAcknowledgement, MsgRecvPacket, MsgTimeout}; use namada_sdk::address::{Address, ImplicitAddress}; use namada_sdk::args::{self, TxBuilder}; use namada_sdk::args::{InputAmount, Tx as TxArgs, TxCustom}; @@ -19,11 +20,11 @@ use namada_sdk::ibc::core::channel::types::msgs::{ MsgTimeout as IbcMsgTimeout, ACKNOWLEDGEMENT_TYPE_URL, RECV_PACKET_TYPE_URL, TIMEOUT_TYPE_URL, }; use namada_sdk::ibc::core::host::types::identifiers::{ChannelId, PortId}; -use namada_ibc::{MsgAcknowledgement, MsgRecvPacket, MsgTimeout}; use namada_sdk::masp::{PaymentAddress, TransferTarget}; use namada_sdk::masp_primitives::transaction::Transaction as MaspTransaction; +use namada_sdk::tx::ProcessTxResponse; use namada_sdk::{signing, tx, Namada}; -use namada_token::ShieldingTransfer; +use namada_token::{Amount, DenominatedAmount, ShieldingTransfer}; use tendermint_proto::Protobuf; use tendermint_rpc::endpoint::broadcast::tx_sync::Response; use tracing::{debug, debug_span, trace}; @@ -50,7 +51,7 @@ impl NamadaChain { let rt = self.rt.clone(); rt.block_on(self.submit_reveal_aux(&tx_args, &relayer_addr))?; - let args = TxCustom { + let mut args = TxCustom { tx: tx_args.clone(), code_path: Some(PathBuf::from(tx::TX_IBC_WASM)), data_path: None, @@ -75,6 +76,14 @@ impl NamadaChain { (), )) .map_err(NamadaError::namada)?; + + // Fee + let (fee_token, fee_amount) = self.estimate_fee(tx.clone(), &args.tx)?; + args.tx = args.tx.fee_token(fee_token); + if let Some(amount) = fee_amount { + args.tx = args.tx.fee_amount(amount.into()); + } + let tx_header_hash = tx.header_hash().to_string(); let response = rt .block_on(self.ctx.submit(tx, &args.tx)) @@ -284,6 +293,71 @@ impl NamadaChain { } } + fn estimate_fee( + &self, + tx: tx::Tx, + args: &TxArgs, + ) -> Result<(Address, Option), Error> { + let chain_id = self.config().id.clone(); + + let args = args.clone().dry_run_wrapper(true); + let response = self + .rt + .block_on(self.ctx.submit(tx, &args)) + .map_err(NamadaError::namada)?; + debug!("DEBUG: {response:?}"); + let estimated_gas = { + match response { + ProcessTxResponse::DryRun(ref result) => result.gas_used.into(), + _ => unreachable!("Unexpected response"), + } + }; + if let Some(max_gas) = self.config().max_gas { + if estimated_gas > max_gas { + debug!( + id = %chain_id, estimated = ?estimated_gas, max_gas, + "send_tx: estimated gas is higher than max gas" + ); + + return Err(Error::tx_simulate_gas_estimate_exceeded( + chain_id, + estimated_gas, + max_gas, + )); + } + } + + let fee_token_str = self.config().gas_price.denom.clone(); + let fee_token = Address::from_str(&fee_token_str) + .map_err(|_| NamadaError::address_decode(fee_token_str.clone()))?; + let token_denom = self + .query_token_denom(&fee_token) + .ok_or_else(|| NamadaError::denom_not_found(fee_token_str))?; + let gas_amount = DenominatedAmount::new(Amount::from_u64(estimated_gas), token_denom); + let gas_price = DenominatedAmount::from_str(&self.config().gas_price.price.to_string()) + .expect("Gas price should be parsable"); + let gas_multiplier = if let Some(gas_multiplier) = self.config().gas_multiplier { + DenominatedAmount::from_str(&gas_multiplier.to_f64().to_string()) + .expect("Gas multiplier should be parsable") + } else { + let amount = + Amount::from_uint(1, token_denom).map_err(NamadaError::amount_parse_error)?; + DenominatedAmount::new(amount, token_denom) + }; + let fee_amount = gas_amount + .checked_mul(gas_price) + .and_then(|a| a.checked_mul(gas_multiplier)); + + debug!( + id = %chain_id, + "send_tx: using {} gas, fee {:?}", + estimated_gas, + fee_amount.map(|a| a.to_string()).unwrap_or("overflowed".to_string()), + ); + + Ok((fee_token, fee_amount)) + } + pub fn wait_for_block_commits( &self, tx_sync_results: &mut [TxSyncResult], From 2eb457c90b084879f2ed361559c1b662ce04facc Mon Sep 17 00:00:00 2001 From: yito88 Date: Wed, 5 Jun 2024 11:32:25 +0200 Subject: [PATCH 2/5] add error --- crates/relayer/src/chain/namada/error.rs | 4 +++ crates/relayer/src/chain/namada/tx.rs | 31 +++++++++++++--------- e2e/namada-simple-transfers | 33 +++++++++++++++++++----- scripts/setup-namada | 6 ++--- 4 files changed, 53 insertions(+), 21 deletions(-) diff --git a/crates/relayer/src/chain/namada/error.rs b/crates/relayer/src/chain/namada/error.rs index 4de21c83c2..9a0fea41c7 100644 --- a/crates/relayer/src/chain/namada/error.rs +++ b/crates/relayer/src/chain/namada/error.rs @@ -25,6 +25,10 @@ define_error! { BorshDecode [ TraceError ] |_| { "borsh decoding failed" }, + + DryRun + { tx_result: namada_sdk::tx::data::TxResult } + |e| { format!("Dry run to simulate a transaction failed: {}", e.tx_result) }, } } diff --git a/crates/relayer/src/chain/namada/tx.rs b/crates/relayer/src/chain/namada/tx.rs index c1bb814382..9e7dcdd985 100644 --- a/crates/relayer/src/chain/namada/tx.rs +++ b/crates/relayer/src/chain/namada/tx.rs @@ -51,14 +51,13 @@ impl NamadaChain { let rt = self.rt.clone(); rt.block_on(self.submit_reveal_aux(&tx_args, &relayer_addr))?; - let mut args = TxCustom { + let args = TxCustom { tx: tx_args.clone(), code_path: Some(PathBuf::from(tx::TX_IBC_WASM)), data_path: None, serialized_tx: None, owner: relayer_addr.clone(), }; - let mut txs = Vec::new(); for msg in msgs { let (mut tx, signing_data) = rt @@ -70,7 +69,7 @@ impl NamadaChain { let (mut tx, signing_data) = tx::build_batch(txs).map_err(NamadaError::namada)?; rt.block_on(self.ctx.sign( &mut tx, - &args.tx, + &tx_args, signing_data.first().unwrap().clone(), signing::default_sign, (), @@ -78,15 +77,15 @@ impl NamadaChain { .map_err(NamadaError::namada)?; // Fee - let (fee_token, fee_amount) = self.estimate_fee(tx.clone(), &args.tx)?; - args.tx = args.tx.fee_token(fee_token); + let (fee_token, fee_amount) = self.estimate_fee(tx.clone(), &tx_args)?; + let mut tx_args = tx_args.fee_token(fee_token); if let Some(amount) = fee_amount { - args.tx = args.tx.fee_amount(amount.into()); + tx_args = tx_args.fee_amount(amount.into()); } let tx_header_hash = tx.header_hash().to_string(); let response = rt - .block_on(self.ctx.submit(tx, &args.tx)) + .block_on(self.ctx.submit(tx, &tx_args)) .map_err(NamadaError::namada)?; match response { @@ -305,12 +304,20 @@ impl NamadaChain { .rt .block_on(self.ctx.submit(tx, &args)) .map_err(NamadaError::namada)?; - debug!("DEBUG: {response:?}"); - let estimated_gas = { - match response { - ProcessTxResponse::DryRun(ref result) => result.gas_used.into(), - _ => unreachable!("Unexpected response"), + let estimated_gas = match response { + ProcessTxResponse::DryRun(result) => { + if result + .batch_results + .0 + .iter() + .all(|(_, r)| matches!(&r, Ok(result) if result.is_accepted())) + { + result.gas_used.into() + } else { + return Err(Error::namada(NamadaError::dry_run(result))); + } } + _ => unreachable!("Unexpected response"), }; if let Some(max_gas) = self.config().max_gas { if estimated_gas > max_gas { diff --git a/e2e/namada-simple-transfers b/e2e/namada-simple-transfers index abba5f10da..e09e959920 100755 --- a/e2e/namada-simple-transfers +++ b/e2e/namada-simple-transfers @@ -45,10 +45,34 @@ function init_relayer_balance() { --node ${ledger_addr} } +function wait_for_relaying() { + local chain_id=$1 + + for i in {1..20} + do + result=$(cargo run --bin hermes -- --config config_for_namada.toml \ + query packet pending \ + --chain ${chain_id} \ + --channel channel-0 \ + --port transfer) + + echo ${result} + if [[ "${result}" =~ "=" ]]; + then + echo "Waiting for packet relaying" + sleep 5 + else + echo "All packets have been relayed" + break + fi + done +} + # ==== main ==== # Run 2 Namada chains ${HERMES_DIR}/scripts/setup-namada ${NAMADA_DIR} +sleep 5 cd ${HERMES_DIR} ids=$(grep "id" config_for_namada.toml | awk -F"'" '/^id/ {print $2}') @@ -238,8 +262,7 @@ ${NAMADAC} --base-dir ${base_dir_b} ibc-transfer \ --channel-id channel-0 \ --node ${LEDGER_ADDR_B} -# wait for relaying -sleep 15 +wait_for_relaying ${chain_a} echo "==== Balances on chain A ====" balance=$(${NAMADAC} --base-dir ${base_dir_a} balance \ @@ -295,8 +318,7 @@ ${NAMADAC} --base-dir ${base_dir_a} ibc-transfer \ --gas-payer relayer \ --node ${LEDGER_ADDR_A} -# wait for relaying -sleep 40 +wait_for_relaying ${chain_a} echo "==== Balance of shielded_a on chain A ====" ${NAMADAC} --base-dir ${base_dir_a} shielded-sync \ @@ -373,8 +395,7 @@ ${NAMADAC} --base-dir ${base_dir_b} ibc-transfer \ --channel-id channel-0 \ --node ${LEDGER_ADDR_B} -# wait for relaying -sleep 40 +wait_for_relaying ${chain_a} echo "==== Balances of shielded_a on chain A ====" ${NAMADAC} --base-dir ${base_dir_a} shielded-sync \ diff --git a/scripts/setup-namada b/scripts/setup-namada index 313a568c72..4d5bd341c5 100755 --- a/scripts/setup-namada +++ b/scripts/setup-namada @@ -32,7 +32,7 @@ LEDGER_ADDR_B="http://127.0.0.1:28657" HERMES_CONFIG_TEMPLATE=" [global] -log_level = 'info' +log_level = 'debug' [mode] @@ -67,7 +67,7 @@ event_source = { mode = 'push', url = 'ws://127.0.0.1:27657/websocket', batch_de account_prefix = '' key_name = 'relayer' store_prefix = 'ibc' -gas_price = { price = 0.001, denom = '_FEE_TOKEN_A_' } +gas_price = { price = 0.0000001, denom = '_FEE_TOKEN_A_' } [[chains]] id = '_CHAIN_ID_B_' @@ -78,7 +78,7 @@ event_source = { mode = 'push', url = 'ws://127.0.0.1:28657/websocket', batch_de account_prefix = '' key_name = 'relayer' store_prefix = 'ibc' -gas_price = { price = 0.001, denom = '_FEE_TOKEN_B_' } +gas_price = { price = 0.000001, denom = '_FEE_TOKEN_B_' } " function make_genesis() { From 34a89bf119bc8146f570735e5187e47b8ae5292c Mon Sep 17 00:00:00 2001 From: yito88 Date: Thu, 6 Jun 2024 17:07:19 +0200 Subject: [PATCH 3/5] adjust gas --- crates/relayer/src/chain/cosmos/gas.rs | 10 +- crates/relayer/src/chain/namada/error.rs | 4 - crates/relayer/src/chain/namada/query.rs | 6 -- crates/relayer/src/chain/namada/tx.rs | 117 ++++++++++++++--------- e2e/namada-simple-transfers | 6 +- scripts/setup-namada | 2 +- 6 files changed, 80 insertions(+), 65 deletions(-) diff --git a/crates/relayer/src/chain/cosmos/gas.rs b/crates/relayer/src/chain/cosmos/gas.rs index 07b4b6a20f..a9b6ccdeac 100644 --- a/crates/relayer/src/chain/cosmos/gas.rs +++ b/crates/relayer/src/chain/cosmos/gas.rs @@ -117,16 +117,16 @@ pub fn mul_floor(a: u64, f: f64) -> BigInt { (f * a).floor().to_integer() } -struct AdjustGas { - gas_multiplier: f64, - max_gas: u64, - gas_amount: u64, +pub struct AdjustGas { + pub gas_multiplier: f64, + pub max_gas: u64, + pub gas_amount: u64, } /// Adjusts the fee based on the configured `gas_multiplier` to prevent out of gas errors. /// The actual gas cost, when a transaction is executed, may be slightly higher than the /// one returned by the simulation. -fn adjust_estimated_gas( +pub fn adjust_estimated_gas( AdjustGas { gas_multiplier, max_gas, diff --git a/crates/relayer/src/chain/namada/error.rs b/crates/relayer/src/chain/namada/error.rs index 9a0fea41c7..5c3a76f941 100644 --- a/crates/relayer/src/chain/namada/error.rs +++ b/crates/relayer/src/chain/namada/error.rs @@ -6,10 +6,6 @@ define_error! { { raw: String } |e| { format!("Namada address decoding failed for {}", e.raw) }, - AmountParseError - [ TraceError ] - |_| { "Amount parse error" }, - DenomNotFound { denom: String } |e| { format!("No denom for {}", e.denom) }, diff --git a/crates/relayer/src/chain/namada/query.rs b/crates/relayer/src/chain/namada/query.rs index 6f2942fa2e..222f6f3db3 100644 --- a/crates/relayer/src/chain/namada/query.rs +++ b/crates/relayer/src/chain/namada/query.rs @@ -11,7 +11,6 @@ use namada_sdk::events::Event as NamadaEvent; use namada_sdk::queries::{Client as SdkClient, RPC}; use namada_sdk::rpc; use namada_sdk::storage::{BlockHeight, Epoch, Key, PrefixValue}; -use namada_sdk::token::Denomination; use namada_sdk::tx::data::ResultCode; use namada_sdk::tx::event::Code as CodeAttr; use namada_sdk::Namada; @@ -294,9 +293,4 @@ impl NamadaChain { String::try_from_slice(&pair.value).map_err(|e| Error::namada(NamadaError::borsh_decode(e))) } - - /// Query the denomination of the given token - pub fn query_token_denom(&self, token: &Address) -> Option { - self.rt.block_on(rpc::query_denom(self.ctx.client(), token)) - } } diff --git a/crates/relayer/src/chain/namada/tx.rs b/crates/relayer/src/chain/namada/tx.rs index 9e7dcdd985..a687f3ef5d 100644 --- a/crates/relayer/src/chain/namada/tx.rs +++ b/crates/relayer/src/chain/namada/tx.rs @@ -22,13 +22,15 @@ use namada_sdk::ibc::core::channel::types::msgs::{ use namada_sdk::ibc::core::host::types::identifiers::{ChannelId, PortId}; use namada_sdk::masp::{PaymentAddress, TransferTarget}; use namada_sdk::masp_primitives::transaction::Transaction as MaspTransaction; -use namada_sdk::tx::ProcessTxResponse; +use namada_sdk::tx::{prepare_tx, ProcessTxResponse}; use namada_sdk::{signing, tx, Namada}; -use namada_token::{Amount, DenominatedAmount, ShieldingTransfer}; +use namada_token::ShieldingTransfer; use tendermint_proto::Protobuf; use tendermint_rpc::endpoint::broadcast::tx_sync::Response; use tracing::{debug, debug_span, trace}; +use crate::chain::cosmos::gas::{adjust_estimated_gas, AdjustGas}; +use crate::chain::cosmos::types::gas::default_gas_from_config; use crate::chain::cosmos::types::tx::{TxStatus, TxSyncResult}; use crate::chain::cosmos::wait::all_tx_results_found; use crate::chain::endpoint::ChainEndpoint; @@ -47,7 +49,9 @@ impl NamadaChain { let tx_args = self.make_tx_args()?; - let relayer_addr = self.get_key()?.address; + let relayer_key = self.get_key()?; + let relayer_addr = relayer_key.address; + let rt = self.rt.clone(); rt.block_on(self.submit_reveal_aux(&tx_args, &relayer_addr))?; @@ -67,22 +71,41 @@ impl NamadaChain { txs.push((tx, signing_data)); } let (mut tx, signing_data) = tx::build_batch(txs).map_err(NamadaError::namada)?; + let signing_data = signing_data.first().expect("SigningData should exist"); + + // Estimate the fee with dry-run + let (fee_token, gas_limit, fee_amount) = + self.estimate_fee(tx.clone(), &tx_args, signing_data)?; + // Set the estimated fee + let tx_args = tx_args + .fee_token(fee_token) + .gas_limit(gas_limit.into()) + .fee_amount( + fee_amount + .to_string() + .parse() + .expect("Fee should be parsable"), + ); + let fee_amount = rt + .block_on(signing::validate_fee(&self.ctx, &tx_args)) + .map_err(NamadaError::namada)?; + rt.block_on(prepare_tx( + &tx_args, + &mut tx, + fee_amount, + relayer_key.secret_key.to_public(), + )) + .map_err(NamadaError::namada)?; + rt.block_on(self.ctx.sign( &mut tx, &tx_args, - signing_data.first().unwrap().clone(), + signing_data.clone(), signing::default_sign, (), )) .map_err(NamadaError::namada)?; - // Fee - let (fee_token, fee_amount) = self.estimate_fee(tx.clone(), &tx_args)?; - let mut tx_args = tx_args.fee_token(fee_token); - if let Some(amount) = fee_amount { - tx_args = tx_args.fee_amount(amount.into()); - } - let tx_header_hash = tx.header_hash().to_string(); let response = rt .block_on(self.ctx.submit(tx, &tx_args)) @@ -294,12 +317,23 @@ impl NamadaChain { fn estimate_fee( &self, - tx: tx::Tx, + mut tx: tx::Tx, args: &TxArgs, - ) -> Result<(Address, Option), Error> { + signing_data: &signing::SigningTxData, + ) -> Result<(Address, u64, f64), Error> { let chain_id = self.config().id.clone(); let args = args.clone().dry_run_wrapper(true); + self.rt + .block_on(self.ctx.sign( + &mut tx, + &args, + signing_data.clone(), + signing::default_sign, + (), + )) + .map_err(NamadaError::namada)?; + let response = self .rt .block_on(self.ctx.submit(tx, &args)) @@ -312,57 +346,48 @@ impl NamadaChain { .iter() .all(|(_, r)| matches!(&r, Ok(result) if result.is_accepted())) { - result.gas_used.into() + // Convert with the decimal scale of Gas units + u64::from_str(&result.gas_used.to_string()).expect("Gas should be parsable") } else { return Err(Error::namada(NamadaError::dry_run(result))); } } _ => unreachable!("Unexpected response"), }; - if let Some(max_gas) = self.config().max_gas { - if estimated_gas > max_gas { - debug!( - id = %chain_id, estimated = ?estimated_gas, max_gas, - "send_tx: estimated gas is higher than max gas" - ); + let max_gas = default_gas_from_config(self.config()); + if estimated_gas > max_gas { + debug!( + id = %chain_id, estimated = ?estimated_gas, max_gas, + "send_tx: estimated gas is higher than max gas" + ); - return Err(Error::tx_simulate_gas_estimate_exceeded( - chain_id, - estimated_gas, - max_gas, - )); - } + return Err(Error::tx_simulate_gas_estimate_exceeded( + chain_id, + estimated_gas, + max_gas, + )); } let fee_token_str = self.config().gas_price.denom.clone(); let fee_token = Address::from_str(&fee_token_str) .map_err(|_| NamadaError::address_decode(fee_token_str.clone()))?; - let token_denom = self - .query_token_denom(&fee_token) - .ok_or_else(|| NamadaError::denom_not_found(fee_token_str))?; - let gas_amount = DenominatedAmount::new(Amount::from_u64(estimated_gas), token_denom); - let gas_price = DenominatedAmount::from_str(&self.config().gas_price.price.to_string()) - .expect("Gas price should be parsable"); - let gas_multiplier = if let Some(gas_multiplier) = self.config().gas_multiplier { - DenominatedAmount::from_str(&gas_multiplier.to_f64().to_string()) - .expect("Gas multiplier should be parsable") - } else { - let amount = - Amount::from_uint(1, token_denom).map_err(NamadaError::amount_parse_error)?; - DenominatedAmount::new(amount, token_denom) - }; - let fee_amount = gas_amount - .checked_mul(gas_price) - .and_then(|a| a.checked_mul(gas_multiplier)); + let gas_price = self.config().gas_price.price; + let gas_multiplier = self.config().gas_multiplier.unwrap_or_default().to_f64(); + + let adjusted_gas = adjust_estimated_gas(AdjustGas { + gas_multiplier, + max_gas, + gas_amount: estimated_gas, + }); debug!( id = %chain_id, - "send_tx: using {} gas, fee {:?}", + "send_tx: using {} gas, gas_price {:?}", estimated_gas, - fee_amount.map(|a| a.to_string()).unwrap_or("overflowed".to_string()), + gas_price, ); - Ok((fee_token, fee_amount)) + Ok((fee_token, adjusted_gas, gas_price)) } pub fn wait_for_block_commits( diff --git a/e2e/namada-simple-transfers b/e2e/namada-simple-transfers index e09e959920..935217127c 100755 --- a/e2e/namada-simple-transfers +++ b/e2e/namada-simple-transfers @@ -4,7 +4,7 @@ # `make build` and `make build-wasm-scripts` on Namada directory in advance # Run with `namada-simple-transfers ${namada_dir}` -set -ex +set -e NAMADA_DIR=$1 if [ -z "${NAMADA_DIR}" ] @@ -59,10 +59,10 @@ function wait_for_relaying() { echo ${result} if [[ "${result}" =~ "=" ]]; then - echo "Waiting for packet relaying" + echo "Waiting for packet relaying..." sleep 5 else - echo "All packets have been relayed" + echo "All packets have been relayed!" break fi done diff --git a/scripts/setup-namada b/scripts/setup-namada index 4d5bd341c5..024f706ae8 100755 --- a/scripts/setup-namada +++ b/scripts/setup-namada @@ -67,7 +67,7 @@ event_source = { mode = 'push', url = 'ws://127.0.0.1:27657/websocket', batch_de account_prefix = '' key_name = 'relayer' store_prefix = 'ibc' -gas_price = { price = 0.0000001, denom = '_FEE_TOKEN_A_' } +gas_price = { price = 0.000001, denom = '_FEE_TOKEN_A_' } [[chains]] id = '_CHAIN_ID_B_' From 52eaf79b69c03d011746111474064b8130e57840 Mon Sep 17 00:00:00 2001 From: yito88 Date: Thu, 6 Jun 2024 17:35:11 +0200 Subject: [PATCH 4/5] fix script --- scripts/setup-namada-single-node | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/setup-namada-single-node b/scripts/setup-namada-single-node index 9c33c15cd7..e21d662030 100755 --- a/scripts/setup-namada-single-node +++ b/scripts/setup-namada-single-node @@ -27,7 +27,7 @@ LEDGER_ADDR="http://127.0.0.1:27657" HERMES_CONFIG_TEMPLATE=" [global] -log_level = 'info' +log_level = 'debug' [mode] @@ -62,7 +62,7 @@ event_source = { mode = 'push', url = 'ws://127.0.0.1:27657/websocket', batch_de account_prefix = '' key_name = 'relayer' store_prefix = 'ibc' -gas_price = { price = 0.001, denom = '_FEE_TOKEN_' } +gas_price = { price = 0.000001, denom = '_FEE_TOKEN_' } " function make_genesis() { From f89983908025c26d2cd79b6ea1bcf85a05fb8df7 Mon Sep 17 00:00:00 2001 From: yito88 Date: Tue, 18 Jun 2024 16:19:00 +0200 Subject: [PATCH 5/5] use the default gas setting when gas estimation failure --- crates/relayer/src/chain/namada/tx.rs | 66 +++++++++++++++------------ 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/crates/relayer/src/chain/namada/tx.rs b/crates/relayer/src/chain/namada/tx.rs index a687f3ef5d..9cc8454d7c 100644 --- a/crates/relayer/src/chain/namada/tx.rs +++ b/crates/relayer/src/chain/namada/tx.rs @@ -27,7 +27,7 @@ use namada_sdk::{signing, tx, Namada}; use namada_token::ShieldingTransfer; use tendermint_proto::Protobuf; use tendermint_rpc::endpoint::broadcast::tx_sync::Response; -use tracing::{debug, debug_span, trace}; +use tracing::{debug, debug_span, trace, warn}; use crate::chain::cosmos::gas::{adjust_estimated_gas, AdjustGas}; use crate::chain::cosmos::types::gas::default_gas_from_config; @@ -47,7 +47,7 @@ impl NamadaChain { return Err(Error::send_tx("No message to be batched".to_string())); } - let tx_args = self.make_tx_args()?; + let mut tx_args = self.make_tx_args()?; let relayer_key = self.get_key()?; let relayer_addr = relayer_key.address; @@ -74,28 +74,30 @@ impl NamadaChain { let signing_data = signing_data.first().expect("SigningData should exist"); // Estimate the fee with dry-run - let (fee_token, gas_limit, fee_amount) = - self.estimate_fee(tx.clone(), &tx_args, signing_data)?; - // Set the estimated fee - let tx_args = tx_args - .fee_token(fee_token) - .gas_limit(gas_limit.into()) - .fee_amount( - fee_amount - .to_string() - .parse() - .expect("Fee should be parsable"), - ); - let fee_amount = rt - .block_on(signing::validate_fee(&self.ctx, &tx_args)) + if let Some((fee_token, gas_limit, fee_amount)) = + self.estimate_fee(tx.clone(), &tx_args, signing_data)? + { + // Set the estimated fee + tx_args = tx_args + .fee_token(fee_token) + .gas_limit(gas_limit.into()) + .fee_amount( + fee_amount + .to_string() + .parse() + .expect("Fee should be parsable"), + ); + let fee_amount = rt + .block_on(signing::validate_fee(&self.ctx, &tx_args)) + .map_err(NamadaError::namada)?; + rt.block_on(prepare_tx( + &tx_args, + &mut tx, + fee_amount, + relayer_key.secret_key.to_public(), + )) .map_err(NamadaError::namada)?; - rt.block_on(prepare_tx( - &tx_args, - &mut tx, - fee_amount, - relayer_key.secret_key.to_public(), - )) - .map_err(NamadaError::namada)?; + } rt.block_on(self.ctx.sign( &mut tx, @@ -320,7 +322,7 @@ impl NamadaChain { mut tx: tx::Tx, args: &TxArgs, signing_data: &signing::SigningTxData, - ) -> Result<(Address, u64, f64), Error> { + ) -> Result, Error> { let chain_id = self.config().id.clone(); let args = args.clone().dry_run_wrapper(true); @@ -334,10 +336,16 @@ impl NamadaChain { )) .map_err(NamadaError::namada)?; - let response = self - .rt - .block_on(self.ctx.submit(tx, &args)) - .map_err(NamadaError::namada)?; + let response = match self.rt.block_on(self.ctx.submit(tx, &args)) { + Ok(resp) => resp, + Err(_) => { + warn!( + id = %chain_id, + "send_tx: gas estimation failed, using the default gas limit" + ); + return Ok(None); + } + }; let estimated_gas = match response { ProcessTxResponse::DryRun(result) => { if result @@ -387,7 +395,7 @@ impl NamadaChain { gas_price, ); - Ok((fee_token, adjusted_gas, gas_price)) + Ok(Some((fee_token, adjusted_gas, gas_price))) } pub fn wait_for_block_commits(