use anyhow::Result;
use uniswap_sdk_core::{entities::BaseCurrency, prelude::Currency};
use crate::common::price_utils::PoolKey;
pub fn determine_two_hop_path_tokens(
pool_a_key: &impl PoolKey,
pool_b_key: &impl PoolKey,
is_to_pool_b: bool,
) -> Result<(Currency, Currency, Currency)> {
let (token0, token1, token2) =
if pool_a_key.token_b().address() == pool_b_key.token_a().address() {
if is_to_pool_b {
(
pool_a_key.token_a().clone(),
pool_a_key.token_b().clone(),
pool_b_key.token_b().clone(),
)
} else {
(
pool_b_key.token_b().clone(),
pool_b_key.token_a().clone(),
pool_a_key.token_a().clone(),
)
}
} else if pool_a_key.token_b().address() == pool_b_key.token_b().address() {
if is_to_pool_b {
(
pool_a_key.token_a().clone(),
pool_a_key.token_b().clone(),
pool_b_key.token_a().clone(),
)
} else {
(
pool_b_key.token_a().clone(),
pool_b_key.token_b().clone(),
pool_a_key.token_a().clone(),
)
}
} else if pool_a_key.token_a().address() == pool_b_key.token_a().address() {
if is_to_pool_b {
(
pool_a_key.token_b().clone(),
pool_a_key.token_a().clone(),
pool_b_key.token_b().clone(),
)
} else {
(
pool_b_key.token_b().clone(),
pool_b_key.token_a().clone(),
pool_a_key.token_b().clone(),
)
}
} else if pool_a_key.token_a().address() == pool_b_key.token_b().address() {
if is_to_pool_b {
(
pool_a_key.token_b().clone(),
pool_a_key.token_a().clone(),
pool_b_key.token_a().clone(),
)
} else {
(
pool_b_key.token_a().clone(),
pool_b_key.token_b().clone(),
pool_a_key.token_b().clone(),
)
}
} else {
return Err(anyhow::anyhow!("Pools must share a common token for two-hop swap"));
};
Ok((token0, token1, token2))
}