spl-stake-pool 2.1.1

Solana Program Library Stake Pool
Documentation
//! Error types

use {
    num_derive::FromPrimitive,
    solana_program_error::{ProgramError, ToStr},
    thiserror::Error,
};

/// Errors that may be returned by the Stake Pool program.
#[derive(Clone, Debug, Eq, Error, FromPrimitive, PartialEq)]
pub enum StakePoolError {
    // 0.
    /// The account cannot be initialized because it is already being used.
    #[error("AlreadyInUse")]
    AlreadyInUse,
    /// The program address provided doesn't match the value generated by the
    /// program.
    #[error("InvalidProgramAddress")]
    InvalidProgramAddress,
    /// The stake pool state is invalid.
    #[error("InvalidState")]
    InvalidState,
    /// The calculation failed.
    #[error("CalculationFailure")]
    CalculationFailure,
    /// Stake pool fee greater than 1.
    #[error("FeeTooHigh")]
    FeeTooHigh,

    // 5.
    /// Token account is associated with the wrong mint.
    #[error("WrongAccountMint")]
    WrongAccountMint,
    /// Wrong pool manager account.
    #[error("WrongManager")]
    WrongManager,
    /// Required signature is missing.
    #[error("SignatureMissing")]
    SignatureMissing,
    /// Invalid validator stake list account.
    #[error("InvalidValidatorStakeList")]
    InvalidValidatorStakeList,
    /// Invalid manager fee account.
    #[error("InvalidFeeAccount")]
    InvalidFeeAccount,

    // 10.
    /// Specified pool mint account is wrong.
    #[error("WrongPoolMint")]
    WrongPoolMint,
    /// Stake account is not in the state expected by the program.
    #[error("WrongStakeStake")]
    WrongStakeStake,
    /// User stake is not active
    #[error("UserStakeNotActive")]
    UserStakeNotActive,
    /// Stake account voting for this validator already exists in the pool.
    #[error("ValidatorAlreadyAdded")]
    ValidatorAlreadyAdded,
    /// Stake account for this validator not found in the pool.
    #[error("ValidatorNotFound")]
    ValidatorNotFound,

    // 15.
    /// Stake account address not properly derived from the validator address.
    #[error("InvalidStakeAccountAddress")]
    InvalidStakeAccountAddress,
    /// Identify validator stake accounts with old balances and update them.
    #[error("StakeListOutOfDate")]
    StakeListOutOfDate,
    /// First update old validator stake account balances and then pool stake
    /// balance.
    #[error("StakeListAndPoolOutOfDate")]
    StakeListAndPoolOutOfDate,
    /// Validator stake account is not found in the list storage.
    #[error("UnknownValidatorStakeAccount")]
    UnknownValidatorStakeAccount,
    /// Wrong minting authority set for mint pool account
    #[error("WrongMintingAuthority")]
    WrongMintingAuthority,

    // 20.
    /// The size of the given validator stake list does match the expected
    /// amount
    #[error("UnexpectedValidatorListAccountSize")]
    UnexpectedValidatorListAccountSize,
    /// Wrong pool staker account.
    #[error("WrongStaker")]
    WrongStaker,
    /// Pool token supply is not zero on initialization
    #[error("NonZeroPoolTokenSupply")]
    NonZeroPoolTokenSupply,
    /// The lamports in the validator stake account is not equal to the minimum
    #[error("StakeLamportsNotEqualToMinimum")]
    StakeLamportsNotEqualToMinimum,
    /// The provided deposit stake account is not delegated to the preferred
    /// deposit vote account
    #[error("IncorrectDepositVoteAddress")]
    IncorrectDepositVoteAddress,

