const PROTOCOL_FEE_RATE: u128 = 100; const PLATFORM_FEE_RATE: u128 = 0; const SHARE_FEE_RATE: u128 = 0;
pub fn calculate_sell_amount(
amount_in: u64,
virtual_base: u128,
virtual_quote: u128,
real_base: u128,
real_quote: u128,
slippage_basis_points: u128,
) -> u64 {
let amount_in_u128 = amount_in as u128;
let input_reserve = virtual_base.saturating_sub(real_base);
let output_reserve = virtual_quote.saturating_add(real_quote);
let numerator = amount_in_u128.saturating_mul(output_reserve);
let denominator = input_reserve.saturating_add(amount_in_u128);
let quote_amount_out = numerator / denominator;
let protocol_fee = quote_amount_out * PROTOCOL_FEE_RATE / 10000;
let platform_fee = quote_amount_out * PLATFORM_FEE_RATE / 10000;
let share_fee = quote_amount_out * SHARE_FEE_RATE / 10000;
let amount_net = quote_amount_out
.saturating_sub(protocol_fee)
.saturating_sub(platform_fee)
.saturating_sub(share_fee);
let final_amount = amount_net - (amount_net * slippage_basis_points) / 10000;
final_amount as u64
}
pub fn calculate_buy_amount(
amount_in: u64,
virtual_base: u128,
virtual_quote: u128,
real_base: u128,
real_quote: u128,
slippage_basis_points: u128,
) -> u64 {
let amount_in_u128 = amount_in as u128;
let protocol_fee = amount_in_u128 * PROTOCOL_FEE_RATE / 10000;
let platform_fee = amount_in_u128 * PLATFORM_FEE_RATE / 10000;
let share_fee = amount_in_u128 * SHARE_FEE_RATE / 10000;
let amount_in_net = amount_in_u128
.saturating_sub(protocol_fee)
.saturating_sub(platform_fee)
.saturating_sub(share_fee);
let input_reserve = virtual_quote.saturating_add(real_quote);
let output_reserve = virtual_base.saturating_sub(real_base);
let numerator = amount_in_net.saturating_mul(output_reserve);
let denominator = input_reserve.saturating_add(amount_in_net);
let amount_out = numerator / denominator;
let amount_with_slippage = amount_out - (amount_out * slippage_basis_points) / 10000;
amount_with_slippage as u64
}