diff --git a/README.md b/README.md index 8b18c72..d8ace02 100644 --- a/README.md +++ b/README.md @@ -178,6 +178,7 @@ let buy_params = sol_trade_sdk::TradeBuyParams { fixed_output_token_amount: None, // Optional: specify exact output amount gas_fee_strategy: gas_fee_strategy.clone(), // Gas fee strategy configuration simulate: false, // Set to true for simulation only + use_exact_sol_amount: None, // Use exact SOL input for PumpFun/PumpSwap (defaults to true) }; ``` diff --git a/README_CN.md b/README_CN.md index b844e2c..6b30db1 100755 --- a/README_CN.md +++ b/README_CN.md @@ -174,6 +174,7 @@ let buy_params = sol_trade_sdk::TradeBuyParams { fixed_output_token_amount: None, // 可选:指定精确输出数量 gas_fee_strategy: gas_fee_strategy.clone(), // Gas 费用策略配置 simulate: false, // 设为 true 仅进行模拟 + use_exact_sol_amount: None, // 对 PumpFun/PumpSwap 使用精确 SOL 输入(默认为 true) }; ``` diff --git a/examples/address_lookup/src/main.rs b/examples/address_lookup/src/main.rs index e40a5f9..14ff199 100644 --- a/examples/address_lookup/src/main.rs +++ b/examples/address_lookup/src/main.rs @@ -160,6 +160,7 @@ async fn pumpfun_copy_trade_with_grpc(trade_info: PumpFunTradeEvent) -> AnyResul fixed_output_token_amount: None, gas_fee_strategy: gas_fee_strategy, simulate: false, + use_exact_sol_amount: None, }; client.buy(buy_params).await?; diff --git a/examples/bonk_copy_trading/src/main.rs b/examples/bonk_copy_trading/src/main.rs index e9ba2a4..a58837a 100644 --- a/examples/bonk_copy_trading/src/main.rs +++ b/examples/bonk_copy_trading/src/main.rs @@ -175,6 +175,7 @@ async fn bonk_copy_trade_with_grpc(trade_info: BonkTradeEvent) -> AnyResult<()> fixed_output_token_amount: None, gas_fee_strategy: gas_fee_strategy.clone(), simulate: false, + use_exact_sol_amount: None, }; client.buy(buy_params).await?; diff --git a/examples/bonk_sniper_trading/src/main.rs b/examples/bonk_sniper_trading/src/main.rs index 49f7964..6df794d 100644 --- a/examples/bonk_sniper_trading/src/main.rs +++ b/examples/bonk_sniper_trading/src/main.rs @@ -143,6 +143,7 @@ async fn bonk_sniper_trade_with_shreds(trade_info: BonkTradeEvent) -> AnyResult< fixed_output_token_amount: None, gas_fee_strategy: gas_fee_strategy.clone(), simulate: false, + use_exact_sol_amount: None, }; client.buy(buy_params).await?; diff --git a/examples/cli_trading/src/main.rs b/examples/cli_trading/src/main.rs index 31802ba..c60333d 100644 --- a/examples/cli_trading/src/main.rs +++ b/examples/cli_trading/src/main.rs @@ -634,6 +634,7 @@ async fn handle_buy_pumpfun( fixed_output_token_amount: None, gas_fee_strategy: gas_fee_strategy, simulate: false, + use_exact_sol_amount: None, }; match client.buy(buy_params).await { Ok((_, signature, _)) => { @@ -688,6 +689,7 @@ async fn handle_buy_pumpswap( fixed_output_token_amount: None, gas_fee_strategy: gas_fee_strategy, simulate: false, + use_exact_sol_amount: None, }; match client.buy(buy_params).await { Ok((_, signature, _)) => { @@ -741,6 +743,7 @@ async fn handle_buy_bonk( fixed_output_token_amount: None, gas_fee_strategy: gas_fee_strategy, simulate: false, + use_exact_sol_amount: None, }; match client.buy(buy_params).await { Ok((_, signature, _)) => { @@ -798,6 +801,7 @@ async fn handle_buy_raydium_v4( fixed_output_token_amount: None, gas_fee_strategy: gas_fee_strategy, simulate: false, + use_exact_sol_amount: None, }; match client.buy(buy_params).await { Ok((_, signature, _)) => { @@ -855,6 +859,7 @@ async fn handle_buy_raydium_cpmm( fixed_output_token_amount: None, gas_fee_strategy: gas_fee_strategy, simulate: false, + use_exact_sol_amount: None, }; match client.buy(buy_params).await { Ok((_, signature, _)) => { diff --git a/examples/meteora_damm_v2_direct_trading/src/main.rs b/examples/meteora_damm_v2_direct_trading/src/main.rs index 08ebd73..6297fdd 100644 --- a/examples/meteora_damm_v2_direct_trading/src/main.rs +++ b/examples/meteora_damm_v2_direct_trading/src/main.rs @@ -43,6 +43,7 @@ async fn main() -> Result<(), Box> { fixed_output_token_amount: Some(1), gas_fee_strategy: gas_fee_strategy.clone(), simulate: false, + use_exact_sol_amount: None, }; client.buy(buy_params).await?; diff --git a/examples/middleware_system/src/main.rs b/examples/middleware_system/src/main.rs index b7ae8a8..ee6c82e 100644 --- a/examples/middleware_system/src/main.rs +++ b/examples/middleware_system/src/main.rs @@ -102,6 +102,7 @@ async fn test_middleware() -> AnyResult<()> { fixed_output_token_amount: None, gas_fee_strategy: gas_fee_strategy, simulate: false, + use_exact_sol_amount: None, }; client.buy(buy_params).await?; println!("tip: This transaction will not succeed because we're using a test account. You can modify the code to initialize the payer with your own private key"); diff --git a/examples/nonce_cache/src/main.rs b/examples/nonce_cache/src/main.rs index 725aa32..852e122 100644 --- a/examples/nonce_cache/src/main.rs +++ b/examples/nonce_cache/src/main.rs @@ -160,6 +160,7 @@ async fn pumpfun_copy_trade_with_grpc(trade_info: PumpFunTradeEvent) -> AnyResul fixed_output_token_amount: None, gas_fee_strategy: gas_fee_strategy, simulate: false, + use_exact_sol_amount: None, }; client.buy(buy_params).await?; diff --git a/examples/pumpfun_copy_trading/src/main.rs b/examples/pumpfun_copy_trading/src/main.rs index fd4ad6d..0bbfab8 100644 --- a/examples/pumpfun_copy_trading/src/main.rs +++ b/examples/pumpfun_copy_trading/src/main.rs @@ -163,6 +163,7 @@ async fn pumpfun_copy_trade_with_grpc(trade_info: PumpFunTradeEvent) -> AnyResul fixed_output_token_amount: None, gas_fee_strategy: gas_fee_strategy.clone(), simulate: false, + use_exact_sol_amount: None, }; client.buy(buy_params).await?; diff --git a/examples/pumpfun_sniper_trading/src/main.rs b/examples/pumpfun_sniper_trading/src/main.rs index 6402853..36edaec 100644 --- a/examples/pumpfun_sniper_trading/src/main.rs +++ b/examples/pumpfun_sniper_trading/src/main.rs @@ -122,6 +122,7 @@ async fn pumpfun_sniper_trade_with_shreds(trade_info: PumpFunTradeEvent) -> AnyR fixed_output_token_amount: None, gas_fee_strategy: gas_fee_strategy.clone(), simulate: false, + use_exact_sol_amount: None, }; client.buy(buy_params).await?; diff --git a/examples/pumpswap_direct_trading/src/main.rs b/examples/pumpswap_direct_trading/src/main.rs index 11034ec..3ce7e18 100644 --- a/examples/pumpswap_direct_trading/src/main.rs +++ b/examples/pumpswap_direct_trading/src/main.rs @@ -43,6 +43,7 @@ async fn main() -> Result<(), Box> { fixed_output_token_amount: None, gas_fee_strategy: gas_fee_strategy.clone(), simulate: false, + use_exact_sol_amount: None, }; client.buy(buy_params).await?; diff --git a/examples/pumpswap_trading/src/main.rs b/examples/pumpswap_trading/src/main.rs index aef10c8..b259ac4 100644 --- a/examples/pumpswap_trading/src/main.rs +++ b/examples/pumpswap_trading/src/main.rs @@ -220,6 +220,7 @@ async fn pumpswap_trade_with_grpc(mint_pubkey: Pubkey, params: PumpSwapParams) - fixed_output_token_amount: None, gas_fee_strategy: gas_fee_strategy.clone(), simulate: false, + use_exact_sol_amount: None, }; client.buy(buy_params).await?; diff --git a/examples/raydium_amm_v4_trading/src/main.rs b/examples/raydium_amm_v4_trading/src/main.rs index f744704..77cbb74 100644 --- a/examples/raydium_amm_v4_trading/src/main.rs +++ b/examples/raydium_amm_v4_trading/src/main.rs @@ -173,6 +173,7 @@ async fn raydium_amm_v4_copy_trade_with_grpc(trade_info: RaydiumAmmV4SwapEvent) fixed_output_token_amount: None, gas_fee_strategy: gas_fee_strategy.clone(), simulate: false, + use_exact_sol_amount: None, }; client.buy(buy_params).await?; diff --git a/examples/raydium_cpmm_trading/src/main.rs b/examples/raydium_cpmm_trading/src/main.rs index 6d27296..a033079 100644 --- a/examples/raydium_cpmm_trading/src/main.rs +++ b/examples/raydium_cpmm_trading/src/main.rs @@ -158,6 +158,7 @@ async fn raydium_cpmm_copy_trade_with_grpc(trade_info: RaydiumCpmmSwapEvent) -> fixed_output_token_amount: None, gas_fee_strategy: gas_fee_strategy.clone(), simulate: false, + use_exact_sol_amount: None, }; client.buy(buy_params).await?; diff --git a/examples/seed_trading/src/main.rs b/examples/seed_trading/src/main.rs index b824b6d..69cb186 100644 --- a/examples/seed_trading/src/main.rs +++ b/examples/seed_trading/src/main.rs @@ -46,6 +46,7 @@ async fn main() -> Result<(), Box> { fixed_output_token_amount: None, gas_fee_strategy: gas_fee_strategy.clone(), simulate: false, + use_exact_sol_amount: None, }; client.buy(buy_params).await?; diff --git a/src/instruction/pumpfun.rs b/src/instruction/pumpfun.rs index 4e6695d..043951b 100755 --- a/src/instruction/pumpfun.rs +++ b/src/instruction/pumpfun.rs @@ -118,7 +118,7 @@ impl InstructionBuilder for PumpFunInstructionBuilder { } let mut buy_data = [0u8; 24]; - if params.use_exact_sol_amount { + if params.use_exact_sol_amount.unwrap_or(true) { // buy_exact_sol_in(spendable_sol_in: u64, min_tokens_out: u64) // Spend exactly the input SOL amount, get at least min_tokens_out let min_tokens_out = calculate_with_slippage_sell( diff --git a/src/instruction/pumpswap.rs b/src/instruction/pumpswap.rs index a8b0979..959bdb5 100755 --- a/src/instruction/pumpswap.rs +++ b/src/instruction/pumpswap.rs @@ -187,7 +187,7 @@ impl InstructionBuilder for PumpSwapInstructionBuilder { // Create instruction data let mut data = [0u8; 24]; if quote_is_wsol_or_usdc { - if params.use_exact_sol_amount { + if params.use_exact_sol_amount.unwrap_or(true) { // buy_exact_quote_in(spendable_quote_in: u64, min_base_amount_out: u64) // Spend exactly the input SOL/quote amount, get at least min_base_amount_out let min_base_amount_out = crate::utils::calc::common::calculate_with_slippage_sell( diff --git a/src/lib.rs b/src/lib.rs index fbbe10d..d3d65dd 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -188,9 +188,10 @@ pub struct TradeBuyParams { /// Whether to simulate the transaction instead of executing it pub simulate: bool, /// Use exact SOL amount instructions (buy_exact_sol_in for PumpFun, buy_exact_quote_in for PumpSwap). - /// When true, the exact SOL/quote amount is spent and slippage is applied to output tokens. - /// When false (default), uses regular buy instruction where slippage is applied to SOL/quote input. - pub use_exact_sol_amount: bool, + /// When Some(true) or None (default), the exact SOL/quote amount is spent and slippage is applied to output tokens. + /// When Some(false), uses regular buy instruction where slippage is applied to SOL/quote input. + /// This option only applies to PumpFun and PumpSwap DEXes; it is ignored for other DEXes. + pub use_exact_sol_amount: Option, } /// Parameters for executing sell orders across different DEX protocols @@ -622,7 +623,7 @@ impl TradingClient { fixed_output_amount: params.fixed_output_token_amount, gas_fee_strategy: params.gas_fee_strategy, simulate: params.simulate, - use_exact_sol_amount: false, + use_exact_sol_amount: None, }; // Validate protocol params diff --git a/src/trading/core/params.rs b/src/trading/core/params.rs index a428f45..404808a 100755 --- a/src/trading/core/params.rs +++ b/src/trading/core/params.rs @@ -68,9 +68,10 @@ pub struct SwapParams { pub gas_fee_strategy: GasFeeStrategy, pub simulate: bool, /// Use exact SOL amount instructions (buy_exact_sol_in for PumpFun, buy_exact_quote_in for PumpSwap). - /// When true, the exact SOL/quote amount is spent and slippage is applied to output tokens. - /// When false (default), uses regular buy instruction where slippage is applied to SOL/quote input. - pub use_exact_sol_amount: bool, + /// When Some(true) or None (default), the exact SOL/quote amount is spent and slippage is applied to output tokens. + /// When Some(false), uses regular buy instruction where slippage is applied to SOL/quote input. + /// This option only applies to PumpFun and PumpSwap DEXes; it is ignored for other DEXes. + pub use_exact_sol_amount: Option, } impl std::fmt::Debug for SwapParams {