use anchor_lang::{prelude::*, solana_program::pubkey::PUBKEY_BYTES};
use stable_swap_anchor::SwapInfo;
#[account]
#[derive(Copy, Default, Debug)]
pub struct PoolManager {
pub base: Pubkey,
pub bump: u8,
pub num_pools: u64,
pub admin: Pubkey,
pub pending_admin: Pubkey,
pub initial_fees: SwapFees,
pub min_permissionless_amp_factor: u64,
pub max_permissionless_amp_factor: u64,
pub operator: Pubkey,
pub beneficiary: Pubkey,
}
impl PoolManager {
pub const LEN: usize =
PUBKEY_BYTES + 1 + 8 + PUBKEY_BYTES * 2 + SwapFees::LEN + 8 + 8 + PUBKEY_BYTES * 2;
}
#[account]
#[derive(Copy, Default, Debug)]
pub struct Pool {
pub manager: Pubkey,
pub mint_a: Pubkey,
pub mint_b: Pubkey,
pub bump: u8,
pub swap: Pubkey,
pub index: u64,
pub token_a_fees: Pubkey,
pub token_b_fees: Pubkey,
pub lp_mint: Pubkey,
pub token_decimals: u8,
pub permissionless_import: bool,
}
impl Pool {
pub const LEN: usize = PUBKEY_BYTES * 3 + 1 + PUBKEY_BYTES + 8 + PUBKEY_BYTES * 3 + 1 + 1;
}
pub trait SortedMints {
fn sorted_mints(&self) -> (&Pubkey, &Pubkey);
}
impl SortedMints for SwapInfo {
fn sorted_mints(&self) -> (&Pubkey, &Pubkey) {
if self.token_a.mint < self.token_b.mint {
(&self.token_a.mint, &self.token_b.mint)
} else {
(&self.token_b.mint, &self.token_a.mint)
}
}
}
impl SortedMints for Pool {
fn sorted_mints(&self) -> (&Pubkey, &Pubkey) {
if self.mint_a < self.mint_b {
(&self.mint_a, &self.mint_b)
} else {
(&self.mint_b, &self.mint_a)
}
}
}
#[derive(AnchorSerialize, AnchorDeserialize, Clone, Copy, Default, Debug, PartialEq, Eq)]
pub struct SwapFees {
pub admin_trade_fee_numerator: u64,
pub admin_trade_fee_denominator: u64,
pub admin_withdraw_fee_numerator: u64,
pub admin_withdraw_fee_denominator: u64,
pub trade_fee_numerator: u64,
pub trade_fee_denominator: u64,
pub withdraw_fee_numerator: u64,
pub withdraw_fee_denominator: u64,
}
impl SwapFees {
pub const LEN: usize = 8 * 8;
}
impl From<SwapFees> for stable_swap_client::fees::Fees {
fn from(e: SwapFees) -> Self {
let SwapFees {
admin_trade_fee_numerator,
admin_trade_fee_denominator,
admin_withdraw_fee_numerator,
admin_withdraw_fee_denominator,
trade_fee_numerator,
trade_fee_denominator,
withdraw_fee_numerator,
withdraw_fee_denominator,
} = e;
Self {
admin_trade_fee_numerator,
admin_trade_fee_denominator,
admin_withdraw_fee_numerator,
admin_withdraw_fee_denominator,
trade_fee_numerator,
trade_fee_denominator,
withdraw_fee_numerator,
withdraw_fee_denominator,
}
}
}