use solana_account::Account as SolanaAccount;
use spl_token_2022_interface::{
extension::{transfer_fee::TransferFeeConfig, BaseStateWithExtensions, StateWithExtensions},
state::Mint,
};
use wp_solana_amm_math::liquidity_math::TransferFee;
pub mod account_planner;
pub mod account_state;
pub mod adapter;
#[cfg(feature = "legacy-wsol-shell")]
pub mod async_shell;
pub use account_planner::{
plan_token_account_instructions, TokenAccountInstructions, TokenAccountStrategy,
};
pub use account_state::{MintAndAta, TokenAccountState};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum NativeMintWrappingStrategy {
#[default]
Ata,
Keypair,
Seed,
None,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct WorkspacePlanConfig {
pub wsol_strategy: NativeMintWrappingStrategy,
pub enforce_balance: bool,
}
impl Default for WorkspacePlanConfig {
fn default() -> Self {
Self { wsol_strategy: NativeMintWrappingStrategy::Ata, enforce_balance: true }
}
}
pub fn get_current_transfer_fee(
mint_info: Option<&SolanaAccount>,
epoch: u64,
) -> Option<TransferFee> {
let token_mint_data = &mint_info?.data;
let token_mint_unpacked = StateWithExtensions::<Mint>::unpack(token_mint_data).ok()?;
if let Ok(transfer_fee_config) = token_mint_unpacked.get_extension::<TransferFeeConfig>() {
let fee = transfer_fee_config.get_epoch_fee(epoch);
return Some(TransferFee {
fee_bps: fee.transfer_fee_basis_points.into(),
max_fee: fee.maximum_fee.into(),
});
}
None
}