raydium_launchlab/
math.rs1const RATE_DENOMINATOR: u128 = 10_000_000_000;
2
3pub fn calculate_sell_amount(
4 amount_in: u64,
5 virtual_base: u128,
6 virtual_quote: u128,
7 real_base: u128,
8 real_quote: u128,
9 trade_fee_rate: u64,
10 platform_fee_rate: u64,
11 slippage_basis_points: u128,
12) -> u64 {
13 let amount_in_u128 = amount_in as u128;
14
15 let input_reserve = virtual_base.saturating_sub(real_base);
16 let output_reserve = virtual_quote.saturating_add(real_quote);
17
18 let numerator = amount_in_u128.saturating_mul(output_reserve);
19 let denominator = input_reserve.saturating_add(amount_in_u128);
20 let quote_amount_out = numerator / denominator;
21
22 let trade_fee = quote_amount_out * (trade_fee_rate as u128) / RATE_DENOMINATOR;
23 let platform_fee = quote_amount_out * (platform_fee_rate as u128) / RATE_DENOMINATOR;
24
25 let amount_net = quote_amount_out
26 .saturating_sub(trade_fee)
27 .saturating_sub(platform_fee);
28
29 let final_amount = amount_net - (amount_net * slippage_basis_points) / 10000;
30
31 final_amount as u64
32}
33
34pub fn calculate_buy_amount(
35 amount_in: u64,
36 virtual_base: u128,
37 virtual_quote: u128,
38 real_base: u128,
39 real_quote: u128,
40 trade_fee_rate: u64,
41 platform_fee_rate: u64,
42 slippage_basis_points: u128,
43) -> u64 {
44 let amount_in_u128 = amount_in as u128;
45
46 let trade_fee = amount_in_u128 * (trade_fee_rate as u128) / RATE_DENOMINATOR;
47 let platform_fee = amount_in_u128 * (platform_fee_rate as u128) / RATE_DENOMINATOR;
48
49 let amount_in_net = amount_in_u128
50 .saturating_sub(trade_fee)
51 .saturating_sub(platform_fee);
52
53 let input_reserve = virtual_quote.saturating_add(real_quote);
54 let output_reserve = virtual_base.saturating_sub(real_base);
55
56 let numerator = amount_in_net.saturating_mul(output_reserve);
57 let denominator = input_reserve.saturating_add(amount_in_net);
58 let amount_out = numerator / denominator;
59
60 let amount_with_slippage = amount_out - (amount_out * slippage_basis_points) / 10000;
61
62 amount_with_slippage as u64
63}