//! Error types use num_derive::FromPrimitive; use solana_program::{ decode_error::DecodeError, msg, program_error::{PrintProgramError, ProgramError}, }; use thiserror::Error; /// Errors that may be returned by the Token program. #[derive(Clone, Debug, Eq, Error, FromPrimitive, PartialEq)] pub enum TokenError { // 0 /// Lamport balance below rent-exempt threshold. #[error("Lamport balance below rent-exempt threshold")] NotRentExempt, /// Insufficient funds for the operation requested. #[error("Insufficient funds")] InsufficientFunds, /// Invalid Mint. #[error("Invalid Mint")] InvalidMint, /// Account not associated with this Mint. #[error("Account not associated with this Mint")] MintMismatch, /// Owner does not match. #[error("Owner does not match")] OwnerMismatch, // 5 /// This token's supply is fixed and new tokens cannot be minted. #[error("Fixed supply")] FixedSupply, /// The account cannot be initialized because it is already being used. #[error("Already in use")] AlreadyInUse, /// Invalid number of provided signers. #[error("Invalid number of provided signers")] InvalidNumberOfProvidedSigners, /// Invalid number of required signers. #[error("Invalid number of required signers")] InvalidNumberOfRequiredSigners, /// State is uninitialized. #[error("State is uninitialized")] UninitializedState, // 10 /// Instruction does not support native tokens #[error("Instruction does not support native tokens")] NativeNotSupported, /// Non-native account can only be closed if its balance is zero #[error("Non-native account can only be closed if its balance is zero")] NonNativeHasBalance, /// Invalid instruction #[error("Invalid instruction")] InvalidInstruction, /// State is invalid for requested operation. #[error("State is invalid for requested operation")] InvalidState, /// Operation overflowed #[error("Operation overflowed")] Overflow, // 15 /// Account does not support specified authority type. #[error("Account does not support specified authority type")] AuthorityTypeNotSupported, /// This token mint cannot freeze accounts. #[error("This token mint cannot freeze accounts")] MintCannotFreeze, /// Account is frozen; all account operations will fail #[error("Account is frozen")] AccountFrozen, /// Mint decimals mismatch between the client and mint #[error("The provided decimals value different from the Mint decimals")] MintDecimalsMismatch, /// Instruction does not support non-native tokens #[error("Instruction does not support non-native tokens")] NonNativeNotSupported, } impl From for ProgramError { fn from(e: TokenError) -> Self { ProgramError::Custom(e as u32) } } impl DecodeError for TokenError { fn type_of() -> &'static str { "TokenError" } } impl PrintProgramError for TokenError { fn print(&self) where E: 'static + std::error::Error + DecodeError + PrintProgramError + num_traits::FromPrimitive, { match self { TokenError::NotRentExempt => msg!("Error: Lamport balance below rent-exempt threshold"), TokenError::InsufficientFunds => msg!("Error: insufficient funds"), TokenError::InvalidMint => msg!("Error: Invalid Mint"), TokenError::MintMismatch => msg!("Error: Account not associated with this Mint"), TokenError::OwnerMismatch => msg!("Error: owner does not match"), TokenError::FixedSupply => msg!("Error: the total supply of this token is fixed"), TokenError::AlreadyInUse => msg!("Error: account or token already in use"), TokenError::InvalidNumberOfProvidedSigners => { msg!("Error: Invalid number of provided signers") } TokenError::InvalidNumberOfRequiredSigners => { msg!("Error: Invalid number of required signers") } TokenError::UninitializedState => msg!("Error: State is uninitialized"), TokenError::NativeNotSupported => { msg!("Error: Instruction does not support native tokens") } TokenError::NonNativeHasBalance => { msg!("Error: Non-native account can only be closed if its balance is zero") } TokenError::InvalidInstruction => msg!("Error: Invalid instruction"), TokenError::InvalidState => msg!("Error: Invalid account state for operation"), TokenError::Overflow => msg!("Error: Operation overflowed"), TokenError::AuthorityTypeNotSupported => { msg!("Error: Account does not support specified authority type") } TokenError::MintCannotFreeze => msg!("Error: This token mint cannot freeze accounts"), TokenError::AccountFrozen => msg!("Error: Account is frozen"), TokenError::MintDecimalsMismatch => { msg!("Error: decimals different from the Mint decimals") } TokenError::NonNativeNotSupported => { msg!("Error: Instruction does not support non-native tokens") } } } }