Skip to content

Commit

Permalink
fix: previous_staked remains unchanged for future era stake amounts (
Browse files Browse the repository at this point in the history
…#1428)

* fix: `previous_staked` remains unchanged for future era stake amounts

* fmt
  • Loading branch information
ipapandinas authored Feb 21, 2025
1 parent 82206c2 commit b625437
Show file tree
Hide file tree
Showing 3 changed files with 115 additions and 7 deletions.
71 changes: 65 additions & 6 deletions pallets/dapp-staking/src/test/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3916,12 +3916,7 @@ fn move_stake_bonus_preserved_with_transfer_conversion_is_ok() {
let default_bonus_status = *BonusStatusWrapperFor::<Test>::default();
let expected_bonus_status = default_bonus_status - 1; // B&E subperiod + full move
let expected_stopover_staking_info = SingularStakingInfo {
previous_staked: StakeAmount {
voting: 0,
build_and_earn: 100,
era: 2,
period: 1,
},
previous_staked: StakeAmount::default(),
staked: StakeAmount {
voting: 100,
build_and_earn: 200,
Expand Down Expand Up @@ -4278,3 +4273,67 @@ fn active_update_bonus_status() {
);
})
}

// Tests a previous bug where previous_stake was storing future stake amounts (amounts that should be eligible in the next era)
#[test]
fn previous_stake_unchanged_for_future_era_staking() {
ExtBuilder::default()
.with_max_bonus_safe_moves(2)
.build_and_execute(|| {
// Register smart contracts 1 & 2, lock&stake some amount on 1 & 2
let smart_contract = MockSmartContract::wasm(1 as AccountId);
assert_register(1, &smart_contract);

let account = 2;
let amount = 100;
assert_lock(account, amount);

let stake_1 = 10;
let stake_2 = 20;
let stake_era_origin = ActiveProtocolState::<Test>::get().era;
assert_stake(account, &smart_contract, stake_1);
assert_stake(account, &smart_contract, stake_2);

let expected_bonus_status = *BonusStatusWrapperFor::<Test>::default();
let expected_staker_info = SingularStakingInfo {
previous_staked: Default::default(),
staked: StakeAmount {
voting: stake_1 + stake_2,
build_and_earn: 0,
era: stake_era_origin + 1,
period: 1,
},
bonus_status: expected_bonus_status,
};
assert_eq!(
StakerInfo::<Test>::get(&account, &smart_contract),
Some(expected_staker_info)
);

advance_to_next_era();
let stake_era_next = ActiveProtocolState::<Test>::get().era;
let stake_3 = 20;
assert_stake(account, &smart_contract, stake_3);

let expected_bonus_status = *BonusStatusWrapperFor::<Test>::default();
let expected_staker_info = SingularStakingInfo {
previous_staked: StakeAmount {
voting: stake_1 + stake_2,
build_and_earn: 0,
era: stake_era_origin + 1,
period: 1,
},
staked: StakeAmount {
voting: stake_1 + stake_2,
build_and_earn: stake_3,
era: stake_era_next + 1,
period: 1,
},
bonus_status: expected_bonus_status,
};
assert_eq!(
StakerInfo::<Test>::get(&account, &smart_contract),
Some(expected_staker_info)
);
})
}
49 changes: 49 additions & 0 deletions pallets/dapp-staking/src/test/tests_types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2286,6 +2286,55 @@ fn singular_staking_info_basics_are_ok() {
);
}

#[test]
fn singular_previous_stake_is_ok() {
let period_number = 1;
let bonus_status = 0;
let mut staking_info = SingularStakingInfo::new(period_number, bonus_status);

// Add some staked amount during `Build&Earn` period
let era_1 = 7;
let bep_stake_amount_1 = 10;
let stake_amount_1 = StakeAmount {
voting: 0,
build_and_earn: bep_stake_amount_1,
era: era_1,
period: period_number,
};
staking_info.stake(stake_amount_1, era_1, 0);
assert!(staking_info.previous_staked.is_empty());

// Add more staked amount during same era
let bep_stake_amount_2 = 20;
let stake_amount_2 = StakeAmount {
voting: 0,
build_and_earn: bep_stake_amount_2,
era: era_1,
period: period_number,
};
staking_info.stake(stake_amount_2, era_1, 0);
assert!(staking_info.previous_staked.is_empty());

// Add more staked amount during a future era
let era_2 = 17;
let bep_stake_amount_3 = 30;
let stake_amount_3 = StakeAmount {
voting: 0,
build_and_earn: bep_stake_amount_3,
era: era_2,
period: period_number,
};
staking_info.stake(stake_amount_3, era_2, 0);
assert_eq!(
staking_info.previous_staked.total(),
stake_amount_1.total() + stake_amount_2.total()
);
assert_eq!(
staking_info.staked.total(),
stake_amount_1.total() + stake_amount_2.total() + stake_amount_3.total()
);
}

#[test]
fn singular_staking_info_unstake_during_voting_is_ok() {
get_u8_type!(MaxMoves, 1);
Expand Down
2 changes: 1 addition & 1 deletion pallets/dapp-staking/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1123,7 +1123,7 @@ impl SingularStakingInfo {
bonus_status: BonusStatus,
) {
// Keep the previous stake amount for future reference
if self.previous_staked.era < current_era {
if self.staked.era <= current_era {
self.previous_staked = self.staked;
self.previous_staked.era = current_era;
if self.previous_staked.total().is_zero() {
Expand Down

0 comments on commit b625437

Please sign in to comment.