light_account_checks/
error.rs1use 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 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, };
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}