From 52c2cbd630ba2a22bdec9f52e93e761d9dce3997 Mon Sep 17 00:00:00 2001 From: Michael Vines Date: Fri, 11 Dec 2020 10:47:32 -0800 Subject: [PATCH] stake-account command no longer errors when time goes backwards over an epoch --- cli-output/src/cli_output.rs | 9 ++++++--- cli/src/stake.rs | 28 ++++++++++++++++++---------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/cli-output/src/cli_output.rs b/cli-output/src/cli_output.rs index 444449137..69c8f98e3 100644 --- a/cli-output/src/cli_output.rs +++ b/cli-output/src/cli_output.rs @@ -592,7 +592,7 @@ pub struct CliEpochReward { pub amount: u64, // lamports pub post_balance: u64, // lamports pub percent_change: f64, - pub apr: f64, + pub apr: Option, } fn show_votes_and_credits( @@ -652,13 +652,16 @@ fn show_epoch_rewards( for reward in epoch_rewards { writeln!( f, - " {:<8} {:<11} ◎{:<14.9} ◎{:<14.9} {:>13.9}% {:>13.9}%", + " {:<8} {:<11} ◎{:<14.9} ◎{:<14.9} {:>13.9}% {}", reward.epoch, reward.effective_slot, lamports_to_sol(reward.amount), lamports_to_sol(reward.post_balance), reward.percent_change, - reward.apr, + reward + .apr + .map(|apr| format!("{:>13.9}%", apr)) + .unwrap_or_default(), )?; } } diff --git a/cli/src/stake.rs b/cli/src/stake.rs index 68eb7fb59..2ddfdf457 100644 --- a/cli/src/stake.rs +++ b/cli/src/stake.rs @@ -1647,29 +1647,37 @@ pub(crate) fn fetch_epoch_rewards( let previous_epoch_rewards = first_confirmed_block.rewards; if let Some((effective_slot, epoch_end_time, epoch_rewards)) = epoch_info { - let wallclock_epoch_duration = - { Local.timestamp(epoch_end_time, 0) - Local.timestamp(epoch_start_time, 0) } - .to_std()? - .as_secs_f64(); - - let wallclock_epochs_per_year = - (SECONDS_PER_DAY * 356) as f64 / 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) } + .to_std()? + .as_secs_f64(), + ) + } else { + None + }; if let Some(reward) = epoch_rewards .into_iter() .find(|reward| reward.pubkey == address.to_string()) { 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); + 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 { epoch, effective_slot, amount: reward.lamports.abs() as u64, post_balance: reward.post_balance, - percent_change: balance_increase_percent, - apr: balance_increase_percent * wallclock_epochs_per_year, + percent_change, + apr, }); } }