diff --git a/src/lib.rs b/src/lib.rs index c8a87e2..c3f0bfb 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -740,7 +740,7 @@ impl TradingClient { pub async fn buy( &self, params: TradeBuyParams, - ) -> Result<(bool, Vec, Option), anyhow::Error> { + ) -> Result<(bool, Vec, Option, Vec<(crate::swqos::SwqosType, i64)>), anyhow::Error> { if params.recent_blockhash.is_none() && params.durable_nonce.is_none() { return Err(anyhow::anyhow!( "Must provide either recent_blockhash or durable_nonce for buy (required for transaction validity)" @@ -814,8 +814,8 @@ impl TradingClient { let swap_result = executor.swap(buy_params).await; let result = - swap_result.map(|(success, sigs, err)| (success, sigs, err.map(TradeError::from))); - return result; + swap_result.map(|(success, sigs, err, timings)| (success, sigs, err.map(TradeError::from), timings)); + result } /// Execute a sell order for a specified token @@ -847,7 +847,7 @@ impl TradingClient { pub async fn sell( &self, params: TradeSellParams, - ) -> Result<(bool, Vec, Option), anyhow::Error> { + ) -> Result<(bool, Vec, Option, Vec<(crate::swqos::SwqosType, i64)>), anyhow::Error> { #[cfg(feature = "perf-trace")] if sdk_log::sdk_log_enabled() && params.slippage_basis_points.is_none() { debug!( @@ -921,8 +921,8 @@ impl TradingClient { let swap_result = executor.swap(sell_params).await; let result = - swap_result.map(|(success, sigs, err)| (success, sigs, err.map(TradeError::from))); - return result; + swap_result.map(|(success, sigs, err, timings)| (success, sigs, err.map(TradeError::from), timings)); + result } /// Execute a sell order for a percentage of the specified token amount @@ -956,7 +956,7 @@ impl TradingClient { mut params: TradeSellParams, amount_token: u64, percent: u64, - ) -> Result<(bool, Vec, Option), anyhow::Error> { + ) -> Result<(bool, Vec, Option, Vec<(crate::swqos::SwqosType, i64)>), anyhow::Error> { if percent == 0 || percent > 100 { return Err(anyhow::anyhow!("Percentage must be between 1 and 100")); } diff --git a/src/trading/core/async_executor.rs b/src/trading/core/async_executor.rs index 69c8714..c4b737a 100644 --- a/src/trading/core/async_executor.rs +++ b/src/trading/core/async_executor.rs @@ -562,7 +562,7 @@ pub async fn execute_parallel( // All jobs enqueued (no spawn on hot path) if !wait_transaction_confirmed { - const SUBMIT_TIMEOUT_SECS: u64 = 30; + const SUBMIT_TIMEOUT_SECS: u64 = 2;//无需确认的交易,一般2秒合适了 一般2秒内发送全都返回 没返回的也不等了,没返回的就是太慢的swqos let ret = collector.wait_for_all_submitted(SUBMIT_TIMEOUT_SECS).await.unwrap_or(( false, vec![], diff --git a/src/trading/core/executor.rs b/src/trading/core/executor.rs index 724706a..aafd9b9 100755 --- a/src/trading/core/executor.rs +++ b/src/trading/core/executor.rs @@ -25,6 +25,7 @@ use crate::{ trading::MiddlewareManager, }; use once_cell::sync::Lazy; +use crate::swqos::{ SwqosType}; /// Global syscall bypass manager (reserved for future time/IO optimizations). /// 全局系统调用绕过管理器(预留,后续可接入时间/IO 等优化)。 @@ -55,7 +56,7 @@ impl TradeExecutor for GenericTradeExecutor { async fn swap( &self, params: SwapParams, - ) -> Result<(bool, Vec, Option)> { + ) -> Result<(bool, Vec, Option, Vec<(SwqosType, i64)>)> { // Sample total start only when logging or simulate. 仅在有日志或 simulate 时取起点。 let total_start = (params.log_enabled || params.simulate).then(Instant::now); let timing_start_us: Option = if params.log_enabled { @@ -215,7 +216,9 @@ impl TradeExecutor for GenericTradeExecutor { } else { (ok, signatures, err) }; - Ok(confirm_result) + + //就是把confirm_result 拆开 再加上 submit_timings + Ok((confirm_result.0, confirm_result.1, confirm_result.2, submit_timings)) } else { // Not waiting for confirmation: confirmed is not measured (-); total is per-channel submit time only. if log_enabled { @@ -229,7 +232,11 @@ impl TradeExecutor for GenericTradeExecutor { None, ); } - Ok((ok, signatures, err)) + + + + Ok((ok, signatures, err, submit_timings)) + }; result @@ -254,7 +261,7 @@ async fn simulate_transaction( is_buy: bool, with_tip: bool, gas_fee_strategy: GasFeeStrategy, -) -> Result<(bool, Vec, Option)> { +) -> Result<(bool, Vec, Option, Vec<(SwqosType, i64)>)> { use crate::trading::common::build_transaction; use solana_client::rpc_config::RpcSimulateTransactionConfig; use solana_commitment_config::CommitmentLevel; @@ -330,7 +337,7 @@ async fn simulate_transaction( trace!(target: "sol_trade_sdk", "Compute Units Consumed: {}", units_consumed); } } - return Ok((false, vec![signature], Some(anyhow::anyhow!("{:?}", err)))); + return Ok((false, vec![signature], Some(anyhow::anyhow!("{:?}", err)), Vec::new())); } // Simulation succeeded @@ -345,7 +352,7 @@ async fn simulate_transaction( } } - Ok((true, vec![signature], None)) + Ok((true, vec![signature], None, Vec::new())) } #[cfg(test)] diff --git a/src/trading/core/traits.rs b/src/trading/core/traits.rs index 80dda6f..df68e4d 100755 --- a/src/trading/core/traits.rs +++ b/src/trading/core/traits.rs @@ -1,7 +1,7 @@ use crate::trading::SwapParams; use anyhow::Result; use solana_sdk::{instruction::Instruction, signature::Signature}; - +use crate::swqos::{SwqosType}; /// 交易执行器trait - 定义了所有交易协议都需要实现的核心方法 #[async_trait::async_trait] pub trait TradeExecutor: Send + Sync { @@ -9,10 +9,7 @@ pub trait TradeExecutor: Send + Sync { /// - bool: 是否至少有一个交易成功 /// - Vec: 所有提交的交易签名(按SWQOS顺序) /// - Option: 最后一个错误(如果全部失败) - async fn swap( - &self, - params: SwapParams, - ) -> Result<(bool, Vec, Option)>; + async fn swap(&self, params: SwapParams) -> Result<(bool, Vec, Option, Vec<(SwqosType, i64)>)>; /// 获取协议名称 fn protocol_name(&self) -> &'static str; }