140 lines
5.3 KiB
Rust
140 lines
5.3 KiB
Rust
//! 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<TokenError> for ProgramError {
|
|
fn from(e: TokenError) -> Self {
|
|
ProgramError::Custom(e as u32)
|
|
}
|
|
}
|
|
impl<T> DecodeError<T> for TokenError {
|
|
fn type_of() -> &'static str {
|
|
"TokenError"
|
|
}
|
|
}
|
|
|
|
impl PrintProgramError for TokenError {
|
|
fn print<E>(&self)
|
|
where
|
|
E: 'static
|
|
+ std::error::Error
|
|
+ DecodeError<E>
|
|
+ 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")
|
|
}
|
|
}
|
|
}
|
|
}
|