raydium_launchlab/
math.rs

1const 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}