use astroport::{asset::MINIMUM_LIQUIDITY_AMOUNT, pair::MAX_FEE_SHARE_BPS};
use cosmwasm_std::{OverflowError, StdError, Uint128};
use cw_utils::{ParseReplyError, PaymentError};
use thiserror::Error;
#[derive(Error, Debug, PartialEq)]
pub enum ContractError {
#[error("{0}")]
Std(#[from] StdError),
#[error("{0}")]
PaymentError(#[from] PaymentError),
#[error("{0}")]
ParseReplyError(#[from] ParseReplyError),
#[error("Unauthorized")]
Unauthorized {},
#[error("CW20 tokens can be swapped via Cw20::Send message only")]
Cw20DirectSwap {},
#[error("Operation non supported")]
NonSupported {},
#[error("Event of zero transfer")]
InvalidZeroAmount {},
#[error("Operation exceeds max spread limit")]
MaxSpreadAssertion {},
#[error("Provided spread amount exceeds allowed limit")]
AllowedSpreadAssertion {},
#[error("Operation exceeds max splippage tolerance")]
MaxSlippageAssertion {},
#[error("Slippage is more than expected: received {0}, expected {1} LP tokens")]
ProvideSlippageViolation(Uint128, Uint128),
#[error("Received {received} {asset_name} but expected {expected}")]
WithdrawSlippageViolation {
asset_name: String,
received: Uint128,
expected: Uint128,
},
#[error("Wrong asset length: expected {expected}, actual {actual}")]
WrongAssetLength { expected: usize, actual: usize },
#[error("Doubling assets in asset infos")]
DoublingAssets {},
#[error("Asset mismatch between the requested and the stored asset in contract")]
AssetMismatch {},
#[error("Pair type mismatch. Check factory pair configs")]
PairTypeMismatch {},
#[error("Incentives address is not set in factory. Cannot auto-stake")]
AutoStakeError {},
#[error("Initial liquidity must be more than {}", MINIMUM_LIQUIDITY_AMOUNT)]
MinimumLiquidityAmountError {},
#[error("Failed to migrate the contract")]
MigrationError {},
#[error("Failed to parse or process reply message")]
FailedToParseReply {},
#[error(
"Fee share is 0 or exceeds maximum allowed value of {} bps",
MAX_FEE_SHARE_BPS
)]
FeeShareOutOfBounds {},
}
impl From<OverflowError> for ContractError {
fn from(o: OverflowError) -> Self {
StdError::from(o).into()
}
}