From 59130859c8ce4bedd709336a24df988eecad4a65 Mon Sep 17 00:00:00 2001 From: Mitch Turner Date: Thu, 22 Jan 2026 14:40:59 -0700 Subject: [PATCH 1/4] wip --- crates/client/src/client/types.rs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/crates/client/src/client/types.rs b/crates/client/src/client/types.rs index 843bb7530bc..a93311c1dd3 100644 --- a/crates/client/src/client/types.rs +++ b/crates/client/src/client/types.rs @@ -119,13 +119,16 @@ pub enum TransactionStatus { time: Tai64, total_gas: u64, total_fee: u64, + transaction_id: TxId, program_state: Option, receipts: Vec, + resolved_outputs: Option>, }, PreconfirmationSuccess { tx_pointer: TxPointer, - total_fee: u64, + time: Tai64, total_gas: u64, + total_fee: u64, transaction_id: TxId, receipts: Option>, resolved_outputs: Option>, @@ -138,14 +141,17 @@ pub enum TransactionStatus { time: Tai64, total_gas: u64, total_fee: u64, - reason: String, - program_state: Option, + transaction_id: TxId, receipts: Vec, + program_state: Option, + resolved_outputs: Option>, + reason: String, }, PreconfirmationFailure { tx_pointer: TxPointer, - total_fee: u64, + time: Tai64, total_gas: u64, + total_fee: u64, transaction_id: TxId, receipts: Option>, resolved_outputs: Option>, @@ -185,6 +191,8 @@ impl TryFrom for TransactionStatus { .collect::, _>>()?, total_gas: s.total_gas.0, total_fee: s.total_fee.0, + transaction_id: Default::default(), + resolved_outputs: None, }, SchemaTxStatus::PreconfirmationSuccessStatus(s) => { TransactionStatus::PreconfirmationSuccess { @@ -212,6 +220,7 @@ impl TryFrom for TransactionStatus { } else { None }, + time: s.time.0, } } SchemaTxStatus::FailureStatus(s) => TransactionStatus::Failure { @@ -226,6 +235,8 @@ impl TryFrom for TransactionStatus { .collect::, _>>()?, total_gas: s.total_gas.0, total_fee: s.total_fee.0, + transaction_id: Default::default(), + resolved_outputs: None, }, SchemaTxStatus::PreconfirmationFailureStatus(s) => { TransactionStatus::PreconfirmationFailure { @@ -254,6 +265,7 @@ impl TryFrom for TransactionStatus { } else { None }, + time: Tai64(), } } SchemaTxStatus::SqueezedOutStatus(s) => { From b7d6e5e78b1a6dff74746a065487a5eedd86b71d Mon Sep 17 00:00:00 2001 From: Mitch Turner Date: Fri, 23 Jan 2026 09:07:45 -0700 Subject: [PATCH 2/4] Add fields to schema and populate, fix tests --- crates/client/assets/schema.sdl | 4 + ...ue_transaction_by_id_query_gql_output.snap | 64 ++++++++++++++ ...sts__transactions_by_owner_gql_output.snap | 64 ++++++++++++++ ...nsactions_connection_query_gql_output.snap | 64 ++++++++++++++ ...nt_transaction_by_id_query_gql_output.snap | 64 ++++++++++++++ crates/client/src/client/schema/tx.rs | 6 ++ crates/client/src/client/types.rs | 28 ++++-- crates/fuel-core/src/schema/tx/types.rs | 85 +++++++++++++++++++ tests/tests/preconfirmations.rs | 2 + tests/tests/preconfirmations_gossip.rs | 2 + 10 files changed, 378 insertions(+), 5 deletions(-) diff --git a/crates/client/assets/schema.sdl b/crates/client/assets/schema.sdl index 33033d3acc5..f72c1f9b734 100644 --- a/crates/client/assets/schema.sdl +++ b/crates/client/assets/schema.sdl @@ -378,6 +378,7 @@ type FailureStatus { receipts: [Receipt!]! totalGas: U64! totalFee: U64! + resolvedOutputs: [ResolvedOutput!] } type FeeParameters { @@ -900,6 +901,7 @@ type Policies { type PreconfirmationFailureStatus { reason: String! + time: Tai64Timestamp! txPointer: TxPointer! totalGas: U64! totalFee: U64! @@ -911,6 +913,7 @@ type PreconfirmationFailureStatus { type PreconfirmationSuccessStatus { txPointer: TxPointer! + time: Tai64Timestamp! totalGas: U64! totalFee: U64! transactionId: TransactionId! @@ -1381,6 +1384,7 @@ type SuccessStatus { receipts: [Receipt!]! totalGas: U64! totalFee: U64! + resolvedOutputs: [ResolvedOutput!] } scalar Tai64Timestamp diff --git a/crates/client/src/client/schema/snapshots/fuel_core_client__client__schema__tx__tests__opaque_transaction_by_id_query_gql_output.snap b/crates/client/src/client/schema/snapshots/fuel_core_client__client__schema__tx__tests__opaque_transaction_by_id_query_gql_output.snap index 568434e2435..20d00e85a0d 100644 --- a/crates/client/src/client/schema/snapshots/fuel_core_client__client__schema__tx__tests__opaque_transaction_by_id_query_gql_output.snap +++ b/crates/client/src/client/schema/snapshots/fuel_core_client__client__schema__tx__tests__opaque_transaction_by_id_query_gql_output.snap @@ -11,6 +11,7 @@ query TransactionQuery($id: TransactionId!) { time } ... on SuccessStatus { + transactionId blockHeight time programState { @@ -49,9 +50,40 @@ query TransactionQuery($id: TransactionId!) { } totalGas totalFee + resolvedOutputs { + utxoId + output { + __typename + ... on CoinOutput { + to + amount + assetId + } + ... on ContractOutput { + inputIndex + balanceRoot + stateRoot + } + ... on ChangeOutput { + to + amount + assetId + } + ... on VariableOutput { + to + amount + assetId + } + ... on ContractCreated { + contract + stateRoot + } + } + } } ... on PreconfirmationSuccessStatus { txPointer + time transactionId totalFee totalGas @@ -120,6 +152,7 @@ query TransactionQuery($id: TransactionId!) { reason } ... on FailureStatus { + transactionId blockHeight time reason @@ -159,9 +192,40 @@ query TransactionQuery($id: TransactionId!) { } totalGas totalFee + resolvedOutputs { + utxoId + output { + __typename + ... on CoinOutput { + to + amount + assetId + } + ... on ContractOutput { + inputIndex + balanceRoot + stateRoot + } + ... on ChangeOutput { + to + amount + assetId + } + ... on VariableOutput { + to + amount + assetId + } + ... on ContractCreated { + contract + stateRoot + } + } + } } ... on PreconfirmationFailureStatus { txPointer + time transactionId totalFee totalGas diff --git a/crates/client/src/client/schema/snapshots/fuel_core_client__client__schema__tx__tests__transactions_by_owner_gql_output.snap b/crates/client/src/client/schema/snapshots/fuel_core_client__client__schema__tx__tests__transactions_by_owner_gql_output.snap index 52f577682e0..22ab4f2bec4 100644 --- a/crates/client/src/client/schema/snapshots/fuel_core_client__client__schema__tx__tests__transactions_by_owner_gql_output.snap +++ b/crates/client/src/client/schema/snapshots/fuel_core_client__client__schema__tx__tests__transactions_by_owner_gql_output.snap @@ -14,6 +14,7 @@ query TransactionsByOwnerQuery($owner: Address!, $after: String, $before: String time } ... on SuccessStatus { + transactionId blockHeight time programState { @@ -52,9 +53,40 @@ query TransactionsByOwnerQuery($owner: Address!, $after: String, $before: String } totalGas totalFee + resolvedOutputs { + utxoId + output { + __typename + ... on CoinOutput { + to + amount + assetId + } + ... on ContractOutput { + inputIndex + balanceRoot + stateRoot + } + ... on ChangeOutput { + to + amount + assetId + } + ... on VariableOutput { + to + amount + assetId + } + ... on ContractCreated { + contract + stateRoot + } + } + } } ... on PreconfirmationSuccessStatus { txPointer + time transactionId totalFee totalGas @@ -123,6 +155,7 @@ query TransactionsByOwnerQuery($owner: Address!, $after: String, $before: String reason } ... on FailureStatus { + transactionId blockHeight time reason @@ -162,9 +195,40 @@ query TransactionsByOwnerQuery($owner: Address!, $after: String, $before: String } totalGas totalFee + resolvedOutputs { + utxoId + output { + __typename + ... on CoinOutput { + to + amount + assetId + } + ... on ContractOutput { + inputIndex + balanceRoot + stateRoot + } + ... on ChangeOutput { + to + amount + assetId + } + ... on VariableOutput { + to + amount + assetId + } + ... on ContractCreated { + contract + stateRoot + } + } + } } ... on PreconfirmationFailureStatus { txPointer + time transactionId totalFee totalGas diff --git a/crates/client/src/client/schema/snapshots/fuel_core_client__client__schema__tx__tests__transactions_connection_query_gql_output.snap b/crates/client/src/client/schema/snapshots/fuel_core_client__client__schema__tx__tests__transactions_connection_query_gql_output.snap index fb3b5f0459e..7ae5b22eb42 100644 --- a/crates/client/src/client/schema/snapshots/fuel_core_client__client__schema__tx__tests__transactions_connection_query_gql_output.snap +++ b/crates/client/src/client/schema/snapshots/fuel_core_client__client__schema__tx__tests__transactions_connection_query_gql_output.snap @@ -14,6 +14,7 @@ query TransactionsQuery($after: String, $before: String, $first: Int, $last: Int time } ... on SuccessStatus { + transactionId blockHeight time programState { @@ -52,9 +53,40 @@ query TransactionsQuery($after: String, $before: String, $first: Int, $last: Int } totalGas totalFee + resolvedOutputs { + utxoId + output { + __typename + ... on CoinOutput { + to + amount + assetId + } + ... on ContractOutput { + inputIndex + balanceRoot + stateRoot + } + ... on ChangeOutput { + to + amount + assetId + } + ... on VariableOutput { + to + amount + assetId + } + ... on ContractCreated { + contract + stateRoot + } + } + } } ... on PreconfirmationSuccessStatus { txPointer + time transactionId totalFee totalGas @@ -123,6 +155,7 @@ query TransactionsQuery($after: String, $before: String, $first: Int, $last: Int reason } ... on FailureStatus { + transactionId blockHeight time reason @@ -162,9 +195,40 @@ query TransactionsQuery($after: String, $before: String, $first: Int, $last: Int } totalGas totalFee + resolvedOutputs { + utxoId + output { + __typename + ... on CoinOutput { + to + amount + assetId + } + ... on ContractOutput { + inputIndex + balanceRoot + stateRoot + } + ... on ChangeOutput { + to + amount + assetId + } + ... on VariableOutput { + to + amount + assetId + } + ... on ContractCreated { + contract + stateRoot + } + } + } } ... on PreconfirmationFailureStatus { txPointer + time transactionId totalFee totalGas diff --git a/crates/client/src/client/schema/snapshots/fuel_core_client__client__schema__tx__tests__transparent_transaction_by_id_query_gql_output.snap b/crates/client/src/client/schema/snapshots/fuel_core_client__client__schema__tx__tests__transparent_transaction_by_id_query_gql_output.snap index 9a884ba48e4..96883929435 100644 --- a/crates/client/src/client/schema/snapshots/fuel_core_client__client__schema__tx__tests__transparent_transaction_by_id_query_gql_output.snap +++ b/crates/client/src/client/schema/snapshots/fuel_core_client__client__schema__tx__tests__transparent_transaction_by_id_query_gql_output.snap @@ -96,6 +96,7 @@ query TransactionQuery($id: TransactionId!) { time } ... on SuccessStatus { + transactionId blockHeight time programState { @@ -134,9 +135,40 @@ query TransactionQuery($id: TransactionId!) { } totalGas totalFee + resolvedOutputs { + utxoId + output { + __typename + ... on CoinOutput { + to + amount + assetId + } + ... on ContractOutput { + inputIndex + balanceRoot + stateRoot + } + ... on ChangeOutput { + to + amount + assetId + } + ... on VariableOutput { + to + amount + assetId + } + ... on ContractCreated { + contract + stateRoot + } + } + } } ... on PreconfirmationSuccessStatus { txPointer + time transactionId totalFee totalGas @@ -205,6 +237,7 @@ query TransactionQuery($id: TransactionId!) { reason } ... on FailureStatus { + transactionId blockHeight time reason @@ -244,9 +277,40 @@ query TransactionQuery($id: TransactionId!) { } totalGas totalFee + resolvedOutputs { + utxoId + output { + __typename + ... on CoinOutput { + to + amount + assetId + } + ... on ContractOutput { + inputIndex + balanceRoot + stateRoot + } + ... on ChangeOutput { + to + amount + assetId + } + ... on VariableOutput { + to + amount + assetId + } + ... on ContractCreated { + contract + stateRoot + } + } + } } ... on PreconfirmationFailureStatus { txPointer + time transactionId totalFee totalGas diff --git a/crates/client/src/client/schema/tx.rs b/crates/client/src/client/schema/tx.rs index 840b0a9c5d8..9109c4b55ed 100644 --- a/crates/client/src/client/schema/tx.rs +++ b/crates/client/src/client/schema/tx.rs @@ -232,12 +232,14 @@ pub struct SubmittedStatus { #[derive(cynic::QueryFragment, Clone, Debug)] #[cynic(schema_path = "./assets/schema.sdl")] pub struct SuccessStatus { + pub transaction_id: TransactionId, pub block_height: U32, pub time: Tai64Timestamp, pub program_state: Option, pub receipts: Vec, pub total_gas: U64, pub total_fee: U64, + pub resolved_outputs: Option>, } #[derive(cynic::QueryFragment, Clone, Debug)] @@ -263,6 +265,7 @@ pub struct ResolvedOutput { #[cynic(schema_path = "./assets/schema.sdl")] pub struct PreconfirmationSuccessStatus { pub tx_pointer: TxPointer, + pub time: Tai64Timestamp, pub transaction_id: TransactionId, pub total_fee: U64, pub total_gas: U64, @@ -288,6 +291,7 @@ pub struct PreconfirmationSuccessStatusWithTransaction { #[derive(cynic::QueryFragment, Clone, Debug)] #[cynic(schema_path = "./assets/schema.sdl")] pub struct FailureStatus { + pub transaction_id: TransactionId, pub block_height: U32, pub time: Tai64Timestamp, pub reason: String, @@ -295,6 +299,7 @@ pub struct FailureStatus { pub receipts: Vec, pub total_gas: U64, pub total_fee: U64, + pub resolved_outputs: Option>, } #[derive(cynic::QueryFragment, Clone, Debug)] @@ -314,6 +319,7 @@ pub struct FailureStatusWithTransaction { #[cynic(schema_path = "./assets/schema.sdl")] pub struct PreconfirmationFailureStatus { pub tx_pointer: TxPointer, + pub time: Tai64Timestamp, pub transaction_id: TransactionId, pub total_fee: U64, pub total_gas: U64, diff --git a/crates/client/src/client/types.rs b/crates/client/src/client/types.rs index a93311c1dd3..31c1e31adfd 100644 --- a/crates/client/src/client/types.rs +++ b/crates/client/src/client/types.rs @@ -191,8 +191,17 @@ impl TryFrom for TransactionStatus { .collect::, _>>()?, total_gas: s.total_gas.0, total_fee: s.total_fee.0, - transaction_id: Default::default(), - resolved_outputs: None, + transaction_id: s.transaction_id.into(), + resolved_outputs: if let Some(outputs) = s.resolved_outputs { + Some( + outputs + .into_iter() + .map(TryInto::try_into) + .collect::, _>>()?, + ) + } else { + None + }, }, SchemaTxStatus::PreconfirmationSuccessStatus(s) => { TransactionStatus::PreconfirmationSuccess { @@ -235,8 +244,17 @@ impl TryFrom for TransactionStatus { .collect::, _>>()?, total_gas: s.total_gas.0, total_fee: s.total_fee.0, - transaction_id: Default::default(), - resolved_outputs: None, + transaction_id: s.transaction_id.into(), + resolved_outputs: if let Some(outputs) = s.resolved_outputs { + Some( + outputs + .into_iter() + .map(TryInto::try_into) + .collect::, _>>()?, + ) + } else { + None + }, }, SchemaTxStatus::PreconfirmationFailureStatus(s) => { TransactionStatus::PreconfirmationFailure { @@ -265,7 +283,7 @@ impl TryFrom for TransactionStatus { } else { None }, - time: Tai64(), + time: s.time.0, } } SchemaTxStatus::SqueezedOutStatus(s) => { diff --git a/crates/fuel-core/src/schema/tx/types.rs b/crates/fuel-core/src/schema/tx/types.rs index a521f6788dd..2d7223460ce 100644 --- a/crates/fuel-core/src/schema/tx/types.rs +++ b/crates/fuel-core/src/schema/tx/types.rs @@ -45,6 +45,7 @@ use async_graphql::{ }; use fuel_core_storage::Error as StorageError; use fuel_core_types::{ + blockchain::transaction::TransactionExt, fuel_tx::{ self, Executable, @@ -167,6 +168,14 @@ pub struct SuccessStatus { status: Arc, } +// block_height: BlockHeight, +// time: Tai64, +// total_gas: u64, +// total_fee: u64, +// transaction_id: TxId, +// program_state: Option, +// receipts: Vec, +// resolved_outputs: Option>, #[Object] impl SuccessStatus { async fn transaction_id(&self) -> TransactionId { @@ -210,20 +219,42 @@ impl SuccessStatus { async fn total_fee(&self) -> U64 { self.status.total_fee.into() } + + #[graphql(complexity = "query_costs().storage_read + child_complexity")] + async fn resolved_outputs( + &self, + ctx: &Context<'_>, + ) -> async_graphql::Result>> { + let query = ctx.read_view()?; + let transaction = query.transaction(&self.tx_id)?; + Ok(Some(resolved_outputs_from_tx(self.tx_id, &transaction))) + } } #[derive(Debug)] pub struct PreconfirmationSuccessStatus { pub tx_id: TxId, pub status: Arc, + time: Tai64, } +// tx_pointer: TxPointer, +// time: Tai64, +// total_gas: u64, +// total_fee: u64, +// transaction_id: TxId, +// receipts: Option>, +// resolved_outputs: Option>, #[Object] impl PreconfirmationSuccessStatus { async fn tx_pointer(&self) -> TxPointer { self.status.tx_pointer.into() } + async fn time(&self) -> Tai64Timestamp { + Tai64Timestamp(self.time) + } + async fn total_gas(&self) -> U64 { self.status.total_gas.into() } @@ -274,6 +305,15 @@ pub struct FailureStatus { status: Arc, } +// block_height: BlockHeight, +// time: Tai64, +// total_gas: u64, +// total_fee: u64, +// transaction_id: TxId, +// receipts: Vec, +// program_state: Option, +// resolved_outputs: Option>, +// reason: String, #[Object] impl FailureStatus { async fn transaction_id(&self) -> TransactionId { @@ -324,20 +364,43 @@ impl FailureStatus { async fn total_fee(&self) -> U64 { self.status.total_fee.into() } + + #[graphql(complexity = "query_costs().storage_read + child_complexity")] + async fn resolved_outputs( + &self, + ctx: &Context<'_>, + ) -> async_graphql::Result>> { + let query = ctx.read_view()?; + let transaction = query.transaction(&self.tx_id)?; + Ok(Some(resolved_outputs_from_tx(self.tx_id, &transaction))) + } } #[derive(Debug)] pub struct PreconfirmationFailureStatus { pub tx_id: TxId, pub status: Arc, + time: Tai64, } +// tx_pointer: TxPointer, +// time: Tai64, +// total_gas: u64, +// total_fee: u64, +// transaction_id: TxId, +// receipts: Option>, +// resolved_outputs: Option>, +// reason: String, #[Object] impl PreconfirmationFailureStatus { async fn reason(&self) -> String { self.status.reason.clone() } + async fn time(&self) -> Tai64Timestamp { + Tai64Timestamp(self.time) + } + async fn tx_pointer(&self) -> TxPointer { self.status.tx_pointer.into() } @@ -422,6 +485,7 @@ impl TransactionStatus { TransactionStatus::PreconfirmationSuccess(PreconfirmationSuccessStatus { tx_id, status, + time: Tai64::now(), }) } TxStatus::PreConfirmationSqueezedOut(status) => { @@ -434,6 +498,7 @@ impl TransactionStatus { TransactionStatus::PreconfirmationFailure(PreconfirmationFailureStatus { tx_id, status, + time: Tai64::now(), }) } } @@ -999,6 +1064,26 @@ where inputs.into_iter() } +fn resolved_outputs_from_tx( + tx_id: TxId, + tx: &fuel_tx::Transaction, +) -> Vec { + tx.outputs() + .iter() + .enumerate() + .filter_map(|(index, output)| { + if output.is_change() || (output.is_variable() && output.amount() != Some(0)) + { + let output_index = u16::try_from(index).ok()?; + let utxo_id = fuel_tx::UtxoId::new(tx_id, output_index); + Some(ResolvedOutput::from((utxo_id, *output))) + } else { + None + } + }) + .collect() +} + #[derive(Debug)] pub struct DryRunSuccessStatus { result: Option, diff --git a/tests/tests/preconfirmations.rs b/tests/tests/preconfirmations.rs index 739ee7850ea..c5cc49fa58e 100644 --- a/tests/tests/preconfirmations.rs +++ b/tests/tests/preconfirmations.rs @@ -72,6 +72,7 @@ async fn preconfirmation__received_after_successful_execution() { transaction_id, receipts, resolved_outputs, + time: _, } => { // Then assert_eq!(tx_pointer, TxPointer::new(BlockHeight::new(1), 0)); @@ -224,6 +225,7 @@ async fn preconfirmation__received_after_failed_execution() { receipts, resolved_outputs, reason: _, + time: _, } => { // Then assert_eq!(tx_pointer, TxPointer::new(BlockHeight::new(1), 0)); diff --git a/tests/tests/preconfirmations_gossip.rs b/tests/tests/preconfirmations_gossip.rs index 1317b2c42eb..2bfa7636614 100644 --- a/tests/tests/preconfirmations_gossip.rs +++ b/tests/tests/preconfirmations_gossip.rs @@ -184,6 +184,7 @@ async fn preconfirmation__propagate_p2p_after_successful_execution() { transaction_id, receipts, resolved_outputs, + time: _, } = status.clone() { // Then @@ -331,6 +332,7 @@ async fn preconfirmation__propagate_p2p_after_failed_execution() { receipts, resolved_outputs, reason: _, + time: _, } = status { // Then From 70992fbb9e08f6d770a1e7443cb04466377ed2b2 Mon Sep 17 00:00:00 2001 From: Mitch Turner Date: Fri, 23 Jan 2026 09:31:06 -0700 Subject: [PATCH 3/4] Remove comments --- crates/fuel-core/src/schema/tx/types.rs | 32 ------------------------- 1 file changed, 32 deletions(-) diff --git a/crates/fuel-core/src/schema/tx/types.rs b/crates/fuel-core/src/schema/tx/types.rs index 2d7223460ce..d728ecf3462 100644 --- a/crates/fuel-core/src/schema/tx/types.rs +++ b/crates/fuel-core/src/schema/tx/types.rs @@ -168,14 +168,6 @@ pub struct SuccessStatus { status: Arc, } -// block_height: BlockHeight, -// time: Tai64, -// total_gas: u64, -// total_fee: u64, -// transaction_id: TxId, -// program_state: Option, -// receipts: Vec, -// resolved_outputs: Option>, #[Object] impl SuccessStatus { async fn transaction_id(&self) -> TransactionId { @@ -238,13 +230,6 @@ pub struct PreconfirmationSuccessStatus { time: Tai64, } -// tx_pointer: TxPointer, -// time: Tai64, -// total_gas: u64, -// total_fee: u64, -// transaction_id: TxId, -// receipts: Option>, -// resolved_outputs: Option>, #[Object] impl PreconfirmationSuccessStatus { async fn tx_pointer(&self) -> TxPointer { @@ -305,15 +290,6 @@ pub struct FailureStatus { status: Arc, } -// block_height: BlockHeight, -// time: Tai64, -// total_gas: u64, -// total_fee: u64, -// transaction_id: TxId, -// receipts: Vec, -// program_state: Option, -// resolved_outputs: Option>, -// reason: String, #[Object] impl FailureStatus { async fn transaction_id(&self) -> TransactionId { @@ -383,14 +359,6 @@ pub struct PreconfirmationFailureStatus { time: Tai64, } -// tx_pointer: TxPointer, -// time: Tai64, -// total_gas: u64, -// total_fee: u64, -// transaction_id: TxId, -// receipts: Option>, -// resolved_outputs: Option>, -// reason: String, #[Object] impl PreconfirmationFailureStatus { async fn reason(&self) -> String { From 13e7e1c98f572723be63779f69738c39c7bada45 Mon Sep 17 00:00:00 2001 From: Mitch Turner Date: Fri, 23 Jan 2026 09:32:37 -0700 Subject: [PATCH 4/4] Update CHANGELOG --- .changes/added/3186.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 .changes/added/3186.md diff --git a/.changes/added/3186.md b/.changes/added/3186.md new file mode 100644 index 00000000000..95252fd07ea --- /dev/null +++ b/.changes/added/3186.md @@ -0,0 +1 @@ +Add fields to transaction statuses for better parity between preconfirmation and normal statuses \ No newline at end of file