Avoid challenging those that can't be suspended anyway (#4804)

* Merge branch 'gav-split-balanecs-vesting' into gav-upsub

# Conflicts:
#	Cargo.lock
#	cli/Cargo.toml
#	collator/Cargo.toml
#	primitives/Cargo.toml
#	runtime/common/Cargo.toml
#	runtime/common/src/claims.rs
#	runtime/kusama/Cargo.toml
#	runtime/polkadot/Cargo.toml
#	service/Cargo.toml

* Fix tests
This commit is contained in:
Gavin Wood
2020-02-10 14:04:50 +01:00
committed by GitHub
parent 5aa5c71107
commit aff0445b24
2 changed files with 25 additions and 19 deletions
+18 -12
View File
@@ -1536,18 +1536,24 @@ impl<T: Trait<I>, I: Instance> Module<T, I> {
<DefenderVotes<T, I>>::remove_all(); <DefenderVotes<T, I>>::remove_all();
} }
// Start a new defender rotation // Avoid challenging if there's only two members since we never challenge the Head or
let phrase = b"society_challenge"; // the Founder.
// we'll need a random seed here. if members.len() > 2 {
let seed = T::Randomness::random(phrase); // Start a new defender rotation
// seed needs to be guaranteed to be 32 bytes. let phrase = b"society_challenge";
let seed = <[u8; 32]>::decode(&mut TrailingZeroInput::new(seed.as_ref())) // we'll need a random seed here.
.expect("input is padded with zeroes; qed"); let seed = T::Randomness::random(phrase);
let mut rng = ChaChaRng::from_seed(seed); // seed needs to be guaranteed to be 32 bytes.
let chosen = pick_item(&mut rng, &members).expect("exited if members empty; qed"); let seed = <[u8; 32]>::decode(&mut TrailingZeroInput::new(seed.as_ref()))
.expect("input is padded with zeroes; qed");
<Defender<T, I>>::put(&chosen); let mut rng = ChaChaRng::from_seed(seed);
Self::deposit_event(RawEvent::Challenged(chosen.clone())); let chosen = pick_item(&mut rng, &members[1..members.len() - 1])
.expect("exited if members empty; qed");
<Defender<T, I>>::put(&chosen);
Self::deposit_event(RawEvent::Challenged(chosen.clone()));
} else {
<Defender<T, I>>::kill();
}
} }
} }
+7 -7
View File
@@ -577,14 +577,14 @@ fn challenges_work() {
assert_eq!(Society::defender(), None); assert_eq!(Society::defender(), None);
// 20 will be challenged during the challenge rotation // 20 will be challenged during the challenge rotation
run_to_block(8); run_to_block(8);
assert_eq!(Society::defender(), Some(20)); assert_eq!(Society::defender(), Some(30));
// They can always free vote for themselves // They can always free vote for themselves
assert_ok!(Society::defender_vote(Origin::signed(20), true)); assert_ok!(Society::defender_vote(Origin::signed(30), true));
// If no one else votes, nothing happens // If no one else votes, nothing happens
run_to_block(16); run_to_block(16);
assert_eq!(Society::members(), vec![10, 20, 30, 40]); assert_eq!(Society::members(), vec![10, 20, 30, 40]);
// New challenge period // New challenge period
assert_eq!(Society::defender(), Some(20)); assert_eq!(Society::defender(), Some(30));
// Non-member cannot challenge // Non-member cannot challenge
assert_noop!(Society::defender_vote(Origin::signed(1), true), Error::<Test, _>::NotMember); assert_noop!(Society::defender_vote(Origin::signed(1), true), Error::<Test, _>::NotMember);
// 3 people say accept, 1 reject // 3 people say accept, 1 reject
@@ -601,7 +601,7 @@ fn challenges_work() {
assert_eq!(<DefenderVotes<Test>>::get(30), None); assert_eq!(<DefenderVotes<Test>>::get(30), None);
assert_eq!(<DefenderVotes<Test>>::get(40), None); assert_eq!(<DefenderVotes<Test>>::get(40), None);
// One more time // One more time
assert_eq!(Society::defender(), Some(20)); assert_eq!(Society::defender(), Some(30));
// 2 people say accept, 2 reject // 2 people say accept, 2 reject
assert_ok!(Society::defender_vote(Origin::signed(10), true)); assert_ok!(Society::defender_vote(Origin::signed(10), true));
assert_ok!(Society::defender_vote(Origin::signed(20), true)); assert_ok!(Society::defender_vote(Origin::signed(20), true));
@@ -609,10 +609,10 @@ fn challenges_work() {
assert_ok!(Society::defender_vote(Origin::signed(40), false)); assert_ok!(Society::defender_vote(Origin::signed(40), false));
run_to_block(32); run_to_block(32);
// 20 is suspended // 20 is suspended
assert_eq!(Society::members(), vec![10, 30, 40]); assert_eq!(Society::members(), vec![10, 20, 40]);
assert_eq!(Society::suspended_member(20), true); assert_eq!(Society::suspended_member(30), true);
// New defender is chosen // New defender is chosen
assert_eq!(Society::defender(), Some(40)); assert_eq!(Society::defender(), Some(20));
// Votes are reset // Votes are reset
assert_eq!(<DefenderVotes<Test>>::get(10), None); assert_eq!(<DefenderVotes<Test>>::get(10), None);
assert_eq!(<DefenderVotes<Test>>::get(20), None); assert_eq!(<DefenderVotes<Test>>::get(20), None);