diff --git a/programs/stake/src/stake_state.rs b/programs/stake/src/stake_state.rs index 245565deac..9f8a42f7ee 100644 --- a/programs/stake/src/stake_state.rs +++ b/programs/stake/src/stake_state.rs @@ -581,6 +581,11 @@ impl Stake { fix_stake_deactivate, ); + // Drive credits_observed forward unconditionally when rewards are disabled + if point_value.rewards == 0 && fix_stake_deactivate { + return Some((0, 0, credits_observed)); + } + if points == 0 || point_value.points == 0 { return None; } @@ -3005,6 +3010,23 @@ mod tests { true, ) ); + + // now one with inflation disabled. no one gets paid, but we still need + // to advance the stake state's observed_credits field to prevent back- + // paying rewards when inflation is turned on. + assert_eq!( + Some((0, 0, 4)), + stake.calculate_rewards( + &PointValue { + rewards: 0, + points: 4 + }, + &vote_state, + None, + &mut null_tracer(), + true, + ) + ); } #[test]