sol-trade-sdk 4.0.9

A high-performance Rust SDK for Solana DEX trading.
Documentation
//! Pump.fun 曲线 **legacy** `buy` / `buy_exact_sol_in` / `sell` 与 **`buy_v2` / `sell_v2` / `buy_exact_quote_in_v2`**
//! 的 instruction data 栈上编码(热路径零堆分配)。
//!
//! Legacy `buy` / `buy_exact_sol_in` 与 `@pump-fun/pump-sdk` 对齐:`OptionBool` 是单字段
//! struct(TypeScript 传 `[true]`),在 ix 参数中为 1 字节 bool,共 25 字节 ix data。
//! `*_v2` 指令无 `track_volume` 字节(见 [pump-public-docs](https://github.com/pump-fun/pump-public-docs))。

use crate::instruction::utils::pumpfun::{
    BUY_DISCRIMINATOR, BUY_EXACT_QUOTE_IN_V2_DISCRIMINATOR, BUY_EXACT_SOL_IN_DISCRIMINATOR,
    BUY_V2_DISCRIMINATOR, SELL_DISCRIMINATOR, SELL_V2_DISCRIMINATOR,
};

#[inline(always)]
pub fn encode_pumpfun_buy_ix_data(
    token_amount: u64,
    max_sol_cost: u64,
    track_volume_val: u8,
) -> [u8; 25] {
    let mut d = [0u8; 25];
    d[..8].copy_from_slice(&BUY_DISCRIMINATOR);
    d[8..16].copy_from_slice(&token_amount.to_le_bytes());
    d[16..24].copy_from_slice(&max_sol_cost.to_le_bytes());
    d[24] = track_volume_val;
    d
}

#[inline(always)]
pub fn encode_pumpfun_buy_exact_sol_in_ix_data(
    spendable_sol_in: u64,
    min_tokens_out: u64,
    track_volume_val: u8,
) -> [u8; 25] {
    let mut d = [0u8; 25];
    d[..8].copy_from_slice(&BUY_EXACT_SOL_IN_DISCRIMINATOR);
    d[8..16].copy_from_slice(&spendable_sol_in.to_le_bytes());
    d[16..24].copy_from_slice(&min_tokens_out.to_le_bytes());
    d[24] = track_volume_val;
    d
}

#[inline(always)]
pub fn encode_pumpfun_sell_ix_data(token_amount: u64, min_sol_output: u64) -> [u8; 24] {
    let mut d = [0u8; 24];
    d[..8].copy_from_slice(&SELL_DISCRIMINATOR);
    d[8..16].copy_from_slice(&token_amount.to_le_bytes());
    d[16..24].copy_from_slice(&min_sol_output.to_le_bytes());
    d
}

// --- v2 instruction data encoders (no track_volume arg — 2 args each, 24 bytes total) ---

#[inline(always)]
pub fn encode_pumpfun_buy_v2_ix_data(amount: u64, max_sol_cost: u64) -> [u8; 24] {
    let mut d = [0u8; 24];
    d[..8].copy_from_slice(&BUY_V2_DISCRIMINATOR);
    d[8..16].copy_from_slice(&amount.to_le_bytes());
    d[16..24].copy_from_slice(&max_sol_cost.to_le_bytes());
    d
}

#[inline(always)]
pub fn encode_pumpfun_buy_exact_quote_in_v2_ix_data(
    spendable_quote_in: u64,
    min_tokens_out: u64,
) -> [u8; 24] {
    let mut d = [0u8; 24];
    d[..8].copy_from_slice(&BUY_EXACT_QUOTE_IN_V2_DISCRIMINATOR);
    d[8..16].copy_from_slice(&spendable_quote_in.to_le_bytes());
    d[16..24].copy_from_slice(&min_tokens_out.to_le_bytes());
    d
}

#[inline(always)]
pub fn encode_pumpfun_sell_v2_ix_data(token_amount: u64, min_sol_output: u64) -> [u8; 24] {
    let mut d = [0u8; 24];
    d[..8].copy_from_slice(&SELL_V2_DISCRIMINATOR);
    d[8..16].copy_from_slice(&token_amount.to_le_bytes());
    d[16..24].copy_from_slice(&min_sol_output.to_le_bytes());
    d
}