feat: add gas fee strategy system with examples

- Add GasFeeStrategy module supporting normal and high-low fee strategies
- Initialize gas fee strategies in all examples
- Update documentation and README with gas fee strategy configuration
- Improve nonce cache documentation emphasizing latest nonce usage
- Adjust default gas fee configuration parameters
- Remove duplicate imports and unused constant references
This commit is contained in:
ysq
2025-09-19 15:46:51 +08:00
parent e8abb65e2e
commit a53038855e
27 changed files with 342 additions and 83 deletions
+2 -1
View File
@@ -19,7 +19,6 @@ use sol_trade_sdk::{
};
use sol_trade_sdk::{
common::AnyResult,
constants::trade::trade::{DEFAULT_CU_LIMIT, DEFAULT_CU_PRICE},
swqos::SwqosConfig,
trading::{core::params::PumpFunParams, factory::DexType},
SolanaTrade,
@@ -125,6 +124,8 @@ async fn create_solana_trade_client() -> AnyResult<SolanaTrade> {
let swqos_configs: Vec<SwqosConfig> = vec![SwqosConfig::Default(rpc_url.clone())];
let trade_config = TradeConfig::new(rpc_url, swqos_configs, commitment);
let solana_trade = SolanaTrade::new(Arc::new(payer), trade_config).await;
// init gas fee strategy
sol_trade_sdk::common::GasFeeStrategy::init_builtin_fee_strategies();
println!("✅ SolanaTrade client initialized successfully!");
Ok(solana_trade)
}
+2 -1
View File
@@ -14,7 +14,6 @@ use sol_trade_sdk::solana_streamer_sdk::streaming::yellowstone_grpc::{
use sol_trade_sdk::solana_streamer_sdk::streaming::YellowstoneGrpc;
use sol_trade_sdk::{
common::AnyResult,
constants::trade::trade::{DEFAULT_CU_LIMIT, DEFAULT_CU_PRICE},
swqos::SwqosConfig,
trading::{core::params::BonkParams, factory::DexType},
SolanaTrade,
@@ -111,6 +110,8 @@ async fn create_solana_trade_client() -> AnyResult<SolanaTrade> {
let swqos_configs: Vec<SwqosConfig> = vec![SwqosConfig::Default(rpc_url.clone())];
let trade_config = TradeConfig::new(rpc_url, swqos_configs, commitment);
let solana_trade = SolanaTrade::new(Arc::new(payer), trade_config).await;
// init gas fee strategy
sol_trade_sdk::common::GasFeeStrategy::init_builtin_fee_strategies();
println!("✅ SolanaTrade client initialized successfully!");
Ok(solana_trade)
}
+2 -1
View File
@@ -6,7 +6,6 @@ use sol_trade_sdk::solana_streamer_sdk::streaming::event_parser::{Protocol, Unif
use sol_trade_sdk::solana_streamer_sdk::{match_event, streaming::ShredStreamGrpc};
use sol_trade_sdk::{
common::AnyResult,
constants::trade::trade::{DEFAULT_CU_LIMIT, DEFAULT_CU_PRICE},
swqos::SwqosConfig,
trading::{core::params::BonkParams, factory::DexType},
SolanaTrade,
@@ -80,6 +79,8 @@ async fn create_solana_trade_client() -> AnyResult<SolanaTrade> {
let swqos_configs: Vec<SwqosConfig> = vec![SwqosConfig::Default(rpc_url.clone())];
let trade_config = TradeConfig::new(rpc_url, swqos_configs, commitment);
let solana_trade = SolanaTrade::new(Arc::new(payer), trade_config).await;
// init gas fee strategy
sol_trade_sdk::common::GasFeeStrategy::init_builtin_fee_strategies();
println!("✅ SolanaTrade client initialized successfully!");
Ok(solana_trade)
}
+2 -1
View File
@@ -3,7 +3,6 @@ use sol_trade_sdk::{
common::{
fast_fn::get_associated_token_address_with_program_id_fast_use_seed, AnyResult, TradeConfig,
},
constants::trade::trade::{DEFAULT_CU_LIMIT, DEFAULT_CU_PRICE},
swqos::SwqosConfig,
trading::{
core::params::{
@@ -1285,6 +1284,8 @@ async fn initialize_real_client() -> AnyResult<SolanaTrade> {
let swqos_configs: Vec<SwqosConfig> = vec![SwqosConfig::Default(rpc_url.clone())];
let trade_config = TradeConfig::new(rpc_url, swqos_configs, commitment);
let solana_trade = SolanaTrade::new(payer, trade_config).await;
// init gas fee strategy
sol_trade_sdk::common::GasFeeStrategy::init_builtin_fee_strategies();
println!("✅ SolanaTrade client initialized successfully!");
Ok(solana_trade)
}
+8
View File
@@ -0,0 +1,8 @@
[package]
name = "gas_fee_strategy"
version = "0.1.0"
edition = "2021"
[dependencies]
sol-trade-sdk = { path = "../.." }
tokio = { version = "1.0", features = ["full"] }
+72
View File
@@ -0,0 +1,72 @@
use sol_trade_sdk::{
common::gas_fee_strategy::GasFeeStrategy,
swqos::{SwqosType, TradeType},
};
#[tokio::main]
async fn main() {
println!("🚀 Gas Fee Strategy Demo");
println!("========================");
// Initialize builtin strategies
println!("1. Initialize builtin strategies");
GasFeeStrategy::init_builtin_fee_strategies();
// Print all strategies
println!("\n2. Print all builtin strategies");
GasFeeStrategy::print_all_strategies();
// Clear all strategies
println!("\n3. Clear all strategies");
GasFeeStrategy::clear();
// Add normal fee strategy for SwqosType::Default on Buy
println!("\n4. Add normal fee strategy for SwqosType::Default on Buy");
GasFeeStrategy::add_normal_fee_strategy(
SwqosType::Default,
TradeType::Buy,
150000, // cu_limit
500000, // cu_price
0.0, // tip
);
// Add high-low fee strategy for SwqosType::Jito on Buy
println!("\n5. Add high-low fee strategy for SwqosType::Jito on Buy");
GasFeeStrategy::add_high_low_fee_strategy(
SwqosType::Jito,
TradeType::Buy,
150000, // cu_limit
100, // low cu_price
10 * 1_000_000, // high cu_price
0.001, // low tip
0.1, // high tip
);
// Print all strategies
println!("\n6. Print all current strategies");
GasFeeStrategy::print_all_strategies();
// Add normal fee strategy for SwqosType::Jito on Buy (will override previous high-low strategy)
println!("\n7. Add normal fee strategy for SwqosType::Jito on Buy (will override previous high-low strategy)");
GasFeeStrategy::add_normal_fee_strategy(
SwqosType::Jito,
TradeType::Buy,
150000, // cu_limit
500000, // cu_price
0.0001, // tip
);
// Print all strategies
println!("\n8. Print all current strategies");
GasFeeStrategy::print_all_strategies();
// Remove strategy for SwqosType::Jito on Buy
println!("\n9. Remove strategy for SwqosType::Jito on Buy");
GasFeeStrategy::remove_strategy(SwqosType::Jito, TradeType::Buy);
// Print all strategies
println!("\n10. Print all current strategies");
GasFeeStrategy::print_all_strategies();
println!("\n✅ Gas Fee Strategy Demo completed!");
}
+2 -1
View File
@@ -1,7 +1,6 @@
use anyhow::Result;
use sol_trade_sdk::{
common::{AnyResult, TradeConfig},
constants::trade::trade::{DEFAULT_CU_LIMIT, DEFAULT_CU_PRICE},
swqos::{SwqosConfig, SwqosRegion},
trading::{
core::params::PumpSwapParams, factory::DexType, middleware::builtin::LoggingMiddleware,
@@ -67,6 +66,8 @@ async fn create_solana_trade_client() -> AnyResult<SolanaTrade> {
let swqos_configs: Vec<SwqosConfig> = vec![SwqosConfig::Default(rpc_url.clone())];
let trade_config = TradeConfig::new(rpc_url, swqos_configs, commitment);
let solana_trade = SolanaTrade::new(Arc::new(payer), trade_config).await;
// init gas fee strategy
sol_trade_sdk::common::GasFeeStrategy::init_builtin_fee_strategies();
println!("✅ SolanaTrade client initialized successfully!");
Ok(solana_trade)
}
+2 -1
View File
@@ -17,7 +17,6 @@ use sol_trade_sdk::{
};
use sol_trade_sdk::{
common::AnyResult,
constants::trade::trade::{DEFAULT_CU_LIMIT, DEFAULT_CU_PRICE},
swqos::SwqosConfig,
trading::{core::params::PumpFunParams, factory::DexType},
SolanaTrade,
@@ -106,6 +105,8 @@ async fn create_solana_trade_client() -> AnyResult<SolanaTrade> {
let swqos_configs: Vec<SwqosConfig> = vec![SwqosConfig::Default(rpc_url.clone())];
let trade_config = TradeConfig::new(rpc_url, swqos_configs, commitment);
let solana_trade = SolanaTrade::new(Arc::new(payer), trade_config).await;
// init gas fee strategy
sol_trade_sdk::common::GasFeeStrategy::init_builtin_fee_strategies();
println!("✅ SolanaTrade client initialized successfully!");
Ok(solana_trade)
}
+2 -1
View File
@@ -14,7 +14,6 @@ use sol_trade_sdk::solana_streamer_sdk::streaming::yellowstone_grpc::{
use sol_trade_sdk::solana_streamer_sdk::streaming::YellowstoneGrpc;
use sol_trade_sdk::{
common::AnyResult,
constants::trade::trade::{DEFAULT_CU_LIMIT, DEFAULT_CU_PRICE},
swqos::SwqosConfig,
trading::{core::params::PumpFunParams, factory::DexType},
SolanaTrade,
@@ -105,6 +104,8 @@ async fn create_solana_trade_client() -> AnyResult<SolanaTrade> {
let swqos_configs: Vec<SwqosConfig> = vec![SwqosConfig::Default(rpc_url.clone())];
let trade_config = TradeConfig::new(rpc_url, swqos_configs, commitment);
let solana_trade = SolanaTrade::new(Arc::new(payer), trade_config).await;
// init gas fee strategy
sol_trade_sdk::common::GasFeeStrategy::init_builtin_fee_strategies();
println!("✅ SolanaTrade client initialized successfully!");
Ok(solana_trade)
}
+2 -1
View File
@@ -6,7 +6,6 @@ use sol_trade_sdk::solana_streamer_sdk::streaming::event_parser::{Protocol, Unif
use sol_trade_sdk::solana_streamer_sdk::{match_event, streaming::ShredStreamGrpc};
use sol_trade_sdk::{
common::AnyResult,
constants::trade::trade::{DEFAULT_CU_LIMIT, DEFAULT_CU_PRICE},
swqos::SwqosConfig,
trading::{core::params::PumpFunParams, factory::DexType},
SolanaTrade,
@@ -74,6 +73,8 @@ async fn create_solana_trade_client() -> AnyResult<SolanaTrade> {
let swqos_configs: Vec<SwqosConfig> = vec![SwqosConfig::Default(rpc_url.clone())];
let trade_config = TradeConfig::new(rpc_url, swqos_configs, commitment);
let solana_trade = SolanaTrade::new(Arc::new(payer), trade_config).await;
// init gas fee strategy
sol_trade_sdk::common::GasFeeStrategy::init_builtin_fee_strategies();
println!("✅ SolanaTrade client initialized successfully!");
Ok(solana_trade)
}
+2 -1
View File
@@ -1,6 +1,5 @@
use sol_trade_sdk::{
common::{AnyResult, TradeConfig},
constants::trade::trade::{DEFAULT_CU_LIMIT, DEFAULT_CU_PRICE},
swqos::SwqosConfig,
trading::{core::params::PumpSwapParams, factory::DexType},
SolanaTrade,
@@ -82,6 +81,8 @@ async fn create_solana_trade_client() -> AnyResult<SolanaTrade> {
let swqos_configs: Vec<SwqosConfig> = vec![SwqosConfig::Default(rpc_url.clone())];
let trade_config = TradeConfig::new(rpc_url, swqos_configs, commitment);
let solana_trade = SolanaTrade::new(Arc::new(payer), trade_config).await;
// init gas fee strategy
sol_trade_sdk::common::GasFeeStrategy::init_builtin_fee_strategies();
println!("✅ SolanaTrade client initialized successfully!");
Ok(solana_trade)
}
+2 -1
View File
@@ -13,7 +13,6 @@ use sol_trade_sdk::solana_streamer_sdk::{
};
use sol_trade_sdk::{
common::AnyResult,
constants::trade::trade::{DEFAULT_CU_LIMIT, DEFAULT_CU_PRICE},
swqos::SwqosConfig,
trading::{core::params::PumpSwapParams, factory::DexType},
SolanaTrade,
@@ -131,6 +130,8 @@ async fn create_solana_trade_client() -> AnyResult<SolanaTrade> {
let swqos_configs: Vec<SwqosConfig> = vec![SwqosConfig::Default(rpc_url.clone())];
let trade_config = TradeConfig::new(rpc_url, swqos_configs, commitment);
let solana_trade = SolanaTrade::new(Arc::new(payer), trade_config).await;
// init gas fee strategy
sol_trade_sdk::common::GasFeeStrategy::init_builtin_fee_strategies();
println!("✅ SolanaTrade client initialized successfully!");
Ok(solana_trade)
}
+2 -1
View File
@@ -14,7 +14,6 @@ use sol_trade_sdk::solana_streamer_sdk::streaming::yellowstone_grpc::{
use sol_trade_sdk::solana_streamer_sdk::streaming::YellowstoneGrpc;
use sol_trade_sdk::{
common::AnyResult,
constants::trade::trade::{DEFAULT_CU_LIMIT, DEFAULT_CU_PRICE},
swqos::SwqosConfig,
trading::{core::params::RaydiumAmmV4Params, factory::DexType},
SolanaTrade,
@@ -105,6 +104,8 @@ async fn create_solana_trade_client() -> AnyResult<SolanaTrade> {
let swqos_configs: Vec<SwqosConfig> = vec![SwqosConfig::Default(rpc_url.clone())];
let trade_config = TradeConfig::new(rpc_url, swqos_configs, commitment);
let solana_trade = SolanaTrade::new(Arc::new(payer), trade_config).await;
// init gas fee strategy
sol_trade_sdk::common::GasFeeStrategy::init_builtin_fee_strategies();
println!("✅ SolanaTrade client initialized successfully!");
Ok(solana_trade)
}
+3 -4
View File
@@ -3,6 +3,7 @@ use std::sync::{
Arc,
};
use sol_trade_sdk::solana_streamer_sdk::streaming::event_parser::{Protocol, UnifiedEvent};
use sol_trade_sdk::solana_streamer_sdk::streaming::YellowstoneGrpc;
use sol_trade_sdk::solana_streamer_sdk::{
match_event, streaming::event_parser::protocols::raydium_cpmm::RaydiumCpmmSwapEvent,
@@ -12,10 +13,6 @@ use sol_trade_sdk::{
common::TradeConfig,
solana_streamer_sdk::streaming::yellowstone_grpc::{AccountFilter, TransactionFilter},
};
use sol_trade_sdk::{
constants::trade::trade::{DEFAULT_CU_LIMIT, DEFAULT_CU_PRICE},
solana_streamer_sdk::streaming::event_parser::{Protocol, UnifiedEvent},
};
use sol_trade_sdk::{
instruction::utils::raydium_cpmm::accounts,
solana_streamer_sdk::streaming::event_parser::protocols::raydium_cpmm::parser::RAYDIUM_CPMM_PROGRAM_ID,
@@ -114,6 +111,8 @@ async fn create_solana_trade_client() -> AnyResult<SolanaTrade> {
let swqos_configs: Vec<SwqosConfig> = vec![SwqosConfig::Default(rpc_url.clone())];
let trade_config = TradeConfig::new(rpc_url, swqos_configs, commitment);
let solana_trade = SolanaTrade::new(Arc::new(payer), trade_config).await;
// init gas fee strategy
sol_trade_sdk::common::GasFeeStrategy::init_builtin_fee_strategies();
println!("✅ SolanaTrade client initialized successfully!");
Ok(solana_trade)
}
+2 -1
View File
@@ -2,7 +2,6 @@ use sol_trade_sdk::{
common::{
fast_fn::get_associated_token_address_with_program_id_fast_use_seed, AnyResult, TradeConfig,
},
constants::trade::trade::{DEFAULT_CU_LIMIT, DEFAULT_CU_PRICE},
swqos::SwqosConfig,
trading::{core::params::PumpSwapParams, factory::DexType},
SolanaTrade,
@@ -91,6 +90,8 @@ async fn create_solana_trade_client() -> AnyResult<SolanaTrade> {
let swqos_configs: Vec<SwqosConfig> = vec![SwqosConfig::Default(rpc_url.clone())];
let trade_config = TradeConfig::new(rpc_url, swqos_configs, commitment);
let solana_trade = SolanaTrade::new(Arc::new(payer), trade_config).await;
// init gas fee strategy
sol_trade_sdk::common::GasFeeStrategy::init_builtin_fee_strategies();
println!("✅ SolanaTrade client initialized successfully!");
Ok(solana_trade)
}
+2
View File
@@ -35,6 +35,8 @@ async fn create_solana_trade_client() -> AnyResult<SolanaTrade> {
];
let trade_config = TradeConfig::new(rpc_url, swqos_configs, commitment);
let solana_trade_client = SolanaTrade::new(Arc::new(payer), trade_config).await;
// init gas fee strategy
sol_trade_sdk::common::GasFeeStrategy::init_builtin_fee_strategies();
println!("SolanaTrade client created successfully!");
Ok(solana_trade_client)
}
+3 -6
View File
@@ -1,9 +1,4 @@
use sol_trade_sdk::{
common::TradeConfig,
constants::trade::trade::{DEFAULT_CU_LIMIT, DEFAULT_CU_PRICE},
swqos::SwqosConfig,
SolanaTrade,
};
use sol_trade_sdk::{common::TradeConfig, swqos::SwqosConfig, SolanaTrade};
use solana_sdk::{commitment_config::CommitmentConfig, signature::Keypair};
use std::sync::Arc;
@@ -63,6 +58,8 @@ async fn create_solana_trade_client() -> Result<SolanaTrade, Box<dyn std::error:
let swqos_configs: Vec<SwqosConfig> = vec![SwqosConfig::Default(rpc_url.clone())];
let trade_config = TradeConfig::new(rpc_url, swqos_configs, commitment);
let solana_trade = SolanaTrade::new(Arc::new(payer), trade_config).await;
// init gas fee strategy
sol_trade_sdk::common::GasFeeStrategy::init_builtin_fee_strategies();
println!("✅ SolanaTrade client initialized successfully!");
Ok(solana_trade)
}