parent
7ebd8ee531
commit
569e3cb46a
|
@ -19,66 +19,75 @@ use thiserror::Error;
|
|||
pub enum TransactionError {
|
||||
/// An account is already being processed in another transaction in a way
|
||||
/// that does not support parallelism
|
||||
#[error("Account in use")]
|
||||
AccountInUse,
|
||||
|
||||
/// 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
|
||||
#[error("Account loaded twice")]
|
||||
AccountLoadedTwice,
|
||||
|
||||
/// 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,
|
||||
|
||||
/// Attempt to load a program that does not exist
|
||||
#[error("Attempt to load a program that does not exist")]
|
||||
ProgramAccountNotFound,
|
||||
|
||||
/// The from `Pubkey` does not have sufficient balance to pay the fee to schedule the transaction
|
||||
#[error("Insufficient funds for fee")]
|
||||
InsufficientFundsForFee,
|
||||
|
||||
/// This account may not be used to pay transaction fees
|
||||
#[error("This account may not be used to pay transaction fees")]
|
||||
InvalidAccountForFee,
|
||||
|
||||
/// 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
|
||||
/// its `recent_blockhash`, or as a double-spend attack.
|
||||
#[error("The bank has seen this signature before")]
|
||||
DuplicateSignature,
|
||||
|
||||
/// The bank has not seen the given `recent_blockhash` or the transaction is too old and
|
||||
/// the `recent_blockhash` has been discarded.
|
||||
#[error("Blockhash not found")]
|
||||
BlockhashNotFound,
|
||||
|
||||
/// An error occurred while processing an instruction. The first element of the tuple
|
||||
/// indicates the instruction index in which the error occurred.
|
||||
#[error("Error processing Instruction {0}: {1}")]
|
||||
InstructionError(u8, InstructionError),
|
||||
|
||||
/// Loader call chain is too deep
|
||||
#[error("Loader call chain is too deep")]
|
||||
CallChainTooDeep,
|
||||
|
||||
/// Transaction requires a fee but has no signature present
|
||||
#[error("Transaction requires a fee but has no signature present")]
|
||||
MissingSignatureForFee,
|
||||
|
||||
/// Transaction contains an invalid account reference
|
||||
#[error("Transaction contains an invalid account reference")]
|
||||
InvalidAccountIndex,
|
||||
|
||||
/// Transaction did not pass signature verification
|
||||
#[error("Transaction did not pass signature verification")]
|
||||
SignatureFailure,
|
||||
|
||||
/// This program may not be used for executing instructions
|
||||
#[error("This program may not be used for executing instructions")]
|
||||
InvalidProgramForExecution,
|
||||
|
||||
/// Transaction failed to sanitize accounts offsets correctly
|
||||
/// implies that account locks are not taken for this TX, and should
|
||||
/// not be unlocked.
|
||||
#[error("Transaction failed to sanitize accounts offsets correctly")]
|
||||
SanitizeFailure,
|
||||
}
|
||||
|
||||
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
|
||||
#[derive(Debug, PartialEq, Default, Eq, Clone, Serialize, Deserialize)]
|
||||
pub struct Transaction {
|
||||
|
|
Loading…
Reference in New Issue