From ca2de9c06ce95cdeaffb81daa842d8aa71705d8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrzej=20Bro=C5=84ski?= Date: Sun, 29 Dec 2024 06:19:17 +0100 Subject: [PATCH 1/5] Add `Tx` error. --- src/error.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/error.rs b/src/error.rs index 78dfe3c..17cae46 100644 --- a/src/error.rs +++ b/src/error.rs @@ -22,6 +22,8 @@ pub enum Error { Parse(String), #[error("tendermint error: {0}")] Tendermint(#[from] tendermint::Error), + #[error("tx failed with code {0}: {1}")] + Tx(u32, String), #[error("unknown error: {0}")] Unknown(String), } From 4ae8f5aa8f16af4943f5cd211d46025b8cbe9183 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrzej=20Bro=C5=84ski?= Date: Sun, 29 Dec 2024 06:19:42 +0100 Subject: [PATCH 2/5] Handle tx failure. --- src/base_client.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/base_client.rs b/src/base_client.rs index 2a27729..6480d80 100644 --- a/src/base_client.rs +++ b/src/base_client.rs @@ -363,6 +363,10 @@ impl BaseClient { self.wait_for_tx(&hash, Some(tokio::time::Duration::from_secs(10))) .await?; let tx_response: TxResponse = self.get_tx_response(&hash).await?; + let (tx_code, raw_log) = (tx_response.code, tx_response.raw_log); + if tx_code != 0 { + return Err(Error::Tx(tx_code, raw_log)); + } let tx_msg_data = cosmos_sdk_proto::cosmos::base::abci::v1beta1::TxMsgData::decode( &*hex::decode(tx_response.data)?, )?; From ebc3f1e8e1445be2b45ea3efc12537d7d16b7e81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrzej=20Bro=C5=84ski?= Date: Sun, 29 Dec 2024 06:44:54 +0100 Subject: [PATCH 3/5] Move tx error handler to dedicated helper. --- src/base_client.rs | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/base_client.rs b/src/base_client.rs index 6480d80..40fbad1 100644 --- a/src/base_client.rs +++ b/src/base_client.rs @@ -363,10 +363,7 @@ impl BaseClient { self.wait_for_tx(&hash, Some(tokio::time::Duration::from_secs(10))) .await?; let tx_response: TxResponse = self.get_tx_response(&hash).await?; - let (tx_code, raw_log) = (tx_response.code, tx_response.raw_log); - if tx_code != 0 { - return Err(Error::Tx(tx_code, raw_log)); - } + Self::assert_tx_success(&tx_response)?; let tx_msg_data = cosmos_sdk_proto::cosmos::base::abci::v1beta1::TxMsgData::decode( &*hex::decode(tx_response.data)?, )?; @@ -378,6 +375,24 @@ impl BaseClient { } } + /// Checks if Tx did not failed with non-zero code. + /// + /// # Arguments + /// + /// * `tx_response` - TxResponse. + /// + /// # Returns + /// + /// An empty Result or a Tx error. + fn assert_tx_success(tx_response: &TxResponse) -> Result<()> { + let (tx_code, raw_log) = (tx_response.code, tx_response.raw_log.to_owned()); + if tx_code != 0 { + return Err(Error::Tx(tx_code, raw_log)); + } + + Ok(()) + } + /// Retrieves the latest block from the blockchain. /// /// # Returns From 0d3f3162b16a550cf46a32d50064a1f0b4280a46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrzej=20Bro=C5=84ski?= Date: Sun, 29 Dec 2024 06:45:41 +0100 Subject: [PATCH 4/5] Unify tx error handling. --- src/base_client.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/base_client.rs b/src/base_client.rs index 40fbad1..09e0fac 100644 --- a/src/base_client.rs +++ b/src/base_client.rs @@ -331,12 +331,7 @@ impl BaseClient { let resp = resp.into_inner(); log::debug!("broadcast_tx response: {:#?}", resp); let tx_response = resp.tx_response.ok_or("Tx response not found")?; - if tx_response.code != 0 { - return Err(Error::Unknown(format!( - "Transaction failed with code: {} ({})", - tx_response.code, tx_response.raw_log - ))); - } + Self::assert_tx_success(&tx_response)?; // Bump up the local account sequence after successful tx. self.account_sequence = Some(sequence + 1); From dd659f89f8897c2df73192be37fd2a2cac98d4fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrzej=20Bro=C5=84ski?= Date: Sun, 29 Dec 2024 06:51:31 +0100 Subject: [PATCH 5/5] Include tx hash in error. --- src/base_client.rs | 8 ++++++-- src/error.rs | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/base_client.rs b/src/base_client.rs index 09e0fac..40e198f 100644 --- a/src/base_client.rs +++ b/src/base_client.rs @@ -380,9 +380,13 @@ impl BaseClient { /// /// An empty Result or a Tx error. fn assert_tx_success(tx_response: &TxResponse) -> Result<()> { - let (tx_code, raw_log) = (tx_response.code, tx_response.raw_log.to_owned()); + let (tx_hash, tx_code, raw_log) = ( + tx_response.txhash.to_owned(), + tx_response.code, + tx_response.raw_log.to_owned(), + ); if tx_code != 0 { - return Err(Error::Tx(tx_code, raw_log)); + return Err(Error::Tx(tx_hash, tx_code, raw_log)); } Ok(()) diff --git a/src/error.rs b/src/error.rs index 17cae46..43113bf 100644 --- a/src/error.rs +++ b/src/error.rs @@ -22,8 +22,8 @@ pub enum Error { Parse(String), #[error("tendermint error: {0}")] Tendermint(#[from] tendermint::Error), - #[error("tx failed with code {0}: {1}")] - Tx(u32, String), + #[error("tx {0} failed with code {1}: {2}")] + Tx(String, u32, String), #[error("unknown error: {0}")] Unknown(String), }