Skip to content

Commit f32ab47

Browse files
committed
Fix cont.
1 parent a689b24 commit f32ab47

File tree

3 files changed

+75
-59
lines changed

3 files changed

+75
-59
lines changed

pallets/dapp-staking-v3/src/test/testing_utils.rs

+17-39
Original file line numberDiff line numberDiff line change
@@ -627,17 +627,6 @@ pub(crate) fn assert_unstake(
627627
.expect("Entry must exist since 'unstake' is being called.");
628628
let pre_era_info = pre_snapshot.current_era_info;
629629

630-
// Calculate expected unstake amounts from the voting and build&earn subperiods.
631-
let (expected_voting_unstake, expected_build_and_earn_unstake) =
632-
if pre_staker_info.staked_amount(Subperiod::BuildAndEarn) >= amount {
633-
(Balance::zero(), amount)
634-
} else {
635-
(
636-
amount - pre_staker_info.staked_amount(Subperiod::BuildAndEarn),
637-
pre_staker_info.staked_amount(Subperiod::BuildAndEarn),
638-
)
639-
};
640-
641630
let unstake_period = pre_snapshot.active_protocol_state.period_number();
642631
let unstake_subperiod = pre_snapshot.active_protocol_state.subperiod();
643632

@@ -652,6 +641,17 @@ pub(crate) fn assert_unstake(
652641
amount
653642
};
654643

644+
// Calculate expected unstake amounts from the voting and build&earn subperiods.
645+
let (expected_voting_unstake, expected_build_and_earn_unstake) =
646+
if pre_staker_info.staked_amount(Subperiod::BuildAndEarn) >= amount {
647+
(Balance::zero(), amount)
648+
} else {
649+
(
650+
amount - pre_staker_info.staked_amount(Subperiod::BuildAndEarn),
651+
pre_staker_info.staked_amount(Subperiod::BuildAndEarn),
652+
)
653+
};
654+
655655
// Unstake from smart contract & verify event
656656
assert_ok!(DappStaking::unstake(
657657
RuntimeOrigin::signed(account),
@@ -747,40 +747,18 @@ pub(crate) fn assert_unstake(
747747
.saturating_sub(amount),
748748
"Staked amount must decreased by the 'amount'"
749749
);
750+
750751
assert_eq!(
751-
post_contract_stake.staked.voting,
752-
pre_contract_stake.staked.voting.saturating_sub(expected_voting_unstake),
752+
post_contract_stake.staked_amount(unstake_period, Subperiod::Voting),
753+
pre_contract_stake.staked_amount(unstake_period, Subperiod::Voting) - expected_voting_unstake,
753754
"Voting stake amount must be decreased exactly by how much staker's voting amount was reduced."
754755
);
755-
756756
assert_eq!(
757-
post_contract_stake.staked.build_and_earn,
758-
pre_contract_stake
759-
.staked
760-
.build_and_earn
761-
.saturating_sub(expected_build_and_earn_unstake),
757+
post_contract_stake.staked_amount(unstake_period, Subperiod::BuildAndEarn),
758+
pre_contract_stake.staked_amount(unstake_period, Subperiod::BuildAndEarn)
759+
- expected_build_and_earn_unstake,
762760
"B&E stake amount must be decreased exactly by how much staker's B&E amount was reduced."
763761
);
764-
match (
765-
pre_contract_stake.staked_future,
766-
post_contract_stake.staked_future,
767-
) {
768-
(Some(pre_future), Some(post_future)) => {
769-
assert_eq!(
770-
post_future.voting,
771-
pre_future.voting.saturating_sub(expected_voting_unstake),
772-
"Voting stake amount must be decreased exactly by how much staker's voting amount was reduced."
773-
);
774-
assert_eq!(
775-
post_future.build_and_earn,
776-
pre_future
777-
.build_and_earn
778-
.saturating_sub(expected_build_and_earn_unstake),
779-
"B&E stake amount must be decreased exactly by how much staker's B&E amount was reduced."
780-
);
781-
}
782-
(_, _) => {}
783-
}
784762

785763
// 4. verify era info
786764
// =========================

pallets/dapp-staking-v3/src/test/tests_types.rs

+48-15
Original file line numberDiff line numberDiff line change
@@ -2430,32 +2430,42 @@ fn contract_stake_amount_stake_is_ok() {
24302430
assert!(contract_stake.staked_future.is_some());
24312431
}
24322432

2433-
// TODO: improve this a bit
24342433
#[test]
24352434
fn contract_stake_amount_unstake_is_ok() {
24362435
let mut contract_stake = ContractStakeAmount::default();
24372436

24382437
// Prep action - create a stake entry
24392438
let era_1 = 2;
2439+
let era_2 = era_1 + 1;
24402440
let period = 3;
24412441
let period_info = PeriodInfo {
24422442
number: period,
24432443
subperiod: Subperiod::Voting,
24442444
next_subperiod_start_era: 20,
24452445
};
2446-
let stake_amount = 100;
2447-
contract_stake.stake(stake_amount, period_info, era_1);
2446+
let vp_stake_amount = 47;
2447+
let bep_stake_amount = 53;
2448+
contract_stake.stake(vp_stake_amount, period_info, era_1);
2449+
contract_stake.stake(
2450+
bep_stake_amount,
2451+
PeriodInfo {
2452+
subperiod: Subperiod::BuildAndEarn,
2453+
..period_info
2454+
},
2455+
era_1,
2456+
);
2457+
let total_stake_amount = vp_stake_amount + bep_stake_amount;
24482458

2449-
// 1st scenario - unstake in the same era
2459+
// 1st scenario - unstake in the same era, from `Voting` subperiod
24502460
let amount_1 = 5;
24512461
contract_stake.unstake(amount_1, 0, period_info, era_1);
24522462
assert_eq!(
24532463
contract_stake.total_staked_amount(period),
2454-
stake_amount - amount_1
2464+
total_stake_amount - amount_1
24552465
);
24562466
assert_eq!(
24572467
contract_stake.staked_amount(period, Subperiod::Voting),
2458-
stake_amount - amount_1
2468+
vp_stake_amount - amount_1
24592469
);
24602470
assert!(contract_stake.staked.is_empty());
24612471
assert!(contract_stake.staked_future.is_some());
@@ -2466,16 +2476,20 @@ fn contract_stake_amount_unstake_is_ok() {
24662476
subperiod: Subperiod::BuildAndEarn,
24672477
next_subperiod_start_era: 40,
24682478
};
2469-
let era_2 = era_1 + 1;
24702479

2471-
contract_stake.unstake(0, amount_1, period_info, era_2);
2480+
contract_stake.unstake(amount_1, 0, period_info, era_2);
24722481
assert_eq!(
24732482
contract_stake.total_staked_amount(period),
2474-
stake_amount - amount_1 * 2
2483+
total_stake_amount - amount_1 * 2
24752484
);
24762485
assert_eq!(
24772486
contract_stake.staked_amount(period, Subperiod::Voting),
2478-
stake_amount - amount_1 * 2
2487+
vp_stake_amount - amount_1 * 2
2488+
);
2489+
assert_eq!(
2490+
contract_stake.staked_amount(period, Subperiod::BuildAndEarn),
2491+
bep_stake_amount,
2492+
"Must remain unchanged."
24792493
);
24802494
assert!(
24812495
!contract_stake.staked.is_empty(),
@@ -2486,17 +2500,36 @@ fn contract_stake_amount_unstake_is_ok() {
24862500
"future entry should be cleaned up since it refers to the current era"
24872501
);
24882502

2489-
// 3rd scenario - bump up unstake eras by more than 1, entries should be aligned to the current era
2503+
// 3rd scenario - same as previous scenario, but for `BuildAndEarn` subperiod
2504+
contract_stake.unstake(0, amount_1, period_info, era_2);
2505+
assert_eq!(
2506+
contract_stake.total_staked_amount(period),
2507+
total_stake_amount - amount_1 * 3
2508+
);
2509+
assert_eq!(
2510+
contract_stake.staked_amount(period, Subperiod::Voting),
2511+
vp_stake_amount - amount_1 * 2
2512+
);
2513+
assert_eq!(
2514+
contract_stake.staked_amount(period, Subperiod::BuildAndEarn),
2515+
bep_stake_amount - amount_1
2516+
);
2517+
2518+
// 4th scenario - bump up unstake eras by more than 1, entries should be aligned to the current era
24902519
let era_3 = era_2 + 3;
24912520
let amount_2 = 7;
24922521
contract_stake.unstake(0, amount_2, period_info, era_3);
24932522
assert_eq!(
24942523
contract_stake.total_staked_amount(period),
2495-
stake_amount - amount_1 * 2 - amount_2
2524+
total_stake_amount - amount_1 * 3 - amount_2
24962525
);
24972526
assert_eq!(
24982527
contract_stake.staked_amount(period, Subperiod::Voting),
2499-
stake_amount - amount_1 * 2 - amount_2
2528+
vp_stake_amount - amount_1 * 2
2529+
);
2530+
assert_eq!(
2531+
contract_stake.staked_amount(period, Subperiod::BuildAndEarn),
2532+
bep_stake_amount - amount_1 - amount_2
25002533
);
25012534
assert_eq!(
25022535
contract_stake.staked.era, era_3,
@@ -2507,8 +2540,8 @@ fn contract_stake_amount_unstake_is_ok() {
25072540
"future entry should remain 'None'"
25082541
);
25092542

2510-
// 4th scenario - do a full unstake with existing future entry, expect a cleanup
2511-
contract_stake.stake(stake_amount, period_info, era_3);
2543+
// 5th scenario - do a full unstake with existing future entry, expect a cleanup
2544+
contract_stake.stake(total_stake_amount, period_info, era_3);
25122545
contract_stake.unstake(
25132546
contract_stake.staked_amount(period, Subperiod::Voting),
25142547
contract_stake.staked_amount(period, Subperiod::BuildAndEarn),

pallets/dapp-staking-v3/src/types.rs

+10-5
Original file line numberDiff line numberDiff line change
@@ -882,6 +882,13 @@ impl StakeAmount {
882882
}
883883
}
884884
}
885+
886+
/// Saturating reduce the specified `amount` from the appropriate subperiod.
887+
/// If the amount is larger than the subperiod amount, the subperiod amount is set to zero.
888+
pub fn subtract_subperiods(&mut self, voting_amount: Balance, bep_amount: Balance) {
889+
self.voting.saturating_reduce(voting_amount);
890+
self.build_and_earn.saturating_reduce(bep_amount);
891+
}
885892
}
886893

887894
/// Info about an era, including the rewards, how much is locked, unlocking, etc.
@@ -1198,7 +1205,7 @@ impl ContractStakeAmount {
11981205
}
11991206
}
12001207

1201-
/// Unstake the specified `amount` from the contract, for the specified `subperiod` and `era`.
1208+
/// Unstake the specified `Voting` and `Build&Earn` subperiod amounts from the contract, for the specified `subperiod` and `era`.
12021209
pub fn unstake(
12031210
&mut self,
12041211
voting_amount: Balance,
@@ -1225,11 +1232,9 @@ impl ContractStakeAmount {
12251232
}
12261233

12271234
// Subtract both amounts
1228-
self.staked.voting.saturating_reduce(voting_amount);
1229-
self.staked.build_and_earn.saturating_reduce(bep_amount);
1235+
self.staked.subtract_subperiods(voting_amount, bep_amount);
12301236
if let Some(stake_amount) = self.staked_future.as_mut() {
1231-
stake_amount.voting.saturating_reduce(voting_amount);
1232-
stake_amount.build_and_earn.saturating_reduce(bep_amount);
1237+
stake_amount.subtract_subperiods(voting_amount, bep_amount);
12331238
}
12341239

12351240
// Convenience cleanup

0 commit comments

Comments
 (0)