pump_rust_client/math/
utils.rs1#[inline]
7pub fn add_slippage(value: u64, bps: u16) -> u64 {
8 (((value as u128) * (10_000 + bps as u128)) / 10_000) as u64
9}
10
11#[inline]
13pub fn sub_slippage(value: u64, bps: u16) -> u64 {
14 let bps = bps.min(10_000) as u128;
15 (((value as u128) * (10_000 - bps)) / 10_000) as u64
16}
17
18#[inline]
24pub fn slippage_bounds(value: u128, bps: u16) -> Option<(u128, u128)> {
25 let delta = value.checked_mul(u128::from(bps))?.checked_div(10_000)?;
26 Some((value.checked_sub(delta)?, value.checked_add(delta)?))
27}
28
29#[cfg(test)]
30mod tests {
31 use super::*;
32
33 #[test]
34 fn slippage_helpers_apply_correct_direction() {
35 assert_eq!(sub_slippage(100, 250), 97);
37 assert_eq!(add_slippage(100, 250), 102);
39 assert_eq!(sub_slippage(1_000_000, 10_000), 0);
41 assert_eq!(sub_slippage(1_000_000, 20_000), 0);
42 }
43
44 #[test]
45 fn slippage_bounds_brackets_value() {
46 assert_eq!(slippage_bounds(1_000_000, 250), Some((975_000, 1_025_000)));
48 assert_eq!(slippage_bounds(42, 0), Some((42, 42)));
50 }
51
52 #[test]
53 fn slippage_bounds_overflow_returns_none() {
54 assert_eq!(slippage_bounds(u128::MAX, 1), None);
56 }
57}