raydium-launchlab-sdk 0.1.7

Rust SDK for Raydium LaunchLab program
Documentation
const RATE_DENOMINATOR: u128 = 10_000_000_000;

pub fn calculate_sell_amount(
    amount_in: u64,
    virtual_base: u128,
    virtual_quote: u128,
    real_base: u128,
    real_quote: u128,
    trade_fee_rate: u64,
    platform_fee_rate: u64,
    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 trade_fee = quote_amount_out * (trade_fee_rate as u128) / RATE_DENOMINATOR;
    let platform_fee = quote_amount_out * (platform_fee_rate as u128) / RATE_DENOMINATOR;

    let amount_net = quote_amount_out
        .saturating_sub(trade_fee)
        .saturating_sub(platform_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,
    trade_fee_rate: u64,
    platform_fee_rate: u64,
    slippage_basis_points: u128,
) -> u64 {
    let amount_in_u128 = amount_in as u128;

    let trade_fee = amount_in_u128 * (trade_fee_rate as u128) / RATE_DENOMINATOR;
    let platform_fee = amount_in_u128 * (platform_fee_rate as u128) / RATE_DENOMINATOR;

    let amount_in_net = amount_in_u128
        .saturating_sub(trade_fee)
        .saturating_sub(platform_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
}