From 0b5744d60ea1aa30c48ceaedde215c219547e9e7 Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Sun, 3 Nov 2024 12:25:48 +1000 Subject: [PATCH 1/4] Add common calculations file --- bin/rb/src/commands/pool.rs | 11 +++++++---- crates/uniswapv3pool/src/lib.rs | 1 + crates/uniswapv3pool/src/pool_calcs.rs | 19 +++++++++++++++++++ crates/uniswapv3pool/src/univ3sdk.rs | 10 +++++----- 4 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 crates/uniswapv3pool/src/pool_calcs.rs 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..df228b8 --- /dev/null +++ b/crates/uniswapv3pool/src/pool_calcs.rs @@ -0,0 +1,19 @@ +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; + let fee_num = fee_num / 10000.0; + fee_num +} + +pub fn tick_to_exchange_rate(tick: i32, token_one_decimals: u64, token_two_decimals: u64) -> f64 { + let tick = tick as f64; + let val: f64 = 1.0001; + + if token_one_decimals != token_two_decimals { + println!("Exchange when token decimals not the same not yet supported"); + } + let rate = val.powf(tick); + rate +} diff --git a/crates/uniswapv3pool/src/univ3sdk.rs b/crates/uniswapv3pool/src/univ3sdk.rs index 202854f..b957581 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(()) } From ba3170889a9a5949ccd9114168802260546c5624 Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Sun, 3 Nov 2024 12:33:03 +1000 Subject: [PATCH 2/4] Fixed clippy report --- crates/uniswapv3pool/src/pool_calcs.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/uniswapv3pool/src/pool_calcs.rs b/crates/uniswapv3pool/src/pool_calcs.rs index df228b8..8a74b4f 100644 --- a/crates/uniswapv3pool/src/pool_calcs.rs +++ b/crates/uniswapv3pool/src/pool_calcs.rs @@ -14,6 +14,5 @@ pub fn tick_to_exchange_rate(tick: i32, token_one_decimals: u64, token_two_decim if token_one_decimals != token_two_decimals { println!("Exchange when token decimals not the same not yet supported"); } - let rate = val.powf(tick); - rate + val.powf(tick) } From 4f2e1c36088c469ca38681d77fed7202bec1cd70 Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Sun, 3 Nov 2024 12:36:30 +1000 Subject: [PATCH 3/4] Fixed clippy report --- crates/uniswapv3pool/src/pool_calcs.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/uniswapv3pool/src/pool_calcs.rs b/crates/uniswapv3pool/src/pool_calcs.rs index 8a74b4f..00dbf14 100644 --- a/crates/uniswapv3pool/src/pool_calcs.rs +++ b/crates/uniswapv3pool/src/pool_calcs.rs @@ -3,8 +3,7 @@ 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; - let fee_num = fee_num / 10000.0; - fee_num + fee_num / 10000.0 } pub fn tick_to_exchange_rate(tick: i32, token_one_decimals: u64, token_two_decimals: u64) -> f64 { From 710d9bf63176bc8b51a03ff56389b94e49960ebd Mon Sep 17 00:00:00 2001 From: sergerad Date: Mon, 4 Nov 2024 10:32:55 +1300 Subject: [PATCH 4/4] Handle error, underflow and denominator --- crates/uniswapv3pool/src/pool_calcs.rs | 23 ++++++++++++++++++----- crates/uniswapv3pool/src/univ3sdk.rs | 2 +- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/crates/uniswapv3pool/src/pool_calcs.rs b/crates/uniswapv3pool/src/pool_calcs.rs index 00dbf14..27a51a5 100644 --- a/crates/uniswapv3pool/src/pool_calcs.rs +++ b/crates/uniswapv3pool/src/pool_calcs.rs @@ -1,3 +1,4 @@ +use eyre::{eyre, Result}; use uniswap_v3_sdk::prelude::FeeAmount; pub fn fee_to_float(fee: FeeAmount) -> f32 { @@ -6,12 +7,24 @@ pub fn fee_to_float(fee: FeeAmount) -> f32 { fee_num / 10000.0 } -pub fn tick_to_exchange_rate(tick: i32, token_one_decimals: u64, token_two_decimals: u64) -> f64 { +pub fn tick_to_exchange_rate( + tick: i32, + token_one_decimals: u64, + token_two_decimals: u64, +) -> Result { let tick = tick as f64; - let val: f64 = 1.0001; + let base: f64 = 1.0001; - if token_one_decimals != token_two_decimals { - println!("Exchange when token decimals not the same not yet supported"); + 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) + } } - val.powf(tick) } diff --git a/crates/uniswapv3pool/src/univ3sdk.rs b/crates/uniswapv3pool/src/univ3sdk.rs index b957581..b4fb24b 100644 --- a/crates/uniswapv3pool/src/univ3sdk.rs +++ b/crates/uniswapv3pool/src/univ3sdk.rs @@ -137,7 +137,7 @@ impl UniswapV3PoolSdk { pub fn one_line_info(&self) -> Result<()> { 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); + let rate = crate::pool_calcs::tick_to_exchange_rate(self.pool.tick_current, 18, 18)?; println!( "{:<4}% {} {:<25} {:<12} {}", fee_num,