waterpump-evm-pool-sdk 0.1.0

EVM pool SDK — viewers, infusers, harvesters, swappers for Uniswap V3/V4, PancakeSwap, Slipstream, Shadow, Algebra
Documentation
/// Macro to generate intermediate_token() method for two-pool viewers
/// Assumes the struct has pool_a() and pool_b() methods returning &(PoolKey,
/// Address) where PoolKey implements the PoolKey trait
#[macro_export]
macro_rules! impl_intermediate_token {
    ($struct_name:ident) => {
        impl $struct_name {
            /// Get the intermediate token that connects the two pools
            /// Returns the common token between pool_a and pool_b
            pub fn intermediate_token(
                &self,
            ) -> anyhow::Result<uniswap_sdk_core::prelude::Currency> {
                let pool_a_key = &self.pool_a().0;
                let pool_b_key = &self.pool_b().0;

                if pool_a_key.token_b.address() == pool_b_key.token_a.address() {
                    // Path: token_a_a -> token_b_a (== token_a_b) -> token_b_b
                    Ok(pool_a_key.token_b.clone())
                } else if pool_a_key.token_b.address() == pool_b_key.token_b.address() {
                    // Path: token_a_a -> token_b_a (== token_b_b) -> token_a_b
                    Ok(pool_a_key.token_b.clone())
                } else if pool_a_key.token_a.address() == pool_b_key.token_a.address() {
                    // Path: token_b_a -> token_a_a (== token_a_b) -> token_b_b
                    Ok(pool_a_key.token_a.clone())
                } else if pool_a_key.token_a.address() == pool_b_key.token_b.address() {
                    // Path: token_b_a -> token_a_a (== token_b_b) -> token_a_b
                    Ok(pool_a_key.token_a.clone())
                } else {
                    anyhow::bail!(
                        "Pools are not connected: pool_a ({:?}/{:?}) and pool_b ({:?}/{:?})",
                        pool_a_key.token_a.address(),
                        pool_a_key.token_b.address(),
                        pool_b_key.token_a.address(),
                        pool_b_key.token_b.address()
                    );
                }
            }
        }
    };
}