use anyhow::Result;
use async_trait::async_trait;
use rust_decimal::Decimal;
use solana_sdk::{pubkey::Pubkey, signature::Keypair};
use wp_solana_rpc::RpcContext;
use crate::types::{
liquidity::{
AddBatchLiquidityResult, AddLiquidityResult, CollectResult, IncreaseLiquidityParam,
RemoveBatchLiquidityResult, RemoveLiquidityResult, SimulateAddLiquidityResult,
SimulateCollectResult, SimulateRemoveLiquidityResult,
},
CurrencyAmount,
};
#[derive(Debug, Clone)]
pub struct AddLiquidityParams {
pub lower_price: Option<f64>,
pub upper_price: Option<f64>,
pub liquidity_param: IncreaseLiquidityParam,
pub specific_opts: AddLiquiditySpecificOptions,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct MintSpecificOptions {}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct IncreaseSpecificOptions {
pub position_mint: Pubkey,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum AddLiquiditySpecificOptions {
Mint,
Increase(IncreaseSpecificOptions),
}
#[derive(Debug, Clone, PartialEq)]
pub struct AddLiquidityOptions {
pub slippage_tolerance: Decimal,
}
#[derive(Debug, Clone)]
pub struct AddBatchLiquidityItem {
pub lower_price: Option<f64>,
pub upper_price: Option<f64>,
pub liquidity_param: IncreaseLiquidityParam,
pub specific_opts: AddLiquiditySpecificOptions,
}
#[derive(Debug, Clone)]
pub struct AddBatchLiquidityParams {
pub items: Vec<AddBatchLiquidityItem>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct CollectParams {
pub position_mint: Pubkey,
pub recipient: Pubkey,
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct CollectOptions {
pub expected_amount_a: Option<CurrencyAmount>,
pub expected_amount_b: Option<CurrencyAmount>,
pub authority: Option<Pubkey>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum RemoveLiquidityAmount {
Liquidity(u128),
Bps(u16),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RemoveLiquidityParams {
pub position_mint: Pubkey,
pub liquidity: RemoveLiquidityAmount,
pub recipient: Pubkey,
pub deadline: Option<u64>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct RemoveLiquidityOptions {
pub slippage_tolerance: Decimal,
pub close_position: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RemoveBatchLiquidityItem {
pub position_mint: Pubkey,
pub liquidity: RemoveLiquidityAmount,
pub close_position: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RemoveBatchLiquidityParams {
pub recipient: Pubkey,
pub deadline: Option<u64>,
pub items: Vec<RemoveBatchLiquidityItem>,
}
#[async_trait]
pub trait PoolInfuser: Send + Sync {
async fn add_liquidity(
&self,
ctx: &RpcContext,
payer: &Keypair,
params: AddLiquidityParams,
options: AddLiquidityOptions,
) -> Result<AddLiquidityResult>;
async fn add_batch_liquidity(
&self,
ctx: &RpcContext,
payer: &Keypair,
params: AddBatchLiquidityParams,
options: AddLiquidityOptions,
) -> Result<AddBatchLiquidityResult>;
async fn remove_liquidity(
&self,
ctx: &RpcContext,
payer: &Keypair,
params: RemoveLiquidityParams,
options: RemoveLiquidityOptions,
) -> Result<RemoveLiquidityResult>;
async fn remove_batch_liquidity(
&self,
ctx: &RpcContext,
payer: &Keypair,
params: RemoveBatchLiquidityParams,
options: RemoveLiquidityOptions,
) -> Result<RemoveBatchLiquidityResult>;
async fn collect(
&self,
ctx: &RpcContext,
payer: &Keypair,
params: CollectParams,
options: CollectOptions,
) -> Result<CollectResult>;
async fn calculate_add_liquidity_amounts(
&self,
ctx: &RpcContext,
amount: CurrencyAmount,
lower_price: f64,
upper_price: f64,
) -> Result<(CurrencyAmount, CurrencyAmount)>;
async fn simulate_add_liquidity(
&self,
ctx: &RpcContext,
payer: &Keypair,
params: AddLiquidityParams,
options: AddLiquidityOptions,
) -> Result<SimulateAddLiquidityResult>;
async fn simulate_remove_liquidity(
&self,
ctx: &RpcContext,
payer: &Keypair,
params: RemoveLiquidityParams,
options: RemoveLiquidityOptions,
) -> Result<SimulateRemoveLiquidityResult>;
async fn simulate_collect(
&self,
ctx: &RpcContext,
payer: &Keypair,
params: CollectParams,
options: CollectOptions,
) -> Result<SimulateCollectResult>;
}