From 41605ac1f643301b36dc89436ade449670b8da6e Mon Sep 17 00:00:00 2001 From: Ryo Onodera Date: Tue, 10 Nov 2020 20:54:07 +0900 Subject: [PATCH 1/2] cli: stake-account/stakes: Use GetStakeActivation --- cli-output/src/cli_output.rs | 10 +++++----- cli/src/cluster_query.rs | 16 ++++------------ cli/src/stake.rs | 24 +++++++++++++++--------- client/src/rpc_client.rs | 7 +++++++ client/src/rpc_request.rs | 2 ++ 5 files changed, 33 insertions(+), 26 deletions(-) diff --git a/cli-output/src/cli_output.rs b/cli-output/src/cli_output.rs index ce28b590511..f6a5c61eda3 100644 --- a/cli-output/src/cli_output.rs +++ b/cli-output/src/cli_output.rs @@ -571,7 +571,7 @@ impl fmt::Display for CliKeyedStakeState { } } -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct CliEpochReward { pub epoch: Epoch, @@ -652,7 +652,7 @@ fn show_epoch_rewards( Ok(()) } -#[derive(Default, Serialize, Deserialize)] +#[derive(Default, Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct CliStakeState { pub stake_type: CliStakeType, @@ -838,7 +838,7 @@ impl fmt::Display for CliStakeState { } } -#[derive(Serialize, Deserialize, PartialEq)] +#[derive(Serialize, Debug, Deserialize, PartialEq)] pub enum CliStakeType { Stake, RewardsPool, @@ -914,7 +914,7 @@ pub struct CliStakeHistoryEntry { pub deactivating_stake: u64, } -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct CliAuthorized { pub staker: String, @@ -930,7 +930,7 @@ impl From<&Authorized> for CliAuthorized { } } -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct CliLockup { pub unix_timestamp: UnixTimestamp, diff --git a/cli/src/cluster_query.rs b/cli/src/cluster_query.rs index 691e104747c..57a68e07945 100644 --- a/cli/src/cluster_query.rs +++ b/cli/src/cluster_query.rs @@ -36,11 +36,7 @@ use solana_sdk::{ native_token::lamports_to_sol, pubkey::{self, Pubkey}, signature::Signature, - system_instruction, system_program, - sysvar::{ - self, - stake_history::{self}, - }, + system_instruction, system_program, sysvar, transaction::Transaction, }; use solana_transaction_status::UiTransactionEncoding; @@ -1339,20 +1335,16 @@ pub fn process_show_stakes( } let all_stake_accounts = rpc_client .get_program_accounts_with_config(&solana_stake_program::id(), program_accounts_config)?; - let stake_history_account = rpc_client.get_account(&stake_history::id())?; let clock_account = rpc_client.get_account(&sysvar::clock::id())?; let clock: Clock = from_account(&clock_account).ok_or_else(|| { CliError::RpcRequestError("Failed to deserialize clock sysvar".to_string()) })?; progress_bar.finish_and_clear(); - let stake_history = from_account(&stake_history_account).ok_or_else(|| { - CliError::RpcRequestError("Failed to deserialize stake history".to_string()) - })?; - let mut stake_accounts: Vec = vec![]; for (stake_pubkey, stake_account) in all_stake_accounts { if let Ok(stake_state) = stake_account.state() { + let stake_activation = rpc_client.get_stake_activation(&stake_pubkey)?; match stake_state { StakeState::Initialized(_) => { if vote_account_pubkeys.is_none() { @@ -1362,7 +1354,7 @@ pub fn process_show_stakes( stake_account.lamports, &stake_state, use_lamports_unit, - &stake_history, + &stake_activation, &clock, ), }); @@ -1380,7 +1372,7 @@ pub fn process_show_stakes( stake_account.lamports, &stake_state, use_lamports_unit, - &stake_history, + &stake_activation, &clock, ), }); diff --git a/cli/src/stake.rs b/cli/src/stake.rs index ffe88de01b2..e4b00610c8b 100644 --- a/cli/src/stake.rs +++ b/cli/src/stake.rs @@ -22,6 +22,7 @@ use solana_cli_output::{ return_signers, CliEpochReward, CliStakeHistory, CliStakeHistoryEntry, CliStakeState, CliStakeType, }; +use solana_client::rpc_response::{RpcStakeActivation, StakeActivationState}; use solana_client::{ blockhash_query::BlockhashQuery, client_error::{ClientError, ClientErrorKind}, @@ -1499,7 +1500,7 @@ pub fn build_stake_state( account_balance: u64, stake_state: &StakeState, use_lamports_unit: bool, - stake_history: &StakeHistory, + stake_activation: &RpcStakeActivation, clock: &Clock, ) -> CliStakeState { match stake_state { @@ -1512,9 +1513,17 @@ pub fn build_stake_state( stake, ) => { let current_epoch = clock.epoch; - let (active_stake, activating_stake, deactivating_stake) = stake - .delegation - .stake_activating_and_deactivating(current_epoch, Some(stake_history)); + let (active_stake, activating_stake, deactivating_stake) = match stake_activation.state + { + StakeActivationState::Activating => { + (stake_activation.active, stake_activation.inactive, 0) + } + StakeActivationState::Active => (stake_activation.active, 0, 0), + StakeActivationState::Deactivating => { + (stake_activation.active, 0, stake_activation.inactive) + } + StakeActivationState::Inactive => (0, 0, 0), + }; let lockup = if lockup.is_in_force(clock, None) { Some(lockup.into()) } else { @@ -1695,20 +1704,17 @@ pub fn process_show_stake_account( } match stake_account.state() { Ok(stake_state) => { - let stake_history_account = rpc_client.get_account(&stake_history::id())?; - let stake_history = from_account(&stake_history_account).ok_or_else(|| { - CliError::RpcRequestError("Failed to deserialize stake history".to_string()) - })?; let clock_account = rpc_client.get_account(&clock::id())?; let clock: Clock = from_account(&clock_account).ok_or_else(|| { CliError::RpcRequestError("Failed to deserialize clock sysvar".to_string()) })?; + let stake_activation = rpc_client.get_stake_activation(stake_account_address)?; let mut state = build_stake_state( stake_account.lamports, &stake_state, use_lamports_unit, - &stake_history, + &stake_activation, &clock, ); diff --git a/client/src/rpc_client.rs b/client/src/rpc_client.rs index 3c256400e75..ff0ddeb022b 100644 --- a/client/src/rpc_client.rs +++ b/client/src/rpc_client.rs @@ -474,6 +474,13 @@ impl RpcClient { self.get_epoch_info_with_commitment(CommitmentConfig::default()) } + pub fn get_stake_activation(&self, pubkey: &Pubkey) -> ClientResult { + self.send( + RpcRequest::GetStakeActivation, + json!([pubkey.to_string(), CommitmentConfig::default()]), + ) + } + pub fn get_epoch_info_with_commitment( &self, commitment_config: CommitmentConfig, diff --git a/client/src/rpc_request.rs b/client/src/rpc_request.rs index 731d80ca670..12fd732576a 100644 --- a/client/src/rpc_request.rs +++ b/client/src/rpc_request.rs @@ -40,6 +40,7 @@ pub enum RpcRequest { GetStorageTurn, GetStorageTurnRate, GetSlotsPerSegment, + GetStakeActivation, GetStoragePubkeysForSlot, GetSupply, GetTokenAccountBalance, @@ -95,6 +96,7 @@ impl fmt::Display for RpcRequest { RpcRequest::GetStorageTurn => "getStorageTurn", RpcRequest::GetStorageTurnRate => "getStorageTurnRate", RpcRequest::GetSlotsPerSegment => "getSlotsPerSegment", + RpcRequest::GetStakeActivation => "getStakeActivation", RpcRequest::GetStoragePubkeysForSlot => "getStoragePubkeysForSlot", RpcRequest::GetSupply => "getSupply", RpcRequest::GetTokenAccountBalance => "getTokenAccountBalance", From 00d5f9f6ea0443a94324056810a806bd86f4c26c Mon Sep 17 00:00:00 2001 From: Ryo Onodera Date: Tue, 10 Nov 2020 21:14:59 +0900 Subject: [PATCH 2/2] Reorder logically --- cli/src/stake.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/src/stake.rs b/cli/src/stake.rs index e4b00610c8b..fd0ea17980d 100644 --- a/cli/src/stake.rs +++ b/cli/src/stake.rs @@ -1515,14 +1515,14 @@ pub fn build_stake_state( let current_epoch = clock.epoch; let (active_stake, activating_stake, deactivating_stake) = match stake_activation.state { + StakeActivationState::Active => (stake_activation.active, 0, 0), + StakeActivationState::Inactive => (0, 0, 0), StakeActivationState::Activating => { (stake_activation.active, stake_activation.inactive, 0) } - StakeActivationState::Active => (stake_activation.active, 0, 0), StakeActivationState::Deactivating => { (stake_activation.active, 0, stake_activation.inactive) } - StakeActivationState::Inactive => (0, 0, 0), }; let lockup = if lockup.is_in_force(clock, None) { Some(lockup.into())