From aa04be44473f86ca6e7c1059ba2f70a4c6e36093 Mon Sep 17 00:00:00 2001 From: iqdecay Date: Wed, 1 Nov 2023 19:18:03 +0100 Subject: [PATCH 1/9] refactor: use a single type for transaction status --- packages/fuels-accounts/src/provider.rs | 4 +-- packages/fuels-core/src/types/tx_status.rs | 32 +++++++++++++++++-- .../types/wrappers/transaction_response.rs | 22 ++----------- 3 files changed, 34 insertions(+), 24 deletions(-) diff --git a/packages/fuels-accounts/src/provider.rs b/packages/fuels-accounts/src/provider.rs index 0b7645337..f0474ad74 100644 --- a/packages/fuels-accounts/src/provider.rs +++ b/packages/fuels-accounts/src/provider.rs @@ -268,7 +268,7 @@ impl Provider { TxStatus::Revert { receipts, reason, - id: revert_id, + revert_id, } } TransactionStatus::Submitted { .. } => TxStatus::Submitted, @@ -345,7 +345,7 @@ impl Provider { Some(reason) => TxStatus::Revert { receipts, reason, - id: 0, + revert_id: 0, }, None => TxStatus::Success { receipts }, } diff --git a/packages/fuels-core/src/types/tx_status.rs b/packages/fuels-core/src/types/tx_status.rs index 7b6f7b7cc..ad05697fa 100644 --- a/packages/fuels-core/src/types/tx_status.rs +++ b/packages/fuels-core/src/types/tx_status.rs @@ -2,7 +2,9 @@ use fuel_abi_types::error_codes::{ FAILED_ASSERT_EQ_SIGNAL, FAILED_ASSERT_SIGNAL, FAILED_REQUIRE_SIGNAL, FAILED_SEND_MESSAGE_SIGNAL, FAILED_TRANSFER_TO_ADDRESS_SIGNAL, }; +use fuel_core_client::client::types::TransactionStatus as ClientTransactionStatus; use fuel_tx::Receipt; +use fuel_vm::state::ProgramState; use crate::{ codec::LogDecoder, @@ -21,7 +23,7 @@ pub enum TxStatus { Revert { receipts: Vec, reason: String, - id: u64, + revert_id: u64, }, } @@ -32,7 +34,7 @@ impl TxStatus { Self::Revert { receipts, reason, - id, + revert_id: id, } => Self::map_revert_error(receipts, reason, *id, log_decoder), _ => Ok(()), } @@ -83,3 +85,29 @@ impl TxStatus { } } } +impl From for TxStatus { + fn from(client_status: ClientTransactionStatus) -> Self { + match client_status { + ClientTransactionStatus::Submitted { .. } => TxStatus::Submitted {}, + ClientTransactionStatus::Success { .. } => TxStatus::Success { receipts: vec![] }, + ClientTransactionStatus::Failure { + reason, + program_state, + .. + } => { + let revert_id = program_state + .and_then(|state| match state { + ProgramState::Revert(revert_id) => Some(revert_id), + _ => None, + }) + .expect("Transaction failed without a `revert_id`"); + TxStatus::Revert { + receipts: vec![], + reason, + revert_id, + } + } + ClientTransactionStatus::SqueezedOut { reason } => TxStatus::SqueezedOut { reason }, + } + } +} diff --git a/packages/fuels-core/src/types/wrappers/transaction_response.rs b/packages/fuels-core/src/types/wrappers/transaction_response.rs index 6d8f64d91..87118be29 100644 --- a/packages/fuels-core/src/types/wrappers/transaction_response.rs +++ b/packages/fuels-core/src/types/wrappers/transaction_response.rs @@ -10,23 +10,16 @@ use fuel_tx::Transaction; use fuel_types::Bytes32; use crate::types::transaction::{CreateTransaction, ScriptTransaction, TransactionType}; +use crate::types::tx_status::TxStatus; #[derive(Debug, Clone)] pub struct TransactionResponse { pub transaction: TransactionType, - pub status: TransactionStatus, + pub status: TxStatus, pub block_id: Option, pub time: Option>, } -#[derive(Debug, Clone)] -pub enum TransactionStatus { - Submitted(), - Success(), - Failure(), - SqueezedOut(), -} - impl From for TransactionResponse { fn from(client_response: ClientTransactionResponse) -> Self { let block_id = match &client_response.status { @@ -63,14 +56,3 @@ impl From for TransactionResponse { } } } - -impl From for TransactionStatus { - fn from(client_status: ClientTransactionStatus) -> Self { - match client_status { - ClientTransactionStatus::Submitted { .. } => TransactionStatus::Submitted(), - ClientTransactionStatus::Success { .. } => TransactionStatus::Success(), - ClientTransactionStatus::Failure { .. } => TransactionStatus::Failure(), - ClientTransactionStatus::SqueezedOut { .. } => TransactionStatus::SqueezedOut(), - } - } -} From 87aa2a962b3aae437ff27e3c30ea632b6516b322 Mon Sep 17 00:00:00 2001 From: iqdecay Date: Sun, 5 Nov 2023 15:53:15 +0100 Subject: [PATCH 2/9] test: add std cfg --- packages/fuels-core/src/types/tx_status.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/fuels-core/src/types/tx_status.rs b/packages/fuels-core/src/types/tx_status.rs index ad05697fa..e6d7ca5e7 100644 --- a/packages/fuels-core/src/types/tx_status.rs +++ b/packages/fuels-core/src/types/tx_status.rs @@ -2,8 +2,10 @@ use fuel_abi_types::error_codes::{ FAILED_ASSERT_EQ_SIGNAL, FAILED_ASSERT_SIGNAL, FAILED_REQUIRE_SIGNAL, FAILED_SEND_MESSAGE_SIGNAL, FAILED_TRANSFER_TO_ADDRESS_SIGNAL, }; +#[cfg(feature = "std")] use fuel_core_client::client::types::TransactionStatus as ClientTransactionStatus; use fuel_tx::Receipt; +#[cfg(feature = "std")] use fuel_vm::state::ProgramState; use crate::{ @@ -85,6 +87,7 @@ impl TxStatus { } } } +#[cfg(feature = "std")] impl From for TxStatus { fn from(client_status: ClientTransactionStatus) -> Self { match client_status { From 40f053b2f3304eca52c2e1e0157eddc19f53f252 Mon Sep 17 00:00:00 2001 From: iqdecay Date: Sun, 5 Nov 2023 16:55:42 +0100 Subject: [PATCH 3/9] refactor: use `submit_and_await_commit` API --- packages/fuels-accounts/src/provider.rs | 17 ++++++++++++----- .../src/provider/retryable_client.rs | 4 ++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/packages/fuels-accounts/src/provider.rs b/packages/fuels-accounts/src/provider.rs index f0474ad74..347d678c4 100644 --- a/packages/fuels-accounts/src/provider.rs +++ b/packages/fuels-accounts/src/provider.rs @@ -186,14 +186,17 @@ impl Provider { } /// Sends a transaction to the underlying Provider's client. - pub async fn send_transaction_and_await_commit(&self, tx: T) -> Result { - let tx_id = self.send_transaction(tx.clone()).await?; - self.client.await_transaction_commit(&tx_id).await?; - + pub async fn send_transaction_and_await_commit( + &self, + mut tx: T, + ) -> Result { + self.prepare_transaction_for_sending(&mut tx).await?; + let tx_id = tx.id(self.chain_id()); + let _tx_status = self.client.submit_and_await_commit(&tx.into()).await?; Ok(tx_id) } - pub async fn send_transaction(&self, mut tx: T) -> Result { + async fn prepare_transaction_for_sending(&self, tx: &mut T) -> Result<()> { tx.precompute(&self.chain_id())?; let chain_info = self.chain_info().await?; @@ -207,7 +210,11 @@ impl Provider { } self.validate_transaction(tx.clone()).await?; + Ok(()) + } + pub async fn send_transaction(&self, mut tx: T) -> Result { + self.prepare_transaction_for_sending(&mut tx).await?; Ok(self.client.submit(&tx.into()).await?) } diff --git a/packages/fuels-accounts/src/provider/retryable_client.rs b/packages/fuels-accounts/src/provider/retryable_client.rs index 89db3c1e3..78c95a13b 100644 --- a/packages/fuels-accounts/src/provider/retryable_client.rs +++ b/packages/fuels-accounts/src/provider/retryable_client.rs @@ -61,8 +61,8 @@ impl RetryableClient { self.our_retry(|| self.client.chain_info()).await } - pub async fn await_transaction_commit(&self, id: &TxId) -> io::Result { - self.our_retry(|| self.client.await_transaction_commit(id)) + pub async fn submit_and_await_commit(&self, tx: &Transaction) -> io::Result { + self.our_retry(|| self.client.submit_and_await_commit(tx)) .await } From 23787c9e9807464a4c8fe1ef427972325f3e114c Mon Sep 17 00:00:00 2001 From: iqdecay Date: Mon, 6 Nov 2023 18:53:02 +0100 Subject: [PATCH 4/9] readd removed Api --- packages/fuels-accounts/src/provider/retryable_client.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/fuels-accounts/src/provider/retryable_client.rs b/packages/fuels-accounts/src/provider/retryable_client.rs index 78c95a13b..b2e2c4808 100644 --- a/packages/fuels-accounts/src/provider/retryable_client.rs +++ b/packages/fuels-accounts/src/provider/retryable_client.rs @@ -61,6 +61,10 @@ impl RetryableClient { self.our_retry(|| self.client.chain_info()).await } + pub async fn await_transaction_commit(&self, id: &TxId) -> io::Result { + self.our_retry(|| self.client.await_transaction_commit(id)) + } + pub async fn submit_and_await_commit(&self, tx: &Transaction) -> io::Result { self.our_retry(|| self.client.submit_and_await_commit(tx)) .await From 0c4d92836c18479115804fa08150a512e799904f Mon Sep 17 00:00:00 2001 From: iqdecay Date: Mon, 6 Nov 2023 18:53:49 +0100 Subject: [PATCH 5/9] ierast --- packages/fuels-accounts/src/provider/retryable_client.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/fuels-accounts/src/provider/retryable_client.rs b/packages/fuels-accounts/src/provider/retryable_client.rs index b2e2c4808..64c654ff8 100644 --- a/packages/fuels-accounts/src/provider/retryable_client.rs +++ b/packages/fuels-accounts/src/provider/retryable_client.rs @@ -63,6 +63,7 @@ impl RetryableClient { pub async fn await_transaction_commit(&self, id: &TxId) -> io::Result { self.our_retry(|| self.client.await_transaction_commit(id)) + .await } pub async fn submit_and_await_commit(&self, tx: &Transaction) -> io::Result { From 7d74f2d781196efd7ddcad7ea8b1b50ed9d70d3f Mon Sep 17 00:00:00 2001 From: iqdecay Date: Mon, 6 Nov 2023 19:24:51 +0100 Subject: [PATCH 6/9] add unused api --- packages/fuels-accounts/src/provider.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/fuels-accounts/src/provider.rs b/packages/fuels-accounts/src/provider.rs index 347d678c4..e97f1288c 100644 --- a/packages/fuels-accounts/src/provider.rs +++ b/packages/fuels-accounts/src/provider.rs @@ -218,6 +218,14 @@ impl Provider { Ok(self.client.submit(&tx.into()).await?) } + pub async fn await_transaction_commit(&self, id: TxId) -> Result { + Ok(self + .client + .await_transaction_commit(&id.into()) + .await? + .into()) + } + async fn validate_transaction(&self, tx: T) -> Result<()> { let tolerance = 0.0; let TransactionCost { From 43d525b8464c24033512ba6e90a0e6e53834695c Mon Sep 17 00:00:00 2001 From: iqdecay Date: Mon, 6 Nov 2023 22:01:59 +0100 Subject: [PATCH 7/9] style: appease clippy and all formatting gods --- packages/fuels-accounts/src/provider.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fuels-accounts/src/provider.rs b/packages/fuels-accounts/src/provider.rs index e97f1288c..155dda2b1 100644 --- a/packages/fuels-accounts/src/provider.rs +++ b/packages/fuels-accounts/src/provider.rs @@ -221,7 +221,7 @@ impl Provider { pub async fn await_transaction_commit(&self, id: TxId) -> Result { Ok(self .client - .await_transaction_commit(&id.into()) + .await_transaction_commit(&id) .await? .into()) } From ffa32d87a20fe1d4148b571b12f4d500f82a6672 Mon Sep 17 00:00:00 2001 From: iqdecay Date: Mon, 6 Nov 2023 22:05:08 +0100 Subject: [PATCH 8/9] style: appease clippy and all formatting gods --- packages/fuels-accounts/src/provider.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/fuels-accounts/src/provider.rs b/packages/fuels-accounts/src/provider.rs index 155dda2b1..4bec5197f 100644 --- a/packages/fuels-accounts/src/provider.rs +++ b/packages/fuels-accounts/src/provider.rs @@ -219,11 +219,7 @@ impl Provider { } pub async fn await_transaction_commit(&self, id: TxId) -> Result { - Ok(self - .client - .await_transaction_commit(&id) - .await? - .into()) + Ok(self.client.await_transaction_commit(&id).await?.into()) } async fn validate_transaction(&self, tx: T) -> Result<()> { From 87ec10964d676b2887291a620168b76865cbbe67 Mon Sep 17 00:00:00 2001 From: hal3e Date: Tue, 19 Dec 2023 14:09:12 +0100 Subject: [PATCH 9/9] pr comments --- packages/fuels-accounts/src/account.rs | 28 +++++++++------------ packages/fuels-accounts/src/provider.rs | 26 +++++++++---------- packages/fuels-programs/src/contract.rs | 12 ++++----- packages/fuels-programs/src/script_calls.rs | 3 +-- packages/fuels/tests/predicates.rs | 8 +++--- packages/fuels/tests/providers.rs | 6 ++--- 6 files changed, 39 insertions(+), 44 deletions(-) diff --git a/packages/fuels-accounts/src/account.rs b/packages/fuels-accounts/src/account.rs index 69c2f595a..6ba4d7730 100644 --- a/packages/fuels-accounts/src/account.rs +++ b/packages/fuels-accounts/src/account.rs @@ -16,7 +16,7 @@ use fuels_core::{ errors::{Error, Result}, input::Input, message::Message, - transaction::TxPolicies, + transaction::{Transaction, TxPolicies}, transaction_builders::{ BuildableTransaction, ScriptTransactionBuilder, TransactionBuilder, }, @@ -216,12 +216,11 @@ pub trait Account: ViewOnlyAccount { self.adjust_for_fee(&mut tx_builder, amount).await?; let tx = tx_builder.build(provider).await?; - let tx_id = provider.send_transaction_and_await_commit(tx).await?; + let tx_id = tx.id(provider.chain_id()); - let receipts = provider - .tx_status(&tx_id) - .await? - .take_receipts_checked(None)?; + let tx_status = provider.send_transaction_and_await_commit(tx).await?; + + let receipts = tx_status.take_receipts_checked(None)?; Ok((tx_id, receipts)) } @@ -276,12 +275,10 @@ pub trait Account: ViewOnlyAccount { self.adjust_for_fee(&mut tb, balance).await?; let tx = tb.build(provider).await?; - let tx_id = provider.send_transaction_and_await_commit(tx).await?; + let tx_id = tx.id(provider.chain_id()); + let tx_status = provider.send_transaction_and_await_commit(tx).await?; - let receipts = provider - .tx_status(&tx_id) - .await? - .take_receipts_checked(None)?; + let receipts = tx_status.take_receipts_checked(None)?; Ok((tx_id.to_string(), receipts)) } @@ -311,12 +308,11 @@ pub trait Account: ViewOnlyAccount { self.add_witnessses(&mut tb); self.adjust_for_fee(&mut tb, amount).await?; let tx = tb.build(provider).await?; - let tx_id = provider.send_transaction_and_await_commit(tx).await?; - let receipts = provider - .tx_status(&tx_id) - .await? - .take_receipts_checked(None)?; + let tx_id = tx.id(provider.chain_id()); + let tx_status = provider.send_transaction_and_await_commit(tx).await?; + + let receipts = tx_status.take_receipts_checked(None)?; let nonce = extract_message_nonce(&receipts) .expect("MessageId could not be retrieved from tx receipts."); diff --git a/packages/fuels-accounts/src/provider.rs b/packages/fuels-accounts/src/provider.rs index 3351bc519..8262bf802 100644 --- a/packages/fuels-accounts/src/provider.rs +++ b/packages/fuels-accounts/src/provider.rs @@ -8,8 +8,6 @@ mod supported_versions; use std::sync::Arc; use chrono::{DateTime, Utc}; -#[cfg(feature = "coin-cache")] -use fuel_core_client::client::types::TransactionStatus; use fuel_core_client::client::{ pagination::{PageDirection, PaginatedResult, PaginationRequest}, types::{balance::Balance, contract::ContractBalance}, @@ -200,23 +198,23 @@ impl Provider { pub async fn send_transaction_and_await_commit( &self, mut tx: T, - ) -> Result { + ) -> Result { self.prepare_transaction_for_sending(&mut tx).await?; - let tx_id = tx.id(self.chain_id()); - let _tx_status = self + let tx_status = self .client .submit_and_await_commit(&tx.clone().into()) - .await?; + .await? + .into(); + #[cfg(feature = "coin-cache")] - { - if matches!( - _tx_status, - TransactionStatus::SqueezedOut { .. } | TransactionStatus::Failure { .. } - ) { - self.cache.lock().await.remove_items(tx.used_coins()) - } + if matches!( + tx_status, + TxStatus::SqueezedOut { .. } | TxStatus::Revert { .. } + ) { + self.cache.lock().await.remove_items(tx.used_coins()) } - Ok(tx_id) + + Ok(tx_status) } async fn prepare_transaction_for_sending(&self, tx: &mut T) -> Result<()> { diff --git a/packages/fuels-programs/src/contract.rs b/packages/fuels-programs/src/contract.rs index b6d8d6524..5dad738bc 100644 --- a/packages/fuels-programs/src/contract.rs +++ b/packages/fuels-programs/src/contract.rs @@ -317,8 +317,10 @@ impl Contract { let provider = account.try_provider()?; - let tx_id = provider.send_transaction_and_await_commit(tx).await?; - provider.tx_status(&tx_id).await?.check(None)?; + provider + .send_transaction_and_await_commit(tx) + .await? + .check(None)?; Ok(self.contract_id.into()) } @@ -629,8 +631,7 @@ where let tx_status = if simulate { provider.checked_dry_run(tx).await? } else { - let tx_id = provider.send_transaction_and_await_commit(tx).await?; - provider.tx_status(&tx_id).await? + provider.send_transaction_and_await_commit(tx).await? }; let receipts = tx_status.take_receipts_checked(Some(&self.log_decoder))?; @@ -935,8 +936,7 @@ impl MultiContractCallHandler { let tx_status = if simulate { provider.checked_dry_run(tx).await? } else { - let tx_id = provider.send_transaction_and_await_commit(tx).await?; - provider.tx_status(&tx_id).await? + provider.send_transaction_and_await_commit(tx).await? }; let receipts = tx_status.take_receipts_checked(Some(&self.log_decoder))?; diff --git a/packages/fuels-programs/src/script_calls.rs b/packages/fuels-programs/src/script_calls.rs index 6e8a41594..97f2aa490 100644 --- a/packages/fuels-programs/src/script_calls.rs +++ b/packages/fuels-programs/src/script_calls.rs @@ -233,8 +233,7 @@ where let tx_status = if simulate { self.provider.checked_dry_run(tx).await? } else { - let tx_id = self.provider.send_transaction_and_await_commit(tx).await?; - self.provider.tx_status(&tx_id).await? + self.provider.send_transaction_and_await_commit(tx).await? }; let receipts = tx_status.take_receipts_checked(Some(&self.log_decoder))?; diff --git a/packages/fuels/tests/predicates.rs b/packages/fuels/tests/predicates.rs index 05a87d793..209128c8b 100644 --- a/packages/fuels/tests/predicates.rs +++ b/packages/fuels/tests/predicates.rs @@ -749,8 +749,10 @@ async fn predicate_transfer_non_base_asset() -> Result<()> { wallet.adjust_for_fee(&mut tb, 0).await?; let tx = tb.build(&provider).await?; - let tx_id = provider.send_transaction_and_await_commit(tx).await?; - provider.tx_status(&tx_id).await?.check(None)?; + provider + .send_transaction_and_await_commit(tx) + .await? + .check(None)?; let wallet_balance = wallet.get_asset_balance(&non_base_asset_id).await?; @@ -871,7 +873,7 @@ async fn tx_id_not_changed_after_adding_witnesses() -> Result<()> { tx.append_witness(witness2.into())?; let tx_id_after_witnesses = tx.id(provider.chain_id()); - let tx_id_from_provider = provider.send_transaction_and_await_commit(tx).await?; + let tx_id_from_provider = provider.send_transaction(tx).await?; assert_eq!(tx_id, tx_id_after_witnesses); assert_eq!(tx_id, tx_id_from_provider); diff --git a/packages/fuels/tests/providers.rs b/packages/fuels/tests/providers.rs index d9fdc266f..3eb8340ea 100644 --- a/packages/fuels/tests/providers.rs +++ b/packages/fuels/tests/providers.rs @@ -909,9 +909,9 @@ async fn test_cache_invalidation_on_await() -> Result<()> { tokio::time::pause(); // tx inputs should be cached and then invalidated due to the tx failing - let tx_id = provider.send_transaction_and_await_commit(tx).await?; - let status = provider.tx_status(&tx_id).await?; - assert!(matches!(status, TxStatus::Revert { .. })); + let tx_status = provider.send_transaction_and_await_commit(tx).await?; + + assert!(matches!(tx_status, TxStatus::Revert { .. })); let coins = wallet.get_spendable_resources(BASE_ASSET_ID, 1).await?; assert_eq!(coins.len(), 1);