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("Pinocchio program error with code: {0}")]
36    PinocchioProgramError(u32),
37}
38
39// TODO: reconfigure error codes
40impl From<AccountError> for u32 {
41    fn from(e: AccountError) -> u32 {
42        match e {
43            AccountError::AccountOwnedByWrongProgram => 12007,
44            AccountError::AccountNotMutable => 12008,
45            AccountError::InvalidDiscriminator => 12006,
46            AccountError::BorrowAccountDataFailed => 12009,
47            AccountError::InvalidAccountSize => 12010,
48            AccountError::AccountMutable => 12011,
49            AccountError::AlreadyInitialized => 12012,
50            AccountError::InvalidAccountBalance => 12013,
51            AccountError::FailedBorrowRentSysvar => 12014,
52            AccountError::InvalidSigner => 12015,
53            AccountError::InvalidSeeds => 12016,
54            AccountError::InvalidProgramId => 12017,
55            AccountError::ProgramNotExecutable => 12018,
56            AccountError::AccountNotZeroed => 12019,
57            AccountError::NotEnoughAccountKeys => 12020,
58            AccountError::PinocchioProgramError(code) => code,
59        }
60    }
61}
62
63#[cfg(feature = "pinocchio")]
64impl From<AccountError> for pinocchio::program_error::ProgramError {
65    fn from(e: AccountError) -> Self {
66        pinocchio::program_error::ProgramError::Custom(e.into())
67    }
68}
69
70#[cfg(feature = "solana")]
71impl From<AccountError> for solana_program_error::ProgramError {
72    fn from(e: AccountError) -> Self {
73        solana_program_error::ProgramError::Custom(e.into())
74    }
75}
76
77#[cfg(feature = "pinocchio")]
78impl From<pinocchio::program_error::ProgramError> for AccountError {
79    fn from(error: pinocchio::program_error::ProgramError) -> Self {
80        match error {
81            pinocchio::program_error::ProgramError::Custom(code) => {
82                AccountError::PinocchioProgramError(code)
83            }
84            _ => {
85                // Convert other ProgramError variants to error codes
86                let error_code = match error {
87                    pinocchio::program_error::ProgramError::InvalidArgument => 1,
88                    pinocchio::program_error::ProgramError::InvalidInstructionData => 2,
89                    pinocchio::program_error::ProgramError::InvalidAccountData => 3,
90                    pinocchio::program_error::ProgramError::AccountDataTooSmall => 4,
91                    pinocchio::program_error::ProgramError::InsufficientFunds => 5,
92                    pinocchio::program_error::ProgramError::IncorrectProgramId => 6,
93                    pinocchio::program_error::ProgramError::MissingRequiredSignature => 7,
94                    pinocchio::program_error::ProgramError::AccountAlreadyInitialized => 8,
95                    pinocchio::program_error::ProgramError::UninitializedAccount => 9,
96                    pinocchio::program_error::ProgramError::NotEnoughAccountKeys => 10,
97                    pinocchio::program_error::ProgramError::AccountBorrowFailed => 11,
98                    _ => 0, // Unknown error
99                };
100                AccountError::PinocchioProgramError(error_code)
101            }
102        }
103    }
104}
105
106#[cfg(feature = "solana")]
107impl From<std::cell::BorrowError> for AccountError {
108    fn from(_: std::cell::BorrowError) -> Self {
109        AccountError::BorrowAccountDataFailed
110    }
111}
112
113#[cfg(feature = "solana")]
114impl From<std::cell::BorrowMutError> for AccountError {
115    fn from(_: std::cell::BorrowMutError) -> Self {
116        AccountError::BorrowAccountDataFailed
117    }
118}