From b04ca6c27a2b7a9a056ef391065caff7dff1c107 Mon Sep 17 00:00:00 2001 From: ysq Date: Tue, 18 Nov 2025 10:04:46 +0800 Subject: [PATCH] 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 --- Cargo.toml | 2 +- README.md | 4 ++-- README_CN.md | 4 ++-- examples/address_lookup/src/main.rs | 1 + examples/nonce_cache/src/main.rs | 1 + examples/pumpfun_copy_trading/src/main.rs | 2 ++ examples/pumpfun_sniper_trading/src/main.rs | 3 ++- src/instruction/pumpfun.rs | 18 +++++------------- src/trading/core/params.rs | 16 ++++++++++++++-- 9 files changed, 30 insertions(+), 21 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index dd618d4..9394b7b 100755 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sol-trade-sdk" -version = "3.3.1" +version = "3.3.2" edition = "2021" authors = [ "William ", diff --git a/README.md b/README.md index 805274f..4a9876e 100644 --- a/README.md +++ b/README.md @@ -87,14 +87,14 @@ Add the dependency to your `Cargo.toml`: ```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 ```toml # Add to your Cargo.toml -sol-trade-sdk = "3.3.1" +sol-trade-sdk = "3.3.2" ``` ## 🛠️ Usage Examples diff --git a/README_CN.md b/README_CN.md index 35561ef..d5d8aba 100755 --- a/README_CN.md +++ b/README_CN.md @@ -87,14 +87,14 @@ git clone https://github.com/0xfnzero/sol-trade-sdk ```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 ```toml # 添加到您的 Cargo.toml -sol-trade-sdk = "3.3.1" +sol-trade-sdk = "3.3.2" ``` ## 🛠️ 使用示例 diff --git a/examples/address_lookup/src/main.rs b/examples/address_lookup/src/main.rs index b169058..f09e799 100644 --- a/examples/address_lookup/src/main.rs +++ b/examples/address_lookup/src/main.rs @@ -149,6 +149,7 @@ async fn pumpfun_copy_trade_with_grpc(trade_info: PumpFunTradeEvent) -> AnyResul trade_info.real_sol_reserves, None, trade_info.fee_recipient, + trade_info.token_program, )), address_lookup_table_account: address_lookup_table_account, wait_transaction_confirmed: true, diff --git a/examples/nonce_cache/src/main.rs b/examples/nonce_cache/src/main.rs index 081f8f2..1d1604f 100644 --- a/examples/nonce_cache/src/main.rs +++ b/examples/nonce_cache/src/main.rs @@ -149,6 +149,7 @@ async fn pumpfun_copy_trade_with_grpc(trade_info: PumpFunTradeEvent) -> AnyResul trade_info.real_sol_reserves, None, trade_info.fee_recipient, + trade_info.token_program, )), address_lookup_table_account: None, wait_transaction_confirmed: true, diff --git a/examples/pumpfun_copy_trading/src/main.rs b/examples/pumpfun_copy_trading/src/main.rs index 18f6df1..efacc89 100644 --- a/examples/pumpfun_copy_trading/src/main.rs +++ b/examples/pumpfun_copy_trading/src/main.rs @@ -145,6 +145,7 @@ async fn pumpfun_copy_trade_with_grpc(trade_info: PumpFunTradeEvent) -> AnyResul trade_info.real_sol_reserves, None, trade_info.fee_recipient, + trade_info.token_program, )), address_lookup_table_account: None, wait_transaction_confirmed: true, @@ -189,6 +190,7 @@ async fn pumpfun_copy_trade_with_grpc(trade_info: PumpFunTradeEvent) -> AnyResul trade_info.real_sol_reserves, Some(true), trade_info.fee_recipient, + trade_info.token_program, )), address_lookup_table_account: None, wait_transaction_confirmed: true, diff --git a/examples/pumpfun_sniper_trading/src/main.rs b/examples/pumpfun_sniper_trading/src/main.rs index 8018ce6..b866cd4 100644 --- a/examples/pumpfun_sniper_trading/src/main.rs +++ b/examples/pumpfun_sniper_trading/src/main.rs @@ -111,6 +111,7 @@ async fn pumpfun_sniper_trade_with_shreds(trade_info: PumpFunTradeEvent) -> AnyR trade_info.creator_vault, None, trade_info.fee_recipient, + trade_info.token_program, )), address_lookup_table_account: None, 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, recent_blockhash: Some(recent_blockhash), 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, wait_transaction_confirmed: true, create_output_token_ata: true, diff --git a/src/instruction/pumpfun.rs b/src/instruction/pumpfun.rs index deac854..9994a8e 100755 --- a/src/instruction/pumpfun.rs +++ b/src/instruction/pumpfun.rs @@ -1,6 +1,6 @@ use crate::{ common::spl_token::close_account, - constants::trade::trade::DEFAULT_SLIPPAGE, + constants::{trade::trade::DEFAULT_SLIPPAGE, TOKEN_PROGRAM_2022}, trading::core::{ params::{PumpFunParams, SwapParams}, traits::InstructionBuilder, @@ -70,12 +70,8 @@ impl InstructionBuilder for PumpFunInstructionBuilder { // Determine token program based on mayhem mode let is_mayhem_mode = bonding_curve.is_mayhem_mode; - let token_program = if is_mayhem_mode { - crate::constants::TOKEN_PROGRAM_2022 - } else { - crate::constants::TOKEN_PROGRAM - }; - let token_program_meta = if is_mayhem_mode { + let token_program = protocol_params.token_program; + let token_program_meta = if protocol_params.token_program == TOKEN_PROGRAM_2022 { crate::constants::TOKEN_PROGRAM_2022_META } else { crate::constants::TOKEN_PROGRAM_META @@ -210,12 +206,8 @@ impl InstructionBuilder for PumpFunInstructionBuilder { // Determine token program based on mayhem mode let is_mayhem_mode = bonding_curve.is_mayhem_mode; - let token_program = if is_mayhem_mode { - crate::constants::TOKEN_PROGRAM_2022 - } else { - crate::constants::TOKEN_PROGRAM - }; - let token_program_meta = if is_mayhem_mode { + let token_program = protocol_params.token_program; + let token_program_meta = if protocol_params.token_program == TOKEN_PROGRAM_2022 { crate::constants::TOKEN_PROGRAM_2022_META } else { crate::constants::TOKEN_PROGRAM_META diff --git a/src/trading/core/params.rs b/src/trading/core/params.rs index c04a825..51858a9 100755 --- a/src/trading/core/params.rs +++ b/src/trading/core/params.rs @@ -58,16 +58,22 @@ pub struct PumpFunParams { pub bonding_curve: Arc, pub associated_bonding_curve: Pubkey, pub creator_vault: Pubkey, + pub token_program: Pubkey, /// Whether to close token account when selling, only effective during sell operations pub close_token_account_when_sell: Option, } 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 { bonding_curve: Arc::new(BondingCurveAccount { ..Default::default() }), associated_bonding_curve: Pubkey::default(), creator_vault: creator_vault, + token_program: token_program, close_token_account_when_sell: Some(close_token_account_when_sell), } } @@ -82,6 +88,7 @@ impl PumpFunParams { creator_vault: Pubkey, close_token_account_when_sell: Option, fee_recipient: Pubkey, + token_program: Pubkey, ) -> Self { let is_mayhem_mode = fee_recipient == MAYHEM_FEE_RECIPIENT; let bonding_curve_account = BondingCurveAccount::from_dev_trade( @@ -97,6 +104,7 @@ impl PumpFunParams { associated_bonding_curve: associated_bonding_curve, creator_vault: creator_vault, close_token_account_when_sell: close_token_account_when_sell, + token_program: token_program, } } @@ -112,6 +120,7 @@ impl PumpFunParams { real_sol_reserves: u64, close_token_account_when_sell: Option, fee_recipient: Pubkey, + token_program: Pubkey, ) -> Self { let is_mayhem_mode = fee_recipient == MAYHEM_FEE_RECIPIENT; let bonding_curve = BondingCurveAccount::from_trade( @@ -129,6 +138,7 @@ impl PumpFunParams { associated_bonding_curve: associated_bonding_curve, creator_vault: creator_vault, close_token_account_when_sell: close_token_account_when_sell, + token_program: token_program, } } @@ -138,6 +148,7 @@ impl PumpFunParams { ) -> Result { let account = crate::instruction::utils::pumpfun::fetch_bonding_curve_account(rpc, mint).await?; + let mint_account = rpc.get_account(&mint).await?; let bonding_curve = BondingCurveAccount { discriminator: 0, account: account.1, @@ -153,7 +164,7 @@ impl PumpFunParams { let associated_bonding_curve = get_associated_token_address_with_program_id( &bonding_curve.account, mint, - &crate::constants::TOKEN_PROGRAM, + &mint_account.owner, ); let creator_vault = crate::instruction::utils::pumpfun::get_creator_vault_pda(&bonding_curve.creator); @@ -162,6 +173,7 @@ impl PumpFunParams { associated_bonding_curve: associated_bonding_curve, creator_vault: creator_vault.unwrap(), close_token_account_when_sell: None, + token_program: mint_account.owner, }) } }