Skip to main content

light_account_checks/
error.rs

1use thiserror::Error;
2
3#[derive(Debug, Clone, Copy, Error, PartialEq)]
4pub enum AccountError {
5    #[error("Account owned by wrong program.")]
6    AccountOwnedByWrongProgram,
7    #[error("Account not mutable.")]
8    AccountNotMutable,
9    #[error("Invalid Discriminator.")]
10    InvalidDiscriminator,
11    #[error("Borrow account data failed.")]
12    BorrowAccountDataFailed,
13    #[error("Account is already initialized.")]
14    AlreadyInitialized,
15    #[error("Invalid Account size.")]
16    InvalidAccountSize,
17    #[error("Account is mutable.")]
18    AccountMutable,
19    #[error("Invalid account balance.")]
20    InvalidAccountBalance,
21    #[error("Failed to borrow rent sysvar.")]
22    FailedBorrowRentSysvar,
23    #[error("Invalid Signer")]
24    InvalidSigner,
25    #[error("Invalid Seeds")]
26    InvalidSeeds,
27    #[error("Invalid Program Id")]
28    InvalidProgramId,
29    #[error("Program not executable.")]
30    ProgramNotExecutable,
31    #[error("Account not zeroed.")]
32    AccountNotZeroed,
33    #[error("Not enough account keys provided.")]
34    NotEnoughAccountKeys,
35    #[error("Invalid Account.")]
36    InvalidAccount,
37    #[error("Failed to access sysvar.")]
38    FailedSysvarAccess,
39    #[error("Pinocchio program error with code: {0}")]
40    PinocchioProgramError(u32),
41    #[error("Arithmetic overflow.")]
42    ArithmeticOverflow,
43}
44
45impl From<AccountError> for u32 {
46    fn from(e: AccountError) -> u32 {
47        match e {
48            AccountError::InvalidDiscriminator => 20000,
49            AccountError::AccountOwnedByWrongProgram => 20001,
50            AccountError::AccountNotMutable => 20002,
51            AccountError::BorrowAccountDataFailed => 20003,
52            AccountError::InvalidAccountSize => 20004,
53            AccountError::AccountMutable => 20005,
54            AccountError::AlreadyInitialized => 20006,
55            AccountError::InvalidAccountBalance => 20007,
56            AccountError::FailedBorrowRentSysvar => 20008,
57            AccountError::InvalidSigner => 20009,
58            AccountError::InvalidSeeds => 20010,
59            AccountError::InvalidProgramId => 20011,
60            AccountError::ProgramNotExecutable => 20012,
61            AccountError::AccountNotZeroed => 20013,
62            AccountError::NotEnoughAccountKeys => 20014,
63            AccountError::InvalidAccount => 20015,
64            AccountError::FailedSysvarAccess => 20016,
65            AccountError::PinocchioProgramError(code) => code,
66            AccountError::ArithmeticOverflow => 20017,
67        }
68    }
69}
70
71#[cfg(feature = "pinocchio")]
72impl From<AccountError> for pinocchio::program_error::ProgramError {
73    fn from(e: AccountError) -> Self {
74        pinocchio::program_error::ProgramError::Custom(e.into())
75    }
76}
77
78#[cfg(feature = "solana")]
79impl From<AccountError> for solana_program_error::ProgramError {
80    fn from(e: AccountError) -> Self {
81        solana_program_error::ProgramError::Custom(e.into())
82    }
83}
84
85#[cfg(feature = "pinocchio")]
86impl From<pinocchio::program_error::ProgramError> for AccountError {
87    fn from(error: pinocchio::program_error::ProgramError) -> Self {
88        match error {
89            pinocchio::program_error::ProgramError::Custom(code) => {
90                AccountError::PinocchioProgramError(code)
91            }
92            _ => {
93                // Convert other ProgramError variants to error codes
94                let error_code = match error {
95                    pinocchio::program_error::ProgramError::InvalidArgument => 1,
96                    pinocchio::program_error::ProgramError::InvalidInstructionData => 2,
97                    pinocchio::program_error::ProgramError::InvalidAccountData => 3,
98                    pinocchio::program_error::ProgramError::AccountDataTooSmall => 4,
99                    pinocchio::program_error::ProgramError::InsufficientFunds => 5,
100                    pinocchio::program_error::ProgramError::IncorrectProgramId => 6,
101                    pinocchio::program_error::ProgramError::MissingRequiredSignature => 7,
102                    pinocchio::program_error::ProgramError::AccountAlreadyInitialized => 8,
103                    pinocchio::program_error::ProgramError::UninitializedAccount => 9,
104                    pinocchio::program_error::ProgramError::NotEnoughAccountKeys => 10,
105                    pinocchio::program_error::ProgramError::AccountBorrowFailed => 11,
106                    _ => 0, // Unknown error
107                };
108                AccountError::PinocchioProgramError(error_code)
109            }
110        }
111    }
112}
113
114#[cfg(feature = "solana")]
115impl From<core::cell::BorrowError> for AccountError {
116    fn from(_: core::cell::BorrowError) -> Self {
117        AccountError::BorrowAccountDataFailed
118    }
119}
120
121#[cfg(feature = "solana")]
122impl From<core::cell::BorrowMutError> for AccountError {
123    fn from(_: core::cell::BorrowMutError) -> Self {
124        AccountError::BorrowAccountDataFailed
125    }
126}