    // 25.
    /// The provided withdraw stake account is not the preferred deposit vote
    /// account
    #[error("IncorrectWithdrawVoteAddress")]
    IncorrectWithdrawVoteAddress,
    /// The mint has an invalid freeze authority
    #[error("InvalidMintFreezeAuthority")]
    InvalidMintFreezeAuthority,
    /// Proposed fee increase exceeds stipulated ratio
    #[error("FeeIncreaseTooHigh")]
    FeeIncreaseTooHigh,
    /// Not enough pool tokens provided to withdraw stake with one lamport
    #[error("WithdrawalTooSmall")]
    WithdrawalTooSmall,
    /// Not enough lamports provided for deposit to result in one pool token
    #[error("DepositTooSmall")]
    DepositTooSmall,

    // 30.
    /// Provided stake deposit authority does not match the program's
    #[error("InvalidStakeDepositAuthority")]
    InvalidStakeDepositAuthority,
    /// Provided sol deposit authority does not match the program's
    #[error("InvalidSolDepositAuthority")]
    InvalidSolDepositAuthority,
    /// Provided preferred validator is invalid
    #[error("InvalidPreferredValidator")]
    InvalidPreferredValidator,
    /// Provided validator stake account already has a transient stake account
    /// in use
    #[error("TransientAccountInUse")]
    TransientAccountInUse,
    /// Provided sol withdraw authority does not match the program's
    #[error("InvalidSolWithdrawAuthority")]
    InvalidSolWithdrawAuthority,

    // 35.
    /// Too much SOL withdrawn from the stake pool's reserve account
    #[error("SolWithdrawalTooLarge")]
    SolWithdrawalTooLarge,
    /// Provided metadata account does not match metadata account derived for
    /// pool mint
    #[error("InvalidMetadataAccount")]
    InvalidMetadataAccount,
    /// The mint has an unsupported extension
    #[error("UnsupportedMintExtension")]
    UnsupportedMintExtension,
    /// The fee account has an unsupported extension
    #[error("UnsupportedFeeAccountExtension")]
    UnsupportedFeeAccountExtension,
    /// Instruction exceeds desired slippage limit
    #[error("Instruction exceeds desired slippage limit")]
    ExceededSlippage,

