diff --git a/cli/src/cli.rs b/cli/src/cli.rs index 04bb57874deae3..f484ffc507b1b4 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -208,6 +208,7 @@ pub enum CliCommand { }, ShowValidators { use_lamports_unit: bool, + commitment_config: CommitmentConfig, }, // Nonce commands AuthorizeNonceAccount { @@ -353,6 +354,7 @@ pub enum CliCommand { ShowVoteAccount { pubkey: Pubkey, use_lamports_unit: bool, + commitment_config: CommitmentConfig, }, VoteAuthorize { vote_account_pubkey: Pubkey, @@ -1559,13 +1561,13 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { CliCommand::GetBlockTime { slot } => process_get_block_time(&rpc_client, *slot), CliCommand::GetGenesisHash => process_get_genesis_hash(&rpc_client), CliCommand::GetEpochInfo { commitment_config } => { - process_get_epoch_info(&rpc_client, commitment_config) + process_get_epoch_info(&rpc_client, *commitment_config) } CliCommand::GetSlot { commitment_config } => { - process_get_slot(&rpc_client, commitment_config) + process_get_slot(&rpc_client, *commitment_config) } CliCommand::GetTransactionCount { commitment_config } => { - process_get_transaction_count(&rpc_client, commitment_config) + process_get_transaction_count(&rpc_client, *commitment_config) } CliCommand::LeaderSchedule => process_leader_schedule(&rpc_client), CliCommand::LiveSlots => process_live_slots(&config.websocket_url), @@ -1582,7 +1584,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { interval, count, timeout, - commitment_config, + *commitment_config, ), CliCommand::ShowBlockProduction { epoch, slot_limit } => { process_show_block_production(&rpc_client, config, *epoch, *slot_limit) @@ -1596,9 +1598,10 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { *use_lamports_unit, vote_account_pubkeys.as_deref(), ), - CliCommand::ShowValidators { use_lamports_unit } => { - process_show_validators(&rpc_client, *use_lamports_unit) - } + CliCommand::ShowValidators { + use_lamports_unit, + commitment_config, + } => process_show_validators(&rpc_client, *use_lamports_unit, *commitment_config), // Nonce Commands @@ -1910,11 +1913,13 @@ pub fn process_command(config: &CliConfig) -> ProcessResult { CliCommand::ShowVoteAccount { pubkey: vote_account_pubkey, use_lamports_unit, + commitment_config, } => process_show_vote_account( &rpc_client, config, &vote_account_pubkey, *use_lamports_unit, + *commitment_config, ), CliCommand::VoteAuthorize { vote_account_pubkey, diff --git a/cli/src/cluster_query.rs b/cli/src/cluster_query.rs index 518864593f7726..e90879ae34c55d 100644 --- a/cli/src/cluster_query.rs +++ b/cli/src/cluster_query.rs @@ -218,6 +218,14 @@ impl ClusterQuerySubCommands for App<'_, '_> { SubCommand::with_name("validators") .about("Show summary information about the current validators") .alias("show-validators") + .arg( + Arg::with_name("confirmed") + .long("confirmed") + .takes_value(false) + .help( + "Return information at maximum-lockout commitment level", + ), + ) .arg( Arg::with_name("lamports") .long("lamports") @@ -330,9 +338,17 @@ pub fn parse_show_stakes(matches: &ArgMatches<'_>) -> Result) -> Result { let use_lamports_unit = matches.is_present("lamports"); + let commitment_config = if matches.is_present("confirmed") { + CommitmentConfig::default() + } else { + CommitmentConfig::recent() + }; Ok(CliCommandInfo { - command: CliCommand::ShowValidators { use_lamports_unit }, + command: CliCommand::ShowValidators { + use_lamports_unit, + commitment_config, + }, signers: vec![], }) } @@ -473,7 +489,7 @@ fn slot_to_human_time(slot: Slot) -> String { pub fn process_get_epoch_info( rpc_client: &RpcClient, - commitment_config: &CommitmentConfig, + commitment_config: CommitmentConfig, ) -> ProcessResult { let epoch_info = rpc_client.get_epoch_info_with_commitment(commitment_config.clone())?; println!(); @@ -519,7 +535,7 @@ pub fn process_get_genesis_hash(rpc_client: &RpcClient) -> ProcessResult { pub fn process_get_slot( rpc_client: &RpcClient, - commitment_config: &CommitmentConfig, + commitment_config: CommitmentConfig, ) -> ProcessResult { let slot = rpc_client.get_slot_with_commitment(commitment_config.clone())?; Ok(slot.to_string()) @@ -708,7 +724,7 @@ pub fn process_show_block_production( pub fn process_get_transaction_count( rpc_client: &RpcClient, - commitment_config: &CommitmentConfig, + commitment_config: CommitmentConfig, ) -> ProcessResult { let transaction_count = rpc_client.get_transaction_count_with_commitment(commitment_config.clone())?; @@ -722,7 +738,7 @@ pub fn process_ping( interval: &Duration, count: &Option, timeout: &Duration, - commitment_config: &CommitmentConfig, + commitment_config: CommitmentConfig, ) -> ProcessResult { let to = Keypair::new().pubkey(); @@ -1013,9 +1029,13 @@ pub fn process_show_stakes( Ok("".to_string()) } -pub fn process_show_validators(rpc_client: &RpcClient, use_lamports_unit: bool) -> ProcessResult { - let epoch_info = rpc_client.get_epoch_info()?; - let vote_accounts = rpc_client.get_vote_accounts()?; +pub fn process_show_validators( + rpc_client: &RpcClient, + use_lamports_unit: bool, + commitment_config: CommitmentConfig, +) -> ProcessResult { + let epoch_info = rpc_client.get_epoch_info_with_commitment(commitment_config)?; + let vote_accounts = rpc_client.get_vote_accounts_with_commitment(commitment_config)?; let total_active_stake = vote_accounts .current .iter() diff --git a/cli/src/vote.rs b/cli/src/vote.rs index 684784dd279a4d..c56aa3196c4987 100644 --- a/cli/src/vote.rs +++ b/cli/src/vote.rs @@ -9,6 +9,7 @@ use solana_client::rpc_client::RpcClient; use solana_remote_wallet::remote_wallet::RemoteWalletManager; use solana_sdk::{ account::Account, + commitment_config::CommitmentConfig, message::Message, pubkey::Pubkey, system_instruction::{create_address_with_seed, SystemError}, @@ -158,6 +159,14 @@ impl VoteSubCommands for App<'_, '_> { SubCommand::with_name("vote-account") .about("Show the contents of a vote account") .alias("show-vote-account") + .arg( + Arg::with_name("confirmed") + .long("confirmed") + .takes_value(false) + .help( + "Return information at maximum-lockout commitment level", + ), + ) .arg( Arg::with_name("vote_account_pubkey") .index(1) @@ -267,10 +276,16 @@ pub fn parse_vote_get_account_command( ) -> Result { let vote_account_pubkey = pubkey_of(matches, "vote_account_pubkey").unwrap(); let use_lamports_unit = matches.is_present("lamports"); + let commitment_config = if matches.is_present("confirmed") { + CommitmentConfig::default() + } else { + CommitmentConfig::recent() + }; Ok(CliCommandInfo { command: CliCommand::ShowVoteAccount { pubkey: vote_account_pubkey, use_lamports_unit, + commitment_config, }, signers: vec![], }) @@ -423,8 +438,14 @@ pub fn process_vote_update_validator( fn get_vote_account( rpc_client: &RpcClient, vote_account_pubkey: &Pubkey, + commitment_config: CommitmentConfig, ) -> Result<(Account, VoteState), Box> { - let vote_account = rpc_client.get_account(vote_account_pubkey)?; + let vote_account = rpc_client + .get_account_with_commitment(vote_account_pubkey, commitment_config)? + .value + .ok_or_else(|| { + CliError::RpcRequestError(format!("{:?} account does not exist", vote_account_pubkey)) + })?; if vote_account.owner != solana_vote_program::id() { return Err(CliError::RpcRequestError(format!( @@ -447,8 +468,10 @@ pub fn process_show_vote_account( _config: &CliConfig, vote_account_pubkey: &Pubkey, use_lamports_unit: bool, + commitment_config: CommitmentConfig, ) -> ProcessResult { - let (vote_account, vote_state) = get_vote_account(rpc_client, vote_account_pubkey)?; + let (vote_account, vote_state) = + get_vote_account(rpc_client, vote_account_pubkey, commitment_config)?; let epoch_schedule = rpc_client.get_epoch_schedule()?; diff --git a/client/src/rpc_client.rs b/client/src/rpc_client.rs index c335796b871265..67bb9c3704c151 100644 --- a/client/src/rpc_client.rs +++ b/client/src/rpc_client.rs @@ -165,9 +165,16 @@ impl RpcClient { } pub fn get_vote_accounts(&self) -> io::Result { + self.get_vote_accounts_with_commitment(CommitmentConfig::default()) + } + + pub fn get_vote_accounts_with_commitment( + &self, + commitment_config: CommitmentConfig, + ) -> io::Result { let response = self .client - .send(&RpcRequest::GetVoteAccounts, Value::Null, 0) + .send(&RpcRequest::GetVoteAccounts, json!([commitment_config]), 0) .map_err(|err| { io::Error::new( io::ErrorKind::Other, diff --git a/sdk/src/commitment_config.rs b/sdk/src/commitment_config.rs index b0f75096f19019..aa6f9ee4b24829 100644 --- a/sdk/src/commitment_config.rs +++ b/sdk/src/commitment_config.rs @@ -1,4 +1,4 @@ -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq)] #[serde(rename_all = "camelCase")] pub struct CommitmentConfig { pub commitment: CommitmentLevel, @@ -25,16 +25,16 @@ impl CommitmentConfig { } } - pub fn ok(&self) -> Option { - if self == &Self::default() { + pub fn ok(self) -> Option { + if self == Self::default() { None } else { - Some(self.clone()) + Some(self) } } } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq)] #[serde(rename_all = "camelCase")] pub enum CommitmentLevel { Max,