use alloy::primitives::{aliases::I24, Address, Bytes, U256};
use anyhow::Result;
use derive_more::{Deref, DerefMut};
use uniswap_sdk_core::prelude::BaseCurrency;
use uniswap_v4_sdk::{
abi::{
BurnPositionParams, DecreaseLiquidityParams, IncreaseLiquidityParams, MintPositionParams,
SettlePairParams, SweepParams, TakePairParams,
},
prelude::{Actions, Pool, V4Planner},
utils::currency_map::to_address,
};
use crate::types::v4_pool_key::V4PoolKey;
#[derive(Clone, Debug, Default, PartialEq, Deref, DerefMut)]
pub struct V4PositionPlanner(pub V4Planner);
impl V4PositionPlanner {
#[allow(clippy::too_many_arguments)]
#[inline]
pub fn add_mint(
&mut self,
pool_key: &V4PoolKey,
tick_lower: I24,
tick_upper: I24,
liquidity: U256,
amount0_max: u128,
amount1_max: u128,
owner: Address,
) -> Result<()> {
let pool_key_v4 = Pool::get_pool_key(
&pool_key.token_a,
&pool_key.token_b,
pool_key.fee,
pool_key.tick_spacing,
pool_key.hooks,
)?;
self.add_action(&Actions::MINT_POSITION(MintPositionParams {
poolKey: pool_key_v4,
tickLower: tick_lower,
tickUpper: tick_upper,
liquidity,
amount0Max: amount0_max,
amount1Max: amount1_max,
owner,
hookData: Bytes::from(pool_key.hooks.into_word()),
}));
Ok(())
}
#[inline]
pub fn add_increase(
&mut self,
token_id: U256,
liquidity: U256,
amount0_max: u128,
amount1_max: u128,
hook_data: Bytes,
) {
self.add_action(&Actions::INCREASE_LIQUIDITY(IncreaseLiquidityParams {
tokenId: token_id,
liquidity,
amount0Max: amount0_max,
amount1Max: amount1_max,
hookData: hook_data,
}));
}
#[inline]
pub fn add_decrease(
&mut self,
token_id: U256,
liquidity: U256,
amount0_min: u128,
amount1_min: u128,
hook_data: Bytes,
) {
self.add_action(&Actions::DECREASE_LIQUIDITY(DecreaseLiquidityParams {
tokenId: token_id,
liquidity,
amount0Min: amount0_min,
amount1Min: amount1_min,
hookData: hook_data,
}));
}
#[inline]
pub fn add_burn(
&mut self,
token_id: U256,
amount0_min: u128,
amount1_min: u128,
hook_data: Bytes,
) {
self.add_action(&Actions::BURN_POSITION(BurnPositionParams {
tokenId: token_id,
amount0Min: amount0_min,
amount1Min: amount1_min,
hookData: hook_data,
}));
}
#[inline]
pub fn add_settle_pair(
&mut self,
currency0: &impl BaseCurrency,
currency1: &impl BaseCurrency,
) {
self.add_action(&Actions::SETTLE_PAIR(SettlePairParams {
currency0: to_address(currency0),
currency1: to_address(currency1),
}));
}
#[inline]
pub fn add_take_pair(
&mut self,
currency0: &impl BaseCurrency,
currency1: &impl BaseCurrency,
recipient: Address,
) {
self.add_action(&Actions::TAKE_PAIR(TakePairParams {
currency0: to_address(currency0),
currency1: to_address(currency1),
recipient,
}));
}
#[inline]
pub fn add_sweep(&mut self, currency: &impl BaseCurrency, recipient: Address) {
self.add_action(&Actions::SWEEP(SweepParams { currency: to_address(currency), recipient }));
}
}