diff --git a/cli-output/src/cli_output.rs b/cli-output/src/cli_output.rs index f5357f673..4ba5c2212 100644 --- a/cli-output/src/cli_output.rs +++ b/cli-output/src/cli_output.rs @@ -347,6 +347,8 @@ pub struct CliValidators { pub total_current_stake: u64, pub total_delinquent_stake: u64, pub validators: Vec, + pub average_skip_rate: f64, + pub average_stake_weighted_skip_rate: f64, #[serde(skip_serializing)] pub validators_sort_order: CliValidatorsSortOrder, #[serde(skip_serializing)] @@ -510,6 +512,18 @@ impl fmt::Display for CliValidators { writeln!(f, "{}", header)?; } + writeln!(f)?; + writeln_name_value( + f, + "Average Stake-Weighted Skip Rate:", + &format!("{:.2}%", self.average_stake_weighted_skip_rate,), + )?; + writeln_name_value( + f, + "Average Unweighted Skip Rate: ", + &format!("{:.2}%", self.average_skip_rate), + )?; + writeln!(f)?; writeln_name_value( f, diff --git a/cli/src/cluster_query.rs b/cli/src/cluster_query.rs index 1a375f3d8..841382c32 100644 --- a/cli/src/cluster_query.rs +++ b/cli/src/cluster_query.rs @@ -1892,14 +1892,40 @@ pub fn process_show_validators( entry.delinquent_active_stake += validator.activated_stake; } + let validators: Vec<_> = current_validators + .into_iter() + .chain(delinquent_validators.into_iter()) + .collect(); + + let (average_skip_rate, average_stake_weighted_skip_rate) = { + let mut skip_rate_len = 0; + let mut skip_rate_sum = 0.; + let mut skip_rate_weighted_sum = 0.; + for validator in validators.iter() { + if let Some(skip_rate) = validator.skip_rate { + skip_rate_sum += skip_rate; + skip_rate_len += 1; + skip_rate_weighted_sum += skip_rate * validator.activated_stake as f64; + } + } + + if skip_rate_len > 0 && total_active_stake > 0 { + ( + skip_rate_sum / skip_rate_len as f64, + skip_rate_weighted_sum / total_active_stake as f64, + ) + } else { + (100., 100.) // Impossible? + } + }; + let cli_validators = CliValidators { total_active_stake, total_current_stake, total_delinquent_stake, - validators: current_validators - .into_iter() - .chain(delinquent_validators.into_iter()) - .collect(), + validators, + average_skip_rate, + average_stake_weighted_skip_rate, validators_sort_order, validators_reverse_sort, number_validators,