@@ -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 {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user