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::{network::Ethereum, primitives::Address, providers::DynProvider};
use anyhow::Result;
use tracing::{debug, instrument};
use uniswap_sdk_core::entities::BaseCurrency;

// Import macro from common module
use crate::impl_v3_two_pool_viewer;
use crate::{impl_v3_multi_pool_state, traits::pool_base::PoolBase, types::v3_pool_key::V3PoolKey};

#[derive(Clone, Debug)]
pub struct V3TwoPoolViewer {
    pub pool_a: (V3PoolKey, Address),
    pub pool_b: (V3PoolKey, Address),
    pub provider: DynProvider<Ethereum>,
}

impl V3TwoPoolViewer {
    #[instrument(skip(pool_a, pool_b), fields(pool_a_token_a = ?pool_a.token_a.address(), pool_a_token_b = ?pool_a.token_b.address(), pool_a_fee = ?pool_a.fee, pool_b_token_a = ?pool_b.token_a.address(), pool_b_token_b = ?pool_b.token_b.address(), pool_b_fee = ?pool_b.fee))]
    pub fn new(
        pool_a: V3PoolKey,
        pool_b: V3PoolKey,
        pool_a_address: Address,
        pool_b_address: Address,
        provider: DynProvider<Ethereum>,
    ) -> Result<Self> {
        debug!(pool_address = ?pool_a_address, "Using provided pool_a address");
        debug!(pool_address = ?pool_b_address, "Using provided pool_b address");
        Ok(Self { pool_a: (pool_a, pool_a_address), pool_b: (pool_b, pool_b_address), provider })
    }

    /// Get the first pool key and address
    pub fn pool_a(&self) -> &(V3PoolKey, Address) { &self.pool_a }

    /// Get the second pool key and address
    pub fn pool_b(&self) -> &(V3PoolKey, Address) { &self.pool_b }

    pub fn pools(&self) -> Vec<(V3PoolKey, Address)> {
        vec![self.pool_a.clone(), self.pool_b.clone()]
    }
}

impl PoolBase for V3TwoPoolViewer {
    fn currency0(&self) -> uniswap_sdk_core::prelude::Currency { self.pool_a().0.token_a.clone() }

    fn currency1(&self) -> uniswap_sdk_core::prelude::Currency { self.pool_b().0.token_b.clone() }
}

impl_v3_two_pool_viewer!(V3TwoPoolViewer);
impl_v3_multi_pool_state!(V3TwoPoolViewer);