From fa58c2f6af43e0ffa99243174d4e65a9e6c467cd Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Mon, 6 Jan 2025 17:20:28 -0500 Subject: [PATCH 001/112] Prep for testing --- Cargo.lock | 5 +++-- tip-router-operator-cli/Cargo.toml | 1 + tip-router-operator-cli/src/cli.rs | 22 ++++++++++---------- tip-router-operator-cli/src/lib.rs | 21 +++++++++++++++++++ tip-router-operator-cli/src/process_epoch.rs | 9 ++++---- tip-router-operator-cli/src/tip_router.rs | 7 ++++++- 6 files changed, 47 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 00ea5c2e..21d2547e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1046,7 +1046,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115e54d64eb62cdebad391c19efc9dce4981c690c85a33a12199d99bb9546fee" dependencies = [ "borsh-derive 0.10.4", - "hashbrown 0.13.2", + "hashbrown 0.12.3", ] [[package]] @@ -4027,7 +4027,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 3.2.0", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 2.0.93", @@ -8856,6 +8856,7 @@ dependencies = [ "solana-sdk", "solana-stake-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "spl-memo", "tempfile", "thiserror", "tokio", diff --git a/tip-router-operator-cli/Cargo.toml b/tip-router-operator-cli/Cargo.toml index ced12bf4..ebf268fb 100644 --- a/tip-router-operator-cli/Cargo.toml +++ b/tip-router-operator-cli/Cargo.toml @@ -35,6 +35,7 @@ solana-runtime = { workspace = true } solana-sdk = { workspace = true } solana-stake-program = { workspace = true } solana-vote = { workspace = true } +spl-memo = "4.0.0" thiserror = { workspace = true } tokio = { workspace = true } diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index 95a65630..9046cbfe 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -6,25 +6,25 @@ use solana_sdk::pubkey::Pubkey; #[derive(Parser)] #[command(author, version, about)] pub struct Cli { - #[arg(short, long)] + #[arg(short, long, env)] pub keypair_path: String, - #[arg(short, long)] + #[arg(short, long, env)] pub operator_address: String, - #[arg(short, long, default_value = "http://localhost:8899")] + #[arg(short, long, env, default_value = "http://localhost:8899")] pub rpc_url: String, - #[arg(short, long)] + #[arg(short, long, env)] pub ledger_path: PathBuf, - #[arg(short, long)] + #[arg(short, long, env)] pub account_paths: Option>, - #[arg(short, long)] + #[arg(short, long, env)] pub full_snapshots_path: Option, - #[arg(short, long)] + #[arg(short, long, env)] pub snapshot_output_dir: PathBuf, #[command(subcommand)] @@ -34,16 +34,16 @@ pub struct Cli { #[derive(clap::Subcommand)] pub enum Commands { Run { - #[arg(short, long)] + #[arg(short, long, env)] ncn_address: Pubkey, - #[arg(long)] + #[arg(long, env)] tip_distribution_program_id: Pubkey, - #[arg(long)] + #[arg(long, env)] tip_payment_program_id: Pubkey, - #[arg(long, default_value = "false")] + #[arg(long, env, default_value = "false")] enable_snapshots: bool, }, } diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index b31a73a5..cb06ecb3 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -94,6 +94,14 @@ pub fn get_meta_merkle_root( ) .map_err(|_| MerkleRootError::StakeMetaGeneratorError("Failed to generate stake meta"))?; + info!( + "Created StakeMetaCollection:\n - epoch: {:?}\n - slot: {:?}\n - num stake metas: {:?}\n - bank_hash: {:?}", + stake_meta_collection.epoch, + stake_meta_collection.slot, + stake_meta_collection.stake_metas.len(), + stake_meta_collection.bank_hash + ); + // Generate merkle tree collection let merkle_tree_coll = GeneratedMerkleTreeCollection::new_from_stake_meta_collection( stake_meta_collection, @@ -105,6 +113,14 @@ pub fn get_meta_merkle_root( MerkleRootError::MerkleRootGeneratorError("Failed to generate merkle tree collection") })?; + info!( + "Created GeneratedMerkleTreeCollection:\n - epoch: {:?}\n - slot: {:?}\n - num generated merkle trees: {:?}\n - bank_hash: {:?}", + merkle_tree_coll.epoch, + merkle_tree_coll.slot, + merkle_tree_coll.generated_merkle_trees.len(), + merkle_tree_coll.bank_hash + ); + // Convert to MetaMerkleTree let meta_merkle_tree = MetaMerkleTree::new_from_generated_merkle_tree_collection( merkle_tree_coll, @@ -113,5 +129,10 @@ pub fn get_meta_merkle_root( info!("Meta merkle tree creation error: {:?}", e); MerkleRootError::MerkleTreeError("Failed to create meta merkle tree") })?; + + info!( + "Created MetaMerkleTree:\n - num nodes: {:?}\n - merkle root: {:?}", + meta_merkle_tree.num_nodes, meta_merkle_tree.merkle_root + ); Ok(meta_merkle_tree) } diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index 0a91a48f..3b7a1486 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -71,10 +71,11 @@ pub async fn process_epoch( let operator = Pubkey::from_str(&cli_args.operator_address).unwrap(); // Get the protocol fees - let ncn_config = get_ncn_config(client, ncn_address).await.unwrap(); - let adjusted_total_fees = ncn_config - .fee_config - .adjusted_total_fees_bps(previous_epoch)?; + // let ncn_config = get_ncn_config(client, ncn_address).await.unwrap(); + // let adjusted_total_fees = ncn_config + // .fee_config + // .adjusted_total_fees_bps(previous_epoch)?; + let adjusted_total_fees = 300; let account_paths = account_paths.map_or_else(|| vec![ledger_path.clone()], |paths| paths); let full_snapshots_path = full_snapshots_path.map_or(ledger_path, |path| path); diff --git a/tip-router-operator-cli/src/tip_router.rs b/tip-router-operator-cli/src/tip_router.rs index f17ba02e..d52ff173 100644 --- a/tip-router-operator-cli/src/tip_router.rs +++ b/tip-router-operator-cli/src/tip_router.rs @@ -7,6 +7,7 @@ use jito_tip_router_core::{ config::Config, epoch_snapshot::{EpochSnapshot, OperatorSnapshot}, }; +use log::info; use solana_sdk::{ pubkey::Pubkey, signature::{Keypair, Signature}, @@ -46,7 +47,7 @@ pub async fn cast_vote( ) .0; - let ix = CastVoteBuilder::new() + let _ix = CastVoteBuilder::new() .config(ncn_config) .ballot_box(ballot_box) .ncn(ncn) @@ -59,6 +60,10 @@ pub async fn cast_vote( .epoch(epoch) .instruction(); + // Until we actually want to start voting on live or test NCN + let ix = spl_memo::build_memo(&meta_merkle_root.to_vec(), &[&operator_admin.pubkey()]); + info!("Submitting meta merkle root {:?}", meta_merkle_root); + let tx = Transaction::new_with_payer(&[ix], Some(&payer.pubkey())); client .process_transaction(tx, &[payer, operator_admin]) From 4979178a4345a3675e86393eed8a518642c453b9 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Tue, 7 Jan 2025 13:37:50 -0500 Subject: [PATCH 002/112] Debug lines --- tip-router-operator-cli/src/main.rs | 18 ++++++++++++++++++ .../src/stake_meta_generator.rs | 5 +++++ 2 files changed, 23 insertions(+) diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 5ae9664c..ad5a189a 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -21,6 +21,24 @@ async fn main() -> Result<()> { &read_keypair_file(&cli.keypair_path).expect("Failed to read keypair file"), )?; + info!( + "CLI Arguments: + keypair_path: {} + operator_address: {} + rpc_url: {} + ledger_path: {} + account_paths: {:?} + full_snapshots_path: {:?} + snapshot_output_dir: {}", + cli.keypair_path, + cli.operator_address, + cli.rpc_url, + cli.ledger_path.display(), + cli.account_paths, + cli.full_snapshots_path, + cli.snapshot_output_dir.display() + ); + match &cli.command { Commands::Run { ncn_address, diff --git a/tip-router-operator-cli/src/stake_meta_generator.rs b/tip-router-operator-cli/src/stake_meta_generator.rs index e082ca52..8fc7bec7 100644 --- a/tip-router-operator-cli/src/stake_meta_generator.rs +++ b/tip-router-operator-cli/src/stake_meta_generator.rs @@ -83,6 +83,11 @@ pub fn generate_stake_meta( snapshots_enabled: bool, ) -> Result { info!("Creating bank from ledger path..."); + info!("ledger_path: {}", ledger_path.display()); + info!("account_paths: {:?}", account_paths); + info!("full_snapshots_path: {}", full_snapshots_path.display()); + info!("desired_slot: {}", desired_slot); + info!("snapshots_enabled: {}", snapshots_enabled); let bank = get_bank_from_ledger( ledger_path, account_paths, From f81018f9c69349a5a12c4a63deae642da0adbe4e Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Tue, 7 Jan 2025 13:54:27 -0500 Subject: [PATCH 003/112] snapshot-slot --- tip-router-operator-cli/src/cli.rs | 16 ++++++++++++++ tip-router-operator-cli/src/main.rs | 33 ++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index 9046cbfe..14f86aca 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -46,4 +46,20 @@ pub enum Commands { #[arg(long, env, default_value = "false")] enable_snapshots: bool, }, + SnapshotSlot { + #[arg(short, long, env)] + ncn_address: Pubkey, + + #[arg(long, env)] + tip_distribution_program_id: Pubkey, + + #[arg(long, env)] + tip_payment_program_id: Pubkey, + + #[arg(long, env, default_value = "false")] + enable_snapshots: bool, + + #[arg(long, env)] + slot: u64, + }, } diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index ad5a189a..a03ede18 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -4,7 +4,7 @@ use ::{ ellipsis_client::EllipsisClient, log::{error, info}, solana_rpc_client::rpc_client::RpcClient, - solana_sdk::signer::keypair::read_keypair_file, + solana_sdk::{clock::DEFAULT_SLOTS_PER_EPOCH, signer::keypair::read_keypair_file}, tip_router_operator_cli::{ cli::{Cli, Commands}, process_epoch::{get_previous_epoch_last_slot, process_epoch, wait_for_next_epoch}, @@ -79,5 +79,36 @@ async fn main() -> Result<()> { wait_for_next_epoch(&rpc_client).await?; } } + Commands::SnapshotSlot { + ncn_address, + tip_distribution_program_id, + tip_payment_program_id, + enable_snapshots, + slot, + } => { + info!("Snapshotting slot..."); + let epoch = slot / DEFAULT_SLOTS_PER_EPOCH; + // Process the epoch + match process_epoch( + &rpc_client, + *slot, + epoch, + &keypair, + tip_distribution_program_id, + tip_payment_program_id, + ncn_address, + *enable_snapshots, + &cli, + ) + .await + { + Ok(_) => info!("Successfully processed slot"), + Err(e) => { + error!("Error processing epoch: {}", e); + // Continue to next epoch even if this one failed + } + } + } } + Ok(()) } From 39885341bb6855506954759b0cb422cf7a2f1aa5 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Tue, 7 Jan 2025 17:01:10 -0500 Subject: [PATCH 004/112] ... --- tip-router-operator-cli/src/ledger_utils.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index 6126298e..c536dfed 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -72,6 +72,14 @@ pub fn get_bank_from_ledger( } }; + let mut slots_in_blockstore = Vec::new(); + for i in 312382937..312400925 { + if blockstore.meta(i).unwrap().is_some() { + slots_in_blockstore.push(i); + } + } + info!("Slots in blockstore: {:?}", slots_in_blockstore); + let snapshot_config = SnapshotConfig { full_snapshot_archives_dir: full_snapshots_path.clone(), incremental_snapshot_archives_dir: full_snapshots_path.clone(), @@ -99,6 +107,15 @@ pub fn get_bank_from_ledger( false, ) .unwrap(); + info!( + "Bank forks highest slot: {:?}", + bank_forks.read().unwrap().highest_slot() + ); + info!( + "Bank forks working bank slot: {:?}", + bank_forks.read().unwrap().working_bank().slot() + ); + blockstore_processor::process_blockstore_from_root( &blockstore, &bank_forks, From 42dd84af59f77150e24e29290cd1d457ded5fd98 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 8 Jan 2025 10:18:26 -0500 Subject: [PATCH 005/112] print out better errors --- meta_merkle_tree/src/generated_merkle_tree.rs | 48 ++++++++++++++----- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/meta_merkle_tree/src/generated_merkle_tree.rs b/meta_merkle_tree/src/generated_merkle_tree.rs index 6ac9b12a..5ea22761 100644 --- a/meta_merkle_tree/src/generated_merkle_tree.rs +++ b/meta_merkle_tree/src/generated_merkle_tree.rs @@ -4,6 +4,7 @@ use jito_tip_distribution_sdk::{ jito_tip_distribution::ID as TIP_DISTRIBUTION_ID, CLAIM_STATUS_SEED, }; use jito_vault_core::MAX_BPS; +use log::info; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use solana_program::{ clock::{Epoch, Slot}, @@ -30,6 +31,24 @@ pub enum MerkleRootGeneratorError { MerkleTreeTestError, #[error("Checked math error")] CheckedMathError, + #[error("Checked math error A")] + CheckedMathErrorA, + #[error("Checked math error B")] + CheckedMathErrorB, + #[error("Checked math error C")] + CheckedMathErrorC, + #[error("Checked math error D")] + CheckedMathErrorD, + #[error("Checked math error E")] + CheckedMathErrorE, + #[error("Checked math error F")] + CheckedMathErrorF, + #[error("Checked math error G")] + CheckedMathErrorG, + #[error("Checked math error H")] + CheckedMathErrorH, + #[error("Checked math error I")] + CheckedMathErrorI, } #[derive(Clone, Deserialize, Serialize, Debug)] @@ -72,7 +91,10 @@ impl GeneratedMerkleTreeCollection { epoch, &stake_meta_collection.tip_distribution_program_id, // Pass the program ID ) { - Err(e) => return Some(Err(e)), + Err(e) => { + info!("Error creating tree nodes: {:?}", e); + return Some(Err(e)); + } Ok(maybe_tree_nodes) => maybe_tree_nodes, }?; @@ -99,7 +121,11 @@ impl GeneratedMerkleTreeCollection { max_total_claim: tip_distribution_meta.total_tips, })) }) - .collect::, MerkleRootGeneratorError>>()?; + .collect::, MerkleRootGeneratorError>>() + .map_err(|e| { + info!("Error collecting generated merkle trees: {:?}", e); + e + })?; Ok(Self { generated_merkle_trees, @@ -148,26 +174,26 @@ impl TreeNode { let protocol_fee_amount = u128::div_ceil( (tip_distribution_meta.total_tips as u128) .checked_mul(protocol_fee_bps as u128) - .ok_or(MerkleRootGeneratorError::CheckedMathError)?, + .ok_or(MerkleRootGeneratorError::CheckedMathErrorA)?, MAX_BPS as u128, ); let protocol_fee_amount = u64::try_from(protocol_fee_amount) - .map_err(|_| MerkleRootGeneratorError::CheckedMathError)?; + .map_err(|_| MerkleRootGeneratorError::CheckedMathErrorB)?; let validator_amount = u64::try_from( (tip_distribution_meta.total_tips as u128) .checked_mul(tip_distribution_meta.validator_fee_bps as u128) - .ok_or(MerkleRootGeneratorError::CheckedMathError)? + .ok_or(MerkleRootGeneratorError::CheckedMathErrorC)? .checked_div(MAX_BPS as u128) - .ok_or(MerkleRootGeneratorError::CheckedMathError)?, + .ok_or(MerkleRootGeneratorError::CheckedMathErrorD)?, ) - .map_err(|_| MerkleRootGeneratorError::CheckedMathError)?; + .map_err(|_| MerkleRootGeneratorError::CheckedMathErrorE)?; let remaining_total_rewards = tip_distribution_meta .total_tips .checked_sub(protocol_fee_amount) .and_then(|v| v.checked_sub(validator_amount)) - .ok_or(MerkleRootGeneratorError::CheckedMathError)?; + .ok_or(MerkleRootGeneratorError::CheckedMathErrorF)?; // Must match the seeds from `core::BaseRewardReceiver`. Cannot // use `BaseRewardReceiver::find_program_address` as it would cause @@ -231,11 +257,11 @@ impl TreeNode { let amount_delegated = delegation.lamports_delegated as u128; let reward_amount = u64::try_from( (amount_delegated.checked_mul(remaining_total_rewards as u128)) - .ok_or(MerkleRootGeneratorError::CheckedMathError)? + .ok_or(MerkleRootGeneratorError::CheckedMathErrorG)? .checked_div(total_delegated) - .ok_or(MerkleRootGeneratorError::CheckedMathError)?, + .ok_or(MerkleRootGeneratorError::CheckedMathErrorH)?, ) - .map_err(|_| MerkleRootGeneratorError::CheckedMathError)?; + .map_err(|_| MerkleRootGeneratorError::CheckedMathErrorI)?; let (claim_status_pubkey, claim_status_bump) = Pubkey::find_program_address( &[ From 0497a4fa345e7bf6d6123ee194eda7fac0ef4bcc Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 8 Jan 2025 10:26:30 -0500 Subject: [PATCH 006/112] Desired slot in blcokstore --- tip-router-operator-cli/src/ledger_utils.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index c536dfed..4dc06365 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -72,13 +72,11 @@ pub fn get_bank_from_ledger( } }; - let mut slots_in_blockstore = Vec::new(); - for i in 312382937..312400925 { - if blockstore.meta(i).unwrap().is_some() { - slots_in_blockstore.push(i); - } - } - info!("Slots in blockstore: {:?}", slots_in_blockstore); + let desired_slot_in_blockstore = blockstore.meta(*desired_slot).unwrap().is_some(); + info!( + "Desired slot {} in blockstore: {}", + desired_slot, desired_slot_in_blockstore + ); let snapshot_config = SnapshotConfig { full_snapshot_archives_dir: full_snapshots_path.clone(), From 8fc24f31c7379951d7316ce78a0c035f237d3a48 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 8 Jan 2025 12:15:38 -0500 Subject: [PATCH 007/112] rm div_ceil --- meta_merkle_tree/src/generated_merkle_tree.rs | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/meta_merkle_tree/src/generated_merkle_tree.rs b/meta_merkle_tree/src/generated_merkle_tree.rs index 5ea22761..cd5c2eb5 100644 --- a/meta_merkle_tree/src/generated_merkle_tree.rs +++ b/meta_merkle_tree/src/generated_merkle_tree.rs @@ -43,12 +43,6 @@ pub enum MerkleRootGeneratorError { CheckedMathErrorE, #[error("Checked math error F")] CheckedMathErrorF, - #[error("Checked math error G")] - CheckedMathErrorG, - #[error("Checked math error H")] - CheckedMathErrorH, - #[error("Checked math error I")] - CheckedMathErrorI, } #[derive(Clone, Deserialize, Serialize, Debug)] @@ -171,14 +165,14 @@ impl TreeNode { tip_distribution_program_id: &Pubkey, ) -> Result>, MerkleRootGeneratorError> { if let Some(tip_distribution_meta) = stake_meta.maybe_tip_distribution_meta.as_ref() { - let protocol_fee_amount = u128::div_ceil( + let protocol_fee_amount = u64::try_from( (tip_distribution_meta.total_tips as u128) .checked_mul(protocol_fee_bps as u128) - .ok_or(MerkleRootGeneratorError::CheckedMathErrorA)?, - MAX_BPS as u128, - ); - let protocol_fee_amount = u64::try_from(protocol_fee_amount) - .map_err(|_| MerkleRootGeneratorError::CheckedMathErrorB)?; + .ok_or(MerkleRootGeneratorError::CheckedMathErrorA)? + .checked_div(MAX_BPS as u128) + .ok_or(MerkleRootGeneratorError::CheckedMathErrorB)?, + ) + .map_err(|_| MerkleRootGeneratorError::CheckedMathErrorC)?; let validator_amount = u64::try_from( (tip_distribution_meta.total_tips as u128) From f2cd56b93fda45cd193d7d16c927fbd53821696a Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 8 Jan 2025 12:16:23 -0500 Subject: [PATCH 008/112] ... --- meta_merkle_tree/src/generated_merkle_tree.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/meta_merkle_tree/src/generated_merkle_tree.rs b/meta_merkle_tree/src/generated_merkle_tree.rs index cd5c2eb5..56d3f3d0 100644 --- a/meta_merkle_tree/src/generated_merkle_tree.rs +++ b/meta_merkle_tree/src/generated_merkle_tree.rs @@ -43,6 +43,12 @@ pub enum MerkleRootGeneratorError { CheckedMathErrorE, #[error("Checked math error F")] CheckedMathErrorF, + #[error("Checked math error G")] + CheckedMathErrorG, + #[error("Checked math error H")] + CheckedMathErrorH, + #[error("Checked math error I")] + CheckedMathErrorI, } #[derive(Clone, Deserialize, Serialize, Debug)] From a5911df07f8049dc987e19ce00604f1027ffad14 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 8 Jan 2025 13:01:04 -0500 Subject: [PATCH 009/112] more debug --- meta_merkle_tree/src/generated_merkle_tree.rs | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/meta_merkle_tree/src/generated_merkle_tree.rs b/meta_merkle_tree/src/generated_merkle_tree.rs index 56d3f3d0..f46d28be 100644 --- a/meta_merkle_tree/src/generated_merkle_tree.rs +++ b/meta_merkle_tree/src/generated_merkle_tree.rs @@ -192,8 +192,27 @@ impl TreeNode { let remaining_total_rewards = tip_distribution_meta .total_tips .checked_sub(protocol_fee_amount) - .and_then(|v| v.checked_sub(validator_amount)) - .ok_or(MerkleRootGeneratorError::CheckedMathErrorF)?; + .and_then(|v| v.checked_sub(validator_amount)); + + if remaining_total_rewards.is_none() { + info!( + "Invalid remaining rewards calculation:\n\ + total_tips: {}\n\ + protocol_fee_amount: {}\n\ + validator_amount: {}\n\ + protocol_fee_bps: {}\n\ + validator_fee_bps: {}", + tip_distribution_meta.total_tips, + protocol_fee_amount, + validator_amount, + protocol_fee_bps, + tip_distribution_meta.validator_fee_bps + ); + return Ok(None); + } + + let remaining_total_rewards = + remaining_total_rewards.ok_or(MerkleRootGeneratorError::CheckedMathErrorF)?; // Must match the seeds from `core::BaseRewardReceiver`. Cannot // use `BaseRewardReceiver::find_program_address` as it would cause From 6c952c143b4c14cbb8b03436aa7b686470e28a91 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 8 Jan 2025 15:26:52 -0500 Subject: [PATCH 010/112] check blocks --- tip-router-operator-cli/src/ledger_utils.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index 4dc06365..39f743be 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -72,6 +72,16 @@ pub fn get_bank_from_ledger( } }; + let slots_to_check = [ + 312564097, 312582120, 312600208, 312618282, 312636395, 312654446, 312672572, 312690682, + 312708741, 312726810, + ]; + + for slot in slots_to_check { + let slot_exists = blockstore.meta(slot).unwrap().is_some(); + info!("Slot {} in blockstore: {}", slot, slot_exists); + } + let desired_slot_in_blockstore = blockstore.meta(*desired_slot).unwrap().is_some(); info!( "Desired slot {} in blockstore: {}", From f4171a68a2fa4c276f43ead27d2387171967ca8f Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 8 Jan 2025 19:22:10 -0500 Subject: [PATCH 011/112] fix underflow bug --- meta_merkle_tree/src/generated_merkle_tree.rs | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/meta_merkle_tree/src/generated_merkle_tree.rs b/meta_merkle_tree/src/generated_merkle_tree.rs index f46d28be..88c513fe 100644 --- a/meta_merkle_tree/src/generated_merkle_tree.rs +++ b/meta_merkle_tree/src/generated_merkle_tree.rs @@ -189,14 +189,31 @@ impl TreeNode { ) .map_err(|_| MerkleRootGeneratorError::CheckedMathErrorE)?; - let remaining_total_rewards = tip_distribution_meta - .total_tips - .checked_sub(protocol_fee_amount) - .and_then(|v| v.checked_sub(validator_amount)); + let (protocol_fee_amount, remaining_total_rewards) = validator_amount + .checked_add(protocol_fee_amount) + .map_or((protocol_fee_amount, None), |total_fees| { + if total_fees > tip_distribution_meta.total_tips { + // If fees exceed total tips, preference validator amount and reduce protocol fee + tip_distribution_meta + .total_tips + .checked_sub(validator_amount) + .map(|adjusted_protocol_fee| (adjusted_protocol_fee, Some(0))) + .unwrap_or((0, None)) + } else { + // Otherwise use original protocol fee and subtract both fees from total + ( + protocol_fee_amount, + tip_distribution_meta + .total_tips + .checked_sub(protocol_fee_amount) + .and_then(|v| v.checked_sub(validator_amount)), + ) + } + }); if remaining_total_rewards.is_none() { info!( - "Invalid remaining rewards calculation:\n\ + "NOTE: Invalid remaining rewards calculation:\n\ total_tips: {}\n\ protocol_fee_amount: {}\n\ validator_amount: {}\n\ @@ -208,7 +225,6 @@ impl TreeNode { protocol_fee_bps, tip_distribution_meta.validator_fee_bps ); - return Ok(None); } let remaining_total_rewards = From 22c7d6ace1bcdc1742f3c98580019b115751a222 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Sun, 12 Jan 2025 17:30:25 -0500 Subject: [PATCH 012/112] Prep for real epoch rollover --- tip-router-operator-cli/src/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index a03ede18..64d94a13 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -49,6 +49,9 @@ async fn main() -> Result<()> { info!("Running Tip Router..."); loop { + // Wait for epoch change + wait_for_next_epoch(&rpc_client).await?; + // Get the last slot of the previous epoch let (previous_epoch, previous_epoch_slot) = get_previous_epoch_last_slot(&rpc_client).await?; @@ -74,9 +77,6 @@ async fn main() -> Result<()> { // Continue to next epoch even if this one failed } } - - // Wait for epoch change - wait_for_next_epoch(&rpc_client).await?; } } Commands::SnapshotSlot { From 2342107e1247c6f6556fcd888ca7fb62666d4b71 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Mon, 13 Jan 2025 18:09:38 -0500 Subject: [PATCH 013/112] Revert "Prep for real epoch rollover" This reverts commit 22c7d6ace1bcdc1742f3c98580019b115751a222. --- tip-router-operator-cli/src/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 64d94a13..a03ede18 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -49,9 +49,6 @@ async fn main() -> Result<()> { info!("Running Tip Router..."); loop { - // Wait for epoch change - wait_for_next_epoch(&rpc_client).await?; - // Get the last slot of the previous epoch let (previous_epoch, previous_epoch_slot) = get_previous_epoch_last_slot(&rpc_client).await?; @@ -77,6 +74,9 @@ async fn main() -> Result<()> { // Continue to next epoch even if this one failed } } + + // Wait for epoch change + wait_for_next_epoch(&rpc_client).await?; } } Commands::SnapshotSlot { From 0004501a99e33daf8febc109336fdb938bf06e35 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Mon, 13 Jan 2025 18:19:35 -0500 Subject: [PATCH 014/112] Remove debug code --- meta_merkle_tree/src/generated_merkle_tree.rs | 54 ++++--------------- tip-router-operator-cli/src/ledger_utils.rs | 20 +++---- .../src/stake_meta_generator.rs | 5 -- 3 files changed, 18 insertions(+), 61 deletions(-) diff --git a/meta_merkle_tree/src/generated_merkle_tree.rs b/meta_merkle_tree/src/generated_merkle_tree.rs index 88c513fe..94d72c9b 100644 --- a/meta_merkle_tree/src/generated_merkle_tree.rs +++ b/meta_merkle_tree/src/generated_merkle_tree.rs @@ -31,24 +31,6 @@ pub enum MerkleRootGeneratorError { MerkleTreeTestError, #[error("Checked math error")] CheckedMathError, - #[error("Checked math error A")] - CheckedMathErrorA, - #[error("Checked math error B")] - CheckedMathErrorB, - #[error("Checked math error C")] - CheckedMathErrorC, - #[error("Checked math error D")] - CheckedMathErrorD, - #[error("Checked math error E")] - CheckedMathErrorE, - #[error("Checked math error F")] - CheckedMathErrorF, - #[error("Checked math error G")] - CheckedMathErrorG, - #[error("Checked math error H")] - CheckedMathErrorH, - #[error("Checked math error I")] - CheckedMathErrorI, } #[derive(Clone, Deserialize, Serialize, Debug)] @@ -174,20 +156,20 @@ impl TreeNode { let protocol_fee_amount = u64::try_from( (tip_distribution_meta.total_tips as u128) .checked_mul(protocol_fee_bps as u128) - .ok_or(MerkleRootGeneratorError::CheckedMathErrorA)? + .ok_or(MerkleRootGeneratorError::CheckedMathError)? .checked_div(MAX_BPS as u128) - .ok_or(MerkleRootGeneratorError::CheckedMathErrorB)?, + .ok_or(MerkleRootGeneratorError::CheckedMathError)?, ) - .map_err(|_| MerkleRootGeneratorError::CheckedMathErrorC)?; + .map_err(|_| MerkleRootGeneratorError::CheckedMathError)?; let validator_amount = u64::try_from( (tip_distribution_meta.total_tips as u128) .checked_mul(tip_distribution_meta.validator_fee_bps as u128) - .ok_or(MerkleRootGeneratorError::CheckedMathErrorC)? + .ok_or(MerkleRootGeneratorError::CheckedMathError)? .checked_div(MAX_BPS as u128) - .ok_or(MerkleRootGeneratorError::CheckedMathErrorD)?, + .ok_or(MerkleRootGeneratorError::CheckedMathError)?, ) - .map_err(|_| MerkleRootGeneratorError::CheckedMathErrorE)?; + .map_err(|_| MerkleRootGeneratorError::CheckedMathError)?; let (protocol_fee_amount, remaining_total_rewards) = validator_amount .checked_add(protocol_fee_amount) @@ -211,24 +193,8 @@ impl TreeNode { } }); - if remaining_total_rewards.is_none() { - info!( - "NOTE: Invalid remaining rewards calculation:\n\ - total_tips: {}\n\ - protocol_fee_amount: {}\n\ - validator_amount: {}\n\ - protocol_fee_bps: {}\n\ - validator_fee_bps: {}", - tip_distribution_meta.total_tips, - protocol_fee_amount, - validator_amount, - protocol_fee_bps, - tip_distribution_meta.validator_fee_bps - ); - } - let remaining_total_rewards = - remaining_total_rewards.ok_or(MerkleRootGeneratorError::CheckedMathErrorF)?; + remaining_total_rewards.ok_or(MerkleRootGeneratorError::CheckedMathError)?; // Must match the seeds from `core::BaseRewardReceiver`. Cannot // use `BaseRewardReceiver::find_program_address` as it would cause @@ -292,11 +258,11 @@ impl TreeNode { let amount_delegated = delegation.lamports_delegated as u128; let reward_amount = u64::try_from( (amount_delegated.checked_mul(remaining_total_rewards as u128)) - .ok_or(MerkleRootGeneratorError::CheckedMathErrorG)? + .ok_or(MerkleRootGeneratorError::CheckedMathError)? .checked_div(total_delegated) - .ok_or(MerkleRootGeneratorError::CheckedMathErrorH)?, + .ok_or(MerkleRootGeneratorError::CheckedMathError)?, ) - .map_err(|_| MerkleRootGeneratorError::CheckedMathErrorI)?; + .map_err(|_| MerkleRootGeneratorError::CheckedMathError)?; let (claim_status_pubkey, claim_status_bump) = Pubkey::find_program_address( &[ diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index 39f743be..4efaf09a 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -3,7 +3,7 @@ use std::{ sync::{atomic::AtomicBool, Arc}, }; -use log::info; +use log::{info, warn}; use solana_accounts_db::hardened_unpack::{open_genesis_config, MAX_GENESIS_ARCHIVE_UNPACKED_SIZE}; use solana_ledger::{ bank_forks_utils::{self}, @@ -72,17 +72,13 @@ pub fn get_bank_from_ledger( } }; - let slots_to_check = [ - 312564097, 312582120, 312600208, 312618282, 312636395, 312654446, 312672572, 312690682, - 312708741, 312726810, - ]; - - for slot in slots_to_check { - let slot_exists = blockstore.meta(slot).unwrap().is_some(); - info!("Slot {} in blockstore: {}", slot, slot_exists); - } - - let desired_slot_in_blockstore = blockstore.meta(*desired_slot).unwrap().is_some(); + let desired_slot_in_blockstore = match blockstore.meta(*desired_slot) { + Ok(meta) => meta.is_some(), + Err(err) => { + warn!("Failed to get meta for slot {}: {:?}", desired_slot, err); + false + } + }; info!( "Desired slot {} in blockstore: {}", desired_slot, desired_slot_in_blockstore diff --git a/tip-router-operator-cli/src/stake_meta_generator.rs b/tip-router-operator-cli/src/stake_meta_generator.rs index 8fc7bec7..e082ca52 100644 --- a/tip-router-operator-cli/src/stake_meta_generator.rs +++ b/tip-router-operator-cli/src/stake_meta_generator.rs @@ -83,11 +83,6 @@ pub fn generate_stake_meta( snapshots_enabled: bool, ) -> Result { info!("Creating bank from ledger path..."); - info!("ledger_path: {}", ledger_path.display()); - info!("account_paths: {:?}", account_paths); - info!("full_snapshots_path: {}", full_snapshots_path.display()); - info!("desired_slot: {}", desired_slot); - info!("snapshots_enabled: {}", snapshots_enabled); let bank = get_bank_from_ledger( ledger_path, account_paths, From 1d0cd74cee875c3d641708dc0728160be463e96a Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Tue, 14 Jan 2025 13:14:22 -0500 Subject: [PATCH 015/112] more cleanup --- .dockerignore | 4 ++ Cargo.toml | 1 + Dockerfile | 48 +++++++++++++++++++ docker-compose.yaml | 32 +++++++++++++ meta_merkle_tree/src/generated_merkle_tree.rs | 21 +++----- tip-router-operator-cli/Cargo.toml | 2 +- tip-router-operator-cli/src/ledger_utils.rs | 8 ---- tip-router-operator-cli/src/main.rs | 15 +++++- 8 files changed, 106 insertions(+), 25 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker-compose.yaml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..4debc425 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +target/ +node_modules/ +clients/js/ +.git/ diff --git a/Cargo.toml b/Cargo.toml index a1fa2c98..51ad315f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -61,6 +61,7 @@ serde-big-array = "0.5.1" shank = "0.4.2" shank_idl = "0.4.2" spl-math = { version = "0.2.0", features = ["no-entrypoint"] } +spl-memo = "4.0.0" solana-account-decoder = { package = "solana-account-decoder", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-metrics = { package = "solana-metrics", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-accounts-db = { package = "solana-accounts-db", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..7802091c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,48 @@ +# Dockerfile +FROM rust:1.75-slim-buster as builder + +# Install dependencies +RUN apt-get update && apt-get install -y \ + libudev-dev \ + clang \ + pkg-config \ + libssl-dev \ + build-essential \ + llvm-dev \ + libclang-dev \ + cmake \ + protobuf-compiler +RUN update-ca-certificates + +# Set up build directory +WORKDIR /usr/src/app +COPY . . + +# Build with cache mounting for faster builds +RUN --mount=type=cache,mode=0777,target=/usr/src/app/target \ + --mount=type=cache,mode=0777,target=/usr/local/cargo/registry \ + cargo build --release --bin tip-router-operator-cli + +# Production image +FROM debian:buster-slim + +# Install necessary runtime dependencies +RUN apt-get update && apt-get install -y \ + ca-certificates \ + libssl1.1 \ + && rm -rf /var/lib/apt/lists/* + +# Create necessary directories +RUN mkdir -p /solana/ledger /solana/snapshots /solana/snapshots/autosnapshot + +# Copy binary from builder +COPY --from=builder /usr/src/app/target/release/tip-router-operator-cli /usr/local/bin/ + +# Set up environment +ENV RUST_LOG=info + +# Set file descriptor limits +RUN ulimit -n 2000000 + +# Command will be provided by docker-compose +ENTRYPOINT ["tip-router-operator-cli"] \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 00000000..d4313691 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,32 @@ +# docker-compose.yaml +version: '3.8' + +services: + tip-router: + build: . + container_name: tip-router-operator + env_file: + - .env + environment: + - KEYPAIR_PATH=/etc/solana/keypair.json + - OPERATOR_ADDRESS=${OPERATOR_ADDRESS} + - RPC_URL=${RPC_URL} + - LEDGER_PATH=/solana/ledger + - ACCOUNT_PATHS=/solana/accounts + - FULL_SNAPSHOTS_PATH=/solana/snapshots + - SNAPSHOT_OUTPUT_DIR=/solana/snapshots/autosnapshot + - NCN_ADDRESS=${NCN_ADDRESS} + - TIP_DISTRIBUTION_PROGRAM_ID=${TIP_DISTRIBUTION_PROGRAM_ID} + - TIP_PAYMENT_PROGRAM_ID=${TIP_PAYMENT_PROGRAM_ID} + - ENABLE_SNAPSHOTS=false + volumes: + - /etc/solana/mev-upload-keypair.json:/etc/solana/keypair.json:ro # Replace this path with the path to the keypair + - /solana/ledger:/solana/ledger + - /solana/snapshots:/solana/snapshots + - /solana/snapshots/autosnapshot:/solana/snapshots/autosnapshot + command: ["run"] + ulimits: + nofile: + soft: 2000000 + hard: 2000000 + restart: unless-stopped diff --git a/meta_merkle_tree/src/generated_merkle_tree.rs b/meta_merkle_tree/src/generated_merkle_tree.rs index 94d72c9b..abe9d12d 100644 --- a/meta_merkle_tree/src/generated_merkle_tree.rs +++ b/meta_merkle_tree/src/generated_merkle_tree.rs @@ -73,10 +73,7 @@ impl GeneratedMerkleTreeCollection { epoch, &stake_meta_collection.tip_distribution_program_id, // Pass the program ID ) { - Err(e) => { - info!("Error creating tree nodes: {:?}", e); - return Some(Err(e)); - } + Err(e) => return Some(Err(e)), Ok(maybe_tree_nodes) => maybe_tree_nodes, }?; @@ -103,11 +100,7 @@ impl GeneratedMerkleTreeCollection { max_total_claim: tip_distribution_meta.total_tips, })) }) - .collect::, MerkleRootGeneratorError>>() - .map_err(|e| { - info!("Error collecting generated merkle trees: {:?}", e); - e - })?; + .collect::, MerkleRootGeneratorError>>()?; Ok(Self { generated_merkle_trees, @@ -153,14 +146,14 @@ impl TreeNode { tip_distribution_program_id: &Pubkey, ) -> Result>, MerkleRootGeneratorError> { if let Some(tip_distribution_meta) = stake_meta.maybe_tip_distribution_meta.as_ref() { - let protocol_fee_amount = u64::try_from( + let protocol_fee_amount = u128::div_ceil( (tip_distribution_meta.total_tips as u128) .checked_mul(protocol_fee_bps as u128) - .ok_or(MerkleRootGeneratorError::CheckedMathError)? - .checked_div(MAX_BPS as u128) .ok_or(MerkleRootGeneratorError::CheckedMathError)?, - ) - .map_err(|_| MerkleRootGeneratorError::CheckedMathError)?; + MAX_BPS as u128, + ); + let protocol_fee_amount = u64::try_from(protocol_fee_amount) + .map_err(|_| MerkleRootGeneratorError::CheckedMathError)?; let validator_amount = u64::try_from( (tip_distribution_meta.total_tips as u128) diff --git a/tip-router-operator-cli/Cargo.toml b/tip-router-operator-cli/Cargo.toml index ebf268fb..afd460b6 100644 --- a/tip-router-operator-cli/Cargo.toml +++ b/tip-router-operator-cli/Cargo.toml @@ -35,7 +35,7 @@ solana-runtime = { workspace = true } solana-sdk = { workspace = true } solana-stake-program = { workspace = true } solana-vote = { workspace = true } -spl-memo = "4.0.0" +spl-memo = { workspace = true } thiserror = { workspace = true } tokio = { workspace = true } diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index 4efaf09a..07678713 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -111,14 +111,6 @@ pub fn get_bank_from_ledger( false, ) .unwrap(); - info!( - "Bank forks highest slot: {:?}", - bank_forks.read().unwrap().highest_slot() - ); - info!( - "Bank forks working bank slot: {:?}", - bank_forks.read().unwrap().working_bank().slot() - ); blockstore_processor::process_blockstore_from_root( &blockstore, diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index a03ede18..585791ef 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -1,10 +1,14 @@ use ::{ anyhow::Result, clap::Parser, - ellipsis_client::EllipsisClient, + ellipsis_client::{ClientSubset, EllipsisClient}, log::{error, info}, solana_rpc_client::rpc_client::RpcClient, - solana_sdk::{clock::DEFAULT_SLOTS_PER_EPOCH, signer::keypair::read_keypair_file}, + solana_sdk::{ + clock::DEFAULT_SLOTS_PER_EPOCH, + signer::{keypair::read_keypair_file, Signer}, + transaction::Transaction, + }, tip_router_operator_cli::{ cli::{Cli, Commands}, process_epoch::{get_previous_epoch_last_slot, process_epoch, wait_for_next_epoch}, @@ -21,6 +25,13 @@ async fn main() -> Result<()> { &read_keypair_file(&cli.keypair_path).expect("Failed to read keypair file"), )?; + let test_meta_merkle_root = [1; 32]; + let ix = spl_memo::build_memo(&test_meta_merkle_root.to_vec(), &[&keypair.pubkey()]); + info!("Submitting test memo {:?}", test_meta_merkle_root); + + let tx = Transaction::new_with_payer(&[ix], Some(&keypair.pubkey())); + rpc_client.process_transaction(tx, &[&keypair]).await?; + info!( "CLI Arguments: keypair_path: {} From e633aef10d619c34e72903114981b372a338e467 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Tue, 14 Jan 2025 14:59:25 -0500 Subject: [PATCH 016/112] docker --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 7802091c..c868f51d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,7 +21,7 @@ COPY . . # Build with cache mounting for faster builds RUN --mount=type=cache,mode=0777,target=/usr/src/app/target \ --mount=type=cache,mode=0777,target=/usr/local/cargo/registry \ - cargo build --release --bin tip-router-operator-cli + cargo build --release --package tip-router-operator-cli # Production image FROM debian:buster-slim From 9831f17993adbfe8720268168d80475f42842031 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Tue, 14 Jan 2025 15:30:28 -0500 Subject: [PATCH 017/112] ..... --- Dockerfile | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index c868f51d..8781e72f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Dockerfile -FROM rust:1.75-slim-buster as builder +FROM rust:1.75-slim-buster AS builder # Install dependencies RUN apt-get update && apt-get install -y \ @@ -11,17 +11,27 @@ RUN apt-get update && apt-get install -y \ llvm-dev \ libclang-dev \ cmake \ - protobuf-compiler + protobuf-compiler \ + git RUN update-ca-certificates # Set up build directory WORKDIR /usr/src/app COPY . . +RUN echo "Contents of /usr/src/app:" && \ + ls -la && \ + echo "Cargo workspace info:" && \ + cargo metadata --format-version=1 || true + # Build with cache mounting for faster builds RUN --mount=type=cache,mode=0777,target=/usr/src/app/target \ --mount=type=cache,mode=0777,target=/usr/local/cargo/registry \ - cargo build --release --package tip-router-operator-cli + echo "Starting cargo build..." && \ + cargo build --release --bin tip-router-operator-cli -vv && \ + echo "Build completed, checking results:" && \ + find /usr/src/app/target -type f -name "tip-router-operator-cli*" && \ + ls -la /usr/src/app/target/release/ || true # Production image FROM debian:buster-slim From 06a9fee9e16ed9cc66b13af568144433d1e887b6 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Thu, 16 Jan 2025 17:42:02 -0500 Subject: [PATCH 018/112] Nits --- docker-compose.yaml | 7 ++----- tip-router-operator-cli/src/tip_router.rs | 8 +++----- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index d4313691..ab15a6a5 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,6 +1,3 @@ -# docker-compose.yaml -version: '3.8' - services: tip-router: build: . @@ -19,8 +16,8 @@ services: - TIP_DISTRIBUTION_PROGRAM_ID=${TIP_DISTRIBUTION_PROGRAM_ID} - TIP_PAYMENT_PROGRAM_ID=${TIP_PAYMENT_PROGRAM_ID} - ENABLE_SNAPSHOTS=false - volumes: - - /etc/solana/mev-upload-keypair.json:/etc/solana/keypair.json:ro # Replace this path with the path to the keypair + volumes: # Replace the paths before the ":" with the path to your keypair and relevant directories + - /etc/solana/keypair.json:/etc/solana/keypair.json:ro - /solana/ledger:/solana/ledger - /solana/snapshots:/solana/snapshots - /solana/snapshots/autosnapshot:/solana/snapshots/autosnapshot diff --git a/tip-router-operator-cli/src/tip_router.rs b/tip-router-operator-cli/src/tip_router.rs index d52ff173..e98f557e 100644 --- a/tip-router-operator-cli/src/tip_router.rs +++ b/tip-router-operator-cli/src/tip_router.rs @@ -25,7 +25,7 @@ pub async fn get_ncn_config(client: &EllipsisClient, ncn_pubkey: &Pubkey) -> Res /// Generate and send a CastVote instruction with the merkle root. pub async fn cast_vote( client: &EllipsisClient, - payer: &Keypair, + _payer: &Keypair, ncn: Pubkey, operator: Pubkey, operator_admin: &Keypair, @@ -64,8 +64,6 @@ pub async fn cast_vote( let ix = spl_memo::build_memo(&meta_merkle_root.to_vec(), &[&operator_admin.pubkey()]); info!("Submitting meta merkle root {:?}", meta_merkle_root); - let tx = Transaction::new_with_payer(&[ix], Some(&payer.pubkey())); - client - .process_transaction(tx, &[payer, operator_admin]) - .await + let tx = Transaction::new_with_payer(&[ix], Some(&operator_admin.pubkey())); + client.process_transaction(tx, &[operator_admin]).await } From 181bb6b973ec65aec054d74d490824040502bf36 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Fri, 17 Jan 2025 17:46:45 -0500 Subject: [PATCH 019/112] Update instruction --- tip-router-operator-cli/src/tip_router.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tip-router-operator-cli/src/tip_router.rs b/tip-router-operator-cli/src/tip_router.rs index b59cdf70..c6858eb6 100644 --- a/tip-router-operator-cli/src/tip_router.rs +++ b/tip-router-operator-cli/src/tip_router.rs @@ -6,6 +6,7 @@ use jito_tip_router_core::{ ballot_box::BallotBox, config::Config, epoch_snapshot::{EpochSnapshot, OperatorSnapshot}, + epoch_state::EpochState, }; use log::info; use solana_sdk::{ @@ -32,6 +33,9 @@ pub async fn cast_vote( meta_merkle_root: [u8; 32], epoch: u64, ) -> EllipsisClientResult { + let epoch_state = + EpochState::find_program_address(&jito_tip_router_program::id(), &ncn, epoch).0; + let ncn_config = Config::find_program_address(&jito_tip_router_program::id(), &ncn).0; let ballot_box = BallotBox::find_program_address(&jito_tip_router_program::id(), &ncn, epoch).0; @@ -48,6 +52,7 @@ pub async fn cast_vote( .0; let _ix = CastVoteBuilder::new() + .epoch_state(epoch_state) .config(ncn_config) .ballot_box(ballot_box) .ncn(ncn) From b0b0c075efb071f9f0a198e9cf59f5f92431cb06 Mon Sep 17 00:00:00 2001 From: Evan B Date: Tue, 21 Jan 2025 20:19:42 -0500 Subject: [PATCH 020/112] [draft] Operator Improvements (#65) --- .gitignore | 2 + Cargo.lock | 1 + core/src/ballot_box.rs | 4 + meta_merkle_tree/src/generated_merkle_tree.rs | 1 - telegraf/telegraf.conf | 220 +++++++++++ tip-router-operator-cli/Cargo.toml | 1 + .../src/backup_snapshots.rs | 365 ++++++++++++++++++ tip-router-operator-cli/src/cli.rs | 38 +- tip-router-operator-cli/src/ledger_utils.rs | 190 ++++++++- tip-router-operator-cli/src/lib.rs | 47 +++ tip-router-operator-cli/src/main.rs | 128 +++++- tip-router-operator-cli/src/process_epoch.rs | 126 +++--- .../src/stake_meta_generator.rs | 38 +- tip-router-operator-cli/src/submit.rs | 260 +++++++++++++ tip-router-operator-cli/src/tip_router.rs | 114 +++++- .../tests/integration_tests.rs | 5 +- 16 files changed, 1422 insertions(+), 118 deletions(-) create mode 100644 telegraf/telegraf.conf create mode 100644 tip-router-operator-cli/src/backup_snapshots.rs create mode 100644 tip-router-operator-cli/src/submit.rs diff --git a/.gitignore b/.gitignore index 1fdf60ea..8b2993ea 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ /target .developer +.env +.cursorrules node_modules test-ledger tip-router-operator-cli/scripts/test-validator-keys diff --git a/Cargo.lock b/Cargo.lock index 9b601bab..2667e172 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8876,6 +8876,7 @@ dependencies = [ "meta-merkle-tree", "serde", "serde_json", + "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-ledger", diff --git a/core/src/ballot_box.rs b/core/src/ballot_box.rs index 2f93ec4d..9958d2f7 100644 --- a/core/src/ballot_box.rs +++ b/core/src/ballot_box.rs @@ -395,6 +395,10 @@ impl BallotBox { &self.operator_votes } + pub fn ballot_tallies(&self) -> &[BallotTally; 256] { + &self.ballot_tallies + } + pub fn set_winning_ballot(&mut self, ballot: &Ballot) { self.winning_ballot = *ballot; } diff --git a/meta_merkle_tree/src/generated_merkle_tree.rs b/meta_merkle_tree/src/generated_merkle_tree.rs index abe9d12d..00a05499 100644 --- a/meta_merkle_tree/src/generated_merkle_tree.rs +++ b/meta_merkle_tree/src/generated_merkle_tree.rs @@ -4,7 +4,6 @@ use jito_tip_distribution_sdk::{ jito_tip_distribution::ID as TIP_DISTRIBUTION_ID, CLAIM_STATUS_SEED, }; use jito_vault_core::MAX_BPS; -use log::info; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use solana_program::{ clock::{Epoch, Slot}, diff --git a/telegraf/telegraf.conf b/telegraf/telegraf.conf new file mode 100644 index 00000000..3e6f8ce7 --- /dev/null +++ b/telegraf/telegraf.conf @@ -0,0 +1,220 @@ +# Telegraf Configuration +# Original template generated with `telegraf config` +# +# Telegraf is entirely plugin driven. All metrics are gathered from the +# declared inputs, and sent to the declared outputs. +# +# Plugins must be declared in here to be active. +# To deactivate a plugin, comment out the name and any variables. +# +# Use 'telegraf -config telegraf.conf -test' to see what metrics a config +# file would generate. +# +# Environment variables can be used anywhere in this config file, simply surround +# them with ${}. For strings the variable must be within quotes (ie, "${STR_VAR}"), +# for numbers and booleans they should be plain (ie, ${INT_VAR}, ${BOOL_VAR}) + + +# Global tags can be specified here in key="value" format. +[global_tags] + # dc = "us-east-1" # will tag all metrics with dc=us-east-1 + # rack = "1a" + ## Environment variables can be used as tags, and throughout the config file + # user = "$USER" + +# Configuration for telegraf agent +[agent] + ## Default data collection interval for all inputs + interval = "10s" + ## Rounds collection interval to 'interval' + ## ie, if interval="10s" then always collect on :00, :10, :20, etc. + round_interval = true + + ## Telegraf will send metrics to outputs in batches of at most + ## metric_batch_size metrics. + ## This controls the size of writes that Telegraf sends to output plugins. + metric_batch_size = 1000 + + ## Maximum number of unwritten metrics per output. Increasing this value + ## allows for longer periods of output downtime without dropping metrics at the + ## cost of higher maximum memory usage. + metric_buffer_limit = 10000 + + ## Collection jitter is used to jitter the collection by a random amount. + ## Each plugin will sleep for a random time within jitter before collecting. + ## This can be used to avoid many plugins querying things like sysfs at the + ## same time, which can have a measurable effect on the system. + collection_jitter = "0s" + + ## Collection offset is used to shift the collection by the given amount. + ## This can be be used to avoid many plugins querying constraint devices + ## at the same time by manually scheduling them in time. + # collection_offset = "0s" + + ## Default flushing interval for all outputs. Maximum flush_interval will be + ## flush_interval + flush_jitter + flush_interval = "10s" + ## Jitter the flush interval by a random amount. This is primarily to avoid + ## large write spikes for users running a large number of telegraf instances. + ## ie, a jitter of 5s and interval 10s means flushes will happen every 10-15s + flush_jitter = "0s" + + ## Collected metrics are rounded to the precision specified. Precision is + ## specified as an interval with an integer + unit (e.g. 0s, 10ms, 2us, 4s). + ## Valid time units are "ns", "us" (or "µs"), "ms", "s". + ## + ## By default or when set to "0s", precision will be set to the same + ## timestamp order as the collection interval, with the maximum being 1s: + ## ie, when interval = "10s", precision will be "1s" + ## when interval = "250ms", precision will be "1ms" + ## + ## Precision will NOT be used for service inputs. It is up to each individual + ## service input to set the timestamp at the appropriate precision. + precision = "0s" + + ## Log at debug level. + # debug = false + ## Log only error level messages. + # quiet = false + + ## Log format controls the way messages are logged and can be one of "text", + ## "structured" or, on Windows, "eventlog". + # logformat = "text" + + ## Message key for structured logs, to override the default of "msg". + ## Ignored if `logformat` is not "structured". + # structured_log_message_key = "message" + + ## Name of the file to be logged to or stderr if unset or empty. This + ## setting is ignored for the "eventlog" format. + # logfile = "" + + ## The logfile will be rotated after the time interval specified. When set + ## to 0 no time based rotation is performed. Logs are rotated only when + ## written to, if there is no log activity rotation may be delayed. + # logfile_rotation_interval = "0h" + + ## The logfile will be rotated when it becomes larger than the specified + ## size. When set to 0 no size based rotation is performed. + # logfile_rotation_max_size = "0MB" + + ## Maximum number of rotated archives to keep, any older logs are deleted. + ## If set to -1, no archives are removed. + # logfile_rotation_max_archives = 5 + + ## Pick a timezone to use when logging or type 'local' for local time. + ## Example: America/Chicago + # log_with_timezone = "" + + ########################################################## + # TIP ROUTER OPERATORS: USE OPERATOR ADDRESS AS HOSTNAME # + ########################################################## + hostname = "" + + ## If set to true, do no set the "host" tag in the telegraf agent. + # omit_hostname = false + + ## Method of translating SNMP objects. Can be "netsnmp" (deprecated) which + ## translates by calling external programs snmptranslate and snmptable, + ## or "gosmi" which translates using the built-in gosmi library. + # snmp_translator = "netsnmp" + + ## Name of the file to load the state of plugins from and store the state to. + ## If uncommented and not empty, this file will be used to save the state of + ## stateful plugins on termination of Telegraf. If the file exists on start, + ## the state in the file will be restored for the plugins. + # statefile = "" + + ## Flag to skip running processors after aggregators + ## By default, processors are run a second time after aggregators. Changing + ## this setting to true will skip the second run of processors. + # skip_processors_after_aggregators = false + +############################################################################### +# OUTPUT PLUGINS # +############################################################################### + + +# # Configuration for sending metrics to InfluxDB 2.0 +[[outputs.influxdb_v2]] +# ## The URLs of the InfluxDB cluster nodes. +# ## +# ## Multiple URLs can be specified for a single cluster, only ONE of the +# ## urls will be written to each interval. +# ## ex: urls = ["https://us-west-2-1.aws.cloud2.influxdata.com"] + urls = ["http://tip-router.metrics.jito.wtf:8086"] +# +# ## Local address to bind when connecting to the server +# ## If empty or not set, the local address is automatically chosen. +# # local_address = "" +# + ########################################### + # TIP ROUTER OPERATORS: UPDATE THIS TOKEN # + ########################################### + ## Token for authentication. + token = "" + + ## Organization is the name of the organization you wish to write to. + organization = "jito" + + ## Destination bucket to write into. + bucket = "operator-bare-metal" +# +# ## The value of this tag will be used to determine the bucket. If this +# ## tag is not set the 'bucket' option is used as the default. +# # bucket_tag = "" +# +# ## If true, the bucket tag will not be added to the metric. +# # exclude_bucket_tag = false +# +# ## Timeout for HTTP messages. +# # timeout = "5s" +# +# ## Additional HTTP headers +# # http_headers = {"X-Special-Header" = "Special-Value"} +# +# ## HTTP Proxy override, if unset values the standard proxy environment +# ## variables are consulted to determine which proxy, if any, should be used. +# # http_proxy = "http://corporate.proxy:3128" +# +# ## HTTP User-Agent +# # user_agent = "telegraf" +# +# ## Content-Encoding for write request body, can be set to "gzip" to +# ## compress body or "identity" to apply no encoding. +# # content_encoding = "gzip" +# +# ## Enable or disable uint support for writing uints influxdb 2.0. +# # influx_uint_support = false +# +# ## When true, Telegraf will omit the timestamp on data to allow InfluxDB +# ## to set the timestamp of the data during ingestion. This is generally NOT +# ## what you want as it can lead to data points captured at different times +# ## getting omitted due to similar data. +# # influx_omit_timestamp = false +# +# ## HTTP/2 Timeouts +# ## The following values control the HTTP/2 client's timeouts. These settings +# ## are generally not required unless a user is seeing issues with client +# ## disconnects. If a user does see issues, then it is suggested to set these +# ## values to "15s" for ping timeout and "30s" for read idle timeout and +# ## retry. +# ## +# ## Note that the timer for read_idle_timeout begins at the end of the last +# ## successful write and not at the beginning of the next write. +# # ping_timeout = "0s" +# # read_idle_timeout = "0s" +# +# ## Optional TLS Config for use on HTTP connections. +# # tls_ca = "/etc/telegraf/ca.pem" +# # tls_cert = "/etc/telegraf/cert.pem" +# # tls_key = "/etc/telegraf/key.pem" +# ## Use TLS but skip chain & host verification +# # insecure_skip_verify = false +# +# ## Rate limits for sending data (disabled by default) +# ## Available, uncompressed payload size e.g. "5Mb" +# # rate_limit = "unlimited" +# ## Fixed time-window for the available payload size e.g. "5m" +# # rate_limit_period = "0s" + diff --git a/tip-router-operator-cli/Cargo.toml b/tip-router-operator-cli/Cargo.toml index afd460b6..664ffd9e 100644 --- a/tip-router-operator-cli/Cargo.toml +++ b/tip-router-operator-cli/Cargo.toml @@ -25,6 +25,7 @@ log = { workspace = true } meta-merkle-tree = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } +solana-account-decoder = { workspace = true } solana-accounts-db = { workspace = true } solana-client = { workspace = true } solana-ledger = { workspace = true } diff --git a/tip-router-operator-cli/src/backup_snapshots.rs b/tip-router-operator-cli/src/backup_snapshots.rs new file mode 100644 index 00000000..a4c481fb --- /dev/null +++ b/tip-router-operator-cli/src/backup_snapshots.rs @@ -0,0 +1,365 @@ +use anyhow::{Context, Result}; +use solana_client::rpc_client::RpcClient; +use solana_sdk::clock::DEFAULT_SLOTS_PER_EPOCH; +use std::path::{Path, PathBuf}; +use std::time::Duration; +use tokio::time; + +use crate::process_epoch::get_previous_epoch_last_slot; + +/// Represents a parsed incremental snapshot filename +#[derive(Debug)] +struct SnapshotInfo { + path: PathBuf, + _start_slot: u64, + end_slot: u64, +} + +impl SnapshotInfo { + /// Try to parse a snapshot filename into slot information + fn from_path(path: PathBuf) -> Option { + let file_name = path.file_name()?.to_str()?; + + // Only try to parse if it's an incremental snapshot + if !file_name.starts_with("incremental-snapshot-") { + return None; + } + + // Split on hyphens and take the slot numbers + // Format: incremental-snapshot---.tar.zst + let parts: Vec<&str> = file_name.split('-').collect(); + if parts.len() < 5 { + return None; + } + + // Parse start and end slots + let start_slot = parts[2].parse().ok()?; + let end_slot = parts[3].parse().ok()?; + + Some(SnapshotInfo { + path, + _start_slot: start_slot, + end_slot, + }) + } +} + +pub struct BackupSnapshotMonitor { + rpc_client: RpcClient, + snapshots_dir: PathBuf, + backup_dir: PathBuf, + override_target_slot: Option, +} + +impl BackupSnapshotMonitor { + pub fn new( + rpc_url: &str, + snapshots_dir: PathBuf, + backup_dir: PathBuf, + override_target_slot: Option, + ) -> Self { + Self { + rpc_client: RpcClient::new(rpc_url.to_string()), + snapshots_dir, + backup_dir, + override_target_slot, + } + } + + /// Gets target slot for current epoch + fn get_target_slot(&self) -> Result { + if let Some(target_slot) = self.override_target_slot { + return Ok(target_slot); + } + + // Get the last slot of the current epoch + let (_, last_slot) = get_previous_epoch_last_slot(&self.rpc_client)?; + Ok(last_slot + DEFAULT_SLOTS_PER_EPOCH) + } + + /// Finds the most recent incremental snapshot that's before our target slot + fn find_closest_incremental(&self, target_slot: u64) -> Option { + let dir_entries = std::fs::read_dir(&self.snapshots_dir).ok()?; + + // Find the snapshot that ends closest to but not after target_slot + dir_entries + .filter_map(Result::ok) + .filter_map(|entry| SnapshotInfo::from_path(entry.path())) + .filter(|snap| snap.end_slot <= target_slot) + .max_by_key(|snap| snap.end_slot) + .map(|snap| snap.path) + } + + /// Copies incremental snapshot files to backup directory + async fn backup_incremental_snapshot(&self, snapshot_path: &Path) -> Result<()> { + let file_name = snapshot_path + .file_name() + .context("Failed to get incremental snapshot filename")?; + + let dest_path = self.backup_dir.join(file_name); + + // Check if file already exists in backup + if dest_path.exists() { + log::info!( + "Incremental snapshot already exists in backup dir: {:?}", + dest_path + ); + return Ok(()); + } + + log::info!( + "Copying incremental snapshot from {:?} to {:?}", + snapshot_path, + dest_path + ); + + // Copy the file + std::fs::copy(snapshot_path, &dest_path).with_context(|| { + format!( + "Failed to copy incremental snapshot from {:?} to {:?}", + snapshot_path, dest_path + ) + })?; + + // Verify file size matches + let source_size = std::fs::metadata(snapshot_path)?.len(); + let dest_size = std::fs::metadata(&dest_path)?.len(); + + if source_size != dest_size { + // If sizes don't match, remove the corrupted copy and error + let _ = std::fs::remove_file(&dest_path); + anyhow::bail!( + "Backup size mismatch: source {}, dest {}", + source_size, + dest_size + ); + } + + log::info!( + "Successfully backed up incremental snapshot ({} bytes)", + source_size + ); + + Ok(()) + } + + fn evict_same_epoch_incremental(&self, target_slot: u64) -> Result<()> { + let slots_per_epoch = DEFAULT_SLOTS_PER_EPOCH; + let target_epoch = target_slot / slots_per_epoch; + + let dir_entries = std::fs::read_dir(&self.snapshots_dir)?; + + // Find the snapshot that ends closest to but not after target_slot + let mut same_epoch_snapshots: Vec = dir_entries + .filter_map(Result::ok) + .filter_map(|entry| SnapshotInfo::from_path(entry.path())) + .filter(|snap| snap.end_slot / slots_per_epoch == target_epoch) + .collect(); + + // Sort by end_slot ascending so we can remove oldest + same_epoch_snapshots.sort_by_key(|snap| snap.end_slot); + + // Remove oldest snapshot + if let Some(oldest_snapshot) = same_epoch_snapshots.first() { + log::info!( + "Removing old snapshot from epoch {} with slot {}: {:?}", + target_epoch, + oldest_snapshot.end_slot, + oldest_snapshot.path + ); + std::fs::remove_file(oldest_snapshot.path.as_path())?; + } + + Ok(()) + } + + pub async fn run(&self) -> Result<()> { + let mut interval = time::interval(Duration::from_secs(10)); + let mut last_target_slot = None; + let mut last_backup_path = None; + + loop { + interval.tick().await; + + let target_slot = self.get_target_slot()?; + + // Only search for new snapshot if target slot has changed + if last_target_slot != Some(target_slot) { + log::info!("New target slot: {}", target_slot); + } + + if let Some(snapshot) = self.find_closest_incremental(target_slot) { + if last_backup_path.as_ref() != Some(&snapshot) { + log::info!( + "Found new best snapshot for slot {}: {:?}", + target_slot, + snapshot + ); + + if let Err(e) = self.backup_incremental_snapshot(&snapshot).await { + log::error!("Failed to backup snapshot: {}", e); + continue; + } + + last_backup_path = Some(snapshot); + + // After saving best snapshot, evict oldest one from same epoch + if let Err(e) = self.evict_same_epoch_incremental(target_slot) { + log::error!("Failed to evict old snapshots: {}", e); + } + } + } + + last_target_slot = Some(target_slot); + } + } +} + +#[cfg(test)] +mod tests { + use std::fs::File; + + use super::*; + use std::io::Write; + use tempfile::TempDir; + use tokio; + + #[tokio::test] + async fn test_snapshot_monitoring() { + let temp_dir = TempDir::new().unwrap(); + let backup_dir = TempDir::new().unwrap(); + + let monitor = BackupSnapshotMonitor::new( + "http://localhost:8899", + temp_dir.path().to_path_buf(), + backup_dir.path().to_path_buf(), + None, + ); + + // The test version will use the fixed slot from cfg(test) get_target_slot + // TODO: Add test cases + // 1. Create test snapshots + // 2. Verify correct snapshot selection + // 3. Test backup functionality + } + + #[test] + fn test_snapshot_info_parsing() { + let temp_dir = TempDir::new().unwrap(); + let path = temp_dir + .path() + .join("incremental-snapshot-100-150-hash1.tar.zst"); + + let info = SnapshotInfo::from_path(path.clone()).unwrap(); + assert_eq!(info.start_slot, 100); + assert_eq!(info.end_slot, 150); + assert_eq!(info.path, path); + + // Test invalid cases + assert!(SnapshotInfo::from_path(temp_dir.path().join("not-a-snapshot.txt")).is_none()); + assert!( + SnapshotInfo::from_path(temp_dir.path().join("snapshot-100-150-hash.tar.zst")) + .is_none() + ); + } + + #[test] + fn test_find_closest_incremental() { + let temp_dir = TempDir::new().unwrap(); + let monitor = BackupSnapshotMonitor::new( + "http://localhost:8899", + temp_dir.path().to_path_buf(), + temp_dir.path().to_path_buf(), + None, + ); + + // Create test snapshot files + let snapshots = [ + "incremental-snapshot-100-150-hash1.tar.zst", + "incremental-snapshot-200-250-hash2.tar.zst", + "incremental-snapshot-300-350-hash3.tar.zst", + ]; + + for name in snapshots.iter() { + let path = temp_dir.path().join(name); + File::create(path).unwrap(); + } + + // Test finding closest snapshot + let result = monitor + .find_closest_incremental(200) + .map(|p| p.file_name().unwrap().to_str().unwrap().to_string()); + + assert_eq!( + result, + Some("incremental-snapshot-100-150-hash1.tar.zst".to_string()), + "Should find snapshot ending at 150 for target 200" + ); + + // Test no valid snapshot + assert_eq!( + monitor.find_closest_incremental(100), + None, + "Should find no snapshot for target 100" + ); + } + + #[tokio::test] + async fn test_backup_snapshot() { + let source_dir = TempDir::new().unwrap(); + let backup_dir = TempDir::new().unwrap(); + + let monitor = BackupSnapshotMonitor::new( + "http://localhost:8899", + source_dir.path().to_path_buf(), + backup_dir.path().to_path_buf(), + None, + ); + + // Create test snapshot with some content + let snapshot_name = "incremental-snapshot-100-150-hash1.tar.zst"; + let source_path = source_dir.path().join(snapshot_name); + let mut file = File::create(&source_path).unwrap(); + file.write_all(b"test snapshot content").unwrap(); + + // Test backup + monitor + .backup_incremental_snapshot(&source_path) + .await + .unwrap(); + + // Verify backup exists and has correct content + let backup_path = backup_dir.path().join(snapshot_name); + assert!(backup_path.exists()); + + let backup_content = std::fs::read_to_string(backup_path).unwrap(); + assert_eq!(backup_content, "test snapshot content"); + + // Test idempotency - should succeed without error + monitor + .backup_incremental_snapshot(&source_path) + .await + .unwrap(); + } + + #[tokio::test] + async fn test_backup_snapshot_missing_source() { + let source_dir = TempDir::new().unwrap(); + let backup_dir = TempDir::new().unwrap(); + + let monitor = BackupSnapshotMonitor::new( + "http://localhost:8899", + source_dir.path().to_path_buf(), + backup_dir.path().to_path_buf(), + None, + ); + + let missing_path = source_dir.path().join("nonexistent.tar.zst"); + + // Should error when source doesn't exist + assert!(monitor + .backup_incremental_snapshot(&missing_path) + .await + .is_err()); + } +} diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index 14f86aca..3bdb794e 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -3,7 +3,7 @@ use std::path::PathBuf; use clap::Parser; use solana_sdk::pubkey::Pubkey; -#[derive(Parser)] +#[derive(Clone, Parser)] #[command(author, version, about)] pub struct Cli { #[arg(short, long, env)] @@ -24,14 +24,20 @@ pub struct Cli { #[arg(short, long, env)] pub full_snapshots_path: Option, + #[arg(short, long, env)] + pub backup_snapshots_dir: PathBuf, + #[arg(short, long, env)] pub snapshot_output_dir: PathBuf, + #[arg(short, long, env)] + pub meta_merkle_tree_dir: PathBuf, + #[command(subcommand)] pub command: Commands, } -#[derive(clap::Subcommand)] +#[derive(clap::Subcommand, Clone)] pub enum Commands { Run { #[arg(short, long, env)] @@ -43,8 +49,20 @@ pub enum Commands { #[arg(long, env)] tip_payment_program_id: Pubkey, + #[arg(long, env)] + tip_router_program_id: Pubkey, + #[arg(long, env, default_value = "false")] enable_snapshots: bool, + + #[arg(long, env, default_value = "3")] + num_monitored_epochs: u64, + + #[arg(long, env, default_value = "false")] + start_next_epoch: bool, + + #[arg(long, env)] + override_target_slot: Option, }, SnapshotSlot { #[arg(short, long, env)] @@ -56,10 +74,26 @@ pub enum Commands { #[arg(long, env)] tip_payment_program_id: Pubkey, + #[arg(long, env)] + tip_router_program_id: Pubkey, + #[arg(long, env, default_value = "false")] enable_snapshots: bool, #[arg(long, env)] slot: u64, }, + SubmitEpoch { + #[arg(short, long, env)] + ncn_address: Pubkey, + + #[arg(long, env)] + tip_distribution_program_id: Pubkey, + + #[arg(long, env)] + tip_router_program_id: Pubkey, + + #[arg(long, env)] + epoch: u64, + }, } diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index 07678713..8341dafe 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -1,6 +1,7 @@ use std::{ path::{Path, PathBuf}, sync::{atomic::AtomicBool, Arc}, + time::Instant, }; use log::{info, warn}; @@ -11,24 +12,70 @@ use solana_ledger::{ blockstore_options::{AccessType, BlockstoreOptions}, blockstore_processor::{self, ProcessOptions}, }; +use solana_metrics::{datapoint_error, datapoint_info}; use solana_runtime::{ accounts_background_service::AbsRequestSender, bank::Bank, snapshot_archive_info::SnapshotArchiveInfoGetter, snapshot_bank_utils, snapshot_config::SnapshotConfig, snapshot_utils::SnapshotVersion, }; -use solana_sdk::clock::Slot; +use solana_sdk::{clock::Slot, pubkey::Pubkey}; // TODO: Use Result and propagate errors more gracefully /// Create the Bank for a desired slot for given file paths. pub fn get_bank_from_ledger( + operator_address: &Pubkey, ledger_path: &Path, account_paths: Vec, full_snapshots_path: PathBuf, + incremental_snapshots_path: PathBuf, desired_slot: &Slot, take_snapshot: bool, ) -> Arc { - let genesis_config = - open_genesis_config(ledger_path, MAX_GENESIS_ARCHIVE_UNPACKED_SIZE).unwrap(); + let start_time = Instant::now(); + + // Start validation + datapoint_info!( + "tip_router_cli.get_bank", + ("operator", operator_address.to_string(), String), + ("state", "validate_path_start", String), + ("step", 0, i64), + ); + + // STEP 1: Load genesis config // + + datapoint_info!( + "tip_router_cli.get_bank", + ("operator", operator_address.to_string(), String), + ("state", "load_genesis_start", String), + ("step", 1, i64), + ("duration_ms", start_time.elapsed().as_millis() as i64, i64), + ); + + let genesis_config = match open_genesis_config(ledger_path, MAX_GENESIS_ARCHIVE_UNPACKED_SIZE) { + Ok(genesis_config) => genesis_config, + Err(e) => { + datapoint_error!( + "tip_router_cli.get_bank", + ("operator", operator_address.to_string(), String), + ("status", "error", String), + ("state", "load_genesis", String), + ("step", 1, i64), + ("error", e.to_string(), String), + ); + panic!("Failed to load genesis config: {}", e); // TODO should panic here? + } + }; + + // STEP 2: Load blockstore // + + datapoint_info!( + "tip_router_cli.get_bank", + ("operator", operator_address.to_string(), String), + ("state", "load_blockstore_start", String), + ("step", 2, i64), + ("duration_ms", start_time.elapsed().as_millis() as i64, i64), + ); + let access_type = AccessType::Secondary; // Error handling is a modified copy pasta from ledger utils let blockstore = match Blockstore::open_with_options( @@ -53,22 +100,42 @@ pub fn get_bank_from_ledger( // if access type is Secondary let is_secondary = access_type == AccessType::Secondary; - if missing_blockstore && is_secondary { - panic!( + let error_str = if missing_blockstore && is_secondary { + format!( "Failed to open blockstore at {ledger_path:?}, it is missing at least one \ critical file: {err:?}" - ); + ) } else if missing_column && is_secondary { - panic!( + format!( "Failed to open blockstore at {ledger_path:?}, it does not have all necessary \ columns: {err:?}" - ); + ) } else { - panic!("Failed to open blockstore at {ledger_path:?}: {err:?}"); - } + format!("Failed to open blockstore at {ledger_path:?}: {err:?}") + }; + datapoint_error!( + "tip_router_cli.get_bank", + ("operator", operator_address.to_string(), String), + ("status", "error", String), + ("state", "load_blockstore", String), + ("step", 2, i64), + ("error", error_str, String), + ("duration_ms", start_time.elapsed().as_millis() as i64, i64), + ); + panic!("{}", error_str); } Err(err) => { - panic!("Failed to open blockstore at {ledger_path:?}: {err:?}"); + let error_str = format!("Failed to open blockstore at {ledger_path:?}: {err:?}"); + datapoint_error!( + "tip_router_cli.get_bank", + ("operator", operator_address.to_string(), String), + ("status", "error", String), + ("state", "load_blockstore", String), + ("step", 2, i64), + ("error", error_str, String), + ("duration_ms", start_time.elapsed().as_millis() as i64, i64), + ); + panic!("{}", error_str); } }; @@ -84,9 +151,19 @@ pub fn get_bank_from_ledger( desired_slot, desired_slot_in_blockstore ); + // STEP 3: Load bank forks // + + datapoint_info!( + "tip_router_cli.get_bank", + ("operator", operator_address.to_string(), String), + ("state", "load_snapshot_config_start", String), + ("step", 3, i64), + ("duration_ms", start_time.elapsed().as_millis() as i64, i64), + ); + let snapshot_config = SnapshotConfig { full_snapshot_archives_dir: full_snapshots_path.clone(), - incremental_snapshot_archives_dir: full_snapshots_path.clone(), + incremental_snapshot_archives_dir: incremental_snapshots_path.clone(), bank_snapshots_dir: full_snapshots_path, ..SnapshotConfig::new_load_only() }; @@ -97,7 +174,7 @@ pub fn get_bank_from_ledger( }; let exit = Arc::new(AtomicBool::new(false)); let (bank_forks, leader_schedule_cache, _starting_snapshot_hashes, ..) = - bank_forks_utils::load_bank_forks( + match bank_forks_utils::load_bank_forks( &genesis_config, &blockstore, account_paths, @@ -109,10 +186,33 @@ pub fn get_bank_from_ledger( None, exit, false, - ) - .unwrap(); + ) { + Ok(res) => res, + Err(e) => { + datapoint_error!( + "tip_router_cli.get_bank", + ("operator", operator_address.to_string(), String), + ("state", "load_bank_forks", String), + ("status", "error", String), + ("step", 4, i64), + ("error", e.to_string(), String), + ("duration_ms", start_time.elapsed().as_millis() as i64, i64), + ); + panic!("Failed to load bank forks: {}", e); + } + }; + + // STEP 4: Process blockstore from root // + + datapoint_info!( + "tip_router_cli.get_bank", + ("operator", operator_address.to_string(), String), + ("state", "process_blockstore_from_root_start", String), + ("step", 4, i64), + ("duration_ms", start_time.elapsed().as_millis() as i64, i64), + ); - blockstore_processor::process_blockstore_from_root( + match blockstore_processor::process_blockstore_from_root( &blockstore, &bank_forks, &leader_schedule_cache, @@ -121,13 +221,36 @@ pub fn get_bank_from_ledger( None, None, &AbsRequestSender::default(), - ) - .unwrap(); + ) { + Ok(()) => (), + Err(e) => { + datapoint_error!( + "tip_router_cli.get_bank", + ("operator", operator_address.to_string(), String), + ("status", "error", String), + ("state", "process_blockstore_from_root", String), + ("step", 5, i64), + ("error", e.to_string(), String), + ("duration_ms", start_time.elapsed().as_millis() as i64, i64), + ); + panic!("Failed to process blockstore from root: {}", e); + } + }; + + // STEP 5: Save snapshot // + + datapoint_info!( + "tip_router_cli.get_bank", + ("operator", operator_address.to_string(), String), + ("state", "bank_to_full_snapshot_archive_start", String), + ("step", 5, i64), + ("duration_ms", start_time.elapsed().as_millis() as i64, i64), + ); let working_bank = bank_forks.read().unwrap().working_bank(); if take_snapshot { - let full_snapshot_archive_info = snapshot_bank_utils::bank_to_full_snapshot_archive( + let full_snapshot_archive_info = match snapshot_bank_utils::bank_to_full_snapshot_archive( ledger_path, &working_bank, Some(SnapshotVersion::default()), @@ -136,8 +259,21 @@ pub fn get_bank_from_ledger( snapshot_config.archive_format, snapshot_config.maximum_full_snapshot_archives_to_retain, snapshot_config.maximum_incremental_snapshot_archives_to_retain, - ) - .unwrap(); + ) { + Ok(res) => res, + Err(e) => { + datapoint_error!( + "tip_router_cli.get_bank", + ("operator", operator_address.to_string(), String), + ("status", "error", String), + ("state", "bank_to_full_snapshot_archive", String), + ("step", 6, i64), + ("error", e.to_string(), String), + ("duration_ms", start_time.elapsed().as_millis() as i64, i64), + ); + panic!("Failed to create snapshot: {}", e); + } + }; info!( "Successfully created snapshot for slot {}, hash {}: {}", @@ -146,6 +282,7 @@ pub fn get_bank_from_ledger( full_snapshot_archive_info.path().display(), ); } + // STEP 6: Complete // assert_eq!( working_bank.slot(), @@ -154,6 +291,14 @@ pub fn get_bank_from_ledger( desired_slot, working_bank.slot() ); + + datapoint_info!( + "tip_router_cli.get_bank", + ("operator", operator_address.to_string(), String), + ("state", "get_bank_from_ledger_success", String), + ("step", 6, i64), + ("duration_ms", start_time.elapsed().as_millis() as i64, i64), + ); working_bank } @@ -163,14 +308,17 @@ mod tests { #[test] fn test_get_bank_from_ledger_success() { + let operator_address = Pubkey::new_unique(); let ledger_path = PathBuf::from("./tests/fixtures/test-ledger"); let account_paths = vec![ledger_path.join("accounts/run")]; let full_snapshots_path = ledger_path.clone(); let desired_slot = 144; let res = get_bank_from_ledger( + &operator_address, &ledger_path, account_paths, full_snapshots_path.clone(), + full_snapshots_path.clone(), &desired_slot, true, ); diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index cb06ecb3..bd98f2be 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -4,9 +4,12 @@ pub mod tip_router; pub use crate::cli::{Cli, Commands}; pub mod cli; pub use crate::process_epoch::process_epoch; +pub mod backup_snapshots; pub mod process_epoch; +pub mod submit; use std::path::{Path, PathBuf}; +use std::time::Instant; use anchor_lang::prelude::*; use jito_tip_distribution_sdk::TipDistributionAccount; @@ -19,6 +22,7 @@ use log::info; use meta_merkle_tree::{ generated_merkle_tree::GeneratedMerkleTreeCollection, meta_merkle_tree::MetaMerkleTree, }; +use solana_metrics::datapoint_info; use solana_sdk::{account::AccountSharedData, pubkey::Pubkey, slot_history::Slot}; #[derive(Debug)] @@ -72,20 +76,35 @@ pub fn get_meta_merkle_root( ledger_path: &Path, account_paths: Vec, full_snapshots_path: PathBuf, + incremental_snapshots_path: PathBuf, desired_slot: &Slot, tip_distribution_program_id: &Pubkey, out_path: &str, tip_payment_program_id: &Pubkey, ncn_address: &Pubkey, + operator_address: &Pubkey, epoch: u64, protocol_fee_bps: u64, snapshots_enabled: bool, ) -> std::result::Result { + let start = Instant::now(); + + datapoint_info!( + "tip_router_cli.get_meta_merkle_root", + ("operator_address", operator_address.to_string(), String), + ("state", "stake_meta_generation", String), + ("step", 1, i64), + ("epoch", epoch, i64), + ("duration_ms", start.elapsed().as_millis() as i64, i64) + ); + // Get stake meta collection let stake_meta_collection = stake_meta_generator::generate_stake_meta( + operator_address, ledger_path, account_paths, full_snapshots_path, + incremental_snapshots_path, desired_slot, tip_distribution_program_id, out_path, @@ -102,6 +121,15 @@ pub fn get_meta_merkle_root( stake_meta_collection.bank_hash ); + datapoint_info!( + "tip_router_cli.get_meta_merkle_root", + ("operator_address", operator_address.to_string(), String), + ("state", "generated_merkle_tree_collection", String), + ("step", 2, i64), + ("epoch", epoch, i64), + ("duration_ms", start.elapsed().as_millis() as i64, i64) + ); + // Generate merkle tree collection let merkle_tree_coll = GeneratedMerkleTreeCollection::new_from_stake_meta_collection( stake_meta_collection, @@ -121,6 +149,15 @@ pub fn get_meta_merkle_root( merkle_tree_coll.bank_hash ); + datapoint_info!( + "tip_router_cli.get_meta_merkle_root", + ("operator_address", operator_address.to_string(), String), + ("state", "meta_merkle_tree_creation", String), + ("step", 3, i64), + ("epoch", epoch, i64), + ("duration_ms", start.elapsed().as_millis() as i64, i64) + ); + // Convert to MetaMerkleTree let meta_merkle_tree = MetaMerkleTree::new_from_generated_merkle_tree_collection( merkle_tree_coll, @@ -134,5 +171,15 @@ pub fn get_meta_merkle_root( "Created MetaMerkleTree:\n - num nodes: {:?}\n - merkle root: {:?}", meta_merkle_tree.num_nodes, meta_merkle_tree.merkle_root ); + + datapoint_info!( + "tip_router_cli.get_meta_merkle_root", + ("operator_address", operator_address.to_string(), String), + ("state", "meta_merkle_tree_creation", String), + ("step", 4, i64), + ("epoch", epoch, i64), + ("duration_ms", start.elapsed().as_millis() as i64, i64) + ); + Ok(meta_merkle_tree) } diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 585791ef..26eb2f91 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -3,16 +3,22 @@ use ::{ clap::Parser, ellipsis_client::{ClientSubset, EllipsisClient}, log::{error, info}, + solana_metrics::set_host_id, solana_rpc_client::rpc_client::RpcClient, solana_sdk::{ clock::DEFAULT_SLOTS_PER_EPOCH, + pubkey::Pubkey, signer::{keypair::read_keypair_file, Signer}, transaction::Transaction, }, + std::{path::PathBuf, str::FromStr, time::Duration}, tip_router_operator_cli::{ + backup_snapshots::BackupSnapshotMonitor, cli::{Cli, Commands}, process_epoch::{get_previous_epoch_last_slot, process_epoch, wait_for_next_epoch}, + submit::{submit_recent_epochs_to_ncn, submit_to_ncn}, }, + tokio::time::sleep, }; #[tokio::main] @@ -25,6 +31,8 @@ async fn main() -> Result<()> { &read_keypair_file(&cli.keypair_path).expect("Failed to read keypair file"), )?; + set_host_id(cli.operator_address.to_string()); + let test_meta_merkle_root = [1; 32]; let ix = spl_memo::build_memo(&test_meta_merkle_root.to_vec(), &[&keypair.pubkey()]); info!("Submitting test memo {:?}", test_meta_merkle_root); @@ -50,19 +58,76 @@ async fn main() -> Result<()> { cli.snapshot_output_dir.display() ); - match &cli.command { + match cli.command { Commands::Run { ncn_address, tip_distribution_program_id, tip_payment_program_id, + tip_router_program_id, enable_snapshots, + num_monitored_epochs, + start_next_epoch, + override_target_slot, } => { info!("Running Tip Router..."); + let rpc_client_clone = rpc_client.clone(); + let full_snapshots_path = cli.full_snapshots_path.clone().unwrap(); + let backup_snapshots_dir = cli.backup_snapshots_dir.clone(); + let rpc_url = cli.rpc_url.clone(); + let cli_clone = cli.clone(); + + // Check for new meta merkle trees and submit to NCN periodically + tokio::spawn(async move { + loop { + if let Err(e) = submit_recent_epochs_to_ncn( + &rpc_client_clone, + &keypair, + &ncn_address, + &tip_router_program_id, + &tip_distribution_program_id, + num_monitored_epochs, + &cli_clone, + ) + .await + { + error!("Error submitting to NCN: {}", e); + } + sleep(Duration::from_secs(60)).await; + } + }); + + // Track incremental snapshots and backup to `backup_snapshots_dir` + tokio::spawn(async move { + loop { + if let Err(e) = BackupSnapshotMonitor::new( + &rpc_url, + full_snapshots_path.clone(), + backup_snapshots_dir.clone(), + override_target_slot, + ) + .run() + .await + { + error!("Error running backup snapshot monitor: {}", e); + } + } + }); + + if start_next_epoch { + wait_for_next_epoch(&rpc_client).await?; + } + loop { // Get the last slot of the previous epoch let (previous_epoch, previous_epoch_slot) = - get_previous_epoch_last_slot(&rpc_client).await?; + if let Ok((epoch, slot)) = get_previous_epoch_last_slot(&rpc_client) { + (epoch, slot) + } else { + error!("Error getting previous epoch slot"); + continue; + }; + info!("Processing slot {} for previous epoch", previous_epoch_slot); // Process the epoch @@ -70,11 +135,11 @@ async fn main() -> Result<()> { &rpc_client, previous_epoch_slot, previous_epoch, - &keypair, - tip_distribution_program_id, - tip_payment_program_id, - ncn_address, - *enable_snapshots, + &tip_distribution_program_id, + &tip_payment_program_id, + &tip_router_program_id, + &ncn_address, + enable_snapshots, &cli, ) .await @@ -82,18 +147,21 @@ async fn main() -> Result<()> { Ok(_) => info!("Successfully processed epoch"), Err(e) => { error!("Error processing epoch: {}", e); - // Continue to next epoch even if this one failed } } // Wait for epoch change - wait_for_next_epoch(&rpc_client).await?; + if let Err(e) = wait_for_next_epoch(&rpc_client).await { + error!("Error waiting for next epoch: {}", e); + sleep(Duration::from_secs(60)).await; + } } } Commands::SnapshotSlot { ncn_address, tip_distribution_program_id, tip_payment_program_id, + tip_router_program_id, enable_snapshots, slot, } => { @@ -102,13 +170,13 @@ async fn main() -> Result<()> { // Process the epoch match process_epoch( &rpc_client, - *slot, + slot, epoch, - &keypair, - tip_distribution_program_id, - tip_payment_program_id, - ncn_address, - *enable_snapshots, + &tip_distribution_program_id, + &tip_payment_program_id, + &tip_router_program_id, + &ncn_address, + enable_snapshots, &cli, ) .await @@ -116,10 +184,38 @@ async fn main() -> Result<()> { Ok(_) => info!("Successfully processed slot"), Err(e) => { error!("Error processing epoch: {}", e); - // Continue to next epoch even if this one failed } } } + Commands::SubmitEpoch { + ncn_address, + tip_distribution_program_id, + tip_router_program_id, + epoch, + } => { + let meta_merkle_tree_path = PathBuf::from(format!( + "{}/meta_merkle_tree_{}.json", + cli.meta_merkle_tree_dir.display(), + epoch + )); + info!( + "Submitting epoch {} from {}...", + epoch, + meta_merkle_tree_path.display() + ); + let operator_address = Pubkey::from_str(&cli.operator_address)?; + submit_to_ncn( + &rpc_client, + &keypair, + &operator_address, + &meta_merkle_tree_path, + epoch, + &ncn_address, + &tip_router_program_id, + &tip_distribution_program_id, + ) + .await?; + } } Ok(()) } diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index 3b7a1486..28e5441a 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -8,13 +8,9 @@ use ellipsis_client::EllipsisClient; use log::info; use solana_metrics::{datapoint_error, datapoint_info}; use solana_rpc_client::rpc_client::RpcClient; -use solana_sdk::{pubkey::Pubkey, signer::keypair::Keypair}; +use solana_sdk::pubkey::Pubkey; -use crate::{ - get_meta_merkle_root, - tip_router::{cast_vote, get_ncn_config}, - Cli, -}; +use crate::{get_meta_merkle_root, tip_router::get_ncn_config, Cli}; pub async fn wait_for_next_epoch(rpc_client: &RpcClient) -> Result<()> { let current_epoch = rpc_client.get_epoch_info()?.epoch; @@ -30,7 +26,7 @@ pub async fn wait_for_next_epoch(rpc_client: &RpcClient) -> Result<()> { } } -pub async fn get_previous_epoch_last_slot(rpc_client: &RpcClient) -> Result<(u64, u64)> { +pub fn get_previous_epoch_last_slot(rpc_client: &RpcClient) -> Result<(u64, u64)> { let epoch_info = rpc_client.get_epoch_info()?; let current_slot = epoch_info.absolute_slot; let slot_index = epoch_info.slot_index; @@ -52,30 +48,31 @@ pub async fn get_previous_epoch_last_slot(rpc_client: &RpcClient) -> Result<(u64 #[allow(clippy::too_many_arguments)] pub async fn process_epoch( client: &EllipsisClient, - previous_epoch_slot: u64, - previous_epoch: u64, - payer: &Keypair, + target_slot: u64, + target_epoch: u64, tip_distribution_program_id: &Pubkey, tip_payment_program_id: &Pubkey, + tip_router_program_id: &Pubkey, ncn_address: &Pubkey, snapshots_enabled: bool, cli_args: &Cli, ) -> Result<()> { - info!("Processing epoch {:?}", previous_epoch); + info!("Processing epoch {:?}", target_epoch); let start = Instant::now(); let ledger_path = cli_args.ledger_path.clone(); let account_paths = cli_args.account_paths.clone(); let full_snapshots_path = cli_args.full_snapshots_path.clone(); - let operator = Pubkey::from_str(&cli_args.operator_address).unwrap(); + let incremental_snapshots_path = cli_args.backup_snapshots_dir.clone(); + let operator_address = Pubkey::from_str(&cli_args.operator_address).unwrap(); + let meta_merkle_tree_dir = cli_args.meta_merkle_tree_dir.clone(); // Get the protocol fees - // let ncn_config = get_ncn_config(client, ncn_address).await.unwrap(); - // let adjusted_total_fees = ncn_config - // .fee_config - // .adjusted_total_fees_bps(previous_epoch)?; - let adjusted_total_fees = 300; + let ncn_config = get_ncn_config(client, tip_router_program_id, ncn_address).await?; + let adjusted_total_fees = ncn_config + .fee_config + .adjusted_total_fees_bps(target_epoch)?; let account_paths = account_paths.map_or_else(|| vec![ledger_path.clone()], |paths| paths); let full_snapshots_path = full_snapshots_path.map_or(ledger_path, |path| path); @@ -85,70 +82,93 @@ pub async fn process_epoch( cli_args.ledger_path.as_path(), account_paths, full_snapshots_path, - &previous_epoch_slot, + incremental_snapshots_path, + &target_slot, tip_distribution_program_id, "", // TODO out_path is not used, unsure what should be put here. Maybe `snapshot_output_dir` from cli args? tip_payment_program_id, ncn_address, - previous_epoch, + &operator_address, + target_epoch, adjusted_total_fees, snapshots_enabled, ) { Ok(tree) => { datapoint_info!( - "tip_router_cli-merkle_root_generated", - ("epoch", previous_epoch, i64) + "tip_router_cli.process_epoch", + ("operator_address", operator_address.to_string(), String), + ("epoch", target_epoch, i64), + ("status", "success", String), + ("state", "merkle_root_generation", String), + ("duration_ms", start.elapsed().as_millis() as i64, i64) ); tree } Err(e) => { datapoint_error!( - "tip_router_cli-merkle_root_error", - ("epoch", previous_epoch, i64), - ("error", format!("{:?}", e), String) + "tip_router_cli.process_epoch", + ("operator_address", operator_address.to_string(), String), + ("epoch", target_epoch, i64), + ("status", "error", String), + ("error", format!("{:?}", e), String), + ("state", "merkle_root_generation", String), + ("duration_ms", start.elapsed().as_millis() as i64, i64) ); return Err(anyhow::anyhow!("Failed to generate merkle root: {:?}", e)); } }; - // Cast vote using the generated merkle root - let tx_sig = match cast_vote( - client, - payer, - *ncn_address, - operator, - payer, - meta_merkle_tree.merkle_root, - previous_epoch, - ) - .await - { - Ok(sig) => { - datapoint_info!( - "tip_router_cli-vote_cast_success", - ("epoch", previous_epoch, i64), - ("tx_sig", format!("{:?}", sig), String) - ); - sig - } + // Write meta merkle tree to file + let meta_merkle_tree_path = + meta_merkle_tree_dir.join(format!("meta_merkle_tree_{}.json", target_epoch)); + let meta_merkle_tree_json = match serde_json::to_string(&meta_merkle_tree) { + Ok(json) => json, Err(e) => { datapoint_error!( - "tip_router_cli-vote_cast_error", - ("epoch", previous_epoch, i64), - ("error", format!("{:?}", e), String) + "tip_router_cli.process_epoch", + ("operator_address", operator_address.to_string(), String), + ("epoch", target_epoch, i64), + ("status", "error", String), + ("error", format!("{:?}", e), String), + ("state", "merkle_root_serialization", String), + ("duration_ms", start.elapsed().as_millis() as i64, i64) ); - return Err(anyhow::anyhow!("Failed to cast vote: {}", e)); // Convert the error + return Err(anyhow::anyhow!( + "Failed to serialize meta merkle tree: {}", + e + )); } }; - info!("Successfully cast vote at tx {:?}", tx_sig); + if let Err(e) = std::fs::write(&meta_merkle_tree_path, meta_merkle_tree_json) { + datapoint_error!( + "tip_router_cli.process_epoch", + ("operator_address", operator_address.to_string(), String), + ("epoch", target_epoch, i64), + ("status", "error", String), + ("error", format!("{:?}", e), String), + ("state", "merkle_root_file_write", String), + ("duration_ms", start.elapsed().as_millis() as i64, i64) + ); + return Err(anyhow::anyhow!( + "Failed to write meta merkle tree to file: {}", + e + )); + } - let elapsed_us = start.elapsed().as_micros(); // Emit a datapoint for starting the epoch processing datapoint_info!( - "tip_router_cli-process_epoch", - ("epoch", previous_epoch, i64), - ("elapsed_us", elapsed_us, i64), + "tip_router_cli.process_epoch", + ("operator_address", operator_address.to_string(), String), + ("epoch", target_epoch, i64), + ("status", "success", String), + ("state", "epoch_processing_completed", String), + ( + "meta_merkle_root", + format!("{:?}", meta_merkle_tree.merkle_root), + String + ), + ("duration_ms", start.elapsed().as_millis() as i64, i64) ); solana_metrics::flush(); diff --git a/tip-router-operator-cli/src/stake_meta_generator.rs b/tip-router-operator-cli/src/stake_meta_generator.rs index e082ca52..d977e0c7 100644 --- a/tip-router-operator-cli/src/stake_meta_generator.rs +++ b/tip-router-operator-cli/src/stake_meta_generator.rs @@ -20,6 +20,7 @@ use solana_ledger::{ bank_forks_utils::BankForksUtilsError, blockstore::BlockstoreError, blockstore_processor::BlockstoreProcessorError, }; +use solana_metrics::datapoint_error; use solana_program::{stake_history::StakeHistory, sysvar}; use solana_runtime::{bank::Bank, stakes::StakeAccount}; use solana_sdk::{ @@ -61,6 +62,8 @@ pub enum StakeMetaGeneratorError { BankForksUtilsError(#[from] BankForksUtilsError), GenesisConfigError(#[from] OpenGenesisConfigError), + + PanicError, } impl Display for StakeMetaGeneratorError { @@ -73,9 +76,11 @@ impl Display for StakeMetaGeneratorError { /// that slot. Optionally writing the result as JSON file to disk. #[allow(clippy::too_many_arguments)] pub fn generate_stake_meta( + operator_address: &Pubkey, ledger_path: &Path, account_paths: Vec, full_snapshots_path: PathBuf, + incremental_snapshots_path: PathBuf, desired_slot: &Slot, tip_distribution_program_id: &Pubkey, _out_path: &str, @@ -83,13 +88,32 @@ pub fn generate_stake_meta( snapshots_enabled: bool, ) -> Result { info!("Creating bank from ledger path..."); - let bank = get_bank_from_ledger( - ledger_path, - account_paths, - full_snapshots_path, - desired_slot, - snapshots_enabled, - ); + let res = std::panic::catch_unwind(|| { + get_bank_from_ledger( + operator_address, + ledger_path, + account_paths, + full_snapshots_path, + incremental_snapshots_path, + desired_slot, + snapshots_enabled, + ) + }); + let bank = match res { + Ok(bank) => bank, + Err(e) => { + error!("Panicked while creating bank from ledger: {:?}", e); + let error_str = format!("{:?}", e); + datapoint_error!( + "tip_router_cli.get_bank", + ("operator", operator_address.to_string(), String), + ("status", "error", String), + ("state", "get_bank_from_ledger", String), + ("error", error_str, String), + ); + return Err(StakeMetaGeneratorError::PanicError); + } + }; info!("Generating stake_meta_collection object..."); let stake_meta_coll = diff --git a/tip-router-operator-cli/src/submit.rs b/tip-router-operator-cli/src/submit.rs new file mode 100644 index 00000000..88f979ec --- /dev/null +++ b/tip-router-operator-cli/src/submit.rs @@ -0,0 +1,260 @@ +use std::{path::PathBuf, str::FromStr}; + +use anchor_lang::AccountDeserialize; +use ellipsis_client::EllipsisClient; +use jito_bytemuck::AccountDeserialize as JitoAccountDeserialize; +use jito_tip_distribution_sdk::{derive_config_account_address, TipDistributionAccount}; +use jito_tip_router_core::ballot_box::BallotBox; +use log::{debug, info}; +use meta_merkle_tree::meta_merkle_tree::MetaMerkleTree; +use solana_account_decoder::UiAccountEncoding; +use solana_client::{ + rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig}, + rpc_filter::{Memcmp, RpcFilterType}, +}; +use solana_metrics::{datapoint_error, datapoint_info}; +use solana_sdk::{pubkey::Pubkey, signature::Keypair, signer::Signer}; + +use crate::{ + tip_router::{cast_vote, get_ncn_config, set_merkle_roots_batched}, + Cli, +}; + +pub async fn submit_recent_epochs_to_ncn( + client: &EllipsisClient, + keypair: &Keypair, + ncn_address: &Pubkey, + tip_router_program_id: &Pubkey, + tip_distribution_program_id: &Pubkey, + num_monitored_epochs: u64, + cli_args: &Cli, +) -> Result<(), anyhow::Error> { + let epoch = client.get_epoch_info()?; + let operator_address = Pubkey::from_str(&cli_args.operator_address)?; + + for i in 0..num_monitored_epochs { + let process_epoch = epoch.epoch.checked_sub(i).unwrap(); + + let meta_merkle_tree_dir = cli_args.meta_merkle_tree_dir.clone(); + let target_meta_merkle_tree_file = format!("meta_merkle_tree_{}.json", process_epoch); + let target_meta_merkle_tree_path = meta_merkle_tree_dir.join(target_meta_merkle_tree_file); + if !target_meta_merkle_tree_path.exists() { + continue; + } + + submit_to_ncn( + client, + keypair, + &operator_address, + &target_meta_merkle_tree_path, + process_epoch, + ncn_address, + tip_router_program_id, + tip_distribution_program_id, + ) + .await?; + } + + Ok(()) +} + +pub async fn submit_to_ncn( + client: &EllipsisClient, + keypair: &Keypair, + operator_address: &Pubkey, + meta_merkle_tree_path: &PathBuf, + epoch: u64, + ncn_address: &Pubkey, + tip_router_program_id: &Pubkey, + tip_distribution_program_id: &Pubkey, +) -> Result<(), anyhow::Error> { + let epoch_info = client.get_epoch_info()?; + let meta_merkle_tree = MetaMerkleTree::new_from_file(meta_merkle_tree_path)?; + let config = get_ncn_config(client, tip_router_program_id, ncn_address).await?; + + // Check for ballot box + let ballot_box_address = + BallotBox::find_program_address(tip_router_program_id, ncn_address, epoch).0; + let ballot_box_account = match client.get_account(&ballot_box_address).await { + Ok(account) => account, + Err(e) => { + debug!("Ballot box not created yet for epoch {}: {}", epoch, e); + return Ok(()); + } + }; + + let ballot_box = BallotBox::try_from_slice_unchecked(&ballot_box_account.data)?; + + let is_voting_valid = ballot_box.is_voting_valid( + epoch_info.absolute_slot, + config.valid_slots_after_consensus(), + )?; + + // If exists, look for vote from current operator + let vote = ballot_box + .operator_votes() + .iter() + .find(|vote| vote.operator() == operator_address); + + let should_cast_vote = match vote { + Some(vote) => { + // If vote exists, cast_vote if different from current meta_merkle_root + let tally = ballot_box + .ballot_tallies() + .get(u16::from(vote.ballot_index()) as usize) + .ok_or(anyhow::anyhow!("Ballot tally not found"))?; + + tally.ballot().root() != meta_merkle_tree.merkle_root + } + None => true, + }; + + if should_cast_vote && is_voting_valid { + let res = cast_vote( + client, + keypair, + tip_router_program_id, + *ncn_address, + keypair.pubkey(), + keypair, + meta_merkle_tree.merkle_root, + epoch, + ) + .await; + + match res { + Ok(signature) => { + datapoint_info!( + "tip_router_cli.vote_cast", + ("operator_address", operator_address.to_string(), String), + ("epoch", epoch, i64), + ( + "merkle_root", + format!("{:?}", meta_merkle_tree.merkle_root), + String + ), + ("tx_sig", format!("{:?}", signature), String) + ); + info!( + "Cast vote for epoch {} with signature {:?}", + epoch, signature + ) + } + Err(e) => { + datapoint_error!( + "tip_router_cli.vote_cast", + ("operator_address", operator_address.to_string(), String), + ("epoch", epoch, i64), + ( + "merkle_root", + format!("{:?}", meta_merkle_tree.merkle_root), + String + ), + ("status", "error", String), + ("error", format!("{:?}", e), String) + ); + info!("Failed to cast vote for epoch {}: {:?}", epoch, e) + } + } + } + + if ballot_box.is_consensus_reached() { + // Fetch TipDistributionAccounts filtered by epoch and upload authority + let tip_distribution_accounts = + get_tip_distribution_accounts_to_upload(client, epoch, tip_distribution_program_id) + .await?; + + // For each TipDistributionAccount returned, if it has no root uploaded, upload root with set_merkle_root + let res = set_merkle_roots_batched( + client, + ncn_address, + keypair, + tip_distribution_program_id, + epoch, + tip_distribution_accounts, + meta_merkle_tree, + ) + .await?; + + let num_success = res.iter().filter(|r| r.is_ok()).count(); + let num_failed = res.iter().filter(|r| r.is_err()).count(); + + datapoint_info!( + "tip_router_cli.set_merkle_root", + ("operator_address", operator_address.to_string(), String), + ("epoch", epoch, i64), + ("num_success", num_success, i64), + ("num_failed", num_failed, i64) + ); + info!( + "Set merkle root for {} tip distribution accounts", + num_success + ); + info!( + "Failed to set merkle root for {} tip distribution accounts", + num_failed + ); + } + + Ok(()) +} + +async fn get_tip_distribution_accounts_to_upload( + client: &EllipsisClient, + epoch: u64, + + tip_distribution_program_id: &Pubkey, +) -> Result, anyhow::Error> { + let config_address = derive_config_account_address(tip_distribution_program_id).0; + + // Filters assume merkle root is None + let filters = vec![ + RpcFilterType::Memcmp(Memcmp::new_raw_bytes( + 8 // Discriminator + + 32, // Pubkey - validator_vote_account + config_address.to_bytes().to_vec(), + )), + RpcFilterType::Memcmp(Memcmp::new_raw_bytes( + 8 // Discriminator + + 32 // Pubkey - validator_vote_account + + 32 // Pubkey - merkle_root_upload_authority + + 1, // Option - "None" merkle_root + epoch.to_le_bytes().to_vec(), + )), + ]; + + let tip_distribution_accounts = client.get_program_accounts_with_config( + tip_distribution_program_id, + RpcProgramAccountsConfig { + filters: Some(filters), + account_config: RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::Base64), + ..RpcAccountInfoConfig::default() + }, + ..RpcProgramAccountsConfig::default() + }, + )?; + + let tip_distribution_accounts = tip_distribution_accounts + .into_iter() + .filter_map(|(pubkey, account)| { + let tip_distribution_account = + TipDistributionAccount::try_deserialize(&mut account.data.as_slice()); + match tip_distribution_account { + Ok(tip_distribution_account) => { + // Double check that GPA filter worked + if tip_distribution_account.epoch_created_at == epoch + && tip_distribution_account.merkle_root_upload_authority == config_address + { + Some((pubkey, tip_distribution_account)) + } else { + None + } + } + Err(_) => None, + } + }) + .collect::>(); + + Ok(tip_distribution_accounts) +} diff --git a/tip-router-operator-cli/src/tip_router.rs b/tip-router-operator-cli/src/tip_router.rs index c6858eb6..3d757b48 100644 --- a/tip-router-operator-cli/src/tip_router.rs +++ b/tip-router-operator-cli/src/tip_router.rs @@ -1,7 +1,10 @@ use anyhow::Result; -use ellipsis_client::{ClientSubset, EllipsisClient, EllipsisClientResult}; +use ellipsis_client::{ClientSubset, EllipsisClient, EllipsisClientError, EllipsisClientResult}; use jito_bytemuck::AccountDeserialize; -use jito_tip_router_client::instructions::CastVoteBuilder; +use jito_tip_distribution_sdk::{ + derive_config_account_address, jito_tip_distribution::accounts::TipDistributionAccount, +}; +use jito_tip_router_client::instructions::{CastVoteBuilder, SetMerkleRootBuilder}; use jito_tip_router_core::{ ballot_box::BallotBox, config::Config, @@ -9,6 +12,7 @@ use jito_tip_router_core::{ epoch_state::EpochState, }; use log::info; +use meta_merkle_tree::meta_merkle_tree::MetaMerkleTree; use solana_sdk::{ pubkey::Pubkey, signature::{Keypair, Signature}, @@ -17,8 +21,12 @@ use solana_sdk::{ }; /// Fetch and deserialize -pub async fn get_ncn_config(client: &EllipsisClient, ncn_pubkey: &Pubkey) -> Result { - let config_pda = Config::find_program_address(&jito_tip_router_program::id(), ncn_pubkey).0; +pub async fn get_ncn_config( + client: &EllipsisClient, + tip_router_program_id: &Pubkey, + ncn_pubkey: &Pubkey, +) -> Result { + let config_pda = Config::find_program_address(tip_router_program_id, ncn_pubkey).0; let config = client.get_account(&config_pda).await?; Ok(*Config::try_from_slice_unchecked(config.data.as_slice()).unwrap()) } @@ -27,29 +35,23 @@ pub async fn get_ncn_config(client: &EllipsisClient, ncn_pubkey: &Pubkey) -> Res pub async fn cast_vote( client: &EllipsisClient, _payer: &Keypair, + tip_router_program_id: &Pubkey, ncn: Pubkey, operator: Pubkey, operator_admin: &Keypair, meta_merkle_root: [u8; 32], epoch: u64, ) -> EllipsisClientResult { - let epoch_state = - EpochState::find_program_address(&jito_tip_router_program::id(), &ncn, epoch).0; + let epoch_state = EpochState::find_program_address(tip_router_program_id, &ncn, epoch).0; - let ncn_config = Config::find_program_address(&jito_tip_router_program::id(), &ncn).0; + let ncn_config = Config::find_program_address(tip_router_program_id, &ncn).0; - let ballot_box = BallotBox::find_program_address(&jito_tip_router_program::id(), &ncn, epoch).0; + let ballot_box = BallotBox::find_program_address(tip_router_program_id, &ncn, epoch).0; - let epoch_snapshot = - EpochSnapshot::find_program_address(&jito_tip_router_program::id(), &ncn, epoch).0; + let epoch_snapshot = EpochSnapshot::find_program_address(tip_router_program_id, &ncn, epoch).0; - let operator_snapshot = OperatorSnapshot::find_program_address( - &jito_tip_router_program::id(), - &operator, - &ncn, - epoch, - ) - .0; + let operator_snapshot = + OperatorSnapshot::find_program_address(tip_router_program_id, &operator, &ncn, epoch).0; let _ix = CastVoteBuilder::new() .epoch_state(epoch_state) @@ -71,3 +73,81 @@ pub async fn cast_vote( let tx = Transaction::new_with_payer(&[ix], Some(&operator_admin.pubkey())); client.process_transaction(tx, &[operator_admin]).await } + +pub async fn set_merkle_roots_batched( + client: &EllipsisClient, + ncn_address: &Pubkey, + keypair: &Keypair, + tip_distribution_program: &Pubkey, + epoch: u64, + tip_distribution_accounts: Vec<(Pubkey, TipDistributionAccount)>, + meta_merkle_tree: MetaMerkleTree, +) -> Result>> { + let ballot_box = + BallotBox::find_program_address(&jito_tip_router_program::id(), ncn_address, epoch).0; + + let config = Config::find_program_address(&jito_tip_router_program::id(), ncn_address).0; + + let epoch_state = + EpochState::find_program_address(&jito_tip_router_program::id(), ncn_address, epoch).0; + + let tip_distribution_config = + derive_config_account_address(&jito_tip_distribution_sdk::jito_tip_distribution::ID).0; + + // Given a list of target TipDistributionAccounts and a meta merkle tree, fetch each meta merkle root, create its instruction, and call set_merkle_root + let instructions = tip_distribution_accounts + .iter() + .filter_map(|(key, tip_distribution_account)| { + let meta_merkle_node = meta_merkle_tree.get_node(key); + + let proof = if let Some(proof) = meta_merkle_node.proof { + proof + } else { + // TODO emit big warning NO PROOF + return None; + }; + + let vote_account = tip_distribution_account.validator_vote_account; + + let ix = SetMerkleRootBuilder::new() + .epoch_state(epoch_state) + .config(config) + .ncn(*ncn_address) + .ballot_box(ballot_box) + .vote_account(vote_account) + .tip_distribution_account(*key) + .tip_distribution_config(tip_distribution_config) + .tip_distribution_program(*tip_distribution_program) + .proof(proof) + .merkle_root(meta_merkle_node.validator_merkle_root) + .max_total_claim(meta_merkle_node.max_total_claim) + .max_num_nodes(meta_merkle_node.max_num_nodes) + .epoch(epoch) + .instruction(); + Some(ix) + }) + .collect::>(); + + let mut results = vec![]; + for _ in 0..instructions.len() { + results.push(Err(EllipsisClientError::Other(anyhow::anyhow!( + "Default: Failed to submit instruction" + )))); + } + + // TODO Parallel submit instructions + for (i, ix) in instructions.into_iter().enumerate() { + let mut tx = Transaction::new_with_payer(&[ix], Some(&keypair.pubkey())); + // Simple retry logic + for _ in 0..5 { + let blockhash = client.fetch_latest_blockhash().await?; + tx.sign(&[keypair], blockhash); + results[i] = client.process_transaction(tx.clone(), &[keypair]).await; + if results[i].is_ok() { + break; + } + } + } + + Ok(results) +} diff --git a/tip-router-operator-cli/tests/integration_tests.rs b/tip-router-operator-cli/tests/integration_tests.rs index d3e63129..769a307f 100644 --- a/tip-router-operator-cli/tests/integration_tests.rs +++ b/tip-router-operator-cli/tests/integration_tests.rs @@ -190,12 +190,13 @@ async fn test_meta_merkle_creation_from_ledger() { PathBuf::from("tests/fixtures/accounts"), PathBuf::from("path/to/account2"), ]; - let full_snapshots_path = PathBuf::from("path/to/full_snapshots"); + let full_snapshots_path = PathBuf::from("tests/fixtures/test-ledger"); let desired_slot = &144; let tip_distribution_program_id = &TIP_DISTRIBUTION_ID; let out_path = "tests/fixtures/output.json"; let tip_payment_program_id = &TIP_PAYMENT_ID; let ncn_address = Pubkey::new_unique(); + let operator_address = Pubkey::new_unique(); let epoch = 0u64; const PROTOCOL_FEE_BPS: u64 = 300; @@ -203,12 +204,14 @@ async fn test_meta_merkle_creation_from_ledger() { let meta_merkle_tree = get_meta_merkle_root( ledger_path, account_paths, + full_snapshots_path.clone(), full_snapshots_path, desired_slot, tip_distribution_program_id, out_path, tip_payment_program_id, &ncn_address, + &operator_address, epoch, PROTOCOL_FEE_BPS, false, From 10f8d99678414a0832a7d80ae2f62f26ca3e93c0 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 22 Jan 2025 19:29:26 -0500 Subject: [PATCH 021/112] Remove incremental from backup not main dir --- tip-router-operator-cli/src/backup_snapshots.rs | 2 +- tip-router-operator-cli/src/main.rs | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/tip-router-operator-cli/src/backup_snapshots.rs b/tip-router-operator-cli/src/backup_snapshots.rs index a4c481fb..4ce0b135 100644 --- a/tip-router-operator-cli/src/backup_snapshots.rs +++ b/tip-router-operator-cli/src/backup_snapshots.rs @@ -147,7 +147,7 @@ impl BackupSnapshotMonitor { let slots_per_epoch = DEFAULT_SLOTS_PER_EPOCH; let target_epoch = target_slot / slots_per_epoch; - let dir_entries = std::fs::read_dir(&self.snapshots_dir)?; + let dir_entries = std::fs::read_dir(&self.backup_dir)?; // Find the snapshot that ends closest to but not after target_slot let mut same_epoch_snapshots: Vec = dir_entries diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 26eb2f91..1c1b9489 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -77,6 +77,14 @@ async fn main() -> Result<()> { let rpc_url = cli.rpc_url.clone(); let cli_clone = cli.clone(); + if !backup_snapshots_dir.exists() { + info!( + "Creating backup snapshots directory at {}", + backup_snapshots_dir.display() + ); + std::fs::create_dir_all(&backup_snapshots_dir)?; + } + // Check for new meta merkle trees and submit to NCN periodically tokio::spawn(async move { loop { From 83252daf47f1a3ff792c9393f84e2e2656e14102 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 22 Jan 2025 21:56:20 -0500 Subject: [PATCH 022/112] Reduce logs --- tip-router-operator-cli/src/backup_snapshots.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tip-router-operator-cli/src/backup_snapshots.rs b/tip-router-operator-cli/src/backup_snapshots.rs index 4ce0b135..c5a4b9a6 100644 --- a/tip-router-operator-cli/src/backup_snapshots.rs +++ b/tip-router-operator-cli/src/backup_snapshots.rs @@ -107,7 +107,7 @@ impl BackupSnapshotMonitor { return Ok(()); } - log::info!( + log::debug!( "Copying incremental snapshot from {:?} to {:?}", snapshot_path, dest_path @@ -161,7 +161,7 @@ impl BackupSnapshotMonitor { // Remove oldest snapshot if let Some(oldest_snapshot) = same_epoch_snapshots.first() { - log::info!( + log::debug!( "Removing old snapshot from epoch {} with slot {}: {:?}", target_epoch, oldest_snapshot.end_slot, @@ -190,7 +190,7 @@ impl BackupSnapshotMonitor { if let Some(snapshot) = self.find_closest_incremental(target_slot) { if last_backup_path.as_ref() != Some(&snapshot) { - log::info!( + log::debug!( "Found new best snapshot for slot {}: {:?}", target_slot, snapshot @@ -229,7 +229,7 @@ mod tests { let temp_dir = TempDir::new().unwrap(); let backup_dir = TempDir::new().unwrap(); - let monitor = BackupSnapshotMonitor::new( + let _monitor = BackupSnapshotMonitor::new( "http://localhost:8899", temp_dir.path().to_path_buf(), backup_dir.path().to_path_buf(), @@ -251,7 +251,7 @@ mod tests { .join("incremental-snapshot-100-150-hash1.tar.zst"); let info = SnapshotInfo::from_path(path.clone()).unwrap(); - assert_eq!(info.start_slot, 100); + assert_eq!(info._start_slot, 100); assert_eq!(info.end_slot, 150); assert_eq!(info.path, path); From d5a1e87230d3386dc0689445aae8f77d55cb9dca Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Thu, 23 Jan 2025 13:41:18 -0500 Subject: [PATCH 023/112] WIP copy pasta a whole bunch of stuff for mev tip claim --- Cargo.lock | 3 + Cargo.toml | 1 + tip-router-operator-cli/Cargo.toml | 3 + tip-router-operator-cli/src/claim.rs | 400 +++++++++++++++++++++++ tip-router-operator-cli/src/lib.rs | 2 + tip-router-operator-cli/src/rpc_utils.rs | 148 +++++++++ 6 files changed, 557 insertions(+) create mode 100644 tip-router-operator-cli/src/claim.rs create mode 100644 tip-router-operator-cli/src/rpc_utils.rs diff --git a/Cargo.lock b/Cargo.lock index 2667e172..7e9bae0f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8874,6 +8874,7 @@ dependencies = [ "jito-tip-router-program", "log", "meta-merkle-tree", + "rand 0.8.5", "serde", "serde_json", "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", @@ -8884,9 +8885,11 @@ dependencies = [ "solana-program", "solana-program-test 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-rpc-client", + "solana-rpc-client-api", "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "solana-stake-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-transaction-status", "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "spl-memo", "tempfile", diff --git a/Cargo.toml b/Cargo.toml index f06bb16a..f73c4b67 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -74,6 +74,7 @@ solana-program = { package = "solana-program", git = "https://github.com/jito-fo solana-transaction-status = { package = "solana-transaction-status", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-program-test = { package = "solana-program-test", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-rpc-client = { package = "solana-rpc-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-rpc-client-api = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-runtime = { package = "solana-runtime", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-sdk = { package = "solana-sdk", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-stake-program = { package = "solana-stake-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } diff --git a/tip-router-operator-cli/Cargo.toml b/tip-router-operator-cli/Cargo.toml index 664ffd9e..75af7d8e 100644 --- a/tip-router-operator-cli/Cargo.toml +++ b/tip-router-operator-cli/Cargo.toml @@ -23,6 +23,7 @@ jito-tip-router-core = { workspace = true } jito-tip-router-program = { workspace = true } log = { workspace = true } meta-merkle-tree = { workspace = true } +rand = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } solana-account-decoder = { workspace = true } @@ -32,9 +33,11 @@ solana-ledger = { workspace = true } solana-metrics = { workspace = true } solana-program = { workspace = true } solana-rpc-client = { workspace = true } +solana-rpc-client-api = { workspace = true } solana-runtime = { workspace = true } solana-sdk = { workspace = true } solana-stake-program = { workspace = true } +solana-transaction-status = { workspace = true } solana-vote = { workspace = true } spl-memo = { workspace = true } thiserror = { workspace = true } diff --git a/tip-router-operator-cli/src/claim.rs b/tip-router-operator-cli/src/claim.rs new file mode 100644 index 00000000..d516222e --- /dev/null +++ b/tip-router-operator-cli/src/claim.rs @@ -0,0 +1,400 @@ +use std::{ + collections::HashMap, + sync::Arc, + time::{Duration, Instant}, +}; + +use anchor_lang::AccountDeserialize; +use itertools::Itertools; +use jito_tip_distribution_sdk::{ + jito_tip_distribution::accounts::ClaimStatus, TipDistributionAccount, CLAIM_STATUS_SIZE, + CONFIG_SEED, +}; +use log::{info, warn}; +use meta_merkle_tree::generated_merkle_tree::GeneratedMerkleTreeCollection; +use rand::{prelude::SliceRandom, thread_rng}; +use solana_client::{nonblocking::rpc_client::RpcClient, rpc_config::RpcSimulateTransactionConfig}; +use solana_metrics::datapoint_info; +use solana_sdk::{ + account::Account, commitment_config::CommitmentConfig, + compute_budget::ComputeBudgetInstruction, + fee_calculator::DEFAULT_TARGET_LAMPORTS_PER_SIGNATURE, native_token::LAMPORTS_PER_SOL, + pubkey::Pubkey, signature::Keypair, signer::Signer, system_program, transaction::Transaction, +}; +use thiserror::Error; + +use crate::rpc_utils::{get_batched_accounts, send_until_blockhash_expires}; + +#[derive(Error, Debug)] +pub enum ClaimMevError { + #[error(transparent)] + IoError(#[from] std::io::Error), + + #[error(transparent)] + JsonError(#[from] serde_json::Error), + + #[error(transparent)] + AnchorError(anchor_lang::error::Error), + + #[error(transparent)] + RpcError(#[from] solana_rpc_client_api::client_error::Error), + + #[error("Expected to have at least {desired_balance} lamports in {payer:?}. Current balance is {start_balance} lamports. Deposit {sol_to_deposit} SOL to continue.")] + InsufficientBalance { + desired_balance: u64, + payer: Pubkey, + start_balance: u64, + sol_to_deposit: u64, + }, + + #[error("Not finished with job, transactions left {transactions_left}")] + NotFinished { transactions_left: usize }, + + #[error("UncaughtError {e:?}")] + UncaughtError { e: String }, +} + +pub async fn claim_mev_tips( + merkle_trees: &GeneratedMerkleTreeCollection, + rpc_url: String, + rpc_sender_url: String, + tip_distribution_program_id: Pubkey, + keypair: Arc, + max_loop_duration: Duration, + micro_lamports: u64, +) -> Result<(), ClaimMevError> { + let rpc_client = RpcClient::new_with_timeout_and_commitment( + rpc_url, + Duration::from_secs(300), + CommitmentConfig::confirmed(), + ); + let rpc_sender_client = RpcClient::new(rpc_sender_url); + + let start = Instant::now(); + while start.elapsed() <= max_loop_duration { + let mut all_claim_transactions = get_claim_transactions_for_valid_unclaimed( + &rpc_client, + merkle_trees, + tip_distribution_program_id, + micro_lamports, + keypair.pubkey(), + ) + .await?; + + datapoint_info!( + "tip_router_cli.claim_mev_tips-send_summary", + ("claim_transactions_left", all_claim_transactions.len(), i64), + ); + + if all_claim_transactions.is_empty() { + return Ok(()); + } + + all_claim_transactions.shuffle(&mut thread_rng()); + let transactions: Vec<_> = all_claim_transactions.into_iter().take(300).collect(); + + // only check balance for the ones we need to currently send since reclaim rent running in parallel + if let Some((start_balance, desired_balance, sol_to_deposit)) = + is_sufficient_balance(&keypair.pubkey(), &rpc_client, transactions.len() as u64).await + { + return Err(ClaimMevError::InsufficientBalance { + desired_balance, + payer: keypair.pubkey(), + start_balance, + sol_to_deposit, + }); + } + + let blockhash = rpc_client.get_latest_blockhash().await?; + let _ = send_until_blockhash_expires( + &rpc_client, + &rpc_sender_client, + transactions, + blockhash, + &keypair, + ) + .await; + } + + let transactions = get_claim_transactions_for_valid_unclaimed( + &rpc_client, + merkle_trees, + tip_distribution_program_id, + micro_lamports, + keypair.pubkey(), + ) + .await?; + if transactions.is_empty() { + return Ok(()); + } + + // if more transactions left, we'll simulate them all to make sure its not an uncaught error + let mut is_error = false; + let mut error_str = String::new(); + for tx in &transactions { + match rpc_client + .simulate_transaction_with_config( + tx, + RpcSimulateTransactionConfig { + sig_verify: false, + replace_recent_blockhash: true, + commitment: Some(CommitmentConfig::processed()), + ..RpcSimulateTransactionConfig::default() + }, + ) + .await + { + Ok(_) => {} + Err(e) => { + error_str = e.to_string(); + is_error = true; + + match e.get_transaction_error() { + None => { + break; + } + Some(e) => { + warn!("transaction error. tx: {:?} error: {:?}", tx, e); + break; + } + } + } + } + } + + if is_error { + Err(ClaimMevError::UncaughtError { e: error_str }) + } else { + Err(ClaimMevError::NotFinished { + transactions_left: transactions.len(), + }) + } +} + +pub async fn get_claim_transactions_for_valid_unclaimed( + rpc_client: &RpcClient, + merkle_trees: &GeneratedMerkleTreeCollection, + tip_distribution_program_id: Pubkey, + micro_lamports: u64, + payer_pubkey: Pubkey, +) -> Result, ClaimMevError> { + let tree_nodes = merkle_trees + .generated_merkle_trees + .iter() + .flat_map(|tree| &tree.tree_nodes) + .collect_vec(); + + info!( + "reading tip distribution related accounts for epoch {}", + merkle_trees.epoch + ); + + let start = Instant::now(); + + let tda_pubkeys = merkle_trees + .generated_merkle_trees + .iter() + .map(|tree| tree.tip_distribution_account) + .collect_vec(); + let tdas: HashMap = get_batched_accounts(rpc_client, &tda_pubkeys) + .await? + .into_iter() + .filter_map(|(pubkey, a)| Some((pubkey, a?))) + .collect(); + + let claimant_pubkeys = tree_nodes + .iter() + .map(|tree_node| tree_node.claimant) + .collect_vec(); + let claimants: HashMap = get_batched_accounts(rpc_client, &claimant_pubkeys) + .await? + .into_iter() + .filter_map(|(pubkey, a)| Some((pubkey, a?))) + .collect(); + + let claim_status_pubkeys = tree_nodes + .iter() + .map(|tree_node| tree_node.claim_status_pubkey) + .collect_vec(); + let claim_statuses: HashMap = + get_batched_accounts(rpc_client, &claim_status_pubkeys) + .await? + .into_iter() + .filter_map(|(pubkey, a)| Some((pubkey, a?))) + .collect(); + + let elapsed_us = start.elapsed().as_micros(); + + // can be helpful for determining mismatch in state between requested and read + datapoint_info!( + "tip_router_cli.get_claim_transactions_account_data", + ("elapsed_us", elapsed_us, i64), + ("tdas", tda_pubkeys.len(), i64), + ("tdas_onchain", tdas.len(), i64), + ("claimants", claimant_pubkeys.len(), i64), + ("claimants_onchain", claimants.len(), i64), + ("claim_statuses", claim_status_pubkeys.len(), i64), + ("claim_statuses_onchain", claim_statuses.len(), i64), + ); + + let transactions = build_mev_claim_transactions( + tip_distribution_program_id, + merkle_trees, + tdas, + claimants, + claim_statuses, + micro_lamports, + payer_pubkey, + ); + + Ok(transactions) +} + +/// Returns a list of claim transactions for valid, unclaimed MEV tips +/// A valid, unclaimed transaction consists of the following: +/// - there must be lamports to claim for the tip distribution account. +/// - there must be a merkle root. +/// - the claimant (typically a stake account) must exist. +/// - the claimant (typically a stake account) must have a non-zero amount of tips to claim +/// - the claimant must have enough lamports post-claim to be rent-exempt. +/// - note: there aren't any rent exempt accounts on solana mainnet anymore. +/// - it must not have already been claimed. +fn build_mev_claim_transactions( + tip_distribution_program_id: Pubkey, + merkle_trees: &GeneratedMerkleTreeCollection, + tdas: HashMap, + claimants: HashMap, + claim_status: HashMap, + micro_lamports: u64, + payer_pubkey: Pubkey, +) -> Vec { + let tip_distribution_accounts: HashMap = tdas + .iter() + .filter_map(|(pubkey, account)| { + Some(( + *pubkey, + TipDistributionAccount::try_deserialize(&mut account.data.as_slice()).ok()?, + )) + }) + .collect(); + + let claim_statuses: HashMap = claim_status + .iter() + .filter_map(|(pubkey, account)| { + Some(( + *pubkey, + ClaimStatus::try_deserialize(&mut account.data.as_slice()).ok()?, + )) + }) + .collect(); + + datapoint_info!( + "tip_router_cli.build_mev_claim_transactions", + ( + "tip_distribution_accounts", + tip_distribution_accounts.len(), + i64 + ), + ("claim_statuses", claim_statuses.len(), i64), + ); + + let tip_distribution_config = + Pubkey::find_program_address(&[CONFIG_SEED], &tip_distribution_program_id).0; + + let mut instructions = Vec::with_capacity(claimants.len()); + for tree in &merkle_trees.generated_merkle_trees { + if tree.max_total_claim == 0 { + continue; + } + + // if unwrap panics, there's a bug in the merkle tree code because the merkle tree code relies on the state + // of the chain to claim. + let tip_distribution_account = tip_distribution_accounts + .get(&tree.tip_distribution_account) + .unwrap(); + + // can continue here, as there might be tip distribution accounts this account doesn't upload for + if tip_distribution_account.merkle_root.is_none() { + continue; + } + + for node in &tree.tree_nodes { + // doesn't make sense to claim for claimants that don't exist anymore + // can't claim for something already claimed + // don't need to claim for claimants that get 0 MEV + if claimants.get(&node.claimant).is_none() + || claim_statuses.get(&node.claim_status_pubkey).is_some() + || node.amount == 0 + { + continue; + } + + instructions.push(jito_tip_distribution_sdk::instruction::claim_ix( + tip_distribution_config, + tree.tip_distribution_account, + node.claim_status_pubkey, + node.claimant, + payer_pubkey, + system_program::id(), + node.proof.clone().unwrap(), + node.amount, + node.claim_status_bump, + )); + } + } + + // TODO (LB): see if we can do >1 claim here + let transactions: Vec = instructions + .into_iter() + .map(|claim_ix| { + // helps get txs into block easier since default is 400k CUs + let compute_limit_ix = ComputeBudgetInstruction::set_compute_unit_limit(60_000); + let priority_fee_ix = ComputeBudgetInstruction::set_compute_unit_price(micro_lamports); + Transaction::new_with_payer( + &[compute_limit_ix, priority_fee_ix, claim_ix], + Some(&payer_pubkey), + ) + }) + .collect(); + + transactions +} + +/// heuristic to make sure we have enough funds to cover the rent costs if epoch has many validators +/// If insufficient funds, returns start balance, desired balance, and amount of sol to deposit +async fn is_sufficient_balance( + payer: &Pubkey, + rpc_client: &RpcClient, + instruction_count: u64, +) -> Option<(u64, u64, u64)> { + let start_balance = rpc_client + .get_balance(payer) + .await + .expect("Failed to get starting balance"); + // most amounts are for 0 lamports. had 1736 non-zero claims out of 164742 + let min_rent_per_claim = rpc_client + .get_minimum_balance_for_rent_exemption(CLAIM_STATUS_SIZE) + .await + .expect("Failed to calculate min rent"); + let desired_balance = instruction_count + .checked_mul( + min_rent_per_claim + .checked_add(DEFAULT_TARGET_LAMPORTS_PER_SIGNATURE) + .unwrap(), + ) + .unwrap(); + if start_balance < desired_balance { + let sol_to_deposit = desired_balance + .checked_sub(start_balance) + .unwrap() + .checked_add(LAMPORTS_PER_SOL) + .unwrap() + .checked_sub(1) + .unwrap() + .checked_div(LAMPORTS_PER_SOL) + .unwrap(); // rounds up to nearest sol + Some((start_balance, desired_balance, sol_to_deposit)) + } else { + None + } +} diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index bd98f2be..1a41ae13 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -2,10 +2,12 @@ pub mod ledger_utils; pub mod stake_meta_generator; pub mod tip_router; pub use crate::cli::{Cli, Commands}; +pub mod claim; pub mod cli; pub use crate::process_epoch::process_epoch; pub mod backup_snapshots; pub mod process_epoch; +pub mod rpc_utils; pub mod submit; use std::path::{Path, PathBuf}; diff --git a/tip-router-operator-cli/src/rpc_utils.rs b/tip-router-operator-cli/src/rpc_utils.rs new file mode 100644 index 00000000..27b7a346 --- /dev/null +++ b/tip-router-operator-cli/src/rpc_utils.rs @@ -0,0 +1,148 @@ +use std::{ + collections::{HashMap, HashSet}, + sync::Arc, + time::Duration, +}; + +use log::{info, warn}; +use solana_client::{ + nonblocking::rpc_client::RpcClient, rpc_client::SerializableTransaction, + rpc_config::RpcSendTransactionConfig, rpc_request::MAX_MULTIPLE_ACCOUNTS, +}; +use solana_sdk::{ + account::Account, + commitment_config::{CommitmentConfig, CommitmentLevel}, + hash::Hash, + pubkey::Pubkey, + signature::{Keypair, Signature}, + transaction::{Transaction, TransactionError}, +}; +use solana_transaction_status::TransactionStatus; +use tokio::time::sleep; + +pub async fn get_batched_accounts( + rpc_client: &RpcClient, + pubkeys: &[Pubkey], +) -> solana_rpc_client_api::client_error::Result>> { + let mut batched_accounts = HashMap::new(); + + for pubkeys_chunk in pubkeys.chunks(MAX_MULTIPLE_ACCOUNTS) { + let accounts = rpc_client.get_multiple_accounts(pubkeys_chunk).await?; + batched_accounts.extend(pubkeys_chunk.iter().cloned().zip(accounts)); + } + Ok(batched_accounts) +} + +pub async fn send_until_blockhash_expires( + rpc_client: &RpcClient, + rpc_sender_client: &RpcClient, + transactions: Vec, + blockhash: Hash, + keypair: &Arc, +) -> solana_rpc_client_api::client_error::Result<()> { + let mut claim_transactions: HashMap = transactions + .into_iter() + .map(|mut tx| { + tx.sign(&[&keypair], blockhash); + (*tx.get_signature(), tx) + }) + .collect(); + + let txs_requesting_send = claim_transactions.len(); + + while rpc_client + .is_blockhash_valid(&blockhash, CommitmentConfig::processed()) + .await? + { + let mut check_signatures = HashSet::with_capacity(claim_transactions.len()); + let mut already_processed = HashSet::with_capacity(claim_transactions.len()); + let mut is_blockhash_not_found = false; + + for (signature, tx) in &claim_transactions { + match rpc_sender_client + .send_transaction_with_config( + tx, + RpcSendTransactionConfig { + skip_preflight: false, + preflight_commitment: Some(CommitmentLevel::Confirmed), + max_retries: Some(2), + ..RpcSendTransactionConfig::default() + }, + ) + .await + { + Ok(_) => { + check_signatures.insert(*signature); + } + Err(e) => match e.get_transaction_error() { + Some(TransactionError::BlockhashNotFound) => { + is_blockhash_not_found = true; + break; + } + Some(TransactionError::AlreadyProcessed) => { + already_processed.insert(*tx.get_signature()); + } + Some(e) => { + warn!( + "TransactionError sending signature: {} error: {:?} tx: {:?}", + tx.get_signature(), + e, + tx + ); + } + None => { + warn!( + "Unknown error sending transaction signature: {} error: {:?}", + tx.get_signature(), + e + ); + } + }, + } + } + + sleep(Duration::from_secs(10)).await; + + let signatures: Vec = check_signatures.iter().cloned().collect(); + let statuses = get_batched_signatures_statuses(rpc_client, &signatures).await?; + + for (signature, maybe_status) in &statuses { + if let Some(_status) = maybe_status { + claim_transactions.remove(signature); + check_signatures.remove(signature); + } + } + + for signature in already_processed { + claim_transactions.remove(&signature); + } + + if claim_transactions.is_empty() || is_blockhash_not_found { + break; + } + } + + let num_landed = txs_requesting_send + .checked_sub(claim_transactions.len()) + .unwrap(); + info!("num_landed: {:?}", num_landed); + + Ok(()) +} + +pub async fn get_batched_signatures_statuses( + rpc_client: &RpcClient, + signatures: &[Signature], +) -> solana_rpc_client_api::client_error::Result)>> { + let mut signature_statuses = Vec::new(); + + for signatures_batch in signatures.chunks(100) { + // was using get_signature_statuses_with_history, but it blocks if the signatures don't exist + // bigtable calls to read signatures that don't exist block forever w/o --rpc-bigtable-timeout argument set + // get_signature_statuses looks in status_cache, which only has a 150 block history + // may have false negative, but for this workflow it doesn't matter + let statuses = rpc_client.get_signature_statuses(signatures_batch).await?; + signature_statuses.extend(signatures_batch.iter().cloned().zip(statuses.value)); + } + Ok(signature_statuses) +} From 6b78aa905f791865c3bbae729ab84025becb482e Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Thu, 23 Jan 2025 16:50:54 -0500 Subject: [PATCH 024/112] add claim command to CLI --- meta_merkle_tree/src/generated_merkle_tree.rs | 9 +++ tip-router-operator-cli/src/cli.rs | 13 ++++ tip-router-operator-cli/src/lib.rs | 43 +++++++++++++- tip-router-operator-cli/src/main.rs | 59 ++++++++++++++++++- tip-router-operator-cli/src/process_epoch.rs | 1 + 5 files changed, 122 insertions(+), 3 deletions(-) diff --git a/meta_merkle_tree/src/generated_merkle_tree.rs b/meta_merkle_tree/src/generated_merkle_tree.rs index 00a05499..18fb4616 100644 --- a/meta_merkle_tree/src/generated_merkle_tree.rs +++ b/meta_merkle_tree/src/generated_merkle_tree.rs @@ -108,6 +108,15 @@ impl GeneratedMerkleTreeCollection { slot: stake_meta_collection.slot, }) } + + /// Load a serialized GeneratedMerkleTreeCollection from file path + pub fn new_from_file(path: &PathBuf) -> Result { + let file = File::open(path)?; + let reader = BufReader::new(file); + let tree: Self = serde_json::from_reader(reader)?; + + Ok(tree) + } } #[derive(Clone, Eq, Debug, Hash, PartialEq, Deserialize, Serialize)] diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index 3bdb794e..d67728bf 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -96,4 +96,17 @@ pub enum Commands { #[arg(long, env)] epoch: u64, }, + ClaimTips { + /// Tip distribution program ID + #[arg(long, env)] + tip_distribution_program_id: Pubkey, + + /// The price to pay for priority fee + #[arg(long, env, default_value_t = 1)] + micro_lamports: u64, + + /// The epoch to Claim tips for + #[arg(long, env)] + epoch: u64, + }, } diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index 1a41ae13..6a8c5ed1 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -24,7 +24,7 @@ use log::info; use meta_merkle_tree::{ generated_merkle_tree::GeneratedMerkleTreeCollection, meta_merkle_tree::MetaMerkleTree, }; -use solana_metrics::datapoint_info; +use solana_metrics::{datapoint_error, datapoint_info}; use solana_sdk::{account::AccountSharedData, pubkey::Pubkey, slot_history::Slot}; #[derive(Debug)] @@ -88,6 +88,7 @@ pub fn get_meta_merkle_root( epoch: u64, protocol_fee_bps: u64, snapshots_enabled: bool, + meta_merkle_tree_dir: &PathBuf, ) -> std::result::Result { let start = Instant::now(); @@ -160,6 +161,46 @@ pub fn get_meta_merkle_root( ("duration_ms", start.elapsed().as_millis() as i64, i64) ); + // REVIEW: Determine if this should be behind a flag for when operator intends to run the + // claim process. + + // Write GeneratedMerkleTreeCollection to disk. Required for Claiming + let merkle_tree_coll_path = + meta_merkle_tree_dir.join(format!("merkle_tree_coll_{}.json", epoch)); + let generated_merkle_tree_col_json = match serde_json::to_string(&merkle_tree_coll_path) { + Ok(json) => json, + Err(e) => { + datapoint_error!( + "tip_router_cli.process_epoch", + ("operator_address", operator_address.to_string(), String), + ("epoch", epoch, i64), + ("status", "error", String), + ("error", format!("{:?}", e), String), + ("state", "merkle_root_serialization", String), + ("duration_ms", start.elapsed().as_millis() as i64, i64) + ); + return Err(MerkleRootError::MerkleRootGeneratorError( + "Failed to serialize merkle tree collection", + )); + } + }; + + if let Err(e) = std::fs::write(&merkle_tree_coll_path, generated_merkle_tree_col_json) { + datapoint_error!( + "tip_router_cli.process_epoch", + ("operator_address", operator_address.to_string(), String), + ("epoch", epoch, i64), + ("status", "error", String), + ("error", format!("{:?}", e), String), + ("state", "merkle_root_file_write", String), + ("duration_ms", start.elapsed().as_millis() as i64, i64) + ); + // TODO: propogate error + return Err(MerkleRootError::MerkleRootGeneratorError( + "Failed to write meta merkle tree to file", + )); + } + // Convert to MetaMerkleTree let meta_merkle_tree = MetaMerkleTree::new_from_generated_merkle_tree_collection( merkle_tree_coll, diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 1c1b9489..616e1d15 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -3,7 +3,8 @@ use ::{ clap::Parser, ellipsis_client::{ClientSubset, EllipsisClient}, log::{error, info}, - solana_metrics::set_host_id, + meta_merkle_tree::generated_merkle_tree::GeneratedMerkleTreeCollection, + solana_metrics::{datapoint_error, datapoint_info, set_host_id}, solana_rpc_client::rpc_client::RpcClient, solana_sdk::{ clock::DEFAULT_SLOTS_PER_EPOCH, @@ -11,9 +12,15 @@ use ::{ signer::{keypair::read_keypair_file, Signer}, transaction::Transaction, }, - std::{path::PathBuf, str::FromStr, time::Duration}, + std::{ + path::PathBuf, + str::FromStr, + sync::Arc, + time::{Duration, Instant}, + }, tip_router_operator_cli::{ backup_snapshots::BackupSnapshotMonitor, + claim::claim_mev_tips, cli::{Cli, Commands}, process_epoch::{get_previous_epoch_last_slot, process_epoch, wait_for_next_epoch}, submit::{submit_recent_epochs_to_ncn, submit_to_ncn}, @@ -224,6 +231,54 @@ async fn main() -> Result<()> { ) .await?; } + Commands::ClaimTips { + tip_distribution_program_id, + micro_lamports, + epoch, + } => { + let start = Instant::now(); + info!("Claiming tips..."); + + let arc_keypair = Arc::new(keypair); + // Load the GeneratedMerkleTreeCollection, which should have been previously generated + let merkle_tree_coll_path = PathBuf::from(format!( + "{}/merkle_tree_coll_{}.json", + cli.meta_merkle_tree_dir.display(), + epoch + )); + let merkle_tree_coll = + GeneratedMerkleTreeCollection::new_from_file(&merkle_tree_coll_path)?; + match claim_mev_tips( + &merkle_tree_coll, + cli.rpc_url.clone(), + // TODO: Review if we should offer separate send_url. This may be used if sending + // via block engine. + cli.rpc_url, + tip_distribution_program_id, + arc_keypair, + Duration::from_secs(3600), + micro_lamports, + ) + .await + { + Err(e) => { + datapoint_error!( + "claim_mev_workflow-claim_error", + ("epoch", epoch, i64), + ("error", 1, i64), + ("err_str", e.to_string(), String), + ("elapsed_us", start.elapsed().as_micros(), i64), + ); + } + Ok(()) => { + datapoint_info!( + "claim_mev_workflow-claim_completion", + ("epoch", epoch, i64), + ("elapsed_us", start.elapsed().as_micros(), i64), + ); + } + } + } } Ok(()) } diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index 28e5441a..07f1da2e 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -92,6 +92,7 @@ pub async fn process_epoch( target_epoch, adjusted_total_fees, snapshots_enabled, + &meta_merkle_tree_dir, ) { Ok(tree) => { datapoint_info!( From 4574cd73c6a0310a262131178e3e39da1367fbcd Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Thu, 23 Jan 2025 18:58:43 -0500 Subject: [PATCH 025/112] update todo --- tip-router-operator-cli/src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 616e1d15..c1d50355 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -251,8 +251,8 @@ async fn main() -> Result<()> { match claim_mev_tips( &merkle_tree_coll, cli.rpc_url.clone(), - // TODO: Review if we should offer separate send_url. This may be used if sending - // via block engine. + // TODO: Review if we should offer separate rpc_send_url in CLI. This may be used + // if sending via block engine. cli.rpc_url, tip_distribution_program_id, arc_keypair, From c95264025e87ffcdfb1b2c6907126b9b153b9c11 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Thu, 23 Jan 2025 18:59:55 -0500 Subject: [PATCH 026/112] update other todo --- tip-router-operator-cli/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index 6a8c5ed1..fcbc7061 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -161,8 +161,8 @@ pub fn get_meta_merkle_root( ("duration_ms", start.elapsed().as_millis() as i64, i64) ); - // REVIEW: Determine if this should be behind a flag for when operator intends to run the - // claim process. + // TODO: Hide this behind a flag when the process gets split up into the various stages and + // checkpoints. // Write GeneratedMerkleTreeCollection to disk. Required for Claiming let merkle_tree_coll_path = From 46cff8401ca7ac0096d46c8811b29147059712a4 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Thu, 23 Jan 2025 19:30:05 -0500 Subject: [PATCH 027/112] fix bug and tests --- tip-router-operator-cli/src/lib.rs | 2 +- tip-router-operator-cli/src/main.rs | 2 +- tip-router-operator-cli/tests/integration_tests.rs | 6 ++---- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index fcbc7061..27497e09 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -167,7 +167,7 @@ pub fn get_meta_merkle_root( // Write GeneratedMerkleTreeCollection to disk. Required for Claiming let merkle_tree_coll_path = meta_merkle_tree_dir.join(format!("merkle_tree_coll_{}.json", epoch)); - let generated_merkle_tree_col_json = match serde_json::to_string(&merkle_tree_coll_path) { + let generated_merkle_tree_col_json = match serde_json::to_string(&merkle_tree_coll) { Ok(json) => json, Err(e) => { datapoint_error!( diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index c1d50355..e2d09b42 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -251,7 +251,7 @@ async fn main() -> Result<()> { match claim_mev_tips( &merkle_tree_coll, cli.rpc_url.clone(), - // TODO: Review if we should offer separate rpc_send_url in CLI. This may be used + // TODO: Review if we should offer separate rpc_send_url in CLI. This may be used // if sending via block engine. cli.rpc_url, tip_distribution_program_id, diff --git a/tip-router-operator-cli/tests/integration_tests.rs b/tip-router-operator-cli/tests/integration_tests.rs index 769a307f..8854dfa8 100644 --- a/tip-router-operator-cli/tests/integration_tests.rs +++ b/tip-router-operator-cli/tests/integration_tests.rs @@ -186,10 +186,7 @@ impl TestContext { async fn test_meta_merkle_creation_from_ledger() { // 1. Setup - create necessary variables/arguments let ledger_path = Path::new("tests/fixtures/test-ledger"); - let account_paths = vec![ - PathBuf::from("tests/fixtures/accounts"), - PathBuf::from("path/to/account2"), - ]; + let account_paths = vec![ledger_path.join("accounts/run")]; let full_snapshots_path = PathBuf::from("tests/fixtures/test-ledger"); let desired_slot = &144; let tip_distribution_program_id = &TIP_DISTRIBUTION_ID; @@ -215,6 +212,7 @@ async fn test_meta_merkle_creation_from_ledger() { epoch, PROTOCOL_FEE_BPS, false, + &ledger_path.to_path_buf(), ) .unwrap(); From 80fa8d97b1ab62a65f5dda86ba9f9a9ec325282f Mon Sep 17 00:00:00 2001 From: Evan B Date: Thu, 23 Jan 2025 20:50:26 -0500 Subject: [PATCH 028/112] Smart backup (#71) --- .../src/backup_snapshots.rs | 155 ++++++++++++------ tip-router-operator-cli/src/ledger_utils.rs | 8 +- tip-router-operator-cli/src/lib.rs | 17 +- tip-router-operator-cli/src/main.rs | 7 + tip-router-operator-cli/src/process_epoch.rs | 45 ++++- .../src/stake_meta_generator.rs | 18 +- 6 files changed, 186 insertions(+), 64 deletions(-) diff --git a/tip-router-operator-cli/src/backup_snapshots.rs b/tip-router-operator-cli/src/backup_snapshots.rs index c5a4b9a6..b7350c79 100644 --- a/tip-router-operator-cli/src/backup_snapshots.rs +++ b/tip-router-operator-cli/src/backup_snapshots.rs @@ -7,17 +7,19 @@ use tokio::time; use crate::process_epoch::get_previous_epoch_last_slot; +const MAXIMUM_BACKUP_INCREMENTAL_SNAPSHOTS_PER_EPOCH: usize = 3; + /// Represents a parsed incremental snapshot filename #[derive(Debug)] -struct SnapshotInfo { +pub struct SnapshotInfo { path: PathBuf, _start_slot: u64, - end_slot: u64, + pub end_slot: u64, } impl SnapshotInfo { /// Try to parse a snapshot filename into slot information - fn from_path(path: PathBuf) -> Option { + pub fn from_path(path: PathBuf) -> Option { let file_name = path.file_name()?.to_str()?; // Only try to parse if it's an incremental snapshot @@ -67,25 +69,32 @@ impl BackupSnapshotMonitor { } /// Gets target slot for current epoch - fn get_target_slot(&self) -> Result { + fn get_target_slots(&self) -> Result<(u64, u64)> { + // Get the last slot of the current epoch + let (_, last_epoch_target_slot) = get_previous_epoch_last_slot(&self.rpc_client)?; + let next_epoch_target_slot = last_epoch_target_slot + DEFAULT_SLOTS_PER_EPOCH; + if let Some(target_slot) = self.override_target_slot { - return Ok(target_slot); + return Ok((last_epoch_target_slot, target_slot)); } - // Get the last slot of the current epoch - let (_, last_slot) = get_previous_epoch_last_slot(&self.rpc_client)?; - Ok(last_slot + DEFAULT_SLOTS_PER_EPOCH) + Ok((last_epoch_target_slot, next_epoch_target_slot)) } /// Finds the most recent incremental snapshot that's before our target slot fn find_closest_incremental(&self, target_slot: u64) -> Option { let dir_entries = std::fs::read_dir(&self.snapshots_dir).ok()?; - // Find the snapshot that ends closest to but not after target_slot + // Find the snapshot that ends closest to but not after target_slot, in the same epoch dir_entries .filter_map(Result::ok) .filter_map(|entry| SnapshotInfo::from_path(entry.path())) - .filter(|snap| snap.end_slot <= target_slot) + .filter(|snap| { + let before_target_slot = snap.end_slot <= target_slot; + let in_same_epoch = (snap.end_slot / DEFAULT_SLOTS_PER_EPOCH) + == (target_slot / DEFAULT_SLOTS_PER_EPOCH); + before_target_slot && in_same_epoch + }) .max_by_key(|snap| snap.end_slot) .map(|snap| snap.path) } @@ -143,13 +152,34 @@ impl BackupSnapshotMonitor { Ok(()) } + fn evict_all_epoch_snapshots(&self, epoch: u64) -> Result<()> { + let dir_entries = std::fs::read_dir(&self.backup_dir)?; + + // Find all snapshots for the given epoch and remove them + dir_entries + .filter_map(Result::ok) + .filter_map(|entry| SnapshotInfo::from_path(entry.path())) + .filter(|snap| snap.end_slot / DEFAULT_SLOTS_PER_EPOCH == epoch) + .try_for_each(|snapshot| { + log::debug!( + "Removing old snapshot from epoch {} with slot {}: {:?}", + epoch, + snapshot.end_slot, + snapshot.path + ); + std::fs::remove_file(snapshot.path.as_path()) + })?; + + Ok(()) + } + fn evict_same_epoch_incremental(&self, target_slot: u64) -> Result<()> { let slots_per_epoch = DEFAULT_SLOTS_PER_EPOCH; let target_epoch = target_slot / slots_per_epoch; let dir_entries = std::fs::read_dir(&self.backup_dir)?; - // Find the snapshot that ends closest to but not after target_slot + // Find all snapshots for the given epoch let mut same_epoch_snapshots: Vec = dir_entries .filter_map(Result::ok) .filter_map(|entry| SnapshotInfo::from_path(entry.path())) @@ -159,58 +189,87 @@ impl BackupSnapshotMonitor { // Sort by end_slot ascending so we can remove oldest same_epoch_snapshots.sort_by_key(|snap| snap.end_slot); - // Remove oldest snapshot - if let Some(oldest_snapshot) = same_epoch_snapshots.first() { - log::debug!( - "Removing old snapshot from epoch {} with slot {}: {:?}", - target_epoch, - oldest_snapshot.end_slot, - oldest_snapshot.path - ); - std::fs::remove_file(oldest_snapshot.path.as_path())?; + // Remove oldest snapshots if we have more than MAXIMUM_BACKUP_INCREMENTAL_SNAPSHOTS_PER_EPOCH + while same_epoch_snapshots.len() > MAXIMUM_BACKUP_INCREMENTAL_SNAPSHOTS_PER_EPOCH { + if let Some(oldest_snapshot) = same_epoch_snapshots.first() { + log::debug!( + "Removing old snapshot from epoch {} with slot {}: {:?}", + target_epoch, + oldest_snapshot.end_slot, + oldest_snapshot.path + ); + std::fs::remove_file(oldest_snapshot.path.as_path())?; + same_epoch_snapshots.remove(0); + } } Ok(()) } + async fn backup_latest_for_target_slot( + &self, + mut current_backup_path: Option, + target_slot: u64, + ) -> Option { + if let Some(snapshot) = self.find_closest_incremental(target_slot) { + if current_backup_path.as_ref() != Some(&snapshot) { + log::debug!( + "Found new best snapshot for slot {}: {:?}", + target_slot, + snapshot + ); + + if let Err(e) = self.backup_incremental_snapshot(&snapshot).await { + log::error!("Failed to backup snapshot: {}", e); + return current_backup_path; + } + + current_backup_path = Some(snapshot); + + // After saving best snapshot, evict oldest one from same epoch + if let Err(e) = self.evict_same_epoch_incremental(target_slot) { + log::error!("Failed to evict old snapshots: {}", e); + } + } + } + + current_backup_path + } + + /// Runs the snapshot backup process to continually back up the latest incremental snapshot for the previous epoch and the current epoch + /// Keeps at most MAXIMUM_BACKUP_INCREMENTAL_SNAPSHOTS_PER_EPOCH snapshots per epoch in the backup + /// Purges old incremental snapshots in the backup after 2 epochs pub async fn run(&self) -> Result<()> { let mut interval = time::interval(Duration::from_secs(10)); - let mut last_target_slot = None; - let mut last_backup_path = None; + let mut current_target_slot = None; + let mut last_epoch_backup_path = None; + let mut this_epoch_backup_path = None; loop { interval.tick().await; - let target_slot = self.get_target_slot()?; + let (last_epoch_target_slot, this_epoch_target_slot) = self.get_target_slots()?; - // Only search for new snapshot if target slot has changed - if last_target_slot != Some(target_slot) { - log::info!("New target slot: {}", target_slot); - } - - if let Some(snapshot) = self.find_closest_incremental(target_slot) { - if last_backup_path.as_ref() != Some(&snapshot) { - log::debug!( - "Found new best snapshot for slot {}: {:?}", - target_slot, - snapshot - ); - - if let Err(e) = self.backup_incremental_snapshot(&snapshot).await { - log::error!("Failed to backup snapshot: {}", e); - continue; - } - - last_backup_path = Some(snapshot); - - // After saving best snapshot, evict oldest one from same epoch - if let Err(e) = self.evict_same_epoch_incremental(target_slot) { - log::error!("Failed to evict old snapshots: {}", e); - } + // Detect new epoch + if current_target_slot != Some(this_epoch_target_slot) { + log::info!("New target slot: {}", this_epoch_target_slot); + last_epoch_backup_path = this_epoch_backup_path; + this_epoch_backup_path = None; + let current_epoch = this_epoch_target_slot / DEFAULT_SLOTS_PER_EPOCH; + if let Err(e) = self.evict_all_epoch_snapshots(current_epoch - 2) { + log::error!("Failed to evict old snapshots: {}", e); } } - last_target_slot = Some(target_slot); + // Backup latest snapshot for last epoch and this epoch + last_epoch_backup_path = self + .backup_latest_for_target_slot(last_epoch_backup_path, last_epoch_target_slot) + .await; + this_epoch_backup_path = self + .backup_latest_for_target_slot(this_epoch_backup_path, this_epoch_target_slot) + .await; + + current_target_slot = Some(this_epoch_target_slot); } } } diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index 8341dafe..9c8586c7 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -60,7 +60,7 @@ pub fn get_bank_from_ledger( ("status", "error", String), ("state", "load_genesis", String), ("step", 1, i64), - ("error", e.to_string(), String), + ("error", format!("{:?}", e), String), ); panic!("Failed to load genesis config: {}", e); // TODO should panic here? } @@ -195,7 +195,7 @@ pub fn get_bank_from_ledger( ("state", "load_bank_forks", String), ("status", "error", String), ("step", 4, i64), - ("error", e.to_string(), String), + ("error", format!("{:?}", e), String), ("duration_ms", start_time.elapsed().as_millis() as i64, i64), ); panic!("Failed to load bank forks: {}", e); @@ -230,7 +230,7 @@ pub fn get_bank_from_ledger( ("status", "error", String), ("state", "process_blockstore_from_root", String), ("step", 5, i64), - ("error", e.to_string(), String), + ("error", format!("{:?}", e), String), ("duration_ms", start_time.elapsed().as_millis() as i64, i64), ); panic!("Failed to process blockstore from root: {}", e); @@ -268,7 +268,7 @@ pub fn get_bank_from_ledger( ("status", "error", String), ("state", "bank_to_full_snapshot_archive", String), ("step", 6, i64), - ("error", e.to_string(), String), + ("error", format!("{:?}", e), String), ("duration_ms", start_time.elapsed().as_millis() as i64, i64), ); panic!("Failed to create snapshot: {}", e); diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index bd98f2be..03a7f53c 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -27,9 +27,9 @@ use solana_sdk::{account::AccountSharedData, pubkey::Pubkey, slot_history::Slot} #[derive(Debug)] pub enum MerkleRootError { - StakeMetaGeneratorError(&'static str), - MerkleRootGeneratorError(&'static str), - MerkleTreeError(&'static str), + StakeMetaGeneratorError(String), + MerkleRootGeneratorError(String), + MerkleTreeError(String), } // TODO where did these come from? @@ -111,7 +111,9 @@ pub fn get_meta_merkle_root( tip_payment_program_id, snapshots_enabled, ) - .map_err(|_| MerkleRootError::StakeMetaGeneratorError("Failed to generate stake meta"))?; + .map_err(|e| { + MerkleRootError::StakeMetaGeneratorError(format!("Failed to generate stake meta: {:?}", e)) + })?; info!( "Created StakeMetaCollection:\n - epoch: {:?}\n - slot: {:?}\n - num stake metas: {:?}\n - bank_hash: {:?}", @@ -138,7 +140,9 @@ pub fn get_meta_merkle_root( protocol_fee_bps, ) .map_err(|_| { - MerkleRootError::MerkleRootGeneratorError("Failed to generate merkle tree collection") + MerkleRootError::MerkleRootGeneratorError( + "Failed to generate merkle tree collection".to_string(), + ) })?; info!( @@ -163,8 +167,7 @@ pub fn get_meta_merkle_root( merkle_tree_coll, ) .map_err(|e| { - info!("Meta merkle tree creation error: {:?}", e); - MerkleRootError::MerkleTreeError("Failed to create meta merkle tree") + MerkleRootError::MerkleTreeError(format!("Failed to create meta merkle tree: {:?}", e)) })?; info!( diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 1c1b9489..19bba7a3 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -126,6 +126,9 @@ async fn main() -> Result<()> { wait_for_next_epoch(&rpc_client).await?; } + // Track runs that are starting right at the beginning of a new epoch + let mut new_epoch_rollover = start_next_epoch; + loop { // Get the last slot of the previous epoch let (previous_epoch, previous_epoch_slot) = @@ -148,6 +151,7 @@ async fn main() -> Result<()> { &tip_router_program_id, &ncn_address, enable_snapshots, + new_epoch_rollover, &cli, ) .await @@ -163,6 +167,8 @@ async fn main() -> Result<()> { error!("Error waiting for next epoch: {}", e); sleep(Duration::from_secs(60)).await; } + + new_epoch_rollover = true; } } Commands::SnapshotSlot { @@ -185,6 +191,7 @@ async fn main() -> Result<()> { &tip_router_program_id, &ncn_address, enable_snapshots, + false, &cli, ) .await diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index 28e5441a..dd3e1d5d 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -1,4 +1,5 @@ use std::{ + path::PathBuf, str::FromStr, time::{Duration, Instant}, }; @@ -9,8 +10,14 @@ use log::info; use solana_metrics::{datapoint_error, datapoint_info}; use solana_rpc_client::rpc_client::RpcClient; use solana_sdk::pubkey::Pubkey; +use tokio::time; -use crate::{get_meta_merkle_root, tip_router::get_ncn_config, Cli}; +use crate::{ + backup_snapshots::SnapshotInfo, get_meta_merkle_root, tip_router::get_ncn_config, Cli, +}; + +const MAX_WAIT_FOR_INCREMENTAL_SNAPSHOT_TICKS: u64 = 1200; // Experimentally determined +const OPTIMAL_INCREMENTAL_SNAPSHOT_SLOT_RANGE: u64 = 800; // Experimentally determined pub async fn wait_for_next_epoch(rpc_client: &RpcClient) -> Result<()> { let current_epoch = rpc_client.get_epoch_info()?.epoch; @@ -45,6 +52,35 @@ pub fn get_previous_epoch_last_slot(rpc_client: &RpcClient) -> Result<(u64, u64) Ok((previous_epoch, previous_epoch_final_slot)) } +/// Wait for the optimal incremental snapshot to be available to speed up full snapshot generation +/// Automatically returns after MAX_WAIT_FOR_INCREMENTAL_SNAPSHOT_TICKS seconds +pub async fn wait_for_optimal_incremental_snapshot( + incremental_snapshots_dir: PathBuf, + target_slot: u64, +) -> Result<()> { + let mut interval = time::interval(Duration::from_secs(1)); + let mut ticks = 0; + + while ticks < MAX_WAIT_FOR_INCREMENTAL_SNAPSHOT_TICKS { + let dir_entries = std::fs::read_dir(&incremental_snapshots_dir)?; + + for entry in dir_entries { + if let Some(snapshot_info) = SnapshotInfo::from_path(entry?.path()) { + if target_slot - OPTIMAL_INCREMENTAL_SNAPSHOT_SLOT_RANGE < snapshot_info.end_slot + && snapshot_info.end_slot <= target_slot + { + return Ok(()); + } + } + } + + interval.tick().await; + ticks += 1; + } + + Ok(()) +} + #[allow(clippy::too_many_arguments)] pub async fn process_epoch( client: &EllipsisClient, @@ -55,6 +91,7 @@ pub async fn process_epoch( tip_router_program_id: &Pubkey, ncn_address: &Pubkey, snapshots_enabled: bool, + new_epoch_rollover: bool, cli_args: &Cli, ) -> Result<()> { info!("Processing epoch {:?}", target_epoch); @@ -77,6 +114,12 @@ pub async fn process_epoch( let account_paths = account_paths.map_or_else(|| vec![ledger_path.clone()], |paths| paths); let full_snapshots_path = full_snapshots_path.map_or(ledger_path, |path| path); + // Wait for optimal incremental snapshot to be available since they can be delayed in a new epoch + if new_epoch_rollover { + wait_for_optimal_incremental_snapshot(incremental_snapshots_path.clone(), target_slot) + .await?; + } + // Generate merkle root from ledger let meta_merkle_tree = match get_meta_merkle_root( cli_args.ledger_path.as_path(), diff --git a/tip-router-operator-cli/src/stake_meta_generator.rs b/tip-router-operator-cli/src/stake_meta_generator.rs index d977e0c7..8391513f 100644 --- a/tip-router-operator-cli/src/stake_meta_generator.rs +++ b/tip-router-operator-cli/src/stake_meta_generator.rs @@ -63,7 +63,7 @@ pub enum StakeMetaGeneratorError { GenesisConfigError(#[from] OpenGenesisConfigError), - PanicError, + PanicError(String), } impl Display for StakeMetaGeneratorError { @@ -102,8 +102,18 @@ pub fn generate_stake_meta( let bank = match res { Ok(bank) => bank, Err(e) => { - error!("Panicked while creating bank from ledger: {:?}", e); - let error_str = format!("{:?}", e); + let error_str = if let Some(s) = e.downcast_ref::() { + s.to_string() + } else if let Some(s) = e.downcast_ref::<&'static str>() { + s.to_string() + } else { + // If we can't get a string, try to get any Debug implementation + match e.downcast_ref::>() { + Some(debug_val) => format!("{:?}", debug_val), + None => "Unknown panic payload".to_string(), + } + }; + error!("Panicked while creating bank from ledger: {}", error_str); datapoint_error!( "tip_router_cli.get_bank", ("operator", operator_address.to_string(), String), @@ -111,7 +121,7 @@ pub fn generate_stake_meta( ("state", "get_bank_from_ledger", String), ("error", error_str, String), ); - return Err(StakeMetaGeneratorError::PanicError); + return Err(StakeMetaGeneratorError::PanicError(error_str)); } }; From 8eda3aa80822a71d6a4255df5c506952bd39d708 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Fri, 24 Jan 2025 14:37:59 -0500 Subject: [PATCH 029/112] Include telegraf stats --- telegraf/telegraf.conf | 94 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/telegraf/telegraf.conf b/telegraf/telegraf.conf index 3e6f8ce7..36577de6 100644 --- a/telegraf/telegraf.conf +++ b/telegraf/telegraf.conf @@ -218,3 +218,97 @@ # ## Fixed time-window for the available payload size e.g. "5m" # # rate_limit_period = "0s" + +############################################################################### +# INPUT PLUGINS # +############################################################################### + + +# Read metrics about cpu usage +[[inputs.cpu]] + ## Whether to report per-cpu stats or not + percpu = true + ## Whether to report total system cpu stats or not + totalcpu = true + ## If true, collect raw CPU time metrics + collect_cpu_time = false + ## If true, compute and report the sum of all non-idle CPU states + ## NOTE: The resulting 'time_active' field INCLUDES 'iowait'! + report_active = false + ## If true and the info is available then add core_id and physical_id tags + core_tags = false + + +# Read metrics about disk usage by mount point +[[inputs.disk]] + ## By default stats will be gathered for all mount points. + ## Set mount_points will restrict the stats to only the specified mount points. + # mount_points = ["/"] + + ## Ignore mount points by filesystem type. + ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"] + + ## Ignore mount points by mount options. + ## The 'mount' command reports options of all mounts in parathesis. + ## Bind mounts can be ignored with the special 'bind' option. + # ignore_mount_opts = [] + + +# Read metrics about disk IO by device +[[inputs.diskio]] + ## Devices to collect stats for + ## Wildcards are supported except for disk synonyms like '/dev/disk/by-id'. + ## ex. devices = ["sda", "sdb", "vd*", "/dev/disk/by-id/nvme-eui.00123deadc0de123"] + # devices = ["*"] + + ## Skip gathering of the disk's serial numbers. + # skip_serial_number = true + + ## Device metadata tags to add on systems supporting it (Linux only) + ## Use 'udevadm info -q property -n ' to get a list of properties. + ## Note: Most, but not all, udev properties can be accessed this way. Properties + ## that are currently inaccessible include DEVTYPE, DEVNAME, and DEVPATH. + # device_tags = ["ID_FS_TYPE", "ID_FS_USAGE"] + + ## Using the same metadata source as device_tags, you can also customize the + ## name of the device via templates. + ## The 'name_templates' parameter is a list of templates to try and apply to + ## the device. The template may contain variables in the form of '$PROPERTY' or + ## '${PROPERTY}'. The first template which does not contain any variables not + ## present for the device is used as the device name tag. + ## The typical use case is for LVM volumes, to get the VG/LV name instead of + ## the near-meaningless DM-0 name. + # name_templates = ["$ID_FS_LABEL","$DM_VG_NAME/$DM_LV_NAME"] + + +# Plugin to collect various Linux kernel statistics. +# This plugin ONLY supports Linux +[[inputs.kernel]] + ## Additional gather options + ## Possible options include: + ## * ksm - kernel same-page merging + ## * psi - pressure stall information + # collect = [] + + +# Read metrics about memory usage +[[inputs.mem]] + # no configuration + + +# Get the number of processes and group them by status +# This plugin ONLY supports non-Windows +[[inputs.processes]] + ## Use sudo to run ps command on *BSD systems. Linux systems will read + ## /proc, so this does not apply there. + # use_sudo = false + + +# Read metrics about swap memory usage +[[inputs.swap]] + # no configuration + + +# Read metrics about system load & uptime +[[inputs.system]] + # no configuration From 4531cb0067b0da5626b8224a87f2a459deb7a96c Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Fri, 24 Jan 2025 16:28:40 -0500 Subject: [PATCH 030/112] WIP: gut the snapshot slot command --- tip-router-operator-cli/src/cli.rs | 15 ----------- tip-router-operator-cli/src/main.rs | 42 +++++++++-------------------- 2 files changed, 12 insertions(+), 45 deletions(-) diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index d67728bf..648acbba 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -65,21 +65,6 @@ pub enum Commands { override_target_slot: Option, }, SnapshotSlot { - #[arg(short, long, env)] - ncn_address: Pubkey, - - #[arg(long, env)] - tip_distribution_program_id: Pubkey, - - #[arg(long, env)] - tip_payment_program_id: Pubkey, - - #[arg(long, env)] - tip_router_program_id: Pubkey, - - #[arg(long, env, default_value = "false")] - enable_snapshots: bool, - #[arg(long, env)] slot: u64, }, diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index e2d09b42..39022a1b 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -19,11 +19,7 @@ use ::{ time::{Duration, Instant}, }, tip_router_operator_cli::{ - backup_snapshots::BackupSnapshotMonitor, - claim::claim_mev_tips, - cli::{Cli, Commands}, - process_epoch::{get_previous_epoch_last_slot, process_epoch, wait_for_next_epoch}, - submit::{submit_recent_epochs_to_ncn, submit_to_ncn}, + backup_snapshots::BackupSnapshotMonitor, claim::claim_mev_tips, cli::{Cli, Commands}, ledger_utils::get_bank_from_ledger, process_epoch::{get_previous_epoch_last_slot, process_epoch, wait_for_next_epoch}, submit::{submit_recent_epochs_to_ncn, submit_to_ncn} }, tokio::time::sleep, }; @@ -173,34 +169,20 @@ async fn main() -> Result<()> { } } Commands::SnapshotSlot { - ncn_address, - tip_distribution_program_id, - tip_payment_program_id, - tip_router_program_id, - enable_snapshots, slot, } => { info!("Snapshotting slot..."); - let epoch = slot / DEFAULT_SLOTS_PER_EPOCH; - // Process the epoch - match process_epoch( - &rpc_client, - slot, - epoch, - &tip_distribution_program_id, - &tip_payment_program_id, - &tip_router_program_id, - &ncn_address, - enable_snapshots, - &cli, - ) - .await - { - Ok(_) => info!("Successfully processed slot"), - Err(e) => { - error!("Error processing epoch: {}", e); - } - } + let account_paths = cli.account_paths.map_or_else(|| vec![cli.ledger_path.clone()], |paths| paths); + + get_bank_from_ledger( + &keypair.pubkey(), + &cli.ledger_path, + account_paths, + cli.full_snapshots_path.unwrap(), + cli.backup_snapshots_dir, + &slot, + true, + ); } Commands::SubmitEpoch { ncn_address, From 7976774c56b13216208dfee20b60f88086002139 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Fri, 24 Jan 2025 16:53:30 -0500 Subject: [PATCH 031/112] Reduce iteration of submit to ncn --- tip-router-operator-cli/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 19bba7a3..05ef079e 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -101,7 +101,7 @@ async fn main() -> Result<()> { { error!("Error submitting to NCN: {}", e); } - sleep(Duration::from_secs(60)).await; + sleep(Duration::from_secs(600)).await; } }); From 85d1d5b1292c7aedb72781c61d005a774ffc11af Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Fri, 24 Jan 2025 17:00:07 -0500 Subject: [PATCH 032/112] debug --- tip-router-operator-cli/src/backup_snapshots.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tip-router-operator-cli/src/backup_snapshots.rs b/tip-router-operator-cli/src/backup_snapshots.rs index b7350c79..ea0827a0 100644 --- a/tip-router-operator-cli/src/backup_snapshots.rs +++ b/tip-router-operator-cli/src/backup_snapshots.rs @@ -144,7 +144,7 @@ impl BackupSnapshotMonitor { ); } - log::info!( + log::debug!( "Successfully backed up incremental snapshot ({} bytes)", source_size ); From fae6f6def60c38f4aaba0c2434a67ab6d66e1d97 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Fri, 24 Jan 2025 17:56:22 -0500 Subject: [PATCH 033/112] WIP testing some stuff --- tip-router-operator-cli/src/ledger_utils.rs | 45 +++++++++++++++++++-- tip-router-operator-cli/src/main.rs | 19 +++++---- 2 files changed, 53 insertions(+), 11 deletions(-) diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index 8341dafe..286945d3 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -14,9 +14,12 @@ use solana_ledger::{ }; use solana_metrics::{datapoint_error, datapoint_info}; use solana_runtime::{ - accounts_background_service::AbsRequestSender, bank::Bank, - snapshot_archive_info::SnapshotArchiveInfoGetter, snapshot_bank_utils, - snapshot_config::SnapshotConfig, snapshot_utils::SnapshotVersion, + accounts_background_service::AbsRequestSender, + bank::Bank, + snapshot_archive_info::SnapshotArchiveInfoGetter, + snapshot_bank_utils, + snapshot_config::SnapshotConfig, + snapshot_utils::{self, SnapshotVersion}, }; use solana_sdk::{clock::Slot, pubkey::Pubkey}; @@ -164,7 +167,7 @@ pub fn get_bank_from_ledger( let snapshot_config = SnapshotConfig { full_snapshot_archives_dir: full_snapshots_path.clone(), incremental_snapshot_archives_dir: incremental_snapshots_path.clone(), - bank_snapshots_dir: full_snapshots_path, + bank_snapshots_dir: full_snapshots_path.clone(), ..SnapshotConfig::new_load_only() }; @@ -172,6 +175,40 @@ pub fn get_bank_from_ledger( halt_at_slot: Some(desired_slot.to_owned()), ..Default::default() }; + + let mut starting_slot = 0; // default start check with genesis + if let Some(full_snapshot_slot) = snapshot_utils::get_highest_full_snapshot_archive_slot( + &full_snapshots_path, + process_options.halt_at_slot, + ) { + let incremental_snapshot_slot = + snapshot_utils::get_highest_incremental_snapshot_archive_slot( + &incremental_snapshots_path, + full_snapshot_slot, + process_options.halt_at_slot, + ) + .unwrap_or_default(); + starting_slot = std::cmp::max(full_snapshot_slot, incremental_snapshot_slot); + } + info!("Starting slot {}", starting_slot); + + match process_options.halt_at_slot { + // Skip the following checks for sentinel values of Some(0) and None. + // For Some(0), no slots will be be replayed after starting_slot. + // For None, all available children of starting_slot will be replayed. + None | Some(0) => {} + Some(halt_slot) => { + if halt_slot < starting_slot { + // TODO: Clean this up and emit datapoint + panic!("halt_slot < starting_slot"); + } + // Check if we have the slot data necessary to replay from starting_slot to >= halt_slot. + if !blockstore.slot_range_connected(starting_slot, halt_slot) { + // TODO: Clean this up and emit datapoint + panic!("!blockstore.slot_range_connected"); + } + } + } let exit = Arc::new(AtomicBool::new(false)); let (bank_forks, leader_schedule_cache, _starting_snapshot_hashes, ..) = match bank_forks_utils::load_bank_forks( diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 39022a1b..c572133e 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -7,7 +7,6 @@ use ::{ solana_metrics::{datapoint_error, datapoint_info, set_host_id}, solana_rpc_client::rpc_client::RpcClient, solana_sdk::{ - clock::DEFAULT_SLOTS_PER_EPOCH, pubkey::Pubkey, signer::{keypair::read_keypair_file, Signer}, transaction::Transaction, @@ -19,7 +18,12 @@ use ::{ time::{Duration, Instant}, }, tip_router_operator_cli::{ - backup_snapshots::BackupSnapshotMonitor, claim::claim_mev_tips, cli::{Cli, Commands}, ledger_utils::get_bank_from_ledger, process_epoch::{get_previous_epoch_last_slot, process_epoch, wait_for_next_epoch}, submit::{submit_recent_epochs_to_ncn, submit_to_ncn} + backup_snapshots::BackupSnapshotMonitor, + claim::claim_mev_tips, + cli::{Cli, Commands}, + ledger_utils::get_bank_from_ledger, + process_epoch::{get_previous_epoch_last_slot, process_epoch, wait_for_next_epoch}, + submit::{submit_recent_epochs_to_ncn, submit_to_ncn}, }, tokio::time::sleep, }; @@ -168,14 +172,15 @@ async fn main() -> Result<()> { } } } - Commands::SnapshotSlot { - slot, - } => { + Commands::SnapshotSlot { slot } => { info!("Snapshotting slot..."); - let account_paths = cli.account_paths.map_or_else(|| vec![cli.ledger_path.clone()], |paths| paths); + let operator_address = Pubkey::from_str(&cli.operator_address)?; + let account_paths = cli + .account_paths + .map_or_else(|| vec![cli.ledger_path.clone()], |paths| paths); get_bank_from_ledger( - &keypair.pubkey(), + &operator_address, &cli.ledger_path, account_paths, cli.full_snapshots_path.unwrap(), From ffdced7f41b32ac9f2c6c23c0aadd12361cf73a8 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Mon, 27 Jan 2025 13:23:54 -0500 Subject: [PATCH 034/112] cut initial memo --- Cargo.lock | 1 - tip-router-operator-cli/Cargo.toml | 1 - tip-router-operator-cli/src/main.rs | 7 ------- 3 files changed, 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7e9bae0f..fbeeb446 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8866,7 +8866,6 @@ dependencies = [ "im", "itertools 0.11.0", "jito-bytemuck", - "jito-restaking-program", "jito-tip-distribution-sdk", "jito-tip-payment-sdk", "jito-tip-router-client", diff --git a/tip-router-operator-cli/Cargo.toml b/tip-router-operator-cli/Cargo.toml index 75af7d8e..fc791ede 100644 --- a/tip-router-operator-cli/Cargo.toml +++ b/tip-router-operator-cli/Cargo.toml @@ -15,7 +15,6 @@ hex = "0.4" im = "15.1" itertools = "0.11" jito-bytemuck = { workspace = true } -jito-restaking-program = { workspace = true } jito-tip-distribution-sdk = { workspace = true } jito-tip-payment-sdk = { workspace = true } jito-tip-router-client = { workspace = true } diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index c572133e..2ba6468e 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -40,13 +40,6 @@ async fn main() -> Result<()> { set_host_id(cli.operator_address.to_string()); - let test_meta_merkle_root = [1; 32]; - let ix = spl_memo::build_memo(&test_meta_merkle_root.to_vec(), &[&keypair.pubkey()]); - info!("Submitting test memo {:?}", test_meta_merkle_root); - - let tx = Transaction::new_with_payer(&[ix], Some(&keypair.pubkey())); - rpc_client.process_transaction(tx, &[&keypair]).await?; - info!( "CLI Arguments: keypair_path: {} From fe39a974edfd89e8d553256341818578b182376d Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Mon, 27 Jan 2025 15:51:43 -0500 Subject: [PATCH 035/112] copy over ledger utils fn --- Cargo.lock | 1764 ++++++++++++----- Cargo.toml | 20 + tip-router-operator-cli/Cargo.toml | 12 + tip-router-operator-cli/src/arg_matches.rs | 597 ++++++ tip-router-operator-cli/src/cli.rs | 6 +- tip-router-operator-cli/src/ledger_utils.rs | 20 + tip-router-operator-cli/src/lib.rs | 110 + .../src/load_and_process_ledger.rs | 586 ++++++ tip-router-operator-cli/src/main.rs | 20 +- 9 files changed, 2650 insertions(+), 485 deletions(-) create mode 100644 tip-router-operator-cli/src/arg_matches.rs create mode 100644 tip-router-operator-cli/src/load_and_process_ledger.rs diff --git a/Cargo.lock b/Cargo.lock index 2667e172..3306828f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -42,7 +42,7 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cipher", "cpufeatures", "opaque-debug", @@ -80,7 +80,7 @@ version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "getrandom 0.2.15", "once_cell", "version_check", @@ -124,8 +124,8 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "anchor-syn 0.24.2", "anyhow", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "regex", "syn 1.0.109", ] @@ -137,8 +137,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47fe28365b33e8334dd70ae2f34a43892363012fe239cf37d2ee91693575b1f8" dependencies = [ "anchor-syn 0.30.1", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -150,8 +150,8 @@ dependencies = [ "anchor-syn 0.24.2", "anyhow", "bs58 0.4.0", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "rustversion", "syn 1.0.109", ] @@ -164,8 +164,8 @@ checksum = "3c288d496168268d198d9b53ee9f4f9d260a55ba4df9877ea1d4486ad6109e0f" dependencies = [ "anchor-syn 0.30.1", "bs58 0.5.1", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -175,7 +175,7 @@ version = "0.24.2" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" dependencies = [ "anchor-syn 0.24.2", - "proc-macro2", + "proc-macro2 1.0.92", "syn 1.0.109", ] @@ -186,7 +186,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49b77b6948d0eeaaa129ce79eea5bbbb9937375a9241d909ca8fb9e006bb6e90" dependencies = [ "anchor-syn 0.30.1", - "quote", + "quote 1.0.38", "syn 1.0.109", ] @@ -196,8 +196,8 @@ version = "0.24.2" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" dependencies = [ "anchor-syn 0.24.2", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -208,7 +208,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d20bb569c5a557c86101b944721d865e1fd0a4c67c381d31a44a84f07f84828" dependencies = [ "anchor-syn 0.30.1", - "quote", + "quote 1.0.38", "syn 1.0.109", ] @@ -219,8 +219,8 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "anchor-syn 0.24.2", "anyhow", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -231,8 +231,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cebd8d0671a3a9dc3160c48598d652c34c77de6be4d44345b8b514323284d57" dependencies = [ "anchor-syn 0.30.1", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -244,8 +244,8 @@ dependencies = [ "anchor-syn 0.24.2", "anyhow", "heck 0.3.3", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -256,8 +256,8 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "anchor-syn 0.24.2", "anyhow", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -272,8 +272,8 @@ dependencies = [ "anyhow", "bs58 0.5.1", "heck 0.3.3", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "serde_json", "syn 1.0.109", ] @@ -285,8 +285,8 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "anchor-syn 0.24.2", "anyhow", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -297,8 +297,8 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "anchor-syn 0.24.2", "anyhow", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -309,7 +309,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04368b5abef4266250ca8d1d12f4dff860242681e4ec22b885dcfe354fd35aa1" dependencies = [ "anchor-syn 0.30.1", - "quote", + "quote 1.0.38", "syn 1.0.109", ] @@ -321,8 +321,8 @@ checksum = "e0bb0e0911ad4a70cab880cdd6287fe1e880a1a9d8e4e6defa8e9044b9796a6c" dependencies = [ "anchor-syn 0.30.1", "borsh-derive-internal 0.10.4", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -332,8 +332,8 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ef415ff156dc82e9ecb943189b0cb241b3a6bfc26a180234dc21bd3ef3ce0cb" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -357,7 +357,7 @@ dependencies = [ "borsh 0.10.4", "bytemuck", "solana-program", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -383,7 +383,7 @@ dependencies = [ "bytemuck", "getrandom 0.2.15", "solana-program", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -419,14 +419,14 @@ dependencies = [ "anyhow", "bs58 0.3.1", "heck 0.3.3", - "proc-macro2", + "proc-macro2 1.0.92", "proc-macro2-diagnostics", - "quote", + "quote 1.0.38", "serde", "serde_json", "sha2 0.9.9", "syn 1.0.109", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -439,13 +439,13 @@ dependencies = [ "bs58 0.5.1", "cargo_toml 0.19.2", "heck 0.3.3", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "serde", "serde_json", "sha2 0.10.8", "syn 1.0.109", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -536,8 +536,8 @@ dependencies = [ "include_dir", "itertools 0.10.5", "proc-macro-error", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -601,7 +601,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" dependencies = [ - "quote", + "quote 1.0.38", "syn 1.0.109", ] @@ -613,8 +613,8 @@ checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ "num-bigint 0.4.6", "num-traits", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -649,8 +649,8 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -694,7 +694,7 @@ dependencies = [ "nom", "num-traits", "rusticata-macros", - "thiserror", + "thiserror 1.0.69", "time", ] @@ -704,8 +704,8 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", "synstructure 0.12.6", ] @@ -716,8 +716,8 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -778,8 +778,8 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -789,8 +789,8 @@ version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -838,7 +838,7 @@ dependencies = [ "matchit", "memchr", "mime", - "percent-encoding", + "percent-encoding 2.3.1", "pin-project-lite", "rustversion", "serde", @@ -886,7 +886,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cfg-if", + "cfg-if 1.0.0", "libc", "miniz_oxide", "object", @@ -946,8 +946,8 @@ dependencies = [ "lazycell", "peeking_take_while", "prettyplease 0.2.25", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "regex", "rustc-hash", "shlex", @@ -999,7 +999,7 @@ dependencies = [ "arrayref", "arrayvec", "cc", - "cfg-if", + "cfg-if 1.0.0", "constant_time_eq", "digest 0.10.7", ] @@ -1046,7 +1046,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115e54d64eb62cdebad391c19efc9dce4981c690c85a33a12199d99bb9546fee" dependencies = [ "borsh-derive 0.10.4", - "hashbrown 0.12.3", + "hashbrown 0.13.2", ] [[package]] @@ -1068,7 +1068,7 @@ dependencies = [ "borsh-derive-internal 0.9.3", "borsh-schema-derive-internal 0.9.3", "proc-macro-crate 0.1.5", - "proc-macro2", + "proc-macro2 1.0.92", "syn 1.0.109", ] @@ -1081,7 +1081,7 @@ dependencies = [ "borsh-derive-internal 0.10.4", "borsh-schema-derive-internal 0.10.4", "proc-macro-crate 0.1.5", - "proc-macro2", + "proc-macro2 1.0.92", "syn 1.0.109", ] @@ -1093,8 +1093,8 @@ checksum = "c2593a3b8b938bd68373196c9832f516be11fa487ef4ae745eb282e6a56a7244" dependencies = [ "once_cell", "proc-macro-crate 3.2.0", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -1104,8 +1104,8 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -1115,8 +1115,8 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65d6ba50644c98714aa2a70d13d7df3cd75cd2b523a2b452bf010443800976b3" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -1126,8 +1126,8 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -1137,8 +1137,8 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "276691d96f063427be83e6692b86148e488ebba9f48f77788724ca027ba3b6d4" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -1184,6 +1184,16 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "bstr" +version = "1.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -1217,8 +1227,8 @@ version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -1237,8 +1247,8 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -1282,7 +1292,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "190baaad529bcfbde9e1a19022c42781bdb6ff9de25721abdb8fd98c0807730b" dependencies = [ "libc", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1325,6 +1335,12 @@ dependencies = [ "nom", ] +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + [[package]] name = "cfg-if" version = "1.0.0" @@ -1378,7 +1394,7 @@ checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", - "libloading", + "libloading 0.8.6", ] [[package]] @@ -1450,8 +1466,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck 0.5.0", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -1517,7 +1533,7 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "wasm-bindgen", ] @@ -1552,6 +1568,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + [[package]] name = "core-foundation" version = "0.9.4" @@ -1595,7 +1617,7 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -1699,8 +1721,8 @@ checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "strsim 0.11.1", "syn 2.0.93", ] @@ -1712,7 +1734,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", - "quote", + "quote 1.0.38", "syn 2.0.93", ] @@ -1722,7 +1744,7 @@ version = "5.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "hashbrown 0.14.5", "lock_api", "once_cell", @@ -1736,6 +1758,17 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" +[[package]] +name = "default-env" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f753eb82d29277e79efc625e84aecacfd4851ee50e05a8573a4740239a77bfd3" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "syn 0.15.44", +] + [[package]] name = "der" version = "0.5.1" @@ -1781,11 +1814,24 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] +[[package]] +name = "derive_more" +version = "0.99.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +dependencies = [ + "convert_case", + "proc-macro2 1.0.92", + "quote 1.0.38", + "rustc_version", + "syn 2.0.93", +] + [[package]] name = "dialoguer" version = "0.10.4" @@ -1842,6 +1888,16 @@ dependencies = [ "dirs-sys", ] +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if 1.0.0", + "dirs-sys-next", +] + [[package]] name = "dirs-sys" version = "0.3.7" @@ -1853,14 +1909,25 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi 0.3.9", +] + [[package]] name = "displaydoc" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -1882,8 +1949,8 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -1947,8 +2014,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" dependencies = [ "enum-ordinalize", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -1975,7 +2042,7 @@ dependencies = [ "solana-program-test 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", "solana-transaction-status", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -1991,7 +2058,7 @@ version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -2009,8 +2076,8 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -2022,8 +2089,8 @@ checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" dependencies = [ "num-bigint 0.4.6", "num-traits", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -2085,7 +2152,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", +] + +[[package]] +name = "etcd-client" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4b0ea5ef6dc2388a4b1669fa32097249bc03a15417b97cb75e38afb309e4a89" +dependencies = [ + "http", + "prost", + "tokio", + "tokio-stream", + "tonic", + "tonic-build", + "tower", + "tower-service", ] [[package]] @@ -2121,7 +2204,7 @@ version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "libredox", "windows-sys 0.59.0", @@ -2179,7 +2262,7 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ - "percent-encoding", + "percent-encoding 2.3.1", ] [[package]] @@ -2200,6 +2283,12 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" +[[package]] +name = "futures" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" + [[package]] name = "futures" version = "0.3.31" @@ -2240,6 +2329,7 @@ dependencies = [ "futures-core", "futures-task", "futures-util", + "num_cpus", ] [[package]] @@ -2254,8 +2344,8 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -2277,6 +2367,7 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures 0.1.31", "futures-channel", "futures-core", "futures-io", @@ -2316,7 +2407,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", "libc", "wasi 0.9.0+wasi-snapshot-preview1", @@ -2329,7 +2420,7 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", @@ -2348,6 +2439,19 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +[[package]] +name = "globset" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + [[package]] name = "goauth" version = "0.13.1" @@ -2355,7 +2459,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8af59a261bcf42f45d1b261232847b9b850ba0a1419d6100698246fb66e9240" dependencies = [ "arc-swap", - "futures", + "futures 0.3.31", "log", "reqwest", "serde", @@ -2636,7 +2740,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca815a891b24fdfb243fa3239c86154392b0953ee584aa1a2a1f66d20cbe75cc" dependencies = [ "bytes", - "futures", + "futures 0.3.31", "headers", "http", "hyper", @@ -2822,8 +2926,8 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -2833,6 +2937,17 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "idna" version = "1.0.3" @@ -2891,8 +3006,8 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", ] [[package]] @@ -2943,7 +3058,7 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -2998,8 +3113,8 @@ name = "jito-account-traits-derive" version = "0.0.3" source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -3027,7 +3142,32 @@ dependencies = [ "spl-associated-token-account", "spl-token 4.0.0", "spl-token-2022 3.0.5", - "thiserror", + "thiserror 1.0.69", +] + +[[package]] +name = "jito-programs-vote-state" +version = "0.1.5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "anchor-lang 0.24.2", + "bincode", + "serde", + "serde_derive", + "solana-program", +] + +[[package]] +name = "jito-protos" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "bytes", + "prost", + "prost-types", + "protobuf-src", + "tonic", + "tonic-build", ] [[package]] @@ -3044,7 +3184,7 @@ dependencies = [ "serde_with 3.12.0", "solana-program", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3061,7 +3201,7 @@ dependencies = [ "solana-program", "spl-associated-token-account", "spl-token 4.0.0", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3070,7 +3210,7 @@ version = "0.0.3" source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ "borsh 0.10.4", - "cfg-if", + "cfg-if 1.0.0", "const_str_to_pubkey", "jito-bytemuck", "jito-jsm-core", @@ -3083,7 +3223,7 @@ dependencies = [ "spl-associated-token-account", "spl-token 4.0.0", "spl-token-2022 3.0.5", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3094,7 +3234,19 @@ dependencies = [ "borsh 0.10.4", "shank", "solana-program", - "thiserror", + "thiserror 1.0.69", +] + +[[package]] +name = "jito-tip-distribution" +version = "0.1.5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "anchor-lang 0.24.2", + "default-env", + "jito-programs-vote-state", + "solana-program", + "solana-security-txt", ] [[package]] @@ -3104,6 +3256,16 @@ dependencies = [ "anchor-lang 0.30.1", ] +[[package]] +name = "jito-tip-payment" +version = "0.1.5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "anchor-lang 0.24.2", + "default-env", + "solana-security-txt", +] + [[package]] name = "jito-tip-payment-sdk" version = "0.0.1" @@ -3124,7 +3286,7 @@ dependencies = [ "clap-markdown", "dotenv", "env_logger 0.10.2", - "futures", + "futures 0.3.31", "jito-bytemuck", "jito-jsm-core", "jito-restaking-client", @@ -3150,7 +3312,7 @@ dependencies = [ "spl-associated-token-account", "spl-stake-pool", "spl-token 4.0.0", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -3168,7 +3330,7 @@ dependencies = [ "serde_with 3.12.0", "solana-program", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3192,7 +3354,7 @@ dependencies = [ "spl-associated-token-account", "spl-math", "spl-token 4.0.0", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3224,7 +3386,7 @@ dependencies = [ "spl-associated-token-account", "spl-stake-pool", "spl-token 4.0.0", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -3235,7 +3397,7 @@ dependencies = [ "assert_matches", "borsh 0.10.4", "bytemuck", - "cfg-if", + "cfg-if 1.0.0", "const_str_to_pubkey", "jito-bytemuck", "jito-jsm-core", @@ -3254,7 +3416,7 @@ dependencies = [ "spl-stake-pool", "spl-token 4.0.0", "switchboard-on-demand", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3284,7 +3446,7 @@ dependencies = [ "serde_with 3.12.0", "solana-program", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3302,7 +3464,7 @@ dependencies = [ "spl-associated-token-account", "spl-token 4.0.0", "spl-token-2022 3.0.5", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3311,7 +3473,7 @@ version = "0.0.3" source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ "borsh 0.10.4", - "cfg-if", + "cfg-if 1.0.0", "const_str_to_pubkey", "jito-bytemuck", "jito-jsm-core", @@ -3324,7 +3486,7 @@ dependencies = [ "spl-associated-token-account", "spl-token 4.0.0", "spl-token-2022 3.0.5", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3336,7 +3498,7 @@ dependencies = [ "shank", "solana-program", "spl-token 4.0.0", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3358,13 +3520,43 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + +[[package]] +name = "jsonrpc-client-transports" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b99d4207e2a04fb4581746903c2bb7eb376f88de9c699d0f3e10feeac0cd3a" +dependencies = [ + "derive_more", + "futures 0.3.31", + "jsonrpc-core", + "jsonrpc-pubsub", + "jsonrpc-server-utils", + "log", + "parity-tokio-ipc", + "serde", + "serde_json", + "tokio", + "url 1.7.2", +] + [[package]] name = "jsonrpc-core" version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" dependencies = [ - "futures", + "futures 0.3.31", "futures-executor", "futures-util", "log", @@ -3373,6 +3565,92 @@ dependencies = [ "serde_json", ] +[[package]] +name = "jsonrpc-core-client" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b51da17abecbdab3e3d4f26b01c5ec075e88d3abe3ab3b05dc9aa69392764ec0" +dependencies = [ + "futures 0.3.31", + "jsonrpc-client-transports", +] + +[[package]] +name = "jsonrpc-derive" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b939a78fa820cdfcb7ee7484466746a7377760970f6f9c6fe19f9edcc8a38d2" +dependencies = [ + "proc-macro-crate 0.1.5", + "proc-macro2 1.0.92", + "quote 1.0.38", + "syn 1.0.109", +] + +[[package]] +name = "jsonrpc-http-server" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1dea6e07251d9ce6a552abfb5d7ad6bc290a4596c8dcc3d795fae2bbdc1f3ff" +dependencies = [ + "futures 0.3.31", + "hyper", + "jsonrpc-core", + "jsonrpc-server-utils", + "log", + "net2", + "parking_lot 0.11.2", + "unicase", +] + +[[package]] +name = "jsonrpc-ipc-server" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382bb0206323ca7cda3dcd7e245cea86d37d02457a02a975e3378fb149a48845" +dependencies = [ + "futures 0.3.31", + "jsonrpc-core", + "jsonrpc-server-utils", + "log", + "parity-tokio-ipc", + "parking_lot 0.11.2", + "tower-service", +] + +[[package]] +name = "jsonrpc-pubsub" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240f87695e6c6f62fb37f05c02c04953cf68d6408b8c1c89de85c7a0125b1011" +dependencies = [ + "futures 0.3.31", + "jsonrpc-core", + "lazy_static", + "log", + "parking_lot 0.11.2", + "rand 0.7.3", + "serde", +] + +[[package]] +name = "jsonrpc-server-utils" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4fdea130485b572c39a460d50888beb00afb3e35de23ccd7fad8ff19f0e0d4" +dependencies = [ + "bytes", + "futures 0.3.31", + "globset", + "jsonrpc-core", + "lazy_static", + "log", + "tokio", + "tokio-stream", + "tokio-util 0.6.10", + "unicase", +] + [[package]] name = "keccak" version = "0.1.5" @@ -3410,14 +3688,24 @@ version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if 1.0.0", + "winapi 0.3.9", +] + [[package]] name = "libloading" version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ - "cfg-if", - "windows-targets 0.48.5", + "cfg-if 1.0.0", + "windows-targets 0.52.6", ] [[package]] @@ -3568,7 +3856,7 @@ dependencies = [ "ark-bn254", "ark-ff", "num-bigint 0.4.6", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3630,6 +3918,12 @@ dependencies = [ "libc", ] +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + [[package]] name = "matchit" version = "0.7.3" @@ -3708,7 +4002,7 @@ dependencies = [ "spl-associated-token-account", "spl-math", "spl-token 4.0.0", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3717,6 +4011,12 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "min-max-heap" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2687e6cf9c00f48e9284cf9fd15f2ef341d03cc7743abf9df4c5f07fdee50b18" + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -3749,7 +4049,7 @@ version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "downcast", "fragile", "lazy_static", @@ -3764,9 +4064,9 @@ version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" dependencies = [ - "cfg-if", - "proc-macro2", - "quote", + "cfg-if 1.0.0", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -3786,8 +4086,8 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -3814,6 +4114,17 @@ dependencies = [ "tempfile", ] +[[package]] +name = "net2" +version = "0.2.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "winapi 0.3.9", +] + [[package]] name = "nix" version = "0.26.4" @@ -3821,7 +4132,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ "bitflags 1.3.2", - "cfg-if", + "cfg-if 1.0.0", "libc", "memoffset 0.7.1", "pin-utils", @@ -3923,8 +4234,8 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -3934,8 +4245,8 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -4035,8 +4346,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -4047,8 +4358,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -4058,9 +4369,9 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", + "proc-macro-crate 3.2.0", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -4107,7 +4418,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ "bitflags 2.6.0", - "cfg-if", + "cfg-if 1.0.0", "foreign-types", "libc", "once_cell", @@ -4121,8 +4432,8 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -4167,10 +4478,10 @@ dependencies = [ "futures-util", "js-sys", "lazy_static", - "percent-encoding", + "percent-encoding 2.3.1", "pin-project", "rand 0.8.5", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4197,11 +4508,25 @@ checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7" dependencies = [ "Inflector", "proc-macro-error", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] +[[package]] +name = "parity-tokio-ipc" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9981e32fb75e004cc148f5fb70342f393830e0a4aa62e3cc93b50976218d42b6" +dependencies = [ + "futures 0.3.31", + "libc", + "log", + "rand 0.7.3", + "tokio", + "winapi 0.3.9", +] + [[package]] name = "parking_lot" version = "0.11.2" @@ -4229,7 +4554,7 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "instant", "libc", "redox_syscall 0.2.16", @@ -4243,7 +4568,7 @@ version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "redox_syscall 0.5.8", "smallvec", @@ -4289,6 +4614,12 @@ dependencies = [ "base64 0.13.1", ] +[[package]] +name = "percent-encoding" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" + [[package]] name = "percent-encoding" version = "2.3.1" @@ -4305,37 +4636,82 @@ dependencies = [ ] [[package]] -name = "petgraph" -version = "0.6.5" +name = "pest" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" dependencies = [ - "fixedbitset", - "indexmap 2.7.0", + "memchr", + "thiserror 2.0.11", + "ucd-trie", ] [[package]] -name = "pin-project" -version = "1.1.7" +name = "pest_derive" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" dependencies = [ - "pin-project-internal", + "pest", + "pest_generator", ] [[package]] -name = "pin-project-internal" -version = "1.1.7" +name = "pest_generator" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" dependencies = [ - "proc-macro2", - "quote", + "pest", + "pest_meta", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] [[package]] -name = "pin-project-lite" +name = "pest_meta" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" +dependencies = [ + "once_cell", + "pest", + "sha2 0.10.8", +] + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.7.0", +] + +[[package]] +name = "pin-project" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +dependencies = [ + "proc-macro2 1.0.92", + "quote 1.0.38", + "syn 2.0.93", +] + +[[package]] +name = "pin-project-lite" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" @@ -4375,7 +4751,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "opaque-debug", "universal-hash", @@ -4438,7 +4814,7 @@ version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" dependencies = [ - "proc-macro2", + "proc-macro2 1.0.92", "syn 1.0.109", ] @@ -4448,10 +4824,16 @@ version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ - "proc-macro2", + "proc-macro2 1.0.92", "syn 2.0.93", ] +[[package]] +name = "prio-graph" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6492a75ca57066a4479af45efa302bed448680182b0563f96300645d5f896097" + [[package]] name = "proc-macro-crate" version = "0.1.5" @@ -4487,8 +4869,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", "version_check", ] @@ -4499,11 +4881,20 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "version_check", ] +[[package]] +name = "proc-macro2" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +dependencies = [ + "unicode-xid 0.1.0", +] + [[package]] name = "proc-macro2" version = "1.0.92" @@ -4519,8 +4910,8 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", "version_check", "yansi", @@ -4566,8 +4957,8 @@ checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" dependencies = [ "anyhow", "itertools 0.10.5", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -4604,8 +4995,8 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -4615,7 +5006,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" dependencies = [ - "percent-encoding", + "percent-encoding 2.3.1", ] [[package]] @@ -4624,8 +5015,8 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -4641,7 +5032,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -4659,7 +5050,7 @@ dependencies = [ "rustls", "rustls-native-certs", "slab", - "thiserror", + "thiserror 1.0.69", "tinyvec", "tracing", ] @@ -4677,13 +5068,22 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "quote" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" +dependencies = [ + "proc-macro2 0.4.30", +] + [[package]] name = "quote" version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ - "proc-macro2", + "proc-macro2 1.0.92", ] [[package]] @@ -4830,7 +5230,7 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom 0.2.15", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4910,7 +5310,7 @@ dependencies = [ "mime", "native-tls", "once_cell", - "percent-encoding", + "percent-encoding 2.3.1", "pin-project-lite", "rustls", "rustls-pemfile", @@ -4924,7 +5324,7 @@ dependencies = [ "tokio-rustls", "tokio-util 0.7.13", "tower-service", - "url", + "url 2.5.4", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -4954,7 +5354,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", - "cfg-if", + "cfg-if 1.0.0", "getrandom 0.2.15", "libc", "spin 0.9.8", @@ -4986,8 +5386,8 @@ version = "0.7.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -5001,6 +5401,15 @@ dependencies = [ "librocksdb-sys", ] +[[package]] +name = "rolling-file" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8395b4f860856b740f20a296ea2cd4d823e81a2658cf05ef61be22916026a906" +dependencies = [ + "chrono", +] + [[package]] name = "rpassword" version = "7.3.1" @@ -5078,7 +5487,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5175,8 +5584,8 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -5267,8 +5676,8 @@ version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -5349,8 +5758,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" dependencies = [ "darling", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -5361,18 +5770,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ "darling", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap 2.7.0", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "sha-1" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha1" version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest 0.10.7", ] @@ -5384,7 +5819,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ "block-buffer 0.9.0", - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest 0.9.0", "opaque-debug", @@ -5396,7 +5831,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest 0.10.7", ] @@ -5453,8 +5888,8 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9bf2645f8eebde043da69200195058e7b59806705104f908a31d05ca82844ce" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "shank_macro_impl", "shank_render", "syn 1.0.109", @@ -5467,8 +5902,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93d0593f48acb0a722906416b1f6b8926f6571eb9af16d566a7c65427f269f50" dependencies = [ "anyhow", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "serde", "syn 1.0.109", ] @@ -5479,8 +5914,8 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "121175ba61809189f888dc5822ebfd30fa0d91e1e1f61d25a4d40b0847b3075e" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "shank_macro_impl", ] @@ -5607,6 +6042,21 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "soketto" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" +dependencies = [ + "base64 0.13.1", + "bytes", + "futures 0.3.31", + "httparse", + "log", + "rand 0.8.5", + "sha-1", +] + [[package]] name = "solana-account-decoder" version = "1.18.26" @@ -5628,7 +6078,7 @@ dependencies = [ "spl-token-2022 1.0.0", "spl-token-group-interface 0.1.0", "spl-token-metadata-interface 0.2.0", - "thiserror", + "thiserror 1.0.69", "zstd", ] @@ -5652,7 +6102,7 @@ dependencies = [ "spl-token-2022 1.0.0", "spl-token-group-interface 0.1.0", "spl-token-metadata-interface 0.2.0", - "thiserror", + "thiserror 1.0.69", "zstd", ] @@ -5700,7 +6150,7 @@ dependencies = [ "solana-config-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-frozen-abi 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-nohash-hasher", "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5714,7 +6164,7 @@ dependencies = [ "strum_macros", "tar", "tempfile", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5760,7 +6210,7 @@ dependencies = [ "solana-config-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-nohash-hasher", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", @@ -5774,7 +6224,7 @@ dependencies = [ "strum_macros", "tar", "tempfile", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5795,7 +6245,7 @@ dependencies = [ "solana-program", "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5815,7 +6265,7 @@ dependencies = [ "solana-program", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5825,12 +6275,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e58fa66e1e240097665e7f87b267aa8e976ea3fcbd86918c8fd218c875395ada" dependencies = [ "borsh 1.5.3", - "futures", + "futures 0.3.31", "solana-banks-interface 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-program", "solana-sdk", "tarpc", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-serde", ] @@ -5841,12 +6291,12 @@ version = "1.18.26" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" dependencies = [ "borsh 1.5.3", - "futures", + "futures 0.3.31", "solana-banks-interface 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-program", "solana-sdk", "tarpc", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-serde", ] @@ -5880,7 +6330,7 @@ checksum = "8cbe287a0f859362de9b155fabd44e479eba26d5d80e07a7d021297b7b06ecba" dependencies = [ "bincode", "crossbeam-channel", - "futures", + "futures 0.3.31", "solana-accounts-db 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-banks-interface 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5899,7 +6349,7 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "bincode", "crossbeam-channel", - "futures", + "futures 0.3.31", "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-banks-interface 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", @@ -5941,12 +6391,12 @@ dependencies = [ "libsecp256k1 0.6.0", "log", "scopeguard", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", "solana-zk-token-sdk 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana_rbpf", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5959,12 +6409,12 @@ dependencies = [ "libsecp256k1 0.6.0", "log", "scopeguard", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "solana-zk-token-sdk 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana_rbpf", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5980,7 +6430,7 @@ dependencies = [ "modular-bitfield", "num_enum 0.7.3", "rand 0.8.5", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-sdk", "tempfile", ] @@ -5997,7 +6447,7 @@ dependencies = [ "modular-bitfield", "num_enum 0.7.3", "rand 0.8.5", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-sdk", "tempfile", ] @@ -6014,13 +6464,13 @@ dependencies = [ "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-ledger", "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-poh", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "solana-transaction-status", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6034,10 +6484,10 @@ dependencies = [ "rpassword", "solana-remote-wallet 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tiny-bip39", "uriparse", - "url", + "url 2.5.4", ] [[package]] @@ -6050,10 +6500,25 @@ dependencies = [ "rpassword", "solana-remote-wallet 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tiny-bip39", "uriparse", - "url", + "url 2.5.4", +] + +[[package]] +name = "solana-cli-config" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "dirs-next", + "lazy_static", + "serde", + "serde_derive", + "serde_yaml", + "solana-clap-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-sdk", + "url 2.5.4", ] [[package]] @@ -6065,7 +6530,7 @@ dependencies = [ "async-trait", "bincode", "dashmap", - "futures", + "futures 0.3.31", "futures-util", "indexmap 2.7.0", "indicatif", @@ -6073,7 +6538,7 @@ dependencies = [ "quinn", "rayon", "solana-connection-cache 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-pubsub-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-quic-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6081,11 +6546,11 @@ dependencies = [ "solana-rpc-client-api", "solana-rpc-client-nonce-utils 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", - "solana-streamer 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-streamer", "solana-thin-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-tpu-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-udp-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -6097,7 +6562,7 @@ dependencies = [ "async-trait", "bincode", "dashmap", - "futures", + "futures 0.3.31", "futures-util", "indexmap 2.7.0", "indicatif", @@ -6105,7 +6570,7 @@ dependencies = [ "quinn", "rayon", "solana-connection-cache 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-pubsub-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-quic-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", @@ -6113,11 +6578,11 @@ dependencies = [ "solana-rpc-client-api", "solana-rpc-client-nonce-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "solana-streamer 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-streamer", "solana-thin-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-tpu-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-udp-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -6182,10 +6647,10 @@ dependencies = [ "rand 0.8.5", "rayon", "rcgen", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -6203,13 +6668,99 @@ dependencies = [ "rand 0.8.5", "rayon", "rcgen", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tokio", ] +[[package]] +name = "solana-core" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "anchor-lang 0.24.2", + "base64 0.21.7", + "bincode", + "bs58 0.4.0", + "bytes", + "chrono", + "crossbeam-channel", + "dashmap", + "eager", + "etcd-client", + "futures 0.3.31", + "histogram", + "itertools 0.10.5", + "jito-protos", + "jito-tip-distribution", + "jito-tip-payment", + "lazy_static", + "log", + "lru", + "min-max-heap", + "num_enum 0.7.3", + "prio-graph", + "prost", + "prost-types", + "quinn", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rayon", + "rcgen", + "rolling-file", + "rustc_version", + "rustls", + "serde", + "serde_bytes", + "serde_derive", + "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-bloom", + "solana-bundle", + "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-cost-model 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-entry", + "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-geyser-plugin-manager", + "solana-gossip", + "solana-ledger", + "solana-measure", + "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-net-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-poh", + "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-quic-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-rpc", + "solana-rpc-client-api", + "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-runtime-plugin", + "solana-sdk", + "solana-send-transaction-service 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-streamer", + "solana-tpu-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-transaction-status", + "solana-turbine", + "solana-unified-scheduler-pool", + "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-wen-restart", + "strum", + "strum_macros", + "sys-info", + "sysctl", + "tempfile", + "thiserror 1.0.69", + "tokio", + "tonic", + "tonic-build", + "trees", +] + [[package]] name = "solana-cost-model" version = "1.18.26" @@ -6270,7 +6821,7 @@ dependencies = [ "rand 0.8.5", "rayon", "serde", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-merkle-tree", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", @@ -6278,6 +6829,29 @@ dependencies = [ "solana-sdk", ] +[[package]] +name = "solana-faucet" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "bincode", + "byteorder", + "clap 2.34.0", + "crossbeam-channel", + "log", + "serde", + "serde_derive", + "solana-clap-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-cli-config", + "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-sdk", + "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "spl-memo", + "thiserror 1.0.69", + "tokio", +] + [[package]] name = "solana-frozen-abi" version = "1.18.26" @@ -6300,7 +6874,7 @@ dependencies = [ "sha2 0.10.8", "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "subtle", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6324,7 +6898,7 @@ dependencies = [ "sha2 0.10.8", "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "subtle", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6333,8 +6907,8 @@ version = "1.18.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c142f779c3633ac83c84d04ff06c70e1f558c876f13358bed77ba629c7417932" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "rustc_version", "syn 2.0.93", ] @@ -6344,12 +6918,49 @@ name = "solana-frozen-abi-macro" version = "1.18.26" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "rustc_version", "syn 2.0.93", ] +[[package]] +name = "solana-geyser-plugin-interface" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "log", + "solana-sdk", + "solana-transaction-status", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-geyser-plugin-manager" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "bs58 0.4.0", + "crossbeam-channel", + "json5", + "jsonrpc-core", + "jsonrpc-server-utils", + "libloading 0.7.4", + "log", + "serde_json", + "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-entry", + "solana-geyser-plugin-interface", + "solana-ledger", + "solana-measure", + "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-rpc", + "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-sdk", + "solana-transaction-status", + "thiserror 1.0.69", +] + [[package]] name = "solana-gossip" version = "1.18.26" @@ -6382,21 +6993,21 @@ dependencies = [ "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-ledger", "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-net-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "solana-streamer 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-streamer", "solana-thin-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-tpu-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "static_assertions", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6413,7 +7024,7 @@ dependencies = [ "crossbeam-channel", "dashmap", "fs_extra", - "futures", + "futures 0.3.31", "itertools 0.10.5", "lazy_static", "libc", @@ -6441,7 +7052,7 @@ dependencies = [ "solana-entry", "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", @@ -6460,7 +7071,7 @@ dependencies = [ "strum", "strum_macros", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "trees", @@ -6473,7 +7084,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b58f70f5883b0f26a6011ed23f76c493a3f22df63aec46cfe8e1b9bf82b5cc" dependencies = [ "log", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", "solana_rbpf", @@ -6485,7 +7096,7 @@ version = "1.18.26" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" dependencies = [ "log", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "solana_rbpf", @@ -6512,16 +7123,6 @@ dependencies = [ "log", ] -[[package]] -name = "solana-measure" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c01a7f9cdc9d9d37a3d5651b2fe7ec9d433c2a3470b9f35897e373b421f0737" -dependencies = [ - "log", - "solana-sdk", -] - [[package]] name = "solana-measure" version = "1.18.26" @@ -6552,7 +7153,7 @@ dependencies = [ "log", "reqwest", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6566,7 +7167,7 @@ dependencies = [ "log", "reqwest", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6588,7 +7189,7 @@ dependencies = [ "solana-sdk", "solana-version 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "tokio", - "url", + "url 2.5.4", ] [[package]] @@ -6609,7 +7210,7 @@ dependencies = [ "solana-sdk", "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "tokio", - "url", + "url 2.5.4", ] [[package]] @@ -6685,11 +7286,11 @@ dependencies = [ "log", "solana-entry", "solana-ledger", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6740,7 +7341,7 @@ dependencies = [ "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk-macro", - "thiserror", + "thiserror 1.0.69", "tiny-bip39", "wasm-bindgen", "zeroize", @@ -6767,11 +7368,11 @@ dependencies = [ "serde", "solana-frozen-abi 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", "solana_rbpf", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6794,11 +7395,11 @@ dependencies = [ "serde", "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "solana_rbpf", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6827,7 +7428,7 @@ dependencies = [ "solana-vote-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana_rbpf", "test-case", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -6856,7 +7457,7 @@ dependencies = [ "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana_rbpf", "test-case", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -6877,12 +7478,12 @@ dependencies = [ "solana-account-decoder 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-rpc-client-api", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-tungstenite", "tungstenite", - "url", + "url 2.5.4", ] [[package]] @@ -6901,12 +7502,12 @@ dependencies = [ "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-rpc-client-api", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-tungstenite", "tungstenite", - "url", + "url 2.5.4", ] [[package]] @@ -6917,7 +7518,7 @@ checksum = "5a90e40ee593f6e9ddd722d296df56743514ae804975a76d47e7afed4e3da244" dependencies = [ "async-mutex", "async-trait", - "futures", + "futures 0.3.31", "itertools 0.10.5", "lazy_static", "log", @@ -6926,13 +7527,13 @@ dependencies = [ "rcgen", "rustls", "solana-connection-cache 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-net-utils 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-rpc-client-api", "solana-sdk", - "solana-streamer 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror", + "solana-streamer", + "thiserror 1.0.69", "tokio", ] @@ -6943,7 +7544,7 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "async-mutex", "async-trait", - "futures", + "futures 0.3.31", "itertools 0.10.5", "lazy_static", "log", @@ -6952,13 +7553,13 @@ dependencies = [ "rcgen", "rustls", "solana-connection-cache 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-net-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-rpc-client-api", "solana-sdk", - "solana-streamer 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "thiserror", + "solana-streamer", + "thiserror 1.0.69", "tokio", ] @@ -6996,7 +7597,7 @@ dependencies = [ "qstring", "semver", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "uriparse", ] @@ -7014,10 +7615,68 @@ dependencies = [ "qstring", "semver", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "uriparse", ] +[[package]] +name = "solana-rpc" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "base64 0.21.7", + "bincode", + "bs58 0.4.0", + "crossbeam-channel", + "dashmap", + "itertools 0.10.5", + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "jsonrpc-http-server", + "jsonrpc-pubsub", + "libc", + "log", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "soketto", + "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-bundle", + "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-entry", + "solana-faucet", + "solana-gossip", + "solana-ledger", + "solana-measure", + "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-poh", + "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-rpc-client-api", + "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-sdk", + "solana-send-transaction-service 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-stake-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-storage-bigtable", + "solana-streamer", + "solana-tpu-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-transaction-status", + "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "spl-token 4.0.0", + "spl-token-2022 1.0.0", + "stream-cancel", + "thiserror 1.0.69", + "tokio", + "tokio-util 0.6.10", +] + [[package]] name = "solana-rpc-client" version = "1.18.26" @@ -7063,7 +7722,7 @@ dependencies = [ "solana-transaction-status", "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "spl-token-2022 1.0.0", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7076,7 +7735,7 @@ dependencies = [ "solana-clap-utils 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-rpc-client", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7088,7 +7747,7 @@ dependencies = [ "solana-clap-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-rpc-client", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7145,7 +7804,7 @@ dependencies = [ "solana-frozen-abi 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-loader-v4-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-perf 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7164,7 +7823,7 @@ dependencies = [ "symlink", "tar", "tempfile", - "thiserror", + "thiserror 1.0.69", "zstd", ] @@ -7221,7 +7880,7 @@ dependencies = [ "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-loader-v4-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", @@ -7240,10 +7899,29 @@ dependencies = [ "symlink", "tar", "tempfile", - "thiserror", + "thiserror 1.0.69", "zstd", ] +[[package]] +name = "solana-runtime-plugin" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "crossbeam-channel", + "json5", + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "jsonrpc-ipc-server", + "jsonrpc-server-utils", + "libloading 0.7.4", + "log", + "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-sdk", + "thiserror 1.0.69", +] + [[package]] name = "solana-sdk" version = "1.18.26" @@ -7294,7 +7972,7 @@ dependencies = [ "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-program", "solana-sdk-macro", - "thiserror", + "thiserror 1.0.69", "uriparse", "wasm-bindgen", ] @@ -7305,8 +7983,8 @@ version = "1.18.26" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" dependencies = [ "bs58 0.4.0", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "rustversion", "syn 2.0.93", ] @@ -7326,7 +8004,7 @@ dependencies = [ "crossbeam-channel", "log", "solana-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", @@ -7342,7 +8020,7 @@ dependencies = [ "log", "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-gossip", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", @@ -7389,7 +8067,7 @@ dependencies = [ "bzip2", "enum-iterator", "flate2", - "futures", + "futures 0.3.31", "goauth", "http", "hyper", @@ -7405,7 +8083,7 @@ dependencies = [ "solana-sdk", "solana-storage-proto", "solana-transaction-status", - "thiserror", + "thiserror 1.0.69", "tokio", "tonic", "zstd", @@ -7427,39 +8105,6 @@ dependencies = [ "tonic-build", ] -[[package]] -name = "solana-streamer" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8476e41ad94fe492e8c06697ee35912cf3080aae0c9e9ac6430835256ccf056" -dependencies = [ - "async-channel", - "bytes", - "crossbeam-channel", - "futures-util", - "histogram", - "indexmap 2.7.0", - "itertools 0.10.5", - "libc", - "log", - "nix", - "pem", - "percentage", - "pkcs8", - "quinn", - "quinn-proto", - "rand 0.8.5", - "rcgen", - "rustls", - "smallvec", - "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-perf 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-sdk", - "thiserror", - "tokio", - "x509-parser", -] - [[package]] name = "solana-streamer" version = "1.18.26" @@ -7487,7 +8132,7 @@ dependencies = [ "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tokio", "x509-parser", ] @@ -7562,13 +8207,13 @@ dependencies = [ "log", "rayon", "solana-connection-cache 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-pubsub-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-rpc-client", "solana-rpc-client-api", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -7585,13 +8230,13 @@ dependencies = [ "log", "rayon", "solana-connection-cache 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-pubsub-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-rpc-client", "solana-rpc-client-api", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -7616,7 +8261,43 @@ dependencies = [ "spl-memo", "spl-token 4.0.0", "spl-token-2022 1.0.0", - "thiserror", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-turbine" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "bincode", + "bytes", + "crossbeam-channel", + "futures 0.3.31", + "itertools 0.10.5", + "log", + "lru", + "quinn", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rayon", + "rcgen", + "rustls", + "solana-entry", + "solana-gossip", + "solana-ledger", + "solana-measure", + "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-poh", + "solana-quic-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-rpc", + "solana-rpc-client-api", + "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-sdk", + "solana-streamer", + "thiserror 1.0.69", + "tokio", ] [[package]] @@ -7629,8 +8310,8 @@ dependencies = [ "solana-connection-cache 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-net-utils 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", - "solana-streamer 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror", + "solana-streamer", + "thiserror 1.0.69", "tokio", ] @@ -7643,11 +8324,29 @@ dependencies = [ "solana-connection-cache 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-net-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "solana-streamer 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "thiserror", + "solana-streamer", + "thiserror 1.0.69", "tokio", ] +[[package]] +name = "solana-unified-scheduler-logic" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" + +[[package]] +name = "solana-unified-scheduler-pool" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "solana-ledger", + "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-sdk", + "solana-unified-scheduler-logic", + "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", +] + [[package]] name = "solana-version" version = "1.18.26" @@ -7695,7 +8394,7 @@ dependencies = [ "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", "solana-vote-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7713,7 +8412,7 @@ dependencies = [ "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7735,7 +8434,7 @@ dependencies = [ "solana-program", "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7756,7 +8455,27 @@ dependencies = [ "solana-program", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-wen-restart" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "log", + "prost", + "prost-build", + "prost-types", + "protobuf-src", + "rustc_version", + "solana-gossip", + "solana-ledger", + "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-program", + "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-sdk", + "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", ] [[package]] @@ -7811,7 +8530,7 @@ dependencies = [ "solana-program", "solana-sdk", "subtle", - "thiserror", + "thiserror 1.0.69", "zeroize", ] @@ -7839,7 +8558,7 @@ dependencies = [ "solana-program", "solana-sdk", "subtle", - "thiserror", + "thiserror 1.0.69", "zeroize", ] @@ -7858,7 +8577,7 @@ dependencies = [ "rand 0.8.5", "rustc-demangle", "scroll", - "thiserror", + "thiserror 1.0.69", "winapi 0.3.9", ] @@ -7897,7 +8616,7 @@ dependencies = [ "solana-program", "spl-token 4.0.0", "spl-token-2022 1.0.0", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7928,7 +8647,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" dependencies = [ - "quote", + "quote 1.0.38", "spl-discriminator-syn 0.1.2", "syn 2.0.93", ] @@ -7939,7 +8658,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" dependencies = [ - "quote", + "quote 1.0.38", "spl-discriminator-syn 0.2.0", "syn 2.0.93", ] @@ -7950,11 +8669,11 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18fea7be851bd98d10721782ea958097c03a0c2a07d8d4997041d0ece6319a63" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "sha2 0.10.8", "syn 2.0.93", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7963,11 +8682,11 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c1f05593b7ca9eac7caca309720f2eafb96355e037e6d373b909a80fe7b69b9" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "sha2 0.10.8", "syn 2.0.93", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7980,7 +8699,7 @@ dependencies = [ "num-derive 0.3.3", "num-traits", "solana-program", - "thiserror", + "thiserror 1.0.69", "uint", ] @@ -8029,7 +8748,7 @@ dependencies = [ "num-traits", "solana-program", "spl-program-error-derive 0.3.2", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -8042,7 +8761,7 @@ dependencies = [ "num-traits", "solana-program", "spl-program-error-derive 0.4.1", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -8051,8 +8770,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1845dfe71fd68f70382232742e758557afe973ae19e6c06807b2c30f5d5cb474" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "sha2 0.10.8", "syn 2.0.93", ] @@ -8063,8 +8782,8 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d375dd76c517836353e093c2dbb490938ff72821ab568b545fd30ab3256b3e" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "sha2 0.10.8", "syn 2.0.93", ] @@ -8089,7 +8808,7 @@ dependencies = [ "spl-math", "spl-pod 0.1.0", "spl-token-2022 0.9.0", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -8146,7 +8865,7 @@ dependencies = [ "num-traits", "num_enum 0.5.11", "solana-program", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -8161,7 +8880,7 @@ dependencies = [ "num-traits", "num_enum 0.6.1", "solana-program", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -8183,7 +8902,7 @@ dependencies = [ "spl-token-metadata-interface 0.2.0", "spl-transfer-hook-interface 0.3.0", "spl-type-length-value 0.3.0", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -8207,7 +8926,7 @@ dependencies = [ "spl-token-metadata-interface 0.2.0", "spl-transfer-hook-interface 0.4.1", "spl-type-length-value 0.3.0", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -8231,7 +8950,7 @@ dependencies = [ "spl-token-metadata-interface 0.3.5", "spl-transfer-hook-interface 0.6.5", "spl-type-length-value 0.4.6", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -8374,6 +9093,17 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "stream-cancel" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f9fbf9bd71e4cf18d68a8a0951c0e5b7255920c0cd992c4ff51cddd6ef514a3" +dependencies = [ + "futures-core", + "pin-project", + "tokio", +] + [[package]] name = "strsim" version = "0.8.0" @@ -8408,8 +9138,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ "heck 0.4.1", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "rustversion", "syn 1.0.109", ] @@ -8525,7 +9255,7 @@ dependencies = [ "bincode", "borsh 0.10.4", "bytemuck", - "futures", + "futures 0.3.31", "lazy_static", "libsecp256k1 0.7.1", "log", @@ -8547,14 +9277,25 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7973cce6668464ea31f176d85b13c7ab3bba2cb3b77a2ed26abd7801688010a" +[[package]] +name = "syn" +version = "0.15.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "unicode-xid 0.1.0", +] + [[package]] name = "syn" version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "unicode-ident", ] @@ -8564,8 +9305,8 @@ version = "2.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "unicode-ident", ] @@ -8581,10 +9322,10 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", - "unicode-xid", + "unicode-xid 0.2.6", ] [[package]] @@ -8593,11 +9334,34 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] +[[package]] +name = "sys-info" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b3a0d0aba8bf96a0e1ddfdc352fc53b3df7f39318c71854910c3c4b024ae52c" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "sysctl" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225e483f02d0ad107168dc57381a8a40c3aeea6abe47f37506931f861643cfa8" +dependencies = [ + "bitflags 1.3.2", + "byteorder", + "libc", + "thiserror 1.0.69", + "walkdir", +] + [[package]] name = "system-configuration" version = "0.5.1" @@ -8644,7 +9408,7 @@ checksum = "1c38a012bed6fb9681d3bf71ffaa4f88f3b4b9ed3198cda6e4c8462d24d4bb80" dependencies = [ "anyhow", "fnv", - "futures", + "futures 0.3.31", "humantime", "opentelemetry", "pin-project", @@ -8652,7 +9416,7 @@ dependencies = [ "serde", "static_assertions", "tarpc-plugins", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-serde", "tokio-util 0.6.10", @@ -8666,8 +9430,8 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee42b4e559f17bce0385ebf511a7beb67d5cc33c12c96b7f4e9789919d9c10f" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -8677,11 +9441,11 @@ version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "fastrand", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -8714,9 +9478,9 @@ version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adcb7fd841cd518e279be3d5a3eb0636409487998a4aff22f3de87b81e88384f" dependencies = [ - "cfg-if", - "proc-macro2", - "quote", + "cfg-if 1.0.0", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -8726,8 +9490,8 @@ version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", "test-case-core", ] @@ -8753,7 +9517,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +dependencies = [ + "thiserror-impl 2.0.11", ] [[package]] @@ -8762,8 +9535,19 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", + "syn 2.0.93", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +dependencies = [ + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -8773,7 +9557,7 @@ version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "once_cell", ] @@ -8821,7 +9605,7 @@ dependencies = [ "rand 0.7.3", "rustc-hash", "sha2 0.9.9", - "thiserror", + "thiserror 1.0.69", "unicode-normalization", "wasm-bindgen", "zeroize", @@ -8859,7 +9643,9 @@ dependencies = [ "anchor-lang 0.30.1", "anyhow", "base64 0.13.1", + "clap 2.34.0", "clap 4.5.23", + "crossbeam-channel", "ellipsis-client", "env_logger 0.10.2", "hex", @@ -8878,19 +9664,27 @@ dependencies = [ "serde_json", "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-clap-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-core", + "solana-geyser-plugin-manager", + "solana-gossip", "solana-ledger", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-program", "solana-program-test 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-rpc", "solana-rpc-client", "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "solana-stake-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-streamer", + "solana-unified-scheduler-pool", "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "spl-memo", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -8928,8 +9722,8 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -9003,6 +9797,7 @@ checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" dependencies = [ "bytes", "futures-core", + "futures-io", "futures-sink", "log", "pin-project-lite", @@ -9095,7 +9890,7 @@ dependencies = [ "http-body", "hyper", "hyper-timeout", - "percent-encoding", + "percent-encoding 2.3.1", "pin-project", "prost", "rustls-pemfile", @@ -9115,9 +9910,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6fdaae4c2c638bb70fe42803a26fbd6fc6ac8c72f5c59f67ecc2a2dcabf4b07" dependencies = [ "prettyplease 0.1.25", - "proc-macro2", + "proc-macro2 1.0.92", "prost-build", - "quote", + "quote 1.0.38", "syn 1.0.109", ] @@ -9171,8 +9966,8 @@ version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -9237,8 +10032,8 @@ dependencies = [ "rand 0.8.5", "rustls", "sha1", - "thiserror", - "url", + "thiserror 1.0.69", + "url 2.5.4", "utf-8", "webpki-roots 0.24.0", ] @@ -9255,6 +10050,12 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + [[package]] name = "uint" version = "0.9.5" @@ -9267,6 +10068,18 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + [[package]] name = "unicode-ident" version = "1.0.14" @@ -9300,6 +10113,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" +[[package]] +name = "unicode-xid" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" + [[package]] name = "unicode-xid" version = "0.2.6" @@ -9331,6 +10150,12 @@ dependencies = [ "void", ] +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + [[package]] name = "untrusted" version = "0.7.1" @@ -9353,6 +10178,17 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "url" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" +dependencies = [ + "idna 0.1.5", + "matches", + "percent-encoding 1.0.1", +] + [[package]] name = "url" version = "2.5.4" @@ -9360,8 +10196,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", - "idna", - "percent-encoding", + "idna 1.0.3", + "percent-encoding 2.3.1", ] [[package]] @@ -9497,7 +10333,7 @@ version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "once_cell", "wasm-bindgen-macro", ] @@ -9510,8 +10346,8 @@ checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", "wasm-bindgen-shared", ] @@ -9522,7 +10358,7 @@ version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", "once_cell", "wasm-bindgen", @@ -9535,7 +10371,7 @@ version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ - "quote", + "quote 1.0.38", "wasm-bindgen-macro-support", ] @@ -9545,8 +10381,8 @@ version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", "wasm-bindgen-backend", "wasm-bindgen-shared", @@ -9639,7 +10475,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -9829,7 +10665,7 @@ version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "windows-sys 0.48.0", ] @@ -9868,7 +10704,7 @@ dependencies = [ "nom", "oid-registry", "rusticata-macros", - "thiserror", + "thiserror 1.0.69", "time", ] @@ -9916,8 +10752,8 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", "synstructure 0.13.1", ] @@ -9938,8 +10774,8 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -9958,8 +10794,8 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", "synstructure 0.13.1", ] @@ -9979,8 +10815,8 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -10001,8 +10837,8 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] diff --git a/Cargo.toml b/Cargo.toml index f06bb16a..a87cba48 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -68,6 +68,7 @@ spl-memo = "4.0.0" solana-account-decoder = { package = "solana-account-decoder", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-metrics = { package = "solana-metrics", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-accounts-db = { package = "solana-accounts-db", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-clap-utils = { package = "solana-clap-utils", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-client = { package = "solana-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-ledger = { package = "solana-ledger", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-program = { package = "solana-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } @@ -106,6 +107,16 @@ jito-vault-core = { git = "https://github.com/jito-foundation/restaking.git", re jito-vault-program = { git = "https://github.com/jito-foundation/restaking.git", rev = "eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d", features = ["no-entrypoint"] } jito-vault-sdk = { git = "https://github.com/jito-foundation/restaking.git", rev = "eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" } +solana-core = { package = "solana-core", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-geyser-plugin-manager = { package = "solana-geyser-plugin-manager", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-gossip = { package = "solana-gossip", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-measure = { package = "solana-measure", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-rpc = { package = "solana-rpc", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-streamer = { package = "solana-streamer", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-unified-scheduler-pool = { package = "solana-unified-scheduler-pool", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } + + + [patch.crates-io] # Force all Solana dependencies to use the Jito fork solana-program = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } @@ -115,3 +126,12 @@ solana-rpc-client = { git = "https://github.com/jito-foundation/jito-solana.git" solana-rpc-client-api = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } # necessary for ellipsis client solana-transaction-status = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } + +solana-core = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-geyser-plugin-manager = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-gossip = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-measure = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-rpc = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-streamer = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-unified-scheduler-pool = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } + diff --git a/tip-router-operator-cli/Cargo.toml b/tip-router-operator-cli/Cargo.toml index 664ffd9e..396c3ca3 100644 --- a/tip-router-operator-cli/Cargo.toml +++ b/tip-router-operator-cli/Cargo.toml @@ -9,6 +9,7 @@ anchor-lang = { workspace = true } anyhow = { workspace = true } base64 = "0.13" clap = { workspace = true } +clap_old = { package = "clap", version = "2.33.1" } ellipsis-client = "0.1" env_logger = { workspace = true } hex = "0.4" @@ -28,6 +29,7 @@ serde_json = { workspace = true } solana-account-decoder = { workspace = true } solana-accounts-db = { workspace = true } solana-client = { workspace = true } +solana-clap-utils = { workspace = true } solana-ledger = { workspace = true } solana-metrics = { workspace = true } solana-program = { workspace = true } @@ -40,6 +42,16 @@ spl-memo = { workspace = true } thiserror = { workspace = true } tokio = { workspace = true } +crossbeam-channel = "0.5" + +solana-core = { workspace = true } +solana-geyser-plugin-manager = { workspace = true } +solana-gossip = { workspace = true } +solana-measure = { workspace = true } +solana-rpc = { workspace = true } +solana-streamer = { workspace = true } +solana-unified-scheduler-pool = { workspace = true } + [dev-dependencies] solana-program-test = { workspace = true } solana-runtime = { workspace = true, features = ["dev-context-only-utils"] } diff --git a/tip-router-operator-cli/src/arg_matches.rs b/tip-router-operator-cli/src/arg_matches.rs new file mode 100644 index 00000000..d3b9fbcc --- /dev/null +++ b/tip-router-operator-cli/src/arg_matches.rs @@ -0,0 +1,597 @@ +use std::ffi::OsString; +use std::path::PathBuf; + +use clap_old::{App, AppSettings, Arg, ArgMatches, SubCommand}; +use solana_clap_utils::{ + hidden_unless_forced, + input_validators::{ + is_parsable, is_pow2, is_pubkey, is_pubkey_or_keypair, is_slot, is_valid_percentage, + }, +}; +use solana_ledger::use_snapshot_archives_at_startup; +use solana_runtime::snapshot_utils::{ + SnapshotVersion, DEFAULT_ARCHIVE_COMPRESSION, SUPPORTED_ARCHIVE_COMPRESSION, +}; +use solana_sdk::{clock::Slot, native_token::sol_to_lamports, rent::Rent, vote::state::VoteState}; +use solana_stake_program::stake_state::StakeStateV2; + +// pub fn create_snapshot_arg_matches<'a, 'b>( +// full_snapshots_archives_dir: PathBuf, +// incremental_snapshots_archives_dir: PathBuf, +// account_paths: Vec, +// ) -> ArgMatches<'a> { +// let mut app = App::new("tip-router-operator-cli"); +// ledger_tool_arg_app(&mut app); +// let args: Vec = vec![ +// "tip-router-operator-cli".into(), +// "--full-snapshot-archive-path".into(), +// full_snapshots_archives_dir.into(), +// "--incremental-snapshot-archive-path".into(), +// incremental_snapshots_archives_dir.into(), +// "--accounts".into(), +// account_paths +// .iter() +// .map(|p| p.to_string_lossy().to_string()) +// .collect::>() +// .join(",") +// .into(), +// ]; + +// app.get_matches_from(args) +// } + +pub fn ledger_tool_arg_matches<'a>( + arg_matches: &mut ArgMatches<'a>, + full_snapshots_archives_dir: PathBuf, + incremental_snapshots_archives_dir: PathBuf, + account_paths: Vec, +) { + let rent = Rent::default(); + // let default_bootstrap_validator_lamports = sol_to_lamports(500.0) + // .max(VoteState::get_rent_exempt_reserve(&rent)) + // .to_string(); + // let default_bootstrap_validator_stake_lamports = sol_to_lamports(0.5) + // .max(rent.minimum_balance(StakeStateV2::size_of())) + // .to_string(); + + let load_genesis_config_arg = load_genesis_arg(); + let accounts_db_config_args = accounts_db_args(); + let snapshot_config_args = snapshot_args(); + + let accounts_db_test_hash_calculation_arg = Arg::with_name("accounts_db_test_hash_calculation") + .long("accounts-db-test-hash-calculation") + .help("Enable hash calculation test"); + let halt_at_slot_arg = Arg::with_name("halt_at_slot") + .long("halt-at-slot") + .value_name("SLOT") + .validator(is_slot) + .takes_value(true) + .help("Halt processing at the given slot"); + let os_memory_stats_reporting_arg = Arg::with_name("os_memory_stats_reporting") + .long("os-memory-stats-reporting") + .help("Enable reporting of OS memory statistics."); + let halt_at_slot_store_hash_raw_data = Arg::with_name("halt_at_slot_store_hash_raw_data") + .long("halt-at-slot-store-hash-raw-data") + .help( + "After halting at slot, run an accounts hash calculation and store the raw hash data \ + for debugging.", + ) + .hidden(hidden_unless_forced()); + let verify_index_arg = Arg::with_name("verify_accounts_index") + .long("verify-accounts-index") + .takes_value(false) + .help("For debugging and tests on accounts index."); + let limit_load_slot_count_from_snapshot_arg = + Arg::with_name("limit_load_slot_count_from_snapshot") + .long("limit-load-slot-count-from-snapshot") + .value_name("SLOT") + .validator(is_slot) + .takes_value(true) + .help( + "For debugging and profiling with large snapshots, artificially limit how many \ + slots are loaded from a snapshot.", + ); + let hard_forks_arg = Arg::with_name("hard_forks") + .long("hard-fork") + .value_name("SLOT") + .validator(is_slot) + .multiple(true) + .takes_value(true) + .help("Add a hard fork at this slot"); + let allow_dead_slots_arg = Arg::with_name("allow_dead_slots") + .long("allow-dead-slots") + .takes_value(false) + .help("Output dead slots as well"); + let hashes_per_tick = Arg::with_name("hashes_per_tick") + .long("hashes-per-tick") + .value_name("NUM_HASHES|\"sleep\"") + .takes_value(true) + .help( + "How many PoH hashes to roll before emitting the next tick. If \"sleep\", for \ + development sleep for the target tick duration instead of hashing", + ); + let snapshot_version_arg = Arg::with_name("snapshot_version") + .long("snapshot-version") + .value_name("SNAPSHOT_VERSION") + .validator(is_parsable::) + .takes_value(true) + .default_value(SnapshotVersion::default().into()) + .help("Output snapshot version"); + let debug_key_arg = Arg::with_name("debug_key") + .long("debug-key") + .validator(is_pubkey) + .value_name("ADDRESS") + .multiple(true) + .takes_value(true) + .help("Log when transactions are processed that reference the given key(s)."); + + let geyser_plugin_args = Arg::with_name("geyser_plugin_config") + .long("geyser-plugin-config") + .value_name("FILE") + .takes_value(true) + .multiple(true) + .help("Specify the configuration file for the Geyser plugin."); + + let log_messages_bytes_limit_arg = Arg::with_name("log_messages_bytes_limit") + .long("log-messages-bytes-limit") + .takes_value(true) + .validator(is_parsable::) + .value_name("BYTES") + .help("Maximum number of bytes written to the program log before truncation"); + + let accounts_data_encoding_arg = Arg::with_name("encoding") + .long("encoding") + .takes_value(true) + .possible_values(&["base64", "base64+zstd", "jsonParsed"]) + .default_value("base64") + .help("Print account data in specified format when printing account contents."); + + let app = App::new("tip-router-operator-cli") + .about("Tip Router Operator CLI") + .version("0.1.0") + .global_setting(AppSettings::ColoredHelp) + .global_setting(AppSettings::InferSubcommands) + .global_setting(AppSettings::UnifiedHelpMessage) + .global_setting(AppSettings::VersionlessSubcommands) + .setting(AppSettings::SubcommandRequiredElseHelp) + .arg( + Arg::with_name("ledger_path") + .short("l") + .long("ledger") + .value_name("DIR") + .takes_value(true) + .global(true) + .default_value("ledger") + .help("Use DIR as ledger location"), + ) + .arg( + Arg::with_name("wal_recovery_mode") + .long("wal-recovery-mode") + .value_name("MODE") + .takes_value(true) + .global(true) + .possible_values(&[ + "tolerate_corrupted_tail_records", + "absolute_consistency", + "point_in_time", + "skip_any_corrupted_record", + ]) + .help("Mode to recovery the ledger db write ahead log"), + ) + .arg( + Arg::with_name("force_update_to_open") + .long("force-update-to-open") + .takes_value(false) + .global(true) + .help( + "Allow commands that would otherwise not alter the blockstore to make \ + necessary updates in order to open it", + ), + ) + .arg( + Arg::with_name("ignore_ulimit_nofile_error") + .long("ignore-ulimit-nofile-error") + .takes_value(false) + .global(true) + .help( + "Allow opening the blockstore to succeed even if the desired open file \ + descriptor limit cannot be configured. Use with caution as some commands may \ + run fine with a reduced file descriptor limit while others will not", + ), + ) + .arg( + Arg::with_name("block_verification_method") + .long("block-verification-method") + .value_name("METHOD") + .takes_value(true) + // .possible_values(BlockVerificationMethod::cli_names()) + .global(true), // .help(BlockVerificationMethod::cli_message()), + ) + .arg( + Arg::with_name("unified_scheduler_handler_threads") + .long("unified-scheduler-handler-threads") + .value_name("COUNT") + .takes_value(true) + // .validator(|s| is_within_range(s, 1..)) + .global(true), // .help(DefaultSchedulerPool::cli_message()), + ) + .arg( + Arg::with_name("output_format") + .long("output") + .value_name("FORMAT") + .global(true) + .takes_value(true) + .possible_values(&["json", "json-compact"]) + .help( + "Return information in specified output format, currently only available for \ + bigtable and program subcommands", + ), + ) + .arg( + Arg::with_name("verbose") + .short("v") + .long("verbose") + .global(true) + .multiple(true) + .takes_value(false) + .help("Show additional information where supported"), + ) + .subcommand( + SubCommand::with_name("create-snapshot") + .about("Create a new ledger snapshot") + .arg(&load_genesis_config_arg) + .args(&accounts_db_config_args) + .args(&snapshot_config_args) + .arg(&hard_forks_arg) + .arg(&snapshot_version_arg) + .arg(&geyser_plugin_args) + .arg(&log_messages_bytes_limit_arg) + .arg( + Arg::with_name("snapshot_slot") + .index(1) + .value_name("SLOT") + .validator(|value| { + if value.parse::().is_ok() || value == "ROOT" { + Ok(()) + } else { + Err(format!( + "Unable to parse as a number or the keyword ROOT, provided: \ + {value}" + )) + } + }) + .takes_value(true) + .help( + "Slot at which to create the snapshot; accepts keyword ROOT for the \ + highest root", + ), + ) + .arg( + Arg::with_name("output_directory") + .index(2) + .value_name("DIR") + .takes_value(true) + .help( + "Output directory for the snapshot \ + [default: --snapshot-archive-path if present else --ledger directory]", + ), + ) + .arg( + Arg::with_name("warp_slot") + .required(false) + .long("warp-slot") + .takes_value(true) + .value_name("WARP_SLOT") + .validator(is_slot) + .help( + "After loading the snapshot slot warp the ledger to WARP_SLOT, which \ + could be a slot in a galaxy far far away", + ), + ) + .arg( + Arg::with_name("faucet_lamports") + .short("t") + .long("faucet-lamports") + .value_name("LAMPORTS") + .takes_value(true) + .requires("faucet_pubkey") + .help("Number of lamports to assign to the faucet"), + ) + .arg( + Arg::with_name("faucet_pubkey") + .short("m") + .long("faucet-pubkey") + .value_name("PUBKEY") + .takes_value(true) + .validator(is_pubkey_or_keypair) + .requires("faucet_lamports") + .help("Path to file containing the faucet's pubkey"), + ) + .arg( + Arg::with_name("bootstrap_validator") + .short("b") + .long("bootstrap-validator") + .value_name("IDENTITY_PUBKEY VOTE_PUBKEY STAKE_PUBKEY") + .takes_value(true) + .validator(is_pubkey_or_keypair) + .number_of_values(3) + .multiple(true) + .help("The bootstrap validator's identity, vote and stake pubkeys"), + ) + .arg( + Arg::with_name("bootstrap_stake_authorized_pubkey") + .long("bootstrap-stake-authorized-pubkey") + .value_name("BOOTSTRAP STAKE AUTHORIZED PUBKEY") + .takes_value(true) + .validator(is_pubkey_or_keypair) + .help( + "Path to file containing the pubkey authorized to manage the \ + bootstrap validator's stake + [default: --bootstrap-validator IDENTITY_PUBKEY]", + ), + ) + // .arg( + // Arg::with_name("bootstrap_validator_lamports") + // .long("bootstrap-validator-lamports") + // .value_name("LAMPORTS") + // .takes_value(true) + // .default_value(&default_bootstrap_validator_lamports) + // .help("Number of lamports to assign to the bootstrap validator"), + // ) + // .arg( + // Arg::with_name("bootstrap_validator_stake_lamports") + // .long("bootstrap-validator-stake-lamports") + // .value_name("LAMPORTS") + // .takes_value(true) + // .default_value(&default_bootstrap_validator_stake_lamports) + // .help( + // "Number of lamports to assign to the bootstrap validator's stake \ + // account", + // ), + // ) + .arg( + Arg::with_name("rent_burn_percentage") + .long("rent-burn-percentage") + .value_name("NUMBER") + .takes_value(true) + .help("Adjust percentage of collected rent to burn") + .validator(is_valid_percentage), + ) + .arg(&hashes_per_tick) + .arg( + Arg::with_name("accounts_to_remove") + .required(false) + .long("remove-account") + .takes_value(true) + .value_name("PUBKEY") + .validator(is_pubkey) + .multiple(true) + .help("List of accounts to remove while creating the snapshot"), + ) + .arg( + Arg::with_name("feature_gates_to_deactivate") + .required(false) + .long("deactivate-feature-gate") + .takes_value(true) + .value_name("PUBKEY") + .validator(is_pubkey) + .multiple(true) + .help("List of feature gates to deactivate while creating the snapshot"), + ) + .arg( + Arg::with_name("vote_accounts_to_destake") + .required(false) + .long("destake-vote-account") + .takes_value(true) + .value_name("PUBKEY") + .validator(is_pubkey) + .multiple(true) + .help("List of validator vote accounts to destake"), + ) + .arg( + Arg::with_name("remove_stake_accounts") + .required(false) + .long("remove-stake-accounts") + .takes_value(false) + .help("Remove all existing stake accounts from the new snapshot"), + ) + .arg( + Arg::with_name("incremental") + .long("incremental") + .takes_value(false) + .help( + "Create an incremental snapshot instead of a full snapshot. This \ + requires that the ledger is loaded from a full snapshot, which will \ + be used as the base for the incremental snapshot.", + ) + .conflicts_with("no_snapshot"), + ) + .arg( + Arg::with_name("minimized") + .long("minimized") + .takes_value(false) + .help( + "Create a minimized snapshot instead of a full snapshot. This \ + snapshot will only include information needed to replay the ledger \ + from the snapshot slot to the ending slot.", + ) + .conflicts_with("incremental") + .requires("ending_slot"), + ) + .arg( + Arg::with_name("ending_slot") + .long("ending-slot") + .takes_value(true) + .value_name("ENDING_SLOT") + .help("Ending slot for minimized snapshot creation"), + ) + .arg( + Arg::with_name("snapshot_archive_format") + .long("snapshot-archive-format") + .possible_values(SUPPORTED_ARCHIVE_COMPRESSION) + .default_value(DEFAULT_ARCHIVE_COMPRESSION) + .value_name("ARCHIVE_TYPE") + .takes_value(true) + .help("Snapshot archive format to use.") + .conflicts_with("no_snapshot"), + ) + .arg( + Arg::with_name("enable_capitalization_change") + .long("enable-capitalization-change") + .takes_value(false) + .help("If snapshot creation should succeed with a capitalization delta."), + ), + ); + + let args: Vec = vec![ + "tip-router-operator-cli".into(), + "--full-snapshot-archive-path".into(), + full_snapshots_archives_dir.into(), + "--incremental-snapshot-archive-path".into(), + incremental_snapshots_archives_dir.into(), + "--accounts".into(), + account_paths + .iter() + .map(|p| p.to_string_lossy().to_string()) + .collect::>() + .join(",") + .into(), + ]; + + *arg_matches = app.get_matches_from(args); +} + +/// Returns the arguments that configure AccountsDb +pub fn accounts_db_args<'a, 'b>() -> Box<[Arg<'a, 'b>]> { + vec![ + Arg::with_name("account_paths") + .long("accounts") + .value_name("PATHS") + .takes_value(true) + .help( + "Persistent accounts location. May be specified multiple times. \ + [default: /accounts]", + ), + Arg::with_name("accounts_index_path") + .long("accounts-index-path") + .value_name("PATH") + .takes_value(true) + .multiple(true) + .help( + "Persistent accounts-index location. May be specified multiple times. \ + [default: /accounts_index]", + ), + Arg::with_name("accounts_hash_cache_path") + .long("accounts-hash-cache-path") + .value_name("PATH") + .takes_value(true) + .help( + "Use PATH as accounts hash cache location [default: /accounts_hash_cache]", + ), + Arg::with_name("accounts_index_bins") + .long("accounts-index-bins") + .value_name("BINS") + .validator(is_pow2) + .takes_value(true) + .help("Number of bins to divide the accounts index into"), + Arg::with_name("accounts_index_memory_limit_mb") + .long("accounts-index-memory-limit-mb") + .value_name("MEGABYTES") + .validator(is_parsable::) + .takes_value(true) + .help( + "How much memory the accounts index can consume. If this is exceeded, some \ + account index entries will be stored on disk.", + ), + Arg::with_name("disable_accounts_disk_index") + .long("disable-accounts-disk-index") + .help( + "Disable the disk-based accounts index. It is enabled by default. The entire \ + accounts index will be kept in memory.", + ) + .conflicts_with("accounts_index_memory_limit_mb"), + Arg::with_name("accounts_db_skip_shrink") + .long("accounts-db-skip-shrink") + .help( + "Enables faster starting of ledger-tool by skipping shrink. This option is for \ + use during testing.", + ), + Arg::with_name("accounts_db_verify_refcounts") + .long("accounts-db-verify-refcounts") + .help( + "Debug option to scan all AppendVecs and verify account index refcounts prior to \ + clean", + ) + .hidden(hidden_unless_forced()), + Arg::with_name("accounts_db_test_skip_rewrites") + .long("accounts-db-test-skip-rewrites") + .help( + "Debug option to skip rewrites for rent-exempt accounts but still add them in \ + bank delta hash calculation", + ) + .hidden(hidden_unless_forced()), + Arg::with_name("accounts_db_skip_initial_hash_calculation") + .long("accounts-db-skip-initial-hash-calculation") + .help("Do not verify accounts hash at startup.") + .hidden(hidden_unless_forced()), + Arg::with_name("accounts_db_ancient_append_vecs") + .long("accounts-db-ancient-append-vecs") + .value_name("SLOT-OFFSET") + .validator(is_parsable::) + .takes_value(true) + .help( + "AppendVecs that are older than (slots_per_epoch - SLOT-OFFSET) are squashed \ + together.", + ) + .hidden(hidden_unless_forced()), + ] + .into_boxed_slice() +} + +// For our current version of CLAP, the value passed to Arg::default_value() +// must be a &str. But, we can't convert an integer to a &str at compile time. +// So, declare this constant and enforce equality with the following unit test +// test_max_genesis_archive_unpacked_size_constant +const MAX_GENESIS_ARCHIVE_UNPACKED_SIZE_STR: &str = "10485760"; + +/// Returns the arguments that configure loading genesis +pub fn load_genesis_arg<'a, 'b>() -> Arg<'a, 'b> { + Arg::with_name("max_genesis_archive_unpacked_size") + .long("max-genesis-archive-unpacked-size") + .value_name("NUMBER") + .takes_value(true) + .default_value(MAX_GENESIS_ARCHIVE_UNPACKED_SIZE_STR) + .help("maximum total uncompressed size of unpacked genesis archive") +} + +/// Returns the arguments that configure snapshot loading +pub fn snapshot_args<'a, 'b>() -> Box<[Arg<'a, 'b>]> { + vec![ + Arg::with_name("no_snapshot") + .long("no-snapshot") + .takes_value(false) + .help("Do not start from a local snapshot if present"), + Arg::with_name("snapshots") + .long("snapshots") + .alias("snapshot-archive-path") + .alias("full-snapshot-archive-path") + .value_name("DIR") + .takes_value(true) + .global(true) + .help("Use DIR for snapshot location [default: --ledger value]"), + Arg::with_name("incremental_snapshot_archive_path") + .long("incremental-snapshot-archive-path") + .value_name("DIR") + .takes_value(true) + .global(true) + .help("Use DIR for separate incremental snapshot location"), + Arg::with_name(use_snapshot_archives_at_startup::cli::NAME) + .long(use_snapshot_archives_at_startup::cli::LONG_ARG) + .takes_value(true) + .possible_values(use_snapshot_archives_at_startup::cli::POSSIBLE_VALUES) + .default_value(use_snapshot_archives_at_startup::cli::default_value_for_ledger_tool()) + .help(use_snapshot_archives_at_startup::cli::HELP) + .long_help(use_snapshot_archives_at_startup::cli::LONG_HELP), + ] + .into_boxed_slice() +} diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index 3bdb794e..99fce61b 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -1,9 +1,9 @@ -use std::path::PathBuf; +use std::{fmt::Display, path::PathBuf}; use clap::Parser; use solana_sdk::pubkey::Pubkey; -#[derive(Clone, Parser)] +#[derive(Clone, Parser, Debug)] #[command(author, version, about)] pub struct Cli { #[arg(short, long, env)] @@ -37,7 +37,7 @@ pub struct Cli { pub command: Commands, } -#[derive(clap::Subcommand, Clone)] +#[derive(clap::Subcommand, Clone, Debug)] pub enum Commands { Run { #[arg(short, long, env)] diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index 9c8586c7..f2e4c9c3 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -173,6 +173,26 @@ pub fn get_bank_from_ledger( ..Default::default() }; let exit = Arc::new(AtomicBool::new(false)); + + // Call ledger_utils::load_and_process_ledger here + // let LoadAndProcessLedgerOutput { + // bank_forks, + // starting_snapshot_hashes, + // accounts_background_service, + // .. + // } = match solana_ledger_tool::ledger_utils::load_and_process_ledger( + // &genesis_config, + // &blockstore, + // account_paths, + // None, + // Some(&snapshot_config), + // ) { + // Ok(res) => res, + // Err(e) => { + // panic!("Failed to load bank forks: {}", e); + // } + // }; + let (bank_forks, leader_schedule_cache, _starting_snapshot_hashes, ..) = match bank_forks_utils::load_bank_forks( &genesis_config, diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index 03a7f53c..1df10ccf 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -4,11 +4,15 @@ pub mod tip_router; pub use crate::cli::{Cli, Commands}; pub mod cli; pub use crate::process_epoch::process_epoch; +pub mod arg_matches; pub mod backup_snapshots; +mod load_and_process_ledger; pub mod process_epoch; pub mod submit; +use std::fs; use std::path::{Path, PathBuf}; +use std::process::Command; use std::time::Instant; use anchor_lang::prelude::*; @@ -186,3 +190,109 @@ pub fn get_meta_merkle_root( Ok(meta_merkle_tree) } + +fn get_validator_cmdline() -> Result { + let output = Command::new("pgrep").arg("solana-validator").output()?; + + let pid = String::from_utf8_lossy(&output.stdout).trim().to_string(); + + let cmdline = fs::read_to_string(format!("/proc/{}/cmdline", pid))?; + + Ok(cmdline.replace('\0', " ")) +} + +pub fn emit_solana_validator_args() -> std::result::Result<(), anyhow::Error> { + // Find solana-validator process and get its command line args + let validator_cmdline = match get_validator_cmdline() { + Ok(cmdline) => cmdline, + Err(_) => return Err(anyhow::anyhow!("Validator process not found")), + }; + + let validator_config: Vec = validator_cmdline + .split_whitespace() + .map(String::from) + .collect(); + + if validator_config.is_empty() { + return Err(anyhow::anyhow!("Validator process not found")); + } + + let mut limit_ledger_size = None; + let mut full_snapshot_interval = None; + let mut max_full_snapshots = None; + let mut incremental_snapshot_path = None; + let mut incremental_snapshot_interval = None; + let mut max_incremental_snapshots = None; + + for (i, arg) in validator_config.iter().enumerate() { + match arg.as_str() { + "--limit-ledger-size" => { + if let Some(value) = validator_config.get(i + 1) { + limit_ledger_size = Some(value.clone()); + } + } + "--full-snapshot-interval-slots" => { + if let Some(value) = validator_config.get(i + 1) { + full_snapshot_interval = Some(value.clone()); + } + } + "--maximum-full-snapshots-to-retain" => { + if let Some(value) = validator_config.get(i + 1) { + max_full_snapshots = Some(value.clone()); + } + } + "--incremental-snapshot-archive-path" => { + if let Some(value) = validator_config.get(i + 1) { + incremental_snapshot_path = Some(value.clone()); + } + } + "--incremental-snapshot-interval-slots" => { + if let Some(value) = validator_config.get(i + 1) { + incremental_snapshot_interval = Some(value.clone()); + } + } + "--maximum-incremental-snapshots-to-retain" => { + if let Some(value) = validator_config.get(i + 1) { + max_incremental_snapshots = Some(value.clone()); + } + } + _ => {} + } + } + + datapoint_info!( + "tip_router_cli.validator_config", + ( + "limit_ledger_size", + limit_ledger_size.unwrap_or_default(), + String + ), + ( + "full_snapshot_interval", + full_snapshot_interval.unwrap_or_default(), + String + ), + ( + "max_full_snapshots", + max_full_snapshots.unwrap_or_default(), + String + ), + ( + "incremental_snapshot_path", + incremental_snapshot_path.unwrap_or_default(), + String + ), + ( + "incremental_snapshot_interval", + incremental_snapshot_interval.unwrap_or_default(), + String + ), + ( + "max_incremental_snapshots", + max_incremental_snapshots.unwrap_or_default(), + String + ) + ); + + Ok(()) +} diff --git a/tip-router-operator-cli/src/load_and_process_ledger.rs b/tip-router-operator-cli/src/load_and_process_ledger.rs new file mode 100644 index 00000000..9c0ec9f4 --- /dev/null +++ b/tip-router-operator-cli/src/load_and_process_ledger.rs @@ -0,0 +1,586 @@ +use { + clap_old::{value_t, value_t_or_exit, values_t_or_exit, ArgMatches}, + crossbeam_channel::unbounded, + log::*, + solana_accounts_db::{ + hardened_unpack::open_genesis_config, utils::create_all_accounts_run_and_snapshot_dirs, + }, + solana_core::{ + accounts_hash_verifier::AccountsHashVerifier, validator::BlockVerificationMethod, + }, + solana_geyser_plugin_manager::geyser_plugin_service::{ + GeyserPluginService, GeyserPluginServiceError, + }, + solana_gossip::{cluster_info::ClusterInfo, contact_info::ContactInfo}, + solana_ledger::{ + bank_forks_utils::{self, BankForksUtilsError}, + blockstore::{Blockstore, BlockstoreError}, + blockstore_options::{ + AccessType, BlockstoreOptions, BlockstoreRecoveryMode, LedgerColumnOptions, + ShredStorageType, + }, + blockstore_processor::{ + self, BlockstoreProcessorError, ProcessOptions, TransactionStatusSender, + }, + use_snapshot_archives_at_startup::UseSnapshotArchivesAtStartup, + }, + solana_measure::measure, + solana_rpc::transaction_status_service::TransactionStatusService, + solana_runtime::{ + accounts_background_service::{ + AbsRequestHandlers, AbsRequestSender, AccountsBackgroundService, + PrunedBanksRequestHandler, SnapshotRequestHandler, + }, + bank_forks::BankForks, + prioritization_fee_cache::PrioritizationFeeCache, + snapshot_config::SnapshotConfig, + snapshot_hash::StartingSnapshotHashes, + snapshot_utils::{ + self, clean_orphaned_account_snapshot_dirs, move_and_async_delete_path_contents, + }, + }, + solana_sdk::{ + clock::Slot, genesis_config::GenesisConfig, pubkey::Pubkey, signature::Signer, + signer::keypair::Keypair, timing::timestamp, transaction::VersionedTransaction, + }, + solana_streamer::socket::SocketAddrSpace, + solana_unified_scheduler_pool::DefaultSchedulerPool, + std::{ + path::{Path, PathBuf}, + process::exit, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, RwLock, + }, + }, + thiserror::Error, +}; + +pub const LEDGER_TOOL_DIRECTORY: &str = "ledger_tool"; + +const PROCESS_SLOTS_HELP_STRING: &str = + "The starting slot is either the latest found snapshot slot, or genesis (slot 0) if the \ + --no-snapshot flag was specified or if no snapshots were found. \ + The ending slot is the snapshot creation slot for create-snapshot, the value for \ + --halt-at-slot if specified, or the highest slot in the blockstore."; + +#[derive(Error, Debug)] +pub(crate) enum LoadAndProcessLedgerError { + #[error("failed to clean orphaned account snapshot directories: {0}")] + CleanOrphanedAccountSnapshotDirectories(#[source] std::io::Error), + + #[error("failed to create all run and snapshot directories: {0}")] + CreateAllAccountsRunAndSnapshotDirectories(#[source] std::io::Error), + + #[error("custom accounts path is not supported with seconday blockstore access")] + CustomAccountsPathUnsupported(#[source] BlockstoreError), + + #[error( + "failed to process blockstore from starting slot {0} to ending slot {1}; the ending slot \ + is less than the starting slot. {2}" + )] + EndingSlotLessThanStartingSlot(Slot, Slot, String), + + #[error( + "failed to process blockstore from starting slot {0} to ending slot {1}; the blockstore \ + does not contain a replayable sequence of blocks between these slots. {2}" + )] + EndingSlotNotReachableFromStartingSlot(Slot, Slot, String), + + #[error("failed to setup geyser service: {0}")] + GeyserServiceSetup(#[source] GeyserPluginServiceError), + + #[error("failed to load bank forks: {0}")] + LoadBankForks(#[source] BankForksUtilsError), + + #[error("failed to process blockstore from root: {0}")] + ProcessBlockstoreFromRoot(#[source] BlockstoreProcessorError), +} + +pub fn load_and_process_ledger_or_exit( + arg_matches: &ArgMatches, + genesis_config: &GenesisConfig, + blockstore: Arc, + process_options: ProcessOptions, + snapshot_archive_path: Option, + incremental_snapshot_archive_path: Option, +) -> (Arc>, Option) { + load_and_process_ledger( + arg_matches, + genesis_config, + blockstore, + process_options, + snapshot_archive_path, + incremental_snapshot_archive_path, + ) + .unwrap_or_else(|err| { + eprintln!("Exiting. Failed to load and process ledger: {err}"); + exit(1); + }) +} + +pub fn load_and_process_ledger( + arg_matches: &ArgMatches, + genesis_config: &GenesisConfig, + blockstore: Arc, + process_options: ProcessOptions, + snapshot_archive_path: Option, + incremental_snapshot_archive_path: Option, +) -> Result<(Arc>, Option), LoadAndProcessLedgerError> { + let bank_snapshots_dir = if blockstore.is_primary_access() { + blockstore.ledger_path().join("snapshot") + } else { + blockstore + .ledger_path() + .join(LEDGER_TOOL_DIRECTORY) + .join("snapshot") + }; + + let mut starting_slot = 0; // default start check with genesis + let snapshot_config = if arg_matches.is_present("no_snapshot") { + None + } else { + let full_snapshot_archives_dir = + snapshot_archive_path.unwrap_or_else(|| blockstore.ledger_path().to_path_buf()); + let incremental_snapshot_archives_dir = + incremental_snapshot_archive_path.unwrap_or_else(|| full_snapshot_archives_dir.clone()); + if let Some(full_snapshot_slot) = snapshot_utils::get_highest_full_snapshot_archive_slot( + &full_snapshot_archives_dir, + None, + ) { + let incremental_snapshot_slot = + snapshot_utils::get_highest_incremental_snapshot_archive_slot( + &incremental_snapshot_archives_dir, + full_snapshot_slot, + None, + ) + .unwrap_or_default(); + starting_slot = std::cmp::max(full_snapshot_slot, incremental_snapshot_slot); + } + + Some(SnapshotConfig { + full_snapshot_archives_dir, + incremental_snapshot_archives_dir, + bank_snapshots_dir: bank_snapshots_dir.clone(), + ..SnapshotConfig::new_load_only() + }) + }; + + match process_options.halt_at_slot { + // Skip the following checks for sentinel values of Some(0) and None. + // For Some(0), no slots will be be replayed after starting_slot. + // For None, all available children of starting_slot will be replayed. + None | Some(0) => {} + Some(halt_slot) => { + if halt_slot < starting_slot { + return Err(LoadAndProcessLedgerError::EndingSlotLessThanStartingSlot( + starting_slot, + halt_slot, + PROCESS_SLOTS_HELP_STRING.to_string(), + )); + } + // Check if we have the slot data necessary to replay from starting_slot to >= halt_slot. + if !blockstore.slot_range_connected(starting_slot, halt_slot) { + return Err( + LoadAndProcessLedgerError::EndingSlotNotReachableFromStartingSlot( + starting_slot, + halt_slot, + PROCESS_SLOTS_HELP_STRING.to_string(), + ), + ); + } + } + } + + let account_paths = if let Some(account_paths) = arg_matches.value_of("account_paths") { + // If this blockstore access is Primary, no other process (agave-validator) can hold + // Primary access. So, allow a custom accounts path without worry of wiping the accounts + // of agave-validator. + if !blockstore.is_primary_access() { + // Attempt to open the Blockstore in Primary access; if successful, no other process + // was holding Primary so allow things to proceed with custom accounts path. Release + // the Primary access instead of holding it to give priority to agave-validator over + // agave-ledger-tool should agave-validator start before we've finished. + info!( + "Checking if another process currently holding Primary access to {:?}", + blockstore.ledger_path() + ); + Blockstore::open_with_options( + blockstore.ledger_path(), + BlockstoreOptions { + access_type: AccessType::PrimaryForMaintenance, + ..BlockstoreOptions::default() + }, + ) + // Couldn't get Primary access, error out to be defensive. + .map_err(LoadAndProcessLedgerError::CustomAccountsPathUnsupported)?; + } + account_paths.split(',').map(PathBuf::from).collect() + } else if blockstore.is_primary_access() { + vec![blockstore.ledger_path().join("accounts")] + } else { + let non_primary_accounts_path = blockstore + .ledger_path() + .join(LEDGER_TOOL_DIRECTORY) + .join("accounts"); + info!( + "Default accounts path is switched aligning with Blockstore's secondary access: {:?}", + non_primary_accounts_path + ); + vec![non_primary_accounts_path] + }; + + let (account_run_paths, account_snapshot_paths) = + create_all_accounts_run_and_snapshot_dirs(&account_paths) + .map_err(LoadAndProcessLedgerError::CreateAllAccountsRunAndSnapshotDirectories)?; + // From now on, use run/ paths in the same way as the previous account_paths. + let account_paths = account_run_paths; + + let (_, measure_clean_account_paths) = measure!( + account_paths.iter().for_each(|path| { + if path.exists() { + info!("Cleaning contents of account path: {}", path.display()); + move_and_async_delete_path_contents(path); + } + }), + "Cleaning account paths" + ); + info!("{measure_clean_account_paths}"); + + snapshot_utils::purge_incomplete_bank_snapshots(&bank_snapshots_dir); + + info!("Cleaning contents of account snapshot paths: {account_snapshot_paths:?}"); + clean_orphaned_account_snapshot_dirs(&bank_snapshots_dir, &account_snapshot_paths) + .map_err(LoadAndProcessLedgerError::CleanOrphanedAccountSnapshotDirectories)?; + + let geyser_plugin_active = arg_matches.is_present("geyser_plugin_config"); + let (accounts_update_notifier, transaction_notifier) = if geyser_plugin_active { + let geyser_config_files = vec![]; // values_t_or_exit!(arg_matches, "geyser_plugin_config", String) + // .into_iter() + // .map(PathBuf::from) + // .collect::>(); + + let (confirmed_bank_sender, confirmed_bank_receiver) = unbounded(); + drop(confirmed_bank_sender); + let geyser_service = + GeyserPluginService::new(confirmed_bank_receiver, &geyser_config_files) + .map_err(LoadAndProcessLedgerError::GeyserServiceSetup)?; + ( + geyser_service.get_accounts_update_notifier(), + geyser_service.get_transaction_notifier(), + ) + } else { + (None, None) + }; + + let exit = Arc::new(AtomicBool::new(false)); + let (bank_forks, leader_schedule_cache, starting_snapshot_hashes, ..) = + bank_forks_utils::load_bank_forks( + genesis_config, + blockstore.as_ref(), + account_paths, + None, + snapshot_config.as_ref(), + &process_options, + None, + None, // Maybe support this later, though + accounts_update_notifier, + exit.clone(), + false, + ) + .map_err(LoadAndProcessLedgerError::LoadBankForks)?; + let block_verification_method = BlockVerificationMethod::default(); + // let block_verification_method = value_t!( + // arg_matches, + // "block_verification_method", + // BlockVerificationMethod + // ) + // .unwrap_or_default(); + info!( + "Using: block-verification-method: {}", + block_verification_method, + ); + match block_verification_method { + BlockVerificationMethod::BlockstoreProcessor => { + info!("no scheduler pool is installed for block verification..."); + } + BlockVerificationMethod::UnifiedScheduler => { + let no_transaction_status_sender = None; + let no_replay_vote_sender = None; + let ignored_prioritization_fee_cache = Arc::new(PrioritizationFeeCache::new(0u64)); + bank_forks + .write() + .unwrap() + .install_scheduler_pool(DefaultSchedulerPool::new_dyn( + process_options.runtime_config.log_messages_bytes_limit, + no_transaction_status_sender, + no_replay_vote_sender, + ignored_prioritization_fee_cache, + )); + } + } + + let node_id = Arc::new(Keypair::new()); + let cluster_info = Arc::new(ClusterInfo::new( + ContactInfo::new_localhost(&node_id.pubkey(), timestamp()), + Arc::clone(&node_id), + SocketAddrSpace::Unspecified, + )); + let (accounts_package_sender, accounts_package_receiver) = crossbeam_channel::unbounded(); + let accounts_hash_verifier = AccountsHashVerifier::new( + accounts_package_sender.clone(), + accounts_package_receiver, + None, + exit.clone(), + cluster_info, + None, + SnapshotConfig::new_load_only(), + ); + let (snapshot_request_sender, snapshot_request_receiver) = crossbeam_channel::unbounded(); + let accounts_background_request_sender = AbsRequestSender::new(snapshot_request_sender.clone()); + let snapshot_request_handler = SnapshotRequestHandler { + snapshot_config: SnapshotConfig::new_load_only(), + snapshot_request_sender, + snapshot_request_receiver, + accounts_package_sender, + }; + let pruned_banks_receiver = + AccountsBackgroundService::setup_bank_drop_callback(bank_forks.clone()); + let pruned_banks_request_handler = PrunedBanksRequestHandler { + pruned_banks_receiver, + }; + let abs_request_handler = AbsRequestHandlers { + snapshot_request_handler, + pruned_banks_request_handler, + }; + let accounts_background_service = AccountsBackgroundService::new( + bank_forks.clone(), + exit.clone(), + abs_request_handler, + process_options.accounts_db_test_hash_calculation, + starting_snapshot_hashes.map(|x| x.full.0 .0), + ); + + let enable_rpc_transaction_history = arg_matches.is_present("enable_rpc_transaction_history"); + + let (transaction_status_sender, transaction_status_service) = if geyser_plugin_active + || enable_rpc_transaction_history + { + // Need Primary (R/W) access to insert transaction data; + // obtain Primary access if we do not already have it + let tss_blockstore = if enable_rpc_transaction_history && !blockstore.is_primary_access() { + Arc::new(open_blockstore( + blockstore.ledger_path(), + arg_matches, + AccessType::PrimaryForMaintenance, + )) + } else { + blockstore.clone() + }; + + let (transaction_status_sender, transaction_status_receiver) = unbounded(); + let transaction_status_service = TransactionStatusService::new( + transaction_status_receiver, + Arc::default(), + enable_rpc_transaction_history, + transaction_notifier, + tss_blockstore, + false, + exit.clone(), + ); + ( + Some(TransactionStatusSender { + sender: transaction_status_sender, + }), + Some(transaction_status_service), + ) + } else { + (None, None) + }; + + let result = blockstore_processor::process_blockstore_from_root( + blockstore.as_ref(), + &bank_forks, + &leader_schedule_cache, + &process_options, + transaction_status_sender.as_ref(), + None, + None, // Maybe support this later, though + &accounts_background_request_sender, + ) + .map(|_| (bank_forks, starting_snapshot_hashes)) + .map_err(LoadAndProcessLedgerError::ProcessBlockstoreFromRoot); + + exit.store(true, Ordering::Relaxed); + accounts_background_service.join().unwrap(); + accounts_hash_verifier.join().unwrap(); + if let Some(service) = transaction_status_service { + service.join().unwrap(); + } + + result +} + +pub fn open_blockstore( + ledger_path: &Path, + matches: &ArgMatches, + access_type: AccessType, +) -> Blockstore { + let wal_recovery_mode = matches + .value_of("wal_recovery_mode") + .map(BlockstoreRecoveryMode::from); + let force_update_to_open = matches.is_present("force_update_to_open"); + let enforce_ulimit_nofile = !matches.is_present("ignore_ulimit_nofile_error"); + let shred_storage_type = get_shred_storage_type( + ledger_path, + &format!( + "Shred storage type cannot be inferred for ledger at {ledger_path:?}, using default \ + RocksLevel", + ), + ); + + match Blockstore::open_with_options( + ledger_path, + BlockstoreOptions { + access_type: access_type.clone(), + recovery_mode: wal_recovery_mode.clone(), + enforce_ulimit_nofile, + column_options: LedgerColumnOptions { + shred_storage_type, + ..LedgerColumnOptions::default() + }, + }, + ) { + Ok(blockstore) => blockstore, + Err(BlockstoreError::RocksDb(err)) => { + // Missing essential file, indicative of blockstore not existing + let missing_blockstore = err + .to_string() + .starts_with("IO error: No such file or directory:"); + // Missing column in blockstore that is expected by software + let missing_column = err + .to_string() + .starts_with("Invalid argument: Column family not found:"); + // The blockstore settings with Primary access can resolve the + // above issues automatically, so only emit the help messages + // if access type is Secondary + let is_secondary = access_type == AccessType::Secondary; + + if missing_blockstore && is_secondary { + eprintln!( + "Failed to open blockstore at {ledger_path:?}, it is missing at least one \ + critical file: {err:?}" + ); + } else if missing_column && is_secondary { + eprintln!( + "Failed to open blockstore at {ledger_path:?}, it does not have all necessary \ + columns: {err:?}" + ); + } else { + eprintln!("Failed to open blockstore at {ledger_path:?}: {err:?}"); + exit(1); + } + if !force_update_to_open { + eprintln!("Use --force-update-to-open flag to attempt to update the blockstore"); + exit(1); + } + open_blockstore_with_temporary_primary_access( + ledger_path, + access_type, + wal_recovery_mode, + ) + .unwrap_or_else(|err| { + eprintln!( + "Failed to open blockstore (with --force-update-to-open) at {:?}: {:?}", + ledger_path, err + ); + exit(1); + }) + } + Err(err) => { + eprintln!("Failed to open blockstore at {ledger_path:?}: {err:?}"); + exit(1); + } + } +} + +pub fn get_shred_storage_type(ledger_path: &Path, message: &str) -> ShredStorageType { + // TODO: the following shred_storage_type inference must be updated once + // the rocksdb options can be constructed via load_options_file() as the + // value picked by passing None for `max_shred_storage_size` could affect + // the persisted rocksdb options file. + match ShredStorageType::from_ledger_path(ledger_path, None) { + Some(s) => s, + None => { + info!("{}", message); + ShredStorageType::RocksLevel + } + } +} + +/// Open blockstore with temporary primary access to allow necessary, +/// persistent changes to be made to the blockstore (such as creation of new +/// column family(s)). Then, continue opening with `original_access_type` +fn open_blockstore_with_temporary_primary_access( + ledger_path: &Path, + original_access_type: AccessType, + wal_recovery_mode: Option, +) -> Result { + // Open with Primary will allow any configuration that automatically + // updates to take effect + info!("Attempting to temporarily open blockstore with Primary access in order to update"); + { + let _ = Blockstore::open_with_options( + ledger_path, + BlockstoreOptions { + access_type: AccessType::PrimaryForMaintenance, + recovery_mode: wal_recovery_mode.clone(), + enforce_ulimit_nofile: true, + ..BlockstoreOptions::default() + }, + )?; + } + // Now, attempt to open the blockstore with original AccessType + info!( + "Blockstore forced open succeeded, retrying with original access: {:?}", + original_access_type + ); + Blockstore::open_with_options( + ledger_path, + BlockstoreOptions { + access_type: original_access_type, + recovery_mode: wal_recovery_mode, + enforce_ulimit_nofile: true, + ..BlockstoreOptions::default() + }, + ) +} + +pub fn open_genesis_config_by(ledger_path: &Path, matches: &ArgMatches<'_>) -> GenesisConfig { + const MAX_GENESIS_ARCHIVE_UNPACKED_SIZE: u64 = 10 * 1024 * 1024; // 10 MiB + let max_genesis_archive_unpacked_size = MAX_GENESIS_ARCHIVE_UNPACKED_SIZE; + + open_genesis_config(ledger_path, max_genesis_archive_unpacked_size).unwrap_or_else(|err| { + eprintln!("Exiting. Failed to open genesis config: {err}"); + exit(1); + }) +} + +pub fn get_program_ids(tx: &VersionedTransaction) -> impl Iterator + '_ { + let message = &tx.message; + let account_keys = message.static_account_keys(); + + message + .instructions() + .iter() + .map(|ix| ix.program_id(account_keys)) +} + +/// Get the AccessType required, based on `process_options` +pub(crate) fn get_access_type(process_options: &ProcessOptions) -> AccessType { + match process_options.use_snapshot_archives_at_startup { + UseSnapshotArchivesAtStartup::Always => AccessType::Secondary, + UseSnapshotArchivesAtStartup::Never => AccessType::PrimaryForMaintenance, + UseSnapshotArchivesAtStartup::WhenNewest => AccessType::PrimaryForMaintenance, + } +} diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 05ef079e..5842ae60 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -3,7 +3,7 @@ use ::{ clap::Parser, ellipsis_client::{ClientSubset, EllipsisClient}, log::{error, info}, - solana_metrics::set_host_id, + solana_metrics::{datapoint_info, set_host_id}, solana_rpc_client::rpc_client::RpcClient, solana_sdk::{ clock::DEFAULT_SLOTS_PER_EPOCH, @@ -40,23 +40,7 @@ async fn main() -> Result<()> { let tx = Transaction::new_with_payer(&[ix], Some(&keypair.pubkey())); rpc_client.process_transaction(tx, &[&keypair]).await?; - info!( - "CLI Arguments: - keypair_path: {} - operator_address: {} - rpc_url: {} - ledger_path: {} - account_paths: {:?} - full_snapshots_path: {:?} - snapshot_output_dir: {}", - cli.keypair_path, - cli.operator_address, - cli.rpc_url, - cli.ledger_path.display(), - cli.account_paths, - cli.full_snapshots_path, - cli.snapshot_output_dir.display() - ); + info!("CLI Arguments: {:?}", cli); match cli.command { Commands::Run { From 787b911ba0c5edf4fa2d15af5cc7f20463b13157 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Mon, 27 Jan 2025 16:54:40 -0500 Subject: [PATCH 036/112] Link to main process --- tip-router-operator-cli/src/arg_matches.rs | 2 +- tip-router-operator-cli/src/ledger_utils.rs | 87 ++++++++++++--------- 2 files changed, 49 insertions(+), 40 deletions(-) diff --git a/tip-router-operator-cli/src/arg_matches.rs b/tip-router-operator-cli/src/arg_matches.rs index d3b9fbcc..8cf3a418 100644 --- a/tip-router-operator-cli/src/arg_matches.rs +++ b/tip-router-operator-cli/src/arg_matches.rs @@ -40,7 +40,7 @@ use solana_stake_program::stake_state::StakeStateV2; // app.get_matches_from(args) // } -pub fn ledger_tool_arg_matches<'a>( +pub fn set_ledger_tool_arg_matches<'a>( arg_matches: &mut ArgMatches<'a>, full_snapshots_archives_dir: PathBuf, incremental_snapshots_archives_dir: PathBuf, diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index f2e4c9c3..6e0aebb3 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -4,6 +4,7 @@ use std::{ time::Instant, }; +use clap_old::ArgMatches; use log::{info, warn}; use solana_accounts_db::hardened_unpack::{open_genesis_config, MAX_GENESIS_ARCHIVE_UNPACKED_SIZE}; use solana_ledger::{ @@ -20,6 +21,8 @@ use solana_runtime::{ }; use solana_sdk::{clock::Slot, pubkey::Pubkey}; +use crate::{arg_matches, load_and_process_ledger}; + // TODO: Use Result and propagate errors more gracefully /// Create the Bank for a desired slot for given file paths. pub fn get_bank_from_ledger( @@ -174,54 +177,60 @@ pub fn get_bank_from_ledger( }; let exit = Arc::new(AtomicBool::new(false)); - // Call ledger_utils::load_and_process_ledger here - // let LoadAndProcessLedgerOutput { - // bank_forks, - // starting_snapshot_hashes, - // accounts_background_service, - // .. - // } = match solana_ledger_tool::ledger_utils::load_and_process_ledger( - // &genesis_config, - // &blockstore, - // account_paths, - // None, - // Some(&snapshot_config), - // ) { - // Ok(res) => res, - // Err(e) => { - // panic!("Failed to load bank forks: {}", e); - // } - // }; + let mut arg_matches = ArgMatches::new(); + arg_matches::set_ledger_tool_arg_matches( + &mut arg_matches, + snapshot_config.full_snapshot_archives_dir.clone(), + snapshot_config.incremental_snapshot_archives_dir.clone(), + account_paths, + ); - let (bank_forks, leader_schedule_cache, _starting_snapshot_hashes, ..) = - match bank_forks_utils::load_bank_forks( + // Call ledger_utils::load_and_process_ledger here + let (bank_forks, starting_snapshot_hashes) = + match crate::load_and_process_ledger::load_and_process_ledger( + &arg_matches, &genesis_config, - &blockstore, - account_paths, - None, - Some(&snapshot_config), - &process_options, - None, - None, // Maybe support this later, though - None, - exit, - false, + Arc::new(blockstore), + process_options, + Some(snapshot_config.full_snapshot_archives_dir), + Some(snapshot_config.incremental_snapshot_archives_dir), ) { Ok(res) => res, Err(e) => { - datapoint_error!( - "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), - ("state", "load_bank_forks", String), - ("status", "error", String), - ("step", 4, i64), - ("error", format!("{:?}", e), String), - ("duration_ms", start_time.elapsed().as_millis() as i64, i64), - ); + // TODO datapoint_error! panic!("Failed to load bank forks: {}", e); } }; + // let (bank_forks, leader_schedule_cache, _starting_snapshot_hashes, ..) = + // match bank_forks_utils::load_bank_forks( + // &genesis_config, + // &blockstore, + // account_paths, + // None, + // Some(&snapshot_config), + // &process_options, + // None, + // None, // Maybe support this later, though + // None, + // exit, + // false, + // ) { + // Ok(res) => res, + // Err(e) => { + // datapoint_error!( + // "tip_router_cli.get_bank", + // ("operator", operator_address.to_string(), String), + // ("state", "load_bank_forks", String), + // ("status", "error", String), + // ("step", 4, i64), + // ("error", format!("{:?}", e), String), + // ("duration_ms", start_time.elapsed().as_millis() as i64, i64), + // ); + // panic!("Failed to load bank forks: {}", e); + // } + // }; + // STEP 4: Process blockstore from root // datapoint_info!( From 26dc401763bcf8de6a205038b326b7348bf4861b Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Mon, 27 Jan 2025 16:54:56 -0500 Subject: [PATCH 037/112] Revert "copy over ledger utils fn" This reverts commit fe39a974edfd89e8d553256341818578b182376d. --- Cargo.lock | 1762 +++++------------ Cargo.toml | 20 - tip-router-operator-cli/Cargo.toml | 12 - tip-router-operator-cli/src/arg_matches.rs | 597 ------ tip-router-operator-cli/src/cli.rs | 6 +- tip-router-operator-cli/src/ledger_utils.rs | 20 - tip-router-operator-cli/src/lib.rs | 110 - .../src/load_and_process_ledger.rs | 586 ------ tip-router-operator-cli/src/main.rs | 20 +- 9 files changed, 484 insertions(+), 2649 deletions(-) delete mode 100644 tip-router-operator-cli/src/arg_matches.rs delete mode 100644 tip-router-operator-cli/src/load_and_process_ledger.rs diff --git a/Cargo.lock b/Cargo.lock index 3306828f..2667e172 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -42,7 +42,7 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cipher", "cpufeatures", "opaque-debug", @@ -80,7 +80,7 @@ version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "getrandom 0.2.15", "once_cell", "version_check", @@ -124,8 +124,8 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "anchor-syn 0.24.2", "anyhow", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "regex", "syn 1.0.109", ] @@ -137,8 +137,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47fe28365b33e8334dd70ae2f34a43892363012fe239cf37d2ee91693575b1f8" dependencies = [ "anchor-syn 0.30.1", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -150,8 +150,8 @@ dependencies = [ "anchor-syn 0.24.2", "anyhow", "bs58 0.4.0", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "rustversion", "syn 1.0.109", ] @@ -164,8 +164,8 @@ checksum = "3c288d496168268d198d9b53ee9f4f9d260a55ba4df9877ea1d4486ad6109e0f" dependencies = [ "anchor-syn 0.30.1", "bs58 0.5.1", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -175,7 +175,7 @@ version = "0.24.2" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" dependencies = [ "anchor-syn 0.24.2", - "proc-macro2 1.0.92", + "proc-macro2", "syn 1.0.109", ] @@ -186,7 +186,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49b77b6948d0eeaaa129ce79eea5bbbb9937375a9241d909ca8fb9e006bb6e90" dependencies = [ "anchor-syn 0.30.1", - "quote 1.0.38", + "quote", "syn 1.0.109", ] @@ -196,8 +196,8 @@ version = "0.24.2" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" dependencies = [ "anchor-syn 0.24.2", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -208,7 +208,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d20bb569c5a557c86101b944721d865e1fd0a4c67c381d31a44a84f07f84828" dependencies = [ "anchor-syn 0.30.1", - "quote 1.0.38", + "quote", "syn 1.0.109", ] @@ -219,8 +219,8 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "anchor-syn 0.24.2", "anyhow", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -231,8 +231,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cebd8d0671a3a9dc3160c48598d652c34c77de6be4d44345b8b514323284d57" dependencies = [ "anchor-syn 0.30.1", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -244,8 +244,8 @@ dependencies = [ "anchor-syn 0.24.2", "anyhow", "heck 0.3.3", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -256,8 +256,8 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "anchor-syn 0.24.2", "anyhow", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -272,8 +272,8 @@ dependencies = [ "anyhow", "bs58 0.5.1", "heck 0.3.3", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "serde_json", "syn 1.0.109", ] @@ -285,8 +285,8 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "anchor-syn 0.24.2", "anyhow", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -297,8 +297,8 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "anchor-syn 0.24.2", "anyhow", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -309,7 +309,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04368b5abef4266250ca8d1d12f4dff860242681e4ec22b885dcfe354fd35aa1" dependencies = [ "anchor-syn 0.30.1", - "quote 1.0.38", + "quote", "syn 1.0.109", ] @@ -321,8 +321,8 @@ checksum = "e0bb0e0911ad4a70cab880cdd6287fe1e880a1a9d8e4e6defa8e9044b9796a6c" dependencies = [ "anchor-syn 0.30.1", "borsh-derive-internal 0.10.4", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -332,8 +332,8 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ef415ff156dc82e9ecb943189b0cb241b3a6bfc26a180234dc21bd3ef3ce0cb" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -357,7 +357,7 @@ dependencies = [ "borsh 0.10.4", "bytemuck", "solana-program", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -383,7 +383,7 @@ dependencies = [ "bytemuck", "getrandom 0.2.15", "solana-program", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -419,14 +419,14 @@ dependencies = [ "anyhow", "bs58 0.3.1", "heck 0.3.3", - "proc-macro2 1.0.92", + "proc-macro2", "proc-macro2-diagnostics", - "quote 1.0.38", + "quote", "serde", "serde_json", "sha2 0.9.9", "syn 1.0.109", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -439,13 +439,13 @@ dependencies = [ "bs58 0.5.1", "cargo_toml 0.19.2", "heck 0.3.3", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "serde", "serde_json", "sha2 0.10.8", "syn 1.0.109", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -536,8 +536,8 @@ dependencies = [ "include_dir", "itertools 0.10.5", "proc-macro-error", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -601,7 +601,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" dependencies = [ - "quote 1.0.38", + "quote", "syn 1.0.109", ] @@ -613,8 +613,8 @@ checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ "num-bigint 0.4.6", "num-traits", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -649,8 +649,8 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -694,7 +694,7 @@ dependencies = [ "nom", "num-traits", "rusticata-macros", - "thiserror 1.0.69", + "thiserror", "time", ] @@ -704,8 +704,8 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", "synstructure 0.12.6", ] @@ -716,8 +716,8 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -778,8 +778,8 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -789,8 +789,8 @@ version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -838,7 +838,7 @@ dependencies = [ "matchit", "memchr", "mime", - "percent-encoding 2.3.1", + "percent-encoding", "pin-project-lite", "rustversion", "serde", @@ -886,7 +886,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cfg-if 1.0.0", + "cfg-if", "libc", "miniz_oxide", "object", @@ -946,8 +946,8 @@ dependencies = [ "lazycell", "peeking_take_while", "prettyplease 0.2.25", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "regex", "rustc-hash", "shlex", @@ -999,7 +999,7 @@ dependencies = [ "arrayref", "arrayvec", "cc", - "cfg-if 1.0.0", + "cfg-if", "constant_time_eq", "digest 0.10.7", ] @@ -1046,7 +1046,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115e54d64eb62cdebad391c19efc9dce4981c690c85a33a12199d99bb9546fee" dependencies = [ "borsh-derive 0.10.4", - "hashbrown 0.13.2", + "hashbrown 0.12.3", ] [[package]] @@ -1068,7 +1068,7 @@ dependencies = [ "borsh-derive-internal 0.9.3", "borsh-schema-derive-internal 0.9.3", "proc-macro-crate 0.1.5", - "proc-macro2 1.0.92", + "proc-macro2", "syn 1.0.109", ] @@ -1081,7 +1081,7 @@ dependencies = [ "borsh-derive-internal 0.10.4", "borsh-schema-derive-internal 0.10.4", "proc-macro-crate 0.1.5", - "proc-macro2 1.0.92", + "proc-macro2", "syn 1.0.109", ] @@ -1093,8 +1093,8 @@ checksum = "c2593a3b8b938bd68373196c9832f516be11fa487ef4ae745eb282e6a56a7244" dependencies = [ "once_cell", "proc-macro-crate 3.2.0", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -1104,8 +1104,8 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -1115,8 +1115,8 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65d6ba50644c98714aa2a70d13d7df3cd75cd2b523a2b452bf010443800976b3" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -1126,8 +1126,8 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -1137,8 +1137,8 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "276691d96f063427be83e6692b86148e488ebba9f48f77788724ca027ba3b6d4" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -1184,16 +1184,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "bstr" -version = "1.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "bumpalo" version = "3.16.0" @@ -1227,8 +1217,8 @@ version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -1247,8 +1237,8 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -1292,7 +1282,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "190baaad529bcfbde9e1a19022c42781bdb6ff9de25721abdb8fd98c0807730b" dependencies = [ "libc", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -1335,12 +1325,6 @@ dependencies = [ "nom", ] -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - [[package]] name = "cfg-if" version = "1.0.0" @@ -1394,7 +1378,7 @@ checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", - "libloading 0.8.6", + "libloading", ] [[package]] @@ -1466,8 +1450,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck 0.5.0", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -1533,7 +1517,7 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "wasm-bindgen", ] @@ -1568,12 +1552,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - [[package]] name = "core-foundation" version = "0.9.4" @@ -1617,7 +1595,7 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -1721,8 +1699,8 @@ checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "strsim 0.11.1", "syn 2.0.93", ] @@ -1734,7 +1712,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", - "quote 1.0.38", + "quote", "syn 2.0.93", ] @@ -1744,7 +1722,7 @@ version = "5.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "hashbrown 0.14.5", "lock_api", "once_cell", @@ -1758,17 +1736,6 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" -[[package]] -name = "default-env" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f753eb82d29277e79efc625e84aecacfd4851ee50e05a8573a4740239a77bfd3" -dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "syn 0.15.44", -] - [[package]] name = "der" version = "0.5.1" @@ -1814,24 +1781,11 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] -[[package]] -name = "derive_more" -version = "0.99.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" -dependencies = [ - "convert_case", - "proc-macro2 1.0.92", - "quote 1.0.38", - "rustc_version", - "syn 2.0.93", -] - [[package]] name = "dialoguer" version = "0.10.4" @@ -1888,16 +1842,6 @@ dependencies = [ "dirs-sys", ] -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if 1.0.0", - "dirs-sys-next", -] - [[package]] name = "dirs-sys" version = "0.3.7" @@ -1909,25 +1853,14 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi 0.3.9", -] - [[package]] name = "displaydoc" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -1949,8 +1882,8 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -2014,8 +1947,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" dependencies = [ "enum-ordinalize", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -2042,7 +1975,7 @@ dependencies = [ "solana-program-test 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", "solana-transaction-status", - "thiserror 1.0.69", + "thiserror", "tokio", ] @@ -2058,7 +1991,7 @@ version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -2076,8 +2009,8 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -2089,8 +2022,8 @@ checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" dependencies = [ "num-bigint 0.4.6", "num-traits", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -2152,23 +2085,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "etcd-client" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4b0ea5ef6dc2388a4b1669fa32097249bc03a15417b97cb75e38afb309e4a89" -dependencies = [ - "http", - "prost", - "tokio", - "tokio-stream", - "tonic", - "tonic-build", - "tower", - "tower-service", + "windows-sys 0.52.0", ] [[package]] @@ -2204,7 +2121,7 @@ version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "libredox", "windows-sys 0.59.0", @@ -2262,7 +2179,7 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ - "percent-encoding 2.3.1", + "percent-encoding", ] [[package]] @@ -2283,12 +2200,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" -[[package]] -name = "futures" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" - [[package]] name = "futures" version = "0.3.31" @@ -2329,7 +2240,6 @@ dependencies = [ "futures-core", "futures-task", "futures-util", - "num_cpus", ] [[package]] @@ -2344,8 +2254,8 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -2367,7 +2277,6 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ - "futures 0.1.31", "futures-channel", "futures-core", "futures-io", @@ -2407,7 +2316,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "libc", "wasi 0.9.0+wasi-snapshot-preview1", @@ -2420,7 +2329,7 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", @@ -2439,19 +2348,6 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" -[[package]] -name = "globset" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" -dependencies = [ - "aho-corasick", - "bstr", - "log", - "regex-automata", - "regex-syntax", -] - [[package]] name = "goauth" version = "0.13.1" @@ -2459,7 +2355,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8af59a261bcf42f45d1b261232847b9b850ba0a1419d6100698246fb66e9240" dependencies = [ "arc-swap", - "futures 0.3.31", + "futures", "log", "reqwest", "serde", @@ -2740,7 +2636,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca815a891b24fdfb243fa3239c86154392b0953ee584aa1a2a1f66d20cbe75cc" dependencies = [ "bytes", - "futures 0.3.31", + "futures", "headers", "http", "hyper", @@ -2926,8 +2822,8 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -2937,17 +2833,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" -[[package]] -name = "idna" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - [[package]] name = "idna" version = "1.0.3" @@ -3006,8 +2891,8 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", ] [[package]] @@ -3058,7 +2943,7 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -3113,8 +2998,8 @@ name = "jito-account-traits-derive" version = "0.0.3" source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -3142,32 +3027,7 @@ dependencies = [ "spl-associated-token-account", "spl-token 4.0.0", "spl-token-2022 3.0.5", - "thiserror 1.0.69", -] - -[[package]] -name = "jito-programs-vote-state" -version = "0.1.5" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "anchor-lang 0.24.2", - "bincode", - "serde", - "serde_derive", - "solana-program", -] - -[[package]] -name = "jito-protos" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "bytes", - "prost", - "prost-types", - "protobuf-src", - "tonic", - "tonic-build", + "thiserror", ] [[package]] @@ -3184,7 +3044,7 @@ dependencies = [ "serde_with 3.12.0", "solana-program", "solana-sdk", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -3201,7 +3061,7 @@ dependencies = [ "solana-program", "spl-associated-token-account", "spl-token 4.0.0", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -3210,7 +3070,7 @@ version = "0.0.3" source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ "borsh 0.10.4", - "cfg-if 1.0.0", + "cfg-if", "const_str_to_pubkey", "jito-bytemuck", "jito-jsm-core", @@ -3223,7 +3083,7 @@ dependencies = [ "spl-associated-token-account", "spl-token 4.0.0", "spl-token-2022 3.0.5", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -3234,19 +3094,7 @@ dependencies = [ "borsh 0.10.4", "shank", "solana-program", - "thiserror 1.0.69", -] - -[[package]] -name = "jito-tip-distribution" -version = "0.1.5" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "anchor-lang 0.24.2", - "default-env", - "jito-programs-vote-state", - "solana-program", - "solana-security-txt", + "thiserror", ] [[package]] @@ -3256,16 +3104,6 @@ dependencies = [ "anchor-lang 0.30.1", ] -[[package]] -name = "jito-tip-payment" -version = "0.1.5" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "anchor-lang 0.24.2", - "default-env", - "solana-security-txt", -] - [[package]] name = "jito-tip-payment-sdk" version = "0.0.1" @@ -3286,7 +3124,7 @@ dependencies = [ "clap-markdown", "dotenv", "env_logger 0.10.2", - "futures 0.3.31", + "futures", "jito-bytemuck", "jito-jsm-core", "jito-restaking-client", @@ -3312,7 +3150,7 @@ dependencies = [ "spl-associated-token-account", "spl-stake-pool", "spl-token 4.0.0", - "thiserror 1.0.69", + "thiserror", "tokio", ] @@ -3330,7 +3168,7 @@ dependencies = [ "serde_with 3.12.0", "solana-program", "solana-sdk", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -3354,7 +3192,7 @@ dependencies = [ "spl-associated-token-account", "spl-math", "spl-token 4.0.0", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -3386,7 +3224,7 @@ dependencies = [ "spl-associated-token-account", "spl-stake-pool", "spl-token 4.0.0", - "thiserror 1.0.69", + "thiserror", "tokio", ] @@ -3397,7 +3235,7 @@ dependencies = [ "assert_matches", "borsh 0.10.4", "bytemuck", - "cfg-if 1.0.0", + "cfg-if", "const_str_to_pubkey", "jito-bytemuck", "jito-jsm-core", @@ -3416,7 +3254,7 @@ dependencies = [ "spl-stake-pool", "spl-token 4.0.0", "switchboard-on-demand", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -3446,7 +3284,7 @@ dependencies = [ "serde_with 3.12.0", "solana-program", "solana-sdk", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -3464,7 +3302,7 @@ dependencies = [ "spl-associated-token-account", "spl-token 4.0.0", "spl-token-2022 3.0.5", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -3473,7 +3311,7 @@ version = "0.0.3" source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ "borsh 0.10.4", - "cfg-if 1.0.0", + "cfg-if", "const_str_to_pubkey", "jito-bytemuck", "jito-jsm-core", @@ -3486,7 +3324,7 @@ dependencies = [ "spl-associated-token-account", "spl-token 4.0.0", "spl-token-2022 3.0.5", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -3498,7 +3336,7 @@ dependencies = [ "shank", "solana-program", "spl-token 4.0.0", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -3520,43 +3358,13 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "json5" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" -dependencies = [ - "pest", - "pest_derive", - "serde", -] - -[[package]] -name = "jsonrpc-client-transports" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b99d4207e2a04fb4581746903c2bb7eb376f88de9c699d0f3e10feeac0cd3a" -dependencies = [ - "derive_more", - "futures 0.3.31", - "jsonrpc-core", - "jsonrpc-pubsub", - "jsonrpc-server-utils", - "log", - "parity-tokio-ipc", - "serde", - "serde_json", - "tokio", - "url 1.7.2", -] - [[package]] name = "jsonrpc-core" version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" dependencies = [ - "futures 0.3.31", + "futures", "futures-executor", "futures-util", "log", @@ -3565,92 +3373,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "jsonrpc-core-client" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b51da17abecbdab3e3d4f26b01c5ec075e88d3abe3ab3b05dc9aa69392764ec0" -dependencies = [ - "futures 0.3.31", - "jsonrpc-client-transports", -] - -[[package]] -name = "jsonrpc-derive" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b939a78fa820cdfcb7ee7484466746a7377760970f6f9c6fe19f9edcc8a38d2" -dependencies = [ - "proc-macro-crate 0.1.5", - "proc-macro2 1.0.92", - "quote 1.0.38", - "syn 1.0.109", -] - -[[package]] -name = "jsonrpc-http-server" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1dea6e07251d9ce6a552abfb5d7ad6bc290a4596c8dcc3d795fae2bbdc1f3ff" -dependencies = [ - "futures 0.3.31", - "hyper", - "jsonrpc-core", - "jsonrpc-server-utils", - "log", - "net2", - "parking_lot 0.11.2", - "unicase", -] - -[[package]] -name = "jsonrpc-ipc-server" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382bb0206323ca7cda3dcd7e245cea86d37d02457a02a975e3378fb149a48845" -dependencies = [ - "futures 0.3.31", - "jsonrpc-core", - "jsonrpc-server-utils", - "log", - "parity-tokio-ipc", - "parking_lot 0.11.2", - "tower-service", -] - -[[package]] -name = "jsonrpc-pubsub" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240f87695e6c6f62fb37f05c02c04953cf68d6408b8c1c89de85c7a0125b1011" -dependencies = [ - "futures 0.3.31", - "jsonrpc-core", - "lazy_static", - "log", - "parking_lot 0.11.2", - "rand 0.7.3", - "serde", -] - -[[package]] -name = "jsonrpc-server-utils" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4fdea130485b572c39a460d50888beb00afb3e35de23ccd7fad8ff19f0e0d4" -dependencies = [ - "bytes", - "futures 0.3.31", - "globset", - "jsonrpc-core", - "lazy_static", - "log", - "tokio", - "tokio-stream", - "tokio-util 0.6.10", - "unicase", -] - [[package]] name = "keccak" version = "0.1.5" @@ -3688,24 +3410,14 @@ version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if 1.0.0", - "winapi 0.3.9", -] - [[package]] name = "libloading" version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ - "cfg-if 1.0.0", - "windows-targets 0.52.6", + "cfg-if", + "windows-targets 0.48.5", ] [[package]] @@ -3856,7 +3568,7 @@ dependencies = [ "ark-bn254", "ark-ff", "num-bigint 0.4.6", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -3918,12 +3630,6 @@ dependencies = [ "libc", ] -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - [[package]] name = "matchit" version = "0.7.3" @@ -4002,7 +3708,7 @@ dependencies = [ "spl-associated-token-account", "spl-math", "spl-token 4.0.0", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -4011,12 +3717,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "min-max-heap" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2687e6cf9c00f48e9284cf9fd15f2ef341d03cc7743abf9df4c5f07fdee50b18" - [[package]] name = "minimal-lexical" version = "0.2.1" @@ -4049,7 +3749,7 @@ version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "downcast", "fragile", "lazy_static", @@ -4064,9 +3764,9 @@ version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" dependencies = [ - "cfg-if 1.0.0", - "proc-macro2 1.0.92", - "quote 1.0.38", + "cfg-if", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -4086,8 +3786,8 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -4114,17 +3814,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "net2" -version = "0.2.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac" -dependencies = [ - "cfg-if 0.1.10", - "libc", - "winapi 0.3.9", -] - [[package]] name = "nix" version = "0.26.4" @@ -4132,7 +3821,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ "bitflags 1.3.2", - "cfg-if 1.0.0", + "cfg-if", "libc", "memoffset 0.7.1", "pin-utils", @@ -4234,8 +3923,8 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -4245,8 +3934,8 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -4346,8 +4035,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ "proc-macro-crate 1.3.1", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -4358,8 +4047,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ "proc-macro-crate 1.3.1", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -4369,9 +4058,9 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 3.2.0", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -4418,7 +4107,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ "bitflags 2.6.0", - "cfg-if 1.0.0", + "cfg-if", "foreign-types", "libc", "once_cell", @@ -4432,8 +4121,8 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -4478,10 +4167,10 @@ dependencies = [ "futures-util", "js-sys", "lazy_static", - "percent-encoding 2.3.1", + "percent-encoding", "pin-project", "rand 0.8.5", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -4508,25 +4197,11 @@ checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7" dependencies = [ "Inflector", "proc-macro-error", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] -[[package]] -name = "parity-tokio-ipc" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9981e32fb75e004cc148f5fb70342f393830e0a4aa62e3cc93b50976218d42b6" -dependencies = [ - "futures 0.3.31", - "libc", - "log", - "rand 0.7.3", - "tokio", - "winapi 0.3.9", -] - [[package]] name = "parking_lot" version = "0.11.2" @@ -4554,7 +4229,7 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "instant", "libc", "redox_syscall 0.2.16", @@ -4568,7 +4243,7 @@ version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "redox_syscall 0.5.8", "smallvec", @@ -4614,12 +4289,6 @@ dependencies = [ "base64 0.13.1", ] -[[package]] -name = "percent-encoding" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" - [[package]] name = "percent-encoding" version = "2.3.1" @@ -4636,77 +4305,32 @@ dependencies = [ ] [[package]] -name = "pest" -version = "2.7.15" +name = "petgraph" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ - "memchr", - "thiserror 2.0.11", - "ucd-trie", + "fixedbitset", + "indexmap 2.7.0", ] [[package]] -name = "pest_derive" -version = "2.7.15" +name = "pin-project" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ - "pest", - "pest_generator", + "pin-project-internal", ] [[package]] -name = "pest_generator" -version = "2.7.15" +name = "pin-project-internal" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ - "pest", - "pest_meta", - "proc-macro2 1.0.92", - "quote 1.0.38", - "syn 2.0.93", -] - -[[package]] -name = "pest_meta" -version = "2.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" -dependencies = [ - "once_cell", - "pest", - "sha2 0.10.8", -] - -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap 2.7.0", -] - -[[package]] -name = "pin-project" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" -dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -4751,7 +4375,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "opaque-debug", "universal-hash", @@ -4814,7 +4438,7 @@ version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" dependencies = [ - "proc-macro2 1.0.92", + "proc-macro2", "syn 1.0.109", ] @@ -4824,16 +4448,10 @@ version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ - "proc-macro2 1.0.92", + "proc-macro2", "syn 2.0.93", ] -[[package]] -name = "prio-graph" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6492a75ca57066a4479af45efa302bed448680182b0563f96300645d5f896097" - [[package]] name = "proc-macro-crate" version = "0.1.5" @@ -4869,8 +4487,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", "version_check", ] @@ -4881,20 +4499,11 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "version_check", ] -[[package]] -name = "proc-macro2" -version = "0.4.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -dependencies = [ - "unicode-xid 0.1.0", -] - [[package]] name = "proc-macro2" version = "1.0.92" @@ -4910,8 +4519,8 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", "version_check", "yansi", @@ -4957,8 +4566,8 @@ checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" dependencies = [ "anyhow", "itertools 0.10.5", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -4995,8 +4604,8 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -5006,7 +4615,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" dependencies = [ - "percent-encoding 2.3.1", + "percent-encoding", ] [[package]] @@ -5015,8 +4624,8 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -5032,7 +4641,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "thiserror 1.0.69", + "thiserror", "tokio", "tracing", ] @@ -5050,7 +4659,7 @@ dependencies = [ "rustls", "rustls-native-certs", "slab", - "thiserror 1.0.69", + "thiserror", "tinyvec", "tracing", ] @@ -5068,22 +4677,13 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "quote" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -dependencies = [ - "proc-macro2 0.4.30", -] - [[package]] name = "quote" version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ - "proc-macro2 1.0.92", + "proc-macro2", ] [[package]] @@ -5230,7 +4830,7 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom 0.2.15", "libredox", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -5310,7 +4910,7 @@ dependencies = [ "mime", "native-tls", "once_cell", - "percent-encoding 2.3.1", + "percent-encoding", "pin-project-lite", "rustls", "rustls-pemfile", @@ -5324,7 +4924,7 @@ dependencies = [ "tokio-rustls", "tokio-util 0.7.13", "tower-service", - "url 2.5.4", + "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -5354,7 +4954,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", - "cfg-if 1.0.0", + "cfg-if", "getrandom 0.2.15", "libc", "spin 0.9.8", @@ -5386,8 +4986,8 @@ version = "0.7.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -5401,15 +5001,6 @@ dependencies = [ "librocksdb-sys", ] -[[package]] -name = "rolling-file" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8395b4f860856b740f20a296ea2cd4d823e81a2658cf05ef61be22916026a906" -dependencies = [ - "chrono", -] - [[package]] name = "rpassword" version = "7.3.1" @@ -5487,7 +5078,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -5584,8 +5175,8 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -5676,8 +5267,8 @@ version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -5758,8 +5349,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" dependencies = [ "darling", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -5770,44 +5361,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ "darling", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] -[[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" -dependencies = [ - "indexmap 2.7.0", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", -] - -[[package]] -name = "sha-1" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha1" version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest 0.10.7", ] @@ -5819,7 +5384,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ "block-buffer 0.9.0", - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest 0.9.0", "opaque-debug", @@ -5831,7 +5396,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest 0.10.7", ] @@ -5888,8 +5453,8 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9bf2645f8eebde043da69200195058e7b59806705104f908a31d05ca82844ce" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "shank_macro_impl", "shank_render", "syn 1.0.109", @@ -5902,8 +5467,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93d0593f48acb0a722906416b1f6b8926f6571eb9af16d566a7c65427f269f50" dependencies = [ "anyhow", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "serde", "syn 1.0.109", ] @@ -5914,8 +5479,8 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "121175ba61809189f888dc5822ebfd30fa0d91e1e1f61d25a4d40b0847b3075e" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "shank_macro_impl", ] @@ -6042,21 +5607,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "soketto" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" -dependencies = [ - "base64 0.13.1", - "bytes", - "futures 0.3.31", - "httparse", - "log", - "rand 0.8.5", - "sha-1", -] - [[package]] name = "solana-account-decoder" version = "1.18.26" @@ -6078,7 +5628,7 @@ dependencies = [ "spl-token-2022 1.0.0", "spl-token-group-interface 0.1.0", "spl-token-metadata-interface 0.2.0", - "thiserror 1.0.69", + "thiserror", "zstd", ] @@ -6102,7 +5652,7 @@ dependencies = [ "spl-token-2022 1.0.0", "spl-token-group-interface 0.1.0", "spl-token-metadata-interface 0.2.0", - "thiserror 1.0.69", + "thiserror", "zstd", ] @@ -6150,7 +5700,7 @@ dependencies = [ "solana-config-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-frozen-abi 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure", + "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-nohash-hasher", "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6164,7 +5714,7 @@ dependencies = [ "strum_macros", "tar", "tempfile", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -6210,7 +5760,7 @@ dependencies = [ "solana-config-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure", + "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-nohash-hasher", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", @@ -6224,7 +5774,7 @@ dependencies = [ "strum_macros", "tar", "tempfile", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -6245,7 +5795,7 @@ dependencies = [ "solana-program", "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -6265,7 +5815,7 @@ dependencies = [ "solana-program", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -6275,12 +5825,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e58fa66e1e240097665e7f87b267aa8e976ea3fcbd86918c8fd218c875395ada" dependencies = [ "borsh 1.5.3", - "futures 0.3.31", + "futures", "solana-banks-interface 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-program", "solana-sdk", "tarpc", - "thiserror 1.0.69", + "thiserror", "tokio", "tokio-serde", ] @@ -6291,12 +5841,12 @@ version = "1.18.26" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" dependencies = [ "borsh 1.5.3", - "futures 0.3.31", + "futures", "solana-banks-interface 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-program", "solana-sdk", "tarpc", - "thiserror 1.0.69", + "thiserror", "tokio", "tokio-serde", ] @@ -6330,7 +5880,7 @@ checksum = "8cbe287a0f859362de9b155fabd44e479eba26d5d80e07a7d021297b7b06ecba" dependencies = [ "bincode", "crossbeam-channel", - "futures 0.3.31", + "futures", "solana-accounts-db 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-banks-interface 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6349,7 +5899,7 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "bincode", "crossbeam-channel", - "futures 0.3.31", + "futures", "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-banks-interface 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", @@ -6391,12 +5941,12 @@ dependencies = [ "libsecp256k1 0.6.0", "log", "scopeguard", - "solana-measure", + "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", "solana-zk-token-sdk 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana_rbpf", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -6409,12 +5959,12 @@ dependencies = [ "libsecp256k1 0.6.0", "log", "scopeguard", - "solana-measure", + "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "solana-zk-token-sdk 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana_rbpf", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -6430,7 +5980,7 @@ dependencies = [ "modular-bitfield", "num_enum 0.7.3", "rand 0.8.5", - "solana-measure", + "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", "tempfile", ] @@ -6447,7 +5997,7 @@ dependencies = [ "modular-bitfield", "num_enum 0.7.3", "rand 0.8.5", - "solana-measure", + "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "tempfile", ] @@ -6464,13 +6014,13 @@ dependencies = [ "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-ledger", "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure", + "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-poh", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "solana-transaction-status", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -6484,10 +6034,10 @@ dependencies = [ "rpassword", "solana-remote-wallet 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", - "thiserror 1.0.69", + "thiserror", "tiny-bip39", "uriparse", - "url 2.5.4", + "url", ] [[package]] @@ -6500,25 +6050,10 @@ dependencies = [ "rpassword", "solana-remote-wallet 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "thiserror 1.0.69", + "thiserror", "tiny-bip39", "uriparse", - "url 2.5.4", -] - -[[package]] -name = "solana-cli-config" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "dirs-next", - "lazy_static", - "serde", - "serde_derive", - "serde_yaml", - "solana-clap-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", - "url 2.5.4", + "url", ] [[package]] @@ -6530,7 +6065,7 @@ dependencies = [ "async-trait", "bincode", "dashmap", - "futures 0.3.31", + "futures", "futures-util", "indexmap 2.7.0", "indicatif", @@ -6538,7 +6073,7 @@ dependencies = [ "quinn", "rayon", "solana-connection-cache 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure", + "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-pubsub-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-quic-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6546,11 +6081,11 @@ dependencies = [ "solana-rpc-client-api", "solana-rpc-client-nonce-utils 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", - "solana-streamer", + "solana-streamer 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-thin-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-tpu-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-udp-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.69", + "thiserror", "tokio", ] @@ -6562,7 +6097,7 @@ dependencies = [ "async-trait", "bincode", "dashmap", - "futures 0.3.31", + "futures", "futures-util", "indexmap 2.7.0", "indicatif", @@ -6570,7 +6105,7 @@ dependencies = [ "quinn", "rayon", "solana-connection-cache 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure", + "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-pubsub-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-quic-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", @@ -6578,11 +6113,11 @@ dependencies = [ "solana-rpc-client-api", "solana-rpc-client-nonce-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "solana-streamer", + "solana-streamer 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-thin-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-tpu-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-udp-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "thiserror 1.0.69", + "thiserror", "tokio", ] @@ -6647,10 +6182,10 @@ dependencies = [ "rand 0.8.5", "rayon", "rcgen", - "solana-measure", + "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", - "thiserror 1.0.69", + "thiserror", "tokio", ] @@ -6668,97 +6203,11 @@ dependencies = [ "rand 0.8.5", "rayon", "rcgen", - "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", - "thiserror 1.0.69", - "tokio", -] - -[[package]] -name = "solana-core" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "anchor-lang 0.24.2", - "base64 0.21.7", - "bincode", - "bs58 0.4.0", - "bytes", - "chrono", - "crossbeam-channel", - "dashmap", - "eager", - "etcd-client", - "futures 0.3.31", - "histogram", - "itertools 0.10.5", - "jito-protos", - "jito-tip-distribution", - "jito-tip-payment", - "lazy_static", - "log", - "lru", - "min-max-heap", - "num_enum 0.7.3", - "prio-graph", - "prost", - "prost-types", - "quinn", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rayon", - "rcgen", - "rolling-file", - "rustc_version", - "rustls", - "serde", - "serde_bytes", - "serde_derive", - "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-bloom", - "solana-bundle", - "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-cost-model 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-entry", - "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-geyser-plugin-manager", - "solana-gossip", - "solana-ledger", - "solana-measure", + "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-net-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-poh", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-quic-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rpc", - "solana-rpc-client-api", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-runtime-plugin", "solana-sdk", - "solana-send-transaction-service 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-streamer", - "solana-tpu-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-transaction-status", - "solana-turbine", - "solana-unified-scheduler-pool", - "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-wen-restart", - "strum", - "strum_macros", - "sys-info", - "sysctl", - "tempfile", - "thiserror 1.0.69", + "thiserror", "tokio", - "tonic", - "tonic-build", - "trees", ] [[package]] @@ -6821,7 +6270,7 @@ dependencies = [ "rand 0.8.5", "rayon", "serde", - "solana-measure", + "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-merkle-tree", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", @@ -6829,29 +6278,6 @@ dependencies = [ "solana-sdk", ] -[[package]] -name = "solana-faucet" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "bincode", - "byteorder", - "clap 2.34.0", - "crossbeam-channel", - "log", - "serde", - "serde_derive", - "solana-clap-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-cli-config", - "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", - "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "spl-memo", - "thiserror 1.0.69", - "tokio", -] - [[package]] name = "solana-frozen-abi" version = "1.18.26" @@ -6874,7 +6300,7 @@ dependencies = [ "sha2 0.10.8", "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "subtle", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -6898,7 +6324,7 @@ dependencies = [ "sha2 0.10.8", "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "subtle", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -6907,8 +6333,8 @@ version = "1.18.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c142f779c3633ac83c84d04ff06c70e1f558c876f13358bed77ba629c7417932" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "rustc_version", "syn 2.0.93", ] @@ -6918,49 +6344,12 @@ name = "solana-frozen-abi-macro" version = "1.18.26" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "rustc_version", "syn 2.0.93", ] -[[package]] -name = "solana-geyser-plugin-interface" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "log", - "solana-sdk", - "solana-transaction-status", - "thiserror 1.0.69", -] - -[[package]] -name = "solana-geyser-plugin-manager" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "bs58 0.4.0", - "crossbeam-channel", - "json5", - "jsonrpc-core", - "jsonrpc-server-utils", - "libloading 0.7.4", - "log", - "serde_json", - "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-entry", - "solana-geyser-plugin-interface", - "solana-ledger", - "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rpc", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", - "solana-transaction-status", - "thiserror 1.0.69", -] - [[package]] name = "solana-gossip" version = "1.18.26" @@ -6993,21 +6382,21 @@ dependencies = [ "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-ledger", "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure", + "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-net-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "solana-streamer", + "solana-streamer 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-thin-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-tpu-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "static_assertions", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -7024,7 +6413,7 @@ dependencies = [ "crossbeam-channel", "dashmap", "fs_extra", - "futures 0.3.31", + "futures", "itertools 0.10.5", "lazy_static", "libc", @@ -7052,7 +6441,7 @@ dependencies = [ "solana-entry", "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure", + "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", @@ -7071,7 +6460,7 @@ dependencies = [ "strum", "strum_macros", "tempfile", - "thiserror 1.0.69", + "thiserror", "tokio", "tokio-stream", "trees", @@ -7084,7 +6473,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b58f70f5883b0f26a6011ed23f76c493a3f22df63aec46cfe8e1b9bf82b5cc" dependencies = [ "log", - "solana-measure", + "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", "solana_rbpf", @@ -7096,7 +6485,7 @@ version = "1.18.26" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" dependencies = [ "log", - "solana-measure", + "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "solana_rbpf", @@ -7123,6 +6512,16 @@ dependencies = [ "log", ] +[[package]] +name = "solana-measure" +version = "1.18.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c01a7f9cdc9d9d37a3d5651b2fe7ec9d433c2a3470b9f35897e373b421f0737" +dependencies = [ + "log", + "solana-sdk", +] + [[package]] name = "solana-measure" version = "1.18.26" @@ -7153,7 +6552,7 @@ dependencies = [ "log", "reqwest", "solana-sdk", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -7167,7 +6566,7 @@ dependencies = [ "log", "reqwest", "solana-sdk", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -7189,7 +6588,7 @@ dependencies = [ "solana-sdk", "solana-version 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "tokio", - "url 2.5.4", + "url", ] [[package]] @@ -7210,7 +6609,7 @@ dependencies = [ "solana-sdk", "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "tokio", - "url 2.5.4", + "url", ] [[package]] @@ -7286,11 +6685,11 @@ dependencies = [ "log", "solana-entry", "solana-ledger", - "solana-measure", + "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -7341,7 +6740,7 @@ dependencies = [ "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk-macro", - "thiserror 1.0.69", + "thiserror", "tiny-bip39", "wasm-bindgen", "zeroize", @@ -7368,11 +6767,11 @@ dependencies = [ "serde", "solana-frozen-abi 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure", + "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", "solana_rbpf", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -7395,11 +6794,11 @@ dependencies = [ "serde", "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure", + "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "solana_rbpf", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -7428,7 +6827,7 @@ dependencies = [ "solana-vote-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana_rbpf", "test-case", - "thiserror 1.0.69", + "thiserror", "tokio", ] @@ -7457,7 +6856,7 @@ dependencies = [ "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana_rbpf", "test-case", - "thiserror 1.0.69", + "thiserror", "tokio", ] @@ -7478,12 +6877,12 @@ dependencies = [ "solana-account-decoder 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-rpc-client-api", "solana-sdk", - "thiserror 1.0.69", + "thiserror", "tokio", "tokio-stream", "tokio-tungstenite", "tungstenite", - "url 2.5.4", + "url", ] [[package]] @@ -7502,12 +6901,12 @@ dependencies = [ "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-rpc-client-api", "solana-sdk", - "thiserror 1.0.69", + "thiserror", "tokio", "tokio-stream", "tokio-tungstenite", "tungstenite", - "url 2.5.4", + "url", ] [[package]] @@ -7518,7 +6917,7 @@ checksum = "5a90e40ee593f6e9ddd722d296df56743514ae804975a76d47e7afed4e3da244" dependencies = [ "async-mutex", "async-trait", - "futures 0.3.31", + "futures", "itertools 0.10.5", "lazy_static", "log", @@ -7527,13 +6926,13 @@ dependencies = [ "rcgen", "rustls", "solana-connection-cache 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure", + "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-net-utils 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-rpc-client-api", "solana-sdk", - "solana-streamer", - "thiserror 1.0.69", + "solana-streamer 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror", "tokio", ] @@ -7544,7 +6943,7 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "async-mutex", "async-trait", - "futures 0.3.31", + "futures", "itertools 0.10.5", "lazy_static", "log", @@ -7553,13 +6952,13 @@ dependencies = [ "rcgen", "rustls", "solana-connection-cache 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure", + "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-net-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-rpc-client-api", "solana-sdk", - "solana-streamer", - "thiserror 1.0.69", + "solana-streamer 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "thiserror", "tokio", ] @@ -7597,7 +6996,7 @@ dependencies = [ "qstring", "semver", "solana-sdk", - "thiserror 1.0.69", + "thiserror", "uriparse", ] @@ -7615,68 +7014,10 @@ dependencies = [ "qstring", "semver", "solana-sdk", - "thiserror 1.0.69", + "thiserror", "uriparse", ] -[[package]] -name = "solana-rpc" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "base64 0.21.7", - "bincode", - "bs58 0.4.0", - "crossbeam-channel", - "dashmap", - "itertools 0.10.5", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", - "jsonrpc-http-server", - "jsonrpc-pubsub", - "libc", - "log", - "rayon", - "regex", - "serde", - "serde_derive", - "serde_json", - "soketto", - "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-bundle", - "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-entry", - "solana-faucet", - "solana-gossip", - "solana-ledger", - "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-poh", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rpc-client-api", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", - "solana-send-transaction-service 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-stake-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-storage-bigtable", - "solana-streamer", - "solana-tpu-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-transaction-status", - "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "spl-token 4.0.0", - "spl-token-2022 1.0.0", - "stream-cancel", - "thiserror 1.0.69", - "tokio", - "tokio-util 0.6.10", -] - [[package]] name = "solana-rpc-client" version = "1.18.26" @@ -7722,7 +7063,7 @@ dependencies = [ "solana-transaction-status", "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "spl-token-2022 1.0.0", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -7735,7 +7076,7 @@ dependencies = [ "solana-clap-utils 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-rpc-client", "solana-sdk", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -7747,7 +7088,7 @@ dependencies = [ "solana-clap-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-rpc-client", "solana-sdk", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -7804,7 +7145,7 @@ dependencies = [ "solana-frozen-abi 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-loader-v4-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure", + "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-perf 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7823,7 +7164,7 @@ dependencies = [ "symlink", "tar", "tempfile", - "thiserror 1.0.69", + "thiserror", "zstd", ] @@ -7880,7 +7221,7 @@ dependencies = [ "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-loader-v4-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure", + "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", @@ -7899,29 +7240,10 @@ dependencies = [ "symlink", "tar", "tempfile", - "thiserror 1.0.69", + "thiserror", "zstd", ] -[[package]] -name = "solana-runtime-plugin" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "crossbeam-channel", - "json5", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", - "jsonrpc-ipc-server", - "jsonrpc-server-utils", - "libloading 0.7.4", - "log", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", - "thiserror 1.0.69", -] - [[package]] name = "solana-sdk" version = "1.18.26" @@ -7972,7 +7294,7 @@ dependencies = [ "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-program", "solana-sdk-macro", - "thiserror 1.0.69", + "thiserror", "uriparse", "wasm-bindgen", ] @@ -7983,8 +7305,8 @@ version = "1.18.26" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" dependencies = [ "bs58 0.4.0", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "rustversion", "syn 2.0.93", ] @@ -8004,7 +7326,7 @@ dependencies = [ "crossbeam-channel", "log", "solana-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure", + "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", @@ -8020,7 +7342,7 @@ dependencies = [ "log", "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-gossip", - "solana-measure", + "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", @@ -8067,7 +7389,7 @@ dependencies = [ "bzip2", "enum-iterator", "flate2", - "futures 0.3.31", + "futures", "goauth", "http", "hyper", @@ -8083,7 +7405,7 @@ dependencies = [ "solana-sdk", "solana-storage-proto", "solana-transaction-status", - "thiserror 1.0.69", + "thiserror", "tokio", "tonic", "zstd", @@ -8105,6 +7427,39 @@ dependencies = [ "tonic-build", ] +[[package]] +name = "solana-streamer" +version = "1.18.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8476e41ad94fe492e8c06697ee35912cf3080aae0c9e9ac6430835256ccf056" +dependencies = [ + "async-channel", + "bytes", + "crossbeam-channel", + "futures-util", + "histogram", + "indexmap 2.7.0", + "itertools 0.10.5", + "libc", + "log", + "nix", + "pem", + "percentage", + "pkcs8", + "quinn", + "quinn-proto", + "rand 0.8.5", + "rcgen", + "rustls", + "smallvec", + "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-perf 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-sdk", + "thiserror", + "tokio", + "x509-parser", +] + [[package]] name = "solana-streamer" version = "1.18.26" @@ -8132,7 +7487,7 @@ dependencies = [ "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "thiserror 1.0.69", + "thiserror", "tokio", "x509-parser", ] @@ -8207,13 +7562,13 @@ dependencies = [ "log", "rayon", "solana-connection-cache 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure", + "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-pubsub-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-rpc-client", "solana-rpc-client-api", "solana-sdk", - "thiserror 1.0.69", + "thiserror", "tokio", ] @@ -8230,13 +7585,13 @@ dependencies = [ "log", "rayon", "solana-connection-cache 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure", + "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-pubsub-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-rpc-client", "solana-rpc-client-api", "solana-sdk", - "thiserror 1.0.69", + "thiserror", "tokio", ] @@ -8261,43 +7616,7 @@ dependencies = [ "spl-memo", "spl-token 4.0.0", "spl-token-2022 1.0.0", - "thiserror 1.0.69", -] - -[[package]] -name = "solana-turbine" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "bincode", - "bytes", - "crossbeam-channel", - "futures 0.3.31", - "itertools 0.10.5", - "log", - "lru", - "quinn", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rayon", - "rcgen", - "rustls", - "solana-entry", - "solana-gossip", - "solana-ledger", - "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-poh", - "solana-quic-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rpc", - "solana-rpc-client-api", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", - "solana-streamer", - "thiserror 1.0.69", - "tokio", + "thiserror", ] [[package]] @@ -8310,8 +7629,8 @@ dependencies = [ "solana-connection-cache 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-net-utils 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", - "solana-streamer", - "thiserror 1.0.69", + "solana-streamer 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror", "tokio", ] @@ -8324,29 +7643,11 @@ dependencies = [ "solana-connection-cache 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-net-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "solana-streamer", - "thiserror 1.0.69", + "solana-streamer 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "thiserror", "tokio", ] -[[package]] -name = "solana-unified-scheduler-logic" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" - -[[package]] -name = "solana-unified-scheduler-pool" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "solana-ledger", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", - "solana-unified-scheduler-logic", - "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", -] - [[package]] name = "solana-version" version = "1.18.26" @@ -8394,7 +7695,7 @@ dependencies = [ "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", "solana-vote-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -8412,7 +7713,7 @@ dependencies = [ "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -8434,7 +7735,7 @@ dependencies = [ "solana-program", "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -8455,27 +7756,7 @@ dependencies = [ "solana-program", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "thiserror 1.0.69", -] - -[[package]] -name = "solana-wen-restart" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "log", - "prost", - "prost-build", - "prost-types", - "protobuf-src", - "rustc_version", - "solana-gossip", - "solana-ledger", - "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-program", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", - "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "thiserror", ] [[package]] @@ -8530,7 +7811,7 @@ dependencies = [ "solana-program", "solana-sdk", "subtle", - "thiserror 1.0.69", + "thiserror", "zeroize", ] @@ -8558,7 +7839,7 @@ dependencies = [ "solana-program", "solana-sdk", "subtle", - "thiserror 1.0.69", + "thiserror", "zeroize", ] @@ -8577,7 +7858,7 @@ dependencies = [ "rand 0.8.5", "rustc-demangle", "scroll", - "thiserror 1.0.69", + "thiserror", "winapi 0.3.9", ] @@ -8616,7 +7897,7 @@ dependencies = [ "solana-program", "spl-token 4.0.0", "spl-token-2022 1.0.0", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -8647,7 +7928,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" dependencies = [ - "quote 1.0.38", + "quote", "spl-discriminator-syn 0.1.2", "syn 2.0.93", ] @@ -8658,7 +7939,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" dependencies = [ - "quote 1.0.38", + "quote", "spl-discriminator-syn 0.2.0", "syn 2.0.93", ] @@ -8669,11 +7950,11 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18fea7be851bd98d10721782ea958097c03a0c2a07d8d4997041d0ece6319a63" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "sha2 0.10.8", "syn 2.0.93", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -8682,11 +7963,11 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c1f05593b7ca9eac7caca309720f2eafb96355e037e6d373b909a80fe7b69b9" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "sha2 0.10.8", "syn 2.0.93", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -8699,7 +7980,7 @@ dependencies = [ "num-derive 0.3.3", "num-traits", "solana-program", - "thiserror 1.0.69", + "thiserror", "uint", ] @@ -8748,7 +8029,7 @@ dependencies = [ "num-traits", "solana-program", "spl-program-error-derive 0.3.2", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -8761,7 +8042,7 @@ dependencies = [ "num-traits", "solana-program", "spl-program-error-derive 0.4.1", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -8770,8 +8051,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1845dfe71fd68f70382232742e758557afe973ae19e6c06807b2c30f5d5cb474" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "sha2 0.10.8", "syn 2.0.93", ] @@ -8782,8 +8063,8 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d375dd76c517836353e093c2dbb490938ff72821ab568b545fd30ab3256b3e" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "sha2 0.10.8", "syn 2.0.93", ] @@ -8808,7 +8089,7 @@ dependencies = [ "spl-math", "spl-pod 0.1.0", "spl-token-2022 0.9.0", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -8865,7 +8146,7 @@ dependencies = [ "num-traits", "num_enum 0.5.11", "solana-program", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -8880,7 +8161,7 @@ dependencies = [ "num-traits", "num_enum 0.6.1", "solana-program", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -8902,7 +8183,7 @@ dependencies = [ "spl-token-metadata-interface 0.2.0", "spl-transfer-hook-interface 0.3.0", "spl-type-length-value 0.3.0", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -8926,7 +8207,7 @@ dependencies = [ "spl-token-metadata-interface 0.2.0", "spl-transfer-hook-interface 0.4.1", "spl-type-length-value 0.3.0", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -8950,7 +8231,7 @@ dependencies = [ "spl-token-metadata-interface 0.3.5", "spl-transfer-hook-interface 0.6.5", "spl-type-length-value 0.4.6", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -9093,17 +8374,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "stream-cancel" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9fbf9bd71e4cf18d68a8a0951c0e5b7255920c0cd992c4ff51cddd6ef514a3" -dependencies = [ - "futures-core", - "pin-project", - "tokio", -] - [[package]] name = "strsim" version = "0.8.0" @@ -9138,8 +8408,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "rustversion", "syn 1.0.109", ] @@ -9255,7 +8525,7 @@ dependencies = [ "bincode", "borsh 0.10.4", "bytemuck", - "futures 0.3.31", + "futures", "lazy_static", "libsecp256k1 0.7.1", "log", @@ -9277,25 +8547,14 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7973cce6668464ea31f176d85b13c7ab3bba2cb3b77a2ed26abd7801688010a" -[[package]] -name = "syn" -version = "0.15.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" -dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "unicode-xid 0.1.0", -] - [[package]] name = "syn" version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "unicode-ident", ] @@ -9305,8 +8564,8 @@ version = "2.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "unicode-ident", ] @@ -9322,10 +8581,10 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", - "unicode-xid 0.2.6", + "unicode-xid", ] [[package]] @@ -9334,34 +8593,11 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] -[[package]] -name = "sys-info" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b3a0d0aba8bf96a0e1ddfdc352fc53b3df7f39318c71854910c3c4b024ae52c" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "sysctl" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225e483f02d0ad107168dc57381a8a40c3aeea6abe47f37506931f861643cfa8" -dependencies = [ - "bitflags 1.3.2", - "byteorder", - "libc", - "thiserror 1.0.69", - "walkdir", -] - [[package]] name = "system-configuration" version = "0.5.1" @@ -9408,7 +8644,7 @@ checksum = "1c38a012bed6fb9681d3bf71ffaa4f88f3b4b9ed3198cda6e4c8462d24d4bb80" dependencies = [ "anyhow", "fnv", - "futures 0.3.31", + "futures", "humantime", "opentelemetry", "pin-project", @@ -9416,7 +8652,7 @@ dependencies = [ "serde", "static_assertions", "tarpc-plugins", - "thiserror 1.0.69", + "thiserror", "tokio", "tokio-serde", "tokio-util 0.6.10", @@ -9430,8 +8666,8 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee42b4e559f17bce0385ebf511a7beb67d5cc33c12c96b7f4e9789919d9c10f" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -9441,11 +8677,11 @@ version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "fastrand", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -9478,9 +8714,9 @@ version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adcb7fd841cd518e279be3d5a3eb0636409487998a4aff22f3de87b81e88384f" dependencies = [ - "cfg-if 1.0.0", - "proc-macro2 1.0.92", - "quote 1.0.38", + "cfg-if", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -9490,8 +8726,8 @@ version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", "test-case-core", ] @@ -9517,16 +8753,7 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" -dependencies = [ - "thiserror-impl 2.0.11", + "thiserror-impl", ] [[package]] @@ -9535,19 +8762,8 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", - "syn 2.0.93", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" -dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -9557,7 +8773,7 @@ version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "once_cell", ] @@ -9605,7 +8821,7 @@ dependencies = [ "rand 0.7.3", "rustc-hash", "sha2 0.9.9", - "thiserror 1.0.69", + "thiserror", "unicode-normalization", "wasm-bindgen", "zeroize", @@ -9643,9 +8859,7 @@ dependencies = [ "anchor-lang 0.30.1", "anyhow", "base64 0.13.1", - "clap 2.34.0", "clap 4.5.23", - "crossbeam-channel", "ellipsis-client", "env_logger 0.10.2", "hex", @@ -9664,27 +8878,19 @@ dependencies = [ "serde_json", "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-clap-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-core", - "solana-geyser-plugin-manager", - "solana-gossip", "solana-ledger", - "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-program", "solana-program-test 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rpc", "solana-rpc-client", "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "solana-stake-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-streamer", - "solana-unified-scheduler-pool", "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "spl-memo", "tempfile", - "thiserror 1.0.69", + "thiserror", "tokio", ] @@ -9722,8 +8928,8 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -9797,7 +9003,6 @@ checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" dependencies = [ "bytes", "futures-core", - "futures-io", "futures-sink", "log", "pin-project-lite", @@ -9890,7 +9095,7 @@ dependencies = [ "http-body", "hyper", "hyper-timeout", - "percent-encoding 2.3.1", + "percent-encoding", "pin-project", "prost", "rustls-pemfile", @@ -9910,9 +9115,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6fdaae4c2c638bb70fe42803a26fbd6fc6ac8c72f5c59f67ecc2a2dcabf4b07" dependencies = [ "prettyplease 0.1.25", - "proc-macro2 1.0.92", + "proc-macro2", "prost-build", - "quote 1.0.38", + "quote", "syn 1.0.109", ] @@ -9966,8 +9171,8 @@ version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -10032,8 +9237,8 @@ dependencies = [ "rand 0.8.5", "rustls", "sha1", - "thiserror 1.0.69", - "url 2.5.4", + "thiserror", + "url", "utf-8", "webpki-roots 0.24.0", ] @@ -10050,12 +9255,6 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "ucd-trie" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" - [[package]] name = "uint" version = "0.9.5" @@ -10068,18 +9267,6 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "unicase" -version = "2.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" - -[[package]] -name = "unicode-bidi" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" - [[package]] name = "unicode-ident" version = "1.0.14" @@ -10113,12 +9300,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" -[[package]] -name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" - [[package]] name = "unicode-xid" version = "0.2.6" @@ -10150,12 +9331,6 @@ dependencies = [ "void", ] -[[package]] -name = "unsafe-libyaml" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" - [[package]] name = "untrusted" version = "0.7.1" @@ -10178,17 +9353,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "url" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" -dependencies = [ - "idna 0.1.5", - "matches", - "percent-encoding 1.0.1", -] - [[package]] name = "url" version = "2.5.4" @@ -10196,8 +9360,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", - "idna 1.0.3", - "percent-encoding 2.3.1", + "idna", + "percent-encoding", ] [[package]] @@ -10333,7 +9497,7 @@ version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "once_cell", "wasm-bindgen-macro", ] @@ -10346,8 +9510,8 @@ checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", "wasm-bindgen-shared", ] @@ -10358,7 +9522,7 @@ version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "once_cell", "wasm-bindgen", @@ -10371,7 +9535,7 @@ version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ - "quote 1.0.38", + "quote", "wasm-bindgen-macro-support", ] @@ -10381,8 +9545,8 @@ version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", "wasm-bindgen-backend", "wasm-bindgen-shared", @@ -10475,7 +9639,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] @@ -10665,7 +9829,7 @@ version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "windows-sys 0.48.0", ] @@ -10704,7 +9868,7 @@ dependencies = [ "nom", "oid-registry", "rusticata-macros", - "thiserror 1.0.69", + "thiserror", "time", ] @@ -10752,8 +9916,8 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", "synstructure 0.13.1", ] @@ -10774,8 +9938,8 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -10794,8 +9958,8 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", "synstructure 0.13.1", ] @@ -10815,8 +9979,8 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] @@ -10837,8 +10001,8 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", + "proc-macro2", + "quote", "syn 2.0.93", ] diff --git a/Cargo.toml b/Cargo.toml index a87cba48..f06bb16a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -68,7 +68,6 @@ spl-memo = "4.0.0" solana-account-decoder = { package = "solana-account-decoder", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-metrics = { package = "solana-metrics", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-accounts-db = { package = "solana-accounts-db", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-clap-utils = { package = "solana-clap-utils", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-client = { package = "solana-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-ledger = { package = "solana-ledger", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-program = { package = "solana-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } @@ -107,16 +106,6 @@ jito-vault-core = { git = "https://github.com/jito-foundation/restaking.git", re jito-vault-program = { git = "https://github.com/jito-foundation/restaking.git", rev = "eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d", features = ["no-entrypoint"] } jito-vault-sdk = { git = "https://github.com/jito-foundation/restaking.git", rev = "eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" } -solana-core = { package = "solana-core", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-geyser-plugin-manager = { package = "solana-geyser-plugin-manager", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-gossip = { package = "solana-gossip", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-measure = { package = "solana-measure", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-rpc = { package = "solana-rpc", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-streamer = { package = "solana-streamer", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-unified-scheduler-pool = { package = "solana-unified-scheduler-pool", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } - - - [patch.crates-io] # Force all Solana dependencies to use the Jito fork solana-program = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } @@ -126,12 +115,3 @@ solana-rpc-client = { git = "https://github.com/jito-foundation/jito-solana.git" solana-rpc-client-api = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } # necessary for ellipsis client solana-transaction-status = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } - -solana-core = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-geyser-plugin-manager = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-gossip = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-measure = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-rpc = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-streamer = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-unified-scheduler-pool = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } - diff --git a/tip-router-operator-cli/Cargo.toml b/tip-router-operator-cli/Cargo.toml index 396c3ca3..664ffd9e 100644 --- a/tip-router-operator-cli/Cargo.toml +++ b/tip-router-operator-cli/Cargo.toml @@ -9,7 +9,6 @@ anchor-lang = { workspace = true } anyhow = { workspace = true } base64 = "0.13" clap = { workspace = true } -clap_old = { package = "clap", version = "2.33.1" } ellipsis-client = "0.1" env_logger = { workspace = true } hex = "0.4" @@ -29,7 +28,6 @@ serde_json = { workspace = true } solana-account-decoder = { workspace = true } solana-accounts-db = { workspace = true } solana-client = { workspace = true } -solana-clap-utils = { workspace = true } solana-ledger = { workspace = true } solana-metrics = { workspace = true } solana-program = { workspace = true } @@ -42,16 +40,6 @@ spl-memo = { workspace = true } thiserror = { workspace = true } tokio = { workspace = true } -crossbeam-channel = "0.5" - -solana-core = { workspace = true } -solana-geyser-plugin-manager = { workspace = true } -solana-gossip = { workspace = true } -solana-measure = { workspace = true } -solana-rpc = { workspace = true } -solana-streamer = { workspace = true } -solana-unified-scheduler-pool = { workspace = true } - [dev-dependencies] solana-program-test = { workspace = true } solana-runtime = { workspace = true, features = ["dev-context-only-utils"] } diff --git a/tip-router-operator-cli/src/arg_matches.rs b/tip-router-operator-cli/src/arg_matches.rs deleted file mode 100644 index d3b9fbcc..00000000 --- a/tip-router-operator-cli/src/arg_matches.rs +++ /dev/null @@ -1,597 +0,0 @@ -use std::ffi::OsString; -use std::path::PathBuf; - -use clap_old::{App, AppSettings, Arg, ArgMatches, SubCommand}; -use solana_clap_utils::{ - hidden_unless_forced, - input_validators::{ - is_parsable, is_pow2, is_pubkey, is_pubkey_or_keypair, is_slot, is_valid_percentage, - }, -}; -use solana_ledger::use_snapshot_archives_at_startup; -use solana_runtime::snapshot_utils::{ - SnapshotVersion, DEFAULT_ARCHIVE_COMPRESSION, SUPPORTED_ARCHIVE_COMPRESSION, -}; -use solana_sdk::{clock::Slot, native_token::sol_to_lamports, rent::Rent, vote::state::VoteState}; -use solana_stake_program::stake_state::StakeStateV2; - -// pub fn create_snapshot_arg_matches<'a, 'b>( -// full_snapshots_archives_dir: PathBuf, -// incremental_snapshots_archives_dir: PathBuf, -// account_paths: Vec, -// ) -> ArgMatches<'a> { -// let mut app = App::new("tip-router-operator-cli"); -// ledger_tool_arg_app(&mut app); -// let args: Vec = vec![ -// "tip-router-operator-cli".into(), -// "--full-snapshot-archive-path".into(), -// full_snapshots_archives_dir.into(), -// "--incremental-snapshot-archive-path".into(), -// incremental_snapshots_archives_dir.into(), -// "--accounts".into(), -// account_paths -// .iter() -// .map(|p| p.to_string_lossy().to_string()) -// .collect::>() -// .join(",") -// .into(), -// ]; - -// app.get_matches_from(args) -// } - -pub fn ledger_tool_arg_matches<'a>( - arg_matches: &mut ArgMatches<'a>, - full_snapshots_archives_dir: PathBuf, - incremental_snapshots_archives_dir: PathBuf, - account_paths: Vec, -) { - let rent = Rent::default(); - // let default_bootstrap_validator_lamports = sol_to_lamports(500.0) - // .max(VoteState::get_rent_exempt_reserve(&rent)) - // .to_string(); - // let default_bootstrap_validator_stake_lamports = sol_to_lamports(0.5) - // .max(rent.minimum_balance(StakeStateV2::size_of())) - // .to_string(); - - let load_genesis_config_arg = load_genesis_arg(); - let accounts_db_config_args = accounts_db_args(); - let snapshot_config_args = snapshot_args(); - - let accounts_db_test_hash_calculation_arg = Arg::with_name("accounts_db_test_hash_calculation") - .long("accounts-db-test-hash-calculation") - .help("Enable hash calculation test"); - let halt_at_slot_arg = Arg::with_name("halt_at_slot") - .long("halt-at-slot") - .value_name("SLOT") - .validator(is_slot) - .takes_value(true) - .help("Halt processing at the given slot"); - let os_memory_stats_reporting_arg = Arg::with_name("os_memory_stats_reporting") - .long("os-memory-stats-reporting") - .help("Enable reporting of OS memory statistics."); - let halt_at_slot_store_hash_raw_data = Arg::with_name("halt_at_slot_store_hash_raw_data") - .long("halt-at-slot-store-hash-raw-data") - .help( - "After halting at slot, run an accounts hash calculation and store the raw hash data \ - for debugging.", - ) - .hidden(hidden_unless_forced()); - let verify_index_arg = Arg::with_name("verify_accounts_index") - .long("verify-accounts-index") - .takes_value(false) - .help("For debugging and tests on accounts index."); - let limit_load_slot_count_from_snapshot_arg = - Arg::with_name("limit_load_slot_count_from_snapshot") - .long("limit-load-slot-count-from-snapshot") - .value_name("SLOT") - .validator(is_slot) - .takes_value(true) - .help( - "For debugging and profiling with large snapshots, artificially limit how many \ - slots are loaded from a snapshot.", - ); - let hard_forks_arg = Arg::with_name("hard_forks") - .long("hard-fork") - .value_name("SLOT") - .validator(is_slot) - .multiple(true) - .takes_value(true) - .help("Add a hard fork at this slot"); - let allow_dead_slots_arg = Arg::with_name("allow_dead_slots") - .long("allow-dead-slots") - .takes_value(false) - .help("Output dead slots as well"); - let hashes_per_tick = Arg::with_name("hashes_per_tick") - .long("hashes-per-tick") - .value_name("NUM_HASHES|\"sleep\"") - .takes_value(true) - .help( - "How many PoH hashes to roll before emitting the next tick. If \"sleep\", for \ - development sleep for the target tick duration instead of hashing", - ); - let snapshot_version_arg = Arg::with_name("snapshot_version") - .long("snapshot-version") - .value_name("SNAPSHOT_VERSION") - .validator(is_parsable::) - .takes_value(true) - .default_value(SnapshotVersion::default().into()) - .help("Output snapshot version"); - let debug_key_arg = Arg::with_name("debug_key") - .long("debug-key") - .validator(is_pubkey) - .value_name("ADDRESS") - .multiple(true) - .takes_value(true) - .help("Log when transactions are processed that reference the given key(s)."); - - let geyser_plugin_args = Arg::with_name("geyser_plugin_config") - .long("geyser-plugin-config") - .value_name("FILE") - .takes_value(true) - .multiple(true) - .help("Specify the configuration file for the Geyser plugin."); - - let log_messages_bytes_limit_arg = Arg::with_name("log_messages_bytes_limit") - .long("log-messages-bytes-limit") - .takes_value(true) - .validator(is_parsable::) - .value_name("BYTES") - .help("Maximum number of bytes written to the program log before truncation"); - - let accounts_data_encoding_arg = Arg::with_name("encoding") - .long("encoding") - .takes_value(true) - .possible_values(&["base64", "base64+zstd", "jsonParsed"]) - .default_value("base64") - .help("Print account data in specified format when printing account contents."); - - let app = App::new("tip-router-operator-cli") - .about("Tip Router Operator CLI") - .version("0.1.0") - .global_setting(AppSettings::ColoredHelp) - .global_setting(AppSettings::InferSubcommands) - .global_setting(AppSettings::UnifiedHelpMessage) - .global_setting(AppSettings::VersionlessSubcommands) - .setting(AppSettings::SubcommandRequiredElseHelp) - .arg( - Arg::with_name("ledger_path") - .short("l") - .long("ledger") - .value_name("DIR") - .takes_value(true) - .global(true) - .default_value("ledger") - .help("Use DIR as ledger location"), - ) - .arg( - Arg::with_name("wal_recovery_mode") - .long("wal-recovery-mode") - .value_name("MODE") - .takes_value(true) - .global(true) - .possible_values(&[ - "tolerate_corrupted_tail_records", - "absolute_consistency", - "point_in_time", - "skip_any_corrupted_record", - ]) - .help("Mode to recovery the ledger db write ahead log"), - ) - .arg( - Arg::with_name("force_update_to_open") - .long("force-update-to-open") - .takes_value(false) - .global(true) - .help( - "Allow commands that would otherwise not alter the blockstore to make \ - necessary updates in order to open it", - ), - ) - .arg( - Arg::with_name("ignore_ulimit_nofile_error") - .long("ignore-ulimit-nofile-error") - .takes_value(false) - .global(true) - .help( - "Allow opening the blockstore to succeed even if the desired open file \ - descriptor limit cannot be configured. Use with caution as some commands may \ - run fine with a reduced file descriptor limit while others will not", - ), - ) - .arg( - Arg::with_name("block_verification_method") - .long("block-verification-method") - .value_name("METHOD") - .takes_value(true) - // .possible_values(BlockVerificationMethod::cli_names()) - .global(true), // .help(BlockVerificationMethod::cli_message()), - ) - .arg( - Arg::with_name("unified_scheduler_handler_threads") - .long("unified-scheduler-handler-threads") - .value_name("COUNT") - .takes_value(true) - // .validator(|s| is_within_range(s, 1..)) - .global(true), // .help(DefaultSchedulerPool::cli_message()), - ) - .arg( - Arg::with_name("output_format") - .long("output") - .value_name("FORMAT") - .global(true) - .takes_value(true) - .possible_values(&["json", "json-compact"]) - .help( - "Return information in specified output format, currently only available for \ - bigtable and program subcommands", - ), - ) - .arg( - Arg::with_name("verbose") - .short("v") - .long("verbose") - .global(true) - .multiple(true) - .takes_value(false) - .help("Show additional information where supported"), - ) - .subcommand( - SubCommand::with_name("create-snapshot") - .about("Create a new ledger snapshot") - .arg(&load_genesis_config_arg) - .args(&accounts_db_config_args) - .args(&snapshot_config_args) - .arg(&hard_forks_arg) - .arg(&snapshot_version_arg) - .arg(&geyser_plugin_args) - .arg(&log_messages_bytes_limit_arg) - .arg( - Arg::with_name("snapshot_slot") - .index(1) - .value_name("SLOT") - .validator(|value| { - if value.parse::().is_ok() || value == "ROOT" { - Ok(()) - } else { - Err(format!( - "Unable to parse as a number or the keyword ROOT, provided: \ - {value}" - )) - } - }) - .takes_value(true) - .help( - "Slot at which to create the snapshot; accepts keyword ROOT for the \ - highest root", - ), - ) - .arg( - Arg::with_name("output_directory") - .index(2) - .value_name("DIR") - .takes_value(true) - .help( - "Output directory for the snapshot \ - [default: --snapshot-archive-path if present else --ledger directory]", - ), - ) - .arg( - Arg::with_name("warp_slot") - .required(false) - .long("warp-slot") - .takes_value(true) - .value_name("WARP_SLOT") - .validator(is_slot) - .help( - "After loading the snapshot slot warp the ledger to WARP_SLOT, which \ - could be a slot in a galaxy far far away", - ), - ) - .arg( - Arg::with_name("faucet_lamports") - .short("t") - .long("faucet-lamports") - .value_name("LAMPORTS") - .takes_value(true) - .requires("faucet_pubkey") - .help("Number of lamports to assign to the faucet"), - ) - .arg( - Arg::with_name("faucet_pubkey") - .short("m") - .long("faucet-pubkey") - .value_name("PUBKEY") - .takes_value(true) - .validator(is_pubkey_or_keypair) - .requires("faucet_lamports") - .help("Path to file containing the faucet's pubkey"), - ) - .arg( - Arg::with_name("bootstrap_validator") - .short("b") - .long("bootstrap-validator") - .value_name("IDENTITY_PUBKEY VOTE_PUBKEY STAKE_PUBKEY") - .takes_value(true) - .validator(is_pubkey_or_keypair) - .number_of_values(3) - .multiple(true) - .help("The bootstrap validator's identity, vote and stake pubkeys"), - ) - .arg( - Arg::with_name("bootstrap_stake_authorized_pubkey") - .long("bootstrap-stake-authorized-pubkey") - .value_name("BOOTSTRAP STAKE AUTHORIZED PUBKEY") - .takes_value(true) - .validator(is_pubkey_or_keypair) - .help( - "Path to file containing the pubkey authorized to manage the \ - bootstrap validator's stake - [default: --bootstrap-validator IDENTITY_PUBKEY]", - ), - ) - // .arg( - // Arg::with_name("bootstrap_validator_lamports") - // .long("bootstrap-validator-lamports") - // .value_name("LAMPORTS") - // .takes_value(true) - // .default_value(&default_bootstrap_validator_lamports) - // .help("Number of lamports to assign to the bootstrap validator"), - // ) - // .arg( - // Arg::with_name("bootstrap_validator_stake_lamports") - // .long("bootstrap-validator-stake-lamports") - // .value_name("LAMPORTS") - // .takes_value(true) - // .default_value(&default_bootstrap_validator_stake_lamports) - // .help( - // "Number of lamports to assign to the bootstrap validator's stake \ - // account", - // ), - // ) - .arg( - Arg::with_name("rent_burn_percentage") - .long("rent-burn-percentage") - .value_name("NUMBER") - .takes_value(true) - .help("Adjust percentage of collected rent to burn") - .validator(is_valid_percentage), - ) - .arg(&hashes_per_tick) - .arg( - Arg::with_name("accounts_to_remove") - .required(false) - .long("remove-account") - .takes_value(true) - .value_name("PUBKEY") - .validator(is_pubkey) - .multiple(true) - .help("List of accounts to remove while creating the snapshot"), - ) - .arg( - Arg::with_name("feature_gates_to_deactivate") - .required(false) - .long("deactivate-feature-gate") - .takes_value(true) - .value_name("PUBKEY") - .validator(is_pubkey) - .multiple(true) - .help("List of feature gates to deactivate while creating the snapshot"), - ) - .arg( - Arg::with_name("vote_accounts_to_destake") - .required(false) - .long("destake-vote-account") - .takes_value(true) - .value_name("PUBKEY") - .validator(is_pubkey) - .multiple(true) - .help("List of validator vote accounts to destake"), - ) - .arg( - Arg::with_name("remove_stake_accounts") - .required(false) - .long("remove-stake-accounts") - .takes_value(false) - .help("Remove all existing stake accounts from the new snapshot"), - ) - .arg( - Arg::with_name("incremental") - .long("incremental") - .takes_value(false) - .help( - "Create an incremental snapshot instead of a full snapshot. This \ - requires that the ledger is loaded from a full snapshot, which will \ - be used as the base for the incremental snapshot.", - ) - .conflicts_with("no_snapshot"), - ) - .arg( - Arg::with_name("minimized") - .long("minimized") - .takes_value(false) - .help( - "Create a minimized snapshot instead of a full snapshot. This \ - snapshot will only include information needed to replay the ledger \ - from the snapshot slot to the ending slot.", - ) - .conflicts_with("incremental") - .requires("ending_slot"), - ) - .arg( - Arg::with_name("ending_slot") - .long("ending-slot") - .takes_value(true) - .value_name("ENDING_SLOT") - .help("Ending slot for minimized snapshot creation"), - ) - .arg( - Arg::with_name("snapshot_archive_format") - .long("snapshot-archive-format") - .possible_values(SUPPORTED_ARCHIVE_COMPRESSION) - .default_value(DEFAULT_ARCHIVE_COMPRESSION) - .value_name("ARCHIVE_TYPE") - .takes_value(true) - .help("Snapshot archive format to use.") - .conflicts_with("no_snapshot"), - ) - .arg( - Arg::with_name("enable_capitalization_change") - .long("enable-capitalization-change") - .takes_value(false) - .help("If snapshot creation should succeed with a capitalization delta."), - ), - ); - - let args: Vec = vec![ - "tip-router-operator-cli".into(), - "--full-snapshot-archive-path".into(), - full_snapshots_archives_dir.into(), - "--incremental-snapshot-archive-path".into(), - incremental_snapshots_archives_dir.into(), - "--accounts".into(), - account_paths - .iter() - .map(|p| p.to_string_lossy().to_string()) - .collect::>() - .join(",") - .into(), - ]; - - *arg_matches = app.get_matches_from(args); -} - -/// Returns the arguments that configure AccountsDb -pub fn accounts_db_args<'a, 'b>() -> Box<[Arg<'a, 'b>]> { - vec![ - Arg::with_name("account_paths") - .long("accounts") - .value_name("PATHS") - .takes_value(true) - .help( - "Persistent accounts location. May be specified multiple times. \ - [default: /accounts]", - ), - Arg::with_name("accounts_index_path") - .long("accounts-index-path") - .value_name("PATH") - .takes_value(true) - .multiple(true) - .help( - "Persistent accounts-index location. May be specified multiple times. \ - [default: /accounts_index]", - ), - Arg::with_name("accounts_hash_cache_path") - .long("accounts-hash-cache-path") - .value_name("PATH") - .takes_value(true) - .help( - "Use PATH as accounts hash cache location [default: /accounts_hash_cache]", - ), - Arg::with_name("accounts_index_bins") - .long("accounts-index-bins") - .value_name("BINS") - .validator(is_pow2) - .takes_value(true) - .help("Number of bins to divide the accounts index into"), - Arg::with_name("accounts_index_memory_limit_mb") - .long("accounts-index-memory-limit-mb") - .value_name("MEGABYTES") - .validator(is_parsable::) - .takes_value(true) - .help( - "How much memory the accounts index can consume. If this is exceeded, some \ - account index entries will be stored on disk.", - ), - Arg::with_name("disable_accounts_disk_index") - .long("disable-accounts-disk-index") - .help( - "Disable the disk-based accounts index. It is enabled by default. The entire \ - accounts index will be kept in memory.", - ) - .conflicts_with("accounts_index_memory_limit_mb"), - Arg::with_name("accounts_db_skip_shrink") - .long("accounts-db-skip-shrink") - .help( - "Enables faster starting of ledger-tool by skipping shrink. This option is for \ - use during testing.", - ), - Arg::with_name("accounts_db_verify_refcounts") - .long("accounts-db-verify-refcounts") - .help( - "Debug option to scan all AppendVecs and verify account index refcounts prior to \ - clean", - ) - .hidden(hidden_unless_forced()), - Arg::with_name("accounts_db_test_skip_rewrites") - .long("accounts-db-test-skip-rewrites") - .help( - "Debug option to skip rewrites for rent-exempt accounts but still add them in \ - bank delta hash calculation", - ) - .hidden(hidden_unless_forced()), - Arg::with_name("accounts_db_skip_initial_hash_calculation") - .long("accounts-db-skip-initial-hash-calculation") - .help("Do not verify accounts hash at startup.") - .hidden(hidden_unless_forced()), - Arg::with_name("accounts_db_ancient_append_vecs") - .long("accounts-db-ancient-append-vecs") - .value_name("SLOT-OFFSET") - .validator(is_parsable::) - .takes_value(true) - .help( - "AppendVecs that are older than (slots_per_epoch - SLOT-OFFSET) are squashed \ - together.", - ) - .hidden(hidden_unless_forced()), - ] - .into_boxed_slice() -} - -// For our current version of CLAP, the value passed to Arg::default_value() -// must be a &str. But, we can't convert an integer to a &str at compile time. -// So, declare this constant and enforce equality with the following unit test -// test_max_genesis_archive_unpacked_size_constant -const MAX_GENESIS_ARCHIVE_UNPACKED_SIZE_STR: &str = "10485760"; - -/// Returns the arguments that configure loading genesis -pub fn load_genesis_arg<'a, 'b>() -> Arg<'a, 'b> { - Arg::with_name("max_genesis_archive_unpacked_size") - .long("max-genesis-archive-unpacked-size") - .value_name("NUMBER") - .takes_value(true) - .default_value(MAX_GENESIS_ARCHIVE_UNPACKED_SIZE_STR) - .help("maximum total uncompressed size of unpacked genesis archive") -} - -/// Returns the arguments that configure snapshot loading -pub fn snapshot_args<'a, 'b>() -> Box<[Arg<'a, 'b>]> { - vec![ - Arg::with_name("no_snapshot") - .long("no-snapshot") - .takes_value(false) - .help("Do not start from a local snapshot if present"), - Arg::with_name("snapshots") - .long("snapshots") - .alias("snapshot-archive-path") - .alias("full-snapshot-archive-path") - .value_name("DIR") - .takes_value(true) - .global(true) - .help("Use DIR for snapshot location [default: --ledger value]"), - Arg::with_name("incremental_snapshot_archive_path") - .long("incremental-snapshot-archive-path") - .value_name("DIR") - .takes_value(true) - .global(true) - .help("Use DIR for separate incremental snapshot location"), - Arg::with_name(use_snapshot_archives_at_startup::cli::NAME) - .long(use_snapshot_archives_at_startup::cli::LONG_ARG) - .takes_value(true) - .possible_values(use_snapshot_archives_at_startup::cli::POSSIBLE_VALUES) - .default_value(use_snapshot_archives_at_startup::cli::default_value_for_ledger_tool()) - .help(use_snapshot_archives_at_startup::cli::HELP) - .long_help(use_snapshot_archives_at_startup::cli::LONG_HELP), - ] - .into_boxed_slice() -} diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index 99fce61b..3bdb794e 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -1,9 +1,9 @@ -use std::{fmt::Display, path::PathBuf}; +use std::path::PathBuf; use clap::Parser; use solana_sdk::pubkey::Pubkey; -#[derive(Clone, Parser, Debug)] +#[derive(Clone, Parser)] #[command(author, version, about)] pub struct Cli { #[arg(short, long, env)] @@ -37,7 +37,7 @@ pub struct Cli { pub command: Commands, } -#[derive(clap::Subcommand, Clone, Debug)] +#[derive(clap::Subcommand, Clone)] pub enum Commands { Run { #[arg(short, long, env)] diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index f2e4c9c3..9c8586c7 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -173,26 +173,6 @@ pub fn get_bank_from_ledger( ..Default::default() }; let exit = Arc::new(AtomicBool::new(false)); - - // Call ledger_utils::load_and_process_ledger here - // let LoadAndProcessLedgerOutput { - // bank_forks, - // starting_snapshot_hashes, - // accounts_background_service, - // .. - // } = match solana_ledger_tool::ledger_utils::load_and_process_ledger( - // &genesis_config, - // &blockstore, - // account_paths, - // None, - // Some(&snapshot_config), - // ) { - // Ok(res) => res, - // Err(e) => { - // panic!("Failed to load bank forks: {}", e); - // } - // }; - let (bank_forks, leader_schedule_cache, _starting_snapshot_hashes, ..) = match bank_forks_utils::load_bank_forks( &genesis_config, diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index 1df10ccf..03a7f53c 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -4,15 +4,11 @@ pub mod tip_router; pub use crate::cli::{Cli, Commands}; pub mod cli; pub use crate::process_epoch::process_epoch; -pub mod arg_matches; pub mod backup_snapshots; -mod load_and_process_ledger; pub mod process_epoch; pub mod submit; -use std::fs; use std::path::{Path, PathBuf}; -use std::process::Command; use std::time::Instant; use anchor_lang::prelude::*; @@ -190,109 +186,3 @@ pub fn get_meta_merkle_root( Ok(meta_merkle_tree) } - -fn get_validator_cmdline() -> Result { - let output = Command::new("pgrep").arg("solana-validator").output()?; - - let pid = String::from_utf8_lossy(&output.stdout).trim().to_string(); - - let cmdline = fs::read_to_string(format!("/proc/{}/cmdline", pid))?; - - Ok(cmdline.replace('\0', " ")) -} - -pub fn emit_solana_validator_args() -> std::result::Result<(), anyhow::Error> { - // Find solana-validator process and get its command line args - let validator_cmdline = match get_validator_cmdline() { - Ok(cmdline) => cmdline, - Err(_) => return Err(anyhow::anyhow!("Validator process not found")), - }; - - let validator_config: Vec = validator_cmdline - .split_whitespace() - .map(String::from) - .collect(); - - if validator_config.is_empty() { - return Err(anyhow::anyhow!("Validator process not found")); - } - - let mut limit_ledger_size = None; - let mut full_snapshot_interval = None; - let mut max_full_snapshots = None; - let mut incremental_snapshot_path = None; - let mut incremental_snapshot_interval = None; - let mut max_incremental_snapshots = None; - - for (i, arg) in validator_config.iter().enumerate() { - match arg.as_str() { - "--limit-ledger-size" => { - if let Some(value) = validator_config.get(i + 1) { - limit_ledger_size = Some(value.clone()); - } - } - "--full-snapshot-interval-slots" => { - if let Some(value) = validator_config.get(i + 1) { - full_snapshot_interval = Some(value.clone()); - } - } - "--maximum-full-snapshots-to-retain" => { - if let Some(value) = validator_config.get(i + 1) { - max_full_snapshots = Some(value.clone()); - } - } - "--incremental-snapshot-archive-path" => { - if let Some(value) = validator_config.get(i + 1) { - incremental_snapshot_path = Some(value.clone()); - } - } - "--incremental-snapshot-interval-slots" => { - if let Some(value) = validator_config.get(i + 1) { - incremental_snapshot_interval = Some(value.clone()); - } - } - "--maximum-incremental-snapshots-to-retain" => { - if let Some(value) = validator_config.get(i + 1) { - max_incremental_snapshots = Some(value.clone()); - } - } - _ => {} - } - } - - datapoint_info!( - "tip_router_cli.validator_config", - ( - "limit_ledger_size", - limit_ledger_size.unwrap_or_default(), - String - ), - ( - "full_snapshot_interval", - full_snapshot_interval.unwrap_or_default(), - String - ), - ( - "max_full_snapshots", - max_full_snapshots.unwrap_or_default(), - String - ), - ( - "incremental_snapshot_path", - incremental_snapshot_path.unwrap_or_default(), - String - ), - ( - "incremental_snapshot_interval", - incremental_snapshot_interval.unwrap_or_default(), - String - ), - ( - "max_incremental_snapshots", - max_incremental_snapshots.unwrap_or_default(), - String - ) - ); - - Ok(()) -} diff --git a/tip-router-operator-cli/src/load_and_process_ledger.rs b/tip-router-operator-cli/src/load_and_process_ledger.rs deleted file mode 100644 index 9c0ec9f4..00000000 --- a/tip-router-operator-cli/src/load_and_process_ledger.rs +++ /dev/null @@ -1,586 +0,0 @@ -use { - clap_old::{value_t, value_t_or_exit, values_t_or_exit, ArgMatches}, - crossbeam_channel::unbounded, - log::*, - solana_accounts_db::{ - hardened_unpack::open_genesis_config, utils::create_all_accounts_run_and_snapshot_dirs, - }, - solana_core::{ - accounts_hash_verifier::AccountsHashVerifier, validator::BlockVerificationMethod, - }, - solana_geyser_plugin_manager::geyser_plugin_service::{ - GeyserPluginService, GeyserPluginServiceError, - }, - solana_gossip::{cluster_info::ClusterInfo, contact_info::ContactInfo}, - solana_ledger::{ - bank_forks_utils::{self, BankForksUtilsError}, - blockstore::{Blockstore, BlockstoreError}, - blockstore_options::{ - AccessType, BlockstoreOptions, BlockstoreRecoveryMode, LedgerColumnOptions, - ShredStorageType, - }, - blockstore_processor::{ - self, BlockstoreProcessorError, ProcessOptions, TransactionStatusSender, - }, - use_snapshot_archives_at_startup::UseSnapshotArchivesAtStartup, - }, - solana_measure::measure, - solana_rpc::transaction_status_service::TransactionStatusService, - solana_runtime::{ - accounts_background_service::{ - AbsRequestHandlers, AbsRequestSender, AccountsBackgroundService, - PrunedBanksRequestHandler, SnapshotRequestHandler, - }, - bank_forks::BankForks, - prioritization_fee_cache::PrioritizationFeeCache, - snapshot_config::SnapshotConfig, - snapshot_hash::StartingSnapshotHashes, - snapshot_utils::{ - self, clean_orphaned_account_snapshot_dirs, move_and_async_delete_path_contents, - }, - }, - solana_sdk::{ - clock::Slot, genesis_config::GenesisConfig, pubkey::Pubkey, signature::Signer, - signer::keypair::Keypair, timing::timestamp, transaction::VersionedTransaction, - }, - solana_streamer::socket::SocketAddrSpace, - solana_unified_scheduler_pool::DefaultSchedulerPool, - std::{ - path::{Path, PathBuf}, - process::exit, - sync::{ - atomic::{AtomicBool, Ordering}, - Arc, RwLock, - }, - }, - thiserror::Error, -}; - -pub const LEDGER_TOOL_DIRECTORY: &str = "ledger_tool"; - -const PROCESS_SLOTS_HELP_STRING: &str = - "The starting slot is either the latest found snapshot slot, or genesis (slot 0) if the \ - --no-snapshot flag was specified or if no snapshots were found. \ - The ending slot is the snapshot creation slot for create-snapshot, the value for \ - --halt-at-slot if specified, or the highest slot in the blockstore."; - -#[derive(Error, Debug)] -pub(crate) enum LoadAndProcessLedgerError { - #[error("failed to clean orphaned account snapshot directories: {0}")] - CleanOrphanedAccountSnapshotDirectories(#[source] std::io::Error), - - #[error("failed to create all run and snapshot directories: {0}")] - CreateAllAccountsRunAndSnapshotDirectories(#[source] std::io::Error), - - #[error("custom accounts path is not supported with seconday blockstore access")] - CustomAccountsPathUnsupported(#[source] BlockstoreError), - - #[error( - "failed to process blockstore from starting slot {0} to ending slot {1}; the ending slot \ - is less than the starting slot. {2}" - )] - EndingSlotLessThanStartingSlot(Slot, Slot, String), - - #[error( - "failed to process blockstore from starting slot {0} to ending slot {1}; the blockstore \ - does not contain a replayable sequence of blocks between these slots. {2}" - )] - EndingSlotNotReachableFromStartingSlot(Slot, Slot, String), - - #[error("failed to setup geyser service: {0}")] - GeyserServiceSetup(#[source] GeyserPluginServiceError), - - #[error("failed to load bank forks: {0}")] - LoadBankForks(#[source] BankForksUtilsError), - - #[error("failed to process blockstore from root: {0}")] - ProcessBlockstoreFromRoot(#[source] BlockstoreProcessorError), -} - -pub fn load_and_process_ledger_or_exit( - arg_matches: &ArgMatches, - genesis_config: &GenesisConfig, - blockstore: Arc, - process_options: ProcessOptions, - snapshot_archive_path: Option, - incremental_snapshot_archive_path: Option, -) -> (Arc>, Option) { - load_and_process_ledger( - arg_matches, - genesis_config, - blockstore, - process_options, - snapshot_archive_path, - incremental_snapshot_archive_path, - ) - .unwrap_or_else(|err| { - eprintln!("Exiting. Failed to load and process ledger: {err}"); - exit(1); - }) -} - -pub fn load_and_process_ledger( - arg_matches: &ArgMatches, - genesis_config: &GenesisConfig, - blockstore: Arc, - process_options: ProcessOptions, - snapshot_archive_path: Option, - incremental_snapshot_archive_path: Option, -) -> Result<(Arc>, Option), LoadAndProcessLedgerError> { - let bank_snapshots_dir = if blockstore.is_primary_access() { - blockstore.ledger_path().join("snapshot") - } else { - blockstore - .ledger_path() - .join(LEDGER_TOOL_DIRECTORY) - .join("snapshot") - }; - - let mut starting_slot = 0; // default start check with genesis - let snapshot_config = if arg_matches.is_present("no_snapshot") { - None - } else { - let full_snapshot_archives_dir = - snapshot_archive_path.unwrap_or_else(|| blockstore.ledger_path().to_path_buf()); - let incremental_snapshot_archives_dir = - incremental_snapshot_archive_path.unwrap_or_else(|| full_snapshot_archives_dir.clone()); - if let Some(full_snapshot_slot) = snapshot_utils::get_highest_full_snapshot_archive_slot( - &full_snapshot_archives_dir, - None, - ) { - let incremental_snapshot_slot = - snapshot_utils::get_highest_incremental_snapshot_archive_slot( - &incremental_snapshot_archives_dir, - full_snapshot_slot, - None, - ) - .unwrap_or_default(); - starting_slot = std::cmp::max(full_snapshot_slot, incremental_snapshot_slot); - } - - Some(SnapshotConfig { - full_snapshot_archives_dir, - incremental_snapshot_archives_dir, - bank_snapshots_dir: bank_snapshots_dir.clone(), - ..SnapshotConfig::new_load_only() - }) - }; - - match process_options.halt_at_slot { - // Skip the following checks for sentinel values of Some(0) and None. - // For Some(0), no slots will be be replayed after starting_slot. - // For None, all available children of starting_slot will be replayed. - None | Some(0) => {} - Some(halt_slot) => { - if halt_slot < starting_slot { - return Err(LoadAndProcessLedgerError::EndingSlotLessThanStartingSlot( - starting_slot, - halt_slot, - PROCESS_SLOTS_HELP_STRING.to_string(), - )); - } - // Check if we have the slot data necessary to replay from starting_slot to >= halt_slot. - if !blockstore.slot_range_connected(starting_slot, halt_slot) { - return Err( - LoadAndProcessLedgerError::EndingSlotNotReachableFromStartingSlot( - starting_slot, - halt_slot, - PROCESS_SLOTS_HELP_STRING.to_string(), - ), - ); - } - } - } - - let account_paths = if let Some(account_paths) = arg_matches.value_of("account_paths") { - // If this blockstore access is Primary, no other process (agave-validator) can hold - // Primary access. So, allow a custom accounts path without worry of wiping the accounts - // of agave-validator. - if !blockstore.is_primary_access() { - // Attempt to open the Blockstore in Primary access; if successful, no other process - // was holding Primary so allow things to proceed with custom accounts path. Release - // the Primary access instead of holding it to give priority to agave-validator over - // agave-ledger-tool should agave-validator start before we've finished. - info!( - "Checking if another process currently holding Primary access to {:?}", - blockstore.ledger_path() - ); - Blockstore::open_with_options( - blockstore.ledger_path(), - BlockstoreOptions { - access_type: AccessType::PrimaryForMaintenance, - ..BlockstoreOptions::default() - }, - ) - // Couldn't get Primary access, error out to be defensive. - .map_err(LoadAndProcessLedgerError::CustomAccountsPathUnsupported)?; - } - account_paths.split(',').map(PathBuf::from).collect() - } else if blockstore.is_primary_access() { - vec![blockstore.ledger_path().join("accounts")] - } else { - let non_primary_accounts_path = blockstore - .ledger_path() - .join(LEDGER_TOOL_DIRECTORY) - .join("accounts"); - info!( - "Default accounts path is switched aligning with Blockstore's secondary access: {:?}", - non_primary_accounts_path - ); - vec![non_primary_accounts_path] - }; - - let (account_run_paths, account_snapshot_paths) = - create_all_accounts_run_and_snapshot_dirs(&account_paths) - .map_err(LoadAndProcessLedgerError::CreateAllAccountsRunAndSnapshotDirectories)?; - // From now on, use run/ paths in the same way as the previous account_paths. - let account_paths = account_run_paths; - - let (_, measure_clean_account_paths) = measure!( - account_paths.iter().for_each(|path| { - if path.exists() { - info!("Cleaning contents of account path: {}", path.display()); - move_and_async_delete_path_contents(path); - } - }), - "Cleaning account paths" - ); - info!("{measure_clean_account_paths}"); - - snapshot_utils::purge_incomplete_bank_snapshots(&bank_snapshots_dir); - - info!("Cleaning contents of account snapshot paths: {account_snapshot_paths:?}"); - clean_orphaned_account_snapshot_dirs(&bank_snapshots_dir, &account_snapshot_paths) - .map_err(LoadAndProcessLedgerError::CleanOrphanedAccountSnapshotDirectories)?; - - let geyser_plugin_active = arg_matches.is_present("geyser_plugin_config"); - let (accounts_update_notifier, transaction_notifier) = if geyser_plugin_active { - let geyser_config_files = vec![]; // values_t_or_exit!(arg_matches, "geyser_plugin_config", String) - // .into_iter() - // .map(PathBuf::from) - // .collect::>(); - - let (confirmed_bank_sender, confirmed_bank_receiver) = unbounded(); - drop(confirmed_bank_sender); - let geyser_service = - GeyserPluginService::new(confirmed_bank_receiver, &geyser_config_files) - .map_err(LoadAndProcessLedgerError::GeyserServiceSetup)?; - ( - geyser_service.get_accounts_update_notifier(), - geyser_service.get_transaction_notifier(), - ) - } else { - (None, None) - }; - - let exit = Arc::new(AtomicBool::new(false)); - let (bank_forks, leader_schedule_cache, starting_snapshot_hashes, ..) = - bank_forks_utils::load_bank_forks( - genesis_config, - blockstore.as_ref(), - account_paths, - None, - snapshot_config.as_ref(), - &process_options, - None, - None, // Maybe support this later, though - accounts_update_notifier, - exit.clone(), - false, - ) - .map_err(LoadAndProcessLedgerError::LoadBankForks)?; - let block_verification_method = BlockVerificationMethod::default(); - // let block_verification_method = value_t!( - // arg_matches, - // "block_verification_method", - // BlockVerificationMethod - // ) - // .unwrap_or_default(); - info!( - "Using: block-verification-method: {}", - block_verification_method, - ); - match block_verification_method { - BlockVerificationMethod::BlockstoreProcessor => { - info!("no scheduler pool is installed for block verification..."); - } - BlockVerificationMethod::UnifiedScheduler => { - let no_transaction_status_sender = None; - let no_replay_vote_sender = None; - let ignored_prioritization_fee_cache = Arc::new(PrioritizationFeeCache::new(0u64)); - bank_forks - .write() - .unwrap() - .install_scheduler_pool(DefaultSchedulerPool::new_dyn( - process_options.runtime_config.log_messages_bytes_limit, - no_transaction_status_sender, - no_replay_vote_sender, - ignored_prioritization_fee_cache, - )); - } - } - - let node_id = Arc::new(Keypair::new()); - let cluster_info = Arc::new(ClusterInfo::new( - ContactInfo::new_localhost(&node_id.pubkey(), timestamp()), - Arc::clone(&node_id), - SocketAddrSpace::Unspecified, - )); - let (accounts_package_sender, accounts_package_receiver) = crossbeam_channel::unbounded(); - let accounts_hash_verifier = AccountsHashVerifier::new( - accounts_package_sender.clone(), - accounts_package_receiver, - None, - exit.clone(), - cluster_info, - None, - SnapshotConfig::new_load_only(), - ); - let (snapshot_request_sender, snapshot_request_receiver) = crossbeam_channel::unbounded(); - let accounts_background_request_sender = AbsRequestSender::new(snapshot_request_sender.clone()); - let snapshot_request_handler = SnapshotRequestHandler { - snapshot_config: SnapshotConfig::new_load_only(), - snapshot_request_sender, - snapshot_request_receiver, - accounts_package_sender, - }; - let pruned_banks_receiver = - AccountsBackgroundService::setup_bank_drop_callback(bank_forks.clone()); - let pruned_banks_request_handler = PrunedBanksRequestHandler { - pruned_banks_receiver, - }; - let abs_request_handler = AbsRequestHandlers { - snapshot_request_handler, - pruned_banks_request_handler, - }; - let accounts_background_service = AccountsBackgroundService::new( - bank_forks.clone(), - exit.clone(), - abs_request_handler, - process_options.accounts_db_test_hash_calculation, - starting_snapshot_hashes.map(|x| x.full.0 .0), - ); - - let enable_rpc_transaction_history = arg_matches.is_present("enable_rpc_transaction_history"); - - let (transaction_status_sender, transaction_status_service) = if geyser_plugin_active - || enable_rpc_transaction_history - { - // Need Primary (R/W) access to insert transaction data; - // obtain Primary access if we do not already have it - let tss_blockstore = if enable_rpc_transaction_history && !blockstore.is_primary_access() { - Arc::new(open_blockstore( - blockstore.ledger_path(), - arg_matches, - AccessType::PrimaryForMaintenance, - )) - } else { - blockstore.clone() - }; - - let (transaction_status_sender, transaction_status_receiver) = unbounded(); - let transaction_status_service = TransactionStatusService::new( - transaction_status_receiver, - Arc::default(), - enable_rpc_transaction_history, - transaction_notifier, - tss_blockstore, - false, - exit.clone(), - ); - ( - Some(TransactionStatusSender { - sender: transaction_status_sender, - }), - Some(transaction_status_service), - ) - } else { - (None, None) - }; - - let result = blockstore_processor::process_blockstore_from_root( - blockstore.as_ref(), - &bank_forks, - &leader_schedule_cache, - &process_options, - transaction_status_sender.as_ref(), - None, - None, // Maybe support this later, though - &accounts_background_request_sender, - ) - .map(|_| (bank_forks, starting_snapshot_hashes)) - .map_err(LoadAndProcessLedgerError::ProcessBlockstoreFromRoot); - - exit.store(true, Ordering::Relaxed); - accounts_background_service.join().unwrap(); - accounts_hash_verifier.join().unwrap(); - if let Some(service) = transaction_status_service { - service.join().unwrap(); - } - - result -} - -pub fn open_blockstore( - ledger_path: &Path, - matches: &ArgMatches, - access_type: AccessType, -) -> Blockstore { - let wal_recovery_mode = matches - .value_of("wal_recovery_mode") - .map(BlockstoreRecoveryMode::from); - let force_update_to_open = matches.is_present("force_update_to_open"); - let enforce_ulimit_nofile = !matches.is_present("ignore_ulimit_nofile_error"); - let shred_storage_type = get_shred_storage_type( - ledger_path, - &format!( - "Shred storage type cannot be inferred for ledger at {ledger_path:?}, using default \ - RocksLevel", - ), - ); - - match Blockstore::open_with_options( - ledger_path, - BlockstoreOptions { - access_type: access_type.clone(), - recovery_mode: wal_recovery_mode.clone(), - enforce_ulimit_nofile, - column_options: LedgerColumnOptions { - shred_storage_type, - ..LedgerColumnOptions::default() - }, - }, - ) { - Ok(blockstore) => blockstore, - Err(BlockstoreError::RocksDb(err)) => { - // Missing essential file, indicative of blockstore not existing - let missing_blockstore = err - .to_string() - .starts_with("IO error: No such file or directory:"); - // Missing column in blockstore that is expected by software - let missing_column = err - .to_string() - .starts_with("Invalid argument: Column family not found:"); - // The blockstore settings with Primary access can resolve the - // above issues automatically, so only emit the help messages - // if access type is Secondary - let is_secondary = access_type == AccessType::Secondary; - - if missing_blockstore && is_secondary { - eprintln!( - "Failed to open blockstore at {ledger_path:?}, it is missing at least one \ - critical file: {err:?}" - ); - } else if missing_column && is_secondary { - eprintln!( - "Failed to open blockstore at {ledger_path:?}, it does not have all necessary \ - columns: {err:?}" - ); - } else { - eprintln!("Failed to open blockstore at {ledger_path:?}: {err:?}"); - exit(1); - } - if !force_update_to_open { - eprintln!("Use --force-update-to-open flag to attempt to update the blockstore"); - exit(1); - } - open_blockstore_with_temporary_primary_access( - ledger_path, - access_type, - wal_recovery_mode, - ) - .unwrap_or_else(|err| { - eprintln!( - "Failed to open blockstore (with --force-update-to-open) at {:?}: {:?}", - ledger_path, err - ); - exit(1); - }) - } - Err(err) => { - eprintln!("Failed to open blockstore at {ledger_path:?}: {err:?}"); - exit(1); - } - } -} - -pub fn get_shred_storage_type(ledger_path: &Path, message: &str) -> ShredStorageType { - // TODO: the following shred_storage_type inference must be updated once - // the rocksdb options can be constructed via load_options_file() as the - // value picked by passing None for `max_shred_storage_size` could affect - // the persisted rocksdb options file. - match ShredStorageType::from_ledger_path(ledger_path, None) { - Some(s) => s, - None => { - info!("{}", message); - ShredStorageType::RocksLevel - } - } -} - -/// Open blockstore with temporary primary access to allow necessary, -/// persistent changes to be made to the blockstore (such as creation of new -/// column family(s)). Then, continue opening with `original_access_type` -fn open_blockstore_with_temporary_primary_access( - ledger_path: &Path, - original_access_type: AccessType, - wal_recovery_mode: Option, -) -> Result { - // Open with Primary will allow any configuration that automatically - // updates to take effect - info!("Attempting to temporarily open blockstore with Primary access in order to update"); - { - let _ = Blockstore::open_with_options( - ledger_path, - BlockstoreOptions { - access_type: AccessType::PrimaryForMaintenance, - recovery_mode: wal_recovery_mode.clone(), - enforce_ulimit_nofile: true, - ..BlockstoreOptions::default() - }, - )?; - } - // Now, attempt to open the blockstore with original AccessType - info!( - "Blockstore forced open succeeded, retrying with original access: {:?}", - original_access_type - ); - Blockstore::open_with_options( - ledger_path, - BlockstoreOptions { - access_type: original_access_type, - recovery_mode: wal_recovery_mode, - enforce_ulimit_nofile: true, - ..BlockstoreOptions::default() - }, - ) -} - -pub fn open_genesis_config_by(ledger_path: &Path, matches: &ArgMatches<'_>) -> GenesisConfig { - const MAX_GENESIS_ARCHIVE_UNPACKED_SIZE: u64 = 10 * 1024 * 1024; // 10 MiB - let max_genesis_archive_unpacked_size = MAX_GENESIS_ARCHIVE_UNPACKED_SIZE; - - open_genesis_config(ledger_path, max_genesis_archive_unpacked_size).unwrap_or_else(|err| { - eprintln!("Exiting. Failed to open genesis config: {err}"); - exit(1); - }) -} - -pub fn get_program_ids(tx: &VersionedTransaction) -> impl Iterator + '_ { - let message = &tx.message; - let account_keys = message.static_account_keys(); - - message - .instructions() - .iter() - .map(|ix| ix.program_id(account_keys)) -} - -/// Get the AccessType required, based on `process_options` -pub(crate) fn get_access_type(process_options: &ProcessOptions) -> AccessType { - match process_options.use_snapshot_archives_at_startup { - UseSnapshotArchivesAtStartup::Always => AccessType::Secondary, - UseSnapshotArchivesAtStartup::Never => AccessType::PrimaryForMaintenance, - UseSnapshotArchivesAtStartup::WhenNewest => AccessType::PrimaryForMaintenance, - } -} diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 5842ae60..05ef079e 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -3,7 +3,7 @@ use ::{ clap::Parser, ellipsis_client::{ClientSubset, EllipsisClient}, log::{error, info}, - solana_metrics::{datapoint_info, set_host_id}, + solana_metrics::set_host_id, solana_rpc_client::rpc_client::RpcClient, solana_sdk::{ clock::DEFAULT_SLOTS_PER_EPOCH, @@ -40,7 +40,23 @@ async fn main() -> Result<()> { let tx = Transaction::new_with_payer(&[ix], Some(&keypair.pubkey())); rpc_client.process_transaction(tx, &[&keypair]).await?; - info!("CLI Arguments: {:?}", cli); + info!( + "CLI Arguments: + keypair_path: {} + operator_address: {} + rpc_url: {} + ledger_path: {} + account_paths: {:?} + full_snapshots_path: {:?} + snapshot_output_dir: {}", + cli.keypair_path, + cli.operator_address, + cli.rpc_url, + cli.ledger_path.display(), + cli.account_paths, + cli.full_snapshots_path, + cli.snapshot_output_dir.display() + ); match cli.command { Commands::Run { From 87d85afeda408c4d58b74c060f2490922fbb7a3d Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Mon, 27 Jan 2025 23:45:21 -0500 Subject: [PATCH 038/112] exit bool --- tip-router-operator-cli/src/ledger_utils.rs | 81 +++++++++++---------- 1 file changed, 43 insertions(+), 38 deletions(-) diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index 6e0aebb3..a6cded19 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -1,6 +1,9 @@ use std::{ path::{Path, PathBuf}, - sync::{atomic::AtomicBool, Arc}, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, + }, time::Instant, }; @@ -186,51 +189,51 @@ pub fn get_bank_from_ledger( ); // Call ledger_utils::load_and_process_ledger here - let (bank_forks, starting_snapshot_hashes) = - match crate::load_and_process_ledger::load_and_process_ledger( - &arg_matches, - &genesis_config, - Arc::new(blockstore), - process_options, - Some(snapshot_config.full_snapshot_archives_dir), - Some(snapshot_config.incremental_snapshot_archives_dir), - ) { - Ok(res) => res, - Err(e) => { - // TODO datapoint_error! - panic!("Failed to load bank forks: {}", e); - } - }; - - // let (bank_forks, leader_schedule_cache, _starting_snapshot_hashes, ..) = - // match bank_forks_utils::load_bank_forks( + // let (bank_forks, starting_snapshot_hashes) = + // match crate::load_and_process_ledger::load_and_process_ledger( + // &arg_matches, // &genesis_config, - // &blockstore, - // account_paths, - // None, - // Some(&snapshot_config), - // &process_options, - // None, - // None, // Maybe support this later, though - // None, - // exit, - // false, + // Arc::new(blockstore), + // process_options, + // Some(snapshot_config.full_snapshot_archives_dir), + // Some(snapshot_config.incremental_snapshot_archives_dir), // ) { // Ok(res) => res, // Err(e) => { - // datapoint_error!( - // "tip_router_cli.get_bank", - // ("operator", operator_address.to_string(), String), - // ("state", "load_bank_forks", String), - // ("status", "error", String), - // ("step", 4, i64), - // ("error", format!("{:?}", e), String), - // ("duration_ms", start_time.elapsed().as_millis() as i64, i64), - // ); + // // TODO datapoint_error! // panic!("Failed to load bank forks: {}", e); // } // }; + let (bank_forks, leader_schedule_cache, _starting_snapshot_hashes, ..) = + match bank_forks_utils::load_bank_forks( + &genesis_config, + &blockstore, + account_paths, + None, + Some(&snapshot_config), + &process_options, + None, + None, // Maybe support this later, though + None, + exit.clone(), + false, + ) { + Ok(res) => res, + Err(e) => { + datapoint_error!( + "tip_router_cli.get_bank", + ("operator", operator_address.to_string(), String), + ("state", "load_bank_forks", String), + ("status", "error", String), + ("step", 4, i64), + ("error", format!("{:?}", e), String), + ("duration_ms", start_time.elapsed().as_millis() as i64, i64), + ); + panic!("Failed to load bank forks: {}", e); + } + }; + // STEP 4: Process blockstore from root // datapoint_info!( @@ -278,6 +281,8 @@ pub fn get_bank_from_ledger( let working_bank = bank_forks.read().unwrap().working_bank(); + exit.store(true, Ordering::Relaxed); + if take_snapshot { let full_snapshot_archive_info = match snapshot_bank_utils::bank_to_full_snapshot_archive( ledger_path, From 67e2a947983b670e548e4e05ccadddf32fa62d67 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Tue, 28 Jan 2025 10:46:31 -0500 Subject: [PATCH 039/112] rm unneeded --- tip-router-operator-cli/src/ledger_utils.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index a6cded19..5612cc6d 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -180,13 +180,13 @@ pub fn get_bank_from_ledger( }; let exit = Arc::new(AtomicBool::new(false)); - let mut arg_matches = ArgMatches::new(); - arg_matches::set_ledger_tool_arg_matches( - &mut arg_matches, - snapshot_config.full_snapshot_archives_dir.clone(), - snapshot_config.incremental_snapshot_archives_dir.clone(), - account_paths, - ); + // let mut arg_matches = ArgMatches::new(); + // arg_matches::set_ledger_tool_arg_matches( + // &mut arg_matches, + // snapshot_config.full_snapshot_archives_dir.clone(), + // snapshot_config.incremental_snapshot_archives_dir.clone(), + // account_paths, + // ); // Call ledger_utils::load_and_process_ledger here // let (bank_forks, starting_snapshot_hashes) = From b30a469d8e54e014d8f6572c13483c5184e1501a Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Tue, 28 Jan 2025 12:24:56 -0500 Subject: [PATCH 040/112] Attempt with ledger tool and drop --- tip-router-operator-cli/src/ledger_utils.rs | 138 +++++++++--------- .../src/stake_meta_generator.rs | 3 + 2 files changed, 72 insertions(+), 69 deletions(-) diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index 5612cc6d..c8405451 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -170,7 +170,7 @@ pub fn get_bank_from_ledger( let snapshot_config = SnapshotConfig { full_snapshot_archives_dir: full_snapshots_path.clone(), incremental_snapshot_archives_dir: incremental_snapshots_path.clone(), - bank_snapshots_dir: full_snapshots_path, + bank_snapshots_dir: full_snapshots_path.clone(), ..SnapshotConfig::new_load_only() }; @@ -180,60 +180,60 @@ pub fn get_bank_from_ledger( }; let exit = Arc::new(AtomicBool::new(false)); - // let mut arg_matches = ArgMatches::new(); - // arg_matches::set_ledger_tool_arg_matches( - // &mut arg_matches, - // snapshot_config.full_snapshot_archives_dir.clone(), - // snapshot_config.incremental_snapshot_archives_dir.clone(), - // account_paths, - // ); + let mut arg_matches = ArgMatches::new(); + arg_matches::set_ledger_tool_arg_matches( + &mut arg_matches, + snapshot_config.full_snapshot_archives_dir.clone(), + snapshot_config.incremental_snapshot_archives_dir.clone(), + account_paths, + ); // Call ledger_utils::load_and_process_ledger here - // let (bank_forks, starting_snapshot_hashes) = - // match crate::load_and_process_ledger::load_and_process_ledger( - // &arg_matches, - // &genesis_config, - // Arc::new(blockstore), - // process_options, - // Some(snapshot_config.full_snapshot_archives_dir), - // Some(snapshot_config.incremental_snapshot_archives_dir), - // ) { - // Ok(res) => res, - // Err(e) => { - // // TODO datapoint_error! - // panic!("Failed to load bank forks: {}", e); - // } - // }; - - let (bank_forks, leader_schedule_cache, _starting_snapshot_hashes, ..) = - match bank_forks_utils::load_bank_forks( + let (bank_forks, _starting_snapshot_hashes) = + match crate::load_and_process_ledger::load_and_process_ledger( + &arg_matches, &genesis_config, - &blockstore, - account_paths, - None, - Some(&snapshot_config), - &process_options, - None, - None, // Maybe support this later, though - None, - exit.clone(), - false, + Arc::new(blockstore), + process_options, + Some(full_snapshots_path.clone()), + Some(incremental_snapshots_path.clone()), ) { Ok(res) => res, Err(e) => { - datapoint_error!( - "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), - ("state", "load_bank_forks", String), - ("status", "error", String), - ("step", 4, i64), - ("error", format!("{:?}", e), String), - ("duration_ms", start_time.elapsed().as_millis() as i64, i64), - ); + // TODO datapoint_error! panic!("Failed to load bank forks: {}", e); } }; + // let (bank_forks, leader_schedule_cache, _starting_snapshot_hashes, ..) = + // match bank_forks_utils::load_bank_forks( + // &genesis_config, + // &blockstore, + // account_paths, + // None, + // Some(&snapshot_config), + // &process_options, + // None, + // None, // Maybe support this later, though + // None, + // exit.clone(), + // false, + // ) { + // Ok(res) => res, + // Err(e) => { + // datapoint_error!( + // "tip_router_cli.get_bank", + // ("operator", operator_address.to_string(), String), + // ("state", "load_bank_forks", String), + // ("status", "error", String), + // ("step", 4, i64), + // ("error", format!("{:?}", e), String), + // ("duration_ms", start_time.elapsed().as_millis() as i64, i64), + // ); + // panic!("Failed to load bank forks: {}", e); + // } + // }; + // STEP 4: Process blockstore from root // datapoint_info!( @@ -244,30 +244,30 @@ pub fn get_bank_from_ledger( ("duration_ms", start_time.elapsed().as_millis() as i64, i64), ); - match blockstore_processor::process_blockstore_from_root( - &blockstore, - &bank_forks, - &leader_schedule_cache, - &process_options, - None, - None, - None, - &AbsRequestSender::default(), - ) { - Ok(()) => (), - Err(e) => { - datapoint_error!( - "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), - ("status", "error", String), - ("state", "process_blockstore_from_root", String), - ("step", 5, i64), - ("error", format!("{:?}", e), String), - ("duration_ms", start_time.elapsed().as_millis() as i64, i64), - ); - panic!("Failed to process blockstore from root: {}", e); - } - }; + // match blockstore_processor::process_blockstore_from_root( + // &blockstore, + // &bank_forks, + // &leader_schedule_cache, + // &process_options, + // None, + // None, + // None, + // &AbsRequestSender::default(), + // ) { + // Ok(()) => (), + // Err(e) => { + // datapoint_error!( + // "tip_router_cli.get_bank", + // ("operator", operator_address.to_string(), String), + // ("status", "error", String), + // ("state", "process_blockstore_from_root", String), + // ("step", 5, i64), + // ("error", format!("{:?}", e), String), + // ("duration_ms", start_time.elapsed().as_millis() as i64, i64), + // ); + // panic!("Failed to process blockstore from root: {}", e); + // } + // }; // STEP 5: Save snapshot // diff --git a/tip-router-operator-cli/src/stake_meta_generator.rs b/tip-router-operator-cli/src/stake_meta_generator.rs index 8391513f..dab42385 100644 --- a/tip-router-operator-cli/src/stake_meta_generator.rs +++ b/tip-router-operator-cli/src/stake_meta_generator.rs @@ -129,6 +129,9 @@ pub fn generate_stake_meta( let stake_meta_coll = generate_stake_meta_collection(&bank, tip_distribution_program_id, tip_payment_program_id)?; + // Explicity drop to clean up disk space (hopefully) + drop(bank); + Ok(stake_meta_coll) } From 823c953650ffe778d1c9d4d9c97c88fb3795f12e Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Tue, 28 Jan 2025 13:25:35 -0500 Subject: [PATCH 041/112] add datapoints to other error checks --- tip-router-operator-cli/src/ledger_utils.rs | 26 +++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index 55550c34..2f5d76cf 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -199,13 +199,31 @@ pub fn get_bank_from_ledger( None | Some(0) => {} Some(halt_slot) => { if halt_slot < starting_slot { - // TODO: Clean this up and emit datapoint - panic!("halt_slot < starting_slot"); + let error_str = String::from("halt_slot < starting_slot"); + datapoint_error!( + "tip_router_cli.get_bank", + ("operator", operator_address.to_string(), String), + ("status", "error", String), + ("state", "load_blockstore", String), + ("step", 2, i64), + ("error", error_str, String), + ("duration_ms", start_time.elapsed().as_millis() as i64, i64), + ); + panic!("{}", error_str); } // Check if we have the slot data necessary to replay from starting_slot to >= halt_slot. if !blockstore.slot_range_connected(starting_slot, halt_slot) { - // TODO: Clean this up and emit datapoint - panic!("!blockstore.slot_range_connected"); + let error_str = format!("Blockstore missing data to replay to slot {}", desired_slot); + datapoint_error!( + "tip_router_cli.get_bank", + ("operator", operator_address.to_string(), String), + ("status", "error", String), + ("state", "load_blockstore", String), + ("step", 2, i64), + ("error", error_str, String), + ("duration_ms", start_time.elapsed().as_millis() as i64, i64), + ); + panic!("{}", error_str); } } } From dff455969605ba0df6451d35431d939205cacdf8 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Tue, 28 Jan 2025 13:25:50 -0500 Subject: [PATCH 042/112] fmt --- tip-router-operator-cli/src/ledger_utils.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index 2f5d76cf..4c4399be 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -213,7 +213,8 @@ pub fn get_bank_from_ledger( } // Check if we have the slot data necessary to replay from starting_slot to >= halt_slot. if !blockstore.slot_range_connected(starting_slot, halt_slot) { - let error_str = format!("Blockstore missing data to replay to slot {}", desired_slot); + let error_str = + format!("Blockstore missing data to replay to slot {}", desired_slot); datapoint_error!( "tip_router_cli.get_bank", ("operator", operator_address.to_string(), String), From 9543af92b152d2e2bd42625b80218c59081d5de1 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Tue, 28 Jan 2025 14:53:40 -0500 Subject: [PATCH 043/112] break down other stages --- meta_merkle_tree/src/generated_merkle_tree.rs | 32 ++- meta_merkle_tree/src/meta_merkle_tree.rs | 11 +- tip-router-operator-cli/src/lib.rs | 249 +++++++++++++++++- 3 files changed, 277 insertions(+), 15 deletions(-) diff --git a/meta_merkle_tree/src/generated_merkle_tree.rs b/meta_merkle_tree/src/generated_merkle_tree.rs index 18fb4616..53933803 100644 --- a/meta_merkle_tree/src/generated_merkle_tree.rs +++ b/meta_merkle_tree/src/generated_merkle_tree.rs @@ -1,4 +1,8 @@ -use std::{fs::File, io::BufReader, path::PathBuf}; +use std::{ + fs::File, + io::{BufReader, Write}, + path::PathBuf, +}; use jito_tip_distribution_sdk::{ jito_tip_distribution::ID as TIP_DISTRIBUTION_ID, CLAIM_STATUS_SEED, @@ -117,6 +121,14 @@ impl GeneratedMerkleTreeCollection { Ok(tree) } + + /// Write a GeneratedMerkleTreeCollection to a filepath + pub fn write_to_file(&self, path: &PathBuf) -> Result<(), MerkleRootGeneratorError> { + let serialized = serde_json::to_string_pretty(&self)?; + let mut file = File::create(path)?; + file.write_all(serialized.as_bytes())?; + Ok(()) + } } #[derive(Clone, Eq, Debug, Hash, PartialEq, Deserialize, Serialize)] @@ -319,6 +331,24 @@ pub struct StakeMetaCollection { pub slot: Slot, } +impl StakeMetaCollection { + /// Load a serialized merkle tree from file path + pub fn new_from_file(path: &PathBuf) -> Result { + let file = File::open(path)?; + let reader = BufReader::new(file); + let tree: Self = serde_json::from_reader(reader)?; + + Ok(tree) + } + + /// Write a merkle tree to a filepath + pub fn write_to_file(&self, path: &PathBuf) { + let serialized = serde_json::to_string_pretty(&self).unwrap(); + let mut file = File::create(path).unwrap(); + file.write_all(serialized.as_bytes()).unwrap(); + } +} + #[derive(Clone, Deserialize, Serialize, Debug, PartialEq, Eq)] pub struct StakeMeta { #[serde(with = "pubkey_string_conversion")] diff --git a/meta_merkle_tree/src/meta_merkle_tree.rs b/meta_merkle_tree/src/meta_merkle_tree.rs index 776920eb..8995501f 100644 --- a/meta_merkle_tree/src/meta_merkle_tree.rs +++ b/meta_merkle_tree/src/meta_merkle_tree.rs @@ -93,10 +93,11 @@ impl MetaMerkleTree { } /// Write a merkle tree to a filepath - pub fn write_to_file(&self, path: &PathBuf) { - let serialized = serde_json::to_string_pretty(&self).unwrap(); - let mut file = File::create(path).unwrap(); - file.write_all(serialized.as_bytes()).unwrap(); + pub fn write_to_file(&self, path: &PathBuf) -> Result<()> { + let serialized = serde_json::to_string_pretty(&self)?; + let mut file = File::create(path)?; + file.write_all(serialized.as_bytes())?; + Ok(()) } pub fn get_node(&self, tip_distribution_account: &Pubkey) -> TreeNode { @@ -244,7 +245,7 @@ mod tests { let path = PathBuf::from("merkle_tree.json"); // serialize merkle distributor to file - merkle_distributor_info.write_to_file(&path); + merkle_distributor_info.write_to_file(&path).unwrap(); // now test we can successfully read from file let merkle_distributor_read: MetaMerkleTree = MetaMerkleTree::new_from_file(&path).unwrap(); diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index c03f2236..d16948c2 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -11,6 +11,8 @@ pub mod rpc_utils; pub mod submit; use std::path::{Path, PathBuf}; +use std::str::FromStr; +use std::sync::Arc; use std::time::Instant; use anchor_lang::prelude::*; @@ -20,12 +22,244 @@ use jito_tip_payment_sdk::{ TIP_ACCOUNT_SEED_3, TIP_ACCOUNT_SEED_4, TIP_ACCOUNT_SEED_5, TIP_ACCOUNT_SEED_6, TIP_ACCOUNT_SEED_7, }; +use ledger_utils::get_bank_from_ledger; use log::info; +use meta_merkle_tree::generated_merkle_tree::StakeMetaCollection; use meta_merkle_tree::{ generated_merkle_tree::GeneratedMerkleTreeCollection, meta_merkle_tree::MetaMerkleTree, }; use solana_metrics::{datapoint_error, datapoint_info}; +use solana_runtime::bank::Bank; use solana_sdk::{account::AccountSharedData, pubkey::Pubkey, slot_history::Slot}; +use stake_meta_generator::generate_stake_meta_collection; + +pub enum OperatorState { + // Allows the operator to load from a snapshot created externally + LoadBankFromSnapshot, + CreateStakeMeta, + CreateMerkleTreeCollection, + CreateMetaMerkleTree, + SubmitToNcn, +} +// STAGE 1 LoadBankFromSnapshot +pub fn load_bank_from_snapshot(cli: Cli, slot: u64, store_snapshot: bool) -> Arc { + let operator_address = Pubkey::from_str(&cli.operator_address).unwrap(); + let account_paths = cli + .account_paths + .map_or_else(|| vec![cli.ledger_path.clone()], |paths| paths); + + let bank = get_bank_from_ledger( + &operator_address, + &cli.ledger_path, + account_paths, + cli.full_snapshots_path.unwrap(), + cli.backup_snapshots_dir, + &slot, + store_snapshot, + ); + return bank; +} + +// STAGE 2 CreateStakeMeta +pub fn create_stake_meta( + cli: Cli, + epoch: u64, + bank: Arc, + tip_distribution_program_id: &Pubkey, + tip_payment_program_id: &Pubkey, + save_path: Option, +) { + let start = Instant::now(); + + info!("Generating stake_meta_collection object..."); + let stake_meta_coll = match generate_stake_meta_collection( + &bank, + tip_distribution_program_id, + tip_payment_program_id, + ) { + Ok(stake_meta) => stake_meta, + Err(e) => { + let error_str = format!("{:?}", e); + datapoint_error!( + "tip_router_cli.process_epoch", + ("operator_address", cli.operator_address, String), + ("epoch", epoch, i64), + ("status", "error", String), + ("error", error_str, String), + ("state", "stake_meta_generation", String), + ("duration_ms", start.elapsed().as_millis() as i64, i64) + ); + panic!("{}", error_str); + } + }; + + info!( + "Created StakeMetaCollection:\n - epoch: {:?}\n - slot: {:?}\n - num stake metas: {:?}\n - bank_hash: {:?}", + stake_meta_coll.epoch, + stake_meta_coll.slot, + stake_meta_coll.stake_metas.len(), + stake_meta_coll.bank_hash + ); + if let Some(path_to_save) = save_path { + // Note: We have the epoch come before the file name so ordering is neat on a machine + // with multiple epochs saved. + let file = path_to_save.join(format!("{}_stake_meta_collection.json", epoch)); + stake_meta_coll.write_to_file(&file); + } + + datapoint_info!( + "tip_router_cli.get_meta_merkle_root", + ("operator_address", cli.operator_address, String), + ("state", "create_stake_meta", String), + ("step", 2, i64), + ("epoch", stake_meta_coll.epoch, i64), + ("duration_ms", start.elapsed().as_millis() as i64, i64) + ); +} + +// STAGE 3 CreateMerkleTreeCollection +pub fn create_merkle_tree_collection( + cli: Cli, + stake_meta_collection: StakeMetaCollection, + epoch: u64, + ncn_address: &Pubkey, + protocol_fee_bps: u64, + save_path: Option, +) { + let start = Instant::now(); + + // Generate merkle tree collection + let merkle_tree_coll = match GeneratedMerkleTreeCollection::new_from_stake_meta_collection( + stake_meta_collection, + ncn_address, + epoch, + protocol_fee_bps, + ) { + Ok(merkle_tree_coll) => merkle_tree_coll, + Err(e) => { + let error_str = format!("{:?}", e); + datapoint_error!( + "tip_router_cli.create_merkle_tree_collection", + ("operator_address", cli.operator_address, String), + ("epoch", epoch, i64), + ("status", "error", String), + ("error", error_str, String), + ("state", "merkle_tree_generation", String), + ("duration_ms", start.elapsed().as_millis() as i64, i64) + ); + panic!("{}", error_str); + } + }; + info!( + "Created GeneratedMerkleTreeCollection:\n - epoch: {:?}\n - slot: {:?}\n - num generated merkle trees: {:?}\n - bank_hash: {:?}", + merkle_tree_coll.epoch, + merkle_tree_coll.slot, + merkle_tree_coll.generated_merkle_trees.len(), + merkle_tree_coll.bank_hash + ); + + datapoint_info!( + "tip_router_cli.create_merkle_tree_collection", + ("operator_address", cli.operator_address, String), + ("state", "meta_merkle_tree_creation", String), + ("step", 3, i64), + ("epoch", epoch, i64), + ("duration_ms", start.elapsed().as_millis() as i64, i64) + ); + + if let Some(path_to_save) = save_path { + // Note: We have the epoch come before the file name so ordering is neat on a machine + // with multiple epochs saved. + let file = path_to_save.join(format!("{}_merkle_tree_collection.json", epoch)); + match merkle_tree_coll.write_to_file(&file) { + Ok(_) => {} + Err(e) => { + let error_str = format!("{:?}", e); + datapoint_error!( + "tip_router_cli.create_merkle_tree_collection", + ("operator_address", cli.operator_address, String), + ("epoch", epoch, i64), + ("status", "error", String), + ("error", error_str, String), + ("state", "merkle_root_file_write", String), + ("duration_ms", start.elapsed().as_millis() as i64, i64) + ); + panic!("{:?}", e); + } + } + } + datapoint_info!( + "tip_router_cli.create_merkle_tree_collection", + ("operator_address", cli.operator_address, String), + ("state", "meta_merkle_tree_creation", String), + ("step", 3, i64), + ("epoch", epoch, i64), + ("duration_ms", start.elapsed().as_millis() as i64, i64) + ); +} + +// STAGE 4 CreateMetaMerkleTree +pub fn create_meta_merkle_tree( + cli: Cli, + merkle_tree_collection: GeneratedMerkleTreeCollection, + epoch: u64, + save_path: Option, +) { + let start = Instant::now(); + let meta_merkle_tree = + match MetaMerkleTree::new_from_generated_merkle_tree_collection(merkle_tree_collection) { + Ok(meta_merkle_tree) => meta_merkle_tree, + Err(e) => { + let error_str = format!("{:?}", e); + datapoint_error!( + "tip_router_cli.create_meta_merkle_tree", + ("operator_address", cli.operator_address, String), + ("epoch", epoch, i64), + ("status", "error", String), + ("error", error_str, String), + ("state", "merkle_tree_generation", String), + ("duration_ms", start.elapsed().as_millis() as i64, i64) + ); + panic!("{}", error_str); + } + }; + + info!( + "Created MetaMerkleTree:\n - num nodes: {:?}\n - merkle root: {:?}", + meta_merkle_tree.num_nodes, meta_merkle_tree.merkle_root + ); + + if let Some(path_to_save) = save_path { + // Note: We have the epoch come before the file name so ordering is neat on a machine + // with multiple epochs saved. + let file = path_to_save.join(format!("{}_meta_merkle_tree.json", epoch)); + match meta_merkle_tree.write_to_file(&file) { + Ok(_) => {} + Err(e) => { + let error_str = format!("{:?}", e); + datapoint_error!( + "tip_router_cli.create_meta_merkle_tree", + ("operator_address", cli.operator_address, String), + ("epoch", epoch, i64), + ("status", "error", String), + ("error", error_str, String), + ("state", "merkle_root_file_write", String), + ("duration_ms", start.elapsed().as_millis() as i64, i64) + ); + panic!("{:?}", e); + } + } + } + + datapoint_info!( + "tip_router_cli.create_meta_merkle_tree", + ("operator_address", cli.operator_address, String), + ("state", "meta_merkle_tree_creation", String), + ("step", 4, i64), + ("epoch", epoch, i64), + ("duration_ms", start.elapsed().as_millis() as i64, i64) + ); +} #[derive(Debug)] pub enum MerkleRootError { @@ -174,35 +408,32 @@ pub fn get_meta_merkle_root( let generated_merkle_tree_col_json = match serde_json::to_string(&merkle_tree_coll) { Ok(json) => json, Err(e) => { + let error_str = format!("{:?}", e); datapoint_error!( "tip_router_cli.process_epoch", ("operator_address", operator_address.to_string(), String), ("epoch", epoch, i64), ("status", "error", String), - ("error", format!("{:?}", e), String), + ("error", error_str, String), ("state", "merkle_root_serialization", String), ("duration_ms", start.elapsed().as_millis() as i64, i64) ); - return Err(MerkleRootError::MerkleRootGeneratorError( - "Failed to serialize merkle tree collection", - )); + return Err(MerkleRootError::MerkleRootGeneratorError(error_str)); } }; if let Err(e) = std::fs::write(&merkle_tree_coll_path, generated_merkle_tree_col_json) { + let error_str = format!("{:?}", e); datapoint_error!( "tip_router_cli.process_epoch", ("operator_address", operator_address.to_string(), String), ("epoch", epoch, i64), ("status", "error", String), - ("error", format!("{:?}", e), String), + ("error", error_str, String), ("state", "merkle_root_file_write", String), ("duration_ms", start.elapsed().as_millis() as i64, i64) ); - // TODO: propogate error - return Err(MerkleRootError::MerkleRootGeneratorError( - "Failed to write meta merkle tree to file", - )); + return Err(MerkleRootError::MerkleRootGeneratorError(error_str)); } // Convert to MetaMerkleTree From b7d97b05c9cda31693db3850ca145d6c764cabe7 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Tue, 28 Jan 2025 15:34:23 -0500 Subject: [PATCH 044/112] add create stake meta command --- tip-router-operator-cli/src/cli.rs | 16 +++++++++++++++ tip-router-operator-cli/src/lib.rs | 9 +++++---- tip-router-operator-cli/src/main.rs | 30 +++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index 648acbba..dda4373e 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -33,6 +33,9 @@ pub struct Cli { #[arg(short, long, env)] pub meta_merkle_tree_dir: PathBuf, + #[arg(short, long, env)] + pub save_path: Option, + #[command(subcommand)] pub command: Commands, } @@ -94,4 +97,17 @@ pub enum Commands { #[arg(long, env)] epoch: u64, }, + CreateStakeMeta { + #[arg(long, env)] + slot: u64, + + #[arg(long, env)] + epoch: u64, + + #[arg(long, env)] + tip_distribution_program_id: Pubkey, + + #[arg(long, env)] + tip_payment_program_id: Pubkey, + }, } diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index d16948c2..98dea79e 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -40,6 +40,7 @@ pub enum OperatorState { CreateMerkleTreeCollection, CreateMetaMerkleTree, SubmitToNcn, + WaitForNextEpoch, } // STAGE 1 LoadBankFromSnapshot pub fn load_bank_from_snapshot(cli: Cli, slot: u64, store_snapshot: bool) -> Arc { @@ -62,12 +63,12 @@ pub fn load_bank_from_snapshot(cli: Cli, slot: u64, store_snapshot: bool) -> Arc // STAGE 2 CreateStakeMeta pub fn create_stake_meta( - cli: Cli, + operator_address: String, epoch: u64, bank: Arc, tip_distribution_program_id: &Pubkey, tip_payment_program_id: &Pubkey, - save_path: Option, + save_path: &Option, ) { let start = Instant::now(); @@ -82,7 +83,7 @@ pub fn create_stake_meta( let error_str = format!("{:?}", e); datapoint_error!( "tip_router_cli.process_epoch", - ("operator_address", cli.operator_address, String), + ("operator_address", operator_address, String), ("epoch", epoch, i64), ("status", "error", String), ("error", error_str, String), @@ -109,7 +110,7 @@ pub fn create_stake_meta( datapoint_info!( "tip_router_cli.get_meta_merkle_root", - ("operator_address", cli.operator_address, String), + ("operator_address", operator_address, String), ("state", "create_stake_meta", String), ("step", 2, i64), ("epoch", stake_meta_coll.epoch, i64), diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index d3a15e9c..2ec7c2b4 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -21,6 +21,7 @@ use ::{ backup_snapshots::BackupSnapshotMonitor, claim::claim_mev_tips, cli::{Cli, Commands}, + create_stake_meta, ledger_utils::get_bank_from_ledger, process_epoch::{get_previous_epoch_last_slot, process_epoch, wait_for_next_epoch}, submit::{submit_recent_epochs_to_ncn, submit_to_ncn}, @@ -265,6 +266,35 @@ async fn main() -> Result<()> { } } } + Commands::CreateStakeMeta { + epoch, + slot, + tip_distribution_program_id, + tip_payment_program_id, + } => { + let operator_address = Pubkey::from_str(&cli.operator_address)?; + let account_paths = cli + .account_paths + .map_or_else(|| vec![cli.ledger_path.clone()], |paths| paths); + let bank = get_bank_from_ledger( + &operator_address, + &cli.ledger_path, + account_paths, + cli.full_snapshots_path.unwrap(), + cli.backup_snapshots_dir, + &slot, + true, + ); + + create_stake_meta( + cli.operator_address, + epoch, + bank, + &tip_distribution_program_id, + &tip_payment_program_id, + &cli.save_path, + ); + } } Ok(()) } From c038f0fb86e2b18705d594fdf0553474b0b6032f Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Tue, 28 Jan 2025 16:38:50 -0500 Subject: [PATCH 045/112] add create merkle tree collection command --- tip-router-operator-cli/src/cli.rs | 15 ++++++++++- tip-router-operator-cli/src/lib.rs | 24 ++++++++++-------- tip-router-operator-cli/src/main.rs | 39 +++++++++++++++++++++++------ 3 files changed, 58 insertions(+), 20 deletions(-) diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index dda4373e..7006e5bd 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -34,7 +34,7 @@ pub struct Cli { pub meta_merkle_tree_dir: PathBuf, #[arg(short, long, env)] - pub save_path: Option, + pub save_path: PathBuf, #[command(subcommand)] pub command: Commands, @@ -109,5 +109,18 @@ pub enum Commands { #[arg(long, env)] tip_payment_program_id: Pubkey, + + #[arg(long, env, default_value = "true")] + save: bool, + }, + CreateMerkleTreeCollection { + #[arg(short, long, env)] + ncn_address: Pubkey, + + #[arg(long, env)] + epoch: u64, + + #[arg(long, env, default_value = "true")] + save: bool, }, } diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index 98dea79e..45e35549 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -68,7 +68,8 @@ pub fn create_stake_meta( bank: Arc, tip_distribution_program_id: &Pubkey, tip_payment_program_id: &Pubkey, - save_path: &Option, + save_path: &PathBuf, + save_snapshot: bool, ) { let start = Instant::now(); @@ -101,10 +102,10 @@ pub fn create_stake_meta( stake_meta_coll.stake_metas.len(), stake_meta_coll.bank_hash ); - if let Some(path_to_save) = save_path { + if save_snapshot { // Note: We have the epoch come before the file name so ordering is neat on a machine // with multiple epochs saved. - let file = path_to_save.join(format!("{}_stake_meta_collection.json", epoch)); + let file = save_path.join(format!("{}_stake_meta_collection.json", epoch)); stake_meta_coll.write_to_file(&file); } @@ -120,12 +121,13 @@ pub fn create_stake_meta( // STAGE 3 CreateMerkleTreeCollection pub fn create_merkle_tree_collection( - cli: Cli, + operator_address: String, stake_meta_collection: StakeMetaCollection, epoch: u64, ncn_address: &Pubkey, protocol_fee_bps: u64, - save_path: Option, + save_path: &PathBuf, + save: bool, ) { let start = Instant::now(); @@ -141,7 +143,7 @@ pub fn create_merkle_tree_collection( let error_str = format!("{:?}", e); datapoint_error!( "tip_router_cli.create_merkle_tree_collection", - ("operator_address", cli.operator_address, String), + ("operator_address", operator_address, String), ("epoch", epoch, i64), ("status", "error", String), ("error", error_str, String), @@ -161,24 +163,24 @@ pub fn create_merkle_tree_collection( datapoint_info!( "tip_router_cli.create_merkle_tree_collection", - ("operator_address", cli.operator_address, String), + ("operator_address", operator_address, String), ("state", "meta_merkle_tree_creation", String), ("step", 3, i64), ("epoch", epoch, i64), ("duration_ms", start.elapsed().as_millis() as i64, i64) ); - if let Some(path_to_save) = save_path { + if save { // Note: We have the epoch come before the file name so ordering is neat on a machine // with multiple epochs saved. - let file = path_to_save.join(format!("{}_merkle_tree_collection.json", epoch)); + let file = save_path.join(format!("{}_merkle_tree_collection.json", epoch)); match merkle_tree_coll.write_to_file(&file) { Ok(_) => {} Err(e) => { let error_str = format!("{:?}", e); datapoint_error!( "tip_router_cli.create_merkle_tree_collection", - ("operator_address", cli.operator_address, String), + ("operator_address", operator_address, String), ("epoch", epoch, i64), ("status", "error", String), ("error", error_str, String), @@ -191,7 +193,7 @@ pub fn create_merkle_tree_collection( } datapoint_info!( "tip_router_cli.create_merkle_tree_collection", - ("operator_address", cli.operator_address, String), + ("operator_address", operator_address, String), ("state", "meta_merkle_tree_creation", String), ("step", 3, i64), ("epoch", epoch, i64), diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 2ec7c2b4..5a725680 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -1,16 +1,12 @@ use ::{ anyhow::Result, clap::Parser, - ellipsis_client::{ClientSubset, EllipsisClient}, + ellipsis_client::EllipsisClient, log::{error, info}, - meta_merkle_tree::generated_merkle_tree::GeneratedMerkleTreeCollection, + meta_merkle_tree::generated_merkle_tree::{GeneratedMerkleTreeCollection, StakeMetaCollection}, solana_metrics::{datapoint_error, datapoint_info, set_host_id}, solana_rpc_client::rpc_client::RpcClient, - solana_sdk::{ - pubkey::Pubkey, - signer::{keypair::read_keypair_file, Signer}, - transaction::Transaction, - }, + solana_sdk::{pubkey::Pubkey, signer::keypair::read_keypair_file}, std::{ path::PathBuf, str::FromStr, @@ -21,7 +17,7 @@ use ::{ backup_snapshots::BackupSnapshotMonitor, claim::claim_mev_tips, cli::{Cli, Commands}, - create_stake_meta, + create_merkle_tree_collection, create_stake_meta, ledger_utils::get_bank_from_ledger, process_epoch::{get_previous_epoch_last_slot, process_epoch, wait_for_next_epoch}, submit::{submit_recent_epochs_to_ncn, submit_to_ncn}, @@ -29,6 +25,9 @@ use ::{ tokio::time::sleep, }; +// TODO: Should this be loaded from somewhere? +const PROTOCOL_FEE_BPS: u64 = 300; + #[tokio::main] async fn main() -> Result<()> { env_logger::init(); @@ -271,6 +270,7 @@ async fn main() -> Result<()> { slot, tip_distribution_program_id, tip_payment_program_id, + save, } => { let operator_address = Pubkey::from_str(&cli.operator_address)?; let account_paths = cli @@ -293,6 +293,29 @@ async fn main() -> Result<()> { &tip_distribution_program_id, &tip_payment_program_id, &cli.save_path, + save, + ); + } + Commands::CreateMerkleTreeCollection { + ncn_address, + epoch, + save, + } => { + // Load the stake_meta_collection from disk + let stake_meta_collection = match StakeMetaCollection::new_from_file(&cli.save_path) { + Ok(stake_meta_collection) => stake_meta_collection, + Err(e) => panic!("{}", e), // TODO: should datapoint error be emitted here? + }; + + // Generate the merkle tree collection + create_merkle_tree_collection( + cli.operator_address, + stake_meta_collection, + epoch, + &ncn_address, + PROTOCOL_FEE_BPS, + &cli.save_path, + save, ); } } From 69e4893cb2cb03af2a7b36e245e365f2a1eb12be Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Tue, 28 Jan 2025 16:54:00 -0500 Subject: [PATCH 046/112] add create meta merkle command --- tip-router-operator-cli/src/cli.rs | 7 +++++++ tip-router-operator-cli/src/lib.rs | 15 ++++++++------- tip-router-operator-cli/src/main.rs | 18 +++++++++++++++++- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index 7006e5bd..14b87939 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -120,6 +120,13 @@ pub enum Commands { #[arg(long, env)] epoch: u64, + #[arg(long, env, default_value = "true")] + save: bool, + }, + CreateMetaMerkleTree { + #[arg(long, env)] + epoch: u64, + #[arg(long, env, default_value = "true")] save: bool, }, diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index 45e35549..81e2ba05 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -203,10 +203,11 @@ pub fn create_merkle_tree_collection( // STAGE 4 CreateMetaMerkleTree pub fn create_meta_merkle_tree( - cli: Cli, + operator_address: String, merkle_tree_collection: GeneratedMerkleTreeCollection, epoch: u64, - save_path: Option, + save_path: &PathBuf, + save: bool, ) { let start = Instant::now(); let meta_merkle_tree = @@ -216,7 +217,7 @@ pub fn create_meta_merkle_tree( let error_str = format!("{:?}", e); datapoint_error!( "tip_router_cli.create_meta_merkle_tree", - ("operator_address", cli.operator_address, String), + ("operator_address", operator_address, String), ("epoch", epoch, i64), ("status", "error", String), ("error", error_str, String), @@ -232,17 +233,17 @@ pub fn create_meta_merkle_tree( meta_merkle_tree.num_nodes, meta_merkle_tree.merkle_root ); - if let Some(path_to_save) = save_path { + if save { // Note: We have the epoch come before the file name so ordering is neat on a machine // with multiple epochs saved. - let file = path_to_save.join(format!("{}_meta_merkle_tree.json", epoch)); + let file = save_path.join(format!("{}_meta_merkle_tree.json", epoch)); match meta_merkle_tree.write_to_file(&file) { Ok(_) => {} Err(e) => { let error_str = format!("{:?}", e); datapoint_error!( "tip_router_cli.create_meta_merkle_tree", - ("operator_address", cli.operator_address, String), + ("operator_address", operator_address, String), ("epoch", epoch, i64), ("status", "error", String), ("error", error_str, String), @@ -256,7 +257,7 @@ pub fn create_meta_merkle_tree( datapoint_info!( "tip_router_cli.create_meta_merkle_tree", - ("operator_address", cli.operator_address, String), + ("operator_address", operator_address, String), ("state", "meta_merkle_tree_creation", String), ("step", 4, i64), ("epoch", epoch, i64), diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 5a725680..05857654 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -17,7 +17,7 @@ use ::{ backup_snapshots::BackupSnapshotMonitor, claim::claim_mev_tips, cli::{Cli, Commands}, - create_merkle_tree_collection, create_stake_meta, + create_merkle_tree_collection, create_meta_merkle_tree, create_stake_meta, ledger_utils::get_bank_from_ledger, process_epoch::{get_previous_epoch_last_slot, process_epoch, wait_for_next_epoch}, submit::{submit_recent_epochs_to_ncn, submit_to_ncn}, @@ -318,6 +318,22 @@ async fn main() -> Result<()> { save, ); } + Commands::CreateMetaMerkleTree { epoch, save } => { + // Load the stake_meta_collection from disk + let merkle_tree_collection = + match GeneratedMerkleTreeCollection::new_from_file(&cli.save_path) { + Ok(merkle_tree_collection) => merkle_tree_collection, + Err(e) => panic!("{}", e), // TODO: should datapoint error be emitted here? + }; + + create_meta_merkle_tree( + cli.operator_address, + merkle_tree_collection, + epoch, + &cli.save_path, + save, + ); + } } Ok(()) } From 798a0e0cc5783017768a5f3c116bd0a6093d558d Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Tue, 28 Jan 2025 20:56:57 -0500 Subject: [PATCH 047/112] WIP transition loop --- tip-router-operator-cli/src/cli.rs | 13 +- tip-router-operator-cli/src/ledger_utils.rs | 38 +++-- tip-router-operator-cli/src/lib.rs | 20 ++- tip-router-operator-cli/src/main.rs | 159 ++++++++++++------ .../src/stake_meta_generator.rs | 2 +- 5 files changed, 154 insertions(+), 78 deletions(-) diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index 14b87939..3137c9d1 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -3,6 +3,8 @@ use std::path::PathBuf; use clap::Parser; use solana_sdk::pubkey::Pubkey; +use crate::OperatorState; + #[derive(Clone, Parser)] #[command(author, version, about)] pub struct Cli { @@ -33,7 +35,7 @@ pub struct Cli { #[arg(short, long, env)] pub meta_merkle_tree_dir: PathBuf, - #[arg(short, long, env)] + #[arg(long, env)] pub save_path: PathBuf, #[command(subcommand)] @@ -61,11 +63,14 @@ pub enum Commands { #[arg(long, env, default_value = "3")] num_monitored_epochs: u64, - #[arg(long, env, default_value = "false")] - start_next_epoch: bool, - #[arg(long, env)] override_target_slot: Option, + + #[arg(long, env, default_value = "wait-for-next-epoch")] + starting_stage: OperatorState, + + #[arg(long, env, default_value = "true")] + save_stages: bool, }, SnapshotSlot { #[arg(long, env)] diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index 4c4399be..6f298de3 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -21,12 +21,12 @@ use solana_runtime::{ snapshot_config::SnapshotConfig, snapshot_utils::{self, SnapshotVersion}, }; -use solana_sdk::{clock::Slot, pubkey::Pubkey}; +use solana_sdk::clock::Slot; // TODO: Use Result and propagate errors more gracefully /// Create the Bank for a desired slot for given file paths. pub fn get_bank_from_ledger( - operator_address: &Pubkey, + operator_address: String, ledger_path: &Path, account_paths: Vec, full_snapshots_path: PathBuf, @@ -39,7 +39,7 @@ pub fn get_bank_from_ledger( // Start validation datapoint_info!( "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), + ("operator", operator_address, String), ("state", "validate_path_start", String), ("step", 0, i64), ); @@ -48,7 +48,7 @@ pub fn get_bank_from_ledger( datapoint_info!( "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), + ("operator", operator_address, String), ("state", "load_genesis_start", String), ("step", 1, i64), ("duration_ms", start_time.elapsed().as_millis() as i64, i64), @@ -59,7 +59,7 @@ pub fn get_bank_from_ledger( Err(e) => { datapoint_error!( "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), + ("operator", operator_address, String), ("status", "error", String), ("state", "load_genesis", String), ("step", 1, i64), @@ -73,7 +73,7 @@ pub fn get_bank_from_ledger( datapoint_info!( "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), + ("operator", operator_address, String), ("state", "load_blockstore_start", String), ("step", 2, i64), ("duration_ms", start_time.elapsed().as_millis() as i64, i64), @@ -118,7 +118,7 @@ pub fn get_bank_from_ledger( }; datapoint_error!( "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), + ("operator", operator_address, String), ("status", "error", String), ("state", "load_blockstore", String), ("step", 2, i64), @@ -131,7 +131,7 @@ pub fn get_bank_from_ledger( let error_str = format!("Failed to open blockstore at {ledger_path:?}: {err:?}"); datapoint_error!( "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), + ("operator", operator_address, String), ("status", "error", String), ("state", "load_blockstore", String), ("step", 2, i64), @@ -158,7 +158,7 @@ pub fn get_bank_from_ledger( datapoint_info!( "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), + ("operator", operator_address, String), ("state", "load_snapshot_config_start", String), ("step", 3, i64), ("duration_ms", start_time.elapsed().as_millis() as i64, i64), @@ -202,7 +202,7 @@ pub fn get_bank_from_ledger( let error_str = String::from("halt_slot < starting_slot"); datapoint_error!( "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), + ("operator", operator_address, String), ("status", "error", String), ("state", "load_blockstore", String), ("step", 2, i64), @@ -217,7 +217,7 @@ pub fn get_bank_from_ledger( format!("Blockstore missing data to replay to slot {}", desired_slot); datapoint_error!( "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), + ("operator", operator_address, String), ("status", "error", String), ("state", "load_blockstore", String), ("step", 2, i64), @@ -247,7 +247,7 @@ pub fn get_bank_from_ledger( Err(e) => { datapoint_error!( "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), + ("operator", operator_address, String), ("state", "load_bank_forks", String), ("status", "error", String), ("step", 4, i64), @@ -262,7 +262,7 @@ pub fn get_bank_from_ledger( datapoint_info!( "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), + ("operator", operator_address, String), ("state", "process_blockstore_from_root_start", String), ("step", 4, i64), ("duration_ms", start_time.elapsed().as_millis() as i64, i64), @@ -282,7 +282,7 @@ pub fn get_bank_from_ledger( Err(e) => { datapoint_error!( "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), + ("operator", operator_address, String), ("status", "error", String), ("state", "process_blockstore_from_root", String), ("step", 5, i64), @@ -297,7 +297,7 @@ pub fn get_bank_from_ledger( datapoint_info!( "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), + ("operator", operator_address, String), ("state", "bank_to_full_snapshot_archive_start", String), ("step", 5, i64), ("duration_ms", start_time.elapsed().as_millis() as i64, i64), @@ -320,7 +320,7 @@ pub fn get_bank_from_ledger( Err(e) => { datapoint_error!( "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), + ("operator", operator_address, String), ("status", "error", String), ("state", "bank_to_full_snapshot_archive", String), ("step", 6, i64), @@ -350,7 +350,7 @@ pub fn get_bank_from_ledger( datapoint_info!( "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), + ("operator", operator_address, String), ("state", "get_bank_from_ledger_success", String), ("step", 6, i64), ("duration_ms", start_time.elapsed().as_millis() as i64, i64), @@ -360,6 +360,8 @@ pub fn get_bank_from_ledger( #[cfg(test)] mod tests { + use solana_sdk::pubkey::Pubkey; + use super::*; #[test] @@ -370,7 +372,7 @@ mod tests { let full_snapshots_path = ledger_path.clone(); let desired_slot = 144; let res = get_bank_from_ledger( - &operator_address, + operator_address.to_string(), &ledger_path, account_paths, full_snapshots_path.clone(), diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index 81e2ba05..d5345d41 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -11,7 +11,6 @@ pub mod rpc_utils; pub mod submit; use std::path::{Path, PathBuf}; -use std::str::FromStr; use std::sync::Arc; use std::time::Instant; @@ -33,6 +32,7 @@ use solana_runtime::bank::Bank; use solana_sdk::{account::AccountSharedData, pubkey::Pubkey, slot_history::Slot}; use stake_meta_generator::generate_stake_meta_collection; +#[derive(clap::ValueEnum, Clone, Copy, Debug)] pub enum OperatorState { // Allows the operator to load from a snapshot created externally LoadBankFromSnapshot, @@ -42,15 +42,15 @@ pub enum OperatorState { SubmitToNcn, WaitForNextEpoch, } + // STAGE 1 LoadBankFromSnapshot pub fn load_bank_from_snapshot(cli: Cli, slot: u64, store_snapshot: bool) -> Arc { - let operator_address = Pubkey::from_str(&cli.operator_address).unwrap(); let account_paths = cli .account_paths .map_or_else(|| vec![cli.ledger_path.clone()], |paths| paths); let bank = get_bank_from_ledger( - &operator_address, + cli.operator_address, &cli.ledger_path, account_paths, cli.full_snapshots_path.unwrap(), @@ -65,17 +65,17 @@ pub fn load_bank_from_snapshot(cli: Cli, slot: u64, store_snapshot: bool) -> Arc pub fn create_stake_meta( operator_address: String, epoch: u64, - bank: Arc, + bank: &Arc, tip_distribution_program_id: &Pubkey, tip_payment_program_id: &Pubkey, save_path: &PathBuf, save_snapshot: bool, -) { +) -> StakeMetaCollection { let start = Instant::now(); info!("Generating stake_meta_collection object..."); let stake_meta_coll = match generate_stake_meta_collection( - &bank, + bank, tip_distribution_program_id, tip_payment_program_id, ) { @@ -117,6 +117,7 @@ pub fn create_stake_meta( ("epoch", stake_meta_coll.epoch, i64), ("duration_ms", start.elapsed().as_millis() as i64, i64) ); + stake_meta_coll } // STAGE 3 CreateMerkleTreeCollection @@ -128,7 +129,7 @@ pub fn create_merkle_tree_collection( protocol_fee_bps: u64, save_path: &PathBuf, save: bool, -) { +) -> GeneratedMerkleTreeCollection { let start = Instant::now(); // Generate merkle tree collection @@ -199,6 +200,7 @@ pub fn create_merkle_tree_collection( ("epoch", epoch, i64), ("duration_ms", start.elapsed().as_millis() as i64, i64) ); + merkle_tree_coll } // STAGE 4 CreateMetaMerkleTree @@ -208,7 +210,7 @@ pub fn create_meta_merkle_tree( epoch: u64, save_path: &PathBuf, save: bool, -) { +) -> MetaMerkleTree { let start = Instant::now(); let meta_merkle_tree = match MetaMerkleTree::new_from_generated_merkle_tree_collection(merkle_tree_collection) { @@ -263,6 +265,8 @@ pub fn create_meta_merkle_tree( ("epoch", epoch, i64), ("duration_ms", start.elapsed().as_millis() as i64, i64) ); + + meta_merkle_tree } #[derive(Debug)] diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 05857654..c0c3ff5b 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -6,6 +6,7 @@ use ::{ meta_merkle_tree::generated_merkle_tree::{GeneratedMerkleTreeCollection, StakeMetaCollection}, solana_metrics::{datapoint_error, datapoint_info, set_host_id}, solana_rpc_client::rpc_client::RpcClient, + solana_runtime::bank::Bank, solana_sdk::{pubkey::Pubkey, signer::keypair::read_keypair_file}, std::{ path::PathBuf, @@ -19,8 +20,9 @@ use ::{ cli::{Cli, Commands}, create_merkle_tree_collection, create_meta_merkle_tree, create_stake_meta, ledger_utils::get_bank_from_ledger, - process_epoch::{get_previous_epoch_last_slot, process_epoch, wait_for_next_epoch}, + process_epoch::{get_previous_epoch_last_slot, wait_for_next_epoch}, submit::{submit_recent_epochs_to_ncn, submit_to_ncn}, + OperatorState, }, tokio::time::sleep, }; @@ -66,11 +68,14 @@ async fn main() -> Result<()> { tip_router_program_id, enable_snapshots, num_monitored_epochs, - start_next_epoch, override_target_slot, + starting_stage, + save_stages, } => { info!("Running Tip Router..."); + info!("starting stage: {:?}", starting_stage); + let operator_address = cli.operator_address.clone(); let rpc_client_clone = rpc_client.clone(); let full_snapshots_path = cli.full_snapshots_path.clone().unwrap(); let backup_snapshots_dir = cli.backup_snapshots_dir.clone(); @@ -122,64 +127,125 @@ async fn main() -> Result<()> { } }); - if start_next_epoch { - wait_for_next_epoch(&rpc_client).await?; - } - // Track runs that are starting right at the beginning of a new epoch - let mut new_epoch_rollover = start_next_epoch; - + let mut stage = starting_stage; + let mut bank: Option> = None; + let mut stake_meta_collection: Option = None; + let mut merkle_tree_collection: Option = None; + let account_paths = cli + .account_paths + .map_or_else(|| vec![cli.ledger_path.clone()], |paths| paths); + let mut slot_to_process = if let Some(slot) = override_target_slot { + slot + } else { + 0 + }; + let mut epoch_to_process = 0; loop { - // Get the last slot of the previous epoch - let (previous_epoch, previous_epoch_slot) = - if let Ok((epoch, slot)) = get_previous_epoch_last_slot(&rpc_client) { - (epoch, slot) - } else { - error!("Error getting previous epoch slot"); - continue; - }; + match stage { + OperatorState::LoadBankFromSnapshot => { + bank = Some(get_bank_from_ledger( + operator_address.clone(), + &cli.ledger_path, + account_paths.clone(), + cli.full_snapshots_path.clone().unwrap(), + cli.backup_snapshots_dir.clone(), + &slot_to_process, + enable_snapshots, + )); + // Transition to the next stage + stage = OperatorState::CreateStakeMeta; + } + OperatorState::CreateStakeMeta => { + // TODO: Determine if we want to allow operators to start from this stage. + // No matter what a bank has to be loaded from a snapshot, so might as + // well start from load bank + stake_meta_collection = Some(create_stake_meta( + operator_address.clone(), + epoch_to_process, + bank.as_ref().expect("Bank was not set"), + &tip_distribution_program_id, + &tip_payment_program_id, + &cli.save_path, + save_stages, + )); + // we should be able to safely drop the bank in this loop + bank = None; + // Transition to the next stage + stage = OperatorState::CreateMerkleTreeCollection; + } + OperatorState::CreateMerkleTreeCollection => { + let some_stake_meta_collection = match stake_meta_collection.to_owned() { + Some(collection) => collection, + // TODO: Handle this + None => todo!("load stake meta from disk given desired epoch"), + }; - info!("Processing slot {} for previous epoch", previous_epoch_slot); + // Generate the merkle tree collection + merkle_tree_collection = Some(create_merkle_tree_collection( + cli.operator_address.clone(), + some_stake_meta_collection, + epoch_to_process, + &ncn_address, + PROTOCOL_FEE_BPS, + &cli.save_path, + save_stages, + )); - // Process the epoch - match process_epoch( - &rpc_client, - previous_epoch_slot, - previous_epoch, - &tip_distribution_program_id, - &tip_payment_program_id, - &tip_router_program_id, - &ncn_address, - enable_snapshots, - new_epoch_rollover, - &cli, - ) - .await - { - Ok(_) => info!("Successfully processed epoch"), - Err(e) => { - error!("Error processing epoch: {}", e); + stake_meta_collection = None; + // Transition to the next stage + stage = OperatorState::CreateMetaMerkleTree; } - } + OperatorState::CreateMetaMerkleTree => { + let some_merkle_tree_collection = match merkle_tree_collection.to_owned() { + Some(collection) => collection, + None => { + // TODO: Handle this + todo!("load merkle tree collection from disk given desired epoch") + } + }; - // Wait for epoch change - if let Err(e) = wait_for_next_epoch(&rpc_client).await { - error!("Error waiting for next epoch: {}", e); - sleep(Duration::from_secs(60)).await; + create_meta_merkle_tree( + cli.operator_address.clone(), + some_merkle_tree_collection, + epoch_to_process, + &cli.save_path, + // TODO: If we keep the separate thread for handling NCN submission + // through files on disk then this needs to be true + save_stages, + ); + stage = OperatorState::WaitForNextEpoch; + } + OperatorState::SubmitToNcn => { + // TODO: Determine if this should be a stage given the task that's in a + // separate thread + } + OperatorState::WaitForNextEpoch => { + wait_for_next_epoch(&rpc_client).await?; + // Get the last slot of the previous epoch + let (previous_epoch, previous_epoch_slot) = + if let Ok((epoch, slot)) = get_previous_epoch_last_slot(&rpc_client) { + (epoch, slot) + } else { + // TODO: Make a datapoint error + error!("Error getting previous epoch slot"); + continue; + }; + slot_to_process = previous_epoch_slot; + epoch_to_process = previous_epoch; + stage = OperatorState::LoadBankFromSnapshot; + } } - - new_epoch_rollover = true; } } Commands::SnapshotSlot { slot } => { info!("Snapshotting slot..."); - let operator_address = Pubkey::from_str(&cli.operator_address)?; let account_paths = cli .account_paths .map_or_else(|| vec![cli.ledger_path.clone()], |paths| paths); get_bank_from_ledger( - &operator_address, + cli.operator_address, &cli.ledger_path, account_paths, cli.full_snapshots_path.unwrap(), @@ -272,12 +338,11 @@ async fn main() -> Result<()> { tip_payment_program_id, save, } => { - let operator_address = Pubkey::from_str(&cli.operator_address)?; let account_paths = cli .account_paths .map_or_else(|| vec![cli.ledger_path.clone()], |paths| paths); let bank = get_bank_from_ledger( - &operator_address, + cli.operator_address.clone(), &cli.ledger_path, account_paths, cli.full_snapshots_path.unwrap(), @@ -289,7 +354,7 @@ async fn main() -> Result<()> { create_stake_meta( cli.operator_address, epoch, - bank, + &bank, &tip_distribution_program_id, &tip_payment_program_id, &cli.save_path, diff --git a/tip-router-operator-cli/src/stake_meta_generator.rs b/tip-router-operator-cli/src/stake_meta_generator.rs index 8391513f..0dc557fa 100644 --- a/tip-router-operator-cli/src/stake_meta_generator.rs +++ b/tip-router-operator-cli/src/stake_meta_generator.rs @@ -90,7 +90,7 @@ pub fn generate_stake_meta( info!("Creating bank from ledger path..."); let res = std::panic::catch_unwind(|| { get_bank_from_ledger( - operator_address, + operator_address.to_string(), ledger_path, account_paths, full_snapshots_path, From a78e6d43f0cadb2cd4c4c702df2aa137dad96242 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Tue, 28 Jan 2025 23:34:00 -0500 Subject: [PATCH 048/112] debugging --- tip-router-operator-cli/src/arg_matches.rs | 15 ++++++------ tip-router-operator-cli/src/ledger_utils.rs | 8 +++++++ .../src/load_and_process_ledger.rs | 24 +++++++++++++++++++ tip-router-operator-cli/src/main.rs | 2 ++ 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/tip-router-operator-cli/src/arg_matches.rs b/tip-router-operator-cli/src/arg_matches.rs index 8cf3a418..e82c73dc 100644 --- a/tip-router-operator-cli/src/arg_matches.rs +++ b/tip-router-operator-cli/src/arg_matches.rs @@ -445,17 +445,18 @@ pub fn set_ledger_tool_arg_matches<'a>( let args: Vec = vec![ "tip-router-operator-cli".into(), + "create-snapshot".into(), "--full-snapshot-archive-path".into(), full_snapshots_archives_dir.into(), "--incremental-snapshot-archive-path".into(), incremental_snapshots_archives_dir.into(), - "--accounts".into(), - account_paths - .iter() - .map(|p| p.to_string_lossy().to_string()) - .collect::>() - .join(",") - .into(), + // "--accounts".into(), + // account_paths + // .iter() + // .map(|p| p.to_string_lossy().to_string()) + // .collect::>() + // .join(",") + // .into(), ]; *arg_matches = app.get_matches_from(args); diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index c8405451..b28c040e 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -188,6 +188,14 @@ pub fn get_bank_from_ledger( account_paths, ); + info!( + "FROM EVAN: Paths before load_and_process_ledger:\n + ledger_path: {:?}\n + snapshot_archive_path: {:?}\n + incremental_snapshot_archive_path: {:?}", + ledger_path, full_snapshots_path, incremental_snapshots_path + ); + // Call ledger_utils::load_and_process_ledger here let (bank_forks, _starting_snapshot_hashes) = match crate::load_and_process_ledger::load_and_process_ledger( diff --git a/tip-router-operator-cli/src/load_and_process_ledger.rs b/tip-router-operator-cli/src/load_and_process_ledger.rs index 9c0ec9f4..c9eea43d 100644 --- a/tip-router-operator-cli/src/load_and_process_ledger.rs +++ b/tip-router-operator-cli/src/load_and_process_ledger.rs @@ -136,6 +136,12 @@ pub fn load_and_process_ledger( .join("snapshot") }; + info!( + "FROM EVAN: blockstore.is_primary_access(): {:?}", + blockstore.is_primary_access() + ); + info!("FROM EVAN: bank_snapshots_dir: {:?}", bank_snapshots_dir); + let mut starting_slot = 0; // default start check with genesis let snapshot_config = if arg_matches.is_present("no_snapshot") { None @@ -230,12 +236,30 @@ pub fn load_and_process_ledger( vec![non_primary_accounts_path] }; + info!( + "FROM EVAN: arg_matches account paths: {:?}", + arg_matches.value_of("account_paths") + ); + info!("FROM EVAN: account_paths: {:?}", account_paths); + let (account_run_paths, account_snapshot_paths) = create_all_accounts_run_and_snapshot_dirs(&account_paths) .map_err(LoadAndProcessLedgerError::CreateAllAccountsRunAndSnapshotDirectories)?; + + info!( + "FROM EVAN: account_run_paths: {:?}", + account_run_paths.clone() + ); + // From now on, use run/ paths in the same way as the previous account_paths. let account_paths = account_run_paths; + info!( + "FROM EVAN: account_snapshot_paths: {:?}", + account_snapshot_paths + ); + info!("FROM EVAN: account_paths is now: {:?}", account_paths); + let (_, measure_clean_account_paths) = measure!( account_paths.iter().for_each(|path| { if path.exists() { diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 5842ae60..e0dc4b46 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -69,6 +69,8 @@ async fn main() -> Result<()> { std::fs::create_dir_all(&backup_snapshots_dir)?; } + + // Check for new meta merkle trees and submit to NCN periodically tokio::spawn(async move { loop { From b51ee678004b1d233b4be1b2753e7140fe9be891 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 29 Jan 2025 01:05:52 -0500 Subject: [PATCH 049/112] last fixes --- tip-router-operator-cli/src/cli.rs | 3 - tip-router-operator-cli/src/lib.rs | 75 ++++++++++++++++++- .../src/load_and_process_ledger.rs | 50 ++++++------- tip-router-operator-cli/src/main.rs | 8 +- tip-router-operator-cli/src/process_epoch.rs | 18 +++-- 5 files changed, 113 insertions(+), 41 deletions(-) diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index 99fce61b..fef2eb97 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -18,9 +18,6 @@ pub struct Cli { #[arg(short, long, env)] pub ledger_path: PathBuf, - #[arg(short, long, env)] - pub account_paths: Option>, - #[arg(short, long, env)] pub full_snapshots_path: Option, diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index 1df10ccf..ce3543e6 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -93,6 +93,17 @@ pub fn get_meta_merkle_root( ) -> std::result::Result { let start = Instant::now(); + // cleanup tmp files - update with path where stake meta is written + match cleanup_tmp_files(&incremental_snapshots_path.clone()) { + Ok(_) => {} + Err(e) => { + return Err(MerkleRootError::StakeMetaGeneratorError(format!( + "Failed to cleanup tmp files: {:?}", + e + ))); + } + } + datapoint_info!( "tip_router_cli.get_meta_merkle_root", ("operator_address", operator_address.to_string(), String), @@ -108,7 +119,7 @@ pub fn get_meta_merkle_root( ledger_path, account_paths, full_snapshots_path, - incremental_snapshots_path, + incremental_snapshots_path.clone(), desired_slot, tip_distribution_program_id, out_path, @@ -136,6 +147,17 @@ pub fn get_meta_merkle_root( ("duration_ms", start.elapsed().as_millis() as i64, i64) ); + // Cleanup tmp files + match cleanup_tmp_files(&incremental_snapshots_path) { + Ok(_) => {} + Err(e) => { + return Err(MerkleRootError::StakeMetaGeneratorError(format!( + "Failed to cleanup tmp files: {:?}", + e + ))); + } + } + // Generate merkle tree collection let merkle_tree_coll = GeneratedMerkleTreeCollection::new_from_stake_meta_collection( stake_meta_collection, @@ -296,3 +318,54 @@ pub fn emit_solana_validator_args() -> std::result::Result<(), anyhow::Error> { Ok(()) } + +pub fn cleanup_tmp_files(snapshot_output_dir: &Path) -> Result<()> { + // Remove stake-meta.accounts directory + let stake_meta_path = snapshot_output_dir.join("stake-meta.accounts"); + if stake_meta_path.exists() { + if stake_meta_path.is_dir() { + std::fs::remove_dir_all(&stake_meta_path)?; + } else { + std::fs::remove_file(&stake_meta_path)?; + } + } + + // Remove tmp* files/directories in snapshot dir + for entry in std::fs::read_dir(snapshot_output_dir)? { + let entry = entry?; + let path = entry.path(); + if let Some(file_name) = path.file_name() { + if let Some(file_name_str) = file_name.to_str() { + if file_name_str.starts_with("tmp") { + if path.is_dir() { + std::fs::remove_dir_all(path)?; + } else { + std::fs::remove_file(path)?; + } + } + } + } + } + + // Remove /tmp/.tmp* files/directories + let tmp_dir = PathBuf::from("/tmp"); + if tmp_dir.exists() { + for entry in std::fs::read_dir(&tmp_dir)? { + let entry = entry?; + let path = entry.path(); + if let Some(file_name) = path.file_name() { + if let Some(file_name_str) = file_name.to_str() { + if file_name_str.starts_with(".tmp") { + if path.is_dir() { + std::fs::remove_dir_all(path)?; + } else { + std::fs::remove_file(path)?; + } + } + } + } + } + } + + Ok(()) +} diff --git a/tip-router-operator-cli/src/load_and_process_ledger.rs b/tip-router-operator-cli/src/load_and_process_ledger.rs index c9eea43d..690a44c1 100644 --- a/tip-router-operator-cli/src/load_and_process_ledger.rs +++ b/tip-router-operator-cli/src/load_and_process_ledger.rs @@ -172,31 +172,31 @@ pub fn load_and_process_ledger( }) }; - match process_options.halt_at_slot { - // Skip the following checks for sentinel values of Some(0) and None. - // For Some(0), no slots will be be replayed after starting_slot. - // For None, all available children of starting_slot will be replayed. - None | Some(0) => {} - Some(halt_slot) => { - if halt_slot < starting_slot { - return Err(LoadAndProcessLedgerError::EndingSlotLessThanStartingSlot( - starting_slot, - halt_slot, - PROCESS_SLOTS_HELP_STRING.to_string(), - )); - } - // Check if we have the slot data necessary to replay from starting_slot to >= halt_slot. - if !blockstore.slot_range_connected(starting_slot, halt_slot) { - return Err( - LoadAndProcessLedgerError::EndingSlotNotReachableFromStartingSlot( - starting_slot, - halt_slot, - PROCESS_SLOTS_HELP_STRING.to_string(), - ), - ); - } - } - } + // match process_options.halt_at_slot { + // // Skip the following checks for sentinel values of Some(0) and None. + // // For Some(0), no slots will be be replayed after starting_slot. + // // For None, all available children of starting_slot will be replayed. + // None | Some(0) => {} + // Some(halt_slot) => { + // if halt_slot < starting_slot { + // return Err(LoadAndProcessLedgerError::EndingSlotLessThanStartingSlot( + // starting_slot, + // halt_slot, + // PROCESS_SLOTS_HELP_STRING.to_string(), + // )); + // } + // // Check if we have the slot data necessary to replay from starting_slot to >= halt_slot. + // if !blockstore.slot_range_connected(starting_slot, halt_slot) { + // return Err( + // LoadAndProcessLedgerError::EndingSlotNotReachableFromStartingSlot( + // starting_slot, + // halt_slot, + // PROCESS_SLOTS_HELP_STRING.to_string(), + // ), + // ); + // } + // } + // } let account_paths = if let Some(account_paths) = arg_matches.value_of("account_paths") { // If this blockstore access is Primary, no other process (agave-validator) can hold diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index e0dc4b46..562c5fef 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -60,6 +60,7 @@ async fn main() -> Result<()> { let backup_snapshots_dir = cli.backup_snapshots_dir.clone(); let rpc_url = cli.rpc_url.clone(); let cli_clone = cli.clone(); + let mut current_epoch = rpc_client.get_epoch_info()?.epoch; if !backup_snapshots_dir.exists() { info!( @@ -109,7 +110,7 @@ async fn main() -> Result<()> { }); if start_next_epoch { - wait_for_next_epoch(&rpc_client).await?; + current_epoch = wait_for_next_epoch(&rpc_client, current_epoch).await; } // Track runs that are starting right at the beginning of a new epoch @@ -149,10 +150,7 @@ async fn main() -> Result<()> { } // Wait for epoch change - if let Err(e) = wait_for_next_epoch(&rpc_client).await { - error!("Error waiting for next epoch: {}", e); - sleep(Duration::from_secs(60)).await; - } + current_epoch = wait_for_next_epoch(&rpc_client, current_epoch).await; new_epoch_rollover = true; } diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index dd3e1d5d..f6d30c2d 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -6,7 +6,7 @@ use std::{ use anyhow::Result; use ellipsis_client::EllipsisClient; -use log::info; +use log::{error, info}; use solana_metrics::{datapoint_error, datapoint_info}; use solana_rpc_client::rpc_client::RpcClient; use solana_sdk::pubkey::Pubkey; @@ -19,16 +19,20 @@ use crate::{ const MAX_WAIT_FOR_INCREMENTAL_SNAPSHOT_TICKS: u64 = 1200; // Experimentally determined const OPTIMAL_INCREMENTAL_SNAPSHOT_SLOT_RANGE: u64 = 800; // Experimentally determined -pub async fn wait_for_next_epoch(rpc_client: &RpcClient) -> Result<()> { - let current_epoch = rpc_client.get_epoch_info()?.epoch; - +pub async fn wait_for_next_epoch(rpc_client: &RpcClient, current_epoch: u64) -> u64 { loop { tokio::time::sleep(Duration::from_secs(10)).await; // Check every 10 seconds - let new_epoch = rpc_client.get_epoch_info()?.epoch; + let new_epoch = match rpc_client.get_epoch_info() { + Ok(info) => info.epoch, + Err(e) => { + error!("Error getting epoch info: {:?}", e); + continue; + } + }; if new_epoch > current_epoch { info!("New epoch detected: {} -> {}", current_epoch, new_epoch); - return Ok(()); + return new_epoch; } } } @@ -99,7 +103,7 @@ pub async fn process_epoch( let start = Instant::now(); let ledger_path = cli_args.ledger_path.clone(); - let account_paths = cli_args.account_paths.clone(); + let account_paths = None; let full_snapshots_path = cli_args.full_snapshots_path.clone(); let incremental_snapshots_path = cli_args.backup_snapshots_dir.clone(); let operator_address = Pubkey::from_str(&cli_args.operator_address).unwrap(); From 14bc1e3b81a6bc31d70c5a64791fed0dee472093 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 29 Jan 2025 01:19:46 -0500 Subject: [PATCH 050/112] rm logs --- tip-router-operator-cli/src/ledger_utils.rs | 8 ------- .../src/load_and_process_ledger.rs | 23 ------------------- 2 files changed, 31 deletions(-) diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index b28c040e..c8405451 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -188,14 +188,6 @@ pub fn get_bank_from_ledger( account_paths, ); - info!( - "FROM EVAN: Paths before load_and_process_ledger:\n - ledger_path: {:?}\n - snapshot_archive_path: {:?}\n - incremental_snapshot_archive_path: {:?}", - ledger_path, full_snapshots_path, incremental_snapshots_path - ); - // Call ledger_utils::load_and_process_ledger here let (bank_forks, _starting_snapshot_hashes) = match crate::load_and_process_ledger::load_and_process_ledger( diff --git a/tip-router-operator-cli/src/load_and_process_ledger.rs b/tip-router-operator-cli/src/load_and_process_ledger.rs index 690a44c1..7cbe9f82 100644 --- a/tip-router-operator-cli/src/load_and_process_ledger.rs +++ b/tip-router-operator-cli/src/load_and_process_ledger.rs @@ -136,12 +136,6 @@ pub fn load_and_process_ledger( .join("snapshot") }; - info!( - "FROM EVAN: blockstore.is_primary_access(): {:?}", - blockstore.is_primary_access() - ); - info!("FROM EVAN: bank_snapshots_dir: {:?}", bank_snapshots_dir); - let mut starting_slot = 0; // default start check with genesis let snapshot_config = if arg_matches.is_present("no_snapshot") { None @@ -236,30 +230,13 @@ pub fn load_and_process_ledger( vec![non_primary_accounts_path] }; - info!( - "FROM EVAN: arg_matches account paths: {:?}", - arg_matches.value_of("account_paths") - ); - info!("FROM EVAN: account_paths: {:?}", account_paths); - let (account_run_paths, account_snapshot_paths) = create_all_accounts_run_and_snapshot_dirs(&account_paths) .map_err(LoadAndProcessLedgerError::CreateAllAccountsRunAndSnapshotDirectories)?; - info!( - "FROM EVAN: account_run_paths: {:?}", - account_run_paths.clone() - ); - // From now on, use run/ paths in the same way as the previous account_paths. let account_paths = account_run_paths; - info!( - "FROM EVAN: account_snapshot_paths: {:?}", - account_snapshot_paths - ); - info!("FROM EVAN: account_paths is now: {:?}", account_paths); - let (_, measure_clean_account_paths) = measure!( account_paths.iter().for_each(|path| { if path.exists() { From 2513f3257bbe22af54ba5169e6e1d102812efa72 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 29 Jan 2025 15:12:06 -0500 Subject: [PATCH 051/112] last cleanup --- tip-router-operator-cli/src/ledger_utils.rs | 29 ++++++---- tip-router-operator-cli/src/lib.rs | 7 ++- .../src/load_and_process_ledger.rs | 53 +++++++++++-------- tip-router-operator-cli/src/main.rs | 2 - 4 files changed, 57 insertions(+), 34 deletions(-) diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index c8405451..87e271ac 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -200,7 +200,15 @@ pub fn get_bank_from_ledger( ) { Ok(res) => res, Err(e) => { - // TODO datapoint_error! + datapoint_error!( + "tip_router_cli.get_bank", + ("operator", operator_address.to_string(), String), + ("state", "load_bank_forks", String), + ("status", "error", String), + ("step", 4, i64), + ("error", format!("{:?}", e), String), + ("duration_ms", start_time.elapsed().as_millis() as i64, i64), + ); panic!("Failed to load bank forks: {}", e); } }; @@ -236,13 +244,13 @@ pub fn get_bank_from_ledger( // STEP 4: Process blockstore from root // - datapoint_info!( - "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), - ("state", "process_blockstore_from_root_start", String), - ("step", 4, i64), - ("duration_ms", start_time.elapsed().as_millis() as i64, i64), - ); + // datapoint_info!( + // "tip_router_cli.get_bank", + // ("operator", operator_address.to_string(), String), + // ("state", "process_blockstore_from_root_start", String), + // ("step", 4, i64), + // ("duration_ms", start_time.elapsed().as_millis() as i64, i64), + // ); // match blockstore_processor::process_blockstore_from_root( // &blockstore, @@ -271,16 +279,17 @@ pub fn get_bank_from_ledger( // STEP 5: Save snapshot // + let working_bank = bank_forks.read().unwrap().working_bank(); + datapoint_info!( "tip_router_cli.get_bank", ("operator", operator_address.to_string(), String), ("state", "bank_to_full_snapshot_archive_start", String), + ("bank_hash", working_bank.hash().to_string(), String), ("step", 5, i64), ("duration_ms", start_time.elapsed().as_millis() as i64, i64), ); - let working_bank = bank_forks.read().unwrap().working_bank(); - exit.store(true, Ordering::Relaxed); if take_snapshot { diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index ce3543e6..7c74a7cd 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -319,7 +319,12 @@ pub fn emit_solana_validator_args() -> std::result::Result<(), anyhow::Error> { Ok(()) } -pub fn cleanup_tmp_files(snapshot_output_dir: &Path) -> Result<()> { +pub fn cleanup_tmp_files(snapshot_output_dir: &Path) -> std::result::Result<(), anyhow::Error> { + // Fail if snapshot_output_dir is "/" + if snapshot_output_dir == Path::new("/") { + return Err(anyhow::anyhow!("snapshot_output_dir cannot be /")); + } + // Remove stake-meta.accounts directory let stake_meta_path = snapshot_output_dir.join("stake-meta.accounts"); if stake_meta_path.exists() { diff --git a/tip-router-operator-cli/src/load_and_process_ledger.rs b/tip-router-operator-cli/src/load_and_process_ledger.rs index 7cbe9f82..931c202d 100644 --- a/tip-router-operator-cli/src/load_and_process_ledger.rs +++ b/tip-router-operator-cli/src/load_and_process_ledger.rs @@ -25,6 +25,7 @@ use { use_snapshot_archives_at_startup::UseSnapshotArchivesAtStartup, }, solana_measure::measure, + solana_metrics::datapoint_info, solana_rpc::transaction_status_service::TransactionStatusService, solana_runtime::{ accounts_background_service::{ @@ -97,27 +98,27 @@ pub(crate) enum LoadAndProcessLedgerError { ProcessBlockstoreFromRoot(#[source] BlockstoreProcessorError), } -pub fn load_and_process_ledger_or_exit( - arg_matches: &ArgMatches, - genesis_config: &GenesisConfig, - blockstore: Arc, - process_options: ProcessOptions, - snapshot_archive_path: Option, - incremental_snapshot_archive_path: Option, -) -> (Arc>, Option) { - load_and_process_ledger( - arg_matches, - genesis_config, - blockstore, - process_options, - snapshot_archive_path, - incremental_snapshot_archive_path, - ) - .unwrap_or_else(|err| { - eprintln!("Exiting. Failed to load and process ledger: {err}"); - exit(1); - }) -} +// pub fn load_and_process_ledger_or_exit( +// arg_matches: &ArgMatches, +// genesis_config: &GenesisConfig, +// blockstore: Arc, +// process_options: ProcessOptions, +// snapshot_archive_path: Option, +// incremental_snapshot_archive_path: Option, +// ) -> (Arc>, Option) { +// load_and_process_ledger( +// arg_matches, +// genesis_config, +// blockstore, +// process_options, +// snapshot_archive_path, +// incremental_snapshot_archive_path, +// ) +// .unwrap_or_else(|err| { +// eprintln!("Exiting. Failed to load and process ledger: {err}"); +// exit(1); +// }) +// } pub fn load_and_process_ledger( arg_matches: &ArgMatches, @@ -126,6 +127,7 @@ pub fn load_and_process_ledger( process_options: ProcessOptions, snapshot_archive_path: Option, incremental_snapshot_archive_path: Option, + operator_address: Pubkey, ) -> Result<(Arc>, Option), LoadAndProcessLedgerError> { let bank_snapshots_dir = if blockstore.is_primary_access() { blockstore.ledger_path().join("snapshot") @@ -399,6 +401,15 @@ pub fn load_and_process_ledger( (None, None) }; + // STEP 4: Process blockstore from root // + + datapoint_info!( + "tip_router_cli.get_bank", + ("operator", operator_address.to_string(), String), + ("state", "process_blockstore_from_root_start", String), + ("step", 4, i64), + ); + let result = blockstore_processor::process_blockstore_from_root( blockstore.as_ref(), &bank_forks, diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 562c5fef..d7677c0c 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -70,8 +70,6 @@ async fn main() -> Result<()> { std::fs::create_dir_all(&backup_snapshots_dir)?; } - - // Check for new meta merkle trees and submit to NCN periodically tokio::spawn(async move { loop { From b66f838e8feae126087a0c534cba3212656d8272 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 29 Jan 2025 15:13:07 -0500 Subject: [PATCH 052/112] Build --- tip-router-operator-cli/src/ledger_utils.rs | 1 + tip-router-operator-cli/src/load_and_process_ledger.rs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index 87e271ac..25a6df88 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -197,6 +197,7 @@ pub fn get_bank_from_ledger( process_options, Some(full_snapshots_path.clone()), Some(incremental_snapshots_path.clone()), + operator_address, ) { Ok(res) => res, Err(e) => { diff --git a/tip-router-operator-cli/src/load_and_process_ledger.rs b/tip-router-operator-cli/src/load_and_process_ledger.rs index 931c202d..bc91c02f 100644 --- a/tip-router-operator-cli/src/load_and_process_ledger.rs +++ b/tip-router-operator-cli/src/load_and_process_ledger.rs @@ -127,7 +127,7 @@ pub fn load_and_process_ledger( process_options: ProcessOptions, snapshot_archive_path: Option, incremental_snapshot_archive_path: Option, - operator_address: Pubkey, + operator_address: &Pubkey, ) -> Result<(Arc>, Option), LoadAndProcessLedgerError> { let bank_snapshots_dir = if blockstore.is_primary_access() { blockstore.ledger_path().join("snapshot") From 1df78ddedc176c2dd2aa2c557cc0571361321f27 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 29 Jan 2025 16:22:41 -0500 Subject: [PATCH 053/112] final --- .cargo/config.toml | 2 +- .cargo/programs.env | 2 +- tip-router-operator-cli/src/submit.rs | 1 + tip-router-operator-cli/src/tip_router.rs | 12 +++++------- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index 8b9910cc..a3048814 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,6 +1,6 @@ # placeholders for clippy and other tools # Program IDs may not be correct [env] -TIP_ROUTER_PROGRAM_ID = "Ap2AH3VcZGuuauEDq87uhgjNoUKcCAafc4DTyTByLMFf" +TIP_ROUTER_PROGRAM_ID = "RouterBmuRBkPUbgEDMtdvTZ75GBdSREZR5uGUxxxpb" RESTAKING_PROGRAM_ID = "RestkWeAVL8fRGgzhfeoqFhsqKRchg6aa1XrcH96z4Q" VAULT_PROGRAM_ID = "Vau1t6sLNxnzB7ZDsef8TLbPLfyZMYXH8WTNqUdm9g8" \ No newline at end of file diff --git a/.cargo/programs.env b/.cargo/programs.env index ce621573..5234e124 100644 --- a/.cargo/programs.env +++ b/.cargo/programs.env @@ -1,3 +1,3 @@ -TIP_ROUTER_PROGRAM_ID=Ap2AH3VcZGuuauEDq87uhgjNoUKcCAafc4DTyTByLMFf +TIP_ROUTER_PROGRAM_ID=RouterBmuRBkPUbgEDMtdvTZ75GBdSREZR5uGUxxxpb RESTAKING_PROGRAM_ID=RestkWeAVL8fRGgzhfeoqFhsqKRchg6aa1XrcH96z4Q VAULT_PROGRAM_ID=Vau1t6sLNxnzB7ZDsef8TLbPLfyZMYXH8WTNqUdm9g8 \ No newline at end of file diff --git a/tip-router-operator-cli/src/submit.rs b/tip-router-operator-cli/src/submit.rs index 88f979ec..c515d993 100644 --- a/tip-router-operator-cli/src/submit.rs +++ b/tip-router-operator-cli/src/submit.rs @@ -170,6 +170,7 @@ pub async fn submit_to_ncn( ncn_address, keypair, tip_distribution_program_id, + tip_router_program_id, epoch, tip_distribution_accounts, meta_merkle_tree, diff --git a/tip-router-operator-cli/src/tip_router.rs b/tip-router-operator-cli/src/tip_router.rs index 3d757b48..6c9cdfa0 100644 --- a/tip-router-operator-cli/src/tip_router.rs +++ b/tip-router-operator-cli/src/tip_router.rs @@ -79,20 +79,18 @@ pub async fn set_merkle_roots_batched( ncn_address: &Pubkey, keypair: &Keypair, tip_distribution_program: &Pubkey, + tip_router_program_id: &Pubkey, epoch: u64, tip_distribution_accounts: Vec<(Pubkey, TipDistributionAccount)>, meta_merkle_tree: MetaMerkleTree, ) -> Result>> { - let ballot_box = - BallotBox::find_program_address(&jito_tip_router_program::id(), ncn_address, epoch).0; + let ballot_box = BallotBox::find_program_address(tip_router_program_id, ncn_address, epoch).0; - let config = Config::find_program_address(&jito_tip_router_program::id(), ncn_address).0; + let config = Config::find_program_address(tip_router_program_id, ncn_address).0; - let epoch_state = - EpochState::find_program_address(&jito_tip_router_program::id(), ncn_address, epoch).0; + let epoch_state = EpochState::find_program_address(tip_router_program_id, ncn_address, epoch).0; - let tip_distribution_config = - derive_config_account_address(&jito_tip_distribution_sdk::jito_tip_distribution::ID).0; + let tip_distribution_config = derive_config_account_address(tip_distribution_program).0; // Given a list of target TipDistributionAccounts and a meta merkle tree, fetch each meta merkle root, create its instruction, and call set_merkle_root let instructions = tip_distribution_accounts From 70429bfc6cc3aaee56f161c9b21c6daca053fbfb Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 29 Jan 2025 16:28:13 -0500 Subject: [PATCH 054/112] final final --- tip-router-operator-cli/src/lib.rs | 38 +++++++++++-------- .../src/stake_meta_generator.rs | 2 +- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index 7c74a7cd..d9f8db18 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -93,17 +93,6 @@ pub fn get_meta_merkle_root( ) -> std::result::Result { let start = Instant::now(); - // cleanup tmp files - update with path where stake meta is written - match cleanup_tmp_files(&incremental_snapshots_path.clone()) { - Ok(_) => {} - Err(e) => { - return Err(MerkleRootError::StakeMetaGeneratorError(format!( - "Failed to cleanup tmp files: {:?}", - e - ))); - } - } - datapoint_info!( "tip_router_cli.get_meta_merkle_root", ("operator_address", operator_address.to_string(), String), @@ -113,6 +102,21 @@ pub fn get_meta_merkle_root( ("duration_ms", start.elapsed().as_millis() as i64, i64) ); + // cleanup tmp files - update with path where stake meta is written + match cleanup_tmp_files(&incremental_snapshots_path.clone()) { + Ok(_) => {} + Err(e) => { + datapoint_info!( + "tip_router_cli.get_meta_merkle_root", + ("operator_address", operator_address.to_string(), String), + ("state", "cleanup_tmp_files", String), + ("error", format!("{:?}", e), String), + ("epoch", epoch, i64), + ("duration_ms", start.elapsed().as_millis() as i64, i64) + ); + } + } + // Get stake meta collection let stake_meta_collection = stake_meta_generator::generate_stake_meta( operator_address, @@ -151,10 +155,14 @@ pub fn get_meta_merkle_root( match cleanup_tmp_files(&incremental_snapshots_path) { Ok(_) => {} Err(e) => { - return Err(MerkleRootError::StakeMetaGeneratorError(format!( - "Failed to cleanup tmp files: {:?}", - e - ))); + datapoint_info!( + "tip_router_cli.get_meta_merkle_root", + ("operator_address", operator_address.to_string(), String), + ("state", "cleanup_tmp_files", String), + ("error", format!("{:?}", e), String), + ("epoch", epoch, i64), + ("duration_ms", start.elapsed().as_millis() as i64, i64) + ); } } diff --git a/tip-router-operator-cli/src/stake_meta_generator.rs b/tip-router-operator-cli/src/stake_meta_generator.rs index dab42385..3f24b362 100644 --- a/tip-router-operator-cli/src/stake_meta_generator.rs +++ b/tip-router-operator-cli/src/stake_meta_generator.rs @@ -129,7 +129,7 @@ pub fn generate_stake_meta( let stake_meta_coll = generate_stake_meta_collection(&bank, tip_distribution_program_id, tip_payment_program_id)?; - // Explicity drop to clean up disk space (hopefully) + // Explicity drop to clean up disk space drop(bank); Ok(stake_meta_coll) From 118092a8b92ec230959820ccaf684f79ee75c78f Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 29 Jan 2025 17:55:14 -0500 Subject: [PATCH 055/112] Merge conflicts --- Cargo.lock | 1764 ++++++++++++----- Cargo.toml | 16 + tip-router-operator-cli/Cargo.toml | 10 + tip-router-operator-cli/src/ledger_utils.rs | 2 +- tip-router-operator-cli/src/lib.rs | 4 + .../src/load_and_process_ledger.rs | 2 +- tip-router-operator-cli/src/main.rs | 2 - 7 files changed, 1332 insertions(+), 468 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2667e172..3306828f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -42,7 +42,7 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cipher", "cpufeatures", "opaque-debug", @@ -80,7 +80,7 @@ version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "getrandom 0.2.15", "once_cell", "version_check", @@ -124,8 +124,8 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "anchor-syn 0.24.2", "anyhow", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "regex", "syn 1.0.109", ] @@ -137,8 +137,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47fe28365b33e8334dd70ae2f34a43892363012fe239cf37d2ee91693575b1f8" dependencies = [ "anchor-syn 0.30.1", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -150,8 +150,8 @@ dependencies = [ "anchor-syn 0.24.2", "anyhow", "bs58 0.4.0", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "rustversion", "syn 1.0.109", ] @@ -164,8 +164,8 @@ checksum = "3c288d496168268d198d9b53ee9f4f9d260a55ba4df9877ea1d4486ad6109e0f" dependencies = [ "anchor-syn 0.30.1", "bs58 0.5.1", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -175,7 +175,7 @@ version = "0.24.2" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" dependencies = [ "anchor-syn 0.24.2", - "proc-macro2", + "proc-macro2 1.0.92", "syn 1.0.109", ] @@ -186,7 +186,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49b77b6948d0eeaaa129ce79eea5bbbb9937375a9241d909ca8fb9e006bb6e90" dependencies = [ "anchor-syn 0.30.1", - "quote", + "quote 1.0.38", "syn 1.0.109", ] @@ -196,8 +196,8 @@ version = "0.24.2" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" dependencies = [ "anchor-syn 0.24.2", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -208,7 +208,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d20bb569c5a557c86101b944721d865e1fd0a4c67c381d31a44a84f07f84828" dependencies = [ "anchor-syn 0.30.1", - "quote", + "quote 1.0.38", "syn 1.0.109", ] @@ -219,8 +219,8 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "anchor-syn 0.24.2", "anyhow", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -231,8 +231,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cebd8d0671a3a9dc3160c48598d652c34c77de6be4d44345b8b514323284d57" dependencies = [ "anchor-syn 0.30.1", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -244,8 +244,8 @@ dependencies = [ "anchor-syn 0.24.2", "anyhow", "heck 0.3.3", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -256,8 +256,8 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "anchor-syn 0.24.2", "anyhow", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -272,8 +272,8 @@ dependencies = [ "anyhow", "bs58 0.5.1", "heck 0.3.3", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "serde_json", "syn 1.0.109", ] @@ -285,8 +285,8 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "anchor-syn 0.24.2", "anyhow", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -297,8 +297,8 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "anchor-syn 0.24.2", "anyhow", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -309,7 +309,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04368b5abef4266250ca8d1d12f4dff860242681e4ec22b885dcfe354fd35aa1" dependencies = [ "anchor-syn 0.30.1", - "quote", + "quote 1.0.38", "syn 1.0.109", ] @@ -321,8 +321,8 @@ checksum = "e0bb0e0911ad4a70cab880cdd6287fe1e880a1a9d8e4e6defa8e9044b9796a6c" dependencies = [ "anchor-syn 0.30.1", "borsh-derive-internal 0.10.4", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -332,8 +332,8 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ef415ff156dc82e9ecb943189b0cb241b3a6bfc26a180234dc21bd3ef3ce0cb" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -357,7 +357,7 @@ dependencies = [ "borsh 0.10.4", "bytemuck", "solana-program", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -383,7 +383,7 @@ dependencies = [ "bytemuck", "getrandom 0.2.15", "solana-program", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -419,14 +419,14 @@ dependencies = [ "anyhow", "bs58 0.3.1", "heck 0.3.3", - "proc-macro2", + "proc-macro2 1.0.92", "proc-macro2-diagnostics", - "quote", + "quote 1.0.38", "serde", "serde_json", "sha2 0.9.9", "syn 1.0.109", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -439,13 +439,13 @@ dependencies = [ "bs58 0.5.1", "cargo_toml 0.19.2", "heck 0.3.3", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "serde", "serde_json", "sha2 0.10.8", "syn 1.0.109", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -536,8 +536,8 @@ dependencies = [ "include_dir", "itertools 0.10.5", "proc-macro-error", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -601,7 +601,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" dependencies = [ - "quote", + "quote 1.0.38", "syn 1.0.109", ] @@ -613,8 +613,8 @@ checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ "num-bigint 0.4.6", "num-traits", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -649,8 +649,8 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -694,7 +694,7 @@ dependencies = [ "nom", "num-traits", "rusticata-macros", - "thiserror", + "thiserror 1.0.69", "time", ] @@ -704,8 +704,8 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", "synstructure 0.12.6", ] @@ -716,8 +716,8 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -778,8 +778,8 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -789,8 +789,8 @@ version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -838,7 +838,7 @@ dependencies = [ "matchit", "memchr", "mime", - "percent-encoding", + "percent-encoding 2.3.1", "pin-project-lite", "rustversion", "serde", @@ -886,7 +886,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cfg-if", + "cfg-if 1.0.0", "libc", "miniz_oxide", "object", @@ -946,8 +946,8 @@ dependencies = [ "lazycell", "peeking_take_while", "prettyplease 0.2.25", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "regex", "rustc-hash", "shlex", @@ -999,7 +999,7 @@ dependencies = [ "arrayref", "arrayvec", "cc", - "cfg-if", + "cfg-if 1.0.0", "constant_time_eq", "digest 0.10.7", ] @@ -1046,7 +1046,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115e54d64eb62cdebad391c19efc9dce4981c690c85a33a12199d99bb9546fee" dependencies = [ "borsh-derive 0.10.4", - "hashbrown 0.12.3", + "hashbrown 0.13.2", ] [[package]] @@ -1068,7 +1068,7 @@ dependencies = [ "borsh-derive-internal 0.9.3", "borsh-schema-derive-internal 0.9.3", "proc-macro-crate 0.1.5", - "proc-macro2", + "proc-macro2 1.0.92", "syn 1.0.109", ] @@ -1081,7 +1081,7 @@ dependencies = [ "borsh-derive-internal 0.10.4", "borsh-schema-derive-internal 0.10.4", "proc-macro-crate 0.1.5", - "proc-macro2", + "proc-macro2 1.0.92", "syn 1.0.109", ] @@ -1093,8 +1093,8 @@ checksum = "c2593a3b8b938bd68373196c9832f516be11fa487ef4ae745eb282e6a56a7244" dependencies = [ "once_cell", "proc-macro-crate 3.2.0", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -1104,8 +1104,8 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -1115,8 +1115,8 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65d6ba50644c98714aa2a70d13d7df3cd75cd2b523a2b452bf010443800976b3" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -1126,8 +1126,8 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -1137,8 +1137,8 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "276691d96f063427be83e6692b86148e488ebba9f48f77788724ca027ba3b6d4" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -1184,6 +1184,16 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "bstr" +version = "1.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -1217,8 +1227,8 @@ version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -1237,8 +1247,8 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -1282,7 +1292,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "190baaad529bcfbde9e1a19022c42781bdb6ff9de25721abdb8fd98c0807730b" dependencies = [ "libc", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1325,6 +1335,12 @@ dependencies = [ "nom", ] +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + [[package]] name = "cfg-if" version = "1.0.0" @@ -1378,7 +1394,7 @@ checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", - "libloading", + "libloading 0.8.6", ] [[package]] @@ -1450,8 +1466,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck 0.5.0", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -1517,7 +1533,7 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "wasm-bindgen", ] @@ -1552,6 +1568,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + [[package]] name = "core-foundation" version = "0.9.4" @@ -1595,7 +1617,7 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -1699,8 +1721,8 @@ checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "strsim 0.11.1", "syn 2.0.93", ] @@ -1712,7 +1734,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", - "quote", + "quote 1.0.38", "syn 2.0.93", ] @@ -1722,7 +1744,7 @@ version = "5.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "hashbrown 0.14.5", "lock_api", "once_cell", @@ -1736,6 +1758,17 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" +[[package]] +name = "default-env" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f753eb82d29277e79efc625e84aecacfd4851ee50e05a8573a4740239a77bfd3" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "syn 0.15.44", +] + [[package]] name = "der" version = "0.5.1" @@ -1781,11 +1814,24 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] +[[package]] +name = "derive_more" +version = "0.99.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +dependencies = [ + "convert_case", + "proc-macro2 1.0.92", + "quote 1.0.38", + "rustc_version", + "syn 2.0.93", +] + [[package]] name = "dialoguer" version = "0.10.4" @@ -1842,6 +1888,16 @@ dependencies = [ "dirs-sys", ] +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if 1.0.0", + "dirs-sys-next", +] + [[package]] name = "dirs-sys" version = "0.3.7" @@ -1853,14 +1909,25 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi 0.3.9", +] + [[package]] name = "displaydoc" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -1882,8 +1949,8 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -1947,8 +2014,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" dependencies = [ "enum-ordinalize", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -1975,7 +2042,7 @@ dependencies = [ "solana-program-test 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", "solana-transaction-status", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -1991,7 +2058,7 @@ version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -2009,8 +2076,8 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -2022,8 +2089,8 @@ checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" dependencies = [ "num-bigint 0.4.6", "num-traits", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -2085,7 +2152,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", +] + +[[package]] +name = "etcd-client" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4b0ea5ef6dc2388a4b1669fa32097249bc03a15417b97cb75e38afb309e4a89" +dependencies = [ + "http", + "prost", + "tokio", + "tokio-stream", + "tonic", + "tonic-build", + "tower", + "tower-service", ] [[package]] @@ -2121,7 +2204,7 @@ version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "libredox", "windows-sys 0.59.0", @@ -2179,7 +2262,7 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ - "percent-encoding", + "percent-encoding 2.3.1", ] [[package]] @@ -2200,6 +2283,12 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" +[[package]] +name = "futures" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" + [[package]] name = "futures" version = "0.3.31" @@ -2240,6 +2329,7 @@ dependencies = [ "futures-core", "futures-task", "futures-util", + "num_cpus", ] [[package]] @@ -2254,8 +2344,8 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -2277,6 +2367,7 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures 0.1.31", "futures-channel", "futures-core", "futures-io", @@ -2316,7 +2407,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", "libc", "wasi 0.9.0+wasi-snapshot-preview1", @@ -2329,7 +2420,7 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", @@ -2348,6 +2439,19 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +[[package]] +name = "globset" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + [[package]] name = "goauth" version = "0.13.1" @@ -2355,7 +2459,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8af59a261bcf42f45d1b261232847b9b850ba0a1419d6100698246fb66e9240" dependencies = [ "arc-swap", - "futures", + "futures 0.3.31", "log", "reqwest", "serde", @@ -2636,7 +2740,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca815a891b24fdfb243fa3239c86154392b0953ee584aa1a2a1f66d20cbe75cc" dependencies = [ "bytes", - "futures", + "futures 0.3.31", "headers", "http", "hyper", @@ -2822,8 +2926,8 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -2833,6 +2937,17 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "idna" version = "1.0.3" @@ -2891,8 +3006,8 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", ] [[package]] @@ -2943,7 +3058,7 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -2998,8 +3113,8 @@ name = "jito-account-traits-derive" version = "0.0.3" source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -3027,7 +3142,32 @@ dependencies = [ "spl-associated-token-account", "spl-token 4.0.0", "spl-token-2022 3.0.5", - "thiserror", + "thiserror 1.0.69", +] + +[[package]] +name = "jito-programs-vote-state" +version = "0.1.5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "anchor-lang 0.24.2", + "bincode", + "serde", + "serde_derive", + "solana-program", +] + +[[package]] +name = "jito-protos" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "bytes", + "prost", + "prost-types", + "protobuf-src", + "tonic", + "tonic-build", ] [[package]] @@ -3044,7 +3184,7 @@ dependencies = [ "serde_with 3.12.0", "solana-program", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3061,7 +3201,7 @@ dependencies = [ "solana-program", "spl-associated-token-account", "spl-token 4.0.0", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3070,7 +3210,7 @@ version = "0.0.3" source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ "borsh 0.10.4", - "cfg-if", + "cfg-if 1.0.0", "const_str_to_pubkey", "jito-bytemuck", "jito-jsm-core", @@ -3083,7 +3223,7 @@ dependencies = [ "spl-associated-token-account", "spl-token 4.0.0", "spl-token-2022 3.0.5", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3094,7 +3234,19 @@ dependencies = [ "borsh 0.10.4", "shank", "solana-program", - "thiserror", + "thiserror 1.0.69", +] + +[[package]] +name = "jito-tip-distribution" +version = "0.1.5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "anchor-lang 0.24.2", + "default-env", + "jito-programs-vote-state", + "solana-program", + "solana-security-txt", ] [[package]] @@ -3104,6 +3256,16 @@ dependencies = [ "anchor-lang 0.30.1", ] +[[package]] +name = "jito-tip-payment" +version = "0.1.5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "anchor-lang 0.24.2", + "default-env", + "solana-security-txt", +] + [[package]] name = "jito-tip-payment-sdk" version = "0.0.1" @@ -3124,7 +3286,7 @@ dependencies = [ "clap-markdown", "dotenv", "env_logger 0.10.2", - "futures", + "futures 0.3.31", "jito-bytemuck", "jito-jsm-core", "jito-restaking-client", @@ -3150,7 +3312,7 @@ dependencies = [ "spl-associated-token-account", "spl-stake-pool", "spl-token 4.0.0", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -3168,7 +3330,7 @@ dependencies = [ "serde_with 3.12.0", "solana-program", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3192,7 +3354,7 @@ dependencies = [ "spl-associated-token-account", "spl-math", "spl-token 4.0.0", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3224,7 +3386,7 @@ dependencies = [ "spl-associated-token-account", "spl-stake-pool", "spl-token 4.0.0", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -3235,7 +3397,7 @@ dependencies = [ "assert_matches", "borsh 0.10.4", "bytemuck", - "cfg-if", + "cfg-if 1.0.0", "const_str_to_pubkey", "jito-bytemuck", "jito-jsm-core", @@ -3254,7 +3416,7 @@ dependencies = [ "spl-stake-pool", "spl-token 4.0.0", "switchboard-on-demand", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3284,7 +3446,7 @@ dependencies = [ "serde_with 3.12.0", "solana-program", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3302,7 +3464,7 @@ dependencies = [ "spl-associated-token-account", "spl-token 4.0.0", "spl-token-2022 3.0.5", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3311,7 +3473,7 @@ version = "0.0.3" source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ "borsh 0.10.4", - "cfg-if", + "cfg-if 1.0.0", "const_str_to_pubkey", "jito-bytemuck", "jito-jsm-core", @@ -3324,7 +3486,7 @@ dependencies = [ "spl-associated-token-account", "spl-token 4.0.0", "spl-token-2022 3.0.5", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3336,7 +3498,7 @@ dependencies = [ "shank", "solana-program", "spl-token 4.0.0", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3358,13 +3520,43 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + +[[package]] +name = "jsonrpc-client-transports" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b99d4207e2a04fb4581746903c2bb7eb376f88de9c699d0f3e10feeac0cd3a" +dependencies = [ + "derive_more", + "futures 0.3.31", + "jsonrpc-core", + "jsonrpc-pubsub", + "jsonrpc-server-utils", + "log", + "parity-tokio-ipc", + "serde", + "serde_json", + "tokio", + "url 1.7.2", +] + [[package]] name = "jsonrpc-core" version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" dependencies = [ - "futures", + "futures 0.3.31", "futures-executor", "futures-util", "log", @@ -3373,6 +3565,92 @@ dependencies = [ "serde_json", ] +[[package]] +name = "jsonrpc-core-client" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b51da17abecbdab3e3d4f26b01c5ec075e88d3abe3ab3b05dc9aa69392764ec0" +dependencies = [ + "futures 0.3.31", + "jsonrpc-client-transports", +] + +[[package]] +name = "jsonrpc-derive" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b939a78fa820cdfcb7ee7484466746a7377760970f6f9c6fe19f9edcc8a38d2" +dependencies = [ + "proc-macro-crate 0.1.5", + "proc-macro2 1.0.92", + "quote 1.0.38", + "syn 1.0.109", +] + +[[package]] +name = "jsonrpc-http-server" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1dea6e07251d9ce6a552abfb5d7ad6bc290a4596c8dcc3d795fae2bbdc1f3ff" +dependencies = [ + "futures 0.3.31", + "hyper", + "jsonrpc-core", + "jsonrpc-server-utils", + "log", + "net2", + "parking_lot 0.11.2", + "unicase", +] + +[[package]] +name = "jsonrpc-ipc-server" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382bb0206323ca7cda3dcd7e245cea86d37d02457a02a975e3378fb149a48845" +dependencies = [ + "futures 0.3.31", + "jsonrpc-core", + "jsonrpc-server-utils", + "log", + "parity-tokio-ipc", + "parking_lot 0.11.2", + "tower-service", +] + +[[package]] +name = "jsonrpc-pubsub" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240f87695e6c6f62fb37f05c02c04953cf68d6408b8c1c89de85c7a0125b1011" +dependencies = [ + "futures 0.3.31", + "jsonrpc-core", + "lazy_static", + "log", + "parking_lot 0.11.2", + "rand 0.7.3", + "serde", +] + +[[package]] +name = "jsonrpc-server-utils" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4fdea130485b572c39a460d50888beb00afb3e35de23ccd7fad8ff19f0e0d4" +dependencies = [ + "bytes", + "futures 0.3.31", + "globset", + "jsonrpc-core", + "lazy_static", + "log", + "tokio", + "tokio-stream", + "tokio-util 0.6.10", + "unicase", +] + [[package]] name = "keccak" version = "0.1.5" @@ -3410,14 +3688,24 @@ version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if 1.0.0", + "winapi 0.3.9", +] + [[package]] name = "libloading" version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ - "cfg-if", - "windows-targets 0.48.5", + "cfg-if 1.0.0", + "windows-targets 0.52.6", ] [[package]] @@ -3568,7 +3856,7 @@ dependencies = [ "ark-bn254", "ark-ff", "num-bigint 0.4.6", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3630,6 +3918,12 @@ dependencies = [ "libc", ] +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + [[package]] name = "matchit" version = "0.7.3" @@ -3708,7 +4002,7 @@ dependencies = [ "spl-associated-token-account", "spl-math", "spl-token 4.0.0", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3717,6 +4011,12 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "min-max-heap" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2687e6cf9c00f48e9284cf9fd15f2ef341d03cc7743abf9df4c5f07fdee50b18" + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -3749,7 +4049,7 @@ version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "downcast", "fragile", "lazy_static", @@ -3764,9 +4064,9 @@ version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" dependencies = [ - "cfg-if", - "proc-macro2", - "quote", + "cfg-if 1.0.0", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -3786,8 +4086,8 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -3814,6 +4114,17 @@ dependencies = [ "tempfile", ] +[[package]] +name = "net2" +version = "0.2.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "winapi 0.3.9", +] + [[package]] name = "nix" version = "0.26.4" @@ -3821,7 +4132,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ "bitflags 1.3.2", - "cfg-if", + "cfg-if 1.0.0", "libc", "memoffset 0.7.1", "pin-utils", @@ -3923,8 +4234,8 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -3934,8 +4245,8 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -4035,8 +4346,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -4047,8 +4358,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -4058,9 +4369,9 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", + "proc-macro-crate 3.2.0", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -4107,7 +4418,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ "bitflags 2.6.0", - "cfg-if", + "cfg-if 1.0.0", "foreign-types", "libc", "once_cell", @@ -4121,8 +4432,8 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -4167,10 +4478,10 @@ dependencies = [ "futures-util", "js-sys", "lazy_static", - "percent-encoding", + "percent-encoding 2.3.1", "pin-project", "rand 0.8.5", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4197,11 +4508,25 @@ checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7" dependencies = [ "Inflector", "proc-macro-error", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] +[[package]] +name = "parity-tokio-ipc" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9981e32fb75e004cc148f5fb70342f393830e0a4aa62e3cc93b50976218d42b6" +dependencies = [ + "futures 0.3.31", + "libc", + "log", + "rand 0.7.3", + "tokio", + "winapi 0.3.9", +] + [[package]] name = "parking_lot" version = "0.11.2" @@ -4229,7 +4554,7 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "instant", "libc", "redox_syscall 0.2.16", @@ -4243,7 +4568,7 @@ version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "redox_syscall 0.5.8", "smallvec", @@ -4289,6 +4614,12 @@ dependencies = [ "base64 0.13.1", ] +[[package]] +name = "percent-encoding" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" + [[package]] name = "percent-encoding" version = "2.3.1" @@ -4305,37 +4636,82 @@ dependencies = [ ] [[package]] -name = "petgraph" -version = "0.6.5" +name = "pest" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" dependencies = [ - "fixedbitset", - "indexmap 2.7.0", + "memchr", + "thiserror 2.0.11", + "ucd-trie", ] [[package]] -name = "pin-project" -version = "1.1.7" +name = "pest_derive" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" dependencies = [ - "pin-project-internal", + "pest", + "pest_generator", ] [[package]] -name = "pin-project-internal" -version = "1.1.7" +name = "pest_generator" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" dependencies = [ - "proc-macro2", - "quote", + "pest", + "pest_meta", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] [[package]] -name = "pin-project-lite" +name = "pest_meta" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" +dependencies = [ + "once_cell", + "pest", + "sha2 0.10.8", +] + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.7.0", +] + +[[package]] +name = "pin-project" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +dependencies = [ + "proc-macro2 1.0.92", + "quote 1.0.38", + "syn 2.0.93", +] + +[[package]] +name = "pin-project-lite" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" @@ -4375,7 +4751,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "opaque-debug", "universal-hash", @@ -4438,7 +4814,7 @@ version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" dependencies = [ - "proc-macro2", + "proc-macro2 1.0.92", "syn 1.0.109", ] @@ -4448,10 +4824,16 @@ version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ - "proc-macro2", + "proc-macro2 1.0.92", "syn 2.0.93", ] +[[package]] +name = "prio-graph" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6492a75ca57066a4479af45efa302bed448680182b0563f96300645d5f896097" + [[package]] name = "proc-macro-crate" version = "0.1.5" @@ -4487,8 +4869,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", "version_check", ] @@ -4499,11 +4881,20 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "version_check", ] +[[package]] +name = "proc-macro2" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +dependencies = [ + "unicode-xid 0.1.0", +] + [[package]] name = "proc-macro2" version = "1.0.92" @@ -4519,8 +4910,8 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", "version_check", "yansi", @@ -4566,8 +4957,8 @@ checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" dependencies = [ "anyhow", "itertools 0.10.5", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -4604,8 +4995,8 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -4615,7 +5006,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" dependencies = [ - "percent-encoding", + "percent-encoding 2.3.1", ] [[package]] @@ -4624,8 +5015,8 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -4641,7 +5032,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -4659,7 +5050,7 @@ dependencies = [ "rustls", "rustls-native-certs", "slab", - "thiserror", + "thiserror 1.0.69", "tinyvec", "tracing", ] @@ -4677,13 +5068,22 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "quote" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" +dependencies = [ + "proc-macro2 0.4.30", +] + [[package]] name = "quote" version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ - "proc-macro2", + "proc-macro2 1.0.92", ] [[package]] @@ -4830,7 +5230,7 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom 0.2.15", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4910,7 +5310,7 @@ dependencies = [ "mime", "native-tls", "once_cell", - "percent-encoding", + "percent-encoding 2.3.1", "pin-project-lite", "rustls", "rustls-pemfile", @@ -4924,7 +5324,7 @@ dependencies = [ "tokio-rustls", "tokio-util 0.7.13", "tower-service", - "url", + "url 2.5.4", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -4954,7 +5354,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", - "cfg-if", + "cfg-if 1.0.0", "getrandom 0.2.15", "libc", "spin 0.9.8", @@ -4986,8 +5386,8 @@ version = "0.7.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -5001,6 +5401,15 @@ dependencies = [ "librocksdb-sys", ] +[[package]] +name = "rolling-file" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8395b4f860856b740f20a296ea2cd4d823e81a2658cf05ef61be22916026a906" +dependencies = [ + "chrono", +] + [[package]] name = "rpassword" version = "7.3.1" @@ -5078,7 +5487,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5175,8 +5584,8 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -5267,8 +5676,8 @@ version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -5349,8 +5758,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" dependencies = [ "darling", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -5361,18 +5770,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ "darling", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap 2.7.0", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "sha-1" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha1" version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest 0.10.7", ] @@ -5384,7 +5819,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ "block-buffer 0.9.0", - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest 0.9.0", "opaque-debug", @@ -5396,7 +5831,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest 0.10.7", ] @@ -5453,8 +5888,8 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9bf2645f8eebde043da69200195058e7b59806705104f908a31d05ca82844ce" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "shank_macro_impl", "shank_render", "syn 1.0.109", @@ -5467,8 +5902,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93d0593f48acb0a722906416b1f6b8926f6571eb9af16d566a7c65427f269f50" dependencies = [ "anyhow", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "serde", "syn 1.0.109", ] @@ -5479,8 +5914,8 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "121175ba61809189f888dc5822ebfd30fa0d91e1e1f61d25a4d40b0847b3075e" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "shank_macro_impl", ] @@ -5607,6 +6042,21 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "soketto" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" +dependencies = [ + "base64 0.13.1", + "bytes", + "futures 0.3.31", + "httparse", + "log", + "rand 0.8.5", + "sha-1", +] + [[package]] name = "solana-account-decoder" version = "1.18.26" @@ -5628,7 +6078,7 @@ dependencies = [ "spl-token-2022 1.0.0", "spl-token-group-interface 0.1.0", "spl-token-metadata-interface 0.2.0", - "thiserror", + "thiserror 1.0.69", "zstd", ] @@ -5652,7 +6102,7 @@ dependencies = [ "spl-token-2022 1.0.0", "spl-token-group-interface 0.1.0", "spl-token-metadata-interface 0.2.0", - "thiserror", + "thiserror 1.0.69", "zstd", ] @@ -5700,7 +6150,7 @@ dependencies = [ "solana-config-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-frozen-abi 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-nohash-hasher", "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5714,7 +6164,7 @@ dependencies = [ "strum_macros", "tar", "tempfile", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5760,7 +6210,7 @@ dependencies = [ "solana-config-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-nohash-hasher", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", @@ -5774,7 +6224,7 @@ dependencies = [ "strum_macros", "tar", "tempfile", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5795,7 +6245,7 @@ dependencies = [ "solana-program", "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5815,7 +6265,7 @@ dependencies = [ "solana-program", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5825,12 +6275,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e58fa66e1e240097665e7f87b267aa8e976ea3fcbd86918c8fd218c875395ada" dependencies = [ "borsh 1.5.3", - "futures", + "futures 0.3.31", "solana-banks-interface 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-program", "solana-sdk", "tarpc", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-serde", ] @@ -5841,12 +6291,12 @@ version = "1.18.26" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" dependencies = [ "borsh 1.5.3", - "futures", + "futures 0.3.31", "solana-banks-interface 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-program", "solana-sdk", "tarpc", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-serde", ] @@ -5880,7 +6330,7 @@ checksum = "8cbe287a0f859362de9b155fabd44e479eba26d5d80e07a7d021297b7b06ecba" dependencies = [ "bincode", "crossbeam-channel", - "futures", + "futures 0.3.31", "solana-accounts-db 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-banks-interface 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5899,7 +6349,7 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "bincode", "crossbeam-channel", - "futures", + "futures 0.3.31", "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-banks-interface 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", @@ -5941,12 +6391,12 @@ dependencies = [ "libsecp256k1 0.6.0", "log", "scopeguard", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", "solana-zk-token-sdk 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana_rbpf", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5959,12 +6409,12 @@ dependencies = [ "libsecp256k1 0.6.0", "log", "scopeguard", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "solana-zk-token-sdk 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana_rbpf", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5980,7 +6430,7 @@ dependencies = [ "modular-bitfield", "num_enum 0.7.3", "rand 0.8.5", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-sdk", "tempfile", ] @@ -5997,7 +6447,7 @@ dependencies = [ "modular-bitfield", "num_enum 0.7.3", "rand 0.8.5", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-sdk", "tempfile", ] @@ -6014,13 +6464,13 @@ dependencies = [ "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-ledger", "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-poh", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "solana-transaction-status", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6034,10 +6484,10 @@ dependencies = [ "rpassword", "solana-remote-wallet 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tiny-bip39", "uriparse", - "url", + "url 2.5.4", ] [[package]] @@ -6050,10 +6500,25 @@ dependencies = [ "rpassword", "solana-remote-wallet 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tiny-bip39", "uriparse", - "url", + "url 2.5.4", +] + +[[package]] +name = "solana-cli-config" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "dirs-next", + "lazy_static", + "serde", + "serde_derive", + "serde_yaml", + "solana-clap-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-sdk", + "url 2.5.4", ] [[package]] @@ -6065,7 +6530,7 @@ dependencies = [ "async-trait", "bincode", "dashmap", - "futures", + "futures 0.3.31", "futures-util", "indexmap 2.7.0", "indicatif", @@ -6073,7 +6538,7 @@ dependencies = [ "quinn", "rayon", "solana-connection-cache 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-pubsub-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-quic-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6081,11 +6546,11 @@ dependencies = [ "solana-rpc-client-api", "solana-rpc-client-nonce-utils 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", - "solana-streamer 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-streamer", "solana-thin-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-tpu-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-udp-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -6097,7 +6562,7 @@ dependencies = [ "async-trait", "bincode", "dashmap", - "futures", + "futures 0.3.31", "futures-util", "indexmap 2.7.0", "indicatif", @@ -6105,7 +6570,7 @@ dependencies = [ "quinn", "rayon", "solana-connection-cache 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-pubsub-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-quic-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", @@ -6113,11 +6578,11 @@ dependencies = [ "solana-rpc-client-api", "solana-rpc-client-nonce-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "solana-streamer 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-streamer", "solana-thin-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-tpu-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-udp-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -6182,10 +6647,10 @@ dependencies = [ "rand 0.8.5", "rayon", "rcgen", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -6203,13 +6668,99 @@ dependencies = [ "rand 0.8.5", "rayon", "rcgen", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tokio", ] +[[package]] +name = "solana-core" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "anchor-lang 0.24.2", + "base64 0.21.7", + "bincode", + "bs58 0.4.0", + "bytes", + "chrono", + "crossbeam-channel", + "dashmap", + "eager", + "etcd-client", + "futures 0.3.31", + "histogram", + "itertools 0.10.5", + "jito-protos", + "jito-tip-distribution", + "jito-tip-payment", + "lazy_static", + "log", + "lru", + "min-max-heap", + "num_enum 0.7.3", + "prio-graph", + "prost", + "prost-types", + "quinn", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rayon", + "rcgen", + "rolling-file", + "rustc_version", + "rustls", + "serde", + "serde_bytes", + "serde_derive", + "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-bloom", + "solana-bundle", + "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-cost-model 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-entry", + "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-geyser-plugin-manager", + "solana-gossip", + "solana-ledger", + "solana-measure", + "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-net-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-poh", + "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-quic-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-rpc", + "solana-rpc-client-api", + "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-runtime-plugin", + "solana-sdk", + "solana-send-transaction-service 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-streamer", + "solana-tpu-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-transaction-status", + "solana-turbine", + "solana-unified-scheduler-pool", + "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-wen-restart", + "strum", + "strum_macros", + "sys-info", + "sysctl", + "tempfile", + "thiserror 1.0.69", + "tokio", + "tonic", + "tonic-build", + "trees", +] + [[package]] name = "solana-cost-model" version = "1.18.26" @@ -6270,7 +6821,7 @@ dependencies = [ "rand 0.8.5", "rayon", "serde", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-merkle-tree", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", @@ -6278,6 +6829,29 @@ dependencies = [ "solana-sdk", ] +[[package]] +name = "solana-faucet" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "bincode", + "byteorder", + "clap 2.34.0", + "crossbeam-channel", + "log", + "serde", + "serde_derive", + "solana-clap-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-cli-config", + "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-sdk", + "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "spl-memo", + "thiserror 1.0.69", + "tokio", +] + [[package]] name = "solana-frozen-abi" version = "1.18.26" @@ -6300,7 +6874,7 @@ dependencies = [ "sha2 0.10.8", "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "subtle", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6324,7 +6898,7 @@ dependencies = [ "sha2 0.10.8", "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "subtle", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6333,8 +6907,8 @@ version = "1.18.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c142f779c3633ac83c84d04ff06c70e1f558c876f13358bed77ba629c7417932" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "rustc_version", "syn 2.0.93", ] @@ -6344,12 +6918,49 @@ name = "solana-frozen-abi-macro" version = "1.18.26" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "rustc_version", "syn 2.0.93", ] +[[package]] +name = "solana-geyser-plugin-interface" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "log", + "solana-sdk", + "solana-transaction-status", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-geyser-plugin-manager" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "bs58 0.4.0", + "crossbeam-channel", + "json5", + "jsonrpc-core", + "jsonrpc-server-utils", + "libloading 0.7.4", + "log", + "serde_json", + "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-entry", + "solana-geyser-plugin-interface", + "solana-ledger", + "solana-measure", + "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-rpc", + "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-sdk", + "solana-transaction-status", + "thiserror 1.0.69", +] + [[package]] name = "solana-gossip" version = "1.18.26" @@ -6382,21 +6993,21 @@ dependencies = [ "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-ledger", "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-net-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "solana-streamer 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-streamer", "solana-thin-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-tpu-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "static_assertions", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6413,7 +7024,7 @@ dependencies = [ "crossbeam-channel", "dashmap", "fs_extra", - "futures", + "futures 0.3.31", "itertools 0.10.5", "lazy_static", "libc", @@ -6441,7 +7052,7 @@ dependencies = [ "solana-entry", "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", @@ -6460,7 +7071,7 @@ dependencies = [ "strum", "strum_macros", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "trees", @@ -6473,7 +7084,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b58f70f5883b0f26a6011ed23f76c493a3f22df63aec46cfe8e1b9bf82b5cc" dependencies = [ "log", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", "solana_rbpf", @@ -6485,7 +7096,7 @@ version = "1.18.26" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" dependencies = [ "log", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "solana_rbpf", @@ -6512,16 +7123,6 @@ dependencies = [ "log", ] -[[package]] -name = "solana-measure" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c01a7f9cdc9d9d37a3d5651b2fe7ec9d433c2a3470b9f35897e373b421f0737" -dependencies = [ - "log", - "solana-sdk", -] - [[package]] name = "solana-measure" version = "1.18.26" @@ -6552,7 +7153,7 @@ dependencies = [ "log", "reqwest", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6566,7 +7167,7 @@ dependencies = [ "log", "reqwest", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6588,7 +7189,7 @@ dependencies = [ "solana-sdk", "solana-version 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "tokio", - "url", + "url 2.5.4", ] [[package]] @@ -6609,7 +7210,7 @@ dependencies = [ "solana-sdk", "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "tokio", - "url", + "url 2.5.4", ] [[package]] @@ -6685,11 +7286,11 @@ dependencies = [ "log", "solana-entry", "solana-ledger", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6740,7 +7341,7 @@ dependencies = [ "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk-macro", - "thiserror", + "thiserror 1.0.69", "tiny-bip39", "wasm-bindgen", "zeroize", @@ -6767,11 +7368,11 @@ dependencies = [ "serde", "solana-frozen-abi 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", "solana_rbpf", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6794,11 +7395,11 @@ dependencies = [ "serde", "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "solana_rbpf", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6827,7 +7428,7 @@ dependencies = [ "solana-vote-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana_rbpf", "test-case", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -6856,7 +7457,7 @@ dependencies = [ "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana_rbpf", "test-case", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -6877,12 +7478,12 @@ dependencies = [ "solana-account-decoder 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-rpc-client-api", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-tungstenite", "tungstenite", - "url", + "url 2.5.4", ] [[package]] @@ -6901,12 +7502,12 @@ dependencies = [ "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-rpc-client-api", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-tungstenite", "tungstenite", - "url", + "url 2.5.4", ] [[package]] @@ -6917,7 +7518,7 @@ checksum = "5a90e40ee593f6e9ddd722d296df56743514ae804975a76d47e7afed4e3da244" dependencies = [ "async-mutex", "async-trait", - "futures", + "futures 0.3.31", "itertools 0.10.5", "lazy_static", "log", @@ -6926,13 +7527,13 @@ dependencies = [ "rcgen", "rustls", "solana-connection-cache 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-net-utils 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-rpc-client-api", "solana-sdk", - "solana-streamer 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror", + "solana-streamer", + "thiserror 1.0.69", "tokio", ] @@ -6943,7 +7544,7 @@ source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0 dependencies = [ "async-mutex", "async-trait", - "futures", + "futures 0.3.31", "itertools 0.10.5", "lazy_static", "log", @@ -6952,13 +7553,13 @@ dependencies = [ "rcgen", "rustls", "solana-connection-cache 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-net-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-rpc-client-api", "solana-sdk", - "solana-streamer 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "thiserror", + "solana-streamer", + "thiserror 1.0.69", "tokio", ] @@ -6996,7 +7597,7 @@ dependencies = [ "qstring", "semver", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "uriparse", ] @@ -7014,10 +7615,68 @@ dependencies = [ "qstring", "semver", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "uriparse", ] +[[package]] +name = "solana-rpc" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "base64 0.21.7", + "bincode", + "bs58 0.4.0", + "crossbeam-channel", + "dashmap", + "itertools 0.10.5", + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "jsonrpc-http-server", + "jsonrpc-pubsub", + "libc", + "log", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "soketto", + "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-bundle", + "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-entry", + "solana-faucet", + "solana-gossip", + "solana-ledger", + "solana-measure", + "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-poh", + "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-rpc-client-api", + "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-sdk", + "solana-send-transaction-service 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-stake-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-storage-bigtable", + "solana-streamer", + "solana-tpu-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-transaction-status", + "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "spl-token 4.0.0", + "spl-token-2022 1.0.0", + "stream-cancel", + "thiserror 1.0.69", + "tokio", + "tokio-util 0.6.10", +] + [[package]] name = "solana-rpc-client" version = "1.18.26" @@ -7063,7 +7722,7 @@ dependencies = [ "solana-transaction-status", "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "spl-token-2022 1.0.0", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7076,7 +7735,7 @@ dependencies = [ "solana-clap-utils 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-rpc-client", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7088,7 +7747,7 @@ dependencies = [ "solana-clap-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-rpc-client", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7145,7 +7804,7 @@ dependencies = [ "solana-frozen-abi 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-loader-v4-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-perf 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", @@ -7164,7 +7823,7 @@ dependencies = [ "symlink", "tar", "tempfile", - "thiserror", + "thiserror 1.0.69", "zstd", ] @@ -7221,7 +7880,7 @@ dependencies = [ "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-loader-v4-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", @@ -7240,10 +7899,29 @@ dependencies = [ "symlink", "tar", "tempfile", - "thiserror", + "thiserror 1.0.69", "zstd", ] +[[package]] +name = "solana-runtime-plugin" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "crossbeam-channel", + "json5", + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "jsonrpc-ipc-server", + "jsonrpc-server-utils", + "libloading 0.7.4", + "log", + "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-sdk", + "thiserror 1.0.69", +] + [[package]] name = "solana-sdk" version = "1.18.26" @@ -7294,7 +7972,7 @@ dependencies = [ "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-program", "solana-sdk-macro", - "thiserror", + "thiserror 1.0.69", "uriparse", "wasm-bindgen", ] @@ -7305,8 +7983,8 @@ version = "1.18.26" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" dependencies = [ "bs58 0.4.0", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "rustversion", "syn 2.0.93", ] @@ -7326,7 +8004,7 @@ dependencies = [ "crossbeam-channel", "log", "solana-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", @@ -7342,7 +8020,7 @@ dependencies = [ "log", "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-gossip", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", @@ -7389,7 +8067,7 @@ dependencies = [ "bzip2", "enum-iterator", "flate2", - "futures", + "futures 0.3.31", "goauth", "http", "hyper", @@ -7405,7 +8083,7 @@ dependencies = [ "solana-sdk", "solana-storage-proto", "solana-transaction-status", - "thiserror", + "thiserror 1.0.69", "tokio", "tonic", "zstd", @@ -7427,39 +8105,6 @@ dependencies = [ "tonic-build", ] -[[package]] -name = "solana-streamer" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8476e41ad94fe492e8c06697ee35912cf3080aae0c9e9ac6430835256ccf056" -dependencies = [ - "async-channel", - "bytes", - "crossbeam-channel", - "futures-util", - "histogram", - "indexmap 2.7.0", - "itertools 0.10.5", - "libc", - "log", - "nix", - "pem", - "percentage", - "pkcs8", - "quinn", - "quinn-proto", - "rand 0.8.5", - "rcgen", - "rustls", - "smallvec", - "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-perf 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-sdk", - "thiserror", - "tokio", - "x509-parser", -] - [[package]] name = "solana-streamer" version = "1.18.26" @@ -7487,7 +8132,7 @@ dependencies = [ "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tokio", "x509-parser", ] @@ -7562,13 +8207,13 @@ dependencies = [ "log", "rayon", "solana-connection-cache 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-measure", "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-pubsub-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-rpc-client", "solana-rpc-client-api", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -7585,13 +8230,13 @@ dependencies = [ "log", "rayon", "solana-connection-cache 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-pubsub-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-rpc-client", "solana-rpc-client-api", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -7616,7 +8261,43 @@ dependencies = [ "spl-memo", "spl-token 4.0.0", "spl-token-2022 1.0.0", - "thiserror", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-turbine" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "bincode", + "bytes", + "crossbeam-channel", + "futures 0.3.31", + "itertools 0.10.5", + "log", + "lru", + "quinn", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rayon", + "rcgen", + "rustls", + "solana-entry", + "solana-gossip", + "solana-ledger", + "solana-measure", + "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-poh", + "solana-quic-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-rpc", + "solana-rpc-client-api", + "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-sdk", + "solana-streamer", + "thiserror 1.0.69", + "tokio", ] [[package]] @@ -7629,8 +8310,8 @@ dependencies = [ "solana-connection-cache 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-net-utils 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", - "solana-streamer 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror", + "solana-streamer", + "thiserror 1.0.69", "tokio", ] @@ -7643,11 +8324,29 @@ dependencies = [ "solana-connection-cache 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-net-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "solana-streamer 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "thiserror", + "solana-streamer", + "thiserror 1.0.69", "tokio", ] +[[package]] +name = "solana-unified-scheduler-logic" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" + +[[package]] +name = "solana-unified-scheduler-pool" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "solana-ledger", + "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-sdk", + "solana-unified-scheduler-logic", + "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", +] + [[package]] name = "solana-version" version = "1.18.26" @@ -7695,7 +8394,7 @@ dependencies = [ "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", "solana-vote-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7713,7 +8412,7 @@ dependencies = [ "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7735,7 +8434,7 @@ dependencies = [ "solana-program", "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7756,7 +8455,27 @@ dependencies = [ "solana-program", "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "thiserror", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-wen-restart" +version = "1.18.26" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +dependencies = [ + "log", + "prost", + "prost-build", + "prost-types", + "protobuf-src", + "rustc_version", + "solana-gossip", + "solana-ledger", + "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-program", + "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-sdk", + "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", ] [[package]] @@ -7811,7 +8530,7 @@ dependencies = [ "solana-program", "solana-sdk", "subtle", - "thiserror", + "thiserror 1.0.69", "zeroize", ] @@ -7839,7 +8558,7 @@ dependencies = [ "solana-program", "solana-sdk", "subtle", - "thiserror", + "thiserror 1.0.69", "zeroize", ] @@ -7858,7 +8577,7 @@ dependencies = [ "rand 0.8.5", "rustc-demangle", "scroll", - "thiserror", + "thiserror 1.0.69", "winapi 0.3.9", ] @@ -7897,7 +8616,7 @@ dependencies = [ "solana-program", "spl-token 4.0.0", "spl-token-2022 1.0.0", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7928,7 +8647,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" dependencies = [ - "quote", + "quote 1.0.38", "spl-discriminator-syn 0.1.2", "syn 2.0.93", ] @@ -7939,7 +8658,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" dependencies = [ - "quote", + "quote 1.0.38", "spl-discriminator-syn 0.2.0", "syn 2.0.93", ] @@ -7950,11 +8669,11 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18fea7be851bd98d10721782ea958097c03a0c2a07d8d4997041d0ece6319a63" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "sha2 0.10.8", "syn 2.0.93", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7963,11 +8682,11 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c1f05593b7ca9eac7caca309720f2eafb96355e037e6d373b909a80fe7b69b9" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "sha2 0.10.8", "syn 2.0.93", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7980,7 +8699,7 @@ dependencies = [ "num-derive 0.3.3", "num-traits", "solana-program", - "thiserror", + "thiserror 1.0.69", "uint", ] @@ -8029,7 +8748,7 @@ dependencies = [ "num-traits", "solana-program", "spl-program-error-derive 0.3.2", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -8042,7 +8761,7 @@ dependencies = [ "num-traits", "solana-program", "spl-program-error-derive 0.4.1", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -8051,8 +8770,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1845dfe71fd68f70382232742e758557afe973ae19e6c06807b2c30f5d5cb474" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "sha2 0.10.8", "syn 2.0.93", ] @@ -8063,8 +8782,8 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d375dd76c517836353e093c2dbb490938ff72821ab568b545fd30ab3256b3e" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "sha2 0.10.8", "syn 2.0.93", ] @@ -8089,7 +8808,7 @@ dependencies = [ "spl-math", "spl-pod 0.1.0", "spl-token-2022 0.9.0", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -8146,7 +8865,7 @@ dependencies = [ "num-traits", "num_enum 0.5.11", "solana-program", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -8161,7 +8880,7 @@ dependencies = [ "num-traits", "num_enum 0.6.1", "solana-program", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -8183,7 +8902,7 @@ dependencies = [ "spl-token-metadata-interface 0.2.0", "spl-transfer-hook-interface 0.3.0", "spl-type-length-value 0.3.0", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -8207,7 +8926,7 @@ dependencies = [ "spl-token-metadata-interface 0.2.0", "spl-transfer-hook-interface 0.4.1", "spl-type-length-value 0.3.0", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -8231,7 +8950,7 @@ dependencies = [ "spl-token-metadata-interface 0.3.5", "spl-transfer-hook-interface 0.6.5", "spl-type-length-value 0.4.6", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -8374,6 +9093,17 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "stream-cancel" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f9fbf9bd71e4cf18d68a8a0951c0e5b7255920c0cd992c4ff51cddd6ef514a3" +dependencies = [ + "futures-core", + "pin-project", + "tokio", +] + [[package]] name = "strsim" version = "0.8.0" @@ -8408,8 +9138,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ "heck 0.4.1", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "rustversion", "syn 1.0.109", ] @@ -8525,7 +9255,7 @@ dependencies = [ "bincode", "borsh 0.10.4", "bytemuck", - "futures", + "futures 0.3.31", "lazy_static", "libsecp256k1 0.7.1", "log", @@ -8547,14 +9277,25 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7973cce6668464ea31f176d85b13c7ab3bba2cb3b77a2ed26abd7801688010a" +[[package]] +name = "syn" +version = "0.15.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "unicode-xid 0.1.0", +] + [[package]] name = "syn" version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "unicode-ident", ] @@ -8564,8 +9305,8 @@ version = "2.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "unicode-ident", ] @@ -8581,10 +9322,10 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", - "unicode-xid", + "unicode-xid 0.2.6", ] [[package]] @@ -8593,11 +9334,34 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] +[[package]] +name = "sys-info" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b3a0d0aba8bf96a0e1ddfdc352fc53b3df7f39318c71854910c3c4b024ae52c" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "sysctl" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225e483f02d0ad107168dc57381a8a40c3aeea6abe47f37506931f861643cfa8" +dependencies = [ + "bitflags 1.3.2", + "byteorder", + "libc", + "thiserror 1.0.69", + "walkdir", +] + [[package]] name = "system-configuration" version = "0.5.1" @@ -8644,7 +9408,7 @@ checksum = "1c38a012bed6fb9681d3bf71ffaa4f88f3b4b9ed3198cda6e4c8462d24d4bb80" dependencies = [ "anyhow", "fnv", - "futures", + "futures 0.3.31", "humantime", "opentelemetry", "pin-project", @@ -8652,7 +9416,7 @@ dependencies = [ "serde", "static_assertions", "tarpc-plugins", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-serde", "tokio-util 0.6.10", @@ -8666,8 +9430,8 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee42b4e559f17bce0385ebf511a7beb67d5cc33c12c96b7f4e9789919d9c10f" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 1.0.109", ] @@ -8677,11 +9441,11 @@ version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "fastrand", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -8714,9 +9478,9 @@ version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adcb7fd841cd518e279be3d5a3eb0636409487998a4aff22f3de87b81e88384f" dependencies = [ - "cfg-if", - "proc-macro2", - "quote", + "cfg-if 1.0.0", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -8726,8 +9490,8 @@ version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", "test-case-core", ] @@ -8753,7 +9517,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +dependencies = [ + "thiserror-impl 2.0.11", ] [[package]] @@ -8762,8 +9535,19 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", + "syn 2.0.93", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +dependencies = [ + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -8773,7 +9557,7 @@ version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "once_cell", ] @@ -8821,7 +9605,7 @@ dependencies = [ "rand 0.7.3", "rustc-hash", "sha2 0.9.9", - "thiserror", + "thiserror 1.0.69", "unicode-normalization", "wasm-bindgen", "zeroize", @@ -8859,7 +9643,9 @@ dependencies = [ "anchor-lang 0.30.1", "anyhow", "base64 0.13.1", + "clap 2.34.0", "clap 4.5.23", + "crossbeam-channel", "ellipsis-client", "env_logger 0.10.2", "hex", @@ -8878,19 +9664,27 @@ dependencies = [ "serde_json", "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-clap-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-core", + "solana-geyser-plugin-manager", + "solana-gossip", "solana-ledger", + "solana-measure", "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-program", "solana-program-test 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-rpc", "solana-rpc-client", "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", "solana-stake-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-streamer", + "solana-unified-scheduler-pool", "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "spl-memo", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -8928,8 +9722,8 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -9003,6 +9797,7 @@ checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" dependencies = [ "bytes", "futures-core", + "futures-io", "futures-sink", "log", "pin-project-lite", @@ -9095,7 +9890,7 @@ dependencies = [ "http-body", "hyper", "hyper-timeout", - "percent-encoding", + "percent-encoding 2.3.1", "pin-project", "prost", "rustls-pemfile", @@ -9115,9 +9910,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6fdaae4c2c638bb70fe42803a26fbd6fc6ac8c72f5c59f67ecc2a2dcabf4b07" dependencies = [ "prettyplease 0.1.25", - "proc-macro2", + "proc-macro2 1.0.92", "prost-build", - "quote", + "quote 1.0.38", "syn 1.0.109", ] @@ -9171,8 +9966,8 @@ version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -9237,8 +10032,8 @@ dependencies = [ "rand 0.8.5", "rustls", "sha1", - "thiserror", - "url", + "thiserror 1.0.69", + "url 2.5.4", "utf-8", "webpki-roots 0.24.0", ] @@ -9255,6 +10050,12 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + [[package]] name = "uint" version = "0.9.5" @@ -9267,6 +10068,18 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + [[package]] name = "unicode-ident" version = "1.0.14" @@ -9300,6 +10113,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" +[[package]] +name = "unicode-xid" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" + [[package]] name = "unicode-xid" version = "0.2.6" @@ -9331,6 +10150,12 @@ dependencies = [ "void", ] +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + [[package]] name = "untrusted" version = "0.7.1" @@ -9353,6 +10178,17 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "url" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" +dependencies = [ + "idna 0.1.5", + "matches", + "percent-encoding 1.0.1", +] + [[package]] name = "url" version = "2.5.4" @@ -9360,8 +10196,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", - "idna", - "percent-encoding", + "idna 1.0.3", + "percent-encoding 2.3.1", ] [[package]] @@ -9497,7 +10333,7 @@ version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "once_cell", "wasm-bindgen-macro", ] @@ -9510,8 +10346,8 @@ checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", "wasm-bindgen-shared", ] @@ -9522,7 +10358,7 @@ version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", "once_cell", "wasm-bindgen", @@ -9535,7 +10371,7 @@ version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ - "quote", + "quote 1.0.38", "wasm-bindgen-macro-support", ] @@ -9545,8 +10381,8 @@ version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", "wasm-bindgen-backend", "wasm-bindgen-shared", @@ -9639,7 +10475,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -9829,7 +10665,7 @@ version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "windows-sys 0.48.0", ] @@ -9868,7 +10704,7 @@ dependencies = [ "nom", "oid-registry", "rusticata-macros", - "thiserror", + "thiserror 1.0.69", "time", ] @@ -9916,8 +10752,8 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", "synstructure 0.13.1", ] @@ -9938,8 +10774,8 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -9958,8 +10794,8 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", "synstructure 0.13.1", ] @@ -9979,8 +10815,8 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] @@ -10001,8 +10837,8 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.92", + "quote 1.0.38", "syn 2.0.93", ] diff --git a/Cargo.toml b/Cargo.toml index f06bb16a..fd7cd92a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,6 +40,7 @@ bytemuck = { version = "1.16.3", features = ["min_const_generics"] } cfg-if = "1.0.0" chrono = "0.4.38" clap = { version = "4.5.16", features = ["derive", "env", "cargo"] } +clap_old = { package = "clap", version = "2.33.1" } clap-markdown = { version = "0.1.4" } const_str_to_pubkey = "0.1.1" dotenv = "0.15.0" @@ -68,16 +69,24 @@ spl-memo = "4.0.0" solana-account-decoder = { package = "solana-account-decoder", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-metrics = { package = "solana-metrics", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-accounts-db = { package = "solana-accounts-db", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-clap-utils = { package = "solana-clap-utils", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-client = { package = "solana-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-core = { package = "solana-core", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-geyser-plugin-manager = { package = "solana-geyser-plugin-manager", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-gossip = { package = "solana-gossip", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-measure = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-ledger = { package = "solana-ledger", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-program = { package = "solana-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-transaction-status = { package = "solana-transaction-status", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-program-test = { package = "solana-program-test", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-rpc-client = { package = "solana-rpc-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-rpc = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-runtime = { package = "solana-runtime", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-streamer = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-sdk = { package = "solana-sdk", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-stake-program = { package = "solana-stake-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-vote = { package = "solana-vote", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-unified-scheduler-pool = { package = "solana-unified-scheduler-pool", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } solana-security-txt = "1.1.1" spl-associated-token-account = { version = "2.3.0", features = ["no-entrypoint"] } spl-stake-pool = { version = "1.0.0", features = ["no-entrypoint"] } @@ -115,3 +124,10 @@ solana-rpc-client = { git = "https://github.com/jito-foundation/jito-solana.git" solana-rpc-client-api = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } # necessary for ellipsis client solana-transaction-status = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-core = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-geyser-plugin-manager = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-gossip = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-measure = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-rpc = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-streamer = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-unified-scheduler-pool = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } diff --git a/tip-router-operator-cli/Cargo.toml b/tip-router-operator-cli/Cargo.toml index 664ffd9e..5b378928 100644 --- a/tip-router-operator-cli/Cargo.toml +++ b/tip-router-operator-cli/Cargo.toml @@ -9,6 +9,8 @@ anchor-lang = { workspace = true } anyhow = { workspace = true } base64 = "0.13" clap = { workspace = true } +clap_old = { workspace = true } +crossbeam-channel = "0.5" ellipsis-client = "0.1" env_logger = { workspace = true } hex = "0.4" @@ -27,7 +29,14 @@ serde = { workspace = true } serde_json = { workspace = true } solana-account-decoder = { workspace = true } solana-accounts-db = { workspace = true } +solana-clap-utils = { workspace = true } solana-client = { workspace = true } +solana-core = { workspace = true } +solana-geyser-plugin-manager = { workspace = true } +solana-gossip = { workspace = true } +solana-measure = { workspace = true } +solana-rpc = { workspace = true } +solana-streamer = { workspace = true } solana-ledger = { workspace = true } solana-metrics = { workspace = true } solana-program = { workspace = true } @@ -35,6 +44,7 @@ solana-rpc-client = { workspace = true } solana-runtime = { workspace = true } solana-sdk = { workspace = true } solana-stake-program = { workspace = true } +solana-unified-scheduler-pool = { workspace = true } solana-vote = { workspace = true } spl-memo = { workspace = true } thiserror = { workspace = true } diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index 25a6df88..1f48ea6a 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -190,7 +190,7 @@ pub fn get_bank_from_ledger( // Call ledger_utils::load_and_process_ledger here let (bank_forks, _starting_snapshot_hashes) = - match crate::load_and_process_ledger::load_and_process_ledger( + match load_and_process_ledger::load_and_process_ledger( &arg_matches, &genesis_config, Arc::new(blockstore), diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index c39c47a9..8f6528ea 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -4,11 +4,15 @@ pub mod tip_router; pub use crate::cli::{Cli, Commands}; pub mod cli; pub use crate::process_epoch::process_epoch; +pub mod arg_matches; pub mod backup_snapshots; +pub mod load_and_process_ledger; pub mod process_epoch; pub mod submit; +use std::fs; use std::path::{Path, PathBuf}; +use std::process::Command; use std::time::Instant; use anchor_lang::prelude::*; diff --git a/tip-router-operator-cli/src/load_and_process_ledger.rs b/tip-router-operator-cli/src/load_and_process_ledger.rs index bc91c02f..0329583d 100644 --- a/tip-router-operator-cli/src/load_and_process_ledger.rs +++ b/tip-router-operator-cli/src/load_and_process_ledger.rs @@ -66,7 +66,7 @@ const PROCESS_SLOTS_HELP_STRING: &str = --halt-at-slot if specified, or the highest slot in the blockstore."; #[derive(Error, Debug)] -pub(crate) enum LoadAndProcessLedgerError { +pub enum LoadAndProcessLedgerError { #[error("failed to clean orphaned account snapshot directories: {0}")] CleanOrphanedAccountSnapshotDirectories(#[source] std::io::Error), diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index a6d756a8..a68a119a 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -46,14 +46,12 @@ async fn main() -> Result<()> { operator_address: {} rpc_url: {} ledger_path: {} - account_paths: {:?} full_snapshots_path: {:?} snapshot_output_dir: {}", cli.keypair_path, cli.operator_address, cli.rpc_url, cli.ledger_path.display(), - cli.account_paths, cli.full_snapshots_path, cli.snapshot_output_dir.display() ); From c752801268bb44efba0d1061ec1e53f5fd8c2cae Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Wed, 29 Jan 2025 20:00:25 -0500 Subject: [PATCH 056/112] add control flow for epoch handling --- tip-router-operator-cli/src/main.rs | 19 ++++++++++--------- tip-router-operator-cli/src/process_epoch.rs | 18 +++++++++++------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 0abc7497..245e0797 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -21,7 +21,7 @@ use ::{ create_merkle_tree_collection, create_meta_merkle_tree, create_stake_meta, ledger_utils::get_bank_from_ledger, load_bank_from_snapshot, - process_epoch::{get_previous_epoch_last_slot, wait_for_next_epoch}, + process_epoch::{calc_prev_epoch_and_final_slot, get_previous_epoch_last_slot, wait_for_next_epoch}, submit::{submit_recent_epochs_to_ncn, submit_to_ncn}, OperatorState, }, @@ -80,8 +80,7 @@ async fn main() -> Result<()> { let backup_snapshots_dir = cli.backup_snapshots_dir.clone(); let rpc_url = cli.rpc_url.clone(); let cli_clone: Cli = cli.clone(); - let starting_epoch_info = rpc_client.get_epoch_info()?; - let mut current_epoch = starting_epoch_info.epoch; + let mut current_epoch_info = rpc_client.get_epoch_info()?; if !backup_snapshots_dir.exists() { info!( @@ -133,10 +132,12 @@ async fn main() -> Result<()> { let mut bank: Option> = None; let mut stake_meta_collection: Option = None; let mut merkle_tree_collection: Option = None; + let mut epoch_to_process = current_epoch_info.epoch.saturating_sub(1); let mut slot_to_process = if let Some(slot) = override_target_slot { slot } else { - 0 + let (_, prev_slot) = calc_prev_epoch_and_final_slot(¤t_epoch_info)?; + prev_slot }; loop { match stage { @@ -155,7 +156,7 @@ async fn main() -> Result<()> { // well start from load bank stake_meta_collection = Some(create_stake_meta( operator_address.clone(), - current_epoch, + epoch_to_process, bank.as_ref().expect("Bank was not set"), &tip_distribution_program_id, &tip_payment_program_id, @@ -178,7 +179,7 @@ async fn main() -> Result<()> { merkle_tree_collection = Some(create_merkle_tree_collection( cli.operator_address.clone(), some_stake_meta_collection, - current_epoch, + epoch_to_process, &ncn_address, PROTOCOL_FEE_BPS, &cli.save_path, @@ -201,7 +202,7 @@ async fn main() -> Result<()> { create_meta_merkle_tree( cli.operator_address.clone(), some_merkle_tree_collection, - current_epoch, + epoch_to_process, &cli.save_path, // TODO: If we keep the separate thread for handling NCN submission // through files on disk then this needs to be true @@ -215,7 +216,7 @@ async fn main() -> Result<()> { } OperatorState::WaitForNextEpoch => { // TODO: use the epoch returned from wait_for_next_epoch - wait_for_next_epoch(&rpc_client, current_epoch).await; + current_epoch_info = wait_for_next_epoch(&rpc_client, current_epoch_info.epoch).await; // Get the last slot of the previous epoch let (previous_epoch, previous_epoch_slot) = if let Ok((epoch, slot)) = get_previous_epoch_last_slot(&rpc_client) { @@ -226,7 +227,7 @@ async fn main() -> Result<()> { continue; }; slot_to_process = previous_epoch_slot; - current_epoch = previous_epoch; + epoch_to_process = previous_epoch; stage = OperatorState::LoadBankFromSnapshot; } } diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index 78cfe6b3..b879e760 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -9,7 +9,7 @@ use ellipsis_client::EllipsisClient; use log::{error, info}; use solana_metrics::{datapoint_error, datapoint_info}; use solana_rpc_client::rpc_client::RpcClient; -use solana_sdk::pubkey::Pubkey; +use solana_sdk::{epoch_info::EpochInfo, pubkey::Pubkey}; use tokio::time; use crate::{ @@ -19,26 +19,30 @@ use crate::{ const MAX_WAIT_FOR_INCREMENTAL_SNAPSHOT_TICKS: u64 = 1200; // Experimentally determined const OPTIMAL_INCREMENTAL_SNAPSHOT_SLOT_RANGE: u64 = 800; // Experimentally determined -pub async fn wait_for_next_epoch(rpc_client: &RpcClient, current_epoch: u64) -> u64 { +pub async fn wait_for_next_epoch(rpc_client: &RpcClient, current_epoch: u64) -> EpochInfo { loop { tokio::time::sleep(Duration::from_secs(10)).await; // Check every 10 seconds - let new_epoch = match rpc_client.get_epoch_info() { - Ok(info) => info.epoch, + let new_epoch_info = match rpc_client.get_epoch_info() { + Ok(info) => info, Err(e) => { error!("Error getting epoch info: {:?}", e); continue; } }; - if new_epoch > current_epoch { - info!("New epoch detected: {} -> {}", current_epoch, new_epoch); - return new_epoch; + if new_epoch_info.epoch > current_epoch { + info!("New epoch detected: {} -> {}", current_epoch, new_epoch_info.epoch); + return new_epoch_info; } } } pub fn get_previous_epoch_last_slot(rpc_client: &RpcClient) -> Result<(u64, u64)> { let epoch_info = rpc_client.get_epoch_info()?; + calc_prev_epoch_and_final_slot(&epoch_info) +} + +pub fn calc_prev_epoch_and_final_slot(epoch_info: &EpochInfo) -> Result<(u64, u64)> { let current_slot = epoch_info.absolute_slot; let slot_index = epoch_info.slot_index; From 922d000ae7c9b33dc5a510f36ebeb86e5f4df0c6 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Wed, 29 Jan 2025 20:03:37 -0500 Subject: [PATCH 057/112] handle loading from file for stake meta and merkle tree collection --- tip-router-operator-cli/src/main.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 245e0797..7c06b4c7 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -171,8 +171,10 @@ async fn main() -> Result<()> { OperatorState::CreateMerkleTreeCollection => { let some_stake_meta_collection = match stake_meta_collection.to_owned() { Some(collection) => collection, - // TODO: Handle this - None => todo!("load stake meta from disk given desired epoch"), + None => { + let file = cli.save_path.join(format!("{}_stake_meta_collection.json", epoch_to_process)); + StakeMetaCollection::new_from_file(&file)? + }, }; // Generate the merkle tree collection @@ -194,9 +196,9 @@ async fn main() -> Result<()> { let some_merkle_tree_collection = match merkle_tree_collection.to_owned() { Some(collection) => collection, None => { - // TODO: Handle this - todo!("load merkle tree collection from disk given desired epoch") - } + let file = cli.save_path.join(format!("{}_merkle_tree_collection.json", epoch_to_process)); + GeneratedMerkleTreeCollection::new_from_file(&file)? + }, }; create_meta_merkle_tree( @@ -215,7 +217,6 @@ async fn main() -> Result<()> { // separate thread } OperatorState::WaitForNextEpoch => { - // TODO: use the epoch returned from wait_for_next_epoch current_epoch_info = wait_for_next_epoch(&rpc_client, current_epoch_info.epoch).await; // Get the last slot of the previous epoch let (previous_epoch, previous_epoch_slot) = From 45a1d83d98ac41fe10bb449450948103146090b7 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Thu, 30 Jan 2025 14:44:34 -0500 Subject: [PATCH 058/112] fmt and wait for optimal incremental snapshot --- tip-router-operator-cli/src/main.rs | 41 +++++++++++++------- tip-router-operator-cli/src/process_epoch.rs | 2 +- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 7c06b4c7..56092c53 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -21,7 +21,9 @@ use ::{ create_merkle_tree_collection, create_meta_merkle_tree, create_stake_meta, ledger_utils::get_bank_from_ledger, load_bank_from_snapshot, - process_epoch::{calc_prev_epoch_and_final_slot, get_previous_epoch_last_slot, wait_for_next_epoch}, + process_epoch::{ + calc_prev_epoch_and_final_slot, get_previous_epoch_last_slot, wait_for_next_epoch, wait_for_optimal_incremental_snapshot, + }, submit::{submit_recent_epochs_to_ncn, submit_to_ncn}, OperatorState, }, @@ -172,9 +174,12 @@ async fn main() -> Result<()> { let some_stake_meta_collection = match stake_meta_collection.to_owned() { Some(collection) => collection, None => { - let file = cli.save_path.join(format!("{}_stake_meta_collection.json", epoch_to_process)); + let file = cli.save_path.join(format!( + "{}_stake_meta_collection.json", + epoch_to_process + )); StakeMetaCollection::new_from_file(&file)? - }, + } }; // Generate the merkle tree collection @@ -196,9 +201,12 @@ async fn main() -> Result<()> { let some_merkle_tree_collection = match merkle_tree_collection.to_owned() { Some(collection) => collection, None => { - let file = cli.save_path.join(format!("{}_merkle_tree_collection.json", epoch_to_process)); + let file = cli.save_path.join(format!( + "{}_merkle_tree_collection.json", + epoch_to_process + )); GeneratedMerkleTreeCollection::new_from_file(&file)? - }, + } }; create_meta_merkle_tree( @@ -217,7 +225,8 @@ async fn main() -> Result<()> { // separate thread } OperatorState::WaitForNextEpoch => { - current_epoch_info = wait_for_next_epoch(&rpc_client, current_epoch_info.epoch).await; + current_epoch_info = + wait_for_next_epoch(&rpc_client, current_epoch_info.epoch).await; // Get the last slot of the previous epoch let (previous_epoch, previous_epoch_slot) = if let Ok((epoch, slot)) = get_previous_epoch_last_slot(&rpc_client) { @@ -229,6 +238,15 @@ async fn main() -> Result<()> { }; slot_to_process = previous_epoch_slot; epoch_to_process = previous_epoch; + + // TODO: When we start with wait for the next epoch, should we always wait + // for the optimal snapshot? + let incremental_snapshots_path = cli.backup_snapshots_dir.clone(); + wait_for_optimal_incremental_snapshot( + incremental_snapshots_path, + slot_to_process, + ) + .await?; stage = OperatorState::LoadBankFromSnapshot; } } @@ -236,15 +254,10 @@ async fn main() -> Result<()> { } Commands::SnapshotSlot { slot } => { info!("Snapshotting slot..."); - let account_paths = vec![cli.ledger_path.clone()]; - get_bank_from_ledger( - cli.operator_address, - &cli.ledger_path, - account_paths, - cli.full_snapshots_path.unwrap(), - cli.backup_snapshots_dir, - &slot, + load_bank_from_snapshot( + cli, + slot, true, ); } diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index b879e760..0c7757b3 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -17,7 +17,7 @@ use crate::{ }; const MAX_WAIT_FOR_INCREMENTAL_SNAPSHOT_TICKS: u64 = 1200; // Experimentally determined -const OPTIMAL_INCREMENTAL_SNAPSHOT_SLOT_RANGE: u64 = 800; // Experimentally determined +const OPTIMAL_INCREMENTAL_SNAPSHOT_SLOT_RANGE: u64 = 800; // Experimentally determined\ pub async fn wait_for_next_epoch(rpc_client: &RpcClient, current_epoch: u64) -> EpochInfo { loop { From 87727142d8077cba49eaef3028885b9e241d2ad4 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Mon, 3 Feb 2025 17:51:16 -0700 Subject: [PATCH 059/112] fix naming --- tip-router-operator-cli/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index 0bb03d06..8b2381d3 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -77,7 +77,7 @@ pub fn create_stake_meta( tip_distribution_program_id: &Pubkey, tip_payment_program_id: &Pubkey, save_path: &PathBuf, - save_snapshot: bool, + save: bool, ) -> StakeMetaCollection { let start = Instant::now(); @@ -110,7 +110,7 @@ pub fn create_stake_meta( stake_meta_coll.stake_metas.len(), stake_meta_coll.bank_hash ); - if save_snapshot { + if save { // Note: We have the epoch come before the file name so ordering is neat on a machine // with multiple epochs saved. let file = save_path.join(format!("{}_stake_meta_collection.json", epoch)); From 2dcabc4a988fe1d80ca4e856cf1734574dc98c6f Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Mon, 3 Feb 2025 21:11:01 -0700 Subject: [PATCH 060/112] create save path if not exists --- tip-router-operator-cli/src/cli.rs | 13 +++++++++++++ tip-router-operator-cli/src/main.rs | 2 ++ 2 files changed, 15 insertions(+) diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index 7e79b395..b3ec973f 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -1,6 +1,7 @@ use std::path::PathBuf; use clap::Parser; +use log::info; use solana_sdk::pubkey::Pubkey; use crate::OperatorState; @@ -39,6 +40,18 @@ pub struct Cli { pub command: Commands, } +impl Cli { + pub fn create_save_path(&self) { + if !self.save_path.exists() { + info!( + "Creating Tip Router save directory at {}", + self.save_path.display() + ); + std::fs::create_dir_all(&self.save_path).unwrap(); + } + } +} + #[derive(clap::Subcommand, Clone)] pub enum Commands { Run { diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 56092c53..738f6ae2 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -61,6 +61,8 @@ async fn main() -> Result<()> { cli.snapshot_output_dir.display() ); + cli.create_save_path(); + match cli.command { Commands::Run { ncn_address, From 8dc3ed1f5c0d6532b54cdd1ceb9dcc6cbd5ca2f5 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Mon, 3 Feb 2025 22:39:20 -0700 Subject: [PATCH 061/112] no snapshot when creating stake meta --- tip-router-operator-cli/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 738f6ae2..6f866af5 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -355,7 +355,7 @@ async fn main() -> Result<()> { cli.full_snapshots_path.unwrap(), cli.backup_snapshots_dir, &slot, - true, + false, ); create_stake_meta( From 38fbdc75f0958e233488058c10ac7390deb6f18d Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Wed, 5 Feb 2025 17:42:35 -0700 Subject: [PATCH 062/112] WIP dependencies map, fixing upgrade errors --- Cargo.lock | 5042 +++++++++-------- Cargo.toml | 245 +- cli/src/getters.rs | 7 + cli/src/instructions.rs | 2 +- program/src/lib.rs | 3 +- program/src/realloc_operator_snapshot.rs | 4 +- .../src/snapshot_vault_operator_delegation.rs | 4 +- program/src/switchboard_set_weight.rs | 5 +- rust-toolchain.toml | 2 +- tip-router-operator-cli/Cargo.toml | 2 +- 10 files changed, 3031 insertions(+), 2285 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e786a7bd..5552c099 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,30 +29,30 @@ checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aead" -version = "0.4.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ + "crypto-common", "generic-array", ] [[package]] name = "aes" -version = "0.7.5" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if 1.0.0", "cipher", "cpufeatures", - "opaque-debug", ] [[package]] name = "aes-gcm-siv" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589c637f0e68c877bbd59a4599bbe849cac8e5f3e4b5a3ebae8f528cd218dcdc" +checksum = "ae0784134ba9375416d469ec31e7c5f9fa94405049cf08c5ce5b4698be673e0d" dependencies = [ "aead", "aes", @@ -63,6 +63,26 @@ dependencies = [ "zeroize", ] +[[package]] +name = "agave-geyser-plugin-interface" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "log", + "solana-sdk", + "solana-transaction-status", + "thiserror 1.0.69", +] + +[[package]] +name = "agave-transaction-view" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "solana-sdk", + "solana-svm-transaction", +] + [[package]] name = "ahash" version = "0.7.8" @@ -96,12 +116,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "aliasable" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" - [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -117,10 +131,16 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "anchor-attribute-access-control" version = "0.24.2" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "anchor-syn 0.24.2", "anyhow", @@ -133,8 +153,7 @@ dependencies = [ [[package]] name = "anchor-attribute-access-control" version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47fe28365b33e8334dd70ae2f34a43892363012fe239cf37d2ee91693575b1f8" +source = "git+https://github.com/coral-xyz/anchor?rev=96ed3b791c6fed9ab64cb138397795fe55991280#96ed3b791c6fed9ab64cb138397795fe55991280" dependencies = [ "anchor-syn 0.30.1", "proc-macro2 1.0.92", @@ -145,7 +164,7 @@ dependencies = [ [[package]] name = "anchor-attribute-account" version = "0.24.2" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "anchor-syn 0.24.2", "anyhow", @@ -159,8 +178,7 @@ dependencies = [ [[package]] name = "anchor-attribute-account" version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c288d496168268d198d9b53ee9f4f9d260a55ba4df9877ea1d4486ad6109e0f" +source = "git+https://github.com/coral-xyz/anchor?rev=96ed3b791c6fed9ab64cb138397795fe55991280#96ed3b791c6fed9ab64cb138397795fe55991280" dependencies = [ "anchor-syn 0.30.1", "bs58 0.5.1", @@ -172,7 +190,7 @@ dependencies = [ [[package]] name = "anchor-attribute-constant" version = "0.24.2" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "anchor-syn 0.24.2", "proc-macro2 1.0.92", @@ -182,8 +200,7 @@ dependencies = [ [[package]] name = "anchor-attribute-constant" version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b77b6948d0eeaaa129ce79eea5bbbb9937375a9241d909ca8fb9e006bb6e90" +source = "git+https://github.com/coral-xyz/anchor?rev=96ed3b791c6fed9ab64cb138397795fe55991280#96ed3b791c6fed9ab64cb138397795fe55991280" dependencies = [ "anchor-syn 0.30.1", "quote 1.0.38", @@ -193,7 +210,7 @@ dependencies = [ [[package]] name = "anchor-attribute-error" version = "0.24.2" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "anchor-syn 0.24.2", "proc-macro2 1.0.92", @@ -204,8 +221,7 @@ dependencies = [ [[package]] name = "anchor-attribute-error" version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d20bb569c5a557c86101b944721d865e1fd0a4c67c381d31a44a84f07f84828" +source = "git+https://github.com/coral-xyz/anchor?rev=96ed3b791c6fed9ab64cb138397795fe55991280#96ed3b791c6fed9ab64cb138397795fe55991280" dependencies = [ "anchor-syn 0.30.1", "quote 1.0.38", @@ -215,7 +231,7 @@ dependencies = [ [[package]] name = "anchor-attribute-event" version = "0.24.2" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "anchor-syn 0.24.2", "anyhow", @@ -227,8 +243,7 @@ dependencies = [ [[package]] name = "anchor-attribute-event" version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cebd8d0671a3a9dc3160c48598d652c34c77de6be4d44345b8b514323284d57" +source = "git+https://github.com/coral-xyz/anchor?rev=96ed3b791c6fed9ab64cb138397795fe55991280#96ed3b791c6fed9ab64cb138397795fe55991280" dependencies = [ "anchor-syn 0.30.1", "proc-macro2 1.0.92", @@ -239,7 +254,7 @@ dependencies = [ [[package]] name = "anchor-attribute-interface" version = "0.24.2" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "anchor-syn 0.24.2", "anyhow", @@ -252,7 +267,7 @@ dependencies = [ [[package]] name = "anchor-attribute-program" version = "0.24.2" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "anchor-syn 0.24.2", "anyhow", @@ -264,8 +279,7 @@ dependencies = [ [[package]] name = "anchor-attribute-program" version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efb2a5eb0860e661ab31aff7bb5e0288357b176380e985bade4ccb395981b42d" +source = "git+https://github.com/coral-xyz/anchor?rev=96ed3b791c6fed9ab64cb138397795fe55991280#96ed3b791c6fed9ab64cb138397795fe55991280" dependencies = [ "anchor-lang-idl", "anchor-syn 0.30.1", @@ -281,7 +295,7 @@ dependencies = [ [[package]] name = "anchor-attribute-state" version = "0.24.2" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "anchor-syn 0.24.2", "anyhow", @@ -293,7 +307,7 @@ dependencies = [ [[package]] name = "anchor-derive-accounts" version = "0.24.2" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "anchor-syn 0.24.2", "anyhow", @@ -305,8 +319,7 @@ dependencies = [ [[package]] name = "anchor-derive-accounts" version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04368b5abef4266250ca8d1d12f4dff860242681e4ec22b885dcfe354fd35aa1" +source = "git+https://github.com/coral-xyz/anchor?rev=96ed3b791c6fed9ab64cb138397795fe55991280#96ed3b791c6fed9ab64cb138397795fe55991280" dependencies = [ "anchor-syn 0.30.1", "quote 1.0.38", @@ -316,8 +329,7 @@ dependencies = [ [[package]] name = "anchor-derive-serde" version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0bb0e0911ad4a70cab880cdd6287fe1e880a1a9d8e4e6defa8e9044b9796a6c" +source = "git+https://github.com/coral-xyz/anchor?rev=96ed3b791c6fed9ab64cb138397795fe55991280#96ed3b791c6fed9ab64cb138397795fe55991280" dependencies = [ "anchor-syn 0.30.1", "borsh-derive-internal 0.10.4", @@ -329,8 +341,7 @@ dependencies = [ [[package]] name = "anchor-derive-space" version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef415ff156dc82e9ecb943189b0cb241b3a6bfc26a180234dc21bd3ef3ce0cb" +source = "git+https://github.com/coral-xyz/anchor?rev=96ed3b791c6fed9ab64cb138397795fe55991280#96ed3b791c6fed9ab64cb138397795fe55991280" dependencies = [ "proc-macro2 1.0.92", "quote 1.0.38", @@ -340,7 +351,7 @@ dependencies = [ [[package]] name = "anchor-lang" version = "0.24.2" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "anchor-attribute-access-control 0.24.2", "anchor-attribute-account 0.24.2", @@ -363,8 +374,7 @@ dependencies = [ [[package]] name = "anchor-lang" version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6620c9486d9d36a4389cab5e37dc34a42ed0bfaa62e6a75a2999ce98f8f2e373" +source = "git+https://github.com/coral-xyz/anchor?rev=96ed3b791c6fed9ab64cb138397795fe55991280#96ed3b791c6fed9ab64cb138397795fe55991280" dependencies = [ "anchor-attribute-access-control 0.30.1", "anchor-attribute-account 0.30.1", @@ -376,12 +386,10 @@ dependencies = [ "anchor-derive-serde", "anchor-derive-space", "anchor-lang-idl", - "arrayref", "base64 0.21.7", "bincode", "borsh 0.10.4", "bytemuck", - "getrandom 0.2.15", "solana-program", "thiserror 1.0.69", ] @@ -389,8 +397,7 @@ dependencies = [ [[package]] name = "anchor-lang-idl" version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31cf97b4e6f7d6144a05e435660fcf757dbc3446d38d0e2b851d11ed13625bba" +source = "git+https://github.com/coral-xyz/anchor?rev=96ed3b791c6fed9ab64cb138397795fe55991280#96ed3b791c6fed9ab64cb138397795fe55991280" dependencies = [ "anchor-lang-idl-spec", "anyhow", @@ -404,8 +411,7 @@ dependencies = [ [[package]] name = "anchor-lang-idl-spec" version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bdf143115440fe621bdac3a29a1f7472e09f6cd82b2aa569429a0c13f103838" +source = "git+https://github.com/coral-xyz/anchor?rev=96ed3b791c6fed9ab64cb138397795fe55991280#96ed3b791c6fed9ab64cb138397795fe55991280" dependencies = [ "anyhow", "serde", @@ -414,7 +420,7 @@ dependencies = [ [[package]] name = "anchor-syn" version = "0.24.2" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "anyhow", "bs58 0.3.1", @@ -432,8 +438,7 @@ dependencies = [ [[package]] name = "anchor-syn" version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f99daacb53b55cfd37ce14d6c9905929721137fd4c67bbab44a19802aecb622f" +source = "git+https://github.com/coral-xyz/anchor?rev=96ed3b791c6fed9ab64cb138397795fe55991280#96ed3b791c6fed9ab64cb138397795fe55991280" dependencies = [ "anyhow", "bs58 0.5.1", @@ -743,7 +748,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" dependencies = [ "concurrent-queue", - "event-listener", + "event-listener 2.5.3", "futures-core", ] @@ -762,12 +767,14 @@ dependencies = [ ] [[package]] -name = "async-mutex" -version = "1.4.0" +name = "async-lock" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener", + "event-listener 5.4.0", + "event-listener-strategy", + "pin-project-lite", ] [[package]] @@ -794,15 +801,21 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2 1.0.92", "quote 1.0.38", "syn 2.0.93", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "atty" version = "0.2.14" @@ -836,13 +849,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ "async-trait", - "axum-core", + "axum-core 0.3.4", "bitflags 1.3.2", "bytes", "futures-util", - "http", - "http-body", - "hyper", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding 2.3.1", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper 0.1.2", + "tower 0.4.13", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core 0.4.5", + "bytes", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "http-body-util", "itoa", "matchit", "memchr", @@ -851,8 +891,8 @@ dependencies = [ "pin-project-lite", "rustversion", "serde", - "sync_wrapper", - "tower", + "sync_wrapper 1.0.2", + "tower 0.5.2", "tower-layer", "tower-service", ] @@ -866,10 +906,30 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http", - "http-body", + "http 0.2.12", + "http-body 0.4.6", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "http-body-util", "mime", + "pin-project-lite", "rustversion", + "sync_wrapper 1.0.2", "tower-layer", "tower-service", ] @@ -933,12 +993,6 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - [[package]] name = "bincode" version = "1.3.3" @@ -950,25 +1004,39 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.65.1" +version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "cexpr", "clang-sys", + "itertools 0.11.0", "lazy_static", "lazycell", - "peeking_take_while", - "prettyplease 0.2.25", "proc-macro2 1.0.92", "quote 1.0.38", "regex", - "rustc-hash", + "rustc-hash 1.1.0", "shlex", "syn 2.0.93", ] +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + [[package]] name = "bitflags" version = "1.3.2" @@ -1025,7 +1093,6 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "block-padding", "generic-array", ] @@ -1038,12 +1105,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - [[package]] name = "borsh" version = "0.9.3" @@ -1341,6 +1402,12 @@ dependencies = [ "shlex", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + [[package]] name = "cexpr" version = "0.6.0" @@ -1368,6 +1435,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "cfg_eval" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" +dependencies = [ + "proc-macro2 1.0.92", + "quote 1.0.38", + "syn 2.0.93", +] + [[package]] name = "chrono" version = "0.4.39" @@ -1394,11 +1472,12 @@ dependencies = [ [[package]] name = "cipher" -version = "0.3.0" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "generic-array", + "crypto-common", + "inout", ] [[package]] @@ -1422,27 +1501,11 @@ dependencies = [ "atty", "bitflags 1.3.2", "strsim 0.8.0", - "textwrap 0.11.0", + "textwrap", "unicode-width 0.1.14", "vec_map", ] -[[package]] -name = "clap" -version = "3.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" -dependencies = [ - "atty", - "bitflags 1.3.2", - "clap_lex 0.2.4", - "indexmap 1.9.3", - "once_cell", - "strsim 0.10.0", - "termcolor", - "textwrap 0.16.1", -] - [[package]] name = "clap" version = "4.5.23" @@ -1470,7 +1533,7 @@ checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", - "clap_lex 0.7.4", + "clap_lex", "strsim 0.11.1", ] @@ -1486,15 +1549,6 @@ dependencies = [ "syn 2.0.93", ] -[[package]] -name = "clap_lex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", -] - [[package]] name = "clap_lex" version = "0.7.4" @@ -1520,6 +1574,16 @@ dependencies = [ "unreachable", ] +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -1562,17 +1626,11 @@ dependencies = [ "web-sys", ] -[[package]] -name = "const-oid" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" - [[package]] name = "const_str_to_pubkey" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279a4314e755fb311d9e2dd6503fdc023f9c833ddceb158565b95b9323f5fd10" +checksum = "006755890506a0f9a96a6e7a076deeb70cc6621817e5d22a8f838435369f244f" dependencies = [ "solana-program", ] @@ -1599,6 +1657,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -1682,6 +1750,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", + "rand_core 0.6.4", "typenum", ] @@ -1697,27 +1766,55 @@ dependencies = [ [[package]] name = "ctr" -version = "0.8.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" dependencies = [ "cipher", ] [[package]] name = "curve25519-dalek" -version = "3.2.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" dependencies = [ "byteorder", "digest 0.9.0", "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rand_core 0.6.4", + "rustc_version", "serde", "subtle", "zeroize", ] +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2 1.0.92", + "quote 1.0.38", + "syn 2.0.93", +] + [[package]] name = "darling" version = "0.20.10" @@ -1798,15 +1895,6 @@ dependencies = [ "syn 0.15.44", ] -[[package]] -name = "der" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" -dependencies = [ - "const-oid", -] - [[package]] name = "der-parser" version = "8.2.0" @@ -2016,7 +2104,7 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" dependencies = [ - "curve25519-dalek", + "curve25519-dalek 3.2.0", "ed25519", "rand 0.7.3", "serde", @@ -2042,12 +2130,24 @@ version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" dependencies = [ - "enum-ordinalize", + "enum-ordinalize 3.1.15", "proc-macro2 1.0.92", "quote 1.0.38", "syn 1.0.109", ] +[[package]] +name = "educe" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4bd92664bf78c4d3dba9b7cdafce6fa15b13ed3ed16175218196942e99168a8" +dependencies = [ + "enum-ordinalize 4.3.0", + "proc-macro2 1.0.92", + "quote 1.0.38", + "syn 2.0.93", +] + [[package]] name = "either" version = "1.13.0" @@ -2056,23 +2156,57 @@ checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "ellipsis-client" -version = "0.1.8" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74237efb5d021b94b097fce88b20a6696190c74c458cfa26ea557ea172f55e4a" +checksum = "767cb4c8e43e60dc99761a4849a7c6b6af5e5b08b75e32e1a298ade7cf34ccb2" dependencies = [ "anyhow", + "assert_matches", "async-trait", + "backoff", + "base64 0.22.1", "bincode", - "bs58 0.4.0", - "itertools 0.10.5", - "solana-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-logger 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "borsh 0.10.4", + "bs58 0.5.1", + "chrono-humanize", + "crossbeam-channel", + "ellipsis-transaction-utils", + "futures 0.3.31", + "itertools 0.14.0", + "lazy_static", + "log", + "serde", + "solana-banks-client", + "solana-bpf-loader-program", + "solana-client", + "solana-logger", "solana-program", - "solana-program-test 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-program-runtime", + "solana-runtime", "solana-sdk", + "solana-send-transaction-service", "solana-transaction-status", - "thiserror 1.0.69", + "solana-vote-program", + "tarpc 0.35.0", + "thiserror 2.0.11", "tokio", + "tokio-serde 0.9.0", + "tracing", + "yellowstone-grpc-client", + "yellowstone-grpc-proto", +] + +[[package]] +name = "ellipsis-transaction-utils" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "485f9b2d217e8789d483d1e07ed5b8dfe9876d116e8d0d8c9b5af031a6d90918" +dependencies = [ + "bs58 0.5.1", + "itertools 0.14.0", + "serde", + "solana-sdk", + "solana-transaction-status", ] [[package]] @@ -2123,6 +2257,26 @@ dependencies = [ "syn 2.0.93", ] +[[package]] +name = "enum-ordinalize" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +dependencies = [ + "proc-macro2 1.0.92", + "quote 1.0.38", + "syn 2.0.93", +] + [[package]] name = "env_logger" version = "0.9.3" @@ -2190,13 +2344,13 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4b0ea5ef6dc2388a4b1669fa32097249bc03a15417b97cb75e38afb309e4a89" dependencies = [ - "http", + "http 0.2.12", "prost 0.11.9", "tokio", "tokio-stream", - "tonic", - "tonic-build", - "tower", + "tonic 0.9.2", + "tonic-build 0.9.2", + "tower 0.4.13", "tower-service", ] @@ -2207,19 +2361,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] -name = "fast-math" -version = "0.1.1" +name = "event-listener" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2465292146cdfc2011350fe3b1c616ac83cf0faeedb33463ba1c332ed8948d66" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" dependencies = [ - "ieee754", + "concurrent-queue", + "parking", + "pin-project-lite", ] [[package]] -name = "fastrand" -version = "2.3.0" +name = "event-listener-strategy" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +dependencies = [ + "event-listener 5.4.0", + "pin-project-lite", +] + +[[package]] +name = "fast-math" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2465292146cdfc2011350fe3b1c616ac83cf0faeedb33463ba1c332ed8948d66" +dependencies = [ + "ieee754", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "feature-probe" @@ -2227,6 +2402,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + [[package]] name = "filetime" version = "0.2.25" @@ -2239,6 +2420,21 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "five8_const" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b4f62f0f8ca357f93ae90c8c2dd1041a1f665fde2f889ea9b1787903829015" +dependencies = [ + "five8_core", +] + +[[package]] +name = "five8_core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94474d15a76982be62ca8a39570dccce148d98c238ebb7408b0a21b2c4bdddc4" + [[package]] name = "fixedbitset" version = "0.4.2" @@ -2270,6 +2466,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + [[package]] name = "foreign-types" version = "0.3.2" @@ -2390,6 +2592,12 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" + [[package]] name = "futures-util" version = "0.3.31" @@ -2501,14 +2709,23 @@ dependencies = [ ] [[package]] -name = "goblin" -version = "0.5.4" +name = "governor" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7666983ed0dd8d21a6f6576ee00053ca0926fb281a5522577a4dbd0f1b54143" +checksum = "68a7f542ee6b35af73b06abc0dad1c1bae89964e4e253bc4b587b91c9637867b" dependencies = [ - "log", - "plain", - "scroll", + "cfg-if 1.0.0", + "dashmap 5.5.3", + "futures 0.3.31", + "futures-timer", + "no-std-compat", + "nonzero_ext", + "parking_lot 0.12.3", + "portable-atomic", + "quanta", + "rand 0.8.5", + "smallvec", + "spinning_top", ] [[package]] @@ -2522,7 +2739,26 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.12", + "indexmap 2.7.0", + "slab", + "tokio", + "tokio-util 0.7.13", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.2.0", "indexmap 2.7.0", "slab", "tokio", @@ -2577,6 +2813,11 @@ name = "hashbrown" version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] name = "headers" @@ -2587,7 +2828,7 @@ dependencies = [ "base64 0.21.7", "bytes", "headers-core", - "http", + "http 0.2.12", "httpdate", "mime", "sha1", @@ -2599,7 +2840,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" dependencies = [ - "http", + "http 0.2.12", ] [[package]] @@ -2709,6 +2950,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" version = "0.4.6" @@ -2716,7 +2968,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.2.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", "pin-project-lite", ] @@ -2748,9 +3023,9 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", "itoa", @@ -2762,6 +3037,27 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.7", + "http 1.2.0", + "http-body 1.0.1", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-proxy" version = "0.9.1" @@ -2771,8 +3067,8 @@ dependencies = [ "bytes", "futures 0.3.31", "headers", - "http", - "hyper", + "http 0.2.12", + "hyper 0.14.32", "hyper-tls", "native-tls", "tokio", @@ -2787,11 +3083,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", - "http", - "hyper", - "rustls", + "http 0.2.12", + "hyper 0.14.32", + "rustls 0.21.12", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", ] [[package]] @@ -2800,12 +3096,25 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper", + "hyper 0.14.32", "pin-project-lite", "tokio", "tokio-io-timeout", ] +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper 1.6.0", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + [[package]] name = "hyper-tls" version = "0.5.0" @@ -2813,12 +3122,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper", + "hyper 0.14.32", "native-tls", "tokio", "tokio-native-tls", ] +[[package]] +name = "hyper-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "hyper 1.6.0", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + [[package]] name = "iana-time-zone" version = "0.1.61" @@ -3081,6 +3409,15 @@ dependencies = [ "web-time", ] +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + [[package]] name = "instant" version = "0.1.13" @@ -3131,6 +3468,24 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.14" @@ -3140,7 +3495,6 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jito-account-traits-derive" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ "proc-macro2 1.0.92", "quote 1.0.38", @@ -3150,7 +3504,6 @@ dependencies = [ [[package]] name = "jito-bytemuck" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ "borsh 0.10.4", "bytemuck", @@ -3161,23 +3514,22 @@ dependencies = [ [[package]] name = "jito-jsm-core" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ "borsh 0.10.4", "bytemuck", "jito-bytemuck", "shank", "solana-program", - "spl-associated-token-account", - "spl-token 4.0.0", - "spl-token-2022 3.0.5", + "spl-associated-token-account 6.0.0", + "spl-token 7.0.0", + "spl-token-2022 7.0.0", "thiserror 1.0.69", ] [[package]] name = "jito-programs-vote-state" version = "0.1.5" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "anchor-lang 0.24.2", "bincode", @@ -3188,29 +3540,28 @@ dependencies = [ [[package]] name = "jito-protos" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "bytes", "prost 0.11.9", - "prost-types", + "prost-types 0.11.9", "protobuf-src", - "tonic", - "tonic-build", + "tonic 0.9.2", + "tonic-build 0.9.2", ] [[package]] name = "jito-restaking-client" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ "anchor-lang 0.30.1", "borsh 0.10.4", "bytemuck", - "num-derive 0.4.2", + "num-derive", "num-traits", "serde", - "serde_with 3.12.0", + "serde_with", "solana-program", "solana-sdk", "thiserror 1.0.69", @@ -3219,7 +3570,6 @@ dependencies = [ [[package]] name = "jito-restaking-core" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ "borsh 0.10.4", "bytemuck", @@ -3228,19 +3578,17 @@ dependencies = [ "jito-restaking-sdk", "shank", "solana-program", - "spl-associated-token-account", - "spl-token 4.0.0", + "spl-associated-token-account 6.0.0", + "spl-token 7.0.0", "thiserror 1.0.69", ] [[package]] name = "jito-restaking-program" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ "borsh 0.10.4", "cfg-if 1.0.0", - "const_str_to_pubkey", "jito-bytemuck", "jito-jsm-core", "jito-restaking-core", @@ -3249,16 +3597,15 @@ dependencies = [ "shank", "solana-program", "solana-security-txt", - "spl-associated-token-account", - "spl-token 4.0.0", - "spl-token-2022 3.0.5", + "spl-associated-token-account 6.0.0", + "spl-token 7.0.0", + "spl-token-2022 7.0.0", "thiserror 1.0.69", ] [[package]] name = "jito-restaking-sdk" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ "borsh 0.10.4", "shank", @@ -3269,7 +3616,7 @@ dependencies = [ [[package]] name = "jito-tip-distribution" version = "0.1.5" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "anchor-lang 0.24.2", "default-env", @@ -3288,7 +3635,7 @@ dependencies = [ [[package]] name = "jito-tip-payment" version = "0.1.5" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "anchor-lang 0.24.2", "default-env", @@ -3331,16 +3678,16 @@ dependencies = [ "jito-vault-program", "jito-vault-sdk", "log", - "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-account-decoder", + "solana-client", + "solana-metrics", "solana-program", "solana-rpc-client", "solana-sdk", "solana-transaction-status", - "spl-associated-token-account", + "spl-associated-token-account 6.0.0", "spl-stake-pool", - "spl-token 4.0.0", + "spl-token 7.0.0", "switchboard-on-demand-client", "thiserror 1.0.69", "tokio", @@ -3353,11 +3700,11 @@ dependencies = [ "anchor-lang 0.30.1", "borsh 0.10.4", "bytemuck", - "num-derive 0.4.2", + "num-derive", "num-traits", "serde", "serde-big-array", - "serde_with 3.12.0", + "serde_with", "solana-program", "solana-sdk", "thiserror 1.0.69", @@ -3379,12 +3726,12 @@ dependencies = [ "jito-vault-sdk", "meta-merkle-tree", "serde", - "serde_with 3.12.0", + "serde_with", "shank", "solana-program", - "spl-associated-token-account", + "spl-associated-token-account 6.0.0", "spl-math", - "spl-token 4.0.0", + "spl-token 7.0.0", "thiserror 1.0.69", ] @@ -3411,12 +3758,12 @@ dependencies = [ "meta-merkle-tree", "shank", "solana-program", - "solana-program-test 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-program-test", "solana-sdk", "solana-security-txt", - "spl-associated-token-account", + "spl-associated-token-account 6.0.0", "spl-stake-pool", - "spl-token 4.0.0", + "spl-token 7.0.0", "thiserror 1.0.69", "tokio", ] @@ -3443,9 +3790,9 @@ dependencies = [ "shank", "solana-program", "solana-security-txt", - "spl-associated-token-account", + "spl-associated-token-account 6.0.0", "spl-stake-pool", - "spl-token 4.0.0", + "spl-token 7.0.0", "switchboard-on-demand", "thiserror 1.0.69", ] @@ -3466,15 +3813,14 @@ dependencies = [ [[package]] name = "jito-vault-client" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ "anchor-lang 0.30.1", "borsh 0.10.4", "bytemuck", - "num-derive 0.4.2", + "num-derive", "num-traits", "serde", - "serde_with 3.12.0", + "serde_with", "solana-program", "solana-sdk", "thiserror 1.0.69", @@ -3483,7 +3829,6 @@ dependencies = [ [[package]] name = "jito-vault-core" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ "borsh 0.10.4", "bytemuck", @@ -3492,20 +3837,18 @@ dependencies = [ "jito-vault-sdk", "shank", "solana-program", - "spl-associated-token-account", - "spl-token 4.0.0", - "spl-token-2022 3.0.5", + "spl-associated-token-account 6.0.0", + "spl-token 7.0.0", + "spl-token-2022 7.0.0", "thiserror 1.0.69", ] [[package]] name = "jito-vault-program" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ "borsh 0.10.4", "cfg-if 1.0.0", - "const_str_to_pubkey", "jito-bytemuck", "jito-jsm-core", "jito-restaking-core", @@ -3514,24 +3857,44 @@ dependencies = [ "shank", "solana-program", "solana-security-txt", - "spl-associated-token-account", - "spl-token 4.0.0", - "spl-token-2022 3.0.5", + "spl-associated-token-account 6.0.0", + "spl-token 7.0.0", + "spl-token-2022 7.0.0", "thiserror 1.0.69", ] [[package]] name = "jito-vault-sdk" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking.git?rev=eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d#eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" dependencies = [ "borsh 0.10.4", "shank", "solana-program", - "spl-token 4.0.0", + "spl-associated-token-account 6.0.0", + "spl-token 7.0.0", + "thiserror 1.0.69", +] + +[[package]] +name = "jni" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +dependencies = [ + "cesu8", + "combine 4.6.7", + "jni-sys", + "log", "thiserror 1.0.69", + "walkdir", ] +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + [[package]] name = "jobserver" version = "0.1.32" @@ -3625,7 +3988,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1dea6e07251d9ce6a552abfb5d7ad6bc290a4596c8dcc3d795fae2bbdc1f3ff" dependencies = [ "futures 0.3.31", - "hyper", + "hyper 0.14.32", "jsonrpc-core", "jsonrpc-server-utils", "log", @@ -3701,6 +4064,15 @@ dependencies = [ "winapi-build", ] +[[package]] +name = "lazy-lru" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a35523c6dfa972e1fd19132ef647eff4360a6546c6271807e1327ca6e8797f96" +dependencies = [ + "hashbrown 0.15.2", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -3758,9 +4130,9 @@ dependencies = [ [[package]] name = "librocksdb-sys" -version = "0.11.0+8.1.1" +version = "0.16.0+8.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3386f101bcb4bd252d8e9d2fb41ec3b0862a15a62b478c355b2982efa469e3e" +checksum = "ce3d60bc059831dc1c83903fb45c103f75db65c5a7bf22272764d9cc683e348c" dependencies = [ "bindgen", "bzip2-sys", @@ -3976,15 +4348,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.9.1" @@ -4030,9 +4393,9 @@ dependencies = [ "shank", "solana-program", "solana-sdk", - "spl-associated-token-account", + "spl-associated-token-account 6.0.0", "spl-math", - "spl-token 4.0.0", + "spl-token 7.0.0", "thiserror 1.0.69", ] @@ -4042,6 +4405,16 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "min-max-heap" version = "1.3.0" @@ -4140,7 +4513,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] @@ -4158,17 +4531,23 @@ dependencies = [ [[package]] name = "nix" -version = "0.26.4" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "cfg-if 1.0.0", + "cfg_aliases", "libc", - "memoffset 0.7.1", - "pin-utils", + "memoffset", ] +[[package]] +name = "no-std-compat" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" + [[package]] name = "nom" version = "7.1.3" @@ -4179,6 +4558,12 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nonzero_ext" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" + [[package]] name = "normalize-line-endings" version = "0.3.0" @@ -4192,24 +4577,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" dependencies = [ "num-bigint 0.2.6", - "num-complex 0.2.4", - "num-integer", - "num-iter", - "num-rational 0.2.4", - "num-traits", -] - -[[package]] -name = "num" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" -dependencies = [ - "num-bigint 0.4.6", - "num-complex 0.4.6", + "num-complex", "num-integer", "num-iter", - "num-rational 0.4.2", + "num-rational", "num-traits", ] @@ -4244,32 +4615,12 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", -] - [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" -[[package]] -name = "num-derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" -dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", - "syn 1.0.109", -] - [[package]] name = "num-derive" version = "0.4.2" @@ -4313,17 +4664,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint 0.4.6", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -4345,60 +4685,18 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.5.11" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ - "num_enum_derive 0.5.11", + "num_enum_derive", ] [[package]] -name = "num_enum" -version = "0.6.1" +name = "num_enum_derive" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" -dependencies = [ - "num_enum_derive 0.6.1", -] - -[[package]] -name = "num_enum" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" -dependencies = [ - "num_enum_derive 0.7.3", -] - -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2 1.0.92", - "quote 1.0.38", - "syn 1.0.109", -] - -[[package]] -name = "num_enum_derive" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2 1.0.92", - "quote 1.0.38", - "syn 2.0.93", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2 1.0.92", @@ -4516,32 +4814,40 @@ dependencies = [ ] [[package]] -name = "os_str_bytes" -version = "6.6.1" +name = "opentelemetry" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" +checksum = "570074cc999d1a58184080966e5bd3bf3a9a4af650c3b05047c2621e7405cd17" +dependencies = [ + "futures-core", + "futures-sink", + "js-sys", + "once_cell", + "pin-project-lite", + "thiserror 1.0.69", +] [[package]] -name = "ouroboros" -version = "0.15.6" +name = "opentelemetry-semantic-conventions" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1358bd1558bd2a083fed428ffeda486fbfb323e698cdda7794259d592ca72db" -dependencies = [ - "aliasable", - "ouroboros_macro", -] +checksum = "1cefe0543875379e47eb5f1e68ff83f45cc41366a92dfd0d073d513bf68e9a05" [[package]] -name = "ouroboros_macro" -version = "0.15.6" +name = "opentelemetry_sdk" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7" +checksum = "d2c627d9f4c9cdc1f21a29ee4bfbd6028fcb8bcf2a857b43f3abdf72c9c862f3" dependencies = [ - "Inflector", - "proc-macro-error", - "proc-macro2 1.0.92", - "quote 1.0.38", - "syn 1.0.109", + "async-trait", + "futures-channel", + "futures-executor", + "futures-util", + "once_cell", + "opentelemetry 0.26.0", + "percent-encoding 2.3.1", + "rand 0.8.5", + "thiserror 1.0.69", ] [[package]] @@ -4558,6 +4864,12 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.11.2" @@ -4640,12 +4952,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - [[package]] name = "pem" version = "1.1.1" @@ -4673,7 +4979,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" dependencies = [ - "num 0.2.1", + "num", ] [[package]] @@ -4763,34 +5069,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "pkcs8" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" -dependencies = [ - "der", - "spki", - "zeroize", -] - [[package]] name = "pkg-config" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" -[[package]] -name = "plain" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" - [[package]] name = "polyval" -version = "0.5.3" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" dependencies = [ "cfg-if 1.0.0", "cpufeatures", @@ -4871,9 +5160,12 @@ dependencies = [ [[package]] name = "prio-graph" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6492a75ca57066a4479af45efa302bed448680182b0563f96300645d5f896097" +checksum = "2f28921629370a46cf564f6ba1828bd8d1c97f7fad4ee9d1c6438f92feed6b8d" +dependencies = [ + "ahash 0.8.11", +] [[package]] name = "proc-macro-crate" @@ -4884,23 +5176,13 @@ dependencies = [ "toml 0.5.11", ] -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - [[package]] name = "proc-macro-crate" version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.22.22", + "toml_edit", ] [[package]] @@ -4958,6 +5240,26 @@ dependencies = [ "yansi", ] +[[package]] +name = "proptest" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.6.0", + "lazy_static", + "num-traits", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + [[package]] name = "prost" version = "0.11.9" @@ -4993,13 +5295,33 @@ dependencies = [ "petgraph", "prettyplease 0.1.25", "prost 0.11.9", - "prost-types", + "prost-types 0.11.9", "regex", "syn 1.0.109", "tempfile", "which", ] +[[package]] +name = "prost-build" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f3e5beed80eb580c68e2c600937ac2c4eedabdfd5ef1e5b7ea4f3fba84497b" +dependencies = [ + "heck 0.5.0", + "itertools 0.11.0", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease 0.2.25", + "prost 0.13.4", + "prost-types 0.13.4", + "regex", + "syn 2.0.93", + "tempfile", +] + [[package]] name = "prost-derive" version = "0.11.9" @@ -5035,6 +5357,15 @@ dependencies = [ "prost 0.11.9", ] +[[package]] +name = "prost-types" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2f1e56baa61e93533aebc21af4d2134b70f66275e0fcdf3cbe43d77ff7e8fc" +dependencies = [ + "prost 0.13.4", +] + [[package]] name = "protobuf-src" version = "1.1.0+21.5" @@ -5084,52 +5415,78 @@ dependencies = [ "syn 2.0.93", ] +[[package]] +name = "quanta" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bd1fe6824cea6538803de3ff1bc0cf3949024db3d43c9643024bfb33a807c0e" +dependencies = [ + "crossbeam-utils", + "libc", + "once_cell", + "raw-cpuid", + "wasi 0.11.0+wasi-snapshot-preview1", + "web-sys", + "winapi 0.3.9", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quinn" -version = "0.10.2" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" dependencies = [ "bytes", "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash", - "rustls", - "thiserror 1.0.69", + "rustc-hash 2.1.1", + "rustls 0.23.22", + "socket2", + "thiserror 2.0.11", "tokio", "tracing", ] [[package]] name = "quinn-proto" -version = "0.10.6" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", + "getrandom 0.2.15", "rand 0.8.5", - "ring 0.16.20", - "rustc-hash", - "rustls", - "rustls-native-certs", + "ring", + "rustc-hash 2.1.1", + "rustls 0.23.22", + "rustls-pki-types", + "rustls-platform-verifier", "slab", - "thiserror 1.0.69", + "thiserror 2.0.11", "tinyvec", "tracing", + "web-time", ] [[package]] name = "quinn-udp" -version = "0.4.1" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" +checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" dependencies = [ - "bytes", + "cfg_aliases", "libc", + "once_cell", "socket2", "tracing", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -5227,6 +5584,15 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "rand_xoshiro" version = "0.6.0" @@ -5236,6 +5602,15 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "raw-cpuid" +version = "11.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6928fa44c097620b706542d428957635951bade7143269085389d42c8a4927e" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "rayon" version = "1.10.0" @@ -5256,18 +5631,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "rcgen" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" -dependencies = [ - "pem", - "ring 0.16.20", - "time", - "yasna", -] - [[package]] name = "redox_syscall" version = "0.2.16" @@ -5309,7 +5672,7 @@ dependencies = [ "lru", "parking_lot 0.11.2", "smallvec", - "spin 0.9.8", + "spin", ] [[package]] @@ -5362,30 +5725,31 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", "hyper-rustls", "hyper-tls", "ipnet", "js-sys", "log", "mime", + "mime_guess", "native-tls", "once_cell", "percent-encoding 2.3.1", "pin-project-lite", - "rustls", - "rustls-pemfile", + "rustls 0.21.12", + "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "system-configuration", "tokio", "tokio-native-tls", - "tokio-rustls", + "tokio-rustls 0.24.1", "tokio-util 0.7.13", "tower-service", "url 2.5.4", @@ -5397,18 +5761,18 @@ dependencies = [ ] [[package]] -name = "ring" -version = "0.16.20" +name = "reqwest-middleware" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +checksum = "5a735987236a8e238bf0296c7e351b999c188ccc11477f311b82b55c93984216" dependencies = [ - "cc", - "libc", - "once_cell", - "spin 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi 0.3.9", + "anyhow", + "async-trait", + "http 0.2.12", + "reqwest", + "serde", + "task-local-extensions", + "thiserror 1.0.69", ] [[package]] @@ -5421,8 +5785,8 @@ dependencies = [ "cfg-if 1.0.0", "getrandom 0.2.15", "libc", - "spin 0.9.8", - "untrusted 0.9.0", + "spin", + "untrusted", "windows-sys 0.52.0", ] @@ -5457,9 +5821,9 @@ dependencies = [ [[package]] name = "rocksdb" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb6f170a4041d50a0ce04b0d2e14916d6ca863ea2e422689a5b694395d299ffe" +checksum = "6bd13e55d6d7b8cd0ea569161127567cd587676c99f4472f779a0279aa60a7a7" dependencies = [ "libc", "librocksdb-sys", @@ -5523,6 +5887,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + [[package]] name = "rustc_version" version = "0.4.1" @@ -5561,21 +5931,49 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", - "ring 0.17.8", - "rustls-webpki", + "ring", + "rustls-webpki 0.101.7", "sct", ] +[[package]] +name = "rustls" +version = "0.23.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9263ab4eb695e42321db096e3b8fbd715a59b154d5c88d82db2175b681ba7" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki 0.102.8", + "subtle", + "zeroize", +] + [[package]] name = "rustls-native-certs" -version = "0.6.3" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" dependencies = [ "openssl-probe", - "rustls-pemfile", + "rustls-pemfile 2.2.0", + "rustls-pki-types", "schannel", - "security-framework", + "security-framework 2.11.1", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework 3.2.0", ] [[package]] @@ -5588,79 +5986,133 @@ dependencies = [ ] [[package]] -name = "rustls-webpki" -version = "0.101.7" +name = "rustls-pemfile" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "ring 0.17.8", - "untrusted 0.9.0", + "rustls-pki-types", ] [[package]] -name = "rustversion" -version = "1.0.19" +name = "rustls-pki-types" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +dependencies = [ + "web-time", +] [[package]] -name = "ryu" -version = "1.0.18" +name = "rustls-platform-verifier" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "a4c7dc240fec5517e6c4eab3310438636cfe6391dfc345ba013109909a90d136" +dependencies = [ + "core-foundation 0.9.4", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls 0.23.22", + "rustls-native-certs 0.7.3", + "rustls-platform-verifier-android", + "rustls-webpki 0.102.8", + "security-framework 2.11.1", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.52.0", +] [[package]] -name = "same-file" -version = "1.0.6" +name = "rustls-platform-verifier-android" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "winapi-util", + "ring", + "untrusted", ] [[package]] -name = "schannel" -version = "0.1.27" +name = "rustls-webpki" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ - "windows-sys 0.59.0", + "ring", + "rustls-pki-types", + "untrusted", ] [[package]] -name = "scopeguard" -version = "1.2.0" +name = "rustversion" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] -name = "scroll" -version = "0.11.0" +name = "rusty-fork" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" dependencies = [ - "scroll_derive", + "fnv", + "quick-error", + "tempfile", + "wait-timeout", ] [[package]] -name = "scroll_derive" -version = "0.11.1" +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "same-file" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", - "syn 2.0.93", + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", ] +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" + [[package]] name = "sct" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.8", - "untrusted 0.9.0", + "ring", + "untrusted", ] [[package]] @@ -5676,7 +6128,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.6.0", - "core-foundation", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "num-bigint 0.4.6", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.6.0", + "core-foundation 0.10.0", "core-foundation-sys", "libc", "security-framework-sys", @@ -5684,9 +6150,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -5787,16 +6253,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_with" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" -dependencies = [ - "serde", - "serde_with_macros 2.3.3", -] - [[package]] name = "serde_with" version = "3.12.0" @@ -5811,22 +6267,10 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "serde_with_macros 3.12.0", + "serde_with_macros", "time", ] -[[package]] -name = "serde_with_macros" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" -dependencies = [ - "darling", - "proc-macro2 1.0.92", - "quote 1.0.38", - "syn 2.0.93", -] - [[package]] name = "serde_with_macros" version = "3.12.0" @@ -5900,18 +6344,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha3" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" -dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "keccak", - "opaque-debug", -] - [[package]] name = "sha3" version = "0.10.8" @@ -6121,171 +6553,112 @@ dependencies = [ "sha-1", ] +[[package]] +name = "solana-account" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "bincode", + "qualifier_attr", + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction", + "solana-program", +] + [[package]] name = "solana-account-decoder" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b109fd3a106e079005167e5b0e6f6d2c88bbedec32530837b584791a8b5abf36" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "Inflector", - "base64 0.21.7", + "base64 0.22.1", "bincode", - "bs58 0.4.0", + "bs58 0.5.1", "bv", "lazy_static", "serde", "serde_derive", "serde_json", - "solana-config-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-account-decoder-client-types", + "solana-config-program", "solana-sdk", - "spl-token 4.0.0", - "spl-token-2022 1.0.0", - "spl-token-group-interface 0.1.0", - "spl-token-metadata-interface 0.2.0", + "spl-token 6.0.0", + "spl-token-2022 4.0.0", + "spl-token-group-interface 0.3.0", + "spl-token-metadata-interface 0.4.0", "thiserror 1.0.69", "zstd", ] [[package]] -name = "solana-account-decoder" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +name = "solana-account-decoder-client-types" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "Inflector", - "base64 0.21.7", - "bincode", - "bs58 0.4.0", - "bv", - "lazy_static", + "base64 0.22.1", + "bs58 0.5.1", "serde", "serde_derive", "serde_json", - "solana-config-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", - "spl-token 4.0.0", - "spl-token-2022 1.0.0", - "spl-token-group-interface 0.1.0", - "spl-token-metadata-interface 0.2.0", - "thiserror 1.0.69", + "solana-account", + "solana-pubkey", "zstd", ] [[package]] -name = "solana-accounts-db" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec9829d10d521f3ed5e50c12d2b62784e2901aa484a92c2aa3924151da046139" +name = "solana-account-info" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "arrayref", "bincode", - "blake3", - "bv", - "bytemuck", - "byteorder", - "bzip2", - "crossbeam-channel", - "dashmap 5.5.3", - "flate2", - "fnv", - "im", - "index_list", - "itertools 0.10.5", - "lazy_static", - "log", - "lz4", - "memmap2", - "modular-bitfield", - "num-derive 0.4.2", - "num-traits", - "num_cpus", - "num_enum 0.7.3", - "ouroboros", - "percentage", - "qualifier_attr", - "rand 0.8.5", - "rayon", - "regex", - "rustc_version", - "seqlock", "serde", - "serde_derive", - "smallvec", - "solana-bucket-map 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-config-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-frozen-abi 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure", - "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-nohash-hasher", - "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-rayon-threadlimit 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-sdk", - "solana-stake-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-system-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-vote-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "static_assertions", - "strum", - "strum_macros", - "tar", - "tempfile", - "thiserror 1.0.69", + "solana-program-error", + "solana-program-memory", + "solana-pubkey", ] [[package]] name = "solana-accounts-db" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "arrayref", + "ahash 0.8.11", "bincode", "blake3", "bv", "bytemuck", - "byteorder", + "bytemuck_derive", "bzip2", "crossbeam-channel", "dashmap 5.5.3", - "flate2", - "fnv", - "im", "index_list", - "itertools 0.10.5", + "indexmap 2.7.0", + "itertools 0.12.1", "lazy_static", "log", "lz4", "memmap2", "modular-bitfield", - "num-derive 0.4.2", - "num-traits", "num_cpus", - "num_enum 0.7.3", - "ouroboros", - "percentage", - "qualifier_attr", + "num_enum", "rand 0.8.5", "rayon", - "regex", - "rustc_version", "seqlock", "serde", "serde_derive", "smallvec", - "solana-bucket-map 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-config-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-bucket-map", + "solana-inline-spl", + "solana-lattice-hash", "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-metrics", "solana-nohash-hasher", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-rayon-threadlimit", "solana-sdk", - "solana-stake-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-system-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-svm-transaction", "static_assertions", - "strum", - "strum_macros", "tar", "tempfile", "thiserror 1.0.69", @@ -6293,206 +6666,164 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3527a26138b5deb126f13c27743f3d95ac533abee5979e4113f6d59ef919cc6" -dependencies = [ - "bincode", - "bytemuck", - "log", - "num-derive 0.4.2", - "num-traits", - "rustc_version", - "serde", - "solana-frozen-abi 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-program", - "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-sdk", - "thiserror 1.0.69", -] - -[[package]] -name = "solana-address-lookup-table-program" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "bincode", "bytemuck", "log", - "num-derive 0.4.2", + "num-derive", "num-traits", - "rustc_version", - "serde", - "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-feature-set", + "solana-log-collector", "solana-program", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-program-runtime", "solana-sdk", "thiserror 1.0.69", ] [[package]] -name = "solana-banks-client" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e58fa66e1e240097665e7f87b267aa8e976ea3fcbd86918c8fd218c875395ada" +name = "solana-atomic-u64" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "borsh 1.5.3", - "futures 0.3.31", - "solana-banks-interface 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-program", - "solana-sdk", - "tarpc", - "thiserror 1.0.69", - "tokio", - "tokio-serde", + "parking_lot 0.12.3", ] [[package]] name = "solana-banks-client" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "borsh 1.5.3", "futures 0.3.31", - "solana-banks-interface 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-banks-interface", "solana-program", "solana-sdk", - "tarpc", + "tarpc 0.29.0", "thiserror 1.0.69", "tokio", - "tokio-serde", -] - -[[package]] -name = "solana-banks-interface" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f54d0a4334c153eadaa0326296a47a92d110c1cc975075fd6e1a7b67067f9812" -dependencies = [ - "serde", - "solana-sdk", - "tarpc", + "tokio-serde 0.8.0", ] [[package]] name = "solana-banks-interface" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "serde", + "serde_derive", "solana-sdk", - "tarpc", + "tarpc 0.29.0", ] [[package]] name = "solana-banks-server" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cbe287a0f859362de9b155fabd44e479eba26d5d80e07a7d021297b7b06ecba" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "bincode", "crossbeam-channel", "futures 0.3.31", - "solana-accounts-db 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-banks-interface 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-banks-interface", + "solana-client", + "solana-feature-set", + "solana-gossip", + "solana-runtime", "solana-sdk", - "solana-send-transaction-service 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "tarpc", + "solana-send-transaction-service", + "solana-svm", + "tarpc 0.29.0", "tokio", - "tokio-serde", + "tokio-serde 0.8.0", ] [[package]] -name = "solana-banks-server" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +name = "solana-bincode" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "bincode", - "crossbeam-channel", - "futures 0.3.31", - "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-banks-interface 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-gossip", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", - "solana-send-transaction-service 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "tarpc", - "tokio", - "tokio-serde", + "serde", + "solana-instruction", ] [[package]] name = "solana-bloom" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "bv", "fnv", "log", "rand 0.8.5", - "rayon", - "rustc_version", "serde", "serde_derive", - "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-sanitize", "solana-sdk", ] [[package]] -name = "solana-bpf-loader-program" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8cc27ceda9a22804d73902f5d718ff1331aa53990c2665c90535f6b182db259" +name = "solana-bn254" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "bincode", - "byteorder", - "libsecp256k1 0.6.0", - "log", - "scopeguard", - "solana-measure", - "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-sdk", - "solana-zk-token-sdk 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana_rbpf", + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-serialize", + "bytemuck", + "solana-program", "thiserror 1.0.69", ] +[[package]] +name = "solana-borsh" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "borsh 0.10.4", + "borsh 1.5.3", +] + [[package]] name = "solana-bpf-loader-program" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "bincode", "byteorder", "libsecp256k1 0.6.0", "log", "scopeguard", + "solana-bn254", + "solana-compute-budget", + "solana-curve25519", + "solana-feature-set", + "solana-log-collector", "solana-measure", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-poseidon", + "solana-program-memory", + "solana-program-runtime", "solana-sdk", - "solana-zk-token-sdk 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-timings", + "solana-type-overrides", "solana_rbpf", "thiserror 1.0.69", ] [[package]] name = "solana-bucket-map" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca55ec9b8d01d2e3bba9fad77b27c9a8fd51fe12475549b93a853d921b653139" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "bv", "bytemuck", + "bytemuck_derive", "log", "memmap2", "modular-bitfield", - "num_enum 0.7.3", + "num_enum", "rand 0.8.5", "solana-measure", "solana-sdk", @@ -6500,53 +6831,55 @@ dependencies = [ ] [[package]] -name = "solana-bucket-map" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +name = "solana-builtins-default-costs" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "bv", - "bytemuck", + "ahash 0.8.11", + "lazy_static", "log", - "memmap2", - "modular-bitfield", - "num_enum 0.7.3", - "rand 0.8.5", - "solana-measure", + "solana-address-lookup-table-program", + "solana-bpf-loader-program", + "solana-compute-budget-program", + "solana-config-program", + "solana-loader-v4-program", "solana-sdk", - "tempfile", + "solana-stake-program", + "solana-system-program", + "solana-vote-program", ] [[package]] name = "solana-bundle" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "anchor-lang 0.24.2", - "itertools 0.10.5", + "itertools 0.12.1", "log", "serde", - "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "sha2 0.10.8", "solana-ledger", - "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-measure", "solana-poh", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-runtime", "solana-sdk", + "solana-svm", + "solana-timings", "solana-transaction-status", "thiserror 1.0.69", ] [[package]] name = "solana-clap-utils" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "074ef478856a45d5627270fbc6b331f91de9aae7128242d9e423931013fb8a2a" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "chrono", "clap 2.34.0", "rpassword", - "solana-remote-wallet 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-derivation-path", + "solana-remote-wallet", "solana-sdk", "thiserror 1.0.69", "tiny-bip39", @@ -6555,41 +6888,24 @@ dependencies = [ ] [[package]] -name = "solana-clap-utils" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "chrono", - "clap 2.34.0", - "rpassword", - "solana-remote-wallet 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", - "thiserror 1.0.69", - "tiny-bip39", - "uriparse", - "url 2.5.4", -] - -[[package]] -name = "solana-cli-config" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +name = "solana-cli-config" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "dirs-next", "lazy_static", "serde", "serde_derive", "serde_yaml", - "solana-clap-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-clap-utils", "solana-sdk", "url 2.5.4", ] [[package]] name = "solana-client" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24a9f32c42402c4b9484d5868ac74b7e0a746e3905d8bfd756e1203e50cbb87e" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "async-trait", "bincode", @@ -6601,127 +6917,69 @@ dependencies = [ "log", "quinn", "rayon", - "solana-connection-cache 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-connection-cache", "solana-measure", - "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-pubsub-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-quic-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-pubsub-client", + "solana-quic-client", "solana-rpc-client", "solana-rpc-client-api", - "solana-rpc-client-nonce-utils 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-rpc-client-nonce-utils", "solana-sdk", "solana-streamer", - "solana-thin-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-tpu-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-udp-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-thin-client", + "solana-tpu-client", + "solana-udp-client", "thiserror 1.0.69", "tokio", ] [[package]] -name = "solana-client" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +name = "solana-clock" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "async-trait", - "bincode", - "dashmap 5.5.3", - "futures 0.3.31", - "futures-util", - "indexmap 2.7.0", - "indicatif", - "log", - "quinn", - "rayon", - "solana-connection-cache 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-pubsub-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-quic-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rpc-client", - "solana-rpc-client-api", - "solana-rpc-client-nonce-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", - "solana-streamer", - "solana-thin-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-tpu-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-udp-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "thiserror 1.0.69", - "tokio", + "serde", + "serde_derive", + "solana-sdk-macro", + "solana-sysvar-id", ] [[package]] -name = "solana-compute-budget-program" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6af050a6e0b402e322aa21f5441c7e27cdd52624a2d659f455b68afd7cda218c" +name = "solana-compute-budget" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", ] [[package]] name = "solana-compute-budget-program" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", -] - -[[package]] -name = "solana-config-program" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d75b803860c0098e021a26f0624129007c15badd5b0bc2fbd9f0e1a73060d3b" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "bincode", - "chrono", - "serde", - "serde_derive", - "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-program-runtime", "solana-sdk", ] [[package]] name = "solana-config-program" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "bincode", "chrono", "serde", "serde_derive", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", -] - -[[package]] -name = "solana-connection-cache" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9306ede13e8ceeab8a096bcf5fa7126731e44c201ca1721ea3c38d89bcd4111" -dependencies = [ - "async-trait", - "bincode", - "crossbeam-channel", - "futures-util", - "indexmap 2.7.0", - "log", - "rand 0.8.5", - "rayon", - "rcgen", - "solana-measure", - "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-log-collector", + "solana-program-runtime", "solana-sdk", - "thiserror 1.0.69", - "tokio", + "solana-short-vec", ] [[package]] name = "solana-connection-cache" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "async-trait", "bincode", @@ -6731,9 +6989,8 @@ dependencies = [ "log", "rand 0.8.5", "rayon", - "rcgen", "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-metrics", "solana-sdk", "thiserror 1.0.69", "tokio", @@ -6741,22 +6998,24 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ + "ahash 0.8.11", "anchor-lang 0.24.2", - "base64 0.21.7", + "anyhow", + "arrayvec", + "base64 0.22.1", "bincode", - "bs58 0.4.0", + "bs58 0.5.1", "bytes", "chrono", "crossbeam-channel", "dashmap 5.5.3", - "eager", "etcd-client", "futures 0.3.31", "histogram", - "itertools 0.10.5", + "itertools 0.12.1", "jito-protos", "jito-tip-distribution", "jito-tip-payment", @@ -6764,54 +7023,61 @@ dependencies = [ "log", "lru", "min-max-heap", - "num_enum 0.7.3", + "num_enum", "prio-graph", "prost 0.11.9", - "prost-types", + "prost-types 0.11.9", + "qualifier_attr", "quinn", "rand 0.8.5", "rand_chacha 0.3.1", "rayon", - "rcgen", "rolling-file", - "rustc_version", - "rustls", + "rustls 0.23.22", "serde", "serde_bytes", "serde_derive", - "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-accounts-db", "solana-bloom", + "solana-builtins-default-costs", "solana-bundle", - "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-cost-model 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-client", + "solana-compute-budget", + "solana-connection-cache", + "solana-cost-model", "solana-entry", - "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-feature-set", + "solana-fee", "solana-geyser-plugin-manager", "solana-gossip", "solana-ledger", "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-net-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-metrics", + "solana-net-utils", + "solana-perf", "solana-poh", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-quic-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-quic-client", + "solana-rayon-threadlimit", "solana-rpc", "solana-rpc-client-api", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-runtime", "solana-runtime-plugin", + "solana-runtime-transaction", + "solana-sanitize", "solana-sdk", - "solana-send-transaction-service 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-send-transaction-service", + "solana-short-vec", "solana-streamer", - "solana-tpu-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-svm", + "solana-svm-transaction", + "solana-timings", + "solana-tpu-client", "solana-transaction-status", "solana-turbine", "solana-unified-scheduler-pool", - "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-version", + "solana-vote", + "solana-vote-program", "solana-wen-restart", "strum", "strum_macros", @@ -6820,62 +7086,81 @@ dependencies = [ "tempfile", "thiserror 1.0.69", "tokio", - "tonic", - "tonic-build", + "tonic 0.9.2", + "tonic-build 0.9.2", "trees", ] [[package]] name = "solana-cost-model" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c852790063f7646a1c5199234cc82e1304b55a3b3fb8055a0b5c8b0393565c1c" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ + "ahash 0.8.11", "lazy_static", "log", - "rustc_version", - "solana-address-lookup-table-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-bpf-loader-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-compute-budget-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-config-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-frozen-abi 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-loader-v4-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-builtins-default-costs", + "solana-compute-budget", + "solana-feature-set", + "solana-metrics", + "solana-runtime-transaction", "solana-sdk", - "solana-stake-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-system-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-vote-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-svm-transaction", + "solana-vote-program", ] [[package]] -name = "solana-cost-model" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +name = "solana-cpi" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "lazy_static", - "log", - "rustc_version", - "solana-address-lookup-table-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-bpf-loader-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-compute-budget-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-config-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-loader-v4-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", - "solana-stake-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-system-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-account-info", + "solana-define-syscall", + "solana-instruction", + "solana-program-error", + "solana-pubkey", + "solana-stable-layout", +] + +[[package]] +name = "solana-curve25519" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "solana-program", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-decode-error" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "num-traits", +] + +[[package]] +name = "solana-define-syscall" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" + +[[package]] +name = "solana-derivation-path" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "derivation-path", + "qstring", + "uriparse", ] [[package]] name = "solana-entry" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "bincode", "crossbeam-channel", @@ -6887,16 +7172,27 @@ dependencies = [ "serde", "solana-measure", "solana-merkle-tree", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-metrics", + "solana-perf", + "solana-rayon-threadlimit", "solana-sdk", ] +[[package]] +name = "solana-epoch-schedule" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-macro", + "solana-sysvar-id", +] + [[package]] name = "solana-faucet" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "bincode", "byteorder", @@ -6905,130 +7201,79 @@ dependencies = [ "log", "serde", "serde_derive", - "solana-clap-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-clap-utils", "solana-cli-config", - "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-logger", + "solana-metrics", "solana-sdk", - "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "spl-memo", + "solana-version", + "spl-memo 5.0.0", "thiserror 1.0.69", "tokio", ] [[package]] -name = "solana-frozen-abi" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03ab2c30c15311b511c0d1151e4ab6bc9a3e080a37e7c6e7c2d96f5784cf9434" -dependencies = [ - "block-buffer 0.10.4", - "bs58 0.4.0", - "bv", - "either", - "generic-array", - "im", - "lazy_static", - "log", - "memmap2", - "rustc_version", - "serde", - "serde_bytes", - "serde_derive", - "sha2 0.10.8", - "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle", - "thiserror 1.0.69", -] - -[[package]] -name = "solana-frozen-abi" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +name = "solana-feature-set" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "block-buffer 0.10.4", - "bs58 0.4.0", - "bv", - "either", - "generic-array", - "im", "lazy_static", - "log", - "memmap2", - "rustc_version", - "serde", - "serde_bytes", - "serde_derive", - "sha2 0.10.8", - "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "subtle", - "thiserror 1.0.69", -] - -[[package]] -name = "solana-frozen-abi-macro" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c142f779c3633ac83c84d04ff06c70e1f558c876f13358bed77ba629c7417932" -dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", - "rustc_version", - "syn 2.0.93", + "solana-clock", + "solana-epoch-schedule", + "solana-hash", + "solana-pubkey", + "solana-sha256-hasher", ] [[package]] -name = "solana-frozen-abi-macro" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +name = "solana-fee" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", - "rustc_version", - "syn 2.0.93", + "solana-sdk", + "solana-svm-transaction", ] [[package]] -name = "solana-geyser-plugin-interface" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +name = "solana-fee-calculator" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "log", - "solana-sdk", - "solana-transaction-status", - "thiserror 1.0.69", + "serde", + "serde_derive", ] [[package]] name = "solana-geyser-plugin-manager" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "bs58 0.4.0", + "agave-geyser-plugin-interface", + "bs58 0.5.1", "crossbeam-channel", "json5", "jsonrpc-core", - "jsonrpc-server-utils", "libloading 0.7.4", "log", "serde_json", - "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-accounts-db", "solana-entry", - "solana-geyser-plugin-interface", "solana-ledger", "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-metrics", "solana-rpc", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-runtime", "solana-sdk", "solana-transaction-status", "thiserror 1.0.69", + "tokio", ] [[package]] name = "solana-gossip" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "assert_matches", "bincode", @@ -7037,66 +7282,145 @@ dependencies = [ "crossbeam-channel", "flate2", "indexmap 2.7.0", - "itertools 0.10.5", + "itertools 0.12.1", "log", "lru", "num-traits", "rand 0.8.5", "rand_chacha 0.3.1", "rayon", - "rustc_version", - "rustversion", "serde", "serde_bytes", "serde_derive", "solana-bloom", - "solana-clap-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-clap-utils", + "solana-client", + "solana-connection-cache", "solana-entry", - "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-feature-set", "solana-ledger", - "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-logger", "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-net-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-metrics", + "solana-net-utils", + "solana-perf", + "solana-rayon-threadlimit", + "solana-rpc-client", + "solana-runtime", + "solana-sanitize", "solana-sdk", + "solana-serde-varint", + "solana-short-vec", "solana-streamer", - "solana-thin-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-tpu-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-tpu-client", + "solana-version", + "solana-vote", + "solana-vote-program", "static_assertions", "thiserror 1.0.69", ] +[[package]] +name = "solana-hash" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "borsh 1.5.3", + "bs58 0.5.1", + "bytemuck", + "bytemuck_derive", + "js-sys", + "serde", + "serde_derive", + "solana-atomic-u64", + "solana-sanitize", + "wasm-bindgen", +] + +[[package]] +name = "solana-inflation" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-inline-spl" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "bytemuck", + "solana-pubkey", +] + +[[package]] +name = "solana-instruction" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "bincode", + "borsh 1.5.3", + "getrandom 0.2.15", + "js-sys", + "num-traits", + "serde", + "serde_derive", + "solana-define-syscall", + "solana-pubkey", + "wasm-bindgen", +] + +[[package]] +name = "solana-last-restart-slot" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-lattice-hash" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "base64 0.22.1", + "blake3", + "bs58 0.5.1", + "bytemuck", +] + [[package]] name = "solana-ledger" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "assert_matches", "bincode", "bitflags 2.6.0", "byteorder", + "bzip2", "chrono", "chrono-humanize", "crossbeam-channel", "dashmap 5.5.3", + "eager", "fs_extra", "futures 0.3.31", - "itertools 0.10.5", + "itertools 0.12.1", + "lazy-lru", "lazy_static", "libc", "log", "lru", "mockall", "num_cpus", - "num_enum 0.7.3", + "num_enum", + "proptest", "prost 0.11.9", "qualifier_attr", "rand 0.8.5", @@ -7104,36 +7428,38 @@ dependencies = [ "rayon", "reed-solomon-erasure", "rocksdb", - "rustc_version", "scopeguard", "serde", "serde_bytes", "sha2 0.10.8", - "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-bpf-loader-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-cost-model 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-account-decoder", + "solana-accounts-db", + "solana-bpf-loader-program", + "solana-cost-model", "solana-entry", - "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-feature-set", "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-metrics", + "solana-perf", + "solana-program-runtime", + "solana-rayon-threadlimit", + "solana-runtime", "solana-sdk", - "solana-stake-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-stake-program", "solana-storage-bigtable", "solana-storage-proto", + "solana-svm", + "solana-svm-transaction", + "solana-timings", "solana-transaction-status", - "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "spl-token 4.0.0", - "spl-token-2022 1.0.0", + "solana-vote", + "solana-vote-program", + "spl-token 6.0.0", + "spl-token-2022 4.0.0", "static_assertions", "strum", "strum_macros", + "tar", "tempfile", "thiserror 1.0.69", "tokio", @@ -7143,44 +7469,32 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b58f70f5883b0f26a6011ed23f76c493a3f22df63aec46cfe8e1b9bf82b5cc" -dependencies = [ - "log", - "solana-measure", - "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-sdk", - "solana_rbpf", -] - -[[package]] -name = "solana-loader-v4-program" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "log", + "solana-bpf-loader-program", + "solana-compute-budget", + "solana-log-collector", "solana-measure", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-program-runtime", "solana-sdk", + "solana-type-overrides", "solana_rbpf", ] [[package]] -name = "solana-logger" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121d36ffb3c6b958763312cbc697fbccba46ee837d3a0aa4fc0e90fcb3b884f3" +name = "solana-log-collector" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "env_logger 0.9.3", - "lazy_static", "log", ] [[package]] name = "solana-logger" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "env_logger 0.9.3", "lazy_static", @@ -7189,27 +7503,23 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "log", - "solana-sdk", -] +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" [[package]] name = "solana-merkle-tree" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "fast-math", - "solana-program", + "solana-hash", + "solana-sha256-hasher", ] [[package]] name = "solana-metrics" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e36052aff6be1536bdf6f737c6e69aca9dbb6a2f3f582e14ecb0ddc0cd66ce" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "crossbeam-channel", "gethostname", @@ -7221,48 +7531,24 @@ dependencies = [ ] [[package]] -name = "solana-metrics" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +name = "solana-msg" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "crossbeam-channel", - "gethostname", - "lazy_static", - "log", - "reqwest", - "solana-sdk", - "thiserror 1.0.69", + "solana-define-syscall", ] [[package]] -name = "solana-net-utils" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a1f5c6be9c5b272866673741e1ebc64b2ea2118e5c6301babbce526fdfb15f4" -dependencies = [ - "bincode", - "clap 3.2.25", - "crossbeam-channel", - "log", - "nix", - "rand 0.8.5", - "serde", - "serde_derive", - "socket2", - "solana-logger 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-sdk", - "solana-version 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio", - "url 2.5.4", -] +name = "solana-native-token" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" [[package]] name = "solana-net-utils" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "bincode", - "clap 3.2.25", "crossbeam-channel", "log", "nix", @@ -7270,9 +7556,7 @@ dependencies = [ "serde", "serde_derive", "socket2", - "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-sdk", - "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "tokio", "url 2.5.4", ] @@ -7284,44 +7568,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b8a731ed60e89177c8a7ab05fe0f1511cedd3e70e773f288f9de33a9cfdc21e" [[package]] -name = "solana-perf" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28acaf22477566a0fbddd67249ea5d859b39bacdb624aff3fadd3c5745e2643c" +name = "solana-packet" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "ahash 0.8.11", "bincode", - "bv", - "caps", - "curve25519-dalek", - "dlopen2", - "fnv", - "lazy_static", - "libc", - "log", - "nix", - "rand 0.8.5", - "rayon", - "rustc_version", + "bitflags 2.6.0", + "cfg_eval", "serde", - "solana-frozen-abi 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-rayon-threadlimit 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-sdk", - "solana-vote-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive", + "serde_with", ] [[package]] name = "solana-perf" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "ahash 0.8.11", "bincode", "bv", "caps", - "curve25519-dalek", + "curve25519-dalek 4.1.3", "dlopen2", "fnv", "lazy_static", @@ -7330,20 +7598,18 @@ dependencies = [ "nix", "rand 0.8.5", "rayon", - "rustc_version", "serde", - "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-metrics", + "solana-rayon-threadlimit", "solana-sdk", - "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-short-vec", + "solana-vote-program", ] [[package]] name = "solana-poh" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "core_affinity", "crossbeam-channel", @@ -7351,209 +7617,246 @@ dependencies = [ "solana-entry", "solana-ledger", "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-metrics", + "solana-runtime", "solana-sdk", "thiserror 1.0.69", ] [[package]] -name = "solana-program" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +name = "solana-poseidon" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "ark-bn254", - "ark-ec", - "ark-ff", - "ark-serialize", - "base64 0.21.7", + "light-poseidon", + "solana-define-syscall", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-precompile-error" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "num-traits", + "solana-decode-error", +] + +[[package]] +name = "solana-program" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "base64 0.22.1", "bincode", "bitflags 2.6.0", "blake3", "borsh 0.10.4", - "borsh 0.9.3", "borsh 1.5.3", - "bs58 0.4.0", + "bs58 0.5.1", "bv", "bytemuck", - "cc", + "bytemuck_derive", "console_error_panic_hook", "console_log", - "curve25519-dalek", + "curve25519-dalek 4.1.3", + "five8_const", "getrandom 0.2.15", - "itertools 0.10.5", "js-sys", "lazy_static", - "libc", - "libsecp256k1 0.6.0", - "light-poseidon", "log", - "memoffset 0.9.1", + "memoffset", "num-bigint 0.4.6", - "num-derive 0.4.2", + "num-derive", "num-traits", "parking_lot 0.12.3", "rand 0.8.5", - "rustc_version", - "rustversion", "serde", "serde_bytes", "serde_derive", - "serde_json", "sha2 0.10.8", - "sha3 0.10.8", - "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "sha3", + "solana-account-info", + "solana-atomic-u64", + "solana-bincode", + "solana-borsh", + "solana-clock", + "solana-cpi", + "solana-decode-error", + "solana-define-syscall", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-hash", + "solana-instruction", + "solana-last-restart-slot", + "solana-msg", + "solana-native-token", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey", + "solana-rent", + "solana-sanitize", "solana-sdk-macro", + "solana-secp256k1-recover", + "solana-serde-varint", + "solana-serialize-utils", + "solana-sha256-hasher", + "solana-short-vec", + "solana-slot-hashes", + "solana-slot-history", + "solana-stable-layout", + "solana-sysvar-id", + "solana-transaction-error", "thiserror 1.0.69", - "tiny-bip39", "wasm-bindgen", - "zeroize", ] [[package]] -name = "solana-program-runtime" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf0c3eab2a80f514289af1f422c121defb030937643c43b117959d6f1932fb5" +name = "solana-program-entrypoint" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "base64 0.21.7", - "bincode", - "eager", - "enum-iterator", - "itertools 0.10.5", - "libc", - "log", - "num-derive 0.4.2", + "solana-account-info", + "solana-msg", + "solana-program-error", + "solana-pubkey", +] + +[[package]] +name = "solana-program-error" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "borsh 1.5.3", "num-traits", - "percentage", - "rand 0.8.5", - "rustc_version", "serde", - "solana-frozen-abi 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure", - "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-sdk", - "solana_rbpf", - "thiserror 1.0.69", + "serde_derive", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-pubkey", +] + +[[package]] +name = "solana-program-memory" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "num-traits", + "solana-define-syscall", +] + +[[package]] +name = "solana-program-option" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" + +[[package]] +name = "solana-program-pack" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "solana-program-error", ] [[package]] name = "solana-program-runtime" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bincode", - "eager", "enum-iterator", - "itertools 0.10.5", + "itertools 0.12.1", "libc", "log", - "num-derive 0.4.2", + "num-derive", "num-traits", "percentage", "rand 0.8.5", - "rustc_version", "serde", - "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-compute-budget", + "solana-feature-set", + "solana-log-collector", "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-metrics", "solana-sdk", + "solana-timings", + "solana-type-overrides", + "solana-vote", "solana_rbpf", "thiserror 1.0.69", ] [[package]] name = "solana-program-test" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1382a5768ff738e283770ee331d0a4fa04aa1aceed8eb820a97094c93d53b72" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "assert_matches", "async-trait", - "base64 0.21.7", - "bincode", - "chrono-humanize", - "crossbeam-channel", - "log", - "serde", - "solana-accounts-db 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-banks-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-banks-interface 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-banks-server 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-bpf-loader-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-logger 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-sdk", - "solana-vote-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana_rbpf", - "test-case", - "thiserror 1.0.69", - "tokio", -] - -[[package]] -name = "solana-program-test" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "assert_matches", - "async-trait", - "base64 0.21.7", + "base64 0.22.1", "bincode", "chrono-humanize", "crossbeam-channel", "log", "serde", - "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-banks-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-banks-interface 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-banks-server 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-bpf-loader-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-accounts-db", + "solana-banks-client", + "solana-banks-interface", + "solana-banks-server", + "solana-bpf-loader-program", + "solana-compute-budget", + "solana-feature-set", + "solana-inline-spl", + "solana-instruction", + "solana-log-collector", + "solana-logger", + "solana-program-runtime", + "solana-runtime", "solana-sdk", - "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-svm", + "solana-timings", + "solana-vote-program", "solana_rbpf", - "test-case", "thiserror 1.0.69", "tokio", ] [[package]] -name = "solana-pubsub-client" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b064e76909d33821b80fdd826e6757251934a52958220c92639f634bea90366d" +name = "solana-pubkey" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "crossbeam-channel", - "futures-util", - "log", - "reqwest", - "semver", + "borsh 0.10.4", + "borsh 1.5.3", + "bs58 0.5.1", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "five8_const", + "getrandom 0.2.15", + "js-sys", + "num-traits", + "rand 0.8.5", "serde", "serde_derive", - "serde_json", - "solana-account-decoder 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-rpc-client-api", - "solana-sdk", - "thiserror 1.0.69", - "tokio", - "tokio-stream", - "tokio-tungstenite", - "tungstenite", - "url 2.5.4", + "solana-atomic-u64", + "solana-decode-error", + "solana-define-syscall", + "solana-sanitize", + "solana-sha256-hasher", + "wasm-bindgen", ] [[package]] name = "solana-pubsub-client" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "crossbeam-channel", "futures-util", @@ -7563,7 +7866,7 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-account-decoder", "solana-rpc-client-api", "solana-sdk", "thiserror 1.0.69", @@ -7576,50 +7879,22 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a90e40ee593f6e9ddd722d296df56743514ae804975a76d47e7afed4e3da244" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "async-mutex", + "async-lock", "async-trait", "futures 0.3.31", - "itertools 0.10.5", + "itertools 0.12.1", "lazy_static", "log", "quinn", "quinn-proto", - "rcgen", - "rustls", - "solana-connection-cache 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.23.22", + "solana-connection-cache", "solana-measure", - "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-net-utils 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-rpc-client-api", - "solana-sdk", - "solana-streamer", - "thiserror 1.0.69", - "tokio", -] - -[[package]] -name = "solana-quic-client" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "async-mutex", - "async-trait", - "futures 0.3.31", - "itertools 0.10.5", - "lazy_static", - "log", - "quinn", - "quinn-proto", - "rcgen", - "rustls", - "solana-connection-cache 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-net-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-metrics", + "solana-net-utils", "solana-rpc-client-api", "solana-sdk", "solana-streamer", @@ -7629,18 +7904,8 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66468f9c014992167de10cc68aad6ac8919a8c8ff428dc88c0d2b4da8c02b8b7" -dependencies = [ - "lazy_static", - "num_cpus", -] - -[[package]] -name = "solana-rayon-threadlimit" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "lazy_static", "num_cpus", @@ -7648,52 +7913,45 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c191019f4d4f84281a6d0dd9a43181146b33019627fc394e42e08ade8976b431" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "console", "dialoguer", "log", - "num-derive 0.4.2", + "num-derive", "num-traits", "parking_lot 0.12.3", "qstring", "semver", + "solana-derivation-path", "solana-sdk", "thiserror 1.0.69", "uriparse", ] [[package]] -name = "solana-remote-wallet" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +name = "solana-rent" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "console", - "dialoguer", - "log", - "num-derive 0.4.2", - "num-traits", - "parking_lot 0.12.3", - "qstring", - "semver", - "solana-sdk", - "thiserror 1.0.69", - "uriparse", + "serde", + "serde_derive", + "solana-sdk-macro", + "solana-sysvar-id", ] [[package]] name = "solana-rpc" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bincode", - "bs58 0.4.0", + "bs58 0.5.1", "crossbeam-channel", "dashmap 5.5.3", - "itertools 0.10.5", + "itertools 0.12.1", "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", @@ -7707,108 +7965,97 @@ dependencies = [ "serde_derive", "serde_json", "soketto", - "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-account-decoder", + "solana-accounts-db", "solana-bundle", - "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-client", "solana-entry", "solana-faucet", + "solana-feature-set", "solana-gossip", + "solana-inline-spl", "solana-ledger", "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-metrics", + "solana-perf", "solana-poh", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-program-runtime", + "solana-rayon-threadlimit", "solana-rpc-client-api", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-runtime", "solana-sdk", - "solana-send-transaction-service 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-stake-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-send-transaction-service", + "solana-stake-program", "solana-storage-bigtable", "solana-streamer", - "solana-tpu-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-svm", + "solana-tpu-client", "solana-transaction-status", - "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "spl-token 4.0.0", - "spl-token-2022 1.0.0", + "solana-version", + "solana-vote", + "solana-vote-program", + "spl-token 6.0.0", + "spl-token-2022 4.0.0", "stream-cancel", "thiserror 1.0.69", "tokio", - "tokio-util 0.6.10", + "tokio-util 0.7.13", ] [[package]] name = "solana-rpc-client" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "async-trait", - "base64 0.21.7", + "base64 0.22.1", "bincode", - "bs58 0.4.0", + "bs58 0.5.1", "indicatif", "log", "reqwest", + "reqwest-middleware", "semver", "serde", "serde_derive", "serde_json", - "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-account-decoder-client-types", "solana-rpc-client-api", "solana-sdk", - "solana-transaction-status", - "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-transaction-status-client-types", + "solana-version", + "solana-vote-program", "tokio", ] [[package]] name = "solana-rpc-client-api" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "base64 0.21.7", - "bs58 0.4.0", + "anyhow", + "base64 0.22.1", + "bs58 0.5.1", "jsonrpc-core", "reqwest", + "reqwest-middleware", "semver", "serde", "serde_derive", "serde_json", - "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-bundle", - "solana-sdk", - "solana-transaction-status", - "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "spl-token-2022 1.0.0", - "thiserror 1.0.69", -] - -[[package]] -name = "solana-rpc-client-nonce-utils" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a47b6bb1834e6141a799db62bbdcf80d17a7d58d7bc1684c614e01a7293d7cf" -dependencies = [ - "clap 2.34.0", - "solana-clap-utils 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-rpc-client", + "solana-account-decoder-client-types", + "solana-inline-spl", "solana-sdk", + "solana-transaction-status-client-types", + "solana-version", "thiserror 1.0.69", ] [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "clap 2.34.0", - "solana-clap-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-rpc-client", "solana-sdk", "thiserror 1.0.69", @@ -7816,89 +8063,13 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73a12e1270121e1ca6a4e86d6d0f5c339f0811a8435161d9eee54cbb0a083859" -dependencies = [ - "aquamarine", - "arrayref", - "base64 0.21.7", - "bincode", - "blake3", - "bv", - "bytemuck", - "byteorder", - "bzip2", - "crossbeam-channel", - "dashmap 5.5.3", - "dir-diff", - "flate2", - "fnv", - "im", - "index_list", - "itertools 0.10.5", - "lazy_static", - "log", - "lru", - "lz4", - "memmap2", - "mockall", - "modular-bitfield", - "num-derive 0.4.2", - "num-traits", - "num_cpus", - "num_enum 0.7.3", - "ouroboros", - "percentage", - "qualifier_attr", - "rand 0.8.5", - "rayon", - "regex", - "rustc_version", - "serde", - "serde_derive", - "serde_json", - "solana-accounts-db 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-address-lookup-table-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-bpf-loader-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-bucket-map 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-compute-budget-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-config-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-cost-model 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-frozen-abi 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-loader-v4-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-measure", - "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-perf 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-rayon-threadlimit 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-sdk", - "solana-stake-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-system-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-version 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-vote 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-vote-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-zk-token-proof-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-zk-token-sdk 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "static_assertions", - "strum", - "strum_macros", - "symlink", - "tar", - "tempfile", - "thiserror 1.0.69", - "zstd", -] - -[[package]] -name = "solana-runtime" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ + "ahash 0.8.11", "aquamarine", "arrayref", - "base64 0.21.7", + "base64 0.22.1", "bincode", "blake3", "bv", @@ -7912,51 +8083,62 @@ dependencies = [ "fnv", "im", "index_list", - "itertools 0.10.5", + "itertools 0.12.1", "lazy_static", + "libc", "log", - "lru", "lz4", "memmap2", "mockall", "modular-bitfield", - "num-derive 0.4.2", + "num-derive", "num-traits", "num_cpus", - "num_enum 0.7.3", - "ouroboros", + "num_enum", "percentage", "qualifier_attr", "rand 0.8.5", "rayon", "regex", - "rustc_version", "serde", "serde_derive", "serde_json", - "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-address-lookup-table-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-bpf-loader-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-bucket-map 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-compute-budget-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-config-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-cost-model 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-loader-v4-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "serde_with", + "solana-accounts-db", + "solana-address-lookup-table-program", + "solana-bpf-loader-program", + "solana-bucket-map", + "solana-compute-budget", + "solana-compute-budget-program", + "solana-config-program", + "solana-cost-model", + "solana-feature-set", + "solana-fee", + "solana-inline-spl", + "solana-lattice-hash", + "solana-loader-v4-program", "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-metrics", + "solana-perf", + "solana-program", + "solana-program-runtime", + "solana-rayon-threadlimit", + "solana-runtime-transaction", "solana-sdk", - "solana-stake-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-system-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-version 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-zk-token-proof-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-zk-token-sdk 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-stake-program", + "solana-svm", + "solana-svm-rent-collector", + "solana-svm-transaction", + "solana-system-program", + "solana-timings", + "solana-transaction-status", + "solana-version", + "solana-vote", + "solana-vote-program", + "solana-zk-elgamal-proof-program", + "solana-zk-sdk", + "solana-zk-token-proof-program", + "solana-zk-token-sdk", "static_assertions", "strum", "strum_macros", @@ -7969,8 +8151,8 @@ dependencies = [ [[package]] name = "solana-runtime-plugin" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "crossbeam-channel", "json5", @@ -7981,78 +8163,131 @@ dependencies = [ "jsonrpc-server-utils", "libloading 0.7.4", "log", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-runtime", + "solana-sdk", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-runtime-transaction" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "agave-transaction-view", + "log", + "solana-builtins-default-costs", + "solana-compute-budget", + "solana-pubkey", "solana-sdk", + "solana-svm-transaction", "thiserror 1.0.69", ] +[[package]] +name = "solana-sanitize" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" + [[package]] name = "solana-sdk" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "anchor-lang 0.24.2", - "assert_matches", - "base64 0.21.7", + "base64 0.22.1", "bincode", "bitflags 2.6.0", "borsh 1.5.3", - "bs58 0.4.0", + "bs58 0.5.1", "bytemuck", + "bytemuck_derive", "byteorder", "chrono", - "derivation-path", "digest 0.10.7", "ed25519-dalek", "ed25519-dalek-bip32", - "generic-array", + "getrandom 0.1.16", "hmac 0.12.1", - "itertools 0.10.5", + "itertools 0.12.1", "js-sys", "lazy_static", "libsecp256k1 0.6.0", "log", "memmap2", - "num-derive 0.4.2", + "num-derive", "num-traits", - "num_enum 0.7.3", + "num_enum", "pbkdf2 0.11.0", - "qstring", "qualifier_attr", "rand 0.7.3", "rand 0.8.5", - "rustc_version", - "rustversion", "serde", "serde_bytes", "serde_derive", "serde_json", - "serde_with 2.3.3", + "serde_with", "sha2 0.10.8", - "sha3 0.10.8", + "sha3", "siphasher", - "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-account", + "solana-bn254", + "solana-decode-error", + "solana-derivation-path", + "solana-feature-set", + "solana-inflation", + "solana-instruction", + "solana-native-token", + "solana-packet", + "solana-precompile-error", "solana-program", + "solana-program-memory", + "solana-pubkey", + "solana-sanitize", "solana-sdk-macro", + "solana-secp256k1-recover", + "solana-secp256r1-program", + "solana-serde-varint", + "solana-short-vec", + "solana-signature", + "solana-transaction-error", "thiserror 1.0.69", - "uriparse", "wasm-bindgen", ] [[package]] name = "solana-sdk-macro" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "bs58 0.4.0", + "bs58 0.5.1", "proc-macro2 1.0.92", "quote 1.0.38", - "rustversion", "syn 2.0.93", ] +[[package]] +name = "solana-secp256k1-recover" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "borsh 1.5.3", + "libsecp256k1 0.6.0", + "solana-define-syscall", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-secp256r1-program" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "bytemuck", + "openssl", + "solana-feature-set", + "solana-instruction", + "solana-precompile-error", + "solana-pubkey", +] + [[package]] name = "solana-security-txt" version = "1.1.1" @@ -8061,69 +8296,122 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3218f670f582126a3859c4fd152e922b93b3748a636bb143f970391925723577" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "crossbeam-channel", "log", - "solana-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-client", + "solana-connection-cache", + "solana-gossip", "solana-measure", - "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-metrics", + "solana-runtime", "solana-sdk", - "solana-tpu-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-tpu-client", ] [[package]] -name = "solana-send-transaction-service" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +name = "solana-serde-varint" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "crossbeam-channel", - "log", - "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-gossip", - "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", - "solana-tpu-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "serde", ] [[package]] -name = "solana-stake-program" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb3e0d2dc7080b9fa61b34699b176911684f5e04e8df4b565b2b6c962bb4321" +name = "solana-serialize-utils" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "bincode", - "log", - "rustc_version", - "solana-config-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-sdk", - "solana-vote-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-instruction", + "solana-pubkey", + "solana-sanitize", +] + +[[package]] +name = "solana-sha256-hasher" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "sha2 0.10.8", + "solana-define-syscall", + "solana-hash", +] + +[[package]] +name = "solana-short-vec" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "serde", +] + +[[package]] +name = "solana-signature" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "bs58 0.5.1", + "ed25519-dalek", + "generic-array", + "rand 0.8.5", + "serde", + "serde_derive", + "solana-sanitize", +] + +[[package]] +name = "solana-slot-hashes" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "serde", + "serde_derive", + "solana-hash", + "solana-sysvar-id", +] + +[[package]] +name = "solana-slot-history" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "bv", + "serde", + "serde_derive", + "solana-sysvar-id", +] + +[[package]] +name = "solana-stable-layout" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "solana-instruction", + "solana-pubkey", ] [[package]] name = "solana-stake-program" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "bincode", "log", - "rustc_version", - "solana-config-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-config-program", + "solana-feature-set", + "solana-log-collector", + "solana-program-runtime", "solana-sdk", - "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-type-overrides", + "solana-vote-program", ] [[package]] name = "solana-storage-bigtable" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "backoff", "bincode", @@ -8133,135 +8421,176 @@ dependencies = [ "flate2", "futures 0.3.31", "goauth", - "http", - "hyper", + "http 0.2.12", + "hyper 0.14.32", "hyper-proxy", "log", "openssl", "prost 0.11.9", - "prost-types", + "prost-types 0.11.9", "serde", "serde_derive", "smpl_jwt", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-metrics", "solana-sdk", "solana-storage-proto", "solana-transaction-status", "thiserror 1.0.69", "tokio", - "tonic", + "tonic 0.9.2", "zstd", ] [[package]] name = "solana-storage-proto" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "bincode", - "bs58 0.4.0", + "bs58 0.5.1", "prost 0.11.9", "protobuf-src", "serde", - "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-account-decoder", "solana-sdk", "solana-transaction-status", - "tonic-build", + "tonic-build 0.9.2", ] [[package]] name = "solana-streamer" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "async-channel", "bytes", "crossbeam-channel", + "dashmap 5.5.3", + "futures 0.3.31", "futures-util", + "governor", "histogram", "indexmap 2.7.0", - "itertools 0.10.5", + "itertools 0.12.1", "libc", "log", "nix", "pem", "percentage", - "pkcs8", "quinn", "quinn-proto", "rand 0.8.5", - "rcgen", - "rustls", + "rustls 0.23.22", "smallvec", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "socket2", + "solana-measure", + "solana-metrics", + "solana-perf", "solana-sdk", + "solana-transaction-metrics-tracker", "thiserror 1.0.69", "tokio", + "tokio-util 0.7.13", "x509-parser", ] [[package]] -name = "solana-system-program" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26f31e04f5baad7cbc2281fea312c4e48277da42a93a0ba050b74edc5a74d63c" +name = "solana-svm" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "bincode", + "itertools 0.12.1", "log", + "percentage", + "qualifier_attr", "serde", "serde_derive", - "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-bpf-loader-program", + "solana-compute-budget", + "solana-feature-set", + "solana-fee", + "solana-loader-v4-program", + "solana-log-collector", + "solana-measure", + "solana-program-runtime", + "solana-runtime-transaction", + "solana-sdk", + "solana-svm-rent-collector", + "solana-svm-transaction", + "solana-system-program", + "solana-timings", + "solana-type-overrides", + "solana-vote", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-svm-rent-collector" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "solana-sdk", +] + +[[package]] +name = "solana-svm-transaction" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ "solana-sdk", ] [[package]] name = "solana-system-program" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "bincode", "log", "serde", "serde_derive", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-log-collector", + "solana-program-runtime", "solana-sdk", + "solana-type-overrides", +] + +[[package]] +name = "solana-sysvar-id" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "solana-pubkey", ] [[package]] name = "solana-thin-client" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8c02245d0d232430e79dc0d624aa42d50006097c3aec99ac82ac299eaa3a73f" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "bincode", "log", "rayon", - "solana-connection-cache 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-connection-cache", "solana-rpc-client", "solana-rpc-client-api", "solana-sdk", ] [[package]] -name = "solana-thin-client" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +name = "solana-timings" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "bincode", - "log", - "rayon", - "solana-connection-cache 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rpc-client", - "solana-rpc-client-api", + "eager", + "enum-iterator", "solana-sdk", ] [[package]] name = "solana-tpu-client" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67251506ed03de15f1347b46636b45c47da6be75015b4a13f0620b21beb00566" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "async-trait", "bincode", @@ -8270,10 +8599,9 @@ dependencies = [ "indicatif", "log", "rayon", - "solana-connection-cache 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-connection-cache", "solana-measure", - "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-pubsub-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-pubsub-client", "solana-rpc-client", "solana-rpc-client-api", "solana-sdk", @@ -8282,343 +8610,319 @@ dependencies = [ ] [[package]] -name = "solana-tpu-client" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +name = "solana-transaction-error" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "async-trait", + "serde", + "serde_derive", + "solana-instruction", + "solana-sanitize", +] + +[[package]] +name = "solana-transaction-metrics-tracker" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "base64 0.22.1", "bincode", - "futures-util", - "indexmap 2.7.0", - "indicatif", + "lazy_static", "log", - "rayon", - "solana-connection-cache 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-pubsub-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rpc-client", - "solana-rpc-client-api", + "rand 0.8.5", + "solana-perf", "solana-sdk", - "thiserror 1.0.69", - "tokio", + "solana-short-vec", ] [[package]] name = "solana-transaction-status" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "Inflector", - "base64 0.21.7", + "base64 0.22.1", "bincode", - "borsh 0.10.4", - "bs58 0.4.0", + "borsh 1.5.3", + "bs58 0.5.1", "lazy_static", "log", "serde", "serde_derive", "serde_json", - "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-account-decoder", "solana-sdk", - "spl-associated-token-account", - "spl-memo", - "spl-token 4.0.0", - "spl-token-2022 1.0.0", + "solana-transaction-status-client-types", + "spl-associated-token-account 4.0.0", + "spl-memo 5.0.0", + "spl-token 6.0.0", + "spl-token-2022 4.0.0", + "spl-token-group-interface 0.3.0", + "spl-token-metadata-interface 0.4.0", + "thiserror 1.0.69", +] + +[[package]] +name = "solana-transaction-status-client-types" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "base64 0.22.1", + "bincode", + "bs58 0.5.1", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder-client-types", + "solana-sdk", + "solana-signature", "thiserror 1.0.69", ] [[package]] name = "solana-turbine" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "bincode", "bytes", "crossbeam-channel", "futures 0.3.31", - "itertools 0.10.5", + "itertools 0.12.1", + "lazy-lru", "log", "lru", "quinn", "rand 0.8.5", "rand_chacha 0.3.1", "rayon", - "rcgen", - "rustls", + "rustls 0.23.22", "solana-entry", + "solana-feature-set", + "solana-geyser-plugin-manager", "solana-gossip", "solana-ledger", "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-perf 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-metrics", + "solana-perf", "solana-poh", - "solana-quic-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-rayon-threadlimit 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-quic-client", + "solana-rayon-threadlimit", "solana-rpc", "solana-rpc-client-api", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", - "solana-streamer", - "thiserror 1.0.69", - "tokio", -] - -[[package]] -name = "solana-udp-client" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a754a3c2265eb02e0c35aeaca96643951f03cee6b376afe12e0cf8860ffccd1" -dependencies = [ - "async-trait", - "solana-connection-cache 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-net-utils 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-sdk", - "solana-streamer", - "thiserror 1.0.69", - "tokio", -] - -[[package]] -name = "solana-udp-client" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" -dependencies = [ - "async-trait", - "solana-connection-cache 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-net-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-runtime", "solana-sdk", "solana-streamer", + "static_assertions", "thiserror 1.0.69", "tokio", ] [[package]] -name = "solana-unified-scheduler-logic" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" - -[[package]] -name = "solana-unified-scheduler-pool" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +name = "solana-type-overrides" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "solana-ledger", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", - "solana-unified-scheduler-logic", - "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "lazy_static", + "rand 0.8.5", ] - -[[package]] -name = "solana-version" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f44776bd685cc02e67ba264384acc12ef2931d01d1a9f851cb8cdbd3ce455b9e" -dependencies = [ - "log", - "rustc_version", - "semver", - "serde", - "serde_derive", - "solana-frozen-abi 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + +[[package]] +name = "solana-udp-client" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "async-trait", + "solana-connection-cache", + "solana-net-utils", "solana-sdk", + "solana-streamer", + "thiserror 1.0.69", + "tokio", ] [[package]] -name = "solana-version" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +name = "solana-unified-scheduler-logic" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "log", - "rustc_version", - "semver", - "serde", - "serde_derive", - "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "assert_matches", "solana-sdk", + "static_assertions", ] [[package]] -name = "solana-vote" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5983370c95b615dc5f5d0e85414c499f05380393c578749bcd14c114c77c9bc" +name = "solana-unified-scheduler-pool" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ + "assert_matches", "crossbeam-channel", - "itertools 0.10.5", + "dashmap 5.5.3", + "derivative", "log", - "rustc_version", - "serde", - "serde_derive", - "solana-frozen-abi 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "qualifier_attr", + "scopeguard", + "solana-ledger", + "solana-runtime", "solana-sdk", - "solana-vote-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.69", + "solana-timings", + "solana-unified-scheduler-logic", + "static_assertions", + "vec_extract_if_polyfill", ] [[package]] -name = "solana-vote" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +name = "solana-version" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "crossbeam-channel", - "itertools 0.10.5", - "log", - "rustc_version", + "semver", "serde", "serde_derive", - "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", - "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "thiserror 1.0.69", + "solana-feature-set", + "solana-sanitize", + "solana-serde-varint", ] [[package]] -name = "solana-vote-program" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25810970c91feb579bd3f67dca215fce971522e42bfd59696af89c5dfebd997c" +name = "solana-vote" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "bincode", + "itertools 0.12.1", "log", - "num-derive 0.4.2", - "num-traits", - "rustc_version", "serde", "serde_derive", - "solana-frozen-abi 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-frozen-abi-macro 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-metrics 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "solana-program", - "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", "solana-sdk", "thiserror 1.0.69", ] [[package]] name = "solana-vote-program" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "bincode", "log", - "num-derive 0.4.2", + "num-derive", "num-traits", - "rustc_version", "serde", "serde_derive", - "solana-frozen-abi 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-frozen-abi-macro 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-feature-set", + "solana-metrics", "solana-program", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-program-runtime", "solana-sdk", "thiserror 1.0.69", ] [[package]] name = "solana-wen-restart" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ + "anyhow", "log", "prost 0.11.9", - "prost-build", - "prost-types", + "prost-build 0.11.9", + "prost-types 0.11.9", "protobuf-src", - "rustc_version", + "rayon", + "solana-entry", "solana-gossip", "solana-ledger", - "solana-logger 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", "solana-program", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-sdk", - "solana-vote-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", -] - -[[package]] -name = "solana-zk-token-proof-program" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1be1c15d4aace575e2de73ebeb9b37bac455e89bee9a8c3531f47ac5066b33e1" -dependencies = [ - "bytemuck", - "num-derive 0.4.2", - "num-traits", - "solana-program-runtime 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-runtime", "solana-sdk", - "solana-zk-token-sdk 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-timings", + "solana-vote-program", ] [[package]] -name = "solana-zk-token-proof-program" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +name = "solana-zk-elgamal-proof-program" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "bytemuck", - "num-derive 0.4.2", + "num-derive", "num-traits", - "solana-program-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-log-collector", + "solana-program-runtime", "solana-sdk", - "solana-zk-token-sdk 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-zk-sdk", ] [[package]] -name = "solana-zk-token-sdk" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cbdf4249b6dfcbba7d84e2b53313698043f60f8e22ce48286e6fbe8a17c8d16" +name = "solana-zk-sdk" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "aes-gcm-siv", - "base64 0.21.7", + "base64 0.22.1", "bincode", "bytemuck", - "byteorder", - "curve25519-dalek", - "getrandom 0.1.16", - "itertools 0.10.5", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "itertools 0.12.1", + "js-sys", "lazy_static", "merlin", - "num-derive 0.4.2", + "num-derive", "num-traits", - "rand 0.7.3", + "rand 0.8.5", "serde", + "serde_derive", "serde_json", - "sha3 0.9.1", + "sha3", + "solana-derivation-path", "solana-program", "solana-sdk", "subtle", "thiserror 1.0.69", + "wasm-bindgen", "zeroize", ] +[[package]] +name = "solana-zk-token-proof-program" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" +dependencies = [ + "bytemuck", + "num-derive", + "num-traits", + "solana-feature-set", + "solana-log-collector", + "solana-program-runtime", + "solana-sdk", + "solana-zk-token-sdk", +] + [[package]] name = "solana-zk-token-sdk" -version = "1.18.26" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5#0bbcbe476c0e728907ac01135115e661c16538e5" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "aes-gcm-siv", - "base64 0.21.7", + "base64 0.22.1", "bincode", "bytemuck", + "bytemuck_derive", "byteorder", - "curve25519-dalek", - "getrandom 0.1.16", - "itertools 0.10.5", + "curve25519-dalek 4.1.3", + "itertools 0.12.1", "lazy_static", "merlin", - "num-derive 0.4.2", + "num-derive", "num-traits", - "rand 0.7.3", + "rand 0.8.5", "serde", + "serde_derive", "serde_json", - "sha3 0.9.1", + "sha3", + "solana-curve25519", + "solana-derivation-path", "solana-program", "solana-sdk", "subtle", @@ -8628,13 +8932,12 @@ dependencies = [ [[package]] name = "solana_rbpf" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da5d083187e3b3f453e140f292c09186881da8a02a7b5e27f645ee26de3d9cc5" +checksum = "1c1941b5ef0c3ce8f2ac5dd984d0fb1a97423c4ff2a02eec81e3913f02e2ac2b" dependencies = [ "byteorder", - "combine", - "goblin", + "combine 3.8.1", "hash32", "libc", "log", @@ -8645,12 +8948,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - [[package]] name = "spin" version = "0.9.8" @@ -8658,62 +8955,77 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] -name = "spki" -version = "0.5.4" +name = "spinning_top" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" +checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300" dependencies = [ - "base64ct", - "der", + "lock_api", ] [[package]] name = "spl-associated-token-account" -version = "2.3.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "992d9c64c2564cc8f63a4b508bf3ebcdf2254b0429b13cd1d31adb6162432a5f" +checksum = "68034596cf4804880d265f834af1ff2f821ad5293e41fa0f8f59086c181fc38e" dependencies = [ "assert_matches", - "borsh 0.10.4", - "num-derive 0.4.2", + "borsh 1.5.3", + "num-derive", "num-traits", "solana-program", - "spl-token 4.0.0", - "spl-token-2022 1.0.0", + "spl-token 6.0.0", + "spl-token-2022 4.0.0", "thiserror 1.0.69", ] [[package]] -name = "spl-discriminator" -version = "0.1.0" +name = "spl-associated-token-account" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" +checksum = "76fee7d65013667032d499adc3c895e286197a35a0d3a4643c80e7fd3e9969e3" dependencies = [ - "bytemuck", + "borsh 1.5.3", + "num-derive", + "num-traits", "solana-program", - "spl-discriminator-derive 0.1.2", + "spl-associated-token-account-client", + "spl-token 7.0.0", + "spl-token-2022 6.0.0", + "thiserror 1.0.69", +] + +[[package]] +name = "spl-associated-token-account-client" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f8349dbcbe575f354f9a533a21f272f3eb3808a49e2fdc1c34393b88ba76cb" +dependencies = [ + "solana-instruction", + "solana-pubkey", ] [[package]] name = "spl-discriminator" -version = "0.2.5" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "210101376962bb22bb13be6daea34656ea1cbc248fce2164b146e39203b55e03" +checksum = "a38ea8b6dedb7065887f12d62ed62c1743aa70749e8558f963609793f6fb12bc" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator-derive 0.2.0", + "spl-discriminator-derive", ] [[package]] -name = "spl-discriminator-derive" -version = "0.1.2" +name = "spl-discriminator" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" +checksum = "a7398da23554a31660f17718164e31d31900956054f54f52d5ec1be51cb4f4b3" dependencies = [ - "quote 1.0.38", - "spl-discriminator-syn 0.1.2", - "syn 2.0.93", + "bytemuck", + "solana-program-error", + "solana-sha256-hasher", + "spl-discriminator-derive", ] [[package]] @@ -8723,15 +9035,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" dependencies = [ "quote 1.0.38", - "spl-discriminator-syn 0.2.0", + "spl-discriminator-syn", "syn 2.0.93", ] [[package]] name = "spl-discriminator-syn" -version = "0.1.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fea7be851bd98d10721782ea958097c03a0c2a07d8d4997041d0ece6319a63" +checksum = "8c1f05593b7ca9eac7caca309720f2eafb96355e037e6d373b909a80fe7b69b9" dependencies = [ "proc-macro2 1.0.92", "quote 1.0.38", @@ -8741,26 +9053,26 @@ dependencies = [ ] [[package]] -name = "spl-discriminator-syn" -version = "0.2.0" +name = "spl-elgamal-registry" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c1f05593b7ca9eac7caca309720f2eafb96355e037e6d373b909a80fe7b69b9" +checksum = "ce0f668975d2b0536e8a8fd60e56a05c467f06021dae037f1d0cfed0de2e231d" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", - "sha2 0.10.8", - "syn 2.0.93", - "thiserror 1.0.69", + "bytemuck", + "solana-program", + "solana-zk-sdk", + "spl-pod 0.5.0", + "spl-token-confidential-transfer-proof-extraction", ] [[package]] name = "spl-math" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "102d87a7608c793497fa3e85e9d0e24a33be06a94fb029b2cd30d794295f8110" +checksum = "5cc5a6cc7a4f0cf7813ce44153bba73280909f697d7f6baf7b9f223a255e7887" dependencies = [ - "borsh 0.10.4", - "num-derive 0.3.3", + "borsh 1.5.3", + "num-derive", "num-traits", "solana-program", "thiserror 1.0.69", @@ -8769,75 +9081,85 @@ dependencies = [ [[package]] name = "spl-memo" -version = "4.0.0" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f180b03318c3dbab3ef4e1e4d46d5211ae3c780940dd0a28695aba4b59a75a" +checksum = "a0dba2f2bb6419523405d21c301a32c9f9568354d4742552e7972af801f4bdb3" dependencies = [ "solana-program", ] [[package]] -name = "spl-pod" -version = "0.1.0" +name = "spl-memo" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2881dddfca792737c0706fa0175345ab282b1b0879c7d877bad129645737c079" +checksum = "9f09647c0974e33366efeb83b8e2daebb329f0420149e74d3a4bd2c08cf9f7cb" dependencies = [ - "borsh 0.10.4", - "bytemuck", - "solana-program", - "solana-zk-token-sdk 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "spl-program-error 0.3.0", + "solana-account-info", + "solana-instruction", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-pubkey", ] [[package]] name = "spl-pod" -version = "0.2.5" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c52d84c55efeef8edcc226743dc089d7e3888b8e3474569aa3eff152b37b9996" +checksum = "c704c88fc457fa649ba3aabe195c79d885c3f26709efaddc453c8de352c90b87" dependencies = [ "borsh 1.5.3", "bytemuck", + "bytemuck_derive", "solana-program", - "solana-zk-token-sdk 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "spl-program-error 0.4.4", + "solana-zk-token-sdk", + "spl-program-error 0.5.0", ] [[package]] -name = "spl-program-error" -version = "0.3.0" +name = "spl-pod" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c" +checksum = "41a7d5950993e1ff2680bd989df298eeb169367fb2f9deeef1f132de6e4e8016" dependencies = [ - "num-derive 0.4.2", + "borsh 1.5.3", + "bytemuck", + "bytemuck_derive", + "num-derive", "num-traits", - "solana-program", - "spl-program-error-derive 0.3.2", + "solana-decode-error", + "solana-msg", + "solana-program-error", + "solana-program-option", + "solana-pubkey", + "solana-zk-sdk", "thiserror 1.0.69", ] [[package]] name = "spl-program-error" -version = "0.4.4" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e45a49acb925db68aa501b926096b2164adbdcade7a0c24152af9f0742d0a602" +checksum = "d7b28bed65356558133751cc32b48a7a5ddfc59ac4e941314630bbed1ac10532" dependencies = [ - "num-derive 0.4.2", + "num-derive", "num-traits", "solana-program", - "spl-program-error-derive 0.4.1", + "spl-program-error-derive", "thiserror 1.0.69", ] [[package]] -name = "spl-program-error-derive" -version = "0.3.2" +name = "spl-program-error" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1845dfe71fd68f70382232742e758557afe973ae19e6c06807b2c30f5d5cb474" +checksum = "9d39b5186f42b2b50168029d81e58e800b690877ef0b30580d107659250da1d1" dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", - "sha2 0.10.8", - "syn 2.0.93", + "num-derive", + "num-traits", + "solana-program", + "spl-program-error-derive", + "thiserror 1.0.69", ] [[package]] @@ -8854,295 +9176,357 @@ dependencies = [ [[package]] name = "spl-stake-pool" -version = "1.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48f973333ac37c47dac368cc13088ebebaa7d67e50a7f56a2a83f090bc32c2cb" +checksum = "dc2b2908579aefbdb1ed3e941252cab09e7e471e5b52efd5ecc54d20829ef5e8" dependencies = [ "arrayref", "bincode", - "borsh 0.10.4", + "borsh 1.5.3", "bytemuck", - "num-derive 0.4.2", + "num-derive", "num-traits", - "num_enum 0.7.3", + "num_enum", "serde", "serde_derive", "solana-program", "solana-security-txt", - "spl-math", - "spl-pod 0.1.0", - "spl-token-2022 0.9.0", - "thiserror 1.0.69", + "spl-pod 0.3.1", + "spl-token-2022 4.0.0", + "thiserror 2.0.11", ] [[package]] name = "spl-tlv-account-resolution" -version = "0.4.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" +checksum = "37a75a5f0fcc58126693ed78a17042e9dc53f07e357d6be91789f7d62aff61a4" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator 0.1.0", - "spl-pod 0.1.0", - "spl-program-error 0.3.0", - "spl-type-length-value 0.3.0", + "spl-discriminator 0.3.0", + "spl-pod 0.3.1", + "spl-program-error 0.5.0", + "spl-type-length-value 0.5.0", ] [[package]] name = "spl-tlv-account-resolution" -version = "0.5.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "615d381f48ddd2bb3c57c7f7fb207591a2a05054639b18a62e785117dd7a8683" +checksum = "cd99ff1e9ed2ab86e3fd582850d47a739fec1be9f4661cba1782d3a0f26805f3" dependencies = [ "bytemuck", - "solana-program", - "spl-discriminator 0.1.0", - "spl-pod 0.1.0", - "spl-program-error 0.3.0", - "spl-type-length-value 0.3.0", + "num-derive", + "num-traits", + "solana-account-info", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "spl-discriminator 0.4.1", + "spl-pod 0.5.0", + "spl-program-error 0.6.0", + "spl-type-length-value 0.7.0", + "thiserror 1.0.69", ] [[package]] -name = "spl-tlv-account-resolution" -version = "0.6.5" +name = "spl-token" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fab8edfd37be5fa17c9e42c1bff86abbbaf0494b031b37957f2728ad2ff842ba" +checksum = "70a0f06ac7f23dc0984931b1fe309468f14ea58e32660439c1cef19456f5d0e3" dependencies = [ + "arrayref", "bytemuck", + "num-derive", + "num-traits", + "num_enum", "solana-program", - "spl-discriminator 0.2.5", - "spl-pod 0.2.5", - "spl-program-error 0.4.4", - "spl-type-length-value 0.4.6", + "thiserror 1.0.69", ] [[package]] name = "spl-token" -version = "3.5.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +checksum = "ed320a6c934128d4f7e54fe00e16b8aeaecf215799d060ae14f93378da6dc834" dependencies = [ "arrayref", "bytemuck", - "num-derive 0.3.3", + "num-derive", "num-traits", - "num_enum 0.5.11", + "num_enum", "solana-program", "thiserror 1.0.69", ] [[package]] -name = "spl-token" +name = "spl-token-2022" version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08459ba1b8f7c1020b4582c4edf0f5c7511a5e099a7a97570c9698d4f2337060" +checksum = "d9c10f3483e48679619c76598d4e4aebb955bc49b0a5cc63323afbf44135c9bf" dependencies = [ "arrayref", "bytemuck", - "num-derive 0.3.3", + "num-derive", "num-traits", - "num_enum 0.6.1", + "num_enum", "solana-program", + "solana-security-txt", + "solana-zk-token-sdk", + "spl-memo 5.0.0", + "spl-pod 0.3.1", + "spl-token 6.0.0", + "spl-token-group-interface 0.3.0", + "spl-token-metadata-interface 0.4.0", + "spl-transfer-hook-interface 0.7.0", + "spl-type-length-value 0.5.0", "thiserror 1.0.69", ] [[package]] name = "spl-token-2022" -version = "0.9.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86" +checksum = "5b27f7405010ef816587c944536b0eafbcc35206ab6ba0f2ca79f1d28e488f4f" dependencies = [ "arrayref", "bytemuck", - "num-derive 0.4.2", + "num-derive", "num-traits", - "num_enum 0.7.3", + "num_enum", "solana-program", - "solana-zk-token-sdk 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "spl-memo", - "spl-pod 0.1.0", - "spl-token 4.0.0", - "spl-token-metadata-interface 0.2.0", - "spl-transfer-hook-interface 0.3.0", - "spl-type-length-value 0.3.0", + "solana-security-txt", + "solana-zk-sdk", + "spl-elgamal-registry", + "spl-memo 6.0.0", + "spl-pod 0.5.0", + "spl-token 7.0.0", + "spl-token-confidential-transfer-ciphertext-arithmetic", + "spl-token-confidential-transfer-proof-extraction", + "spl-token-confidential-transfer-proof-generation 0.2.0", + "spl-token-group-interface 0.5.0", + "spl-token-metadata-interface 0.6.0", + "spl-transfer-hook-interface 0.9.0", + "spl-type-length-value 0.7.0", "thiserror 1.0.69", ] [[package]] name = "spl-token-2022" -version = "1.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d697fac19fd74ff472dfcc13f0b442dd71403178ce1de7b5d16f83a33561c059" +checksum = "9048b26b0df0290f929ff91317c83db28b3ef99af2b3493dd35baa146774924c" dependencies = [ "arrayref", "bytemuck", - "num-derive 0.4.2", + "num-derive", "num-traits", - "num_enum 0.7.3", + "num_enum", "solana-program", "solana-security-txt", - "solana-zk-token-sdk 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "spl-memo", - "spl-pod 0.1.0", - "spl-token 4.0.0", - "spl-token-group-interface 0.1.0", - "spl-token-metadata-interface 0.2.0", - "spl-transfer-hook-interface 0.4.1", - "spl-type-length-value 0.3.0", - "thiserror 1.0.69", + "solana-zk-sdk", + "spl-elgamal-registry", + "spl-memo 6.0.0", + "spl-pod 0.5.0", + "spl-token 7.0.0", + "spl-token-confidential-transfer-ciphertext-arithmetic", + "spl-token-confidential-transfer-proof-extraction", + "spl-token-confidential-transfer-proof-generation 0.3.0", + "spl-token-group-interface 0.5.0", + "spl-token-metadata-interface 0.6.0", + "spl-transfer-hook-interface 0.9.0", + "spl-type-length-value 0.7.0", + "thiserror 2.0.11", ] [[package]] -name = "spl-token-2022" -version = "3.0.5" +name = "spl-token-confidential-transfer-ciphertext-arithmetic" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c39e416aeb1ea0b22f3b2bbecaf7e38a92a1aa8f4a0c5785c94179694e846a0" +checksum = "170378693c5516090f6d37ae9bad2b9b6125069be68d9acd4865bbe9fc8499fd" dependencies = [ - "arrayref", + "base64 0.22.1", "bytemuck", - "num-derive 0.4.2", - "num-traits", - "num_enum 0.7.3", - "solana-program", - "solana-security-txt", - "solana-zk-token-sdk 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", - "spl-memo", - "spl-pod 0.2.5", - "spl-token 4.0.0", - "spl-token-group-interface 0.2.5", - "spl-token-metadata-interface 0.3.5", - "spl-transfer-hook-interface 0.6.5", - "spl-type-length-value 0.4.6", - "thiserror 1.0.69", + "solana-curve25519", + "solana-zk-sdk", ] [[package]] -name = "spl-token-group-interface" -version = "0.1.0" +name = "spl-token-confidential-transfer-proof-extraction" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b889509d49fa74a4a033ca5dae6c2307e9e918122d97e58562f5c4ffa795c75d" +checksum = "eff2d6a445a147c9d6dd77b8301b1e116c8299601794b558eafa409b342faf96" dependencies = [ "bytemuck", + "solana-curve25519", "solana-program", - "spl-discriminator 0.1.0", - "spl-pod 0.1.0", - "spl-program-error 0.3.0", + "solana-zk-sdk", + "spl-pod 0.5.0", + "thiserror 2.0.11", +] + +[[package]] +name = "spl-token-confidential-transfer-proof-generation" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8627184782eec1894de8ea26129c61303f1f0adeed65c20e0b10bc584f09356d" +dependencies = [ + "curve25519-dalek 4.1.3", + "solana-zk-sdk", + "thiserror 1.0.69", +] + +[[package]] +name = "spl-token-confidential-transfer-proof-generation" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e3597628b0d2fe94e7900fd17cdb4cfbb31ee35c66f82809d27d86e44b2848b" +dependencies = [ + "curve25519-dalek 4.1.3", + "solana-zk-sdk", + "thiserror 2.0.11", ] [[package]] name = "spl-token-group-interface" -version = "0.2.5" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "014817d6324b1e20c4bbc883e8ee30a5faa13e59d91d1b2b95df98b920150c17" +checksum = "df8752b85a5ecc1d9f3a43bce3dd9a6a053673aacf5deb513d1cbb88d3534ffd" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator 0.2.5", - "spl-pod 0.2.5", - "spl-program-error 0.4.4", + "spl-discriminator 0.3.0", + "spl-pod 0.3.1", + "spl-program-error 0.5.0", ] [[package]] -name = "spl-token-metadata-interface" -version = "0.2.0" +name = "spl-token-group-interface" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" +checksum = "d595667ed72dbfed8c251708f406d7c2814a3fa6879893b323d56a10bedfc799" dependencies = [ - "borsh 0.10.4", - "solana-program", - "spl-discriminator 0.1.0", - "spl-pod 0.1.0", - "spl-program-error 0.3.0", - "spl-type-length-value 0.3.0", + "bytemuck", + "num-derive", + "num-traits", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "spl-discriminator 0.4.1", + "spl-pod 0.5.0", + "thiserror 1.0.69", ] [[package]] name = "spl-token-metadata-interface" -version = "0.3.5" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3da00495b602ebcf5d8ba8b3ecff1ee454ce4c125c9077747be49c2d62335ba" +checksum = "c6c2318ddff97e006ed9b1291ebec0750a78547f870f62a69c56fe3b46a5d8fc" dependencies = [ "borsh 1.5.3", "solana-program", - "spl-discriminator 0.2.5", - "spl-pod 0.2.5", - "spl-program-error 0.4.4", - "spl-type-length-value 0.4.6", + "spl-discriminator 0.3.0", + "spl-pod 0.3.1", + "spl-program-error 0.5.0", + "spl-type-length-value 0.5.0", ] [[package]] -name = "spl-transfer-hook-interface" -version = "0.3.0" +name = "spl-token-metadata-interface" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b" +checksum = "dfb9c89dbc877abd735f05547dcf9e6e12c00c11d6d74d8817506cab4c99fdbb" dependencies = [ - "arrayref", - "bytemuck", - "solana-program", - "spl-discriminator 0.1.0", - "spl-pod 0.1.0", - "spl-program-error 0.3.0", - "spl-tlv-account-resolution 0.4.0", - "spl-type-length-value 0.3.0", + "borsh 1.5.3", + "num-derive", + "num-traits", + "solana-borsh", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "spl-discriminator 0.4.1", + "spl-pod 0.5.0", + "spl-type-length-value 0.7.0", + "thiserror 1.0.69", ] [[package]] name = "spl-transfer-hook-interface" -version = "0.4.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aabdb7c471566f6ddcee724beb8618449ea24b399e58d464d6b5bc7db550259" +checksum = "a110f33d941275d9f868b96daaa993f1e73b6806cc8836e43075b4d3ad8338a7" dependencies = [ "arrayref", "bytemuck", "solana-program", - "spl-discriminator 0.1.0", - "spl-pod 0.1.0", - "spl-program-error 0.3.0", - "spl-tlv-account-resolution 0.5.1", - "spl-type-length-value 0.3.0", + "spl-discriminator 0.3.0", + "spl-pod 0.3.1", + "spl-program-error 0.5.0", + "spl-tlv-account-resolution 0.7.0", + "spl-type-length-value 0.5.0", ] [[package]] name = "spl-transfer-hook-interface" -version = "0.6.5" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b5c08a89838e5a2931f79b17f611857f281a14a2100968a3ccef352cb7414b" +checksum = "4aa7503d52107c33c88e845e1351565050362c2314036ddf19a36cd25137c043" dependencies = [ "arrayref", "bytemuck", - "solana-program", - "spl-discriminator 0.2.5", - "spl-pod 0.2.5", - "spl-program-error 0.4.4", - "spl-tlv-account-resolution 0.6.5", - "spl-type-length-value 0.4.6", + "num-derive", + "num-traits", + "solana-account-info", + "solana-cpi", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "spl-discriminator 0.4.1", + "spl-pod 0.5.0", + "spl-program-error 0.6.0", + "spl-tlv-account-resolution 0.9.0", + "spl-type-length-value 0.7.0", + "thiserror 1.0.69", ] [[package]] name = "spl-type-length-value" -version = "0.3.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a468e6f6371f9c69aae760186ea9f1a01c2908351b06a5e0026d21cfc4d7ecac" +checksum = "bdcd73ec187bc409464c60759232e309f83b52a18a9c5610bf281c9c6432918c" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator 0.1.0", - "spl-pod 0.1.0", - "spl-program-error 0.3.0", + "spl-discriminator 0.3.0", + "spl-pod 0.3.1", + "spl-program-error 0.5.0", ] [[package]] name = "spl-type-length-value" -version = "0.4.6" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c872f93d0600e743116501eba2d53460e73a12c9a496875a42a7d70e034fe06d" +checksum = "ba70ef09b13af616a4c987797870122863cba03acc4284f226a4473b043923f9" dependencies = [ "bytemuck", - "solana-program", - "spl-discriminator 0.2.5", - "spl-pod 0.2.5", - "spl-program-error 0.4.4", + "num-derive", + "num-traits", + "solana-account-info", + "solana-decode-error", + "solana-msg", + "solana-program-error", + "spl-discriminator 0.4.1", + "spl-pod 0.5.0", + "thiserror 1.0.69", ] [[package]] @@ -9174,12 +9558,6 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strsim" version = "0.11.1" @@ -9210,9 +9588,9 @@ dependencies = [ [[package]] name = "subtle" -version = "2.4.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "sval" @@ -9304,14 +9682,14 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.8", - "sha3 0.10.8", + "sha3", ] [[package]] name = "switchboard-on-demand" -version = "0.1.17" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497d53961d56f61e5e5a789d95b4aa4d17fbd28cece8a041b727f14e0f89816d" +checksum = "823fb60772f02779cddcdda22f735acf24eefe74ed696210cf4f41a749efb4e4" dependencies = [ "arc-swap", "async-trait", @@ -9323,23 +9701,21 @@ dependencies = [ "lazy_static", "libsecp256k1 0.7.1", "log", - "num 0.4.3", "rust_decimal", "serde", - "serde_json", "sha2 0.10.8", - "solana-address-lookup-table-program 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-address-lookup-table-program", "solana-program", - "spl-associated-token-account", - "spl-token 3.5.0", + "spl-associated-token-account 6.0.0", + "spl-token 7.0.0", "switchboard-common", ] [[package]] name = "switchboard-on-demand-client" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "948936c9e0d2eb83a45a386b18c171347d3b80d1e38e16e5ed3bbb736e75e3f5" +checksum = "d67d552c2fc2fd0fb1236454957113eb08871a8723c010451a79ce26d3128a62" dependencies = [ "anyhow_ext", "arrayref", @@ -9361,7 +9737,7 @@ dependencies = [ "serde_derive", "serde_json", "sha2 0.10.8", - "solana-client 1.18.26 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-client", "solana-sdk", "tokio", ] @@ -9411,6 +9787,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + [[package]] name = "synstructure" version = "0.12.6" @@ -9464,7 +9846,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -9505,18 +9887,43 @@ dependencies = [ "fnv", "futures 0.3.31", "humantime", - "opentelemetry", + "opentelemetry 0.17.0", "pin-project", "rand 0.8.5", "serde", "static_assertions", - "tarpc-plugins", + "tarpc-plugins 0.12.0", "thiserror 1.0.69", "tokio", - "tokio-serde", + "tokio-serde 0.8.0", "tokio-util 0.6.10", "tracing", - "tracing-opentelemetry", + "tracing-opentelemetry 0.17.4", +] + +[[package]] +name = "tarpc" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14d1be17be018ebeec4c489449adb5ef227746775974c311ce79e09886ef83c7" +dependencies = [ + "anyhow", + "fnv", + "futures 0.3.31", + "humantime", + "opentelemetry 0.26.0", + "opentelemetry-semantic-conventions", + "pin-project", + "rand 0.8.5", + "serde", + "static_assertions", + "tarpc-plugins 0.14.0", + "thiserror 1.0.69", + "tokio", + "tokio-serde 0.9.0", + "tokio-util 0.7.13", + "tracing", + "tracing-opentelemetry 0.27.0", ] [[package]] @@ -9530,6 +9937,26 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "tarpc-plugins" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0e3d9676af494694e11a3e367a4bfa7f6d1d5566bd0fe9aceb4aa9281122ab8" +dependencies = [ + "proc-macro2 1.0.92", + "quote 1.0.38", + "syn 2.0.93", +] + +[[package]] +name = "task-local-extensions" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba323866e5d033818e3240feeb9f7db2c4296674e4d9e16b97b7bf8f490434e8" +dependencies = [ + "pin-utils", +] + [[package]] name = "tempfile" version = "3.14.0" @@ -9558,39 +9985,6 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" -[[package]] -name = "test-case" -version = "3.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb2550dd13afcd286853192af8601920d959b14c401fcece38071d53bf0768a8" -dependencies = [ - "test-case-macros", -] - -[[package]] -name = "test-case-core" -version = "3.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcb7fd841cd518e279be3d5a3eb0636409487998a4aff22f3de87b81e88384f" -dependencies = [ - "cfg-if 1.0.0", - "proc-macro2 1.0.92", - "quote 1.0.38", - "syn 2.0.93", -] - -[[package]] -name = "test-case-macros" -version = "3.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" -dependencies = [ - "proc-macro2 1.0.92", - "quote 1.0.38", - "syn 2.0.93", - "test-case-core", -] - [[package]] name = "textwrap" version = "0.11.0" @@ -9600,12 +9994,6 @@ dependencies = [ "unicode-width 0.1.14", ] -[[package]] -name = "textwrap" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" - [[package]] name = "thiserror" version = "1.0.69" @@ -9698,7 +10086,7 @@ dependencies = [ "once_cell", "pbkdf2 0.4.0", "rand 0.7.3", - "rustc-hash", + "rustc-hash 1.1.0", "sha2 0.9.9", "thiserror 1.0.69", "unicode-normalization", @@ -9758,29 +10146,29 @@ dependencies = [ "rand 0.8.5", "serde", "serde_json", - "solana-account-decoder 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-accounts-db 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-clap-utils 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "solana-client 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-account-decoder", + "solana-accounts-db", + "solana-clap-utils", + "solana-client", "solana-core", "solana-geyser-plugin-manager", "solana-gossip", "solana-ledger", "solana-measure", - "solana-metrics 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-metrics", "solana-program", - "solana-program-test 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-program-test", "solana-rpc", "solana-rpc-client", "solana-rpc-client-api", - "solana-runtime 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-runtime", "solana-sdk", - "solana-stake-program 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", + "solana-stake-program", "solana-streamer", "solana-transaction-status", "solana-unified-scheduler-pool", - "solana-vote 1.18.26 (git+https://github.com/jito-foundation/jito-solana.git?rev=0bbcbe476c0e728907ac01135115e661c16538e5)", - "spl-memo", + "solana-vote", + "spl-memo 6.0.0", "tempfile", "thiserror 1.0.69", "tokio", @@ -9788,9 +10176,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.42.0" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", @@ -9816,9 +10204,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2 1.0.92", "quote 1.0.38", @@ -9841,7 +10229,17 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls", + "rustls 0.21.12", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +dependencies = [ + "rustls 0.23.22", "tokio", ] @@ -9853,7 +10251,23 @@ checksum = "911a61637386b789af998ee23f50aa30d5fd7edcec8d6d3dedae5e5815205466" dependencies = [ "bincode", "bytes", - "educe", + "educe 0.4.23", + "futures-core", + "futures-sink", + "pin-project", + "serde", + "serde_json", +] + +[[package]] +name = "tokio-serde" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf600e7036b17782571dd44fa0a5cea3c82f60db5137f774a325a76a0d6852b" +dependencies = [ + "bincode", + "bytes", + "educe 0.5.11", "futures-core", "futures-sink", "pin-project", @@ -9880,9 +10294,9 @@ checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" dependencies = [ "futures-util", "log", - "rustls", + "rustls 0.21.12", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", "tungstenite", "webpki-roots 0.25.4", ] @@ -9895,7 +10309,6 @@ checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" dependencies = [ "bytes", "futures-core", - "futures-io", "futures-sink", "log", "pin-project-lite", @@ -9911,8 +10324,10 @@ checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", + "futures-io", "futures-sink", "pin-project-lite", + "slab", "tokio", ] @@ -9934,7 +10349,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.22", + "toml_edit", ] [[package]] @@ -9946,17 +10361,6 @@ dependencies = [ "serde", ] -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap 2.7.0", - "toml_datetime", - "winnow 0.5.40", -] - [[package]] name = "toml_edit" version = "0.22.22" @@ -9967,7 +10371,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.20", + "winnow", ] [[package]] @@ -9978,27 +10382,62 @@ checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" dependencies = [ "async-stream", "async-trait", - "axum", + "axum 0.6.20", "base64 0.21.7", "bytes", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-timeout", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper-timeout 0.4.1", "percent-encoding 2.3.1", "pin-project", "prost 0.11.9", - "rustls-pemfile", + "rustls-pemfile 1.0.4", + "tokio", + "tokio-rustls 0.24.1", + "tokio-stream", + "tower 0.4.13", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" +dependencies = [ + "async-stream", + "async-trait", + "axum 0.7.9", + "base64 0.22.1", + "bytes", + "flate2", + "h2 0.4.7", + "http 1.2.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.6.0", + "hyper-timeout 0.5.2", + "hyper-util", + "percent-encoding 2.3.1", + "pin-project", + "prost 0.13.4", + "rustls-native-certs 0.8.1", + "rustls-pemfile 2.2.0", + "socket2", "tokio", - "tokio-rustls", + "tokio-rustls 0.26.1", "tokio-stream", - "tower", + "tower 0.4.13", "tower-layer", "tower-service", "tracing", + "zstd", ] [[package]] @@ -10009,11 +10448,38 @@ checksum = "a6fdaae4c2c638bb70fe42803a26fbd6fc6ac8c72f5c59f67ecc2a2dcabf4b07" dependencies = [ "prettyplease 0.1.25", "proc-macro2 1.0.92", - "prost-build", + "prost-build 0.11.9", "quote 1.0.38", "syn 1.0.109", ] +[[package]] +name = "tonic-build" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11" +dependencies = [ + "prettyplease 0.2.25", + "proc-macro2 1.0.92", + "prost-build 0.13.4", + "prost-types 0.13.4", + "quote 1.0.38", + "syn 2.0.93", +] + +[[package]] +name = "tonic-health" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1eaf34ddb812120f5c601162d5429933c9b527d901ab0e7f930d3147e33a09b2" +dependencies = [ + "async-stream", + "prost 0.13.4", + "tokio", + "tokio-stream", + "tonic 0.12.3", +] + [[package]] name = "tower" version = "0.4.13" @@ -10034,6 +10500,20 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 1.0.2", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -10086,10 +10566,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbbe89715c1dbbb790059e2565353978564924ee85017b5fff365c872ff6721f" dependencies = [ "once_cell", - "opentelemetry", + "opentelemetry 0.17.0", + "tracing", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "tracing-opentelemetry" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc58af5d3f6c5811462cabb3289aec0093f7338e367e5a33d28c0433b3c7360b" +dependencies = [ + "js-sys", + "once_cell", + "opentelemetry 0.26.0", + "opentelemetry_sdk", "tracing", "tracing-core", "tracing-subscriber", + "web-time", ] [[package]] @@ -10124,11 +10620,11 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http", + "http 0.2.12", "httparse", "log", "rand 0.8.5", - "rustls", + "rustls 0.21.12", "sha1", "thiserror 1.0.69", "url 2.5.4", @@ -10156,9 +10652,9 @@ checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "uint" -version = "0.9.5" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +checksum = "909988d098b2f738727b161a106cfc7cab00c539c2687a8836f8e565976fb53e" dependencies = [ "byteorder", "crunchy", @@ -10166,6 +10662,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "unicase" version = "2.8.1" @@ -10231,11 +10733,11 @@ checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" [[package]] name = "universal-hash" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ - "generic-array", + "crypto-common", "subtle", ] @@ -10254,12 +10756,6 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - [[package]] name = "untrusted" version = "0.9.0" @@ -10376,6 +10872,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "vec_extract_if_polyfill" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c9cb5fb67c2692310b6eb3fce7dd4b6e4c9a75be4f2f46b27f0b2b7799759c" + [[package]] name = "vec_map" version = "0.8.2" @@ -10394,6 +10896,15 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + [[package]] name = "walkdir" version = "2.5.0" @@ -10512,13 +11023,22 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-root-certs" +version = "0.26.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09aed61f5e8d2c18344b3faa33a4c837855fe56642757754775548fee21386c4" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "webpki-roots" version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" dependencies = [ - "rustls-webpki", + "rustls-webpki 0.101.7", ] [[package]] @@ -10739,15 +11259,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - [[package]] name = "winnow" version = "0.6.20" @@ -10824,12 +11335,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] -name = "yasna" -version = "0.5.2" +name = "yellowstone-grpc-client" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +checksum = "f792b88fda421a42ede938e9d566f65228cf2870ed508df388c4f4465b2e0f49" dependencies = [ - "time", + "bytes", + "futures 0.3.31", + "thiserror 1.0.69", + "tonic 0.12.3", + "tonic-health", + "yellowstone-grpc-proto", +] + +[[package]] +name = "yellowstone-grpc-proto" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488d19f109595858dcb4010d770720628e5600a6857e596f3ebbc49d8893bdb1" +dependencies = [ + "anyhow", + "bincode", + "prost 0.13.4", + "prost-types 0.13.4", + "protobuf-src", + "solana-account-decoder", + "solana-sdk", + "solana-transaction-status", + "tonic 0.12.3", + "tonic-build 0.12.3", ] [[package]] @@ -10900,9 +11434,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.3.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -10942,20 +11476,19 @@ dependencies = [ [[package]] name = "zstd" -version = "0.11.2+zstd.1.5.2" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" dependencies = [ - "libc", "zstd-sys", ] @@ -10968,3 +11501,78 @@ dependencies = [ "cc", "pkg-config", ] + +[[patch.unused]] +name = "solana-bench-tps" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" + +[[patch.unused]] +name = "solana-download-utils" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" + +[[patch.unused]] +name = "solana-frozen-abi" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" + +[[patch.unused]] +name = "solana-frozen-abi-macro" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" + +[[patch.unused]] +name = "solana-genesis" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" + +[[patch.unused]] +name = "solana-genesis-utils" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" + +[[patch.unused]] +name = "solana-local-cluster" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" + +[[patch.unused]] +name = "solana-notifier" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" + +[[patch.unused]] +name = "solana-package-metadata" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" + +[[patch.unused]] +name = "solana-package-metadata-macro" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" + +[[patch.unused]] +name = "solana-svm-conformance" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" + +[[patch.unused]] +name = "solana-test-validator" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" + +[[patch.unused]] +name = "solana-tps-client" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" + +[[patch.unused]] +name = "solana-tpu-client-next" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" + +[[patch.unused]] +name = "solana-zk-keygen" +version = "2.1.11" +source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" diff --git a/Cargo.toml b/Cargo.toml index ce69f99e..37b123d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,7 +32,7 @@ edition = "2021" readme = "README.md" [workspace.dependencies] -anchor-lang = { version = "0.30.1" } +anchor-lang = { git = "https://github.com/coral-xyz/anchor", rev = "96ed3b791c6fed9ab64cb138397795fe55991280" } anyhow = "1.0.86" assert_matches = "1.5.0" borsh = { version = "0.10.3" } @@ -42,7 +42,7 @@ chrono = "0.4.38" clap = { version = "4.5.16", features = ["derive", "env", "cargo"] } clap_old = { package = "clap", version = "2.33.1" } clap-markdown = { version = "0.1.4" } -const_str_to_pubkey = "0.1.1" +const_str_to_pubkey = "0.2.0" dotenv = "0.15.0" envfile = "0.2.1" env_logger = "0.10.2" @@ -64,36 +64,44 @@ serde_with = "3.9.0" serde-big-array = "0.5.1" shank = "0.4.2" shank_idl = "0.4.2" -spl-math = { version = "0.2.0", features = ["no-entrypoint"] } -spl-memo = "4.0.0" -solana-account-decoder = { package = "solana-account-decoder", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-metrics = { package = "solana-metrics", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-accounts-db = { package = "solana-accounts-db", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-clap-utils = { package = "solana-clap-utils", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-client = { package = "solana-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-core = { package = "solana-core", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-geyser-plugin-manager = { package = "solana-geyser-plugin-manager", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-gossip = { package = "solana-gossip", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-measure = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-ledger = { package = "solana-ledger", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-program = { package = "solana-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-transaction-status = { package = "solana-transaction-status", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-program-test = { package = "solana-program-test", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-rpc-client = { package = "solana-rpc-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-rpc = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-rpc-client-api = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-runtime = { package = "solana-runtime", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-streamer = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-sdk = { package = "solana-sdk", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-stake-program = { package = "solana-stake-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-vote = { package = "solana-vote", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-unified-scheduler-pool = { package = "solana-unified-scheduler-pool", git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +spl-math = { version = "0.3.0", features = ["no-entrypoint"] } +spl-memo = "6.0.0" +solana-account-decoder = { package = "solana-account-decoder", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-metrics = { package = "solana-metrics", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-accounts-db = { package = "solana-accounts-db", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-clap-utils = { package = "solana-clap-utils", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-client = { package = "solana-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-core = { package = "solana-core", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-geyser-plugin-manager = { package = "solana-geyser-plugin-manager", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-gossip = { package = "solana-gossip", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-measure = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-ledger = { package = "solana-ledger", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-program = { package = "solana-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-transaction-status = { package = "solana-transaction-status", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-program-test = { package = "solana-program-test", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-rpc-client = { package = "solana-rpc-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-rpc = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-rpc-client-api = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-runtime = { package = "solana-runtime", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-streamer = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-sdk = { package = "solana-sdk", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-stake-program = { package = "solana-stake-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-vote = { package = "solana-vote", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-unified-scheduler-pool = { package = "solana-unified-scheduler-pool", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-zk-sdk = { package = "solana-zk-sdk", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-zk-token-sdk = { package = "solana-zk-token-sdk", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-instruction = { package = "solana-instruction", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-program-error = { package = "solana-program-error", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-pubkey = { package = "solana-pubkey", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-account-info = { package = "solana-account-info", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-program-entrypoint = { package = "solana-program-entrypoint", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-decode-error = { package = "solana-decode-error", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-security-txt = "1.1.1" -spl-associated-token-account = { version = "2.3.0", features = ["no-entrypoint"] } -spl-stake-pool = { version = "1.0.0", features = ["no-entrypoint"] } -spl-token = { version = "4.0.0", features = ["no-entrypoint"] } -spl-token-2022 = "=1.0.0" -switchboard-on-demand = "0.1.0" +spl-associated-token-account = { version = "6.0.0", features = ["no-entrypoint"] } +spl-stake-pool = { version = "2.0.1", features = ["no-entrypoint"] } +spl-token = { version = "7.0.0", features = ["no-entrypoint"] } +spl-token-2022 = { version = "=7.0.0", features = ["no-entrypoint"] } +switchboard-on-demand = "0.3.4" syn = "2.0.72" thiserror = "1.0.57" tokio = { version = "1.36.0", features = ["full"] } @@ -104,31 +112,154 @@ jito-tip-router-client = { path = "./clients/rust/jito_tip_router", version = "0 jito-tip-router-core = { path = "./core", version = "=0.0.1" } jito-tip-router-program = { path = "./program", version = "=0.0.1" } jito-tip-router-shank-cli = { path = "./shank_cli", version = "=0.0.1" } -jito-bytemuck = { git = "https://github.com/jito-foundation/restaking.git", rev = "eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" } -jito-account-traits-derive = { git = "https://github.com/jito-foundation/restaking.git", rev = "eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" } -jito-jsm-core = { git = "https://github.com/jito-foundation/restaking.git", rev = "eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" } -jito-restaking-client = { git = "https://github.com/jito-foundation/restaking.git", rev = "eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" } -jito-restaking-core = { git = "https://github.com/jito-foundation/restaking.git", rev = "eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" } -jito-restaking-program = { git = "https://github.com/jito-foundation/restaking.git", rev = "eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d", features = ["no-entrypoint"] } -jito-restaking-sdk = { git = "https://github.com/jito-foundation/restaking.git", rev = "eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" } -jito-vault-client = { git = "https://github.com/jito-foundation/restaking.git", rev = "eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" } -jito-vault-core = { git = "https://github.com/jito-foundation/restaking.git", rev = "eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" } -jito-vault-program = { git = "https://github.com/jito-foundation/restaking.git", rev = "eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d", features = ["no-entrypoint"] } -jito-vault-sdk = { git = "https://github.com/jito-foundation/restaking.git", rev = "eaf88e7e5ca2845fe3108c4fc4a06a25f9a8514d" } +jito-bytemuck = { path = "../../jito-foundation/restaking/bytemuck" } +jito-account-traits-derive = { path = "../../jito-foundation/restaking" } +jito-jsm-core = { path = "../../jito-foundation/restaking/core" } +jito-restaking-client = { path = "../../jito-foundation/restaking/clients/rust/restaking_client" } +jito-restaking-core = { path = "../../jito-foundation/restaking/restaking_core" } +jito-restaking-program = { path = "../../jito-foundation/restaking/restaking_program", features = ["no-entrypoint"] } +jito-restaking-sdk = { path = "../../jito-foundation/restaking/restaking_sdk" } +jito-vault-client = { path = "../../jito-foundation/restaking/clients/rust/vault_client" } +jito-vault-core = { path = "../../jito-foundation/restaking/vault_core" } +jito-vault-program = { path = "../../jito-foundation/restaking/vault_program", features = ["no-entrypoint"] } +jito-vault-sdk = { path = "../../jito-foundation/restaking/vault_sdk" } [patch.crates-io] -# Force all Solana dependencies to use the Jito fork -solana-program = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-sdk = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-rpc-client = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -# necessary for solana thin client -solana-rpc-client-api = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -# necessary for ellipsis client -solana-transaction-status = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-core = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-geyser-plugin-manager = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-gossip = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-measure = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-rpc = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-streamer = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } -solana-unified-scheduler-pool = { git = "https://github.com/jito-foundation/jito-solana.git", rev = "0bbcbe476c0e728907ac01135115e661c16538e5" } +solana-account = { package = "solana-account", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-account-decoder = { package = "solana-account-decoder", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-account-decoder-client-types = { package = "solana-account-decoder-client-types", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-account-info = { package = "solana-account-info", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-accounts-db = { package = "solana-accounts-db", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-address-lookup-table-program = { package = "solana-address-lookup-table-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-atomic-u64 = { package = "solana-atomic-u64", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-banks-client = { package = "solana-banks-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-banks-interface = { package = "solana-banks-interface", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-banks-server = { package = "solana-banks-server", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-bench-tps = { package = "solana-bench-tps", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-bincode = { package = "solana-bincode", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-bloom = { package = "solana-bloom", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-bn254 = { package = "solana-bn254", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-borsh = { package = "solana-borsh", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-bpf-loader-program = { package = "solana-bpf-loader-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-bucket-map = { package = "solana-bucket-map", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-builtins-default-costs = { package = "solana-builtins-default-costs", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-clap-utils = { package = "solana-clap-utils", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-cli-config = { package = "solana-cli-config", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-client = { package = "solana-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-clock = { package = "solana-clock", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-compute-budget = { package = "solana-compute-budget", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-config-program = { package = "solana-config-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-connection-cache = { package = "solana-connection-cache", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-core = { package = "solana-core", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-cost-model = { package = "solana-cost-model", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-cpi = { package = "solana-cpi", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-curve25519 = { package = "solana-curve25519", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-decode-error = { package = "solana-decode-error", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-define-syscall = { package = "solana-define-syscall", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-derivation-path = { package = "solana-derivation-path", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-download-utils = { package = "solana-download-utils", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-entry = { package = "solana-entry", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-program-entrypoint = { package = "solana-program-entrypoint", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-epoch-schedule = { package = "solana-epoch-schedule", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-faucet = { package = "solana-faucet", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-feature-set = { package = "solana-feature-set", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-fee-calculator = { package = "solana-fee-calculator", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-fee = { package = "solana-fee", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-frozen-abi = { package = "solana-frozen-abi", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-frozen-abi-macro = { package = "solana-frozen-abi-macro", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-tps-client = { package = "solana-tps-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-genesis = { package = "solana-genesis", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-genesis-utils = { package = "solana-genesis-utils", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-geyser-plugin-manager = { package = "solana-geyser-plugin-manager", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-gossip = { package = "solana-gossip", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-hash = { package = "solana-hash", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-inflation = { package = "solana-inflation", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-inline-spl = { package = "solana-inline-spl", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-instruction = { package = "solana-instruction", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-last-restart-slot = { package = "solana-last-restart-slot", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-lattice-hash = { package = "solana-lattice-hash", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-ledger = { package = "solana-ledger", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-loader-v4-program = { package = "solana-loader-v4-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-local-cluster = { package = "solana-local-cluster", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-log-collector = { package = "solana-log-collector", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-logger = { package = "solana-logger", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-measure = { package = "solana-measure", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-merkle-tree = { package = "solana-merkle-tree", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-metrics = { package = "solana-metrics", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-msg = { package = "solana-msg", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-native-token = { package = "solana-native-token", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-net-utils = { package = "solana-net-utils", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-notifier = { package = "solana-notifier", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-package-metadata = { package = "solana-package-metadata", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-package-metadata-macro = { package = "solana-package-metadata-macro", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-packet = { package = "solana-packet", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-perf = { package = "solana-perf", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-poh = { package = "solana-poh", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-poseidon = { package = "solana-poseidon", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-precompile-error = { package = "solana-precompile-error", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-program = { package = "solana-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-program-error = { package = "solana-program-error", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-program-memory = { package = "solana-program-memory", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-program-option = { package = "solana-program-option", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-program-pack = { package = "solana-program-pack", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-program-runtime = { package = "solana-program-runtime", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-program-test = { package = "solana-program-test", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-pubkey = { package = "solana-pubkey", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-pubsub-client = { package = "solana-pubsub-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-quic-client = { package = "solana-quic-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-rayon-threadlimit = { package = "solana-rayon-threadlimit", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-remote-wallet = { package = "solana-remote-wallet", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-rent = { package = "solana-rent", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-sanitize = { package = "solana-sanitize", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-secp256r1-program = { package = "solana-secp256r1-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-serde-varint = { package = "solana-serde-varint", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-serialize-utils = { package = "solana-serialize-utils", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-sha256-hasher = { package = "solana-sha256-hasher", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-signature = { package = "solana-signature", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-slot-hashes = { package = "solana-slot-hashes", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-slot-history = { package = "solana-slot-history", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-timings = { package = "solana-timings", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-unified-scheduler-logic = { package = "solana-unified-scheduler-logic", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-unified-scheduler-pool = { package = "solana-unified-scheduler-pool", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-rpc = { package = "solana-rpc", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-rpc-client = { package = "solana-rpc-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-rpc-client-api = { package = "solana-rpc-client-api", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-rpc-client-nonce-utils = { package = "solana-rpc-client-nonce-utils", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-runtime = { package = "solana-runtime", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-runtime-transaction = { package = "solana-runtime-transaction", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-sdk = { package = "solana-sdk", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-sdk-macro = { package = "solana-sdk-macro", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-secp256k1-recover = { package = "solana-secp256k1-recover", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-send-transaction-service = { package = "solana-send-transaction-service", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-short-vec = { package = "solana-short-vec", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-stable-layout = { package = "solana-stable-layout", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-stake-program = { package = "solana-stake-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-storage-bigtable = { package = "solana-storage-bigtable", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-storage-proto = { package = "solana-storage-proto", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-streamer = { package = "solana-streamer", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-svm = { package = "solana-svm", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-svm-conformance = { package = "solana-svm-conformance", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-svm-rent-collector = { package = "solana-svm-rent-collector", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-svm-transaction = { package = "solana-svm-transaction", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-system-program = { package = "solana-system-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-sysvar-id = { package = "solana-sysvar-id", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-test-validator = { package = "solana-test-validator", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-thin-client = { package = "solana-thin-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-transaction-error = { package = "solana-transaction-error", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-tpu-client = { package = "solana-tpu-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-tpu-client-next = { package = "solana-tpu-client-next", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-transaction-status = { package = "solana-transaction-status", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-transaction-status-client-types = { package = "solana-transaction-status-client-types", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-transaction-metrics-tracker = { package = "solana-transaction-metrics-tracker", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-turbine = { package = "solana-turbine", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-type-overrides = { package = "solana-type-overrides", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-udp-client = { package = "solana-udp-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-version = { package = "solana-version", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-vote = { package = "solana-vote", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-vote-program = { package = "solana-vote-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-wen-restart = { package = "solana-wen-restart", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-zk-elgamal-proof-program = { package = "solana-zk-elgamal-proof-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-zk-keygen = { package = "solana-zk-keygen", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-zk-sdk = { package = "solana-zk-sdk", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-zk-token-proof-program = { package = "solana-zk-token-proof-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } +solana-zk-token-sdk = { package = "solana-zk-token-sdk", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } \ No newline at end of file diff --git a/cli/src/getters.rs b/cli/src/getters.rs index 0d7a60dc..6df5c2d4 100644 --- a/cli/src/getters.rs +++ b/cli/src/getters.rs @@ -608,6 +608,7 @@ pub async fn get_all_operators_in_ncn(handler: &CliHandler) -> Result Result> min_context_slot: None, }, with_context: Some(false), + sort_results: None, }; let results = client @@ -909,6 +911,7 @@ impl NcnTickets { .unwrap() .ncn_opt_in_state .is_active(self.slot, self.epoch_length) + .unwrap() { return Self::ACTIVE; } @@ -927,6 +930,7 @@ impl NcnTickets { .unwrap() .operator_opt_in_state .is_active(self.slot, self.epoch_length) + .unwrap() { return Self::ACTIVE; } @@ -945,6 +949,7 @@ impl NcnTickets { .unwrap() .state .is_active(self.slot, self.epoch_length) + .unwrap() { return Self::ACTIVE; } @@ -963,6 +968,7 @@ impl NcnTickets { .unwrap() .state .is_active(self.slot, self.epoch_length) + .unwrap() { return Self::ACTIVE; } @@ -981,6 +987,7 @@ impl NcnTickets { .unwrap() .state .is_active(self.slot, self.epoch_length) + .unwrap() { return Self::ACTIVE; } diff --git a/cli/src/instructions.rs b/cli/src/instructions.rs index 77b14dd0..67fc952f 100644 --- a/cli/src/instructions.rs +++ b/cli/src/instructions.rs @@ -2791,7 +2791,7 @@ pub async fn create_and_add_test_vault( .base(base.pubkey()) .vault(vault) .vrt_mint(vrt_mint.pubkey()) - .token_mint(token_mint.pubkey()) + .st_mint(token_mint.pubkey()) .reward_fee_bps(reward_fee_bps) .withdrawal_fee_bps(withdrawal_fee_bps) .decimals(9) diff --git a/program/src/lib.rs b/program/src/lib.rs index ebeccd64..1c2c44cc 100644 --- a/program/src/lib.rs +++ b/program/src/lib.rs @@ -36,7 +36,6 @@ mod switchboard_set_weight; use admin_set_new_admin::process_admin_set_new_admin; use borsh::BorshDeserialize; -use const_str_to_pubkey::str_to_pubkey; use initialize_epoch_state::process_initialize_epoch_state; use jito_tip_router_core::instruction::TipRouterInstruction; use realloc_epoch_state::process_realloc_epoch_state; @@ -78,7 +77,7 @@ use crate::{ switchboard_set_weight::process_switchboard_set_weight, }; -declare_id!(str_to_pubkey(env!("TIP_ROUTER_PROGRAM_ID"))); +declare_id!(env!("TIP_ROUTER_PROGRAM_ID")); #[cfg(not(feature = "no-entrypoint"))] security_txt! { diff --git a/program/src/realloc_operator_snapshot.rs b/program/src/realloc_operator_snapshot.rs index ffbef2f8..7f0f8528 100644 --- a/program/src/realloc_operator_snapshot.rs +++ b/program/src/realloc_operator_snapshot.rs @@ -84,13 +84,13 @@ pub fn process_realloc_operator_snapshot( // If the NCN removes an operator, it should immediately be barred from the snapshot let ncn_operator_okay = ncn_operator_state_account .ncn_opt_in_state - .is_active(current_slot, ncn_epoch_length); + .is_active(current_slot, ncn_epoch_length)?; // If the operator removes itself from the ncn, it should still be able to participate // while it is cooling down let operator_ncn_okay = ncn_operator_state_account .operator_opt_in_state - .is_active_or_cooldown(current_slot, ncn_epoch_length); + .is_active_or_cooldown(current_slot, ncn_epoch_length)?; let ncn_operator_index = ncn_operator_state_account.index(); diff --git a/program/src/snapshot_vault_operator_delegation.rs b/program/src/snapshot_vault_operator_delegation.rs index 6252ed64..7208cdf7 100644 --- a/program/src/snapshot_vault_operator_delegation.rs +++ b/program/src/snapshot_vault_operator_delegation.rs @@ -107,7 +107,7 @@ pub fn process_snapshot_vault_operator_delegation( // If the NCN removes a vault, it should immediately be barred from the snapshot ncn_vault_ticket_account .state - .is_active(current_slot, ncn_epoch_length) + .is_active(current_slot, ncn_epoch_length)? }; let vault_ncn_okay = { @@ -123,7 +123,7 @@ pub fn process_snapshot_vault_operator_delegation( // from this vault can still participate vault_ncn_ticket_account .state - .is_active_or_cooldown(current_slot, ncn_epoch_length) + .is_active_or_cooldown(current_slot, ncn_epoch_length)? } }; diff --git a/program/src/switchboard_set_weight.rs b/program/src/switchboard_set_weight.rs index 889d107b..63f8f3a7 100644 --- a/program/src/switchboard_set_weight.rs +++ b/program/src/switchboard_set_weight.rs @@ -59,9 +59,10 @@ pub fn process_switchboard_set_weight( let feed = PullFeedAccountData::parse(switchboard_feed.data.borrow()) .map_err(|_| TipRouterError::BadSwitchboardFeed)?; - let price: Decimal = feed.value().ok_or(TipRouterError::BadSwitchboardValue)?; + let clock = Clock::get()?; + let price: Decimal = feed.value(&clock).map_err(|_| TipRouterError::BadSwitchboardValue)?; - let current_slot = Clock::get()?.slot; + let current_slot = clock.slot; let stale_slot = { feed.result .slot diff --git a/rust-toolchain.toml b/rust-toolchain.toml index a21998c9..187a3735 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ # note: this file doesn't play nicely with solana-verify build [toolchain] components = ["rustfmt", "rustc-dev", "clippy", "cargo"] -channel = "1.75.0" +channel = "1.81.0" diff --git a/tip-router-operator-cli/Cargo.toml b/tip-router-operator-cli/Cargo.toml index 7c44d4d2..4f03b39b 100644 --- a/tip-router-operator-cli/Cargo.toml +++ b/tip-router-operator-cli/Cargo.toml @@ -11,7 +11,7 @@ base64 = "0.13" clap = { workspace = true } clap_old = { workspace = true } crossbeam-channel = "0.5" -ellipsis-client = "0.1" +ellipsis-client = "1.1" env_logger = { workspace = true } hex = "0.4" im = "15.1" From e329316093a95c48e26026c8e7cda9d05c1cfdd5 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Wed, 5 Feb 2025 18:01:21 -0700 Subject: [PATCH 063/112] WIP fixing compiler errors --- tip-router-operator-cli/src/ledger_utils.rs | 2 - .../src/load_and_process_ledger.rs | 46 +++++++++---------- .../src/stake_meta_generator.rs | 2 +- tip-router-operator-cli/src/submit.rs | 4 +- 4 files changed, 24 insertions(+), 30 deletions(-) diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index 9276525a..a5a439ee 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -299,8 +299,6 @@ pub fn get_bank_from_ledger( snapshot_config.full_snapshot_archives_dir, snapshot_config.incremental_snapshot_archives_dir, snapshot_config.archive_format, - snapshot_config.maximum_full_snapshot_archives_to_retain, - snapshot_config.maximum_incremental_snapshot_archives_to_retain, ) { Ok(res) => res, Err(e) => { diff --git a/tip-router-operator-cli/src/load_and_process_ledger.rs b/tip-router-operator-cli/src/load_and_process_ledger.rs index d812e042..71fd293f 100644 --- a/tip-router-operator-cli/src/load_and_process_ledger.rs +++ b/tip-router-operator-cli/src/load_and_process_ledger.rs @@ -3,15 +3,16 @@ use { crossbeam_channel::unbounded, log::*, solana_accounts_db::{ - hardened_unpack::open_genesis_config, utils::create_all_accounts_run_and_snapshot_dirs, + hardened_unpack::open_genesis_config, + utils::{create_all_accounts_run_and_snapshot_dirs, move_and_async_delete_path_contents}, }, solana_core::{ - accounts_hash_verifier::AccountsHashVerifier, validator::BlockVerificationMethod, + accounts_hash_verifier::AccountsHashVerifier, + snapshot_packager_service::PendingSnapshotPackages, validator::BlockVerificationMethod, }, solana_geyser_plugin_manager::geyser_plugin_service::{ GeyserPluginService, GeyserPluginServiceError, }, - solana_gossip::{cluster_info::ClusterInfo, contact_info::ContactInfo}, solana_ledger::{ bank_forks_utils::{self, BankForksUtilsError}, blockstore::{Blockstore, BlockstoreError}, @@ -24,7 +25,7 @@ use { }, use_snapshot_archives_at_startup::UseSnapshotArchivesAtStartup, }, - solana_measure::measure, + solana_measure::measure_time, solana_metrics::datapoint_info, solana_rpc::transaction_status_service::TransactionStatusService, solana_runtime::{ @@ -36,22 +37,19 @@ use { prioritization_fee_cache::PrioritizationFeeCache, snapshot_config::SnapshotConfig, snapshot_hash::StartingSnapshotHashes, - snapshot_utils::{ - self, clean_orphaned_account_snapshot_dirs, move_and_async_delete_path_contents, - }, + snapshot_utils::{self, clean_orphaned_account_snapshot_dirs}, }, solana_sdk::{ - clock::Slot, genesis_config::GenesisConfig, pubkey::Pubkey, signature::Signer, - signer::keypair::Keypair, timing::timestamp, transaction::VersionedTransaction, + clock::Slot, genesis_config::GenesisConfig, pubkey::Pubkey, + transaction::VersionedTransaction, }, - solana_streamer::socket::SocketAddrSpace, solana_unified_scheduler_pool::DefaultSchedulerPool, std::{ path::{Path, PathBuf}, process::exit, sync::{ atomic::{AtomicBool, Ordering}, - Arc, RwLock, + Arc, Mutex, RwLock, }, }, thiserror::Error, @@ -239,7 +237,7 @@ pub fn load_and_process_ledger( // From now on, use run/ paths in the same way as the previous account_paths. let account_paths = account_run_paths; - let (_, measure_clean_account_paths) = measure!( + let (_, measure_clean_account_paths) = measure_time!( account_paths.iter().for_each(|path| { if path.exists() { info!("Cleaning contents of account path: {}", path.display()); @@ -282,7 +280,6 @@ pub fn load_and_process_ledger( genesis_config, blockstore.as_ref(), account_paths, - None, snapshot_config.as_ref(), &process_options, None, @@ -303,40 +300,40 @@ pub fn load_and_process_ledger( "Using: block-verification-method: {}", block_verification_method, ); + let unified_scheduler_handler_threads = None; match block_verification_method { BlockVerificationMethod::BlockstoreProcessor => { info!("no scheduler pool is installed for block verification..."); + if let Some(count) = unified_scheduler_handler_threads { + warn!( + "--unified-scheduler-handler-threads={count} is ignored because unified \ + scheduler isn't enabled" + ); + } } BlockVerificationMethod::UnifiedScheduler => { - let no_transaction_status_sender = None; let no_replay_vote_sender = None; let ignored_prioritization_fee_cache = Arc::new(PrioritizationFeeCache::new(0u64)); bank_forks .write() .unwrap() .install_scheduler_pool(DefaultSchedulerPool::new_dyn( + unified_scheduler_handler_threads, process_options.runtime_config.log_messages_bytes_limit, - no_transaction_status_sender, + None, no_replay_vote_sender, ignored_prioritization_fee_cache, )); } } - let node_id = Arc::new(Keypair::new()); - let cluster_info = Arc::new(ClusterInfo::new( - ContactInfo::new_localhost(&node_id.pubkey(), timestamp()), - Arc::clone(&node_id), - SocketAddrSpace::Unspecified, - )); let (accounts_package_sender, accounts_package_receiver) = crossbeam_channel::unbounded(); + let pending_snapshot_packages = Arc::new(Mutex::new(PendingSnapshotPackages::default())); let accounts_hash_verifier = AccountsHashVerifier::new( accounts_package_sender.clone(), accounts_package_receiver, - None, + pending_snapshot_packages, exit.clone(), - cluster_info, - None, SnapshotConfig::new_load_only(), ); let (snapshot_request_sender, snapshot_request_receiver) = crossbeam_channel::unbounded(); @@ -361,7 +358,6 @@ pub fn load_and_process_ledger( exit.clone(), abs_request_handler, process_options.accounts_db_test_hash_calculation, - starting_snapshot_hashes.map(|x| x.full.0 .0), ); let enable_rpc_transaction_history = arg_matches.is_present("enable_rpc_transaction_history"); diff --git a/tip-router-operator-cli/src/stake_meta_generator.rs b/tip-router-operator-cli/src/stake_meta_generator.rs index e5e62ae7..e9cdc60c 100644 --- a/tip-router-operator-cli/src/stake_meta_generator.rs +++ b/tip-router-operator-cli/src/stake_meta_generator.rs @@ -293,7 +293,7 @@ pub fn generate_stake_meta_collection( None }; - let vote_state = vote_account.vote_state().unwrap(); + let vote_state = vote_account.vote_state(); delegations.sort(); stake_metas.push(StakeMeta { maybe_tip_distribution_meta, diff --git a/tip-router-operator-cli/src/submit.rs b/tip-router-operator-cli/src/submit.rs index 34c25604..33e4667f 100644 --- a/tip-router-operator-cli/src/submit.rs +++ b/tip-router-operator-cli/src/submit.rs @@ -33,7 +33,7 @@ pub async fn submit_recent_epochs_to_ncn( cli_args: &Cli, set_merkle_roots: bool, ) -> Result<(), anyhow::Error> { - let epoch = client.get_epoch_info()?; + let epoch = client.get_epoch_info().await?; let operator_address = Pubkey::from_str(&cli_args.operator_address)?; for i in 0..num_monitored_epochs { @@ -81,7 +81,7 @@ pub async fn submit_to_ncn( submit_as_memo: bool, set_merkle_roots: bool, ) -> Result<(), anyhow::Error> { - let epoch_info = client.get_epoch_info()?; + let epoch_info = client.get_epoch_info().await?; let meta_merkle_tree = MetaMerkleTree::new_from_file(meta_merkle_tree_path)?; let config_pda = Config::find_program_address(tip_router_program_id, ncn_address).0; let config = get_ncn_config(client, tip_router_program_id, ncn_address).await?; From bc4b85164e9390b20edf5637745a987d91b950ee Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Wed, 5 Feb 2025 20:36:22 -0700 Subject: [PATCH 064/112] fix some more stuff --- program/src/switchboard_set_weight.rs | 4 +++- tip-router-operator-cli/src/backup_snapshots.rs | 8 ++++---- tip-router-operator-cli/src/main.rs | 8 ++++---- tip-router-operator-cli/src/process_epoch.rs | 8 ++++---- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/program/src/switchboard_set_weight.rs b/program/src/switchboard_set_weight.rs index 63f8f3a7..25f2e779 100644 --- a/program/src/switchboard_set_weight.rs +++ b/program/src/switchboard_set_weight.rs @@ -60,7 +60,9 @@ pub fn process_switchboard_set_weight( .map_err(|_| TipRouterError::BadSwitchboardFeed)?; let clock = Clock::get()?; - let price: Decimal = feed.value(&clock).map_err(|_| TipRouterError::BadSwitchboardValue)?; + let price: Decimal = feed + .value(&clock) + .map_err(|_| TipRouterError::BadSwitchboardValue)?; let current_slot = clock.slot; let stale_slot = { diff --git a/tip-router-operator-cli/src/backup_snapshots.rs b/tip-router-operator-cli/src/backup_snapshots.rs index d2baa7ed..bb37efb7 100644 --- a/tip-router-operator-cli/src/backup_snapshots.rs +++ b/tip-router-operator-cli/src/backup_snapshots.rs @@ -1,6 +1,6 @@ #![allow(clippy::arithmetic_side_effects, clippy::integer_division)] use anyhow::{Context, Result}; -use solana_client::rpc_client::RpcClient; +use solana_client::nonblocking::rpc_client::RpcClient; use solana_sdk::clock::DEFAULT_SLOTS_PER_EPOCH; use std::path::{Path, PathBuf}; use std::time::Duration; @@ -70,9 +70,9 @@ impl BackupSnapshotMonitor { } /// Gets target slot for current epoch - fn get_target_slots(&self) -> Result<(u64, u64)> { + async fn get_target_slots(&self) -> Result<(u64, u64)> { // Get the last slot of the current epoch - let (_, last_epoch_target_slot) = get_previous_epoch_last_slot(&self.rpc_client)?; + let (_, last_epoch_target_slot) = get_previous_epoch_last_slot(&self.rpc_client).await?; let next_epoch_target_slot = last_epoch_target_slot + DEFAULT_SLOTS_PER_EPOCH; if let Some(target_slot) = self.override_target_slot { @@ -249,7 +249,7 @@ impl BackupSnapshotMonitor { loop { interval.tick().await; - let (last_epoch_target_slot, this_epoch_target_slot) = self.get_target_slots()?; + let (last_epoch_target_slot, this_epoch_target_slot) = self.get_target_slots().await?; // Detect new epoch if current_target_slot != Some(this_epoch_target_slot) { diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 0d6c5383..67dfab8d 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -6,7 +6,7 @@ use ::{ log::{error, info}, meta_merkle_tree::generated_merkle_tree::GeneratedMerkleTreeCollection, solana_metrics::{datapoint_error, datapoint_info, set_host_id}, - solana_rpc_client::rpc_client::RpcClient, + solana_rpc_client::nonblocking::rpc_client::RpcClient, solana_sdk::{ clock::DEFAULT_SLOTS_PER_EPOCH, pubkey::Pubkey, signer::keypair::read_keypair_file, }, @@ -95,7 +95,7 @@ async fn main() -> Result<()> { let backup_snapshots_dir = cli.backup_snapshots_dir.clone(); let rpc_url = cli.rpc_url.clone(); let cli_clone = cli.clone(); - let mut current_epoch = rpc_client.get_epoch_info()?.epoch; + let mut current_epoch = rpc_client.get_epoch_info().await?.epoch; if !backup_snapshots_dir.exists() { info!( @@ -153,7 +153,7 @@ async fn main() -> Result<()> { loop { // Get the last slot of the previous epoch let (previous_epoch, previous_epoch_slot) = - if let Ok((epoch, slot)) = get_previous_epoch_last_slot(&rpc_client) { + if let Ok((epoch, slot)) = get_previous_epoch_last_slot(&rpc_client).await { (epoch, slot) } else { error!("Error getting previous epoch slot"); @@ -184,7 +184,7 @@ async fn main() -> Result<()> { } // Wait for epoch change - current_epoch = wait_for_next_epoch(&rpc_client, current_epoch).await; + current_epoch = wait_for_next_epoch(rpc_client.as_ref(), current_epoch).await; new_epoch_rollover = true; } diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index c5fd0e00..fa24d717 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -8,7 +8,7 @@ use anyhow::Result; use ellipsis_client::EllipsisClient; use log::{error, info}; use solana_metrics::{datapoint_error, datapoint_info}; -use solana_rpc_client::rpc_client::RpcClient; +use solana_rpc_client::nonblocking::rpc_client::RpcClient; use solana_sdk::pubkey::Pubkey; use tokio::time; @@ -22,7 +22,7 @@ const OPTIMAL_INCREMENTAL_SNAPSHOT_SLOT_RANGE: u64 = 800; // Experimentally dete pub async fn wait_for_next_epoch(rpc_client: &RpcClient, current_epoch: u64) -> u64 { loop { tokio::time::sleep(Duration::from_secs(10)).await; // Check every 10 seconds - let new_epoch = match rpc_client.get_epoch_info() { + let new_epoch = match rpc_client.get_epoch_info().await { Ok(info) => info.epoch, Err(e) => { error!("Error getting epoch info: {:?}", e); @@ -37,8 +37,8 @@ pub async fn wait_for_next_epoch(rpc_client: &RpcClient, current_epoch: u64) -> } } -pub fn get_previous_epoch_last_slot(rpc_client: &RpcClient) -> Result<(u64, u64)> { - let epoch_info = rpc_client.get_epoch_info()?; +pub async fn get_previous_epoch_last_slot(rpc_client: &RpcClient) -> Result<(u64, u64)> { + let epoch_info = rpc_client.get_epoch_info().await?; let current_slot = epoch_info.absolute_slot; let slot_index = epoch_info.slot_index; From dc09a4d8f3bf70b4d5e2d75b6ca0709cbcdf25b2 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Wed, 5 Feb 2025 21:37:59 -0700 Subject: [PATCH 065/112] cargo build works --- Cargo.lock | 49 +++++++++++++++++++++++----------------------- Cargo.toml | 2 +- cli/Cargo.toml | 6 +++++- cli/src/getters.rs | 2 +- 4 files changed, 32 insertions(+), 27 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5552c099..6291af14 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1127,11 +1127,11 @@ dependencies = [ [[package]] name = "borsh" -version = "1.5.3" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2506947f73ad44e344215ccd6403ac2ae18cd8e046e581a441bf8d199f257f03" +checksum = "5430e3be710b68d984d1391c854eb431a9d548640711faa54eecb1df93db91cc" dependencies = [ - "borsh-derive 1.5.3", + "borsh-derive 1.5.5", "cfg_aliases", ] @@ -1163,9 +1163,9 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.3" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2593a3b8b938bd68373196c9832f516be11fa487ef4ae745eb282e6a56a7244" +checksum = "f8b668d39970baad5356d7c83a86fee3a539e6f93bf6764c97368243e17a0487" dependencies = [ "once_cell", "proc-macro-crate 3.2.0", @@ -3656,6 +3656,7 @@ dependencies = [ "anyhow", "assert_matches", "borsh 0.10.4", + "borsh 1.5.5", "bytemuck", "chrono", "clap 4.5.23", @@ -5866,7 +5867,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b082d80e3e3cc52b2ed634388d436fe1f4de6af5786cc2de9ba9737527bdf555" dependencies = [ "arrayvec", - "borsh 1.5.3", + "borsh 1.5.5", "bytes", "num-traits", "rand 0.8.5", @@ -6695,7 +6696,7 @@ name = "solana-banks-client" version = "2.1.11" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.5", "futures 0.3.31", "solana-banks-interface", "solana-program", @@ -6783,7 +6784,7 @@ version = "2.1.11" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "borsh 0.10.4", - "borsh 1.5.3", + "borsh 1.5.5", ] [[package]] @@ -7325,7 +7326,7 @@ name = "solana-hash" version = "2.1.11" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.5", "bs58 0.5.1", "bytemuck", "bytemuck_derive", @@ -7361,7 +7362,7 @@ version = "2.1.11" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "bincode", - "borsh 1.5.3", + "borsh 1.5.5", "getrandom 0.2.15", "js-sys", "num-traits", @@ -7653,7 +7654,7 @@ dependencies = [ "bitflags 2.6.0", "blake3", "borsh 0.10.4", - "borsh 1.5.3", + "borsh 1.5.5", "bs58 0.5.1", "bv", "bytemuck", @@ -7731,7 +7732,7 @@ name = "solana-program-error" version = "2.1.11" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.5", "num-traits", "serde", "serde_derive", @@ -7833,7 +7834,7 @@ version = "2.1.11" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ "borsh 0.10.4", - "borsh 1.5.3", + "borsh 1.5.5", "bs58 0.5.1", "bytemuck", "bytemuck_derive", @@ -8196,7 +8197,7 @@ dependencies = [ "base64 0.22.1", "bincode", "bitflags 2.6.0", - "borsh 1.5.3", + "borsh 1.5.5", "bs58 0.5.1", "bytemuck", "bytemuck_derive", @@ -8269,7 +8270,7 @@ name = "solana-secp256k1-recover" version = "2.1.11" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.5", "libsecp256k1 0.6.0", "solana-define-syscall", "thiserror 1.0.69", @@ -8643,7 +8644,7 @@ dependencies = [ "Inflector", "base64 0.22.1", "bincode", - "borsh 1.5.3", + "borsh 1.5.5", "bs58 0.5.1", "lazy_static", "log", @@ -8970,7 +8971,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68034596cf4804880d265f834af1ff2f821ad5293e41fa0f8f59086c181fc38e" dependencies = [ "assert_matches", - "borsh 1.5.3", + "borsh 1.5.5", "num-derive", "num-traits", "solana-program", @@ -8985,7 +8986,7 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76fee7d65013667032d499adc3c895e286197a35a0d3a4643c80e7fd3e9969e3" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.5", "num-derive", "num-traits", "solana-program", @@ -9071,7 +9072,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5cc5a6cc7a4f0cf7813ce44153bba73280909f697d7f6baf7b9f223a255e7887" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.5", "num-derive", "num-traits", "solana-program", @@ -9108,7 +9109,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c704c88fc457fa649ba3aabe195c79d885c3f26709efaddc453c8de352c90b87" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.5", "bytemuck", "bytemuck_derive", "solana-program", @@ -9122,7 +9123,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41a7d5950993e1ff2680bd989df298eeb169367fb2f9deeef1f132de6e4e8016" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.5", "bytemuck", "bytemuck_derive", "num-derive", @@ -9182,7 +9183,7 @@ checksum = "dc2b2908579aefbdb1ed3e941252cab09e7e471e5b52efd5ecc54d20829ef5e8" dependencies = [ "arrayref", "bincode", - "borsh 1.5.3", + "borsh 1.5.5", "bytemuck", "num-derive", "num-traits", @@ -9428,7 +9429,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6c2318ddff97e006ed9b1291ebec0750a78547f870f62a69c56fe3b46a5d8fc" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.5", "solana-program", "spl-discriminator 0.3.0", "spl-pod 0.3.1", @@ -9442,7 +9443,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfb9c89dbc877abd735f05547dcf9e6e12c00c11d6d74d8817506cab4c99fdbb" dependencies = [ - "borsh 1.5.3", + "borsh 1.5.5", "num-derive", "num-traits", "solana-borsh", diff --git a/Cargo.toml b/Cargo.toml index 37b123d9..d78497ff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -262,4 +262,4 @@ solana-zk-elgamal-proof-program = { package = "solana-zk-elgamal-proof-program", solana-zk-keygen = { package = "solana-zk-keygen", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-zk-sdk = { package = "solana-zk-sdk", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-zk-token-proof-program = { package = "solana-zk-token-proof-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } -solana-zk-token-sdk = { package = "solana-zk-token-sdk", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } \ No newline at end of file +solana-zk-token-sdk = { package = "solana-zk-token-sdk", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 981d5215..a85ead58 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -12,6 +12,7 @@ readme = { workspace = true } [dependencies] anyhow = { workspace = true } borsh = { workspace = true } +borsh1 = { package = "borsh", version = "1.5.3" } bytemuck = { workspace = true } chrono = { workspace = true } clap = { workspace = true } @@ -44,10 +45,13 @@ solana-transaction-status = { workspace = true } spl-associated-token-account = { workspace = true } spl-stake-pool = { workspace = true } spl-token = { workspace = true } -switchboard-on-demand-client = "0.2.11" +switchboard-on-demand-client = "0.2.12" thiserror = { workspace = true } tokio = { workspace = true } +[patch.crates-io] +borsh = { package = "borsh", git = 'https://github.com/near/borsh-rs', tag = 'borsh-v1.5.3' } + [dev-dependencies] assert_matches = { workspace = true } diff --git a/cli/src/getters.rs b/cli/src/getters.rs index 6df5c2d4..872d8676 100644 --- a/cli/src/getters.rs +++ b/cli/src/getters.rs @@ -3,7 +3,7 @@ use std::mem::size_of; use crate::handler::CliHandler; use anyhow::Result; -use borsh::BorshDeserialize; +use borsh1::BorshDeserialize; use jito_bytemuck::AccountDeserialize; use jito_restaking_core::{ config::Config as RestakingConfig, ncn::Ncn, ncn_operator_state::NcnOperatorState, From 3222f27dfc46825485a7926e0d4cf309b40fe7d0 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Thu, 6 Feb 2025 06:30:12 -0700 Subject: [PATCH 066/112] tests compile --- integration_tests/tests/fixtures/stake_pool_client.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/integration_tests/tests/fixtures/stake_pool_client.rs b/integration_tests/tests/fixtures/stake_pool_client.rs index 627e8e90..a0121582 100644 --- a/integration_tests/tests/fixtures/stake_pool_client.rs +++ b/integration_tests/tests/fixtures/stake_pool_client.rs @@ -1,7 +1,8 @@ #![allow(deprecated)] // using deprecated borsh to align with mainnet stake pool version use jito_tip_router_core::constants::JITOSOL_MINT; use solana_program::{ - borsh0_10::{get_instance_packed_len, get_packed_len}, + // TODO: Review if this is acceptable give spl-stake-pool crate was updated. + borsh1::{get_instance_packed_len, get_packed_len}, pubkey::Pubkey, stake, }; From 09ae852c28d84661b8986675558b67b8ac9ac083 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Thu, 6 Feb 2025 06:31:08 -0700 Subject: [PATCH 067/112] oops..now tests compile --- .../tests/fixtures/vault_client.rs | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/integration_tests/tests/fixtures/vault_client.rs b/integration_tests/tests/fixtures/vault_client.rs index f832b90b..32c510ea 100644 --- a/integration_tests/tests/fixtures/vault_client.rs +++ b/integration_tests/tests/fixtures/vault_client.rs @@ -6,7 +6,8 @@ use jito_restaking_core::{ operator_vault_ticket::OperatorVaultTicket, }; use jito_vault_core::{ - config::Config, vault::Vault, vault_ncn_slasher_operator_ticket::VaultNcnSlasherOperatorTicket, + burn_vault::BurnVault, config::Config, vault::Vault, + vault_ncn_slasher_operator_ticket::VaultNcnSlasherOperatorTicket, vault_ncn_slasher_ticket::VaultNcnSlasherTicket, vault_ncn_ticket::VaultNcnTicket, vault_operator_delegation::VaultOperatorDelegation, vault_staker_withdrawal_ticket::VaultStakerWithdrawalTicket, @@ -336,6 +337,7 @@ impl VaultProgramClient { withdrawal_fee_bps, reward_fee_bps, decimals, + 0, ) .await?; @@ -662,29 +664,45 @@ impl VaultProgramClient { config: &Pubkey, vault: &Pubkey, vrt_mint: &Keypair, - token_mint: &Keypair, + st_mint: &Keypair, vault_admin: &Keypair, vault_base: &Keypair, deposit_fee_bps: u16, withdrawal_fee_bps: u16, reward_fee_bps: u16, decimals: u8, + initialize_token_amount: u64, ) -> Result<(), TestError> { let blockhash = self.banks_client.get_latest_blockhash().await?; + let admin_st_token_account = + get_associated_token_address(&vault_admin.pubkey(), &st_mint.pubkey()); + let vault_st_token_account = get_associated_token_address(vault, &st_mint.pubkey()); + + let burn_vault = + BurnVault::find_program_address(&jito_vault_program::id(), &vault_base.pubkey()).0; + + let burn_vault_vrt_token_account = + get_associated_token_address(&burn_vault, &vrt_mint.pubkey()); self._process_transaction(&Transaction::new_signed_with_payer( &[initialize_vault( &jito_vault_program::id(), config, vault, &vrt_mint.pubkey(), - &token_mint.pubkey(), + &st_mint.pubkey(), + // TODO: Review these keys, maybe refactor to use restaking + &admin_st_token_account, + &vault_st_token_account, + &burn_vault, + &burn_vault_vrt_token_account, &vault_admin.pubkey(), &vault_base.pubkey(), deposit_fee_bps, withdrawal_fee_bps, reward_fee_bps, decimals, + initialize_token_amount, )], Some(&vault_admin.pubkey()), &[&vault_admin, &vrt_mint, &vault_base], From 07b506ee75004027b716f3cee5f7f6d72b0a47c2 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Thu, 6 Feb 2025 06:34:48 -0700 Subject: [PATCH 068/112] fix incorrect TokenOwner error --- integration_tests/tests/fixtures/vault_client.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/integration_tests/tests/fixtures/vault_client.rs b/integration_tests/tests/fixtures/vault_client.rs index 32c510ea..6b460fdf 100644 --- a/integration_tests/tests/fixtures/vault_client.rs +++ b/integration_tests/tests/fixtures/vault_client.rs @@ -684,6 +684,11 @@ impl VaultProgramClient { let burn_vault_vrt_token_account = get_associated_token_address(&burn_vault, &vrt_mint.pubkey()); + + self.create_ata(&st_mint.pubkey(), vault).await?; + self.create_ata(&st_mint.pubkey(), &vault_admin.pubkey()) + .await?; + self._process_transaction(&Transaction::new_signed_with_payer( &[initialize_vault( &jito_vault_program::id(), From def719c07529f3a25216a38964a58ae62313efb1 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Thu, 6 Feb 2025 06:48:12 -0700 Subject: [PATCH 069/112] fix non-zero initialize vault amount --- integration_tests/tests/fixtures/vault_client.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/integration_tests/tests/fixtures/vault_client.rs b/integration_tests/tests/fixtures/vault_client.rs index 6b460fdf..c65486a8 100644 --- a/integration_tests/tests/fixtures/vault_client.rs +++ b/integration_tests/tests/fixtures/vault_client.rs @@ -308,6 +308,8 @@ impl VaultProgramClient { ) -> Result { let vault_base = Keypair::new(); + let initialize_token_amount = Vault::DEFAULT_INITIALIZATION_TOKEN_AMOUNT; + let vault_pubkey = Vault::find_program_address(&jito_vault_program::id(), &vault_base.pubkey()).0; @@ -337,7 +339,7 @@ impl VaultProgramClient { withdrawal_fee_bps, reward_fee_bps, decimals, - 0, + initialize_token_amount, ) .await?; @@ -688,6 +690,13 @@ impl VaultProgramClient { self.create_ata(&st_mint.pubkey(), vault).await?; self.create_ata(&st_mint.pubkey(), &vault_admin.pubkey()) .await?; + + self.mint_spl_to( + &st_mint.pubkey(), + &vault_admin.pubkey(), + initialize_token_amount, + ) + .await?; self._process_transaction(&Transaction::new_signed_with_payer( &[initialize_vault( From fc9bb2ea852e99973f844cf2884184a4651f6485 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Thu, 6 Feb 2025 10:14:19 -0700 Subject: [PATCH 070/112] fix failing tests --- tip-router-operator-cli/src/ledger_utils.rs | 4 +++- tip-router-operator-cli/src/stake_meta_generator.rs | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index a5a439ee..0c621a97 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -344,6 +344,8 @@ pub fn get_bank_from_ledger( #[cfg(test)] mod tests { + use crate::load_and_process_ledger::LEDGER_TOOL_DIRECTORY; + use super::*; #[test] @@ -377,7 +379,7 @@ mod tests { std::fs::remove_dir_all( ledger_path .as_path() - .join(format!("accounts/snapshot/{}", desired_slot)), + .join(LEDGER_TOOL_DIRECTORY), ) .unwrap(); } diff --git a/tip-router-operator-cli/src/stake_meta_generator.rs b/tip-router-operator-cli/src/stake_meta_generator.rs index e9cdc60c..c3f1668e 100644 --- a/tip-router-operator-cli/src/stake_meta_generator.rs +++ b/tip-router-operator-cli/src/stake_meta_generator.rs @@ -413,7 +413,11 @@ mod tests { vec![INITIAL_VALIDATOR_STAKES; 3], ); - let (mut bank, _) = Bank::new_with_bank_forks_for_tests(&genesis_config); + let (_, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config); + // We have to update to working bank, otherwise cannot get strong pointer (Arc) for + // ProgramCache fork_graph + // TODO: Review if this will be an issue for the actual CLI + let mut bank = bank_forks.read().unwrap().working_bank(); /* 2. Seed the Bank with [TipDistributionAccount]'s */ let merkle_root_upload_authority = Pubkey::new_unique(); From 885eeae63329f207b12330dc20e6401c3421dd60 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Thu, 6 Feb 2025 18:14:21 -0500 Subject: [PATCH 071/112] pin restaking to git branch --- Cargo.lock | 11 +++++++++++ Cargo.toml | 22 +++++++++++----------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6291af14..9cca3a30 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3495,6 +3495,7 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jito-account-traits-derive" version = "0.0.3" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" dependencies = [ "proc-macro2 1.0.92", "quote 1.0.38", @@ -3504,6 +3505,7 @@ dependencies = [ [[package]] name = "jito-bytemuck" version = "0.0.3" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" dependencies = [ "borsh 0.10.4", "bytemuck", @@ -3514,6 +3516,7 @@ dependencies = [ [[package]] name = "jito-jsm-core" version = "0.0.3" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" dependencies = [ "borsh 0.10.4", "bytemuck", @@ -3554,6 +3557,7 @@ dependencies = [ [[package]] name = "jito-restaking-client" version = "0.0.3" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" dependencies = [ "anchor-lang 0.30.1", "borsh 0.10.4", @@ -3570,6 +3574,7 @@ dependencies = [ [[package]] name = "jito-restaking-core" version = "0.0.3" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" dependencies = [ "borsh 0.10.4", "bytemuck", @@ -3586,6 +3591,7 @@ dependencies = [ [[package]] name = "jito-restaking-program" version = "0.0.3" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" dependencies = [ "borsh 0.10.4", "cfg-if 1.0.0", @@ -3606,6 +3612,7 @@ dependencies = [ [[package]] name = "jito-restaking-sdk" version = "0.0.3" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" dependencies = [ "borsh 0.10.4", "shank", @@ -3814,6 +3821,7 @@ dependencies = [ [[package]] name = "jito-vault-client" version = "0.0.3" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" dependencies = [ "anchor-lang 0.30.1", "borsh 0.10.4", @@ -3830,6 +3838,7 @@ dependencies = [ [[package]] name = "jito-vault-core" version = "0.0.3" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" dependencies = [ "borsh 0.10.4", "bytemuck", @@ -3847,6 +3856,7 @@ dependencies = [ [[package]] name = "jito-vault-program" version = "0.0.3" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" dependencies = [ "borsh 0.10.4", "cfg-if 1.0.0", @@ -3867,6 +3877,7 @@ dependencies = [ [[package]] name = "jito-vault-sdk" version = "0.0.3" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" dependencies = [ "borsh 0.10.4", "shank", diff --git a/Cargo.toml b/Cargo.toml index d78497ff..33785b23 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -112,17 +112,17 @@ jito-tip-router-client = { path = "./clients/rust/jito_tip_router", version = "0 jito-tip-router-core = { path = "./core", version = "=0.0.1" } jito-tip-router-program = { path = "./program", version = "=0.0.1" } jito-tip-router-shank-cli = { path = "./shank_cli", version = "=0.0.1" } -jito-bytemuck = { path = "../../jito-foundation/restaking/bytemuck" } -jito-account-traits-derive = { path = "../../jito-foundation/restaking" } -jito-jsm-core = { path = "../../jito-foundation/restaking/core" } -jito-restaking-client = { path = "../../jito-foundation/restaking/clients/rust/restaking_client" } -jito-restaking-core = { path = "../../jito-foundation/restaking/restaking_core" } -jito-restaking-program = { path = "../../jito-foundation/restaking/restaking_program", features = ["no-entrypoint"] } -jito-restaking-sdk = { path = "../../jito-foundation/restaking/restaking_sdk" } -jito-vault-client = { path = "../../jito-foundation/restaking/clients/rust/vault_client" } -jito-vault-core = { path = "../../jito-foundation/restaking/vault_core" } -jito-vault-program = { path = "../../jito-foundation/restaking/vault_program", features = ["no-entrypoint"] } -jito-vault-sdk = { path = "../../jito-foundation/restaking/vault_sdk" } +jito-bytemuck = { package = "jito-bytemuck", git = "https://github.com/jito-foundation/restaking", branch = "v2.1-upgrade" } +jito-account-traits-derive = { package = "jito-account-traits-derive", git = "https://github.com/jito-foundation/restaking", branch = "v2.1-upgrade" } +jito-jsm-core = { package = "jito-jsm-core", git = "https://github.com/jito-foundation/restaking", branch = "v2.1-upgrade" } +jito-restaking-client = { package = "jito-restaking-client", git = "https://github.com/jito-foundation/restaking", branch = "v2.1-upgrade" } +jito-restaking-core = { package = "jito-restaking-core", git = "https://github.com/jito-foundation/restaking", branch = "v2.1-upgrade" } +jito-restaking-program = { package = "jito-restaking-program", git = "https://github.com/jito-foundation/restaking", branch = "v2.1-upgrade", features = ["no-entrypoint"] } +jito-restaking-sdk = { package = "jito-restaking-sdk", git = "https://github.com/jito-foundation/restaking", branch = "v2.1-upgrade" } +jito-vault-client = { package = "jito-vault-client", git = "https://github.com/jito-foundation/restaking", branch = "v2.1-upgrade" } +jito-vault-core = { package = "jito-vault-core", git = "https://github.com/jito-foundation/restaking", branch = "v2.1-upgrade" } +jito-vault-program = { package = "jito-vault-program", git = "https://github.com/jito-foundation/restaking", branch = "v2.1-upgrade", features = ["no-entrypoint"] } +jito-vault-sdk = { package = "jito-vault-sdk", git = "https://github.com/jito-foundation/restaking", branch = "v2.1-upgrade" } [patch.crates-io] solana-account = { package = "solana-account", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } From 274bb0c716aaa6fdcc81e53c6217dd54af5dae22 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Thu, 6 Feb 2025 19:02:18 -0500 Subject: [PATCH 072/112] cargo fmt --- integration_tests/tests/fixtures/vault_client.rs | 2 +- tip-router-operator-cli/src/ledger_utils.rs | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/integration_tests/tests/fixtures/vault_client.rs b/integration_tests/tests/fixtures/vault_client.rs index c65486a8..a45cd446 100644 --- a/integration_tests/tests/fixtures/vault_client.rs +++ b/integration_tests/tests/fixtures/vault_client.rs @@ -697,7 +697,7 @@ impl VaultProgramClient { initialize_token_amount, ) .await?; - + self._process_transaction(&Transaction::new_signed_with_payer( &[initialize_vault( &jito_vault_program::id(), diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index 0c621a97..c2ac3c82 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -376,11 +376,6 @@ mod tests { assert!(snapshot_path.exists()); // Delete the snapshot std::fs::remove_file(snapshot_path).unwrap(); - std::fs::remove_dir_all( - ledger_path - .as_path() - .join(LEDGER_TOOL_DIRECTORY), - ) - .unwrap(); + std::fs::remove_dir_all(ledger_path.as_path().join(LEDGER_TOOL_DIRECTORY)).unwrap(); } } From ceb99849f3444d590cbfded73c4e3c9adde8b936 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Thu, 6 Feb 2025 19:05:04 -0500 Subject: [PATCH 073/112] update workflow solana version --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 65316183..8cd069f2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -119,7 +119,7 @@ jobs: filenames: programs.env - uses: actions-rust-lang/setup-rust-toolchain@v1 - name: install solana toolsuite - run: sh -c "$(curl -sSfL https://release.solana.com/v1.18.22/install)" + run: sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.11/install)" - name: add to path run: echo "/home/runner/.local/share/solana/install/active_release/bin" >> $GITHUB_PATH - name: Building programs From e1018fc7d92f93ecbac83cce06d73f7f089b1f0c Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Fri, 7 Feb 2025 12:30:07 -0500 Subject: [PATCH 074/112] update kinobi generated client --- .../rust/jito_tip_router/src/generated/accounts/ballot_box.rs | 2 +- .../src/generated/accounts/base_reward_router.rs | 2 +- clients/rust/jito_tip_router/src/generated/accounts/config.rs | 2 +- .../rust/jito_tip_router/src/generated/accounts/epoch_marker.rs | 2 +- .../jito_tip_router/src/generated/accounts/epoch_snapshot.rs | 2 +- .../rust/jito_tip_router/src/generated/accounts/epoch_state.rs | 2 +- .../jito_tip_router/src/generated/accounts/ncn_reward_router.rs | 2 +- .../jito_tip_router/src/generated/accounts/operator_snapshot.rs | 2 +- .../jito_tip_router/src/generated/accounts/vault_registry.rs | 2 +- .../rust/jito_tip_router/src/generated/accounts/weight_table.rs | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/clients/rust/jito_tip_router/src/generated/accounts/ballot_box.rs b/clients/rust/jito_tip_router/src/generated/accounts/ballot_box.rs index 37141253..e4142bb8 100644 --- a/clients/rust/jito_tip_router/src/generated/accounts/ballot_box.rs +++ b/clients/rust/jito_tip_router/src/generated/accounts/ballot_box.rs @@ -77,5 +77,5 @@ impl anchor_lang::IdlBuild for BallotBox {} #[cfg(feature = "anchor-idl-build")] impl anchor_lang::Discriminator for BallotBox { - const DISCRIMINATOR: [u8; 8] = [0; 8]; + const DISCRIMINATOR: &'static [u8] = &[0; 8]; } diff --git a/clients/rust/jito_tip_router/src/generated/accounts/base_reward_router.rs b/clients/rust/jito_tip_router/src/generated/accounts/base_reward_router.rs index b7850ac4..90565def 100644 --- a/clients/rust/jito_tip_router/src/generated/accounts/base_reward_router.rs +++ b/clients/rust/jito_tip_router/src/generated/accounts/base_reward_router.rs @@ -78,5 +78,5 @@ impl anchor_lang::IdlBuild for BaseRewardRouter {} #[cfg(feature = "anchor-idl-build")] impl anchor_lang::Discriminator for BaseRewardRouter { - const DISCRIMINATOR: [u8; 8] = [0; 8]; + const DISCRIMINATOR: &'static [u8] = &[0; 8]; } diff --git a/clients/rust/jito_tip_router/src/generated/accounts/config.rs b/clients/rust/jito_tip_router/src/generated/accounts/config.rs index 49ea3850..98ac4eef 100644 --- a/clients/rust/jito_tip_router/src/generated/accounts/config.rs +++ b/clients/rust/jito_tip_router/src/generated/accounts/config.rs @@ -80,5 +80,5 @@ impl anchor_lang::IdlBuild for Config {} #[cfg(feature = "anchor-idl-build")] impl anchor_lang::Discriminator for Config { - const DISCRIMINATOR: [u8; 8] = [0; 8]; + const DISCRIMINATOR: &'static [u8] = &[0; 8]; } diff --git a/clients/rust/jito_tip_router/src/generated/accounts/epoch_marker.rs b/clients/rust/jito_tip_router/src/generated/accounts/epoch_marker.rs index 366e95de..bf134338 100644 --- a/clients/rust/jito_tip_router/src/generated/accounts/epoch_marker.rs +++ b/clients/rust/jito_tip_router/src/generated/accounts/epoch_marker.rs @@ -63,5 +63,5 @@ impl anchor_lang::IdlBuild for EpochMarker {} #[cfg(feature = "anchor-idl-build")] impl anchor_lang::Discriminator for EpochMarker { - const DISCRIMINATOR: [u8; 8] = [0; 8]; + const DISCRIMINATOR: &'static [u8] = &[0; 8]; } diff --git a/clients/rust/jito_tip_router/src/generated/accounts/epoch_snapshot.rs b/clients/rust/jito_tip_router/src/generated/accounts/epoch_snapshot.rs index fc44a62c..87555e06 100644 --- a/clients/rust/jito_tip_router/src/generated/accounts/epoch_snapshot.rs +++ b/clients/rust/jito_tip_router/src/generated/accounts/epoch_snapshot.rs @@ -75,5 +75,5 @@ impl anchor_lang::IdlBuild for EpochSnapshot {} #[cfg(feature = "anchor-idl-build")] impl anchor_lang::Discriminator for EpochSnapshot { - const DISCRIMINATOR: [u8; 8] = [0; 8]; + const DISCRIMINATOR: &'static [u8] = &[0; 8]; } diff --git a/clients/rust/jito_tip_router/src/generated/accounts/epoch_state.rs b/clients/rust/jito_tip_router/src/generated/accounts/epoch_state.rs index f6bed266..45e76bba 100644 --- a/clients/rust/jito_tip_router/src/generated/accounts/epoch_state.rs +++ b/clients/rust/jito_tip_router/src/generated/accounts/epoch_state.rs @@ -85,5 +85,5 @@ impl anchor_lang::IdlBuild for EpochState {} #[cfg(feature = "anchor-idl-build")] impl anchor_lang::Discriminator for EpochState { - const DISCRIMINATOR: [u8; 8] = [0; 8]; + const DISCRIMINATOR: &'static [u8] = &[0; 8]; } diff --git a/clients/rust/jito_tip_router/src/generated/accounts/ncn_reward_router.rs b/clients/rust/jito_tip_router/src/generated/accounts/ncn_reward_router.rs index 55ca4751..3caa5478 100644 --- a/clients/rust/jito_tip_router/src/generated/accounts/ncn_reward_router.rs +++ b/clients/rust/jito_tip_router/src/generated/accounts/ncn_reward_router.rs @@ -83,5 +83,5 @@ impl anchor_lang::IdlBuild for NcnRewardRouter {} #[cfg(feature = "anchor-idl-build")] impl anchor_lang::Discriminator for NcnRewardRouter { - const DISCRIMINATOR: [u8; 8] = [0; 8]; + const DISCRIMINATOR: &'static [u8] = &[0; 8]; } diff --git a/clients/rust/jito_tip_router/src/generated/accounts/operator_snapshot.rs b/clients/rust/jito_tip_router/src/generated/accounts/operator_snapshot.rs index e1b7c2a2..3c2c1460 100644 --- a/clients/rust/jito_tip_router/src/generated/accounts/operator_snapshot.rs +++ b/clients/rust/jito_tip_router/src/generated/accounts/operator_snapshot.rs @@ -84,5 +84,5 @@ impl anchor_lang::IdlBuild for OperatorSnapshot {} #[cfg(feature = "anchor-idl-build")] impl anchor_lang::Discriminator for OperatorSnapshot { - const DISCRIMINATOR: [u8; 8] = [0; 8]; + const DISCRIMINATOR: &'static [u8] = &[0; 8]; } diff --git a/clients/rust/jito_tip_router/src/generated/accounts/vault_registry.rs b/clients/rust/jito_tip_router/src/generated/accounts/vault_registry.rs index 44435211..8e29e9df 100644 --- a/clients/rust/jito_tip_router/src/generated/accounts/vault_registry.rs +++ b/clients/rust/jito_tip_router/src/generated/accounts/vault_registry.rs @@ -70,5 +70,5 @@ impl anchor_lang::IdlBuild for VaultRegistry {} #[cfg(feature = "anchor-idl-build")] impl anchor_lang::Discriminator for VaultRegistry { - const DISCRIMINATOR: [u8; 8] = [0; 8]; + const DISCRIMINATOR: &'static [u8] = &[0; 8]; } diff --git a/clients/rust/jito_tip_router/src/generated/accounts/weight_table.rs b/clients/rust/jito_tip_router/src/generated/accounts/weight_table.rs index 0d1d42cd..8405dd87 100644 --- a/clients/rust/jito_tip_router/src/generated/accounts/weight_table.rs +++ b/clients/rust/jito_tip_router/src/generated/accounts/weight_table.rs @@ -73,5 +73,5 @@ impl anchor_lang::IdlBuild for WeightTable {} #[cfg(feature = "anchor-idl-build")] impl anchor_lang::Discriminator for WeightTable { - const DISCRIMINATOR: [u8; 8] = [0; 8]; + const DISCRIMINATOR: &'static [u8] = &[0; 8]; } From 2e32acbed6b49cd09c8fd321c325d22a45786ac9 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Fri, 7 Feb 2025 14:44:57 -0500 Subject: [PATCH 075/112] use patched kinobi packages to support anchor 0.31.x --- generate_client.sh | 3 +- package.json | 8 +- scripts/generate-clients.js | 4 +- yarn.lock | 155 ++++++++++++++++++++++++------------ 4 files changed, 110 insertions(+), 60 deletions(-) diff --git a/generate_client.sh b/generate_client.sh index be0abf39..8279cbd1 100755 --- a/generate_client.sh +++ b/generate_client.sh @@ -2,4 +2,5 @@ cargo b ./target/debug/jito-tip-router-shank-cli && yarn install && yarn generate-clients && cargo b -cargo-build-sbf \ No newline at end of file +cargo-build-sbf +cargo fmt diff --git a/package.json b/package.json index 5ac2eaa8..40dfc80d 100644 --- a/package.json +++ b/package.json @@ -3,10 +3,10 @@ "version": "0.0.1", "description": "Jito MEV Tip Distribution NCN", "dependencies": { - "@kinobi-so/nodes-from-anchor": "^0.21.1", - "@kinobi-so/renderers": "^0.21.1", - "@kinobi-so/renderers-js-umi": "^0.21.1", - "@kinobi-so/renderers-rust": "^0.21.1", + "@exo-tech-xyz/nodes-from-anchor": "0.21.3", + "@exo-tech-xyz/renderers": "0.21.4", + "@exo-tech-xyz/renderers-js-umi": "0.21.7", + "@exo-tech-xyz/renderers-rust": "0.21.8", "corepack": "^0.29.3", "kinobi": "^0.21.1", "yarn": "2.4.3" diff --git a/scripts/generate-clients.js b/scripts/generate-clients.js index 3119c703..fda67f1f 100644 --- a/scripts/generate-clients.js +++ b/scripts/generate-clients.js @@ -1,7 +1,7 @@ const kinobi = require("kinobi"); -const anchorIdl = require("@kinobi-so/nodes-from-anchor"); +const anchorIdl = require("@exo-tech-xyz/nodes-from-anchor"); const path = require("path"); -const renderers = require('@kinobi-so/renderers'); +const renderers = require('@exo-tech-xyz/renderers'); // Paths. const projectRoot = path.join(__dirname, ".."); diff --git a/yarn.lock b/yarn.lock index 2ae13cb0..0aab74f9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,95 +2,144 @@ # yarn lockfile v1 -"@kinobi-so/errors@0.21.5": +"@exo-tech-xyz/errors@0.21.5": version "0.21.5" - resolved "https://registry.npmjs.org/@kinobi-so/errors/-/errors-0.21.5.tgz" - integrity sha512-IqPMOe0qbmuBI8vux9HU+tvx+SaCVk32g5GnRvYxJh6OmpYOEuJRg02nT2XtYPeYWB2IFKJ1X2AnwTbEz9Vx8Q== + resolved "https://registry.yarnpkg.com/@exo-tech-xyz/errors/-/errors-0.21.5.tgz#3826b7d33cf6fcd48669acb0af19982ca94bd169" + integrity sha512-rVjv0RG13Kt68OaEJvRHIY+CeyM/GWMtBaF97jZla3YKWoFEiKFaNXcvykWxFckVaMb0AlSZU2X0DIxjwqKrAQ== dependencies: - "@kinobi-so/node-types" "0.21.5" + "@exo-tech-xyz/node-types" "0.21.5" chalk "^5.3.0" commander "^12.1.0" -"@kinobi-so/node-types@0.21.5": +"@exo-tech-xyz/node-types@0.21.5": version "0.21.5" - resolved "https://registry.npmjs.org/@kinobi-so/node-types/-/node-types-0.21.5.tgz" - integrity sha512-OKpk08+nTsO25xSZBT+PXpjx2FOHfn7jr0CbnQZ+ulfRa+dr3eSf7zSn+0ipKjG+FFWUUGpizgSkgpTQMjAqLA== + resolved "https://registry.yarnpkg.com/@exo-tech-xyz/node-types/-/node-types-0.21.5.tgz#29d0696fcc7f8341786b952f5dfbae0dec275724" + integrity sha512-3XfCZDB/AxiPmGdEQdaXoCe6EC0l5ItPzLGFKDCwPlfA6QBFtfY1w6CgR4kFFMtbnvWPCG1AmMxn0XsP+7BYJA== -"@kinobi-so/nodes-from-anchor@0.21.3", "@kinobi-so/nodes-from-anchor@^0.21.1": +"@exo-tech-xyz/nodes-from-anchor@0.21.3": version "0.21.3" - resolved "https://registry.npmjs.org/@kinobi-so/nodes-from-anchor/-/nodes-from-anchor-0.21.3.tgz" - integrity sha512-mar3UeJNx61k77NhucqYIwUXZvC0b6mhLYFksQY0Wz+gCFTWLr8exxB7KmgSycT+XuFNOydpYnEOeMa5lUywBQ== + resolved "https://registry.yarnpkg.com/@exo-tech-xyz/nodes-from-anchor/-/nodes-from-anchor-0.21.3.tgz#bdda603707937568361a4ad7fa5141f4591726ed" + integrity sha512-JE7ZCEaNTa54BJxvnw24ELFykWgGTwnZFz4HgKFlCKXLA/MIxjk9GbwWz73m7W0YFC/NjpDopSmS+9Xh6/nyog== dependencies: - "@kinobi-so/errors" "0.21.5" - "@kinobi-so/nodes" "0.21.5" - "@kinobi-so/visitors" "0.21.5" + "@exo-tech-xyz/errors" "0.21.5" + "@exo-tech-xyz/nodes" "0.21.5" + "@exo-tech-xyz/visitors" "0.21.5" "@noble/hashes" "^1.5.0" -"@kinobi-so/nodes@0.21.5": +"@exo-tech-xyz/nodes@0.21.5": version "0.21.5" - resolved "https://registry.npmjs.org/@kinobi-so/nodes/-/nodes-0.21.5.tgz" - integrity sha512-6iu9/GXrVs14olVeUAAw73BK2js7RGefVGHBDF6PKcvw6i0DlxhPkZiNOSpzweaeTmZsowHO7xEJKov0446fbQ== + resolved "https://registry.yarnpkg.com/@exo-tech-xyz/nodes/-/nodes-0.21.5.tgz#df32b9b27c55f442fb1ec6f0752ac4f7230d0f18" + integrity sha512-d4QuBoLAE5lBueJ0Y1vyY10vrBqlDl4YdIzcQIvb4AKqhN//Aa0VCtvNKHVBa2Tzx3QSfdJek39h5xpxmUXQ3A== dependencies: - "@kinobi-so/errors" "0.21.5" - "@kinobi-so/node-types" "0.21.5" + "@exo-tech-xyz/errors" "0.21.5" + "@exo-tech-xyz/node-types" "0.21.5" -"@kinobi-so/renderers-core@0.21.3": +"@exo-tech-xyz/renderers-core@0.21.3": version "0.21.3" - resolved "https://registry.npmjs.org/@kinobi-so/renderers-core/-/renderers-core-0.21.3.tgz" - integrity sha512-Ow1x0IaRmUlqQUAFTQZpq56wpkB6YKdnpNmfjM8IS/ssgz2IG5Jw3LREvNLvdXwpp/eyjSYOsux2RDFJkERl0g== + resolved "https://registry.yarnpkg.com/@exo-tech-xyz/renderers-core/-/renderers-core-0.21.3.tgz#7e95e9448426bc57281febbcd311b8699981b4b5" + integrity sha512-r1f7fs13fAcajMpr/Y471WxEd4B2aFchinQi1I3qdzLJ4xh0haWrXlVf18VOHotMFKhU7sqIOiaBcHh6qIWAPg== dependencies: - "@kinobi-so/errors" "0.21.5" - "@kinobi-so/nodes" "0.21.5" - "@kinobi-so/visitors-core" "0.21.5" + "@exo-tech-xyz/errors" "0.21.5" + "@exo-tech-xyz/nodes" "0.21.5" + "@exo-tech-xyz/visitors-core" "0.21.5" -"@kinobi-so/renderers-js-umi@0.21.7", "@kinobi-so/renderers-js-umi@^0.21.1": +"@exo-tech-xyz/renderers-js-umi@0.21.7": version "0.21.7" - resolved "https://registry.npmjs.org/@kinobi-so/renderers-js-umi/-/renderers-js-umi-0.21.7.tgz" - integrity sha512-OgM8L44jWYww7gnCSC7gSNPC+yWVEPCj/cffhDb1O1WfglpeQiHFiRUEnBc8GCGF8Oc6Azn2jjQlja8JNsqZmA== + resolved "https://registry.yarnpkg.com/@exo-tech-xyz/renderers-js-umi/-/renderers-js-umi-0.21.7.tgz#d81ca2695b3ade7c2ad6c91bd791ed205a91a52b" + integrity sha512-TeLZNeQb0MFQWXcJ6sqXcaH+LxluxF55nyDw2TVktIJPko0SHbAO7EWCwclfI3SJ7sddDI7BZ5eibp8evVnGdA== dependencies: - "@kinobi-so/errors" "0.21.5" - "@kinobi-so/nodes" "0.21.5" - "@kinobi-so/renderers-core" "0.21.3" - "@kinobi-so/validators" "0.21.5" - "@kinobi-so/visitors-core" "0.21.5" + "@exo-tech-xyz/errors" "0.21.5" + "@exo-tech-xyz/nodes" "0.21.5" + "@exo-tech-xyz/renderers-core" "0.21.3" + "@exo-tech-xyz/validators" "0.21.5" + "@exo-tech-xyz/visitors-core" "0.21.5" "@solana/codecs-strings" rc nunjucks "^3.2.4" prettier "^3.3.3" -"@kinobi-so/renderers-js@0.21.9": +"@exo-tech-xyz/renderers-js@0.21.9": version "0.21.9" - resolved "https://registry.npmjs.org/@kinobi-so/renderers-js/-/renderers-js-0.21.9.tgz" - integrity sha512-ZwN3UIYGZHu1V9TYsCPolVPdScR71r4PrLVVLsxixIxPBhdTMIgUbXK4OqHkzxaR5kn8Ssrvuq6+V2f7XFbVSg== + resolved "https://registry.yarnpkg.com/@exo-tech-xyz/renderers-js/-/renderers-js-0.21.9.tgz#2af456a0798c1229068871938077a5f92214c48b" + integrity sha512-ijMbc/7jMmqE4VoGML91jnCTVSV6qpmiJxyE9I5A6wU3H5A4Ct8mAGXI8H0SHUylxRkFjt46aVl6U8AFWyCK0Q== dependencies: - "@kinobi-so/errors" "0.21.5" - "@kinobi-so/nodes" "0.21.5" - "@kinobi-so/nodes-from-anchor" "0.21.3" - "@kinobi-so/renderers-core" "0.21.3" - "@kinobi-so/visitors-core" "0.21.5" + "@exo-tech-xyz/errors" "0.21.5" + "@exo-tech-xyz/nodes" "0.21.5" + "@exo-tech-xyz/nodes-from-anchor" "0.21.3" + "@exo-tech-xyz/renderers-core" "0.21.3" + "@exo-tech-xyz/visitors-core" "0.21.5" "@solana/codecs-strings" rc nunjucks "^3.2.4" prettier "^3.3.3" -"@kinobi-so/renderers-rust@0.21.8", "@kinobi-so/renderers-rust@^0.21.1": +"@exo-tech-xyz/renderers-rust@0.21.8": version "0.21.8" - resolved "https://registry.npmjs.org/@kinobi-so/renderers-rust/-/renderers-rust-0.21.8.tgz" - integrity sha512-rjWK+hWnniAcfaVAPwgzom3LtXkGj4iZ/LPsm8LpgfSdTbXLT2HihVgyQGQDpSTDdVvGb4PuuX7A01Et3N7iog== + resolved "https://registry.yarnpkg.com/@exo-tech-xyz/renderers-rust/-/renderers-rust-0.21.8.tgz#b182e2af8b744fdb2e24cc55d611a604da30aecd" + integrity sha512-zFn/n+ZdFyLiF09XefFO3nj25BFe/iYuqDetQiEoYnoXR2egzfCSolXPUrj4Mx0T+9A2TbzOCqgj7rFuemzK9w== dependencies: - "@kinobi-so/errors" "0.21.5" - "@kinobi-so/nodes" "0.21.5" - "@kinobi-so/renderers-core" "0.21.3" - "@kinobi-so/visitors-core" "0.21.5" + "@exo-tech-xyz/errors" "0.21.5" + "@exo-tech-xyz/nodes" "0.21.5" + "@exo-tech-xyz/renderers-core" "0.21.3" + "@exo-tech-xyz/visitors-core" "0.21.5" "@solana/codecs-strings" rc nunjucks "^3.2.4" -"@kinobi-so/renderers@^0.21.1": +"@exo-tech-xyz/renderers@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@exo-tech-xyz/renderers/-/renderers-0.21.4.tgz#ba0078b1ab3b3abcd4661b342e8b8ce440462569" + integrity sha512-vKPDRDGzgTWrFz/esNecIMS5f3K0ebRJOUvlz2u9yl+pp8+3MHtlkk2og6mlSaBt+iE5C7ql0G3yoCnDFPr5BQ== + dependencies: + "@exo-tech-xyz/renderers-js" "0.21.9" + "@exo-tech-xyz/renderers-js-umi" "0.21.7" + "@exo-tech-xyz/renderers-rust" "0.21.8" + +"@exo-tech-xyz/validators@0.21.5": version "0.21.5" - resolved "https://registry.npmjs.org/@kinobi-so/renderers/-/renderers-0.21.5.tgz" - integrity sha512-JwHaYEjx1l/nf302b2RoZv3TEsBDsE1u+sgEt+noC3WXjqHVJJkjZ7DTL6IBSgBerR9OwukraCN7RWK2XQVwgA== + resolved "https://registry.yarnpkg.com/@exo-tech-xyz/validators/-/validators-0.21.5.tgz#79bf46d187901096aa6948ffe6db1118d9871250" + integrity sha512-EKIZpjkF4fE76/ixNc+6pxV2VD9qXyV9iqpO2ecLP85cPMWo2HVjoRt9sEmiTOOAZ+VPERUtks8BeASY8KQCjg== dependencies: - "@kinobi-so/renderers-js" "0.21.9" - "@kinobi-so/renderers-js-umi" "0.21.7" - "@kinobi-so/renderers-rust" "0.21.8" + "@exo-tech-xyz/errors" "0.21.5" + "@exo-tech-xyz/nodes" "0.21.5" + "@exo-tech-xyz/visitors-core" "0.21.5" + +"@exo-tech-xyz/visitors-core@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@exo-tech-xyz/visitors-core/-/visitors-core-0.21.5.tgz#89c53711f3cdfd4a913e1523df2b1902ae771cd7" + integrity sha512-dQ/AGBTNWw5WKCvc+RMarVPUjVip2i8Rg8MuBbpZG9ONy3QTgoPU3a3lvOLR/5aHSTZOKNe36bZzhTPQGP7uxg== + dependencies: + "@exo-tech-xyz/errors" "0.21.5" + "@exo-tech-xyz/nodes" "0.21.5" + json-stable-stringify "^1.1.1" + +"@exo-tech-xyz/visitors@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@exo-tech-xyz/visitors/-/visitors-0.21.5.tgz#d388fc56892e05e965743f9cc714b452e36596cd" + integrity sha512-8tSRZTQLh7Xe0r1+ndt5tJofqyJEMx6iXUcdpoawj8zshXXMztSB0IedI0aOHT/tbp1056lE7I3t/UvLGE2AiA== + dependencies: + "@exo-tech-xyz/errors" "0.21.5" + "@exo-tech-xyz/nodes" "0.21.5" + "@exo-tech-xyz/visitors-core" "0.21.5" + +"@kinobi-so/errors@0.21.5": + version "0.21.5" + resolved "https://registry.npmjs.org/@kinobi-so/errors/-/errors-0.21.5.tgz" + integrity sha512-IqPMOe0qbmuBI8vux9HU+tvx+SaCVk32g5GnRvYxJh6OmpYOEuJRg02nT2XtYPeYWB2IFKJ1X2AnwTbEz9Vx8Q== + dependencies: + "@kinobi-so/node-types" "0.21.5" + chalk "^5.3.0" + commander "^12.1.0" + +"@kinobi-so/node-types@0.21.5": + version "0.21.5" + resolved "https://registry.npmjs.org/@kinobi-so/node-types/-/node-types-0.21.5.tgz" + integrity sha512-OKpk08+nTsO25xSZBT+PXpjx2FOHfn7jr0CbnQZ+ulfRa+dr3eSf7zSn+0ipKjG+FFWUUGpizgSkgpTQMjAqLA== + +"@kinobi-so/nodes@0.21.5": + version "0.21.5" + resolved "https://registry.npmjs.org/@kinobi-so/nodes/-/nodes-0.21.5.tgz" + integrity sha512-6iu9/GXrVs14olVeUAAw73BK2js7RGefVGHBDF6PKcvw6i0DlxhPkZiNOSpzweaeTmZsowHO7xEJKov0446fbQ== + dependencies: + "@kinobi-so/errors" "0.21.5" + "@kinobi-so/node-types" "0.21.5" "@kinobi-so/validators@0.21.5": version "0.21.5" From c98dfcb4823203ec186378098b31ccdf78d20ed4 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Fri, 7 Feb 2025 15:42:32 -0500 Subject: [PATCH 076/112] remove unnecessary patched crates --- Cargo.lock | 70 ------------------------------------------------------ Cargo.toml | 14 ----------- 2 files changed, 84 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9cca3a30..f867dcc0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11518,73 +11518,3 @@ dependencies = [ name = "solana-bench-tps" version = "2.1.11" source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" - -[[patch.unused]] -name = "solana-download-utils" -version = "2.1.11" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" - -[[patch.unused]] -name = "solana-frozen-abi" -version = "2.1.11" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" - -[[patch.unused]] -name = "solana-frozen-abi-macro" -version = "2.1.11" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" - -[[patch.unused]] -name = "solana-genesis" -version = "2.1.11" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" - -[[patch.unused]] -name = "solana-genesis-utils" -version = "2.1.11" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" - -[[patch.unused]] -name = "solana-local-cluster" -version = "2.1.11" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" - -[[patch.unused]] -name = "solana-notifier" -version = "2.1.11" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" - -[[patch.unused]] -name = "solana-package-metadata" -version = "2.1.11" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" - -[[patch.unused]] -name = "solana-package-metadata-macro" -version = "2.1.11" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" - -[[patch.unused]] -name = "solana-svm-conformance" -version = "2.1.11" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" - -[[patch.unused]] -name = "solana-test-validator" -version = "2.1.11" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" - -[[patch.unused]] -name = "solana-tps-client" -version = "2.1.11" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" - -[[patch.unused]] -name = "solana-tpu-client-next" -version = "2.1.11" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" - -[[patch.unused]] -name = "solana-zk-keygen" -version = "2.1.11" -source = "git+https://github.com/jito-foundation/jito-solana.git?rev=87dcd086af931d81a0a71ad49cbea38e9655f166#87dcd086af931d81a0a71ad49cbea38e9655f166" diff --git a/Cargo.toml b/Cargo.toml index 33785b23..29ce921a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -157,7 +157,6 @@ solana-curve25519 = { package = "solana-curve25519", git = "https://github.com/j solana-decode-error = { package = "solana-decode-error", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-define-syscall = { package = "solana-define-syscall", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-derivation-path = { package = "solana-derivation-path", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } -solana-download-utils = { package = "solana-download-utils", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-entry = { package = "solana-entry", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-program-entrypoint = { package = "solana-program-entrypoint", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-epoch-schedule = { package = "solana-epoch-schedule", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } @@ -165,11 +164,6 @@ solana-faucet = { package = "solana-faucet", git = "https://github.com/jito-foun solana-feature-set = { package = "solana-feature-set", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-fee-calculator = { package = "solana-fee-calculator", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-fee = { package = "solana-fee", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } -solana-frozen-abi = { package = "solana-frozen-abi", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } -solana-frozen-abi-macro = { package = "solana-frozen-abi-macro", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } -solana-tps-client = { package = "solana-tps-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } -solana-genesis = { package = "solana-genesis", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } -solana-genesis-utils = { package = "solana-genesis-utils", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-geyser-plugin-manager = { package = "solana-geyser-plugin-manager", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-gossip = { package = "solana-gossip", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-hash = { package = "solana-hash", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } @@ -180,7 +174,6 @@ solana-last-restart-slot = { package = "solana-last-restart-slot", git = "https: solana-lattice-hash = { package = "solana-lattice-hash", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-ledger = { package = "solana-ledger", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-loader-v4-program = { package = "solana-loader-v4-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } -solana-local-cluster = { package = "solana-local-cluster", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-log-collector = { package = "solana-log-collector", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-logger = { package = "solana-logger", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-measure = { package = "solana-measure", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } @@ -189,9 +182,6 @@ solana-metrics = { package = "solana-metrics", git = "https://github.com/jito-fo solana-msg = { package = "solana-msg", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-native-token = { package = "solana-native-token", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-net-utils = { package = "solana-net-utils", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } -solana-notifier = { package = "solana-notifier", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } -solana-package-metadata = { package = "solana-package-metadata", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } -solana-package-metadata-macro = { package = "solana-package-metadata-macro", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-packet = { package = "solana-packet", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-perf = { package = "solana-perf", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-poh = { package = "solana-poh", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } @@ -238,16 +228,13 @@ solana-storage-bigtable = { package = "solana-storage-bigtable", git = "https:// solana-storage-proto = { package = "solana-storage-proto", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-streamer = { package = "solana-streamer", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-svm = { package = "solana-svm", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } -solana-svm-conformance = { package = "solana-svm-conformance", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-svm-rent-collector = { package = "solana-svm-rent-collector", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-svm-transaction = { package = "solana-svm-transaction", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-system-program = { package = "solana-system-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-sysvar-id = { package = "solana-sysvar-id", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } -solana-test-validator = { package = "solana-test-validator", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-thin-client = { package = "solana-thin-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-transaction-error = { package = "solana-transaction-error", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-tpu-client = { package = "solana-tpu-client", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } -solana-tpu-client-next = { package = "solana-tpu-client-next", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-transaction-status = { package = "solana-transaction-status", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-transaction-status-client-types = { package = "solana-transaction-status-client-types", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-transaction-metrics-tracker = { package = "solana-transaction-metrics-tracker", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } @@ -259,7 +246,6 @@ solana-vote = { package = "solana-vote", git = "https://github.com/jito-foundati solana-vote-program = { package = "solana-vote-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-wen-restart = { package = "solana-wen-restart", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-zk-elgamal-proof-program = { package = "solana-zk-elgamal-proof-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } -solana-zk-keygen = { package = "solana-zk-keygen", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-zk-sdk = { package = "solana-zk-sdk", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-zk-token-proof-program = { package = "solana-zk-token-proof-program", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } solana-zk-token-sdk = { package = "solana-zk-token-sdk", git = "https://github.com/jito-foundation/jito-solana.git", rev = "87dcd086af931d81a0a71ad49cbea38e9655f166" } From 7fc8a6978860aa9834a66d76e904a9e68038fe2b Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Fri, 7 Feb 2025 15:57:19 -0500 Subject: [PATCH 077/112] debugging CI --- .github/workflows/ci.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8cd069f2..b9cdebb7 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -163,6 +163,8 @@ jobs: - build steps: - uses: actions/checkout@v4 + - name: Debugging commit + run: echo ${{ github.ref }} && echo ${{ github.sha }} - uses: aarcangeli/load-dotenv@v1.0.0 with: path: .cargo From 6c43ee01e537d5720daec3eeb4273fce2e69c2cc Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Mon, 10 Feb 2025 19:54:19 -0500 Subject: [PATCH 078/112] remove debugging log --- .github/workflows/ci.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b9cdebb7..8cd069f2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -163,8 +163,6 @@ jobs: - build steps: - uses: actions/checkout@v4 - - name: Debugging commit - run: echo ${{ github.ref }} && echo ${{ github.sha }} - uses: aarcangeli/load-dotenv@v1.0.0 with: path: .cargo From 9f6f72edd56f93aa6c6f2b105a11b36a2c7f8ff3 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Mon, 10 Feb 2025 20:12:15 -0500 Subject: [PATCH 079/112] [hopefully] fix ci issues after merging master --- Cargo.lock | 30 +++++++++++++++--------------- cli/src/getters.rs | 1 + 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f867dcc0..f814e703 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1122,7 +1122,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115e54d64eb62cdebad391c19efc9dce4981c690c85a33a12199d99bb9546fee" dependencies = [ "borsh-derive 0.10.4", - "hashbrown 0.13.2", + "hashbrown 0.11.2", ] [[package]] @@ -3495,7 +3495,7 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jito-account-traits-derive" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" dependencies = [ "proc-macro2 1.0.92", "quote 1.0.38", @@ -3505,7 +3505,7 @@ dependencies = [ [[package]] name = "jito-bytemuck" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" dependencies = [ "borsh 0.10.4", "bytemuck", @@ -3516,7 +3516,7 @@ dependencies = [ [[package]] name = "jito-jsm-core" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" dependencies = [ "borsh 0.10.4", "bytemuck", @@ -3557,7 +3557,7 @@ dependencies = [ [[package]] name = "jito-restaking-client" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" dependencies = [ "anchor-lang 0.30.1", "borsh 0.10.4", @@ -3574,7 +3574,7 @@ dependencies = [ [[package]] name = "jito-restaking-core" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" dependencies = [ "borsh 0.10.4", "bytemuck", @@ -3591,7 +3591,7 @@ dependencies = [ [[package]] name = "jito-restaking-program" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" dependencies = [ "borsh 0.10.4", "cfg-if 1.0.0", @@ -3612,7 +3612,7 @@ dependencies = [ [[package]] name = "jito-restaking-sdk" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" dependencies = [ "borsh 0.10.4", "shank", @@ -3821,7 +3821,7 @@ dependencies = [ [[package]] name = "jito-vault-client" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" dependencies = [ "anchor-lang 0.30.1", "borsh 0.10.4", @@ -3838,7 +3838,7 @@ dependencies = [ [[package]] name = "jito-vault-core" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" dependencies = [ "borsh 0.10.4", "bytemuck", @@ -3856,7 +3856,7 @@ dependencies = [ [[package]] name = "jito-vault-program" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" dependencies = [ "borsh 0.10.4", "cfg-if 1.0.0", @@ -3877,7 +3877,7 @@ dependencies = [ [[package]] name = "jito-vault-sdk" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#6ccb2d3c2141b2be0d7794a094fc2c3af1639ab5" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" dependencies = [ "borsh 0.10.4", "shank", @@ -4120,7 +4120,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if 1.0.0", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -9718,8 +9718,8 @@ dependencies = [ "sha2 0.10.8", "solana-address-lookup-table-program", "solana-program", - "spl-associated-token-account 6.0.0", - "spl-token 7.0.0", + "spl-associated-token-account 4.0.0", + "spl-token 6.0.0", "switchboard-common", ] diff --git a/cli/src/getters.rs b/cli/src/getters.rs index 206574ce..dba1c5c3 100644 --- a/cli/src/getters.rs +++ b/cli/src/getters.rs @@ -640,6 +640,7 @@ pub async fn get_all_sorted_operators_for_vault( min_context_slot: None, }, with_context: Some(false), + sort_results: None, }; let results = client From 8f88948f11d0a635fe590b66cb9f23f6333b6f8c Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Mon, 10 Feb 2025 22:14:31 -0500 Subject: [PATCH 080/112] update dependencies and do some cleanup; still failing vault program deserialization still failing --- Cargo.lock | 24 +++++++++---------- cli/Cargo.toml | 3 --- cli/src/getters.rs | 2 +- .../src/stake_meta_generator.rs | 1 - 4 files changed, 13 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f814e703..a817b4ed 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1122,7 +1122,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115e54d64eb62cdebad391c19efc9dce4981c690c85a33a12199d99bb9546fee" dependencies = [ "borsh-derive 0.10.4", - "hashbrown 0.11.2", + "hashbrown 0.13.2", ] [[package]] @@ -3495,7 +3495,7 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jito-account-traits-derive" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#358fbc3c20d947c977a136808f9fbf7f070e478b" dependencies = [ "proc-macro2 1.0.92", "quote 1.0.38", @@ -3505,7 +3505,7 @@ dependencies = [ [[package]] name = "jito-bytemuck" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#358fbc3c20d947c977a136808f9fbf7f070e478b" dependencies = [ "borsh 0.10.4", "bytemuck", @@ -3516,7 +3516,7 @@ dependencies = [ [[package]] name = "jito-jsm-core" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#358fbc3c20d947c977a136808f9fbf7f070e478b" dependencies = [ "borsh 0.10.4", "bytemuck", @@ -3557,7 +3557,7 @@ dependencies = [ [[package]] name = "jito-restaking-client" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#358fbc3c20d947c977a136808f9fbf7f070e478b" dependencies = [ "anchor-lang 0.30.1", "borsh 0.10.4", @@ -3574,7 +3574,7 @@ dependencies = [ [[package]] name = "jito-restaking-core" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#358fbc3c20d947c977a136808f9fbf7f070e478b" dependencies = [ "borsh 0.10.4", "bytemuck", @@ -3591,7 +3591,7 @@ dependencies = [ [[package]] name = "jito-restaking-program" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#358fbc3c20d947c977a136808f9fbf7f070e478b" dependencies = [ "borsh 0.10.4", "cfg-if 1.0.0", @@ -3612,7 +3612,7 @@ dependencies = [ [[package]] name = "jito-restaking-sdk" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#358fbc3c20d947c977a136808f9fbf7f070e478b" dependencies = [ "borsh 0.10.4", "shank", @@ -3821,7 +3821,7 @@ dependencies = [ [[package]] name = "jito-vault-client" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#358fbc3c20d947c977a136808f9fbf7f070e478b" dependencies = [ "anchor-lang 0.30.1", "borsh 0.10.4", @@ -3838,7 +3838,7 @@ dependencies = [ [[package]] name = "jito-vault-core" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#358fbc3c20d947c977a136808f9fbf7f070e478b" dependencies = [ "borsh 0.10.4", "bytemuck", @@ -3856,7 +3856,7 @@ dependencies = [ [[package]] name = "jito-vault-program" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#358fbc3c20d947c977a136808f9fbf7f070e478b" dependencies = [ "borsh 0.10.4", "cfg-if 1.0.0", @@ -3877,7 +3877,7 @@ dependencies = [ [[package]] name = "jito-vault-sdk" version = "0.0.3" -source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#7b192f42223db8efb68c076e526cc988d1e8fd61" +source = "git+https://github.com/jito-foundation/restaking?branch=v2.1-upgrade#358fbc3c20d947c977a136808f9fbf7f070e478b" dependencies = [ "borsh 0.10.4", "shank", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index a85ead58..a3dcd71e 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -49,9 +49,6 @@ switchboard-on-demand-client = "0.2.12" thiserror = { workspace = true } tokio = { workspace = true } -[patch.crates-io] -borsh = { package = "borsh", git = 'https://github.com/near/borsh-rs', tag = 'borsh-v1.5.3' } - [dev-dependencies] assert_matches = { workspace = true } diff --git a/cli/src/getters.rs b/cli/src/getters.rs index dba1c5c3..f97e25d0 100644 --- a/cli/src/getters.rs +++ b/cli/src/getters.rs @@ -2,8 +2,8 @@ use std::fmt; use std::mem::size_of; use crate::handler::CliHandler; -use anyhow::Result; use borsh1::BorshDeserialize; +use anyhow::Result; use jito_bytemuck::AccountDeserialize; use jito_restaking_core::{ config::Config as RestakingConfig, ncn::Ncn, ncn_operator_state::NcnOperatorState, diff --git a/tip-router-operator-cli/src/stake_meta_generator.rs b/tip-router-operator-cli/src/stake_meta_generator.rs index c3f1668e..e2324da0 100644 --- a/tip-router-operator-cli/src/stake_meta_generator.rs +++ b/tip-router-operator-cli/src/stake_meta_generator.rs @@ -416,7 +416,6 @@ mod tests { let (_, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config); // We have to update to working bank, otherwise cannot get strong pointer (Arc) for // ProgramCache fork_graph - // TODO: Review if this will be an issue for the actual CLI let mut bank = bank_forks.read().unwrap().working_bank(); /* 2. Seed the Bank with [TipDistributionAccount]'s */ From 7552096c4b921b75bb8b97fb96154326f77659dd Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Tue, 11 Feb 2025 18:45:51 -0500 Subject: [PATCH 081/112] update vault program --- cli/src/getters.rs | 2 +- .../tests/fixtures/jito_vault_program.so | Bin 432272 -> 447472 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/getters.rs b/cli/src/getters.rs index f97e25d0..dba1c5c3 100644 --- a/cli/src/getters.rs +++ b/cli/src/getters.rs @@ -2,8 +2,8 @@ use std::fmt; use std::mem::size_of; use crate::handler::CliHandler; -use borsh1::BorshDeserialize; use anyhow::Result; +use borsh1::BorshDeserialize; use jito_bytemuck::AccountDeserialize; use jito_restaking_core::{ config::Config as RestakingConfig, ncn::Ncn, ncn_operator_state::NcnOperatorState, diff --git a/integration_tests/tests/fixtures/jito_vault_program.so b/integration_tests/tests/fixtures/jito_vault_program.so index 82ad982f316f31be460a70b4d2c3247dfce7baa5..038ea10da49bf35123762ccf6d65236d865530c1 100644 GIT binary patch literal 447472 zcmeEv3w&Kiarcpv8!P4!$BrE5LOx5elNc4XvT+heC7{G4F>3fw2uh5>M6wd%B+&Zi znxOUJAwQCse6+}M0>*___e#bxP%sp}xRicZZGpNxifMrw%EM3|21-#O0Rw@2GxML> zv-jL{EjhOHfSjMLy?b_dc6N4Vc6Ro0-gNm@S4?YYi0nBj`gz2$p`T2XSDl)$=kurN zuPEw_mPRMj-&3PT$(y5;W(83b{*+TGUBhUmL?h155IY}0dOAG#O60RJEO#;`?Y{>2 zq{HoRKsgJo9Jhu`G;6tZxCg}|3mY|FnS&oqC$-6sLJQ(O4UN?LD7v2-!eQH@c1hs) zN%X7dq;sPcROxj3&*|}bfXL}{DV~b}h~xak`RxyLIG5tROA}hh`2l&)`M3>neo*3Z zen`SfiAzyEls@+G!w<*#EgsH+7NqgtI6q#Kf1l*v>+|pV1o{H`_xShLH+VlL@8i~e zHSl@~UZu>r(Cz_>-$DI-+3qNErC!PJ%4;R$_mupw(W_tSd>@Jn9p0e4!LRP8#{V9L zbBVZv0eu+GZ{8b42CuRh065?BRKC#<1^JH9uhY3cqG!E+-9u@=4gES6&^OK>eZNjW z!TtJ=Q|#B9k5j)6KH0A#ub&w^vGTfQiv9ZgQ|wpPi${{z>uA9EZIIX9$0)B`PjJ7! zXo~&%(+^Hf50f|^v0v}}Es@vv9Am#;dxHCQ))f17Z)U$@Ku+wY>16vv(YYrrjKXm? z9JjZp#_hif;If?a^LVzG-g}Jw`OGQwXHKXH`GCE7QgkG{wB`~wYFcm zKaZwgZ+n9E>#^EP-`q9%xSG|kN3u(frC;AZ#eQY}I+}jH=n2-Z?>k0$efJ~m*DXgF zzmBC}UopjgtxM|=N;_e<1{uk80a8hO3*3D&RgKSp_d@ZFDWd>x<(WWD*}vGnVE zr`WG-(jHB}{?QYxUypTu^U+7xuSc369!tNjonpVTU*c%`b>SHULk?t z$$Zy8XN$Zre|m++JbtE6kD`OWsrJ(|-jxE<8UI()Psab0|I7OH?-bu|;8Xg9##d1^%&GS%0AC;F@SHl{wW59#`fw+9|MAAWG_6Pph|BK`5` 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

#y-okM~!#0}S!+cE)QJm1nzq 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]%!Zci`?mkuoub)bW3KOH2y@N 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 From 8c3d08d4d29560249c6888c429c3a3df6fc85169 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Tue, 11 Feb 2025 18:55:12 -0500 Subject: [PATCH 082/112] remove comment --- integration_tests/tests/fixtures/stake_pool_client.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/integration_tests/tests/fixtures/stake_pool_client.rs b/integration_tests/tests/fixtures/stake_pool_client.rs index a0121582..f6e4574e 100644 --- a/integration_tests/tests/fixtures/stake_pool_client.rs +++ b/integration_tests/tests/fixtures/stake_pool_client.rs @@ -1,7 +1,6 @@ #![allow(deprecated)] // using deprecated borsh to align with mainnet stake pool version use jito_tip_router_core::constants::JITOSOL_MINT; use solana_program::{ - // TODO: Review if this is acceptable give spl-stake-pool crate was updated. borsh1::{get_instance_packed_len, get_packed_len}, pubkey::Pubkey, stake, From 2ebf89da144a727f57db9609a737c7a184b8e57d Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Tue, 11 Feb 2025 21:19:20 -0500 Subject: [PATCH 083/112] fix bug from merge --- tip-router-operator-cli/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 23beac99..9a6b7019 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -147,7 +147,7 @@ async fn main() -> Result<()> { loop { // Slow process with lots of account fetches so run every 30 minutes sleep(Duration::from_secs(1800)).await; - let epoch = if let Ok(epoch) = rpc_client.get_epoch_info() { + let epoch = if let Ok(epoch) = rpc_client.get_epoch_info().await { epoch.epoch.checked_sub(1).unwrap_or(epoch.epoch) } else { continue; From eccf6fa91f85505048aa6a091f344d01ef999efa Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Wed, 12 Feb 2025 16:14:11 -0500 Subject: [PATCH 084/112] move stage transition loop to process_epoch --- tip-router-operator-cli/src/cli.rs | 3 - tip-router-operator-cli/src/lib.rs | 8 +- tip-router-operator-cli/src/main.rs | 177 +++--------- tip-router-operator-cli/src/process_epoch.rs | 272 +++++++++---------- 4 files changed, 176 insertions(+), 284 deletions(-) diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index 4551c0e3..5cafae6c 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -80,9 +80,6 @@ pub enum Commands { #[arg(long, env, default_value = "3")] num_monitored_epochs: u64, - #[arg(long, env, default_value = "false")] - start_next_epoch: bool, - #[arg(long, env)] override_target_slot: Option, diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index e5a10de2..e6df65da 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -3,11 +3,10 @@ pub mod ledger_utils; pub mod stake_meta_generator; pub mod tip_router; pub use crate::cli::{Cli, Commands}; -pub mod claim; -pub mod cli; -pub use crate::process_epoch::process_epoch; pub mod arg_matches; pub mod backup_snapshots; +pub mod claim; +pub mod cli; pub mod load_and_process_ledger; pub mod process_epoch; pub mod rpc_utils; @@ -39,6 +38,9 @@ use solana_runtime::bank::Bank; use solana_sdk::{account::AccountSharedData, pubkey::Pubkey, slot_history::Slot}; use stake_meta_generator::generate_stake_meta_collection; +// TODO: Should this be loaded from somewhere? +pub const PROTOCOL_FEE_BPS: u64 = 300; + #[derive(clap::ValueEnum, Clone, Copy, Debug)] pub enum OperatorState { // Allows the operator to load from a snapshot created externally diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index d56549fe..db2f3106 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -7,34 +7,21 @@ use ::{ meta_merkle_tree::generated_merkle_tree::{GeneratedMerkleTreeCollection, StakeMetaCollection}, solana_metrics::set_host_id, solana_rpc_client::nonblocking::rpc_client::RpcClient, - solana_runtime::bank::Bank, solana_sdk::{pubkey::Pubkey, signer::keypair::read_keypair_file}, - std::{ - path::PathBuf, - str::FromStr, - sync::Arc, - time::Duration, - }, + std::{path::PathBuf, str::FromStr, sync::Arc, time::Duration}, tip_router_operator_cli::{ backup_snapshots::BackupSnapshotMonitor, claim::claim_mev_tips_with_emit, cli::{Cli, Commands}, create_merkle_tree_collection, create_meta_merkle_tree, create_stake_meta, ledger_utils::get_bank_from_ledger, - load_bank_from_snapshot, - process_epoch::{ - calc_prev_epoch_and_final_slot, get_previous_epoch_last_slot, wait_for_next_epoch, - wait_for_optimal_incremental_snapshot, - }, + load_bank_from_snapshot, process_epoch, submit::{submit_recent_epochs_to_ncn, submit_to_ncn}, - OperatorState, + PROTOCOL_FEE_BPS, }, tokio::time::sleep, }; -// TODO: Should this be loaded from somewhere? -const PROTOCOL_FEE_BPS: u64 = 300; - #[tokio::main] async fn main() -> Result<()> { env_logger::init(); @@ -79,20 +66,17 @@ async fn main() -> Result<()> { override_target_slot, starting_stage, save_stages, - start_next_epoch, set_merkle_roots, claim_tips, } => { info!("Running Tip Router..."); info!("starting stage: {:?}", starting_stage); - let operator_address = cli.operator_address.clone(); let rpc_client_clone = rpc_client.clone(); let full_snapshots_path = cli.full_snapshots_path.clone().unwrap(); let backup_snapshots_dir = cli.backup_snapshots_dir.clone(); let rpc_url = cli.rpc_url.clone(); let cli_clone: Cli = cli.clone(); - let mut current_epoch_info = rpc_client.get_epoch_info().await?; if !backup_snapshots_dir.exists() { info!( @@ -141,130 +125,49 @@ async fn main() -> Result<()> { } }); - // Track runs that are starting right at the beginning of a new epoch - let mut stage = starting_stage; - let mut bank: Option> = None; - let mut stake_meta_collection: Option = None; - let mut merkle_tree_collection: Option = None; - let mut epoch_to_process = current_epoch_info.epoch.saturating_sub(1); - let mut slot_to_process = if let Some(slot) = override_target_slot { - slot - } else { - let (_, prev_slot) = calc_prev_epoch_and_final_slot(¤t_epoch_info)?; - prev_slot - }; - loop { - match stage { - OperatorState::LoadBankFromSnapshot => { - bank = Some(load_bank_from_snapshot( - cli.clone(), - slot_to_process, - enable_snapshots, - )); - // Transition to the next stage - stage = OperatorState::CreateStakeMeta; - } - OperatorState::CreateStakeMeta => { - // TODO: Determine if we want to allow operators to start from this stage. - // No matter what a bank has to be loaded from a snapshot, so might as - // well start from load bank - stake_meta_collection = Some(create_stake_meta( - operator_address.clone(), - epoch_to_process, - bank.as_ref().expect("Bank was not set"), - &tip_distribution_program_id, - &tip_payment_program_id, - &cli.save_path, - save_stages, - )); - // we should be able to safely drop the bank in this loop - bank = None; - // Transition to the next stage - stage = OperatorState::CreateMerkleTreeCollection; - } - OperatorState::CreateMerkleTreeCollection => { - let some_stake_meta_collection = match stake_meta_collection.to_owned() { - Some(collection) => collection, - None => { - let file = cli.save_path.join(format!( - "{}_stake_meta_collection.json", - epoch_to_process - )); - StakeMetaCollection::new_from_file(&file)? - } - }; - - // Generate the merkle tree collection - merkle_tree_collection = Some(create_merkle_tree_collection( - cli.operator_address.clone(), - &tip_router_program_id, - some_stake_meta_collection, - epoch_to_process, - &ncn_address, - PROTOCOL_FEE_BPS, - &cli.save_path, - save_stages, - )); - - stake_meta_collection = None; - // Transition to the next stage - stage = OperatorState::CreateMetaMerkleTree; - } - OperatorState::CreateMetaMerkleTree => { - let some_merkle_tree_collection = match merkle_tree_collection.to_owned() { - Some(collection) => collection, - None => { - let file = cli.save_path.join(format!( - "{}_merkle_tree_collection.json", - epoch_to_process - )); - GeneratedMerkleTreeCollection::new_from_file(&file)? - } - }; - - create_meta_merkle_tree( - cli.operator_address.clone(), - some_merkle_tree_collection, - epoch_to_process, - &cli.save_path, - // TODO: If we keep the separate thread for handling NCN submission - // through files on disk then this needs to be true - save_stages, - ); - stage = OperatorState::WaitForNextEpoch; - } - OperatorState::SubmitToNcn => { - // TODO: Determine if this should be a stage given the task that's in a - // separate thread - } - OperatorState::WaitForNextEpoch => { - current_epoch_info = - wait_for_next_epoch(&rpc_client, current_epoch_info.epoch).await; - // Get the last slot of the previous epoch - let (previous_epoch, previous_epoch_slot) = if let Ok((epoch, slot)) = - get_previous_epoch_last_slot(&rpc_client).await - { - (epoch, slot) + // Run claims if enabled + if claim_tips { + let cli_clone = cli.clone(); + let rpc_client = rpc_client.clone(); + tokio::spawn(async move { + loop { + // Slow process with lots of account fetches so run every 30 minutes + sleep(Duration::from_secs(1800)).await; + let epoch = if let Ok(epoch) = rpc_client.get_epoch_info().await { + epoch.epoch.checked_sub(1).unwrap_or(epoch.epoch) } else { - // TODO: Make a datapoint error - error!("Error getting previous epoch slot"); continue; }; - slot_to_process = previous_epoch_slot; - epoch_to_process = previous_epoch; - - // TODO: When we start with wait for the next epoch, should we always wait - // for the optimal snapshot? - let incremental_snapshots_path = cli.backup_snapshots_dir.clone(); - wait_for_optimal_incremental_snapshot( - incremental_snapshots_path, - slot_to_process, + if let Err(e) = claim_mev_tips_with_emit( + &cli_clone, + epoch, + tip_distribution_program_id, + tip_router_program_id, + ncn_address, + Duration::from_secs(3600), ) - .await?; - stage = OperatorState::LoadBankFromSnapshot; + .await + { + error!("Error claiming tips: {}", e); + } } - } + }); } + + // Endless loop that transitions between stages of the operator process. + process_epoch::loop_stages( + rpc_client, + cli, + starting_stage, + override_target_slot, + &tip_router_program_id, + &tip_distribution_program_id, + &tip_payment_program_id, + &ncn_address, + enable_snapshots, + save_stages, + ) + .await?; } Commands::SnapshotSlot { slot } => { info!("Snapshotting slot..."); diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index 3dc15abb..b5b27af2 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -1,19 +1,17 @@ -use std::{ - path::PathBuf, - str::FromStr, - time::{Duration, Instant}, -}; +use std::{path::PathBuf, sync::Arc, time::Duration}; use anyhow::Result; use ellipsis_client::EllipsisClient; use log::{error, info}; -use solana_metrics::{datapoint_error, datapoint_info}; +use meta_merkle_tree::generated_merkle_tree::{GeneratedMerkleTreeCollection, StakeMetaCollection}; use solana_rpc_client::nonblocking::rpc_client::RpcClient; +use solana_runtime::bank::Bank; use solana_sdk::{epoch_info::EpochInfo, pubkey::Pubkey}; use tokio::time; use crate::{ - backup_snapshots::SnapshotInfo, get_meta_merkle_root, tip_router::get_ncn_config, Cli, + backup_snapshots::SnapshotInfo, create_merkle_tree_collection, create_meta_merkle_tree, + create_stake_meta, load_bank_from_snapshot, Cli, OperatorState, PROTOCOL_FEE_BPS, }; const MAX_WAIT_FOR_INCREMENTAL_SNAPSHOT_TICKS: u64 = 1200; // Experimentally determined @@ -92,145 +90,137 @@ pub async fn wait_for_optimal_incremental_snapshot( Ok(()) } -#[allow(clippy::too_many_arguments)] -pub async fn process_epoch( - client: &EllipsisClient, - target_slot: u64, - target_epoch: u64, +pub async fn loop_stages( + rpc_client: EllipsisClient, + cli: Cli, + starting_stage: OperatorState, + override_target_slot: Option, + tip_router_program_id: &Pubkey, tip_distribution_program_id: &Pubkey, tip_payment_program_id: &Pubkey, - tip_router_program_id: &Pubkey, ncn_address: &Pubkey, - snapshots_enabled: bool, - new_epoch_rollover: bool, - cli_args: &Cli, + enable_snapshots: bool, + save_stages: bool, ) -> Result<()> { - info!("Processing epoch {:?}", target_epoch); - - let start = Instant::now(); - - let ledger_path = cli_args.ledger_path.clone(); - let account_paths = None; - let full_snapshots_path = cli_args.full_snapshots_path.clone(); - let incremental_snapshots_path = cli_args.backup_snapshots_dir.clone(); - let operator_address = Pubkey::from_str(&cli_args.operator_address).unwrap(); - let meta_merkle_tree_dir = cli_args.meta_merkle_tree_dir.clone(); - - // Get the protocol fees - let ncn_config = get_ncn_config(client, tip_router_program_id, ncn_address).await?; - let tip_router_target_epoch = target_epoch - .checked_add(1) - .ok_or_else(|| anyhow::anyhow!("tip_router_target_epoch overflow"))?; - let adjusted_total_fees = ncn_config - .fee_config - .adjusted_total_fees_bps(tip_router_target_epoch)?; - - let account_paths = account_paths.map_or_else(|| vec![ledger_path.clone()], |paths| paths); - let full_snapshots_path = full_snapshots_path.map_or(ledger_path, |path| path); - - // Wait for optimal incremental snapshot to be available since they can be delayed in a new epoch - if new_epoch_rollover { - wait_for_optimal_incremental_snapshot(incremental_snapshots_path.clone(), target_slot) - .await?; - } - - // Generate merkle root from ledger - let meta_merkle_tree = match get_meta_merkle_root( - cli_args.ledger_path.as_path(), - account_paths, - full_snapshots_path, - incremental_snapshots_path, - &target_slot, - tip_distribution_program_id, - "", // TODO out_path is not used, unsure what should be put here. Maybe `snapshot_output_dir` from cli args? - tip_payment_program_id, - tip_router_program_id, - ncn_address, - &operator_address, - target_epoch, - adjusted_total_fees, - snapshots_enabled, - &meta_merkle_tree_dir, - ) { - Ok(tree) => { - datapoint_info!( - "tip_router_cli.process_epoch", - ("operator_address", operator_address.to_string(), String), - ("epoch", target_epoch, i64), - ("status", "success", String), - ("state", "merkle_root_generation", String), - ("duration_ms", start.elapsed().as_millis() as i64, i64) - ); - tree - } - Err(e) => { - datapoint_error!( - "tip_router_cli.process_epoch", - ("operator_address", operator_address.to_string(), String), - ("epoch", target_epoch, i64), - ("status", "error", String), - ("error", format!("{:?}", e), String), - ("state", "merkle_root_generation", String), - ("duration_ms", start.elapsed().as_millis() as i64, i64) - ); - return Err(anyhow::anyhow!("Failed to generate merkle root: {:?}", e)); - } + let mut current_epoch_info = rpc_client.get_epoch_info().await?; + + // Track runs that are starting right at the beginning of a new epoch + let operator_address = cli.operator_address.clone(); + let mut stage = starting_stage; + let mut bank: Option> = None; + let mut stake_meta_collection: Option = None; + let mut merkle_tree_collection: Option = None; + let mut epoch_to_process = current_epoch_info.epoch.saturating_sub(1); + let mut slot_to_process = if let Some(slot) = override_target_slot { + slot + } else { + let (_, prev_slot) = calc_prev_epoch_and_final_slot(¤t_epoch_info)?; + prev_slot }; - - // Write meta merkle tree to file - let meta_merkle_tree_path = - meta_merkle_tree_dir.join(format!("meta_merkle_tree_{}.json", target_epoch)); - let meta_merkle_tree_json = match serde_json::to_string(&meta_merkle_tree) { - Ok(json) => json, - Err(e) => { - datapoint_error!( - "tip_router_cli.process_epoch", - ("operator_address", operator_address.to_string(), String), - ("epoch", target_epoch, i64), - ("status", "error", String), - ("error", format!("{:?}", e), String), - ("state", "merkle_root_serialization", String), - ("duration_ms", start.elapsed().as_millis() as i64, i64) - ); - return Err(anyhow::anyhow!( - "Failed to serialize meta merkle tree: {}", - e - )); + loop { + match stage { + OperatorState::LoadBankFromSnapshot => { + bank = Some(load_bank_from_snapshot( + cli.clone(), + slot_to_process, + enable_snapshots, + )); + // Transition to the next stage + stage = OperatorState::CreateStakeMeta; + } + OperatorState::CreateStakeMeta => { + // TODO: Determine if we want to allow operators to start from this stage. + // No matter what a bank has to be loaded from a snapshot, so might as + // well start from load bank + stake_meta_collection = Some(create_stake_meta( + operator_address.clone(), + epoch_to_process, + bank.as_ref().expect("Bank was not set"), + &tip_distribution_program_id, + &tip_payment_program_id, + &cli.save_path, + save_stages, + )); + // we should be able to safely drop the bank in this loop + bank = None; + // Transition to the next stage + stage = OperatorState::CreateMerkleTreeCollection; + } + OperatorState::CreateMerkleTreeCollection => { + let some_stake_meta_collection = match stake_meta_collection.to_owned() { + Some(collection) => collection, + None => { + let file = cli + .save_path + .join(format!("{}_stake_meta_collection.json", epoch_to_process)); + StakeMetaCollection::new_from_file(&file)? + } + }; + + // Generate the merkle tree collection + merkle_tree_collection = Some(create_merkle_tree_collection( + cli.operator_address.clone(), + &tip_router_program_id, + some_stake_meta_collection, + epoch_to_process, + &ncn_address, + PROTOCOL_FEE_BPS, + &cli.save_path, + save_stages, + )); + + stake_meta_collection = None; + // Transition to the next stage + stage = OperatorState::CreateMetaMerkleTree; + } + OperatorState::CreateMetaMerkleTree => { + let some_merkle_tree_collection = match merkle_tree_collection.to_owned() { + Some(collection) => collection, + None => { + let file = cli + .save_path + .join(format!("{}_merkle_tree_collection.json", epoch_to_process)); + GeneratedMerkleTreeCollection::new_from_file(&file)? + } + }; + + create_meta_merkle_tree( + cli.operator_address.clone(), + some_merkle_tree_collection, + epoch_to_process, + &cli.save_path, + // TODO: If we keep the separate thread for handling NCN submission + // through files on disk then this needs to be true + save_stages, + ); + stage = OperatorState::WaitForNextEpoch; + } + OperatorState::SubmitToNcn => { + // TODO: Determine if this should be a stage given the task that's in a + // separate thread + } + OperatorState::WaitForNextEpoch => { + current_epoch_info = + wait_for_next_epoch(&rpc_client, current_epoch_info.epoch).await; + // Get the last slot of the previous epoch + let (previous_epoch, previous_epoch_slot) = + if let Ok((epoch, slot)) = get_previous_epoch_last_slot(&rpc_client).await { + (epoch, slot) + } else { + // TODO: Make a datapoint error + error!("Error getting previous epoch slot"); + continue; + }; + slot_to_process = previous_epoch_slot; + epoch_to_process = previous_epoch; + + // TODO: When we start with wait for the next epoch, should we always wait + // for the optimal snapshot? + let incremental_snapshots_path = cli.backup_snapshots_dir.clone(); + wait_for_optimal_incremental_snapshot(incremental_snapshots_path, slot_to_process) + .await?; + stage = OperatorState::LoadBankFromSnapshot; + } } - }; - - if let Err(e) = std::fs::write(meta_merkle_tree_path, meta_merkle_tree_json) { - datapoint_error!( - "tip_router_cli.process_epoch", - ("operator_address", operator_address.to_string(), String), - ("epoch", target_epoch, i64), - ("status", "error", String), - ("error", format!("{:?}", e), String), - ("state", "merkle_root_file_write", String), - ("duration_ms", start.elapsed().as_millis() as i64, i64) - ); - return Err(anyhow::anyhow!( - "Failed to write meta merkle tree to file: {}", - e - )); } - - // Emit a datapoint for starting the epoch processing - datapoint_info!( - "tip_router_cli.process_epoch", - ("operator_address", operator_address.to_string(), String), - ("epoch", target_epoch, i64), - ("status", "success", String), - ("state", "epoch_processing_completed", String), - ( - "meta_merkle_root", - format!("{:?}", meta_merkle_tree.merkle_root), - String - ), - ("duration_ms", start.elapsed().as_millis() as i64, i64) - ); - - solana_metrics::flush(); - - Ok(()) } From 85a52f67e7e45a42c946a30b960072b9fe3b0403 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Wed, 12 Feb 2025 17:53:56 -0500 Subject: [PATCH 085/112] load bank from a full snapshot for a given slot --- .github/workflows/ci.yaml | 2 +- tip-router-operator-cli/src/ledger_utils.rs | 98 +++++++++++++++++++- tip-router-operator-cli/src/lib.rs | 1 - tip-router-operator-cli/src/process_epoch.rs | 55 +++++++++-- 4 files changed, 146 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8cd069f2..c3ec4427 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -178,7 +178,7 @@ jobs: name: jito_tip_router_program.so path: integration_tests/tests/fixtures/ - uses: taiki-e/install-action@nextest - - run: cargo nextest run --all-features -E 'not test(ledger_utils::tests::test_get_bank_from_ledger_success) and not test(test_meta_merkle_creation_from_ledger)' + - run: cargo nextest run --all-features -E 'not test(ledger_utils::tests) and not test(test_meta_merkle_creation_from_ledger)' env: SBF_OUT_DIR: ${{ github.workspace }}/integration_tests/tests/fixtures diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index d6d735be..bf33fb86 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -9,7 +9,9 @@ use std::{ use clap_old::ArgMatches; use log::{info, warn}; -use solana_accounts_db::hardened_unpack::{open_genesis_config, MAX_GENESIS_ARCHIVE_UNPACKED_SIZE}; +use solana_accounts_db::hardened_unpack::{ + open_genesis_config, OpenGenesisConfigError, MAX_GENESIS_ARCHIVE_UNPACKED_SIZE, +}; use solana_ledger::{ blockstore::{Blockstore, BlockstoreError}, blockstore_options::{AccessType, BlockstoreOptions}, @@ -21,12 +23,23 @@ use solana_runtime::{ snapshot_archive_info::SnapshotArchiveInfoGetter, snapshot_bank_utils, snapshot_config::SnapshotConfig, - snapshot_utils::{self, SnapshotVersion}, + snapshot_utils::{self, get_full_snapshot_archives, SnapshotError, SnapshotVersion}, }; use solana_sdk::clock::Slot; +use thiserror::Error; use crate::{arg_matches, load_and_process_ledger}; +#[derive(Error, Debug)] +pub enum LedgerUtilsError { + #[error("BankFromSnapshot error: {0}")] + BankFromSnapshotError(#[from] SnapshotError), + #[error("Missing snapshot at slot {0}")] + MissingSnapshotAtSlot(u64), + #[error("BankFromSnapshot error: {0}")] + OpenGenesisConfigError(#[from] OpenGenesisConfigError), +} + // TODO: Use Result and propagate errors more gracefully /// Create the Bank for a desired slot for given file paths. pub fn get_bank_from_ledger( @@ -398,6 +411,52 @@ pub fn get_bank_from_ledger( working_bank } +pub fn get_bank_from_snapshot_at_slot( + snapshot_slot: u64, + full_snapshots_path: &PathBuf, + bank_snapshots_dir: &PathBuf, + account_paths: Vec, + ledger_path: &Path, +) -> Result { + let mut full_snapshot_archives = get_full_snapshot_archives(full_snapshots_path); + full_snapshot_archives.retain(|archive| archive.snapshot_archive_info().slot == snapshot_slot); + + if full_snapshot_archives.len() != 1 { + return Err(LedgerUtilsError::MissingSnapshotAtSlot(snapshot_slot)); + } + let full_snapshot_archive_info = full_snapshot_archives.first().expect("unreachable"); + let process_options = ProcessOptions { + halt_at_slot: Some(snapshot_slot.to_owned()), + ..Default::default() + }; + let genesis_config = match open_genesis_config(ledger_path, MAX_GENESIS_ARCHIVE_UNPACKED_SIZE) { + Ok(genesis_config) => genesis_config, + Err(e) => return Err(e.into()), + }; + let exit = Arc::new(AtomicBool::new(false)); + + let (bank, _) = snapshot_bank_utils::bank_from_snapshot_archives( + &account_paths, + &bank_snapshots_dir, + full_snapshot_archive_info, + None, + &genesis_config, + &process_options.runtime_config, + process_options.debug_keys.clone(), + None, + process_options.limit_load_slot_count_from_snapshot, + process_options.accounts_db_test_hash_calculation, + process_options.accounts_db_skip_shrink, + process_options.accounts_db_force_initial_clean, + process_options.verify_index, + process_options.accounts_db_config.clone(), + None, + exit.clone(), + )?; + exit.store(true, Ordering::Relaxed); + return Ok(bank); +} + #[cfg(test)] mod tests { use crate::load_and_process_ledger::LEDGER_TOOL_DIRECTORY; @@ -406,6 +465,41 @@ mod tests { use super::*; + #[test] + fn test_get_bank_from_snapshot_at_slot() { + let ledger_path = PathBuf::from("./tests/fixtures/test-ledger"); + let account_paths = vec![ledger_path.join("accounts/run")]; + let full_snapshots_path = ledger_path.clone(); + let snapshot_slot = 100; + let bank = get_bank_from_snapshot_at_slot( + snapshot_slot, + &full_snapshots_path, + &full_snapshots_path, + account_paths, + &ledger_path.as_path(), + ) + .unwrap(); + assert_eq!(bank.slot(), snapshot_slot); + } + + #[test] + fn test_get_bank_from_snapshot_at_slot_snapshot_missing_error() { + let ledger_path = PathBuf::from("./tests/fixtures/test-ledger"); + let account_paths = vec![ledger_path.join("accounts/run")]; + let full_snapshots_path = ledger_path.clone(); + let snapshot_slot = 105; + let res = get_bank_from_snapshot_at_slot( + snapshot_slot, + &full_snapshots_path, + &full_snapshots_path, + account_paths, + &ledger_path.as_path(), + ); + assert!(res.is_err()); + let expected_err_str = format!("Missing snapshot at slot {}", snapshot_slot); + assert_eq!(res.err().unwrap().to_string(), expected_err_str); + } + #[test] fn test_get_bank_from_ledger_success() { let operator_address = Pubkey::new_unique(); diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index e6df65da..9a9eb2f4 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -522,7 +522,6 @@ pub fn get_meta_merkle_root( ("state", "merkle_root_file_write", String), ("duration_ms", start.elapsed().as_millis() as i64, i64) ); - // TODO: propogate error return Err(MerkleRootError::MerkleRootGeneratorError( "Failed to write meta merkle tree to file".to_string(), )); diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index b5b27af2..1d1d81de 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -1,17 +1,26 @@ -use std::{path::PathBuf, sync::Arc, time::Duration}; +use std::{ + path::PathBuf, + sync::Arc, + time::{Duration, Instant}, +}; use anyhow::Result; use ellipsis_client::EllipsisClient; use log::{error, info}; use meta_merkle_tree::generated_merkle_tree::{GeneratedMerkleTreeCollection, StakeMetaCollection}; +use solana_metrics::datapoint_error; use solana_rpc_client::nonblocking::rpc_client::RpcClient; -use solana_runtime::bank::Bank; +use solana_runtime::{ + bank::Bank, snapshot_archive_info::SnapshotArchiveInfoGetter, + snapshot_utils::get_full_snapshot_archives, +}; use solana_sdk::{epoch_info::EpochInfo, pubkey::Pubkey}; use tokio::time; use crate::{ backup_snapshots::SnapshotInfo, create_merkle_tree_collection, create_meta_merkle_tree, - create_stake_meta, load_bank_from_snapshot, Cli, OperatorState, PROTOCOL_FEE_BPS, + create_stake_meta, ledger_utils::get_bank_from_snapshot_at_slot, load_bank_from_snapshot, Cli, + OperatorState, PROTOCOL_FEE_BPS, }; const MAX_WAIT_FOR_INCREMENTAL_SNAPSHOT_TICKS: u64 = 1200; // Experimentally determined @@ -129,9 +138,43 @@ pub async fn loop_stages( stage = OperatorState::CreateStakeMeta; } OperatorState::CreateStakeMeta => { - // TODO: Determine if we want to allow operators to start from this stage. - // No matter what a bank has to be loaded from a snapshot, so might as - // well start from load bank + let start = Instant::now(); + if bank.is_none() { + // TODO: REVIEW should we expect snapshots to be in the save path rather than + // the typical validator snapshots path? This would save the fight from the + // validator process removing snapshots. We'd have to also update the snapshot + // process and CLI to handle + + // TODO: DRY up these paths from the Cli arguments (duplicate code in load_bank_from_snapshot) + let ledger_path = cli.ledger_path.clone(); + let account_paths = None; + let account_paths = + account_paths.map_or_else(|| vec![ledger_path.clone()], |paths| paths); + let full_snapshots_path = cli.full_snapshots_path.clone(); + let full_snapshots_path = + full_snapshots_path.map_or(ledger_path.clone(), |path| path); + let maybe_bank = get_bank_from_snapshot_at_slot( + slot_to_process, + &full_snapshots_path, + &full_snapshots_path, + account_paths, + &ledger_path.as_path(), + ); + match maybe_bank { + Ok(some_bank) => bank = Some(Arc::new(some_bank)), + Err(e) => { + datapoint_error!( + "tip_router_cli.create_stake_meta", + ("operator_address", operator_address, String), + ("epoch", epoch_to_process, i64), + ("status", "error", String), + ("error", e.to_string(), String), + ("state", "create_stake_meta", String), + ("duration_ms", start.elapsed().as_millis() as i64, i64) + ); + } + } + } stake_meta_collection = Some(create_stake_meta( operator_address.clone(), epoch_to_process, From d58b148f90f26b8e2a2a1b93e36079a0beb87592 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Wed, 12 Feb 2025 17:59:32 -0500 Subject: [PATCH 086/112] clean up lil bit --- tip-router-operator-cli/src/lib.rs | 2 +- tip-router-operator-cli/src/process_epoch.rs | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index 9a9eb2f4..dc12c184 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -48,7 +48,7 @@ pub enum OperatorState { CreateStakeMeta, CreateMerkleTreeCollection, CreateMetaMerkleTree, - SubmitToNcn, + CastVote, WaitForNextEpoch, } diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index 1d1d81de..50d5e70f 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -10,10 +10,7 @@ use log::{error, info}; use meta_merkle_tree::generated_merkle_tree::{GeneratedMerkleTreeCollection, StakeMetaCollection}; use solana_metrics::datapoint_error; use solana_rpc_client::nonblocking::rpc_client::RpcClient; -use solana_runtime::{ - bank::Bank, snapshot_archive_info::SnapshotArchiveInfoGetter, - snapshot_utils::get_full_snapshot_archives, -}; +use solana_runtime::bank::Bank; use solana_sdk::{epoch_info::EpochInfo, pubkey::Pubkey}; use tokio::time; @@ -172,6 +169,7 @@ pub async fn loop_stages( ("state", "create_stake_meta", String), ("duration_ms", start.elapsed().as_millis() as i64, i64) ); + panic!("{}", e.to_string()); } } } @@ -238,7 +236,7 @@ pub async fn loop_stages( ); stage = OperatorState::WaitForNextEpoch; } - OperatorState::SubmitToNcn => { + OperatorState::CastVote => { // TODO: Determine if this should be a stage given the task that's in a // separate thread } From e7fdd013f9c7f5539c195daf9baefb6987bf40e6 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Wed, 12 Feb 2025 19:55:11 -0500 Subject: [PATCH 087/112] update save file naming and remove unnecessary merkle_root_dir arg in favor of save_path --- .github/workflows/ci.yaml | 2 +- format.sh | 2 +- tip-router-operator-cli/src/claim.rs | 6 +- tip-router-operator-cli/src/cli.rs | 3 - tip-router-operator-cli/src/lib.rs | 248 ++---------------- tip-router-operator-cli/src/main.rs | 4 +- tip-router-operator-cli/src/process_epoch.rs | 12 +- tip-router-operator-cli/src/submit.rs | 5 +- .../tests/integration_tests.rs | 77 +----- 9 files changed, 35 insertions(+), 324 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c3ec4427..227b9fe0 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -178,7 +178,7 @@ jobs: name: jito_tip_router_program.so path: integration_tests/tests/fixtures/ - uses: taiki-e/install-action@nextest - - run: cargo nextest run --all-features -E 'not test(ledger_utils::tests) and not test(test_meta_merkle_creation_from_ledger)' + - run: cargo nextest run --all-features -E 'not test(ledger_utils::tests)' env: SBF_OUT_DIR: ${{ github.workspace }}/integration_tests/tests/fixtures diff --git a/format.sh b/format.sh index 1c71d0eb..298a9d1f 100755 --- a/format.sh +++ b/format.sh @@ -14,7 +14,7 @@ cargo fmt --all print_executing "cargo nextest run --all-features" cargo build-sbf --sbf-out-dir integration_tests/tests/fixtures -SBF_OUT_DIR=integration_tests/tests/fixtures cargo nextest run --all-features -E 'not test(ledger_utils::tests::test_get_bank_from_ledger_success) and not test(test_meta_merkle_creation_from_ledger)' +SBF_OUT_DIR=integration_tests/tests/fixtures cargo nextest run --all-features -E 'not test(ledger_utils::tests::test_get_bank_from_ledger_success)' # Code coverage only runs with flag if [[ "$*" == *"--code-coverage"* ]]; then diff --git a/tip-router-operator-cli/src/claim.rs b/tip-router-operator-cli/src/claim.rs index aed657c5..ae8a7375 100644 --- a/tip-router-operator-cli/src/claim.rs +++ b/tip-router-operator-cli/src/claim.rs @@ -32,6 +32,7 @@ use solana_sdk::{ use thiserror::Error; use crate::{ + merkle_tree_collection_file_name, rpc_utils::{get_batched_accounts, send_until_blockhash_expires}, Cli, }; @@ -77,10 +78,9 @@ pub async fn claim_mev_tips_with_emit( let keypair = read_keypair_file(cli.keypair_path.clone()) .map_err(|e| anyhow::anyhow!("Failed to read keypair file: {:?}", e))?; let keypair = Arc::new(keypair); - let meta_merkle_tree_dir = cli.meta_merkle_tree_dir.clone(); + let meta_merkle_tree_dir = cli.save_path.clone(); let rpc_url = cli.rpc_url.clone(); - let merkle_tree_coll_path = - meta_merkle_tree_dir.join(format!("generated_merkle_tree_{}.json", epoch)); + let merkle_tree_coll_path = meta_merkle_tree_dir.join(merkle_tree_collection_file_name(epoch)); let merkle_tree_coll = GeneratedMerkleTreeCollection::new_from_file(&merkle_tree_coll_path) .map_err(|e| anyhow::anyhow!(e))?; let start = Instant::now(); diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index 5cafae6c..c76d2c4c 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -30,9 +30,6 @@ pub struct Cli { #[arg(short, long, env)] pub snapshot_output_dir: PathBuf, - #[arg(short, long, env)] - pub meta_merkle_tree_dir: PathBuf, - #[arg(long, env, default_value = "false")] pub submit_as_memo: bool, diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index dc12c184..d9f7918d 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -12,8 +12,7 @@ pub mod process_epoch; pub mod rpc_utils; pub mod submit; -use std::fs::{self, File}; -use std::io::{BufWriter, Write}; +use std::fs; use std::path::{Path, PathBuf}; use std::process::Command; use std::sync::Arc; @@ -27,15 +26,14 @@ use jito_tip_payment_sdk::{ TIP_ACCOUNT_SEED_7, }; use ledger_utils::get_bank_from_ledger; -use log::{error, info}; -use meta_merkle_tree::generated_merkle_tree::MerkleRootGeneratorError; +use log::info; use meta_merkle_tree::generated_merkle_tree::StakeMetaCollection; use meta_merkle_tree::{ generated_merkle_tree::GeneratedMerkleTreeCollection, meta_merkle_tree::MetaMerkleTree, }; use solana_metrics::{datapoint_error, datapoint_info}; use solana_runtime::bank::Bank; -use solana_sdk::{account::AccountSharedData, pubkey::Pubkey, slot_history::Slot}; +use solana_sdk::{account::AccountSharedData, pubkey::Pubkey}; use stake_meta_generator::generate_stake_meta_collection; // TODO: Should this be loaded from somewhere? @@ -52,6 +50,18 @@ pub enum OperatorState { WaitForNextEpoch, } +pub fn stake_meta_file_name(epoch: u64) -> String { + format!("{}_stake_meta_collection.json", epoch) +} + +pub fn merkle_tree_collection_file_name(epoch: u64) -> String { + format!("{}_merkle_tree_collection.json", epoch) +} + +pub fn meta_merkle_tree_file_name(epoch: u64) -> String { + format!("{}_meta_merkle_tree.json", epoch) +} + // STAGE 1 LoadBankFromSnapshot pub fn load_bank_from_snapshot(cli: Cli, slot: u64, store_snapshot: bool) -> Arc { let ledger_path = cli.ledger_path.clone(); @@ -118,7 +128,7 @@ pub fn create_stake_meta( if save { // Note: We have the epoch come before the file name so ordering is neat on a machine // with multiple epochs saved. - let file = save_path.join(format!("{}_stake_meta_collection.json", epoch)); + let file = save_path.join(stake_meta_file_name(epoch)); stake_meta_coll.write_to_file(&file); } @@ -189,7 +199,7 @@ pub fn create_merkle_tree_collection( if save { // Note: We have the epoch come before the file name so ordering is neat on a machine // with multiple epochs saved. - let file = save_path.join(format!("{}_merkle_tree_collection.json", epoch)); + let file = save_path.join(merkle_tree_collection_file_name(epoch)); match merkle_tree_coll.write_to_file(&file) { Ok(_) => {} Err(e) => { @@ -253,7 +263,7 @@ pub fn create_meta_merkle_tree( if save { // Note: We have the epoch come before the file name so ordering is neat on a machine // with multiple epochs saved. - let file = save_path.join(format!("{}_meta_merkle_tree.json", epoch)); + let file = save_path.join(meta_merkle_tree_file_name(epoch)); match meta_merkle_tree.write_to_file(&file) { Ok(_) => {} Err(e) => { @@ -323,19 +333,6 @@ fn derive_tip_payment_pubkeys(program_id: &Pubkey) -> TipPaymentPubkeys { } } -fn write_to_json_file( - merkle_tree_coll: &GeneratedMerkleTreeCollection, - file_path: &PathBuf, -) -> std::result::Result<(), MerkleRootGeneratorError> { - let file = File::create(file_path)?; - let mut writer = BufWriter::new(file); - let json = serde_json::to_string_pretty(&merkle_tree_coll).unwrap(); - writer.write_all(json.as_bytes())?; - writer.flush()?; - - Ok(()) -} - /// Convenience wrapper around [TipDistributionAccount] pub struct TipDistributionAccountWrapper { pub tip_distribution_account: TipDistributionAccount, @@ -343,215 +340,6 @@ pub struct TipDistributionAccountWrapper { pub tip_distribution_pubkey: Pubkey, } -#[allow(clippy::too_many_arguments)] -pub fn get_meta_merkle_root( - ledger_path: &Path, - account_paths: Vec, - full_snapshots_path: PathBuf, - incremental_snapshots_path: PathBuf, - desired_slot: &Slot, - tip_distribution_program_id: &Pubkey, - out_path: &str, - tip_payment_program_id: &Pubkey, - tip_router_program_id: &Pubkey, - ncn_address: &Pubkey, - operator_address: &Pubkey, - epoch: u64, - protocol_fee_bps: u64, - snapshots_enabled: bool, - meta_merkle_tree_dir: &Path, -) -> std::result::Result { - let start = Instant::now(); - - datapoint_info!( - "tip_router_cli.get_meta_merkle_root", - ("operator_address", operator_address.to_string(), String), - ("state", "stake_meta_generation", String), - ("step", 1, i64), - ("epoch", epoch, i64), - ("duration_ms", start.elapsed().as_millis() as i64, i64) - ); - - // cleanup tmp files - update with path where stake meta is written - match cleanup_tmp_files(&incremental_snapshots_path) { - Ok(_) => {} - Err(e) => { - datapoint_info!( - "tip_router_cli.get_meta_merkle_root", - ("operator_address", operator_address.to_string(), String), - ("state", "cleanup_tmp_files", String), - ("error", format!("{:?}", e), String), - ("epoch", epoch, i64), - ("duration_ms", start.elapsed().as_millis() as i64, i64) - ); - } - } - - // Get stake meta collection - let stake_meta_collection = stake_meta_generator::generate_stake_meta( - operator_address, - ledger_path, - account_paths, - full_snapshots_path, - incremental_snapshots_path.clone(), - desired_slot, - tip_distribution_program_id, - out_path, - tip_payment_program_id, - snapshots_enabled, - ) - .map_err(|e| { - MerkleRootError::StakeMetaGeneratorError(format!("Failed to generate stake meta: {:?}", e)) - })?; - - info!( - "Created StakeMetaCollection:\n - epoch: {:?}\n - slot: {:?}\n - num stake metas: {:?}\n - bank_hash: {:?}", - stake_meta_collection.epoch, - stake_meta_collection.slot, - stake_meta_collection.stake_metas.len(), - stake_meta_collection.bank_hash - ); - - datapoint_info!( - "tip_router_cli.get_meta_merkle_root", - ("operator_address", operator_address.to_string(), String), - ("state", "generated_merkle_tree_collection", String), - ("step", 2, i64), - ("epoch", epoch, i64), - ("duration_ms", start.elapsed().as_millis() as i64, i64) - ); - - // Cleanup tmp files - match cleanup_tmp_files(&incremental_snapshots_path) { - Ok(_) => {} - Err(e) => { - datapoint_info!( - "tip_router_cli.get_meta_merkle_root", - ("operator_address", operator_address.to_string(), String), - ("state", "cleanup_tmp_files", String), - ("error", format!("{:?}", e), String), - ("epoch", epoch, i64), - ("duration_ms", start.elapsed().as_millis() as i64, i64) - ); - } - } - - // Generate merkle tree collection - let merkle_tree_coll = GeneratedMerkleTreeCollection::new_from_stake_meta_collection( - stake_meta_collection, - ncn_address, - epoch, - protocol_fee_bps, - tip_router_program_id, - ) - .map_err(|_| { - MerkleRootError::MerkleRootGeneratorError( - "Failed to generate merkle tree collection".to_string(), - ) - })?; - - info!( - "Created GeneratedMerkleTreeCollection:\n - epoch: {:?}\n - slot: {:?}\n - num generated merkle trees: {:?}\n - bank_hash: {:?}", - merkle_tree_coll.epoch, - merkle_tree_coll.slot, - merkle_tree_coll.generated_merkle_trees.len(), - merkle_tree_coll.bank_hash - ); - - // Write GeneratedMerkleTreeCollection to file for debugging/verification - let generated_merkle_tree_path = incremental_snapshots_path.join(format!( - "generated_merkle_tree_{}.json", - merkle_tree_coll.epoch - )); - match write_to_json_file(&merkle_tree_coll, &generated_merkle_tree_path) { - Ok(_) => { - info!( - "Wrote GeneratedMerkleTreeCollection to {}", - generated_merkle_tree_path.display() - ); - } - Err(e) => { - error!( - "Failed to write GeneratedMerkleTreeCollection to file {}: {:?}", - generated_merkle_tree_path.display(), - e - ); - } - } - - datapoint_info!( - "tip_router_cli.get_meta_merkle_root", - ("operator_address", operator_address.to_string(), String), - ("state", "meta_merkle_tree_creation", String), - ("step", 3, i64), - ("epoch", epoch, i64), - ("duration_ms", start.elapsed().as_millis() as i64, i64) - ); - - // TODO: Hide this behind a flag when the process gets split up into the various stages and - // checkpoints. - - // Write GeneratedMerkleTreeCollection to disk. Required for Claiming - let merkle_tree_coll_path = - meta_merkle_tree_dir.join(format!("generated_merkle_tree_{}.json", epoch)); - let generated_merkle_tree_col_json = match serde_json::to_string(&merkle_tree_coll) { - Ok(json) => json, - Err(e) => { - datapoint_error!( - "tip_router_cli.process_epoch", - ("operator_address", operator_address.to_string(), String), - ("epoch", epoch, i64), - ("status", "error", String), - ("error", format!("{:?}", e), String), - ("state", "merkle_root_serialization", String), - ("duration_ms", start.elapsed().as_millis() as i64, i64) - ); - return Err(MerkleRootError::MerkleRootGeneratorError( - "Failed to serialize merkle tree collection".to_string(), - )); - } - }; - - if let Err(e) = std::fs::write(merkle_tree_coll_path, generated_merkle_tree_col_json) { - datapoint_error!( - "tip_router_cli.process_epoch", - ("operator_address", operator_address.to_string(), String), - ("epoch", epoch, i64), - ("status", "error", String), - ("error", format!("{:?}", e), String), - ("state", "merkle_root_file_write", String), - ("duration_ms", start.elapsed().as_millis() as i64, i64) - ); - return Err(MerkleRootError::MerkleRootGeneratorError( - "Failed to write meta merkle tree to file".to_string(), - )); - } - - // Convert to MetaMerkleTree - let meta_merkle_tree = MetaMerkleTree::new_from_generated_merkle_tree_collection( - merkle_tree_coll, - ) - .map_err(|e| { - MerkleRootError::MerkleTreeError(format!("Failed to create meta merkle tree: {:?}", e)) - })?; - - info!( - "Created MetaMerkleTree:\n - num nodes: {:?}\n - merkle root: {:?}", - meta_merkle_tree.num_nodes, meta_merkle_tree.merkle_root - ); - - datapoint_info!( - "tip_router_cli.get_meta_merkle_root", - ("operator_address", operator_address.to_string(), String), - ("state", "meta_merkle_tree_creation", String), - ("step", 4, i64), - ("epoch", epoch, i64), - ("duration_ms", start.elapsed().as_millis() as i64, i64) - ); - - Ok(meta_merkle_tree) -} - fn get_validator_cmdline() -> Result { let output = Command::new("pgrep").arg("solana-validator").output()?; diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index db2f3106..3043894e 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -182,8 +182,8 @@ async fn main() -> Result<()> { set_merkle_roots, } => { let meta_merkle_tree_path = PathBuf::from(format!( - "{}/meta_merkle_tree_{}.json", - cli.meta_merkle_tree_dir.display(), + "{}/{}_meta_merkle_tree.json", + cli.save_path.display(), epoch )); info!( diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index 50d5e70f..b3868daa 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -16,8 +16,8 @@ use tokio::time; use crate::{ backup_snapshots::SnapshotInfo, create_merkle_tree_collection, create_meta_merkle_tree, - create_stake_meta, ledger_utils::get_bank_from_snapshot_at_slot, load_bank_from_snapshot, Cli, - OperatorState, PROTOCOL_FEE_BPS, + create_stake_meta, ledger_utils::get_bank_from_snapshot_at_slot, load_bank_from_snapshot, + merkle_tree_collection_file_name, stake_meta_file_name, Cli, OperatorState, PROTOCOL_FEE_BPS, }; const MAX_WAIT_FOR_INCREMENTAL_SNAPSHOT_TICKS: u64 = 1200; // Experimentally determined @@ -191,9 +191,7 @@ pub async fn loop_stages( let some_stake_meta_collection = match stake_meta_collection.to_owned() { Some(collection) => collection, None => { - let file = cli - .save_path - .join(format!("{}_stake_meta_collection.json", epoch_to_process)); + let file = cli.save_path.join(stake_meta_file_name(epoch_to_process)); StakeMetaCollection::new_from_file(&file)? } }; @@ -220,7 +218,7 @@ pub async fn loop_stages( None => { let file = cli .save_path - .join(format!("{}_merkle_tree_collection.json", epoch_to_process)); + .join(merkle_tree_collection_file_name(epoch_to_process)); GeneratedMerkleTreeCollection::new_from_file(&file)? } }; @@ -234,7 +232,7 @@ pub async fn loop_stages( // through files on disk then this needs to be true save_stages, ); - stage = OperatorState::WaitForNextEpoch; + stage = OperatorState::CastVote; } OperatorState::CastVote => { // TODO: Determine if this should be a stage given the task that's in a diff --git a/tip-router-operator-cli/src/submit.rs b/tip-router-operator-cli/src/submit.rs index 88f4e357..0149d04f 100644 --- a/tip-router-operator-cli/src/submit.rs +++ b/tip-router-operator-cli/src/submit.rs @@ -18,6 +18,7 @@ use solana_client::{ use solana_metrics::{datapoint_error, datapoint_info}; use solana_sdk::{pubkey::Pubkey, signature::Keypair}; +use crate::meta_merkle_tree_file_name; use crate::{ tip_router::{cast_vote, get_ncn_config, set_merkle_roots_batched}, Cli, @@ -40,8 +41,8 @@ pub async fn submit_recent_epochs_to_ncn( for i in 0..num_monitored_epochs { let process_epoch = epoch.epoch.checked_sub(i).unwrap(); - let meta_merkle_tree_dir = cli_args.meta_merkle_tree_dir.clone(); - let target_meta_merkle_tree_file = format!("meta_merkle_tree_{}.json", process_epoch); + let meta_merkle_tree_dir = cli_args.save_path.clone(); + let target_meta_merkle_tree_file = meta_merkle_tree_file_name(process_epoch); let target_meta_merkle_tree_path = meta_merkle_tree_dir.join(target_meta_merkle_tree_file); if !target_meta_merkle_tree_path.exists() { continue; diff --git a/tip-router-operator-cli/tests/integration_tests.rs b/tip-router-operator-cli/tests/integration_tests.rs index be898f7e..cc6d5b55 100644 --- a/tip-router-operator-cli/tests/integration_tests.rs +++ b/tip-router-operator-cli/tests/integration_tests.rs @@ -1,7 +1,4 @@ -use std::{ - fs, - path::{Path, PathBuf}, -}; +use std::{fs, path::PathBuf}; use anchor_lang::prelude::AnchorSerialize; use jito_tip_distribution_sdk::jito_tip_distribution::ID as TIP_DISTRIBUTION_ID; @@ -21,7 +18,7 @@ use solana_sdk::{ transaction::Transaction, }; use tempfile::TempDir; -use tip_router_operator_cli::{get_meta_merkle_root, TipAccountConfig}; +use tip_router_operator_cli::TipAccountConfig; #[allow(dead_code)] struct TestContext { @@ -183,76 +180,6 @@ impl TestContext { } } -#[tokio::test] -async fn test_meta_merkle_creation_from_ledger() { - // 1. Setup - create necessary variables/arguments - let ledger_path = Path::new("tests/fixtures/test-ledger"); - let account_paths = vec![ledger_path.join("accounts/run")]; - let full_snapshots_path = PathBuf::from("tests/fixtures/test-ledger"); - let desired_slot = &144; - let tip_distribution_program_id = &TIP_DISTRIBUTION_ID; - let out_path = "tests/fixtures/output.json"; - let tip_payment_program_id = &TIP_PAYMENT_ID; - let ncn_address = Pubkey::new_unique(); - let operator_address = Pubkey::new_unique(); - let epoch = 0u64; - const PROTOCOL_FEE_BPS: u64 = 300; - - // 2. Call the function - let meta_merkle_tree = get_meta_merkle_root( - ledger_path, - account_paths, - full_snapshots_path.clone(), - full_snapshots_path, - desired_slot, - tip_distribution_program_id, - out_path, - tip_payment_program_id, - &jito_tip_router_program::id(), - &ncn_address, - &operator_address, - epoch, - PROTOCOL_FEE_BPS, - false, - &ledger_path.to_path_buf(), - ) - .unwrap(); - - // 3. More comprehensive validations - assert_ne!( - meta_merkle_tree.merkle_root, [0; 32], - "Merkle root should not be zero" - ); - - // Verify structure - assert!( - meta_merkle_tree.num_nodes > 0, - "Should have validator nodes" - ); - - // Verify each node - for node in &meta_merkle_tree.tree_nodes { - // Verify node has required fields - assert_ne!( - node.tip_distribution_account, - Pubkey::default(), - "Node should have valid tip distribution account" - ); - assert!( - node.max_total_claim > 0, - "Node should have positive max claim" - ); - assert!( - node.max_num_nodes > 0, - "Node should have positive max nodes" - ); - assert!(node.proof.is_some(), "Node should have a proof"); - } - - // Verify the proofs are valid - meta_merkle_tree.verify_proof().unwrap(); -} - #[tokio::test] async fn test_merkle_tree_generation() -> Result<(), Box> { // Constants From b8579419a9d4ddb0b4e9852e5983b9bd9ee47b25 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Wed, 12 Feb 2025 20:01:12 -0500 Subject: [PATCH 088/112] handle clippy errors --- tip-router-operator-cli/src/ledger_utils.rs | 5 +++-- tip-router-operator-cli/src/lib.rs | 12 ++++++------ tip-router-operator-cli/src/process_epoch.rs | 11 ++++++----- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index bf33fb86..ae684173 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -42,6 +42,7 @@ pub enum LedgerUtilsError { // TODO: Use Result and propagate errors more gracefully /// Create the Bank for a desired slot for given file paths. +#[allow(clippy::cognitive_complexity)] pub fn get_bank_from_ledger( operator_address: String, ledger_path: &Path, @@ -437,7 +438,7 @@ pub fn get_bank_from_snapshot_at_slot( let (bank, _) = snapshot_bank_utils::bank_from_snapshot_archives( &account_paths, - &bank_snapshots_dir, + bank_snapshots_dir, full_snapshot_archive_info, None, &genesis_config, @@ -454,7 +455,7 @@ pub fn get_bank_from_snapshot_at_slot( exit.clone(), )?; exit.store(true, Ordering::Relaxed); - return Ok(bank); + Ok(bank) } #[cfg(test)] diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index d9f7918d..aeb8b38b 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -72,7 +72,7 @@ pub fn load_bank_from_snapshot(cli: Cli, slot: u64, store_snapshot: bool) -> Arc let account_paths = account_paths.map_or_else(|| vec![ledger_path.clone()], |paths| paths); let full_snapshots_path = full_snapshots_path.map_or(ledger_path, |path| path); - let bank = get_bank_from_ledger( + get_bank_from_ledger( cli.operator_address, &cli.ledger_path, account_paths, @@ -80,8 +80,7 @@ pub fn load_bank_from_snapshot(cli: Cli, slot: u64, store_snapshot: bool) -> Arc incremental_snapshots_path, &slot, store_snapshot, - ); - return bank; + ) } // STAGE 2 CreateStakeMeta @@ -91,7 +90,7 @@ pub fn create_stake_meta( bank: &Arc, tip_distribution_program_id: &Pubkey, tip_payment_program_id: &Pubkey, - save_path: &PathBuf, + save_path: &Path, save: bool, ) -> StakeMetaCollection { let start = Instant::now(); @@ -144,6 +143,7 @@ pub fn create_stake_meta( } // STAGE 3 CreateMerkleTreeCollection +#[allow(clippy::too_many_arguments)] pub fn create_merkle_tree_collection( operator_address: String, tip_router_program_id: &Pubkey, @@ -151,7 +151,7 @@ pub fn create_merkle_tree_collection( epoch: u64, ncn_address: &Pubkey, protocol_fee_bps: u64, - save_path: &PathBuf, + save_path: &Path, save: bool, ) -> GeneratedMerkleTreeCollection { let start = Instant::now(); @@ -233,7 +233,7 @@ pub fn create_meta_merkle_tree( operator_address: String, merkle_tree_collection: GeneratedMerkleTreeCollection, epoch: u64, - save_path: &PathBuf, + save_path: &Path, save: bool, ) -> MetaMerkleTree { let start = Instant::now(); diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index b3868daa..b97920e4 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -96,6 +96,7 @@ pub async fn wait_for_optimal_incremental_snapshot( Ok(()) } +#[allow(clippy::too_many_arguments)] pub async fn loop_stages( rpc_client: EllipsisClient, cli: Cli, @@ -155,7 +156,7 @@ pub async fn loop_stages( &full_snapshots_path, &full_snapshots_path, account_paths, - &ledger_path.as_path(), + ledger_path.as_path(), ); match maybe_bank { Ok(some_bank) => bank = Some(Arc::new(some_bank)), @@ -177,8 +178,8 @@ pub async fn loop_stages( operator_address.clone(), epoch_to_process, bank.as_ref().expect("Bank was not set"), - &tip_distribution_program_id, - &tip_payment_program_id, + tip_distribution_program_id, + tip_payment_program_id, &cli.save_path, save_stages, )); @@ -199,10 +200,10 @@ pub async fn loop_stages( // Generate the merkle tree collection merkle_tree_collection = Some(create_merkle_tree_collection( cli.operator_address.clone(), - &tip_router_program_id, + tip_router_program_id, some_stake_meta_collection, epoch_to_process, - &ncn_address, + ncn_address, PROTOCOL_FEE_BPS, &cli.save_path, save_stages, From f1373aa50d3c49d68a4061ac888b1b30b47561f8 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Thu, 13 Feb 2025 16:43:14 -0500 Subject: [PATCH 089/112] add the CastVote stage to the transition loop --- tip-router-operator-cli/src/main.rs | 6 ++-- tip-router-operator-cli/src/process_epoch.rs | 30 +++++++++++++++++--- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 3043894e..82bf62dd 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -15,7 +15,7 @@ use ::{ cli::{Cli, Commands}, create_merkle_tree_collection, create_meta_merkle_tree, create_stake_meta, ledger_utils::get_bank_from_ledger, - load_bank_from_snapshot, process_epoch, + load_bank_from_snapshot, meta_merkle_tree_file_name, process_epoch, submit::{submit_recent_epochs_to_ncn, submit_to_ncn}, PROTOCOL_FEE_BPS, }, @@ -182,9 +182,9 @@ async fn main() -> Result<()> { set_merkle_roots, } => { let meta_merkle_tree_path = PathBuf::from(format!( - "{}/{}_meta_merkle_tree.json", + "{}/{}", cli.save_path.display(), - epoch + meta_merkle_tree_file_name(epoch) )); info!( "Submitting epoch {} from {}...", diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index b97920e4..924c84d5 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -1,5 +1,6 @@ use std::{ path::PathBuf, + str::FromStr, sync::Arc, time::{Duration, Instant}, }; @@ -11,13 +12,14 @@ use meta_merkle_tree::generated_merkle_tree::{GeneratedMerkleTreeCollection, Sta use solana_metrics::datapoint_error; use solana_rpc_client::nonblocking::rpc_client::RpcClient; use solana_runtime::bank::Bank; -use solana_sdk::{epoch_info::EpochInfo, pubkey::Pubkey}; +use solana_sdk::{epoch_info::EpochInfo, pubkey::Pubkey, signature::read_keypair_file}; use tokio::time; use crate::{ backup_snapshots::SnapshotInfo, create_merkle_tree_collection, create_meta_merkle_tree, create_stake_meta, ledger_utils::get_bank_from_snapshot_at_slot, load_bank_from_snapshot, - merkle_tree_collection_file_name, stake_meta_file_name, Cli, OperatorState, PROTOCOL_FEE_BPS, + merkle_tree_collection_file_name, meta_merkle_tree_file_name, stake_meta_file_name, + submit::submit_to_ncn, Cli, OperatorState, PROTOCOL_FEE_BPS, }; const MAX_WAIT_FOR_INCREMENTAL_SNAPSHOT_TICKS: u64 = 1200; // Experimentally determined @@ -109,6 +111,7 @@ pub async fn loop_stages( enable_snapshots: bool, save_stages: bool, ) -> Result<()> { + let keypair = read_keypair_file(&cli.keypair_path).expect("Failed to read keypair file"); let mut current_epoch_info = rpc_client.get_epoch_info().await?; // Track runs that are starting right at the beginning of a new epoch @@ -236,8 +239,27 @@ pub async fn loop_stages( stage = OperatorState::CastVote; } OperatorState::CastVote => { - // TODO: Determine if this should be a stage given the task that's in a - // separate thread + let meta_merkle_tree_path = PathBuf::from(format!( + "{}/{}", + cli.save_path.display(), + meta_merkle_tree_file_name(epoch_to_process) + )); + let operator_address = Pubkey::from_str(&cli.operator_address)?; + submit_to_ncn( + &rpc_client, + &keypair, + &operator_address, + &meta_merkle_tree_path, + epoch_to_process, + ncn_address, + tip_router_program_id, + tip_distribution_program_id, + cli.submit_as_memo, + // We let the submit task handle setting merkle roots + false, + ) + .await?; + stage = OperatorState::WaitForNextEpoch; } OperatorState::WaitForNextEpoch => { current_epoch_info = From ce294698d5fe0f8665d1a2d9327f0c0fb9044e2b Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Thu, 13 Feb 2025 17:03:25 -0500 Subject: [PATCH 090/112] clean up stuff --- tip-router-operator-cli/src/cli.rs | 22 ++++++++++++ tip-router-operator-cli/src/lib.rs | 16 ++++----- tip-router-operator-cli/src/process_epoch.rs | 37 +++++++++----------- 3 files changed, 47 insertions(+), 28 deletions(-) diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index c76d2c4c..78b09ca4 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -54,6 +54,28 @@ impl Cli { std::fs::create_dir_all(&self.save_path).unwrap(); } } + + pub fn get_snapshot_paths(&self) -> SnapshotPaths { + let ledger_path = self.ledger_path.clone(); + let account_paths = None; + let account_paths = account_paths.map_or_else(|| vec![ledger_path.clone()], |paths| paths); + let full_snapshots_path = self.full_snapshots_path.clone(); + let full_snapshots_path = full_snapshots_path.map_or(ledger_path.clone(), |path| path); + let incremental_snapshots_path = self.backup_snapshots_dir.clone(); + SnapshotPaths { + ledger_path, + account_paths, + full_snapshots_path, + incremental_snapshots_path, + } + } +} + +pub struct SnapshotPaths { + pub ledger_path: PathBuf, + pub account_paths: Vec, + pub full_snapshots_path: PathBuf, + pub incremental_snapshots_path: PathBuf, } #[derive(clap::Subcommand, Clone)] diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index aeb8b38b..d3a4fb09 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -19,6 +19,7 @@ use std::sync::Arc; use std::time::Instant; use anchor_lang::prelude::*; +use cli::SnapshotPaths; use jito_tip_distribution_sdk::TipDistributionAccount; use jito_tip_payment_sdk::{ CONFIG_ACCOUNT_SEED, TIP_ACCOUNT_SEED_0, TIP_ACCOUNT_SEED_1, TIP_ACCOUNT_SEED_2, @@ -64,17 +65,16 @@ pub fn meta_merkle_tree_file_name(epoch: u64) -> String { // STAGE 1 LoadBankFromSnapshot pub fn load_bank_from_snapshot(cli: Cli, slot: u64, store_snapshot: bool) -> Arc { - let ledger_path = cli.ledger_path.clone(); - let account_paths = None; - let full_snapshots_path = cli.full_snapshots_path.clone(); - let incremental_snapshots_path = cli.backup_snapshots_dir.clone(); - - let account_paths = account_paths.map_or_else(|| vec![ledger_path.clone()], |paths| paths); - let full_snapshots_path = full_snapshots_path.map_or(ledger_path, |path| path); + let SnapshotPaths { + ledger_path, + account_paths, + full_snapshots_path, + incremental_snapshots_path, + } = cli.get_snapshot_paths(); get_bank_from_ledger( cli.operator_address, - &cli.ledger_path, + &ledger_path, account_paths, full_snapshots_path, incremental_snapshots_path, diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index 924c84d5..14fb7e89 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -16,10 +16,10 @@ use solana_sdk::{epoch_info::EpochInfo, pubkey::Pubkey, signature::read_keypair_ use tokio::time; use crate::{ - backup_snapshots::SnapshotInfo, create_merkle_tree_collection, create_meta_merkle_tree, - create_stake_meta, ledger_utils::get_bank_from_snapshot_at_slot, load_bank_from_snapshot, - merkle_tree_collection_file_name, meta_merkle_tree_file_name, stake_meta_file_name, - submit::submit_to_ncn, Cli, OperatorState, PROTOCOL_FEE_BPS, + backup_snapshots::SnapshotInfo, cli::SnapshotPaths, create_merkle_tree_collection, + create_meta_merkle_tree, create_stake_meta, ledger_utils::get_bank_from_snapshot_at_slot, + load_bank_from_snapshot, merkle_tree_collection_file_name, meta_merkle_tree_file_name, + stake_meta_file_name, submit::submit_to_ncn, Cli, OperatorState, PROTOCOL_FEE_BPS, }; const MAX_WAIT_FOR_INCREMENTAL_SNAPSHOT_TICKS: u64 = 1200; // Experimentally determined @@ -130,6 +130,10 @@ pub async fn loop_stages( loop { match stage { OperatorState::LoadBankFromSnapshot => { + let incremental_snapshots_path = cli.backup_snapshots_dir.clone(); + wait_for_optimal_incremental_snapshot(incremental_snapshots_path, slot_to_process) + .await?; + bank = Some(load_bank_from_snapshot( cli.clone(), slot_to_process, @@ -145,15 +149,13 @@ pub async fn loop_stages( // the typical validator snapshots path? This would save the fight from the // validator process removing snapshots. We'd have to also update the snapshot // process and CLI to handle + let SnapshotPaths { + ledger_path, + account_paths, + full_snapshots_path, + incremental_snapshots_path: _, + } = cli.get_snapshot_paths(); - // TODO: DRY up these paths from the Cli arguments (duplicate code in load_bank_from_snapshot) - let ledger_path = cli.ledger_path.clone(); - let account_paths = None; - let account_paths = - account_paths.map_or_else(|| vec![ledger_path.clone()], |paths| paths); - let full_snapshots_path = cli.full_snapshots_path.clone(); - let full_snapshots_path = - full_snapshots_path.map_or(ledger_path.clone(), |path| path); let maybe_bank = get_bank_from_snapshot_at_slot( slot_to_process, &full_snapshots_path, @@ -232,9 +234,9 @@ pub async fn loop_stages( some_merkle_tree_collection, epoch_to_process, &cli.save_path, - // TODO: If we keep the separate thread for handling NCN submission - // through files on disk then this needs to be true - save_stages, + // This is defaulted to true because the output file is required by the + // task that sets TipDistributionAccounts' merkle roots + true, ); stage = OperatorState::CastVote; } @@ -276,11 +278,6 @@ pub async fn loop_stages( slot_to_process = previous_epoch_slot; epoch_to_process = previous_epoch; - // TODO: When we start with wait for the next epoch, should we always wait - // for the optimal snapshot? - let incremental_snapshots_path = cli.backup_snapshots_dir.clone(); - wait_for_optimal_incremental_snapshot(incremental_snapshots_path, slot_to_process) - .await?; stage = OperatorState::LoadBankFromSnapshot; } } From a4541645a637b07dae43f04e27799d664ce23ed9 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Sat, 15 Feb 2025 07:58:14 -0500 Subject: [PATCH 091/112] update some stuff on review --- tip-router-operator-cli/src/cli.rs | 2 +- tip-router-operator-cli/src/ledger_utils.rs | 2 ++ tip-router-operator-cli/src/main.rs | 39 ++++++++++++++------- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index 78b09ca4..41e3ca37 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -81,7 +81,7 @@ pub struct SnapshotPaths { #[derive(clap::Subcommand, Clone)] pub enum Commands { Run { - #[arg(short, long, env, env)] + #[arg(short, long, env)] ncn_address: Pubkey, #[arg(long, env)] diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index ae684173..dfb1b2c4 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -412,6 +412,8 @@ pub fn get_bank_from_ledger( working_bank } +/// Loads the bank from the snapshot at the exact slot. If the snapshot doesn't exist, result is +/// an error. pub fn get_bank_from_snapshot_at_slot( snapshot_slot: u64, full_snapshots_path: &PathBuf, diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 82bf62dd..05855a58 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -12,9 +12,9 @@ use ::{ tip_router_operator_cli::{ backup_snapshots::BackupSnapshotMonitor, claim::claim_mev_tips_with_emit, - cli::{Cli, Commands}, + cli::{Cli, Commands, SnapshotPaths}, create_merkle_tree_collection, create_meta_merkle_tree, create_stake_meta, - ledger_utils::get_bank_from_ledger, + ledger_utils::get_bank_from_snapshot_at_slot, load_bank_from_snapshot, meta_merkle_tree_file_name, process_epoch, submit::{submit_recent_epochs_to_ncn, submit_to_ncn}, PROTOCOL_FEE_BPS, @@ -70,6 +70,17 @@ async fn main() -> Result<()> { claim_tips, } => { info!("Running Tip Router..."); + info!("NCN Address: {}", ncn_address); + info!( + "Tip Distribution Program ID: {}", + tip_distribution_program_id + ); + info!("Tip Payment Program ID: {}", tip_payment_program_id); + info!("Tip Router Program ID: {}", tip_router_program_id); + info!("Enable Snapshots: {}", enable_snapshots); + info!("Num Monitored Epochs: {}", num_monitored_epochs); + info!("Override Target Slot: {:?}", override_target_slot); + info!("Submit as Memo: {}", cli.submit_as_memo); info!("starting stage: {:?}", starting_stage); let rpc_client_clone = rpc_client.clone(); @@ -231,21 +242,25 @@ async fn main() -> Result<()> { tip_payment_program_id, save, } => { - let account_paths = vec![cli.ledger_path.clone()]; - let bank = get_bank_from_ledger( - cli.operator_address.clone(), - &cli.ledger_path, + let SnapshotPaths { + ledger_path, account_paths, - cli.full_snapshots_path.unwrap(), - cli.backup_snapshots_dir, - &slot, - false, - ); + full_snapshots_path, + incremental_snapshots_path: _, + } = cli.get_snapshot_paths(); + + let bank = get_bank_from_snapshot_at_slot( + slot, + &full_snapshots_path, + &full_snapshots_path, + account_paths, + ledger_path.as_path(), + )?; create_stake_meta( cli.operator_address, epoch, - &bank, + &Arc::new(bank), &tip_distribution_program_id, &tip_payment_program_id, &cli.save_path, From 1e221553ad1edae6adfc1e439e3a1c1e94d90996 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Mon, 17 Feb 2025 14:26:06 -0500 Subject: [PATCH 092/112] fix command file path bugs --- tip-router-operator-cli/src/main.rs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 05855a58..08cdaf6a 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -15,7 +15,8 @@ use ::{ cli::{Cli, Commands, SnapshotPaths}, create_merkle_tree_collection, create_meta_merkle_tree, create_stake_meta, ledger_utils::get_bank_from_snapshot_at_slot, - load_bank_from_snapshot, meta_merkle_tree_file_name, process_epoch, + load_bank_from_snapshot, merkle_tree_collection_file_name, meta_merkle_tree_file_name, + process_epoch, stake_meta_file_name, submit::{submit_recent_epochs_to_ncn, submit_to_ncn}, PROTOCOL_FEE_BPS, }, @@ -274,7 +275,9 @@ async fn main() -> Result<()> { save, } => { // Load the stake_meta_collection from disk - let stake_meta_collection = match StakeMetaCollection::new_from_file(&cli.save_path) { + let stake_meta_collection = match StakeMetaCollection::new_from_file( + &cli.save_path.join(stake_meta_file_name(epoch)), + ) { Ok(stake_meta_collection) => stake_meta_collection, Err(e) => panic!("{}", e), // TODO: should datapoint error be emitted here? }; @@ -293,11 +296,12 @@ async fn main() -> Result<()> { } Commands::CreateMetaMerkleTree { epoch, save } => { // Load the stake_meta_collection from disk - let merkle_tree_collection = - match GeneratedMerkleTreeCollection::new_from_file(&cli.save_path) { - Ok(merkle_tree_collection) => merkle_tree_collection, - Err(e) => panic!("{}", e), // TODO: should datapoint error be emitted here? - }; + let merkle_tree_collection = match GeneratedMerkleTreeCollection::new_from_file( + &cli.save_path.join(merkle_tree_collection_file_name(epoch)), + ) { + Ok(merkle_tree_collection) => merkle_tree_collection, + Err(e) => panic!("{}", e), // TODO: should datapoint error be emitted here? + }; create_meta_merkle_tree( cli.operator_address, From 6119999178758796f6d9e9a25e35a72aa65cb1bb Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Mon, 17 Feb 2025 14:59:12 -0500 Subject: [PATCH 093/112] minor tweaks --- tip-router-operator-cli/src/main.rs | 8 ++------ tip-router-operator-cli/src/submit.rs | 8 ++++++++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 08cdaf6a..9f2a7820 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -8,7 +8,7 @@ use ::{ solana_metrics::set_host_id, solana_rpc_client::nonblocking::rpc_client::RpcClient, solana_sdk::{pubkey::Pubkey, signer::keypair::read_keypair_file}, - std::{path::PathBuf, str::FromStr, sync::Arc, time::Duration}, + std::{str::FromStr, sync::Arc, time::Duration}, tip_router_operator_cli::{ backup_snapshots::BackupSnapshotMonitor, claim::claim_mev_tips_with_emit, @@ -193,11 +193,7 @@ async fn main() -> Result<()> { epoch, set_merkle_roots, } => { - let meta_merkle_tree_path = PathBuf::from(format!( - "{}/{}", - cli.save_path.display(), - meta_merkle_tree_file_name(epoch) - )); + let meta_merkle_tree_path = cli.save_path.join(meta_merkle_tree_file_name(epoch)); info!( "Submitting epoch {} from {}...", epoch, diff --git a/tip-router-operator-cli/src/submit.rs b/tip-router-operator-cli/src/submit.rs index 0149d04f..f8670f78 100644 --- a/tip-router-operator-cli/src/submit.rs +++ b/tip-router-operator-cli/src/submit.rs @@ -137,6 +137,14 @@ pub async fn submit_to_ncn( None => true, }; + info!( + "Determining if operator needs to vote...\n\ + should_cast_vote: {}\n\ + is_voting_valid: {} + ", + should_cast_vote, is_voting_valid + ); + if should_cast_vote && is_voting_valid { let res = cast_vote( client, From f5acc56703b98bf9c6433300135d4b601d7d24d2 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Tue, 25 Feb 2025 13:50:38 -0500 Subject: [PATCH 094/112] make sure backup_snapshots_dir is different from full_snapshots_path --- tip-router-operator-cli/src/cli.rs | 8 ++++++++ tip-router-operator-cli/src/main.rs | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index 41e3ca37..2b124792 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -69,6 +69,14 @@ impl Cli { incremental_snapshots_path, } } + + pub fn force_different_backup_snapshot_dir(&self) { + let snapshot_paths = self.get_snapshot_paths(); + assert_ne!( + snapshot_paths.full_snapshots_path, + snapshot_paths.incremental_snapshots_path + ); + } } pub struct SnapshotPaths { diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 9f2a7820..73629b2a 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -27,6 +27,10 @@ use ::{ async fn main() -> Result<()> { env_logger::init(); let cli = Cli::parse(); + + // Ensure backup directory and + cli.force_different_backup_snapshot_dir(); + let keypair = read_keypair_file(&cli.keypair_path).expect("Failed to read keypair file"); let rpc_client = EllipsisClient::from_rpc_with_timeout( RpcClient::new(cli.rpc_url.clone()), From f300fe19d797b55e9bc378150323a9ca8e79058a Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Thu, 27 Feb 2025 20:40:20 -0500 Subject: [PATCH 095/112] add meta-merkle-tree-dir as save_path alias --- tip-router-operator-cli/src/cli.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index 2b124792..1566fa20 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -37,7 +37,7 @@ pub struct Cli { #[arg(long, env, default_value_t = 1)] pub micro_lamports: u64, - #[arg(long, env)] + #[arg(long, env, alias = "meta-merkle-tree-dir", help = "Path to save data (formerly meta-merkle-tree-dir)")] pub save_path: PathBuf, #[command(subcommand)] From ecdab29af5554748625689c6a44b311e264f9f09 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Thu, 27 Feb 2025 21:02:20 -0500 Subject: [PATCH 096/112] load fees from NCN config --- tip-router-operator-cli/src/cli.rs | 7 ++++++- tip-router-operator-cli/src/lib.rs | 3 --- tip-router-operator-cli/src/main.rs | 6 ++++-- tip-router-operator-cli/src/process_epoch.rs | 7 +++++-- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index 1566fa20..b6971147 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -37,7 +37,12 @@ pub struct Cli { #[arg(long, env, default_value_t = 1)] pub micro_lamports: u64, - #[arg(long, env, alias = "meta-merkle-tree-dir", help = "Path to save data (formerly meta-merkle-tree-dir)")] + #[arg( + long, + env, + alias = "meta-merkle-tree-dir", + help = "Path to save data (formerly meta-merkle-tree-dir)" + )] pub save_path: PathBuf, #[command(subcommand)] diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index d3a4fb09..acc90fef 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -37,9 +37,6 @@ use solana_runtime::bank::Bank; use solana_sdk::{account::AccountSharedData, pubkey::Pubkey}; use stake_meta_generator::generate_stake_meta_collection; -// TODO: Should this be loaded from somewhere? -pub const PROTOCOL_FEE_BPS: u64 = 300; - #[derive(clap::ValueEnum, Clone, Copy, Debug)] pub enum OperatorState { // Allows the operator to load from a snapshot created externally diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 73629b2a..887e640b 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -18,7 +18,7 @@ use ::{ load_bank_from_snapshot, merkle_tree_collection_file_name, meta_merkle_tree_file_name, process_epoch, stake_meta_file_name, submit::{submit_recent_epochs_to_ncn, submit_to_ncn}, - PROTOCOL_FEE_BPS, + tip_router::get_ncn_config, }, tokio::time::sleep, }; @@ -281,6 +281,8 @@ async fn main() -> Result<()> { Ok(stake_meta_collection) => stake_meta_collection, Err(e) => panic!("{}", e), // TODO: should datapoint error be emitted here? }; + let config = get_ncn_config(&rpc_client, &tip_router_program_id, &ncn_address).await?; + let current_fees = config.fee_config.current_fees(epoch); // Generate the merkle tree collection create_merkle_tree_collection( @@ -289,7 +291,7 @@ async fn main() -> Result<()> { stake_meta_collection, epoch, &ncn_address, - PROTOCOL_FEE_BPS, + current_fees.total_fees_bps()?, &cli.save_path, save, ); diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index 14fb7e89..ada792ba 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -19,7 +19,7 @@ use crate::{ backup_snapshots::SnapshotInfo, cli::SnapshotPaths, create_merkle_tree_collection, create_meta_merkle_tree, create_stake_meta, ledger_utils::get_bank_from_snapshot_at_slot, load_bank_from_snapshot, merkle_tree_collection_file_name, meta_merkle_tree_file_name, - stake_meta_file_name, submit::submit_to_ncn, Cli, OperatorState, PROTOCOL_FEE_BPS, + stake_meta_file_name, submit::submit_to_ncn, tip_router::get_ncn_config, Cli, OperatorState, }; const MAX_WAIT_FOR_INCREMENTAL_SNAPSHOT_TICKS: u64 = 1200; // Experimentally determined @@ -201,6 +201,9 @@ pub async fn loop_stages( StakeMetaCollection::new_from_file(&file)? } }; + let config = + get_ncn_config(&rpc_client, tip_router_program_id, ncn_address).await?; + let current_fees = config.fee_config.current_fees(epoch_to_process); // Generate the merkle tree collection merkle_tree_collection = Some(create_merkle_tree_collection( @@ -209,7 +212,7 @@ pub async fn loop_stages( some_stake_meta_collection, epoch_to_process, ncn_address, - PROTOCOL_FEE_BPS, + current_fees.total_fees_bps()?, &cli.save_path, save_stages, )); From d0e3ebcef22fc5b520ca06199e7dab6da4b9f338 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Fri, 28 Feb 2025 15:16:23 -0500 Subject: [PATCH 097/112] change enable-snapshots to save-snapshot --- tip-router-operator-cli/src/cli.rs | 12 +++++++++--- tip-router-operator-cli/src/main.rs | 6 +++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index b6971147..79e6b7db 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -106,9 +106,6 @@ pub enum Commands { #[arg(long, env)] tip_router_program_id: Pubkey, - #[arg(long, env, default_value = "false")] - enable_snapshots: bool, - #[arg(long, env, default_value = "3")] num_monitored_epochs: u64, @@ -126,6 +123,15 @@ pub enum Commands { #[arg(long, env, default_value = "true")] save_stages: bool, + + #[arg( + long, + env, + alias = "enable-snapshots", + help = "Flag to enable storing created snapshots (formerly enable-snapshots)", + default_value = "false" + )] + save_snapshot: bool, }, SnapshotSlot { #[arg(long, env)] diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 887e640b..5c1436d7 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -66,7 +66,7 @@ async fn main() -> Result<()> { tip_distribution_program_id, tip_payment_program_id, tip_router_program_id, - enable_snapshots, + save_snapshot, num_monitored_epochs, override_target_slot, starting_stage, @@ -82,7 +82,7 @@ async fn main() -> Result<()> { ); info!("Tip Payment Program ID: {}", tip_payment_program_id); info!("Tip Router Program ID: {}", tip_router_program_id); - info!("Enable Snapshots: {}", enable_snapshots); + info!("Save Snapshots: {}", save_snapshot); info!("Num Monitored Epochs: {}", num_monitored_epochs); info!("Override Target Slot: {:?}", override_target_slot); info!("Submit as Memo: {}", cli.submit_as_memo); @@ -180,7 +180,7 @@ async fn main() -> Result<()> { &tip_distribution_program_id, &tip_payment_program_id, &ncn_address, - enable_snapshots, + save_snapshot, save_stages, ) .await?; From 336e47cf14268d9fa2bc98d91aa7766cfab0f1bc Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Fri, 28 Feb 2025 16:36:18 -0500 Subject: [PATCH 098/112] stop fighting the validators snapshot directory --- tip-router-operator-cli/src/cli.rs | 5 +- tip-router-operator-cli/src/ledger_utils.rs | 12 ++-- tip-router-operator-cli/src/lib.rs | 10 +-- tip-router-operator-cli/src/main.rs | 10 ++- tip-router-operator-cli/src/process_epoch.rs | 14 ++-- .../src/stake_meta_generator.rs | 71 +------------------ 6 files changed, 33 insertions(+), 89 deletions(-) diff --git a/tip-router-operator-cli/src/cli.rs b/tip-router-operator-cli/src/cli.rs index 79e6b7db..c6af54f7 100644 --- a/tip-router-operator-cli/src/cli.rs +++ b/tip-router-operator-cli/src/cli.rs @@ -72,6 +72,7 @@ impl Cli { account_paths, full_snapshots_path, incremental_snapshots_path, + backup_snapshots_dir: self.backup_snapshots_dir.clone(), } } @@ -79,7 +80,7 @@ impl Cli { let snapshot_paths = self.get_snapshot_paths(); assert_ne!( snapshot_paths.full_snapshots_path, - snapshot_paths.incremental_snapshots_path + snapshot_paths.backup_snapshots_dir ); } } @@ -89,6 +90,8 @@ pub struct SnapshotPaths { pub account_paths: Vec, pub full_snapshots_path: PathBuf, pub incremental_snapshots_path: PathBuf, + /// Used when storing or loading snapshots that the operator CLI is workign with + pub backup_snapshots_dir: PathBuf, } #[derive(clap::Subcommand, Clone)] diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index dfb1b2c4..f84b0f59 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -42,7 +42,7 @@ pub enum LedgerUtilsError { // TODO: Use Result and propagate errors more gracefully /// Create the Bank for a desired slot for given file paths. -#[allow(clippy::cognitive_complexity)] +#[allow(clippy::cognitive_complexity, clippy::too_many_arguments)] pub fn get_bank_from_ledger( operator_address: String, ledger_path: &Path, @@ -50,7 +50,8 @@ pub fn get_bank_from_ledger( full_snapshots_path: PathBuf, incremental_snapshots_path: PathBuf, desired_slot: &Slot, - take_snapshot: bool, + save_snapshot: bool, + snapshot_save_path: PathBuf, ) -> Arc { let start_time = Instant::now(); @@ -361,12 +362,14 @@ pub fn get_bank_from_ledger( exit.store(true, Ordering::Relaxed); - if take_snapshot { + if save_snapshot { let full_snapshot_archive_info = match snapshot_bank_utils::bank_to_full_snapshot_archive( ledger_path, &working_bank, Some(SnapshotVersion::default()), - snapshot_config.full_snapshot_archives_dir, + // Use the snapshot_save_path path so the snapshot is stored in a directory different + // than the node's primary snapshot directory + snapshot_save_path, snapshot_config.incremental_snapshot_archives_dir, snapshot_config.archive_format, ) { @@ -518,6 +521,7 @@ mod tests { full_snapshots_path.clone(), &desired_slot, true, + full_snapshots_path.clone(), ); assert_eq!(res.slot(), desired_slot); // Assert that the snapshot was created diff --git a/tip-router-operator-cli/src/lib.rs b/tip-router-operator-cli/src/lib.rs index acc90fef..965375cb 100644 --- a/tip-router-operator-cli/src/lib.rs +++ b/tip-router-operator-cli/src/lib.rs @@ -61,12 +61,13 @@ pub fn meta_merkle_tree_file_name(epoch: u64) -> String { } // STAGE 1 LoadBankFromSnapshot -pub fn load_bank_from_snapshot(cli: Cli, slot: u64, store_snapshot: bool) -> Arc { +pub fn load_bank_from_snapshot(cli: Cli, slot: u64, save_snapshot: bool) -> Arc { let SnapshotPaths { ledger_path, account_paths, full_snapshots_path, - incremental_snapshots_path, + incremental_snapshots_path: _, + backup_snapshots_dir, } = cli.get_snapshot_paths(); get_bank_from_ledger( @@ -74,9 +75,10 @@ pub fn load_bank_from_snapshot(cli: Cli, slot: u64, store_snapshot: bool) -> Arc &ledger_path, account_paths, full_snapshots_path, - incremental_snapshots_path, + backup_snapshots_dir.clone(), &slot, - store_snapshot, + save_snapshot, + backup_snapshots_dir, ) } diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 5c1436d7..d26c56ae 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -246,14 +246,18 @@ async fn main() -> Result<()> { let SnapshotPaths { ledger_path, account_paths, - full_snapshots_path, + full_snapshots_path: _, incremental_snapshots_path: _, + backup_snapshots_dir, } = cli.get_snapshot_paths(); + // We can safely expect to use the backup_snapshots_dir as the full snapshot path because + // _get_bank_from_snapshot_at_slot_ expects the snapshot at the exact `slot` to have + // already been taken. let bank = get_bank_from_snapshot_at_slot( slot, - &full_snapshots_path, - &full_snapshots_path, + &backup_snapshots_dir, + &backup_snapshots_dir, account_paths, ledger_path.as_path(), )?; diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index ada792ba..1b25b284 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -145,21 +145,21 @@ pub async fn loop_stages( OperatorState::CreateStakeMeta => { let start = Instant::now(); if bank.is_none() { - // TODO: REVIEW should we expect snapshots to be in the save path rather than - // the typical validator snapshots path? This would save the fight from the - // validator process removing snapshots. We'd have to also update the snapshot - // process and CLI to handle let SnapshotPaths { ledger_path, account_paths, - full_snapshots_path, + full_snapshots_path: _, incremental_snapshots_path: _, + backup_snapshots_dir, } = cli.get_snapshot_paths(); + // We can safely expect to use the backup_snapshots_dir as the full snapshot path because + // _get_bank_from_snapshot_at_slot_ expects the snapshot at the exact `slot` to have + // already been taken. let maybe_bank = get_bank_from_snapshot_at_slot( slot_to_process, - &full_snapshots_path, - &full_snapshots_path, + &backup_snapshots_dir, + &backup_snapshots_dir, account_paths, ledger_path.as_path(), ); diff --git a/tip-router-operator-cli/src/stake_meta_generator.rs b/tip-router-operator-cli/src/stake_meta_generator.rs index 9a857022..46e8bcd7 100644 --- a/tip-router-operator-cli/src/stake_meta_generator.rs +++ b/tip-router-operator-cli/src/stake_meta_generator.rs @@ -2,7 +2,6 @@ use std::{ collections::HashMap, fmt::{Debug, Display, Formatter}, mem::size_of, - path::{Path, PathBuf}, sync::Arc, }; @@ -20,20 +19,16 @@ use solana_ledger::{ bank_forks_utils::BankForksUtilsError, blockstore::BlockstoreError, blockstore_processor::BlockstoreProcessorError, }; -use solana_metrics::datapoint_error; use solana_program::{stake_history::StakeHistory, sysvar}; use solana_runtime::{bank::Bank, stakes::StakeAccount}; use solana_sdk::{ account::{from_account, ReadableAccount, WritableAccount}, - clock::Slot, pubkey::Pubkey, }; use solana_vote::vote_account::VoteAccount; use thiserror::Error; -use crate::{ - derive_tip_payment_pubkeys, ledger_utils::get_bank_from_ledger, TipDistributionAccountWrapper, -}; +use crate::{derive_tip_payment_pubkeys, TipDistributionAccountWrapper}; #[derive(Error, Debug)] pub enum StakeMetaGeneratorError { @@ -72,70 +67,6 @@ impl Display for StakeMetaGeneratorError { } } -/// Creates a bank from the paths at the desired slot and generates the StakeMetaCollection for -/// that slot. Optionally writing the result as JSON file to disk. -#[allow(clippy::too_many_arguments)] -pub fn generate_stake_meta( - operator_address: &Pubkey, - ledger_path: &Path, - account_paths: Vec, - full_snapshots_path: PathBuf, - incremental_snapshots_path: PathBuf, - desired_slot: &Slot, - tip_distribution_program_id: &Pubkey, - _out_path: &str, - tip_payment_program_id: &Pubkey, - snapshots_enabled: bool, -) -> Result { - info!("Creating bank from ledger path..."); - let res = std::panic::catch_unwind(|| { - get_bank_from_ledger( - operator_address.to_string(), - ledger_path, - account_paths, - full_snapshots_path, - incremental_snapshots_path, - desired_slot, - snapshots_enabled, - ) - }); - let bank = match res { - Ok(bank) => bank, - Err(e) => { - #[allow(clippy::option_if_let_else)] - let error_str = if let Some(s) = e.downcast_ref::() { - s.to_string() - } else if let Some(s) = e.downcast_ref::<&'static str>() { - s.to_string() - } else { - // If we can't get a string, try to get any Debug implementation - match e.downcast_ref::>() { - Some(debug_val) => format!("{:?}", debug_val), - None => "Unknown panic payload".to_string(), - } - }; - error!("Panicked while creating bank from ledger: {}", error_str); - datapoint_error!( - "tip_router_cli.get_bank", - ("operator", operator_address.to_string(), String), - ("status", "error", String), - ("state", "get_bank_from_ledger", String), - ("error", error_str, String), - ); - return Err(StakeMetaGeneratorError::PanicError(error_str)); - } - }; - - info!("Generating stake_meta_collection object..."); - let stake_meta_coll = - generate_stake_meta_collection(&bank, tip_distribution_program_id, tip_payment_program_id)?; - - // Explicity drop to clean up disk space - drop(bank); - - Ok(stake_meta_coll) -} - fn tip_distribution_account_from_tda_wrapper( tda_wrapper: TipDistributionAccountWrapper, // The amount that will be left remaining in the tda to maintain rent exemption status. From e694fcc657dbcb3f0b426721f888c23f9d7d824b Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Fri, 28 Feb 2025 17:07:57 -0500 Subject: [PATCH 099/112] assert monitored epochs > 0; evict full snapshots from backup dir --- .../src/backup_snapshots.rs | 55 ++++++++++++------- tip-router-operator-cli/src/ledger_utils.rs | 2 +- tip-router-operator-cli/src/main.rs | 5 ++ 3 files changed, 41 insertions(+), 21 deletions(-) diff --git a/tip-router-operator-cli/src/backup_snapshots.rs b/tip-router-operator-cli/src/backup_snapshots.rs index bb37efb7..78e5c005 100644 --- a/tip-router-operator-cli/src/backup_snapshots.rs +++ b/tip-router-operator-cli/src/backup_snapshots.rs @@ -14,7 +14,7 @@ const MAXIMUM_BACKUP_INCREMENTAL_SNAPSHOTS_PER_EPOCH: usize = 3; #[derive(Debug)] pub struct SnapshotInfo { path: PathBuf, - _start_slot: u64, + _start_slot: Option, pub end_slot: u64, } @@ -23,27 +23,33 @@ impl SnapshotInfo { pub fn from_path(path: PathBuf) -> Option { let file_name = path.file_name()?.to_str()?; - // Only try to parse if it's an incremental snapshot - if !file_name.starts_with("incremental-snapshot-") { - return None; - } - // Split on hyphens and take the slot numbers - // Format: incremental-snapshot---.tar.zst let parts: Vec<&str> = file_name.split('-').collect(); - if parts.len() < 5 { - return None; + if parts.len() == 5 { + // incremental snapshot + // Format: incremental-snapshot---.tar.zst + // Parse start and end slots + let start_slot: u64 = parts[2].parse().ok()?; + let end_slot = parts[3].parse().ok()?; + + Some(Self { + path, + _start_slot: Some(start_slot), + end_slot, + }) + } else if parts.len() == 3 { + // Full snapshot + // Format: snapshot--.tar.zst + let end_slot = parts[1].parse().ok()?; + + Some(Self { + path, + _start_slot: None, + end_slot, + }) + } else { + None } - - // Parse start and end slots - let start_slot = parts[2].parse().ok()?; - let end_slot = parts[3].parse().ok()?; - - Some(Self { - path, - _start_slot: start_slot, - end_slot, - }) } } @@ -311,10 +317,19 @@ mod tests { .join("incremental-snapshot-100-150-hash1.tar.zst"); let info = SnapshotInfo::from_path(path.clone()).unwrap(); - assert_eq!(info._start_slot, 100); + assert_eq!(info._start_slot.unwrap(), 100); assert_eq!(info.end_slot, 150); assert_eq!(info.path, path); + // Full snapshot + let temp_dir = TempDir::new().unwrap(); + let path = temp_dir.path().join("snapshot-323710005-hash.tar.zst"); + + let info = SnapshotInfo::from_path(path.clone()).unwrap(); + assert_eq!(info._start_slot, None); + assert_eq!(info.end_slot, 323710005); + assert_eq!(info.path, path); + // Test invalid cases assert!(SnapshotInfo::from_path(temp_dir.path().join("not-a-snapshot.txt")).is_none()); assert!( diff --git a/tip-router-operator-cli/src/ledger_utils.rs b/tip-router-operator-cli/src/ledger_utils.rs index f84b0f59..b1df306b 100644 --- a/tip-router-operator-cli/src/ledger_utils.rs +++ b/tip-router-operator-cli/src/ledger_utils.rs @@ -367,7 +367,7 @@ pub fn get_bank_from_ledger( ledger_path, &working_bank, Some(SnapshotVersion::default()), - // Use the snapshot_save_path path so the snapshot is stored in a directory different + // Use the snapshot_save_path path so the snapshot is stored in a directory different // than the node's primary snapshot directory snapshot_save_path, snapshot_config.incremental_snapshot_archives_dir, diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index d26c56ae..67b3ad21 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -74,6 +74,11 @@ async fn main() -> Result<()> { set_merkle_roots, claim_tips, } => { + assert!( + num_monitored_epochs > 0, + "num-monitored-epochs must be greater than 0" + ); + info!("Running Tip Router..."); info!("NCN Address: {}", ncn_address); info!( From 8941a2939c8db390ffa20d28e5b63f9b291287bb Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Fri, 28 Feb 2025 19:10:29 -0500 Subject: [PATCH 100/112] evict saved TipRouter files when epoch changes --- .../src/backup_snapshots.rs | 130 +++++++++++++++++- tip-router-operator-cli/src/main.rs | 4 + 2 files changed, 133 insertions(+), 1 deletion(-) diff --git a/tip-router-operator-cli/src/backup_snapshots.rs b/tip-router-operator-cli/src/backup_snapshots.rs index 78e5c005..6d0cbbf5 100644 --- a/tip-router-operator-cli/src/backup_snapshots.rs +++ b/tip-router-operator-cli/src/backup_snapshots.rs @@ -7,6 +7,7 @@ use std::time::Duration; use tokio::time; use crate::process_epoch::get_previous_epoch_last_slot; +use crate::{merkle_tree_collection_file_name, meta_merkle_tree_file_name, stake_meta_file_name}; const MAXIMUM_BACKUP_INCREMENTAL_SNAPSHOTS_PER_EPOCH: usize = 3; @@ -53,11 +54,47 @@ impl SnapshotInfo { } } +/// Represents a parsed incremental snapshot filename +#[derive(Debug)] +pub struct SavedTipRouterFile { + path: PathBuf, + epoch: u64, +} + +impl SavedTipRouterFile { + /// Try to parse a TipRouter saved filename with epoch information + pub fn from_path(path: PathBuf) -> Option { + let file_name = path.file_name()?.to_str()?; + println!("file {}", file_name); + + // Split on underscore to get epoch + let parts: Vec<&str> = file_name.split('_').collect(); + let epoch: u64 = parts[0].parse().ok()?; + println!("epoch {}", epoch); + + let is_tip_router_file = [ + stake_meta_file_name(epoch), + merkle_tree_collection_file_name(epoch), + meta_merkle_tree_file_name(epoch), + ] + .iter() + .any(|x| *x == file_name); + println!("is_tip_router_file {}", is_tip_router_file); + if is_tip_router_file { + Some(Self { path, epoch }) + } else { + None + } + } +} + pub struct BackupSnapshotMonitor { rpc_client: RpcClient, snapshots_dir: PathBuf, backup_dir: PathBuf, override_target_slot: Option, + save_path: PathBuf, + num_monitored_epochs: u64, } impl BackupSnapshotMonitor { @@ -66,12 +103,16 @@ impl BackupSnapshotMonitor { snapshots_dir: PathBuf, backup_dir: PathBuf, override_target_slot: Option, + save_path: PathBuf, + num_monitored_epochs: u64, ) -> Self { Self { rpc_client: RpcClient::new(rpc_url.to_string()), snapshots_dir, backup_dir, override_target_slot, + save_path, + num_monitored_epochs, } } @@ -180,6 +221,24 @@ impl BackupSnapshotMonitor { Ok(()) } + /// Deletes TipRouter saved files that were created <= epoch + fn evict_saved_files(&self, epoch: u64) -> Result<()> { + let dir_entries = std::fs::read_dir(&self.save_path)?; + // Filter the files and evict files that are <= epoch + dir_entries + .filter_map(Result::ok) + .filter_map(|entry| SavedTipRouterFile::from_path(entry.path())) + .filter(|saved_file| saved_file.epoch <= epoch) + .try_for_each(|saved_file| { + println!( + "Removing old asved file from epoch {}: {:?}", + saved_file.epoch, saved_file.path + ); + std::fs::remove_file(saved_file.path.as_path()) + })?; + Ok(()) + } + fn evict_same_epoch_incremental(&self, target_slot: u64) -> Result<()> { let slots_per_epoch = DEFAULT_SLOTS_PER_EPOCH; let target_epoch = target_slot / slots_per_epoch; @@ -263,9 +322,15 @@ impl BackupSnapshotMonitor { last_epoch_backup_path = this_epoch_backup_path; this_epoch_backup_path = None; let current_epoch = this_epoch_target_slot / DEFAULT_SLOTS_PER_EPOCH; - if let Err(e) = self.evict_all_epoch_snapshots(current_epoch - 2) { + if let Err(e) = self.evict_all_epoch_snapshots( + current_epoch - self.num_monitored_epochs.saturating_sub(1), + ) { log::error!("Failed to evict old snapshots: {}", e); } + // evict all saved files + if let Err(e) = self.evict_saved_files(current_epoch - self.num_monitored_epochs) { + log::error!("Failed to evict old TipRouter saved files: {}", e); + } } // Backup latest snapshot for last epoch and this epoch @@ -285,6 +350,10 @@ impl BackupSnapshotMonitor { mod tests { use std::fs::File; + use crate::{ + merkle_tree_collection_file_name, meta_merkle_tree_file_name, stake_meta_file_name, + }; + use super::*; use std::io::Write; use tempfile::TempDir; @@ -300,6 +369,8 @@ mod tests { temp_dir.path().to_path_buf(), backup_dir.path().to_path_buf(), None, + backup_dir.path().to_path_buf(), + 3, ); // The test version will use the fixed slot from cfg(test) get_target_slot @@ -346,6 +417,8 @@ mod tests { temp_dir.path().to_path_buf(), temp_dir.path().to_path_buf(), None, + temp_dir.path().to_path_buf(), + 3, ); // Create test snapshot files @@ -389,6 +462,8 @@ mod tests { source_dir.path().to_path_buf(), backup_dir.path().to_path_buf(), None, + backup_dir.path().to_path_buf(), + 3, ); // Create test snapshot with some content @@ -427,6 +502,8 @@ mod tests { source_dir.path().to_path_buf(), backup_dir.path().to_path_buf(), None, + backup_dir.path().to_path_buf(), + 3, ); let missing_path = source_dir.path().join("nonexistent.tar.zst"); @@ -437,4 +514,55 @@ mod tests { .await .is_err()); } + + #[test] + fn test_evict_saved_files() { + let temp_dir = TempDir::new().unwrap(); + let monitor = BackupSnapshotMonitor::new( + "http://localhost:8899", + temp_dir.path().to_path_buf(), + temp_dir.path().to_path_buf(), + None, + temp_dir.path().to_path_buf(), + 3, + ); + let current_epoch = 749; + let first_epoch = current_epoch - 5; + + for i in first_epoch..current_epoch { + let mut file = File::create(&monitor.save_path.join(stake_meta_file_name(i))).unwrap(); + file.write_all(b"test").unwrap(); + let mut file = + File::create(&monitor.save_path.join(merkle_tree_collection_file_name(i))).unwrap(); + file.write_all(b"test").unwrap(); + let mut file = + File::create(&monitor.save_path.join(meta_merkle_tree_file_name(i))).unwrap(); + file.write_all(b"test").unwrap(); + } + let dir_entries: Vec = std::fs::read_dir(&monitor.save_path) + .unwrap() + .map(|x| x.unwrap().path()) + .collect(); + assert_eq!(dir_entries.len(), 5 * 3); + + monitor + .evict_saved_files(current_epoch - monitor.num_monitored_epochs) + .unwrap(); + let dir_entries: Vec = std::fs::read_dir(&monitor.save_path) + .unwrap() + .map(|x| x.unwrap().path()) + .collect(); + assert_eq!(dir_entries.len(), 6); + + // test not evicting some other similar file in the same directory + let file_path = monitor + .save_path + .join(format!("{first_epoch}_other_similar_file.json")); + let mut file = File::create(&file_path).unwrap(); + file.write_all(b"test").unwrap(); + monitor + .evict_saved_files(current_epoch - monitor.num_monitored_epochs) + .unwrap(); + assert!(File::open(file_path).is_ok()); + } } diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 67b3ad21..f82f93ce 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -129,14 +129,18 @@ async fn main() -> Result<()> { } }); + let cli_clone: Cli = cli.clone(); // Track incremental snapshots and backup to `backup_snapshots_dir` tokio::spawn(async move { + let save_path = cli_clone.save_path; loop { if let Err(e) = BackupSnapshotMonitor::new( &rpc_url, full_snapshots_path.clone(), backup_snapshots_dir.clone(), override_target_slot, + save_path.clone(), + num_monitored_epochs, ) .run() .await From b3dca7bb33ad86bacb260855db390c6239d00a58 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Sat, 1 Mar 2025 18:35:51 -0500 Subject: [PATCH 101/112] remove prints --- tip-router-operator-cli/src/backup_snapshots.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tip-router-operator-cli/src/backup_snapshots.rs b/tip-router-operator-cli/src/backup_snapshots.rs index 6d0cbbf5..644d07f4 100644 --- a/tip-router-operator-cli/src/backup_snapshots.rs +++ b/tip-router-operator-cli/src/backup_snapshots.rs @@ -65,12 +65,10 @@ impl SavedTipRouterFile { /// Try to parse a TipRouter saved filename with epoch information pub fn from_path(path: PathBuf) -> Option { let file_name = path.file_name()?.to_str()?; - println!("file {}", file_name); // Split on underscore to get epoch let parts: Vec<&str> = file_name.split('_').collect(); let epoch: u64 = parts[0].parse().ok()?; - println!("epoch {}", epoch); let is_tip_router_file = [ stake_meta_file_name(epoch), @@ -79,7 +77,7 @@ impl SavedTipRouterFile { ] .iter() .any(|x| *x == file_name); - println!("is_tip_router_file {}", is_tip_router_file); + if is_tip_router_file { Some(Self { path, epoch }) } else { @@ -230,7 +228,7 @@ impl BackupSnapshotMonitor { .filter_map(|entry| SavedTipRouterFile::from_path(entry.path())) .filter(|saved_file| saved_file.epoch <= epoch) .try_for_each(|saved_file| { - println!( + log::debug!( "Removing old asved file from epoch {}: {:?}", saved_file.epoch, saved_file.path ); From cae65e58f9d59807f8caba519b1a618e47fd9895 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Sat, 1 Mar 2025 18:55:59 -0500 Subject: [PATCH 102/112] run format --- tip-router-operator-cli/src/backup_snapshots.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tip-router-operator-cli/src/backup_snapshots.rs b/tip-router-operator-cli/src/backup_snapshots.rs index 644d07f4..f0eeac2a 100644 --- a/tip-router-operator-cli/src/backup_snapshots.rs +++ b/tip-router-operator-cli/src/backup_snapshots.rs @@ -230,7 +230,8 @@ impl BackupSnapshotMonitor { .try_for_each(|saved_file| { log::debug!( "Removing old asved file from epoch {}: {:?}", - saved_file.epoch, saved_file.path + saved_file.epoch, + saved_file.path ); std::fs::remove_file(saved_file.path.as_path()) })?; From a1c33dc4af72ce05fb8312bce425ef9a1653779d Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Mon, 3 Mar 2025 20:30:21 -0500 Subject: [PATCH 103/112] fix protocol fees; remove old todos --- tip-router-operator-cli/src/main.rs | 8 ++++---- tip-router-operator-cli/src/process_epoch.rs | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index f82f93ce..072ff8cd 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -292,10 +292,10 @@ async fn main() -> Result<()> { &cli.save_path.join(stake_meta_file_name(epoch)), ) { Ok(stake_meta_collection) => stake_meta_collection, - Err(e) => panic!("{}", e), // TODO: should datapoint error be emitted here? + Err(e) => panic!("{}", e), }; let config = get_ncn_config(&rpc_client, &tip_router_program_id, &ncn_address).await?; - let current_fees = config.fee_config.current_fees(epoch); + let protocol_fee_bps = config.fee_config.adjusted_total_fees_bps(epoch)?; // Generate the merkle tree collection create_merkle_tree_collection( @@ -304,7 +304,7 @@ async fn main() -> Result<()> { stake_meta_collection, epoch, &ncn_address, - current_fees.total_fees_bps()?, + protocol_fee_bps, &cli.save_path, save, ); @@ -315,7 +315,7 @@ async fn main() -> Result<()> { &cli.save_path.join(merkle_tree_collection_file_name(epoch)), ) { Ok(merkle_tree_collection) => merkle_tree_collection, - Err(e) => panic!("{}", e), // TODO: should datapoint error be emitted here? + Err(e) => panic!("{}", e), }; create_meta_merkle_tree( diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index 1b25b284..d7b1891b 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -203,7 +203,7 @@ pub async fn loop_stages( }; let config = get_ncn_config(&rpc_client, tip_router_program_id, ncn_address).await?; - let current_fees = config.fee_config.current_fees(epoch_to_process); + let protocol_fee_bps = config.fee_config.adjusted_total_fees_bps(epoch_to_process)?; // Generate the merkle tree collection merkle_tree_collection = Some(create_merkle_tree_collection( @@ -212,7 +212,7 @@ pub async fn loop_stages( some_stake_meta_collection, epoch_to_process, ncn_address, - current_fees.total_fees_bps()?, + protocol_fee_bps, &cli.save_path, save_stages, )); From 8b82d70612cdafb985d4db29bc53dcb3ad66338d Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Mon, 3 Mar 2025 20:34:19 -0500 Subject: [PATCH 104/112] format --- tip-router-operator-cli/src/process_epoch.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index d7b1891b..fff8d5ab 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -203,7 +203,9 @@ pub async fn loop_stages( }; let config = get_ncn_config(&rpc_client, tip_router_program_id, ncn_address).await?; - let protocol_fee_bps = config.fee_config.adjusted_total_fees_bps(epoch_to_process)?; + let protocol_fee_bps = config + .fee_config + .adjusted_total_fees_bps(epoch_to_process)?; // Generate the merkle tree collection merkle_tree_collection = Some(create_merkle_tree_collection( From 74b252a496d474606b2653eebb095273197f9465 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Tue, 4 Mar 2025 12:37:07 -0500 Subject: [PATCH 105/112] fix ncn protocol fees --- tip-router-operator-cli/src/main.rs | 6 +++++- tip-router-operator-cli/src/process_epoch.rs | 8 +++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index 072ff8cd..d46decab 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -295,7 +295,11 @@ async fn main() -> Result<()> { Err(e) => panic!("{}", e), }; let config = get_ncn_config(&rpc_client, &tip_router_program_id, &ncn_address).await?; - let protocol_fee_bps = config.fee_config.adjusted_total_fees_bps(epoch)?; + // Tip Router looks backwards in time (typically current_epoch - 1) to calculated + // distributions. Meanwhile the NCN's Ballot is for the current_epoch. So we + // use epoch + 1 here + let ballot_epoch = epoch.checked_add(1).unwrap(); + let protocol_fee_bps = config.fee_config.adjusted_total_fees_bps(ballot_epoch)?; // Generate the merkle tree collection create_merkle_tree_collection( diff --git a/tip-router-operator-cli/src/process_epoch.rs b/tip-router-operator-cli/src/process_epoch.rs index fff8d5ab..3dcac158 100644 --- a/tip-router-operator-cli/src/process_epoch.rs +++ b/tip-router-operator-cli/src/process_epoch.rs @@ -203,9 +203,11 @@ pub async fn loop_stages( }; let config = get_ncn_config(&rpc_client, tip_router_program_id, ncn_address).await?; - let protocol_fee_bps = config - .fee_config - .adjusted_total_fees_bps(epoch_to_process)?; + // Tip Router looks backwards in time (typically current_epoch - 1) to calculated + // distributions. Meanwhile the NCN's Ballot is for the current_epoch. So we + // use epoch + 1 here + let ballot_epoch = epoch_to_process.checked_add(1).unwrap(); + let protocol_fee_bps = config.fee_config.adjusted_total_fees_bps(ballot_epoch)?; // Generate the merkle tree collection merkle_tree_collection = Some(create_merkle_tree_collection( From fa08b73e3aa04bcc64beec6e3d3f5ef87423d682 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Tue, 4 Mar 2025 15:16:56 -0500 Subject: [PATCH 106/112] fix bug in evict_same_epoch_incremental --- .../src/backup_snapshots.rs | 55 ++++++++++++++++--- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/tip-router-operator-cli/src/backup_snapshots.rs b/tip-router-operator-cli/src/backup_snapshots.rs index f0eeac2a..e96246c9 100644 --- a/tip-router-operator-cli/src/backup_snapshots.rs +++ b/tip-router-operator-cli/src/backup_snapshots.rs @@ -52,6 +52,10 @@ impl SnapshotInfo { None } } + + pub fn is_incremental(&self) -> bool { + self._start_slot.is_some() + } } /// Represents a parsed incremental snapshot filename @@ -248,7 +252,7 @@ impl BackupSnapshotMonitor { let mut same_epoch_snapshots: Vec = dir_entries .filter_map(Result::ok) .filter_map(|entry| SnapshotInfo::from_path(entry.path())) - .filter(|snap| snap.end_slot / slots_per_epoch == target_epoch) + .filter(|snap| snap.is_incremental() && snap.end_slot / slots_per_epoch == target_epoch) .collect(); // Sort by end_slot ascending so we can remove oldest @@ -321,6 +325,7 @@ impl BackupSnapshotMonitor { last_epoch_backup_path = this_epoch_backup_path; this_epoch_backup_path = None; let current_epoch = this_epoch_target_slot / DEFAULT_SLOTS_PER_EPOCH; + // TODO: We probably want to add a separate deletion of full snapshots so operators can keep a lower number. if let Err(e) = self.evict_all_epoch_snapshots( current_epoch - self.num_monitored_epochs.saturating_sub(1), ) { @@ -529,14 +534,9 @@ mod tests { let first_epoch = current_epoch - 5; for i in first_epoch..current_epoch { - let mut file = File::create(&monitor.save_path.join(stake_meta_file_name(i))).unwrap(); - file.write_all(b"test").unwrap(); - let mut file = - File::create(&monitor.save_path.join(merkle_tree_collection_file_name(i))).unwrap(); - file.write_all(b"test").unwrap(); - let mut file = - File::create(&monitor.save_path.join(meta_merkle_tree_file_name(i))).unwrap(); - file.write_all(b"test").unwrap(); + File::create(&monitor.save_path.join(stake_meta_file_name(i))).unwrap(); + File::create(&monitor.save_path.join(merkle_tree_collection_file_name(i))).unwrap(); + File::create(&monitor.save_path.join(meta_merkle_tree_file_name(i))).unwrap(); } let dir_entries: Vec = std::fs::read_dir(&monitor.save_path) .unwrap() @@ -564,4 +564,41 @@ mod tests { .unwrap(); assert!(File::open(file_path).is_ok()); } + + #[test] + fn test_evict_same_epoch_incremental() { + let temp_dir = TempDir::new().unwrap(); + let monitor = BackupSnapshotMonitor::new( + "http://localhost:8899", + temp_dir.path().to_path_buf(), + temp_dir.path().to_path_buf(), + None, + temp_dir.path().to_path_buf(), + 3, + ); + + // Create test snapshot files + let snapshots = [ + "incremental-snapshot-100-324431477-hash1.tar.zst", + "incremental-snapshot-200-324431877-hash2.tar.zst", + "incremental-snapshot-300-324431977-hash3.tar.zst", + "incremental-snapshot-100-324589366-hash1.tar.zst", + "incremental-snapshot-200-324589866-hash2.tar.zst", + "incremental-snapshot-300-324590366-hash3.tar.zst", + "snapshot-324431977-hash.tar.zst", + ]; + + for name in snapshots.iter() { + let path = temp_dir.path().join(name); + File::create(path).unwrap(); + } + + // Test that it only keeps 3 incrementals when there's a full snapshot + monitor.evict_same_epoch_incremental(324431977).unwrap(); + let dir_entries: Vec = std::fs::read_dir(&monitor.backup_dir) + .unwrap() + .map(|x| x.unwrap().path()) + .collect(); + assert_eq!(dir_entries.len(), snapshots.len()); + } } From 45b96b68d7caffa73b7afe2885ce0f3538796ca1 Mon Sep 17 00:00:00 2001 From: Tommy Johnson Date: Tue, 4 Mar 2025 16:16:38 -0500 Subject: [PATCH 107/112] remove todo comment anf format --- tip-router-operator-cli/src/backup_snapshots.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tip-router-operator-cli/src/backup_snapshots.rs b/tip-router-operator-cli/src/backup_snapshots.rs index e96246c9..1533ebba 100644 --- a/tip-router-operator-cli/src/backup_snapshots.rs +++ b/tip-router-operator-cli/src/backup_snapshots.rs @@ -53,7 +53,7 @@ impl SnapshotInfo { } } - pub fn is_incremental(&self) -> bool { + pub const fn is_incremental(&self) -> bool { self._start_slot.is_some() } } @@ -325,7 +325,6 @@ impl BackupSnapshotMonitor { last_epoch_backup_path = this_epoch_backup_path; this_epoch_backup_path = None; let current_epoch = this_epoch_target_slot / DEFAULT_SLOTS_PER_EPOCH; - // TODO: We probably want to add a separate deletion of full snapshots so operators can keep a lower number. if let Err(e) = self.evict_all_epoch_snapshots( current_epoch - self.num_monitored_epochs.saturating_sub(1), ) { From 8b03dfe70f5b8b4785703c4992721dca5eae39ea Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Sat, 8 Mar 2025 11:01:59 -0500 Subject: [PATCH 108/112] Attempt faster tx submission --- tip-router-operator-cli/src/claim.rs | 48 +++++++++++++++------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/tip-router-operator-cli/src/claim.rs b/tip-router-operator-cli/src/claim.rs index 228eddb9..f7123503 100644 --- a/tip-router-operator-cli/src/claim.rs +++ b/tip-router-operator-cli/src/claim.rs @@ -191,30 +191,34 @@ pub async fn claim_mev_tips( return Ok(()); } - all_claim_transactions.shuffle(&mut thread_rng()); - let transactions: Vec<_> = all_claim_transactions.into_iter().take(300).collect(); + for transactions in all_claim_transactions.chunks(2_000) { + let transactions: Vec<_> = transactions.iter().cloned().collect(); + // only check balance for the ones we need to currently send since reclaim rent running in parallel + if let Some((start_balance, desired_balance, sol_to_deposit)) = + is_sufficient_balance(&keypair.pubkey(), &rpc_client, transactions.len() as u64) + .await + { + return Err(ClaimMevError::InsufficientBalance { + desired_balance, + payer: keypair.pubkey(), + start_balance, + sol_to_deposit, + }); + } - // only check balance for the ones we need to currently send since reclaim rent running in parallel - if let Some((start_balance, desired_balance, sol_to_deposit)) = - is_sufficient_balance(&keypair.pubkey(), &rpc_client, transactions.len() as u64).await - { - return Err(ClaimMevError::InsufficientBalance { - desired_balance, - payer: keypair.pubkey(), - start_balance, - sol_to_deposit, - }); + let blockhash = rpc_client.get_latest_blockhash().await?; + if let Err(e) = send_until_blockhash_expires( + &rpc_client, + &rpc_sender_client, + transactions, + blockhash, + keypair, + ) + .await + { + info!("send_until_blockhash_expires failed: {:?}", e); + } } - - let blockhash = rpc_client.get_latest_blockhash().await?; - let _ = send_until_blockhash_expires( - &rpc_client, - &rpc_sender_client, - transactions, - blockhash, - keypair, - ) - .await; } let transactions = get_claim_transactions_for_valid_unclaimed( From 03840a4a9b804ee46ddf1fcc62c5aa4950f4be81 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Sat, 8 Mar 2025 11:23:25 -0500 Subject: [PATCH 109/112] Start claiming immediately --- tip-router-operator-cli/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tip-router-operator-cli/src/main.rs b/tip-router-operator-cli/src/main.rs index d46decab..4f232620 100644 --- a/tip-router-operator-cli/src/main.rs +++ b/tip-router-operator-cli/src/main.rs @@ -157,7 +157,6 @@ async fn main() -> Result<()> { tokio::spawn(async move { loop { // Slow process with lots of account fetches so run every 30 minutes - sleep(Duration::from_secs(1800)).await; let epoch = if let Ok(epoch) = rpc_client.get_epoch_info().await { epoch.epoch.checked_sub(1).unwrap_or(epoch.epoch) } else { @@ -175,6 +174,7 @@ async fn main() -> Result<()> { { error!("Error claiming tips: {}", e); } + sleep(Duration::from_secs(1800)).await; } }); } From dfd38ee8d0b0faf85d6ebd188615f6f7bf3acb9b Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Sun, 9 Mar 2025 15:37:50 -0400 Subject: [PATCH 110/112] Don't copy full snaps --- tip-router-operator-cli/src/backup_snapshots.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tip-router-operator-cli/src/backup_snapshots.rs b/tip-router-operator-cli/src/backup_snapshots.rs index 1533ebba..3899c9e5 100644 --- a/tip-router-operator-cli/src/backup_snapshots.rs +++ b/tip-router-operator-cli/src/backup_snapshots.rs @@ -143,7 +143,7 @@ impl BackupSnapshotMonitor { let before_target_slot = snap.end_slot <= target_slot; let in_same_epoch = (snap.end_slot / DEFAULT_SLOTS_PER_EPOCH) == (target_slot / DEFAULT_SLOTS_PER_EPOCH); - before_target_slot && in_same_epoch + snap.is_incremental() && before_target_slot && in_same_epoch }) .max_by_key(|snap| snap.end_slot) .map(|snap| snap.path) From 4be55c15ebab02d2d619c9d539eeccebd9219548 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Tue, 11 Mar 2025 13:00:51 -0400 Subject: [PATCH 111/112] shuffle --- tip-router-operator-cli/src/claim.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tip-router-operator-cli/src/claim.rs b/tip-router-operator-cli/src/claim.rs index f7123503..dec4fcf1 100644 --- a/tip-router-operator-cli/src/claim.rs +++ b/tip-router-operator-cli/src/claim.rs @@ -191,6 +191,8 @@ pub async fn claim_mev_tips( return Ok(()); } + all_claim_transactions.shuffle(&mut thread_rng()); + for transactions in all_claim_transactions.chunks(2_000) { let transactions: Vec<_> = transactions.iter().cloned().collect(); // only check balance for the ones we need to currently send since reclaim rent running in parallel From 0a6ed067a0ebc7fcce9b958696996cdc941fa2d2 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Tue, 11 Mar 2025 13:06:52 -0400 Subject: [PATCH 112/112] to_vec --- tip-router-operator-cli/src/claim.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tip-router-operator-cli/src/claim.rs b/tip-router-operator-cli/src/claim.rs index dec4fcf1..116f4f67 100644 --- a/tip-router-operator-cli/src/claim.rs +++ b/tip-router-operator-cli/src/claim.rs @@ -194,7 +194,7 @@ pub async fn claim_mev_tips( all_claim_transactions.shuffle(&mut thread_rng()); for transactions in all_claim_transactions.chunks(2_000) { - let transactions: Vec<_> = transactions.iter().cloned().collect(); + let transactions: Vec<_> = transactions.to_vec(); // only check balance for the ones we need to currently send since reclaim rent running in parallel if let Some((start_balance, desired_balance, sol_to_deposit)) = is_sufficient_balance(&keypair.pubkey(), &rpc_client, transactions.len() as u64)