nautilus_model/defi/tick_map/
liquidity_math.rs1use crate::defi::tick_map::tick::PoolTick;
17
18pub fn liquidity_math_add(x: u128, y: i128) -> u128 {
30 if y < 0 {
31 let delta = (-y) as u128;
32 let z = x.wrapping_sub(delta);
33 assert!(
34 z < x,
35 "Liquidity subtraction underflow: x={x}, y={y}, delta={delta}, result={z}"
36 );
37 z
38 } else {
39 let delta = y as u128;
40 let z = x.wrapping_add(delta);
41 assert!(
42 z >= x,
43 "Liquidity addition overflow: x={x}, y={y}, delta={delta}, result={z}"
44 );
45 z
46 }
47}
48
49pub fn tick_spacing_to_max_liquidity_per_tick(tick_spacing: i32) -> u128 {
51 let min_tick = (PoolTick::MIN_TICK / tick_spacing) * tick_spacing;
53 let max_tick = (PoolTick::MAX_TICK / tick_spacing) * tick_spacing;
54
55 let num_ticks = ((max_tick as i64 - min_tick as i64) / tick_spacing as i64) + 1;
57
58 u128::MAX / num_ticks as u128
59}
60
61#[cfg(test)]
62mod tests {
63 use rstest::rstest;
64
65 use super::*;
66
67 #[rstest]
68 fn test_add() {
69 assert_eq!(liquidity_math_add(1, 0), 1);
70 assert_eq!(liquidity_math_add(1, 1), 2);
71 }
72
73 #[rstest]
74 fn test_subtract_one() {
75 assert_eq!(liquidity_math_add(1, -1), 0);
76 assert_eq!(liquidity_math_add(3, -2), 1);
77 }
78
79 #[rstest]
80 #[should_panic(expected = "Liquidity addition overflow")]
81 fn test_addition_overflow() {
82 let x = u128::MAX - 14; liquidity_math_add(x, 15);
84 }
85
86 #[rstest]
87 #[should_panic(expected = "Liquidity subtraction underflow")]
88 fn test_subtraction_underflow_zero() {
89 liquidity_math_add(0, -1);
90 }
91
92 #[rstest]
93 #[should_panic(expected = "Liquidity subtraction underflow")]
94 fn test_subtraction_underflow() {
95 liquidity_math_add(3, -4);
96 }
97
98 #[rstest]
99 fn test_tick_spacing_to_max_liquidity() {
100 assert_eq!(
102 tick_spacing_to_max_liquidity_per_tick(1),
103 191757530477355301479181766273477
104 );
105 assert_eq!(
107 tick_spacing_to_max_liquidity_per_tick(10),
108 1917569901783203986719870431555990
109 );
110 assert_eq!(
112 tick_spacing_to_max_liquidity_per_tick(60),
113 11505743598341114571880798222544994
114 );
115 assert_eq!(
117 tick_spacing_to_max_liquidity_per_tick(200),
118 38350317471085141830651933667504588
119 );
120 }
121}