use num_derive::FromPrimitive;
use solana_program::{
decode_error::DecodeError,
msg,
program_error::{PrintProgramError, ProgramError},
};
use thiserror::Error;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Error, FromPrimitive)]
pub enum SwapError {
#[error("Swap account already in use")]
AlreadyInUse,
#[error("Address of the admin fee account is incorrect")]
InvalidAdmin,
#[error("Input account owner is not the program address")]
InvalidOwner,
#[error("Output pool account owner cannot be the program address")]
InvalidOutputOwner,
#[error("Invalid program address generated from nonce and key")]
InvalidProgramAddress,
#[error("Deserialized account is not an SPL Token mint")]
ExpectedMint,
#[error("Deserialized account is not an SPL Token account")]
ExpectedAccount,
#[error("Pool token supply is 0")]
EmptyPool,
#[error("Input token account empty")]
EmptySupply,
#[error("Pool token mint has a non-zero supply")]
InvalidSupply,
#[error("Token account has a delegate")]
InvalidDelegate,
#[error("InvalidInput")]
InvalidInput,
#[error("Address of the provided swap token account is incorrect")]
IncorrectSwapAccount,
#[error("Address of the provided token mint is incorrect")]
IncorrectMint,
#[error("CalculationFailure")]
CalculationFailure,
#[error("Invalid instruction")]
InvalidInstruction,
#[error("Swap input token accounts have the same mint")]
RepeatedMint,
#[error("Swap instruction exceeds desired slippage limit")]
ExceededSlippage,
#[error("Token account has a close authority")]
InvalidCloseAuthority,
#[error("Pool token mint has a freeze authority")]
InvalidFreezeAuthority,
#[error("Conversion to u64 failed with an overflow or underflow")]
ConversionFailure,
#[error("Account is not authorized to execute this instruction")]
Unauthorized,
#[error("Swap pool is paused")]
IsPaused,
#[error("Ramp is locked in this time period")]
RampLocked,
#[error("Insufficient ramp time")]
InsufficientRampTime,
#[error("Active admin transfer in progress")]
ActiveTransfer,
#[error("No active admin transfer in progress")]
NoActiveTransfer,
#[error("Admin transfer deadline exceeded")]
AdminDeadlineExceeded,
#[error("Token mints must have same decimals")]
MismatchedDecimals,
}
impl From<SwapError> for ProgramError {
fn from(e: SwapError) -> Self {
ProgramError::Custom(e as u32)
}
}
impl<T> DecodeError<T> for SwapError {
fn type_of() -> &'static str {
"Swap Error"
}
}
impl PrintProgramError for SwapError {
fn print<E>(&self)
where
E: 'static
+ std::error::Error
+ DecodeError<E>
+ PrintProgramError
+ num_traits::FromPrimitive,
{
match self {
SwapError::AlreadyInUse => msg!("Error: Swap account already in use"),
SwapError::InvalidAdmin => {
msg!("Error: Address of the admin fee account is incorrect")
}
SwapError::InvalidOwner => {
msg!("Error: The input account owner is not the program address")
}
SwapError::InvalidOutputOwner => {
msg!("Error: Output pool account owner cannot be the program address")
}
SwapError::InvalidProgramAddress => {
msg!("Error: Invalid program address generated from nonce and key")
}
SwapError::ExpectedMint => {
msg!("Error: Deserialized account is not an SPL Token mint")
}
SwapError::ExpectedAccount => {
msg!("Error: Deserialized account is not an SPL Token account")
}
SwapError::EmptySupply => msg!("Error: Input token account empty"),
SwapError::EmptyPool => msg!("Error: Pool token supply is 0"),
SwapError::InvalidSupply => msg!("Error: Pool token mint has a non-zero supply"),
SwapError::RepeatedMint => msg!("Error: Swap input token accounts have the same mint"),
SwapError::InvalidDelegate => msg!("Error: Token account has a delegate"),
SwapError::InvalidInput => msg!("Error: InvalidInput"),
SwapError::IncorrectSwapAccount => {
msg!("Error: Address of the provided swap token account is incorrect")
}
SwapError::IncorrectMint => {
msg!("Error: Address of the provided token mint is incorrect")
}
SwapError::CalculationFailure => msg!("Error: CalculationFailure"),
SwapError::InvalidInstruction => msg!("Error: InvalidInstruction"),
SwapError::ExceededSlippage => {
msg!("Error: Swap instruction exceeds desired slippage limit")
}
SwapError::InvalidCloseAuthority => msg!("Error: Token account has a close authority"),
SwapError::InvalidFreezeAuthority => {
msg!("Error: Pool token mint has a freeze authority")
}
SwapError::ConversionFailure => msg!("Error: Conversion to or from u64 failed"),
SwapError::Unauthorized => {
msg!("Error: Account is not authorized to execute this instruction")
}
SwapError::IsPaused => msg!("Error: Swap pool is paused"),
SwapError::RampLocked => msg!("Error: Ramp is locked in this time period"),
SwapError::InsufficientRampTime => msg!("Error: Insufficient ramp time"),
SwapError::ActiveTransfer => msg!("Error: Active admin transfer in progress"),
SwapError::NoActiveTransfer => msg!("Error: No active admin transfer in progress"),
SwapError::AdminDeadlineExceeded => msg!("Error: Admin transfer deadline exceeded"),
SwapError::MismatchedDecimals => msg!("Error: Token mints must have same decimals"),
}
}
}