use alloy_primitives::{Address, B256, U256};
pub use wp_evm_base::types::PlanFragment;
pub use wp_evm_v4_interfaces::pool::PoolKey;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PoolState {
pub pool_key: PoolKey,
pub pool_id: B256,
pub sqrt_price_x96: U256,
pub tick: i32,
pub liquidity: u128,
pub protocol_fee: u32,
pub lp_fee: u32,
pub ticks: Vec<TickInfo>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TickInfo {
pub tick: i32,
pub liquidity_net: i128,
pub liquidity_gross: u128,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PositionState {
pub token_id: U256,
pub owner: Address,
pub pool_key: PoolKey,
pub pool_id: B256,
pub tick_lower: i32,
pub tick_upper: i32,
pub liquidity: u128,
pub fees_owed_0: U256,
pub fees_owed_1: U256,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct V4ProtocolConfig {
pub pool_manager: Address,
pub position_manager: Address,
pub universal_router: Address,
pub state_view: Address,
pub quoter: Address,
pub permit2: Address,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ExactInParams {
pub currency_in: Address,
pub currency_out: Address,
pub amount_in: U256,
pub recipient: Address,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ExactOutParams {
pub currency_in: Address,
pub currency_out: Address,
pub amount_out: U256,
pub recipient: Address,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AddLiquidityParams {
pub pool_key: PoolKey,
pub tick_lower: i32,
pub tick_upper: i32,
pub liquidity: u128,
pub recipient: Address,
pub salt: B256,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RemoveLiquidityParams {
pub pool_key: PoolKey, pub token_id: U256,
pub liquidity: u128,
pub amount0_min: Option<U256>,
pub amount1_min: Option<U256>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct IncreaseLiquidityCallerParams {
pub token_id: U256,
pub pool_key: PoolKey,
pub liquidity: u128,
pub amount0_max: U256,
pub amount1_max: U256,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CollectFeesParams {
pub token_id: U256,
pub recipient: Address,
pub pool_key: PoolKey,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Quote {
pub amount_in: U256,
pub amount_out: U256,
pub sqrt_price_x96_after: U256,
pub price_impact_bps: u16,
pub effective_fee_pips: u32,
}
#[cfg(test)]
mod tests {
use super::*;
use alloy_primitives::{address, aliases::I24, aliases::U24, b256, U256};
#[test]
fn increase_liquidity_caller_params_carries_pool_key_and_amount_caps() {
let pool_key = PoolKey {
currency0: address!("A0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"),
currency1: address!("C02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"),
fee: U24::from(500u32),
tickSpacing: I24::try_from(10).unwrap(),
hooks: Address::ZERO,
};
let p = IncreaseLiquidityCallerParams {
token_id: U256::from(42u64),
pool_key: pool_key.clone(),
liquidity: 1_000_000_000_000u128,
amount0_max: U256::from(1_000_000u64),
amount1_max: U256::from(2_000_000u64),
};
assert_eq!(p.token_id, U256::from(42u64));
assert_eq!(p.pool_key, pool_key);
assert_eq!(p.liquidity, 1_000_000_000_000u128);
assert_eq!(p.amount0_max, U256::from(1_000_000u64));
assert_eq!(p.amount1_max, U256::from(2_000_000u64));
}
#[test]
fn pool_state_constructs() {
let key = PoolKey {
currency0: address!("0000000000000000000000000000000000000000"),
currency1: address!("C02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"),
fee: U24::from(3000u32),
tickSpacing: I24::try_from(60i32).unwrap(),
hooks: address!("0000000000000000000000000000000000000000"),
};
let s = PoolState {
pool_key: key,
pool_id: b256!("0000000000000000000000000000000000000000000000000000000000000001"),
sqrt_price_x96: U256::from(1u64) << 96,
tick: 0i32,
liquidity: 0u128,
protocol_fee: 0u32,
lp_fee: 3000u32,
ticks: vec![],
};
assert_eq!(s.lp_fee, 3000);
assert_eq!(s.pool_key.fee, U24::from(3000u32));
}
}