diff --git a/cli/src/cli.rs b/cli/src/cli.rs index 350084f74d..8b49b8e792 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -50,7 +50,9 @@ use solana_stake_program::{ stake_instruction::LockupArgs, stake_state::{Lockup, StakeAuthorize}, }; -use solana_transaction_status::{EncodedTransaction, UiTransactionEncoding}; +use solana_transaction_status::{ + EncodedTransaction, TransactionConfirmationStatus, UiTransactionEncoding, +}; use solana_vote_program::vote_state::VoteAuthorize; use std::{ collections::HashMap, @@ -972,13 +974,9 @@ fn process_confirm( config: &CliConfig, signature: &Signature, ) -> ProcessResult { - match rpc_client.get_signature_status_with_commitment_and_history( - &signature, - CommitmentConfig::max(), - true, - ) { + match rpc_client.get_signature_statuses_with_history(&[*signature]) { Ok(status) => { - if let Some(transaction_status) = status { + if let Some(transaction_status) = &status.value[0] { if config.verbose { match rpc_client .get_confirmed_transaction(signature, UiTransactionEncoding::Base64) @@ -999,15 +997,24 @@ fn process_confirm( ); } Err(err) => { - println!("Unable to get confirmed transaction details: {}", err) + if transaction_status.confirmation_status() + != TransactionConfirmationStatus::Finalized + { + println!(); + println!("Unable to get finalized transaction details: not yet finalized") + } else { + println!(); + println!("Unable to get finalized transaction details: {}", err) + } } } println!(); } - match transaction_status { - Ok(_) => Ok("Confirmed".to_string()), - Err(err) => Ok(format!("Transaction failed: {}", err)), + if let Some(err) = &transaction_status.err { + Ok(format!("Transaction failed: {}", err)) + } else { + Ok(format!("{:?}", transaction_status.confirmation_status())) } } else { Ok("Not found".to_string()) @@ -2432,7 +2439,10 @@ mod tests { let good_signature = Signature::new(&bs58::decode(SIGNATURE).into_vec().unwrap()); config.command = CliCommand::Confirm(good_signature); - assert_eq!(process_command(&config).unwrap(), "Confirmed"); + assert_eq!( + process_command(&config).unwrap(), + format!("{:?}", TransactionConfirmationStatus::Finalized) + ); let bob_keypair = Keypair::new(); let bob_pubkey = bob_keypair.pubkey(); diff --git a/transaction-status/src/lib.rs b/transaction-status/src/lib.rs index 3626e43915..bffb753144 100644 --- a/transaction-status/src/lib.rs +++ b/transaction-status/src/lib.rs @@ -252,6 +252,23 @@ impl TransactionStatus { CommitmentLevel::Recent => true, } } + + // Returns `confirmation_status`, or if is_none, determines the status from confirmations. + // Facilitates querying nodes on older software + pub fn confirmation_status(&self) -> TransactionConfirmationStatus { + match &self.confirmation_status { + Some(status) => status.clone(), + None => { + if self.confirmations.is_none() { + TransactionConfirmationStatus::Finalized + } else if self.confirmations.unwrap() > 0 { + TransactionConfirmationStatus::Confirmed + } else { + TransactionConfirmationStatus::Processed + } + } + } + } } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]