From 28bc39de859f95350139ec7f35681ddd266e5bc1 Mon Sep 17 00:00:00 2001 From: Zeke Mostov <32168567+emostov@users.noreply.github.com> Date: Tue, 13 Jul 2021 01:01:11 -0700 Subject: [PATCH] Check for duplicate members in genesis of pallet-membership & pallet-collective (#9325) * Ensure no duplicate members in collective and membership genesis * Test build panics * Massage comments * Use btreeset --- substrate/frame/collective/src/lib.rs | 17 ++++++++++++++++- substrate/frame/membership/src/lib.rs | 14 ++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/substrate/frame/collective/src/lib.rs b/substrate/frame/collective/src/lib.rs index 00e976bfb9..a6e44b96fe 100644 --- a/substrate/frame/collective/src/lib.rs +++ b/substrate/frame/collective/src/lib.rs @@ -211,7 +211,13 @@ decl_storage! { add_extra_genesis { config(phantom): sp_std::marker::PhantomData; config(members): Vec; - build(|config| Module::::initialize_members(&config.members)) + build(|config| { + use sp_std::collections::btree_set::BTreeSet; + let members_set: BTreeSet<_> = config.members.iter().collect(); + assert!(members_set.len() == config.members.len(), "Members cannot contain duplicate accounts."); + + Module::::initialize_members(&config.members) + }); } } @@ -1837,4 +1843,13 @@ mod tests { ]); }) } + + #[test] + #[should_panic(expected = "Members cannot contain duplicate accounts.")] + fn genesis_build_panics_with_duplicate_members() { + collective::GenesisConfig:: { + members: vec![1, 2, 3, 1], + phantom: Default::default(), + }.build_storage().unwrap(); + } } diff --git a/substrate/frame/membership/src/lib.rs b/substrate/frame/membership/src/lib.rs index 0d95af4e6f..c834ed2365 100644 --- a/substrate/frame/membership/src/lib.rs +++ b/substrate/frame/membership/src/lib.rs @@ -84,6 +84,11 @@ decl_storage! { config(phantom): sp_std::marker::PhantomData; build(|config: &Self| { let mut members = config.members.clone(); + + use sp_std::collections::btree_set::BTreeSet; + let members_set: BTreeSet<_> = config.members.iter().collect(); + assert!(members_set.len() == config.members.len(), "Members cannot contain duplicate accounts."); + members.sort(); T::MembershipInitialized::initialize_members(&members); >::put(members); @@ -706,4 +711,13 @@ mod tests { assert_eq!(PRIME.with(|m| *m.borrow()), Membership::prime()); }); } + + #[test] + #[should_panic(expected = "Members cannot contain duplicate accounts.")] + fn genesis_build_panics_with_duplicate_members() { + pallet_membership::GenesisConfig:: { + members: vec![1, 2, 3, 1], + phantom: Default::default(), + }.build_storage().unwrap(); + } }