mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 11:41:02 +00:00
Sort members in elections-phragmen genesis (#5522)
* Sort members in elections-phragmen genesis * panic if duplicate member * print duplicate member
This commit is contained in:
@@ -185,8 +185,12 @@ decl_storage! {
|
|||||||
// Note: all members will only vote for themselves, hence they must be given exactly
|
// Note: all members will only vote for themselves, hence they must be given exactly
|
||||||
// their own stake as total backing. Any sane election should behave as such.
|
// their own stake as total backing. Any sane election should behave as such.
|
||||||
// Nonetheless, stakes will be updated for term 1 onwards according to the election.
|
// Nonetheless, stakes will be updated for term 1 onwards according to the election.
|
||||||
<Members<T>>::append(&[(member.clone(), *stake)])
|
Members::<T>::mutate(|members| {
|
||||||
.expect("Failed to append genesis members.");
|
match members.binary_search_by(|(a, _b)| a.cmp(member)) {
|
||||||
|
Ok(_) => panic!("Duplicate member in elections phragmen genesis: {}", member),
|
||||||
|
Err(pos) => members.insert(pos, (member.clone(), *stake)),
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// set self-votes to make persistent.
|
// set self-votes to make persistent.
|
||||||
<Module<T>>::vote(
|
<Module<T>>::vote(
|
||||||
@@ -759,7 +763,7 @@ impl<T: Trait> Module<T> {
|
|||||||
let mut new_members = (&new_set_with_stake[..split_point]).to_vec();
|
let mut new_members = (&new_set_with_stake[..split_point]).to_vec();
|
||||||
|
|
||||||
// save the runners up as-is. They are sorted based on desirability.
|
// save the runners up as-is. They are sorted based on desirability.
|
||||||
// sort and save the members.
|
// save the members, sorted based on account id.
|
||||||
new_members.sort_by(|i, j| i.0.cmp(&j.0));
|
new_members.sort_by(|i, j| i.0.cmp(&j.0));
|
||||||
|
|
||||||
let mut prime_votes: Vec<_> = new_members.iter().map(|c| (&c.0, BalanceOf::<T>::zero())).collect();
|
let mut prime_votes: Vec<_> = new_members.iter().map(|c| (&c.0, BalanceOf::<T>::zero())).collect();
|
||||||
@@ -1154,6 +1158,23 @@ mod tests {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn genesis_members_unsorted_should_work() {
|
||||||
|
ExtBuilder::default().genesis_members(vec![(2, 20), (1, 10)]).build().execute_with(|| {
|
||||||
|
System::set_block_number(1);
|
||||||
|
assert_eq!(Elections::members(), vec![(1, 10), (2, 20)]);
|
||||||
|
|
||||||
|
assert_eq!(Elections::voting(1), (10, vec![1]));
|
||||||
|
assert_eq!(Elections::voting(2), (20, vec![2]));
|
||||||
|
|
||||||
|
// they will persist since they have self vote.
|
||||||
|
System::set_block_number(5);
|
||||||
|
assert_ok!(Elections::end_block(System::block_number()));
|
||||||
|
|
||||||
|
assert_eq!(Elections::members_ids(), vec![1, 2]);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[should_panic = "Genesis member does not have enough stake"]
|
#[should_panic = "Genesis member does not have enough stake"]
|
||||||
fn genesis_members_cannot_over_stake_0() {
|
fn genesis_members_cannot_over_stake_0() {
|
||||||
@@ -1168,6 +1189,12 @@ mod tests {
|
|||||||
ExtBuilder::default().voter_bond(20).genesis_members(vec![(1, 10), (2, 20)]).build();
|
ExtBuilder::default().voter_bond(20).genesis_members(vec![(1, 10), (2, 20)]).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic = "Duplicate member in elections phragmen genesis: 2"]
|
||||||
|
fn genesis_members_cannot_be_duplicate() {
|
||||||
|
ExtBuilder::default().genesis_members(vec![(1, 10), (2, 10), (2, 10)]).build();
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn term_duration_zero_is_passive() {
|
fn term_duration_zero_is_passive() {
|
||||||
ExtBuilder::default()
|
ExtBuilder::default()
|
||||||
|
|||||||
Reference in New Issue
Block a user