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}