stake-account command no longer errors when time goes backwards over an epoch

This commit is contained in:
Michael Vines
2020-12-11 10:47:32 -08:00
committed by mergify[bot]
parent 8541ffa328
commit 52c2cbd630
2 changed files with 24 additions and 13 deletions

View File

@ -592,7 +592,7 @@ pub struct CliEpochReward {
pub amount: u64, // lamports pub amount: u64, // lamports
pub post_balance: u64, // lamports pub post_balance: u64, // lamports
pub percent_change: f64, pub percent_change: f64,
pub apr: f64, pub apr: Option<f64>,
} }
fn show_votes_and_credits( fn show_votes_and_credits(
@ -652,13 +652,16 @@ fn show_epoch_rewards(
for reward in epoch_rewards { for reward in epoch_rewards {
writeln!( writeln!(
f, f,
" {:<8} {:<11} ◎{:<14.9} ◎{:<14.9} {:>13.9}% {:>13.9}%", " {:<8} {:<11} ◎{:<14.9} ◎{:<14.9} {:>13.9}% {}",
reward.epoch, reward.epoch,
reward.effective_slot, reward.effective_slot,
lamports_to_sol(reward.amount), lamports_to_sol(reward.amount),
lamports_to_sol(reward.post_balance), lamports_to_sol(reward.post_balance),
reward.percent_change, reward.percent_change,
reward.apr, reward
.apr
.map(|apr| format!("{:>13.9}%", apr))
.unwrap_or_default(),
)?; )?;
} }
} }

View File

@ -1647,29 +1647,37 @@ pub(crate) fn fetch_epoch_rewards(
let previous_epoch_rewards = first_confirmed_block.rewards; let previous_epoch_rewards = first_confirmed_block.rewards;
if let Some((effective_slot, epoch_end_time, epoch_rewards)) = epoch_info { if let Some((effective_slot, epoch_end_time, epoch_rewards)) = epoch_info {
let wallclock_epoch_duration = let wallclock_epoch_duration = if epoch_end_time > epoch_start_time {
Some(
{ Local.timestamp(epoch_end_time, 0) - Local.timestamp(epoch_start_time, 0) } { Local.timestamp(epoch_end_time, 0) - Local.timestamp(epoch_start_time, 0) }
.to_std()? .to_std()?
.as_secs_f64(); .as_secs_f64(),
)
let wallclock_epochs_per_year = } else {
(SECONDS_PER_DAY * 356) as f64 / wallclock_epoch_duration; None
};
if let Some(reward) = epoch_rewards if let Some(reward) = epoch_rewards
.into_iter() .into_iter()
.find(|reward| reward.pubkey == address.to_string()) .find(|reward| reward.pubkey == address.to_string())
{ {
if reward.post_balance > reward.lamports.try_into().unwrap_or(0) { if reward.post_balance > reward.lamports.try_into().unwrap_or(0) {
let balance_increase_percent = reward.lamports.abs() as f64 let percent_change = reward.lamports.abs() as f64
/ (reward.post_balance as f64 - reward.lamports as f64); / (reward.post_balance as f64 - reward.lamports as f64);
let apr = wallclock_epoch_duration.map(|wallclock_epoch_duration| {
let wallclock_epochs_per_year =
(SECONDS_PER_DAY * 356) as f64 / wallclock_epoch_duration;
percent_change * wallclock_epochs_per_year
});
all_epoch_rewards.push(CliEpochReward { all_epoch_rewards.push(CliEpochReward {
epoch, epoch,
effective_slot, effective_slot,
amount: reward.lamports.abs() as u64, amount: reward.lamports.abs() as u64,
post_balance: reward.post_balance, post_balance: reward.post_balance,
percent_change: balance_increase_percent, percent_change,
apr: balance_increase_percent * wallclock_epochs_per_year, apr,
}); });
} }
} }