mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-18 17:41:01 +00:00
Adds integration test for slashed/chilled validator with subsequent validation intention (#13717)
* Adds integration test for slashed/chilled validator with subsequent validation intention * Removes unecessary comment * Update frame/election-provider-multi-phase/test-staking-e2e/src/lib.rs Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> * Update frame/election-provider-multi-phase/test-staking-e2e/src/lib.rs Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> * Addresses PR review comments * Fixes after conflict resolved --------- Co-authored-by: parity-processbot <> Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>
This commit is contained in:
@@ -20,6 +20,7 @@ mod mock;
|
||||
|
||||
pub(crate) const LOG_TARGET: &str = "tests::e2e-epm";
|
||||
|
||||
use frame_support::assert_ok;
|
||||
use mock::*;
|
||||
use sp_core::Get;
|
||||
use sp_npos_elections::{to_supports, StakedAssignment};
|
||||
@@ -204,3 +205,72 @@ fn continous_slashes_below_offending_threshold() {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
/// When validators are slashed, they are chilled and removed from the current `VoterList`. Thus,
|
||||
/// the slashed validator should not be considered in the next validator set. However, if the
|
||||
/// slashed validator sets its intention to validate again in the same era when it was slashed and
|
||||
/// chilled, the validator may not be removed from the active validator set across eras, provided
|
||||
/// it would selected in the subsequent era if there was no slash. Nominators of the slashed
|
||||
/// validator will also be slashed and chilled, as expected, but the nomination intentions will
|
||||
/// remain after the validator re-set the intention to be validating again.
|
||||
///
|
||||
/// This behaviour is due to removing implicit chill upon slash
|
||||
/// <https://github.com/paritytech/substrate/pull/12420>.
|
||||
///
|
||||
/// Related to <https://github.com/paritytech/substrate/issues/13714>.
|
||||
fn set_validation_intention_after_chilled() {
|
||||
use frame_election_provider_support::SortedListProvider;
|
||||
use pallet_staking::{Event, Forcing, Nominators};
|
||||
|
||||
let staking_builder = StakingExtBuilder::default();
|
||||
let epm_builder = EpmExtBuilder::default();
|
||||
|
||||
ExtBuilder::default()
|
||||
.staking(staking_builder)
|
||||
.epm(epm_builder)
|
||||
.build_and_execute(|| {
|
||||
assert_eq!(active_era(), 0);
|
||||
// validator is part of the validator set.
|
||||
assert!(Session::validators().contains(&81));
|
||||
assert!(<Runtime as pallet_staking::Config>::VoterList::contains(&81));
|
||||
|
||||
// nominate validator 81.
|
||||
assert_ok!(Staking::nominate(RuntimeOrigin::signed(21), vec![81]));
|
||||
assert_eq!(Nominators::<Runtime>::get(21).unwrap().targets, vec![81]);
|
||||
|
||||
// validator is slashed. it is removed from the `VoterList` through chilling but in the
|
||||
// current era, the validator is still part of the active validator set.
|
||||
add_slash(&81);
|
||||
assert!(Session::validators().contains(&81));
|
||||
assert!(!<Runtime as pallet_staking::Config>::VoterList::contains(&81));
|
||||
assert_eq!(
|
||||
staking_events(),
|
||||
[
|
||||
Event::Chilled { stash: 81 },
|
||||
Event::ForceEra { mode: Forcing::ForceNew },
|
||||
Event::SlashReported {
|
||||
validator: 81,
|
||||
slash_era: 0,
|
||||
fraction: Perbill::from_percent(10)
|
||||
}
|
||||
],
|
||||
);
|
||||
|
||||
// after the nominator is slashed and chilled, the nominations remain.
|
||||
assert_eq!(Nominators::<Runtime>::get(21).unwrap().targets, vec![81]);
|
||||
|
||||
// validator sets intention to stake again in the same era it was chilled.
|
||||
assert_ok!(Staking::validate(RuntimeOrigin::signed(81), Default::default()));
|
||||
|
||||
// progress era and check that the slashed validator is still part of the validator
|
||||
// set.
|
||||
assert!(start_next_active_era().is_ok());
|
||||
assert_eq!(active_era(), 1);
|
||||
assert!(Session::validators().contains(&81));
|
||||
assert!(<Runtime as pallet_staking::Config>::VoterList::contains(&81));
|
||||
|
||||
// nominations are still active as before the slash.
|
||||
assert_eq!(Nominators::<Runtime>::get(21).unwrap().targets, vec![81]);
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user