1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
use num_derive::FromPrimitive;
use solana_program::{
decode_error::DecodeError,
msg,
program_error::{PrintProgramError, ProgramError},
};
use thiserror::Error;
#[derive(Clone, Debug, Eq, Error, FromPrimitive, PartialEq)]
pub enum TokenError {
#[error("Lamport balance below rent-exempt threshold")]
NotRentExempt,
#[error("Insufficient funds")]
InsufficientFunds,
#[error("Invalid Mint")]
InvalidMint,
#[error("Account not associated with this Mint")]
MintMismatch,
#[error("Owner does not match")]
OwnerMismatch,
#[error("Fixed supply")]
FixedSupply,
#[error("Already in use")]
AlreadyInUse,
#[error("Invalid number of provided signers")]
InvalidNumberOfProvidedSigners,
#[error("Invalid number of required signers")]
InvalidNumberOfRequiredSigners,
#[error("State is unititialized")]
UninitializedState,
#[error("Instruction does not support native tokens")]
NativeNotSupported,
#[error("Non-native account can only be closed if its balance is zero")]
NonNativeHasBalance,
#[error("Invalid instruction")]
InvalidInstruction,
#[error("State is invalid for requested operation")]
InvalidState,
#[error("Operation overflowed")]
Overflow,
#[error("Account does not support specified authority type")]
AuthorityTypeNotSupported,
#[error("This token mint cannot freeze accounts")]
MintCannotFreeze,
#[error("Account is frozen")]
AccountFrozen,
#[error("The provided decimals value different from the Mint decimals")]
MintDecimalsMismatch,
#[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")
}
}
}
}