waterpump-evm-pool-sdk 0.1.0

EVM pool SDK — viewers, infusers, harvesters, swappers for Uniswap V3/V4, PancakeSwap, Slipstream, Shadow, Algebra
Documentation
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 }));
    }
}