light_token/
error.rs

1use light_account_checks::AccountError;
2use light_sdk::error::LightSdkError;
3use light_sdk_types::error::LightSdkTypesError;
4use light_token_interface::TokenError;
5use light_token_types::error::LightTokenSdkTypeError;
6use light_zero_copy::errors::ZeroCopyError;
7use solana_program_error::ProgramError;
8use thiserror::Error;
9
10pub type Result<T> = std::result::Result<T, TokenSdkError>;
11
12#[derive(Debug, Error)]
13pub enum TokenSdkError {
14    #[error("Insufficient balance")]
15    InsufficientBalance,
16    #[error("Serialization error")]
17    SerializationError,
18    #[error("CPI error: {0}")]
19    CpiError(String),
20    #[error("Cannot compress and decompress")]
21    CannotCompressAndDecompress,
22    #[error("Compression cannot be set twice")]
23    CompressionCannotBeSetTwice,
24    #[error("Inconsistent compress/decompress state")]
25    InconsistentCompressDecompressState,
26    #[error("Both compress and decompress specified")]
27    BothCompressAndDecompress,
28    #[error("Invalid compress/decompress amount")]
29    InvalidCompressDecompressAmount,
30    #[error("Ctoken::transfer, compress, or decompress cannot be used with fn transfer(), fn compress(), fn decompress()")]
31    MethodUsed,
32    #[error("DecompressedMintConfig is required for decompressed mints")]
33    DecompressedMintConfigRequired,
34    #[error("Invalid compress input owner")]
35    InvalidCompressInputOwner,
36    #[error("Account borrow failed")]
37    AccountBorrowFailed,
38    #[error("Invalid account data")]
39    InvalidAccountData,
40    #[error("Missing required CPI account")]
41    MissingCpiAccount,
42    #[error("Too many accounts")]
43    TooManyAccounts,
44    #[error("PackedAccount indices are not continuous")]
45    NonContinuousIndices,
46    #[error("PackedAccount index out of bounds")]
47    PackedAccountIndexOutOfBounds,
48    #[error("Cannot mint with decompressed mint in CPI write mode")]
49    CannotMintWithDecompressedInCpiWrite,
50    #[error("RentAuthorityIsNone")]
51    RentAuthorityIsNone,
52    #[error("Incomplete SPL interface")]
53    IncompleteSplInterface,
54    #[error("SPL interface required")]
55    SplInterfaceRequired,
56    #[error("Use regular SPL transfer")]
57    UseRegularSplTransfer,
58    #[error("Cannot determine account type")]
59    CannotDetermineAccountType,
60    #[error("MintActionMetaConfig::new_cpi_context requires cpi_context data")]
61    CpiContextRequired,
62    #[error("Missing mint account")]
63    MissingMintAccount,
64    #[error("Missing SPL token program")]
65    MissingSplTokenProgram,
66    #[error("Missing SPL interface PDA")]
67    MissingSplInterfacePda,
68    #[error("Missing SPL interface PDA bump")]
69    MissingSplInterfacePdaBump,
70    #[error("Invalid CPI context: first_set_context or set_context must be true")]
71    InvalidCpiContext,
72    #[error("No input accounts provided")]
73    NoInputAccounts,
74    #[error("Missing Compressible extension on Light Token account")]
75    MissingCompressibleExtension,
76    #[error("Invalid Token account data")]
77    InvalidTokenAccount,
78    #[error("SPL token program mismatch between source and destination")]
79    SplTokenProgramMismatch,
80    #[error(transparent)]
81    CompressedTokenTypes(#[from] LightTokenSdkTypeError),
82    #[error(transparent)]
83    TokenError(#[from] TokenError),
84    #[error(transparent)]
85    LightSdkError(#[from] LightSdkError),
86    #[error(transparent)]
87    LightSdkTypesError(#[from] LightSdkTypesError),
88    #[error(transparent)]
89    ZeroCopyError(#[from] ZeroCopyError),
90    #[error(transparent)]
91    AccountError(#[from] AccountError),
92}
93#[cfg(feature = "anchor")]
94impl From<TokenSdkError> for anchor_lang::prelude::ProgramError {
95    fn from(e: TokenSdkError) -> Self {
96        ProgramError::Custom(e.into())
97    }
98}
99#[cfg(not(feature = "anchor"))]
100impl From<TokenSdkError> for ProgramError {
101    fn from(e: TokenSdkError) -> Self {
102        ProgramError::Custom(e.into())
103    }
104}
105
106impl From<TokenSdkError> for u32 {
107    fn from(e: TokenSdkError) -> Self {
108        match e {
109            TokenSdkError::InsufficientBalance => 17001,
110            TokenSdkError::SerializationError => 17002,
111            TokenSdkError::CpiError(_) => 17003,
112            TokenSdkError::CannotCompressAndDecompress => 17004,
113            TokenSdkError::CompressionCannotBeSetTwice => 17005,
114            TokenSdkError::InconsistentCompressDecompressState => 17006,
115            TokenSdkError::BothCompressAndDecompress => 17007,
116            TokenSdkError::InvalidCompressDecompressAmount => 17008,
117            TokenSdkError::MethodUsed => 17009,
118            TokenSdkError::DecompressedMintConfigRequired => 17010,
119            TokenSdkError::InvalidCompressInputOwner => 17011,
120            TokenSdkError::AccountBorrowFailed => 17012,
121            TokenSdkError::InvalidAccountData => 17013,
122            TokenSdkError::MissingCpiAccount => 17014,
123            TokenSdkError::TooManyAccounts => 17015,
124            TokenSdkError::NonContinuousIndices => 17016,
125            TokenSdkError::PackedAccountIndexOutOfBounds => 17017,
126            TokenSdkError::CannotMintWithDecompressedInCpiWrite => 17018,
127            TokenSdkError::RentAuthorityIsNone => 17019,
128            TokenSdkError::SplInterfaceRequired => 17020,
129            TokenSdkError::IncompleteSplInterface => 17021,
130            TokenSdkError::UseRegularSplTransfer => 17022,
131            TokenSdkError::CannotDetermineAccountType => 17023,
132            TokenSdkError::CpiContextRequired => 17024,
133            TokenSdkError::MissingMintAccount => 17025,
134            TokenSdkError::MissingSplTokenProgram => 17026,
135            TokenSdkError::MissingSplInterfacePda => 17027,
136            TokenSdkError::MissingSplInterfacePdaBump => 17028,
137            TokenSdkError::InvalidCpiContext => 17029,
138            TokenSdkError::NoInputAccounts => 17030,
139            TokenSdkError::MissingCompressibleExtension => 17031,
140            TokenSdkError::InvalidTokenAccount => 17032,
141            TokenSdkError::SplTokenProgramMismatch => 17033,
142            TokenSdkError::CompressedTokenTypes(e) => e.into(),
143            TokenSdkError::TokenError(e) => e.into(),
144            TokenSdkError::LightSdkTypesError(e) => e.into(),
145            TokenSdkError::LightSdkError(e) => e.into(),
146            TokenSdkError::ZeroCopyError(e) => e.into(),
147            TokenSdkError::AccountError(e) => e.into(),
148        }
149    }
150}