diff --git a/bin/rb/src/commands/pool.rs b/bin/rb/src/commands/pool.rs index 8f01d20..e84f42c 100644 --- a/bin/rb/src/commands/pool.rs +++ b/bin/rb/src/commands/pool.rs @@ -7,6 +7,7 @@ use lib::prelude::*; use tokens::erc20::Erc20; use tokens::erc20_constants; use uniswap_v3_sdk::prelude::FeeAmount; +use uniswapv3pool::pool_calcs::fee_to_float; use uniswapv3pool::pool_constants; use uniswapv3pool::univ3contract::UniswapV3PoolContract; use uniswapv3pool::univ3sdk::UniswapV3PoolSdk; @@ -159,7 +160,7 @@ pub async fn pool_list(args: ListArgs, provider: RootProvider) -> Result<()> { FeeAmount::HIGH, ]; - println!("Fee Pool Address Liquidity Rate Current Tick"); + println!("Fee Pool Address Liquidity Current Tick Rate"); for fee in fees { match UniswapV3PoolSdk::from_pool_key( id, @@ -176,9 +177,11 @@ pub async fn pool_list(args: ListArgs, provider: RootProvider) -> Result<()> { pool.one_line_info().ok(); } Err(_error) => { - let fee_num: usize = *fee as usize; - let fee_num = fee_num as f32; - let fee_num = fee_num / 10000.0; + let fee_num = fee_to_float(*fee); + + // let fee_num: usize = *fee as usize; + // let fee_num = fee_num as f32; + // let fee_num = fee_num / 10000.0; println!("{:<4}% No liquidity pool", fee_num); } }; diff --git a/crates/uniswapv3pool/src/lib.rs b/crates/uniswapv3pool/src/lib.rs index 02877ba..f9fc3a0 100644 --- a/crates/uniswapv3pool/src/lib.rs +++ b/crates/uniswapv3pool/src/lib.rs @@ -1,3 +1,4 @@ +pub mod pool_calcs; pub mod pool_constants; pub mod univ3contract; pub mod univ3sdk; diff --git a/crates/uniswapv3pool/src/pool_calcs.rs b/crates/uniswapv3pool/src/pool_calcs.rs new file mode 100644 index 0000000..27a51a5 --- /dev/null +++ b/crates/uniswapv3pool/src/pool_calcs.rs @@ -0,0 +1,30 @@ +use eyre::{eyre, Result}; +use uniswap_v3_sdk::prelude::FeeAmount; + +pub fn fee_to_float(fee: FeeAmount) -> f32 { + let fee_num: usize = fee as usize; + let fee_num = fee_num as f32; + fee_num / 10000.0 +} + +pub fn tick_to_exchange_rate( + tick: i32, + token_one_decimals: u64, + token_two_decimals: u64, +) -> Result { + let tick = tick as f64; + let base: f64 = 1.0001; + + let token_decimals_diff = token_one_decimals.checked_sub(token_two_decimals); + match token_decimals_diff { + None => Err(eyre!( + "Token decimals subtraction overflow: ({} - {})", + token_one_decimals, + token_two_decimals + )), + Some(diff) => { + let denominator = 10u64.pow(diff.try_into()?); + Ok(base.powf(tick) / denominator as f64) + } + } +} diff --git a/crates/uniswapv3pool/src/univ3sdk.rs b/crates/uniswapv3pool/src/univ3sdk.rs index 202854f..b4fb24b 100644 --- a/crates/uniswapv3pool/src/univ3sdk.rs +++ b/crates/uniswapv3pool/src/univ3sdk.rs @@ -136,15 +136,15 @@ impl UniswapV3PoolSdk { } pub fn one_line_info(&self) -> Result<()> { - let fee_num: usize = self.pool.fee as usize; - let fee_num = fee_num as f32; - let fee_num = fee_num / 10000.0; + let fee_num = crate::pool_calcs::fee_to_float(self.pool.fee); + let rate = crate::pool_calcs::tick_to_exchange_rate(self.pool.tick_current, 18, 18)?; println!( - "{:<4}% {} {:<25} TODO {}", + "{:<4}% {} {:<25} {:<12} {}", fee_num, self.pool.address(None, None), self.pool.liquidity, - self.pool.tick_current + self.pool.tick_current, + rate, ); Ok(()) }