feat: upgrade to v3.3.2 with explicit token_program parameter support

Major changes:
- Bump version from 3.3.1 to 3.3.2
- Add token_program field to PumpFun trading parameters
- Support explicit token_program passing for better TOKEN_PROGRAM_2022 compatibility
- Update all example code to pass token_program parameter
- Optimize token program determination logic from auto-inference to explicit parameter
This commit is contained in:
ysq
2025-11-18 10:04:46 +08:00
parent 8f945995a4
commit b04ca6c27a
9 changed files with 30 additions and 21 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "sol-trade-sdk" name = "sol-trade-sdk"
version = "3.3.1" version = "3.3.2"
edition = "2021" edition = "2021"
authors = [ authors = [
"William <byteblock6@gmail.com>", "William <byteblock6@gmail.com>",
+2 -2
View File
@@ -87,14 +87,14 @@ Add the dependency to your `Cargo.toml`:
```toml ```toml
# Add to your Cargo.toml # Add to your Cargo.toml
sol-trade-sdk = { path = "./sol-trade-sdk", version = "3.3.1" } sol-trade-sdk = { path = "./sol-trade-sdk", version = "3.3.2" }
``` ```
### Use crates.io ### Use crates.io
```toml ```toml
# Add to your Cargo.toml # Add to your Cargo.toml
sol-trade-sdk = "3.3.1" sol-trade-sdk = "3.3.2"
``` ```
## 🛠️ Usage Examples ## 🛠️ Usage Examples
+2 -2
View File
@@ -87,14 +87,14 @@ git clone https://github.com/0xfnzero/sol-trade-sdk
```toml ```toml
# 添加到您的 Cargo.toml # 添加到您的 Cargo.toml
sol-trade-sdk = { path = "./sol-trade-sdk", version = "3.3.1" } sol-trade-sdk = { path = "./sol-trade-sdk", version = "3.3.2" }
``` ```
### 使用 crates.io ### 使用 crates.io
```toml ```toml
# 添加到您的 Cargo.toml # 添加到您的 Cargo.toml
sol-trade-sdk = "3.3.1" sol-trade-sdk = "3.3.2"
``` ```
## 🛠️ 使用示例 ## 🛠️ 使用示例
+1
View File
@@ -149,6 +149,7 @@ async fn pumpfun_copy_trade_with_grpc(trade_info: PumpFunTradeEvent) -> AnyResul
trade_info.real_sol_reserves, trade_info.real_sol_reserves,
None, None,
trade_info.fee_recipient, trade_info.fee_recipient,
trade_info.token_program,
)), )),
address_lookup_table_account: address_lookup_table_account, address_lookup_table_account: address_lookup_table_account,
wait_transaction_confirmed: true, wait_transaction_confirmed: true,
+1
View File
@@ -149,6 +149,7 @@ async fn pumpfun_copy_trade_with_grpc(trade_info: PumpFunTradeEvent) -> AnyResul
trade_info.real_sol_reserves, trade_info.real_sol_reserves,
None, None,
trade_info.fee_recipient, trade_info.fee_recipient,
trade_info.token_program,
)), )),
address_lookup_table_account: None, address_lookup_table_account: None,
wait_transaction_confirmed: true, wait_transaction_confirmed: true,
@@ -145,6 +145,7 @@ async fn pumpfun_copy_trade_with_grpc(trade_info: PumpFunTradeEvent) -> AnyResul
trade_info.real_sol_reserves, trade_info.real_sol_reserves,
None, None,
trade_info.fee_recipient, trade_info.fee_recipient,
trade_info.token_program,
)), )),
address_lookup_table_account: None, address_lookup_table_account: None,
wait_transaction_confirmed: true, wait_transaction_confirmed: true,
@@ -189,6 +190,7 @@ async fn pumpfun_copy_trade_with_grpc(trade_info: PumpFunTradeEvent) -> AnyResul
trade_info.real_sol_reserves, trade_info.real_sol_reserves,
Some(true), Some(true),
trade_info.fee_recipient, trade_info.fee_recipient,
trade_info.token_program,
)), )),
address_lookup_table_account: None, address_lookup_table_account: None,
wait_transaction_confirmed: true, wait_transaction_confirmed: true,
+2 -1
View File
@@ -111,6 +111,7 @@ async fn pumpfun_sniper_trade_with_shreds(trade_info: PumpFunTradeEvent) -> AnyR
trade_info.creator_vault, trade_info.creator_vault,
None, None,
trade_info.fee_recipient, trade_info.fee_recipient,
trade_info.token_program,
)), )),
address_lookup_table_account: None, address_lookup_table_account: None,
wait_transaction_confirmed: true, wait_transaction_confirmed: true,
@@ -143,7 +144,7 @@ async fn pumpfun_sniper_trade_with_shreds(trade_info: PumpFunTradeEvent) -> AnyR
slippage_basis_points: slippage_basis_points, slippage_basis_points: slippage_basis_points,
recent_blockhash: Some(recent_blockhash), recent_blockhash: Some(recent_blockhash),
with_tip: false, with_tip: false,
extension_params: Box::new(PumpFunParams::immediate_sell(trade_info.creator_vault, true)), extension_params: Box::new(PumpFunParams::immediate_sell(trade_info.creator_vault, trade_info.token_program, true)),
address_lookup_table_account: None, address_lookup_table_account: None,
wait_transaction_confirmed: true, wait_transaction_confirmed: true,
create_output_token_ata: true, create_output_token_ata: true,
+5 -13
View File
@@ -1,6 +1,6 @@
use crate::{ use crate::{
common::spl_token::close_account, common::spl_token::close_account,
constants::trade::trade::DEFAULT_SLIPPAGE, constants::{trade::trade::DEFAULT_SLIPPAGE, TOKEN_PROGRAM_2022},
trading::core::{ trading::core::{
params::{PumpFunParams, SwapParams}, params::{PumpFunParams, SwapParams},
traits::InstructionBuilder, traits::InstructionBuilder,
@@ -70,12 +70,8 @@ impl InstructionBuilder for PumpFunInstructionBuilder {
// Determine token program based on mayhem mode // Determine token program based on mayhem mode
let is_mayhem_mode = bonding_curve.is_mayhem_mode; let is_mayhem_mode = bonding_curve.is_mayhem_mode;
let token_program = if is_mayhem_mode { let token_program = protocol_params.token_program;
crate::constants::TOKEN_PROGRAM_2022 let token_program_meta = if protocol_params.token_program == TOKEN_PROGRAM_2022 {
} else {
crate::constants::TOKEN_PROGRAM
};
let token_program_meta = if is_mayhem_mode {
crate::constants::TOKEN_PROGRAM_2022_META crate::constants::TOKEN_PROGRAM_2022_META
} else { } else {
crate::constants::TOKEN_PROGRAM_META crate::constants::TOKEN_PROGRAM_META
@@ -210,12 +206,8 @@ impl InstructionBuilder for PumpFunInstructionBuilder {
// Determine token program based on mayhem mode // Determine token program based on mayhem mode
let is_mayhem_mode = bonding_curve.is_mayhem_mode; let is_mayhem_mode = bonding_curve.is_mayhem_mode;
let token_program = if is_mayhem_mode { let token_program = protocol_params.token_program;
crate::constants::TOKEN_PROGRAM_2022 let token_program_meta = if protocol_params.token_program == TOKEN_PROGRAM_2022 {
} else {
crate::constants::TOKEN_PROGRAM
};
let token_program_meta = if is_mayhem_mode {
crate::constants::TOKEN_PROGRAM_2022_META crate::constants::TOKEN_PROGRAM_2022_META
} else { } else {
crate::constants::TOKEN_PROGRAM_META crate::constants::TOKEN_PROGRAM_META
+14 -2
View File
@@ -58,16 +58,22 @@ pub struct PumpFunParams {
pub bonding_curve: Arc<BondingCurveAccount>, pub bonding_curve: Arc<BondingCurveAccount>,
pub associated_bonding_curve: Pubkey, pub associated_bonding_curve: Pubkey,
pub creator_vault: Pubkey, pub creator_vault: Pubkey,
pub token_program: Pubkey,
/// Whether to close token account when selling, only effective during sell operations /// Whether to close token account when selling, only effective during sell operations
pub close_token_account_when_sell: Option<bool>, pub close_token_account_when_sell: Option<bool>,
} }
impl PumpFunParams { impl PumpFunParams {
pub fn immediate_sell(creator_vault: Pubkey, close_token_account_when_sell: bool) -> Self { pub fn immediate_sell(
creator_vault: Pubkey,
token_program: Pubkey,
close_token_account_when_sell: bool,
) -> Self {
Self { Self {
bonding_curve: Arc::new(BondingCurveAccount { ..Default::default() }), bonding_curve: Arc::new(BondingCurveAccount { ..Default::default() }),
associated_bonding_curve: Pubkey::default(), associated_bonding_curve: Pubkey::default(),
creator_vault: creator_vault, creator_vault: creator_vault,
token_program: token_program,
close_token_account_when_sell: Some(close_token_account_when_sell), close_token_account_when_sell: Some(close_token_account_when_sell),
} }
} }
@@ -82,6 +88,7 @@ impl PumpFunParams {
creator_vault: Pubkey, creator_vault: Pubkey,
close_token_account_when_sell: Option<bool>, close_token_account_when_sell: Option<bool>,
fee_recipient: Pubkey, fee_recipient: Pubkey,
token_program: Pubkey,
) -> Self { ) -> Self {
let is_mayhem_mode = fee_recipient == MAYHEM_FEE_RECIPIENT; let is_mayhem_mode = fee_recipient == MAYHEM_FEE_RECIPIENT;
let bonding_curve_account = BondingCurveAccount::from_dev_trade( let bonding_curve_account = BondingCurveAccount::from_dev_trade(
@@ -97,6 +104,7 @@ impl PumpFunParams {
associated_bonding_curve: associated_bonding_curve, associated_bonding_curve: associated_bonding_curve,
creator_vault: creator_vault, creator_vault: creator_vault,
close_token_account_when_sell: close_token_account_when_sell, close_token_account_when_sell: close_token_account_when_sell,
token_program: token_program,
} }
} }
@@ -112,6 +120,7 @@ impl PumpFunParams {
real_sol_reserves: u64, real_sol_reserves: u64,
close_token_account_when_sell: Option<bool>, close_token_account_when_sell: Option<bool>,
fee_recipient: Pubkey, fee_recipient: Pubkey,
token_program: Pubkey,
) -> Self { ) -> Self {
let is_mayhem_mode = fee_recipient == MAYHEM_FEE_RECIPIENT; let is_mayhem_mode = fee_recipient == MAYHEM_FEE_RECIPIENT;
let bonding_curve = BondingCurveAccount::from_trade( let bonding_curve = BondingCurveAccount::from_trade(
@@ -129,6 +138,7 @@ impl PumpFunParams {
associated_bonding_curve: associated_bonding_curve, associated_bonding_curve: associated_bonding_curve,
creator_vault: creator_vault, creator_vault: creator_vault,
close_token_account_when_sell: close_token_account_when_sell, close_token_account_when_sell: close_token_account_when_sell,
token_program: token_program,
} }
} }
@@ -138,6 +148,7 @@ impl PumpFunParams {
) -> Result<Self, anyhow::Error> { ) -> Result<Self, anyhow::Error> {
let account = let account =
crate::instruction::utils::pumpfun::fetch_bonding_curve_account(rpc, mint).await?; crate::instruction::utils::pumpfun::fetch_bonding_curve_account(rpc, mint).await?;
let mint_account = rpc.get_account(&mint).await?;
let bonding_curve = BondingCurveAccount { let bonding_curve = BondingCurveAccount {
discriminator: 0, discriminator: 0,
account: account.1, account: account.1,
@@ -153,7 +164,7 @@ impl PumpFunParams {
let associated_bonding_curve = get_associated_token_address_with_program_id( let associated_bonding_curve = get_associated_token_address_with_program_id(
&bonding_curve.account, &bonding_curve.account,
mint, mint,
&crate::constants::TOKEN_PROGRAM, &mint_account.owner,
); );
let creator_vault = let creator_vault =
crate::instruction::utils::pumpfun::get_creator_vault_pda(&bonding_curve.creator); crate::instruction::utils::pumpfun::get_creator_vault_pda(&bonding_curve.creator);
@@ -162,6 +173,7 @@ impl PumpFunParams {
associated_bonding_curve: associated_bonding_curve, associated_bonding_curve: associated_bonding_curve,
creator_vault: creator_vault.unwrap(), creator_vault: creator_vault.unwrap(),
close_token_account_when_sell: None, close_token_account_when_sell: None,
token_program: mint_account.owner,
}) })
} }
} }