diff --git a/src/bank.rs b/src/bank.rs index cb0eeebccb..f2e16d03ec 100644 --- a/src/bank.rs +++ b/src/bank.rs @@ -77,6 +77,9 @@ pub enum BankError { /// too old and has been discarded. SignatureNotFound, + /// A transaction with this signature has been received but not yet executed + SignatureReserved, + /// Proof of History verification failed. LedgerVerificationFailed, @@ -431,7 +434,7 @@ impl Bank { if let Some(_result) = signatures.get(signature) { return Err(BankError::DuplicateSignature); } - signatures.insert(*signature, Ok(())); + signatures.insert(*signature, Err(BankError::SignatureReserved)); Ok(()) } @@ -1747,7 +1750,10 @@ mod tests { let signature = Signature::default(); bank.reserve_signature_with_last_id_test(&signature, &mint.last_id()) .expect("reserve signature"); - assert_eq!(bank.get_signature_status(&signature), Ok(())); + assert_eq!( + bank.get_signature_status(&signature), + Err(BankError::SignatureReserved) + ); } #[test] diff --git a/src/rpc.rs b/src/rpc.rs index 8c05b88bc7..72b99e6569 100644 --- a/src/rpc.rs +++ b/src/rpc.rs @@ -192,6 +192,9 @@ impl RpcSol for RpcSolImpl { Ok(_) => RpcSignatureStatus::Confirmed, Err(BankError::AccountInUse) => RpcSignatureStatus::AccountInUse, Err(BankError::ProgramRuntimeError(_)) => RpcSignatureStatus::ProgramRuntimeError, + // Report SignatureReserved as SignatureNotFound as SignatureReserved is + // transitory while the bank processes the associated transaction. + Err(BankError::SignatureReserved) => RpcSignatureStatus::SignatureNotFound, Err(BankError::SignatureNotFound) => RpcSignatureStatus::SignatureNotFound, Err(err) => { trace!("mapping {:?} to GenericFailure", err);