Use thiserror's display for TransactionError (#10233)

automerge
This commit is contained in:
Jack May
2020-05-25 16:13:09 -07:00
committed by GitHub
parent 7ebd8ee531
commit 569e3cb46a

View File

@ -19,66 +19,75 @@ use thiserror::Error;
pub enum TransactionError { pub enum TransactionError {
/// An account is already being processed in another transaction in a way /// An account is already being processed in another transaction in a way
/// that does not support parallelism /// that does not support parallelism
#[error("Account in use")]
AccountInUse, AccountInUse,
/// A `Pubkey` appears twice in the transaction's `account_keys`. Instructions can reference /// A `Pubkey` appears twice in the transaction's `account_keys`. Instructions can reference
/// `Pubkey`s more than once but the message must contain a list with no duplicate keys /// `Pubkey`s more than once but the message must contain a list with no duplicate keys
#[error("Account loaded twice")]
AccountLoadedTwice, AccountLoadedTwice,
/// Attempt to debit an account but found no record of a prior credit. /// Attempt to debit an account but found no record of a prior credit.
#[error("Attempt to debit an account but found no record of a prior credit.")]
AccountNotFound, AccountNotFound,
/// Attempt to load a program that does not exist /// Attempt to load a program that does not exist
#[error("Attempt to load a program that does not exist")]
ProgramAccountNotFound, ProgramAccountNotFound,
/// The from `Pubkey` does not have sufficient balance to pay the fee to schedule the transaction /// The from `Pubkey` does not have sufficient balance to pay the fee to schedule the transaction
#[error("Insufficient funds for fee")]
InsufficientFundsForFee, InsufficientFundsForFee,
/// This account may not be used to pay transaction fees /// This account may not be used to pay transaction fees
#[error("This account may not be used to pay transaction fees")]
InvalidAccountForFee, InvalidAccountForFee,
/// The bank has seen this `Signature` before. This can occur under normal operation /// The bank has seen this `Signature` before. This can occur under normal operation
/// when a UDP packet is duplicated, as a user error from a client not updating /// when a UDP packet is duplicated, as a user error from a client not updating
/// its `recent_blockhash`, or as a double-spend attack. /// its `recent_blockhash`, or as a double-spend attack.
#[error("The bank has seen this signature before")]
DuplicateSignature, DuplicateSignature,
/// The bank has not seen the given `recent_blockhash` or the transaction is too old and /// The bank has not seen the given `recent_blockhash` or the transaction is too old and
/// the `recent_blockhash` has been discarded. /// the `recent_blockhash` has been discarded.
#[error("Blockhash not found")]
BlockhashNotFound, BlockhashNotFound,
/// An error occurred while processing an instruction. The first element of the tuple /// An error occurred while processing an instruction. The first element of the tuple
/// indicates the instruction index in which the error occurred. /// indicates the instruction index in which the error occurred.
#[error("Error processing Instruction {0}: {1}")]
InstructionError(u8, InstructionError), InstructionError(u8, InstructionError),
/// Loader call chain is too deep /// Loader call chain is too deep
#[error("Loader call chain is too deep")]
CallChainTooDeep, CallChainTooDeep,
/// Transaction requires a fee but has no signature present /// Transaction requires a fee but has no signature present
#[error("Transaction requires a fee but has no signature present")]
MissingSignatureForFee, MissingSignatureForFee,
/// Transaction contains an invalid account reference /// Transaction contains an invalid account reference
#[error("Transaction contains an invalid account reference")]
InvalidAccountIndex, InvalidAccountIndex,
/// Transaction did not pass signature verification /// Transaction did not pass signature verification
#[error("Transaction did not pass signature verification")]
SignatureFailure, SignatureFailure,
/// This program may not be used for executing instructions /// This program may not be used for executing instructions
#[error("This program may not be used for executing instructions")]
InvalidProgramForExecution, InvalidProgramForExecution,
/// Transaction failed to sanitize accounts offsets correctly /// Transaction failed to sanitize accounts offsets correctly
/// implies that account locks are not taken for this TX, and should /// implies that account locks are not taken for this TX, and should
/// not be unlocked. /// not be unlocked.
#[error("Transaction failed to sanitize accounts offsets correctly")]
SanitizeFailure, SanitizeFailure,
} }
pub type Result<T> = result::Result<T, TransactionError>; pub type Result<T> = result::Result<T, TransactionError>;
impl std::fmt::Display for TransactionError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "TransactionError::{:?}", self)
}
}
/// An atomic transaction /// An atomic transaction
#[derive(Debug, PartialEq, Default, Eq, Clone, Serialize, Deserialize)] #[derive(Debug, PartialEq, Default, Eq, Clone, Serialize, Deserialize)]
pub struct Transaction { pub struct Transaction {