diff --git a/src/helius_rpc.rs b/src/helius_rpc.rs deleted file mode 100644 index 5ca9d92..0000000 --- a/src/helius_rpc.rs +++ /dev/null @@ -1,124 +0,0 @@ -use { - solana_client::rpc_client::RpcClient, - solana_sdk::{instruction::Instruction, transaction::Transaction}, -}; - -#[derive(serde::Serialize, serde::Deserialize, Clone, Copy, Debug, Eq, Hash, PartialEq)] -#[serde(rename_all = "camelCase")] -pub enum HeliusPriorityLevel { - None, // 0th percentile - Low, // 25th percentile - Medium, // 50th percentile - High, // 75th percentile - VeryHigh, // 95th percentile - Default, // 50th percentile -} - -pub type HeliusMicroLamportPriorityFee = f64; - -#[derive(serde::Serialize, serde::Deserialize, Debug, Default)] -pub struct HeliusGetPriorityFeeEstimateRequest { - pub transaction: Option, // estimate fee for a serialized txn - pub account_keys: Option>, // estimate fee for a list of accounts - pub options: Option, -} - -#[derive(serde::Serialize, serde::Deserialize, Debug, Default)] -pub struct HeliusGetPriorityFeeEstimateOptions { - pub priority_level: Option, // Default to MEDIUM - pub include_all_priority_fee_levels: Option, // Include all priority level estimates in the response - pub transaction_encoding: Option, // Default Base58 - pub lookback_slots: Option, // number of slots to look back to calculate estimate. Valid number are 1-150, defualt is 150 -} - -#[derive(serde::Deserialize, Debug)] -#[serde(rename_all = "camelCase")] -pub struct HeliusGetPriorityFeeEstimateResponse { - pub priority_fee_estimate: Option, - pub priority_fee_levels: Option, -} - -#[derive(serde::Deserialize, Debug)] -pub struct HeliusMicroLamportPriorityFeeLevels { - pub none: f64, - pub low: f64, - pub medium: f64, - pub high: f64, - pub very_high: f64, - pub unsafe_max: f64, -} - -pub fn get_priority_fee_estimate_for_transaction( - rpc_client: &RpcClient, - priority_level: HeliusPriorityLevel, - transaction: &Transaction, -) -> Result { - //println!("Invoking Helius RPC method: getPriorityFeeEstimate"); - - let request = serde_json::json!([HeliusGetPriorityFeeEstimateRequest { - options: Some(HeliusGetPriorityFeeEstimateOptions { - priority_level: Some(priority_level), - ..HeliusGetPriorityFeeEstimateOptions::default() - }), - transaction: Some(bs58::encode(bincode::serialize(transaction).unwrap()).into_string()), - ..HeliusGetPriorityFeeEstimateRequest::default() - }]); - - rpc_client - .send::( - solana_client::rpc_request::RpcRequest::Custom { - method: "getPriorityFeeEstimate", - }, - request, - ) - .map(|response| { - response - .priority_fee_estimate - .expect("priority_fee_estimate") as u64 - }) - .map_err(|err| format!("Failed to invoke RPC method getPriorityFeeEstimate: {err}")) -} - -pub fn get_priority_fee_estimate_for_instructions( - rpc_client: &RpcClient, - priority_level: HeliusPriorityLevel, - instructions: &[Instruction], -) -> Result { - //println!("Invoking Helius RPC method: getPriorityFeeEstimate"); - - let mut account_keys: Vec<_> = instructions - .iter() - .flat_map(|instruction| { - instruction - .accounts - .iter() - .map(|account_meta| account_meta.pubkey.to_string()) - .collect::>() - }) - .collect(); - account_keys.sort(); - account_keys.dedup(); - - let request = serde_json::json!([HeliusGetPriorityFeeEstimateRequest { - options: Some(HeliusGetPriorityFeeEstimateOptions { - priority_level: Some(priority_level), - ..HeliusGetPriorityFeeEstimateOptions::default() - }), - account_keys: Some(account_keys), - ..HeliusGetPriorityFeeEstimateRequest::default() - }]); - - rpc_client - .send::( - solana_client::rpc_request::RpcRequest::Custom { - method: "getPriorityFeeEstimate", - }, - request, - ) - .map(|response| { - response - .priority_fee_estimate - .expect("priority_fee_estimate") as u64 - }) - .map_err(|err| format!("Failed to invoke RPC method getPriorityFeeEstimate: {err}")) -} diff --git a/src/lib.rs b/src/lib.rs index a911344..510ddb8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,7 +4,6 @@ pub mod binance_exchange; pub mod coin_gecko; pub mod coinbase_exchange; pub mod exchange; -pub mod helius_rpc; pub mod kraken_exchange; pub mod metrics; pub mod notifier; diff --git a/src/priority_fee.rs b/src/priority_fee.rs index 0558593..9cbf8d9 100644 --- a/src/priority_fee.rs +++ b/src/priority_fee.rs @@ -1,5 +1,4 @@ use { - crate::helius_rpc, solana_client::rpc_client::RpcClient, solana_sdk::{ compute_budget, @@ -120,32 +119,24 @@ pub fn apply_priority_fee( .map(|f| f as f64) .collect::>(); + let ui_fee_for = |compute_unit_price_micro_lamports: f64| { + Sol(ComputeBudget { + compute_unit_price_micro_lamports: compute_unit_price_micro_lamports as u64, + compute_unit_limit, + } + .priority_fee_lamports()) + }; + let dist = criterion_stats::Distribution::from(recent_compute_unit_prices.into_boxed_slice()); - print!("Recent CU prices: mean={:.0}", dist.mean()); + print!("Recent priority fees: mean={}", ui_fee_for(dist.mean())); let percentiles = dist.percentiles(); for i in [50., 75., 85., 90., 95., 100.] { - print!(", {i}th={:.0}", percentiles.at(i)); + print!(", {i}th={}", ui_fee_for(percentiles.at(i))); } let compute_unit_price_micro_lamports = percentiles.at(fee_percentile as f64) as u64; - println!( - "\nUsing the {fee_percentile}th percentile recent CU price of {:.0}", - compute_unit_price_micro_lamports - ); - - if let Ok(priority_fee_estimate) = - helius_rpc::get_priority_fee_estimate_for_instructions( - rpc_client, - helius_rpc::HeliusPriorityLevel::High, - instructions, - ) - { - println!( - "Note: helius compute unit price (high) estimate is {priority_fee_estimate}. \ - `sys` computed {compute_unit_price_micro_lamports}" - ); - } + println!("\nusing {fee_percentile}th percentile fee"); let compute_budget = ComputeBudget { compute_unit_price_micro_lamports,