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("Pinocchio program error with code: {0}")]
36 PinocchioProgramError(u32),
37}
38
39impl 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 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, };
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}