spl_token_wrap/
error.rs

1//! Error types
2
3use {
4    num_derive::FromPrimitive,
5    num_traits::FromPrimitive,
6    solana_msg::msg,
7    solana_program_error::{ProgramError, ToStr},
8    std::convert::TryFrom,
9    thiserror::Error,
10};
11
12/// Errors that may be returned by the Token Wrap program.
13#[derive(Clone, Debug, Eq, Error, PartialEq, FromPrimitive)]
14pub enum TokenWrapError {
15    // 0
16    /// Wrapped mint account address does not match expected PDA
17    #[error("Wrapped mint account address does not match expected PDA")]
18    WrappedMintMismatch,
19    /// Wrapped backpointer account address does not match expected PDA
20    #[error("Wrapped backpointer account address does not match expected PDA")]
21    BackpointerMismatch,
22    /// Wrap amount should be positive
23    #[error("Wrap amount should be positive")]
24    ZeroWrapAmount,
25    /// Wrapped mint authority does not match expected PDA
26    #[error("Wrapped mint authority does not match expected PDA")]
27    MintAuthorityMismatch,
28    /// Unwrapped escrow token owner is not set to expected PDA
29    #[error("Unwrapped escrow token owner is not set to expected PDA")]
30    EscrowOwnerMismatch,
31
32    // 5
33    /// Wrapped mint account owner is not the expected token program
34    #[error("Wrapped mint account owner is not the expected token program")]
35    InvalidWrappedMintOwner,
36    /// Wrapped backpointer account owner is not the expected token wrap program
37    #[error("Wrapped backpointer account owner is not the expected token wrap program")]
38    InvalidBackpointerOwner,
39    /// Escrow account address does not match expected `ATA`
40    #[error("Escrow account address does not match expected ATA")]
41    EscrowMismatch,
42    /// The escrow account is in a good state and cannot be recreated
43    #[error("The escrow account is in a good state and cannot be recreated")]
44    EscrowInGoodState,
45    /// Unwrapped mint does not have the `TokenMetadata` extension
46    #[error("Unwrapped mint does not have the TokenMetadata extension")]
47    UnwrappedMintHasNoMetadata,
48
49    // 10
50    /// `Metaplex` metadata account address does not match expected PDA
51    #[error("Metaplex metadata account address does not match expected PDA")]
52    MetaplexMetadataMismatch,
53    /// Metadata pointer extension missing on mint
54    #[error("Metadata pointer extension missing on mint")]
55    MetadataPointerMissing,
56    /// Metadata pointer is unset (None)
57    #[error("Metadata pointer is unset (None)")]
58    MetadataPointerUnset,
59    /// Provided source metadata account does not match pointer
60    #[error("Provided source metadata account does not match pointer")]
61    MetadataPointerMismatch,
62    /// External metadata program returned no data
63    #[error("External metadata program returned no data")]
64    ExternalProgramReturnedNoData,
65
66    // 15
67    /// Instruction can only be used with spl-token wrapped mints
68    #[error("Instruction can only be used with spl-token wrapped mints")]
69    NoSyncingToToken2022,
70}
71
72impl From<TokenWrapError> for ProgramError {
73    fn from(e: TokenWrapError) -> Self {
74        ProgramError::Custom(e as u32)
75    }
76}
77
78impl TryFrom<u32> for TokenWrapError {
79    type Error = ProgramError;
80
81    fn try_from(value: u32) -> Result<Self, Self::Error> {
82        TokenWrapError::from_u32(value).ok_or(ProgramError::InvalidArgument)
83    }
84}
85
86impl ToStr for TokenWrapError {
87    fn to_str<E>(&self) -> &'static str
88    where
89        E: 'static + ToStr + TryFrom<u32>,
90    {
91        match self {
92            TokenWrapError::WrappedMintMismatch => "Error: WrappedMintMismatch",
93            TokenWrapError::BackpointerMismatch => "Error: BackpointerMismatch",
94            TokenWrapError::ZeroWrapAmount => "Error: ZeroWrapAmount",
95            TokenWrapError::MintAuthorityMismatch => "Error: MintAuthorityMismatch",
96            TokenWrapError::EscrowOwnerMismatch => "Error: EscrowOwnerMismatch",
97            TokenWrapError::InvalidWrappedMintOwner => "Error: InvalidWrappedMintOwner",
98            TokenWrapError::InvalidBackpointerOwner => "Error: InvalidBackpointerOwner",
99            TokenWrapError::EscrowMismatch => "Error: EscrowMismatch",
100            TokenWrapError::EscrowInGoodState => "Error: EscrowInGoodState",
101            TokenWrapError::UnwrappedMintHasNoMetadata => "Error: UnwrappedMintHasNoMetadata",
102            TokenWrapError::MetaplexMetadataMismatch => "Error: MetaplexMetadataMismatch",
103            TokenWrapError::MetadataPointerMissing => "Error: MetadataPointerMissing",
104            TokenWrapError::MetadataPointerUnset => "Error: MetadataPointerUnset",
105            TokenWrapError::MetadataPointerMismatch => "Error: MetadataPointerMismatch",
106            TokenWrapError::ExternalProgramReturnedNoData => "Error: ExternalProgramReturnedNoData",
107            TokenWrapError::NoSyncingToToken2022 => "Error: NoSyncingToToken2022",
108        }
109    }
110}
111
112/// Logs program errors
113pub fn log_error(err: &ProgramError) {
114    msg!(err.to_str::<TokenWrapError>());
115}