|
1 | 1 | //! Error types |
2 | 2 |
|
3 | | -use pinocchio::program_error::ProgramError; |
| 3 | +use pinocchio::program_error::{ProgramError, ToStr}; |
4 | 4 |
|
5 | 5 | /// Errors that may be returned by the Token program. |
6 | 6 | #[derive(Clone, Debug, Eq, PartialEq)] |
@@ -59,3 +59,72 @@ impl From<TokenError> for ProgramError { |
59 | 59 | ProgramError::Custom(e as u32) |
60 | 60 | } |
61 | 61 | } |
| 62 | + |
| 63 | +impl ToStr for TokenError { |
| 64 | + fn to_str<E>(&self) -> &'static str |
| 65 | + where |
| 66 | + E: 'static + ToStr + TryFrom<u32>, |
| 67 | + { |
| 68 | + match self { |
| 69 | + TokenError::NotRentExempt => "Error: Lamport balance below rent-exempt threshold", |
| 70 | + TokenError::InsufficientFunds => "Error: insufficient funds", |
| 71 | + TokenError::InvalidMint => "Error: Invalid Mint", |
| 72 | + TokenError::MintMismatch => "Error: Account not associated with this Mint", |
| 73 | + TokenError::OwnerMismatch => "Error: owner does not match", |
| 74 | + TokenError::FixedSupply => "Error: the total supply of this token is fixed", |
| 75 | + TokenError::AlreadyInUse => "Error: account or token already in use", |
| 76 | + TokenError::InvalidNumberOfProvidedSigners => { |
| 77 | + "Error: Invalid number of provided signers" |
| 78 | + } |
| 79 | + TokenError::InvalidNumberOfRequiredSigners => { |
| 80 | + "Error: Invalid number of required signers" |
| 81 | + } |
| 82 | + TokenError::UninitializedState => "Error: State is uninitialized", |
| 83 | + TokenError::NativeNotSupported => "Error: Instruction does not support native tokens", |
| 84 | + TokenError::NonNativeHasBalance => { |
| 85 | + "Error: Non-native account can only be closed if its balance is zero" |
| 86 | + } |
| 87 | + TokenError::InvalidInstruction => "Error: Invalid instruction", |
| 88 | + TokenError::InvalidState => "Error: Invalid account state for operation", |
| 89 | + TokenError::Overflow => "Error: Operation overflowed", |
| 90 | + TokenError::AuthorityTypeNotSupported => { |
| 91 | + "Error: Account does not support specified authority type" |
| 92 | + } |
| 93 | + TokenError::MintCannotFreeze => "Error: This token mint cannot freeze accounts", |
| 94 | + TokenError::AccountFrozen => "Error: Account is frozen", |
| 95 | + TokenError::MintDecimalsMismatch => "Error: decimals different from the Mint decimals", |
| 96 | + TokenError::NonNativeNotSupported => { |
| 97 | + "Error: Instruction does not support non-native tokens" |
| 98 | + } |
| 99 | + } |
| 100 | + } |
| 101 | +} |
| 102 | + |
| 103 | +impl TryFrom<u32> for TokenError { |
| 104 | + type Error = ProgramError; |
| 105 | + fn try_from(value: u32) -> Result<Self, Self::Error> { |
| 106 | + match value { |
| 107 | + 0 => Ok(TokenError::NotRentExempt), |
| 108 | + 1 => Ok(TokenError::InsufficientFunds), |
| 109 | + 2 => Ok(TokenError::InvalidMint), |
| 110 | + 3 => Ok(TokenError::MintMismatch), |
| 111 | + 4 => Ok(TokenError::OwnerMismatch), |
| 112 | + 5 => Ok(TokenError::FixedSupply), |
| 113 | + 6 => Ok(TokenError::AlreadyInUse), |
| 114 | + 7 => Ok(TokenError::InvalidNumberOfProvidedSigners), |
| 115 | + 8 => Ok(TokenError::InvalidNumberOfRequiredSigners), |
| 116 | + 9 => Ok(TokenError::UninitializedState), |
| 117 | + 10 => Ok(TokenError::NativeNotSupported), |
| 118 | + 11 => Ok(TokenError::NonNativeHasBalance), |
| 119 | + 12 => Ok(TokenError::InvalidInstruction), |
| 120 | + 13 => Ok(TokenError::InvalidState), |
| 121 | + 14 => Ok(TokenError::Overflow), |
| 122 | + 15 => Ok(TokenError::AuthorityTypeNotSupported), |
| 123 | + 16 => Ok(TokenError::MintCannotFreeze), |
| 124 | + 17 => Ok(TokenError::AccountFrozen), |
| 125 | + 18 => Ok(TokenError::MintDecimalsMismatch), |
| 126 | + 19 => Ok(TokenError::NonNativeNotSupported), |
| 127 | + _ => Err(ProgramError::InvalidArgument), |
| 128 | + } |
| 129 | + } |
| 130 | +} |
0 commit comments