    // 40.
    /// Provided mint does not have 9 decimals to match SOL
    #[error("IncorrectMintDecimals")]
    IncorrectMintDecimals,
    /// Pool reserve does not have enough lamports to fund rent-exempt reserve
    /// in split destination. Deposit more SOL in reserve, or pre-fund split
    /// destination with the rent-exempt reserve for a stake account.
    #[error("ReserveDepleted")]
    ReserveDepleted,
    /// Missing required sysvar account
    #[error("Missing required sysvar account")]
    MissingRequiredSysvar,
    /// Epoch reward distribution is currently in progress, stakes are still being updated
    #[error("Epoch reward distribution is currently in progress, stakes are still being updated")]
    EpochRewardDistributionInProgress,
    /// The stake pool has too many validators in the pool
    #[error("The stake pool has too many validators in the pool")]
    TooManyValidatorsInPool,
}
impl From<StakePoolError> for ProgramError {
    fn from(e: StakePoolError) -> Self {
        ProgramError::Custom(e as u32)
    }
}
impl TryFrom<u32> for StakePoolError {
    type Error = ProgramError;
    fn try_from(code: u32) -> Result<Self, Self::Error> {
        num_traits::FromPrimitive::from_u32(code).ok_or(ProgramError::InvalidArgument)
    }
}
impl ToStr for StakePoolError {
    fn to_str(&self) -> &'static str {
        match self {
            // 0.
            Self::AlreadyInUse => "Error: The account cannot be initialized because it is already being used.",
            Self::InvalidProgramAddress => "Error: The program address provided doesn't match the value generated by the program.",
            Self::InvalidState => "Error: The stake pool state is invalid.",
            Self::CalculationFailure => "Error: The calculation failed.",
            Self::FeeTooHigh => "Error: Stake pool fee greater than 1.",

            // 5.
            Self::WrongAccountMint => "Error: Token account is associated with the wrong mint.",
            Self::WrongManager => "Error: Wrong pool manager account.",
            Self::SignatureMissing => "Error: Required signature is missing.",
            Self::InvalidValidatorStakeList => "Error: Invalid validator stake list account.",
            Self::InvalidFeeAccount => "Error: Invalid manager fee account.",

            // 10.
            Self::WrongPoolMint => "Error: Specified pool mint account is wrong.",
            Self::WrongStakeStake => "Error: Stake account is not in the state expected by the program.",
            Self::UserStakeNotActive => "Error: User stake is not active",
            Self::ValidatorAlreadyAdded => "Error: Stake account voting for this validator already exists in the pool.",
            Self::ValidatorNotFound => "Error: Stake account for this validator not found in the pool.",

            // 15.
            Self::InvalidStakeAccountAddress => "Error: Stake account address not properly derived from the validator address.",
            Self::StakeListOutOfDate => "Error: Identify validator stake accounts with old balances and update them.",
            Self::StakeListAndPoolOutOfDate => "Error: First update old validator stake account balances and then pool stake balance.",
            Self::UnknownValidatorStakeAccount => "Error: Validator stake account is not found in the list storage.",
            Self::WrongMintingAuthority => "Error: Wrong minting authority set for mint pool account",

            // 20.
            Self::UnexpectedValidatorListAccountSize => "Error: The size of the given validator stake list does match the expected amount",
            Self::WrongStaker => "Error: Wrong pool staker account.",
            Self::NonZeroPoolTokenSupply => "Error: Pool token supply is not zero on initialization",
            Self::StakeLamportsNotEqualToMinimum => "Error: The lamports in the validator stake account is not equal to the minimum",
            Self::IncorrectDepositVoteAddress => "Error: The provided deposit stake account is not delegated to the preferred deposit vote account",

            // 25.
            Self::IncorrectWithdrawVoteAddress => "Error: The provided withdraw stake account is not the preferred deposit vote account",
            Self::InvalidMintFreezeAuthority => "Error: The mint has an invalid freeze authority",
            Self::FeeIncreaseTooHigh => "Error: Proposed fee increase exceeds stipulated ratio",
            Self::WithdrawalTooSmall => "Error: Not enough pool tokens provided to withdraw stake with one lamport",
            Self::DepositTooSmall => "Error: Not enough lamports provided for deposit to result in one pool token",

            // 30.
            Self::InvalidStakeDepositAuthority => "Error: Provided stake deposit authority does not match the program's",
            Self::InvalidSolDepositAuthority => "Error: Provided sol deposit authority does not match the program's",
            Self::InvalidPreferredValidator => "Error: Provided preferred validator is invalid",
            Self::TransientAccountInUse => "Error: Provided validator stake account already has a transient stake account in use",
            Self::InvalidSolWithdrawAuthority => "Error: Provided sol withdraw authority does not match the program's",

            // 35.
            Self::SolWithdrawalTooLarge => "Error: Too much SOL withdrawn from the stake pool's reserve account",
            Self::InvalidMetadataAccount => "Error: Provided metadata account does not match metadata account derived for pool mint",
            Self::UnsupportedMintExtension => "Error: The mint has an unsupported extension",
            Self::UnsupportedFeeAccountExtension => "Error: The fee account has an unsupported extension",
            Self::ExceededSlippage => "Error: Instruction exceeds desired slippage limit",

            // 40.
            Self::IncorrectMintDecimals => "Error: Provided mint does not have 9 decimals to match SOL",
            Self::ReserveDepleted => "Error: Pool reserve does not have enough lamports to fund rent-exempt reserve in split destination. Deposit more SOL in reserve, or pre-fund split destination with the rent-exempt reserve for a stake account.",
            Self::MissingRequiredSysvar => "Error: Missing required sysvar account",
            Self::EpochRewardDistributionInProgress => "Error: Epoch reward distribution is currently in progress, stakes are still being updated",
            Self::TooManyValidatorsInPool => "Error: The stake pool has too many validators in the pool",
        }
    }
}