use alloy::{network::Ethereum, primitives::Address, providers::DynProvider};
use anyhow::Result;
use tracing::{debug, instrument};
use uniswap_sdk_core::entities::BaseCurrency;
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 })
}
pub fn pool_a(&self) -> &(V3PoolKey, Address) { &self.pool_a }
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);