Make sure that srml-collective does not initialize Members twice (#3379)

* Make sure that `srml-collective` does not initialize `Members` twice

* Implement trait for `()`

* Fix test
This commit is contained in:
Bastian Köcher
2019-08-13 20:40:30 +02:00
committed by Gavin Wood
parent 7f764dbd37
commit 0c941d66cb
3 changed files with 42 additions and 8 deletions
+23 -3
View File
@@ -28,8 +28,9 @@ use primitives::u32_trait::Value as U32;
use sr_primitives::traits::{Hash, EnsureOrigin};
use sr_primitives::weights::SimpleDispatchInfo;
use srml_support::{
dispatch::{Dispatchable, Parameter}, codec::{Encode, Decode}, traits::ChangeMembers,
StorageValue, StorageMap, decl_module, decl_event, decl_storage, ensure
dispatch::{Dispatchable, Parameter}, codec::{Encode, Decode},
traits::{ChangeMembers, InitializeMembers}, StorageValue, StorageMap, decl_module, decl_event,
decl_storage, ensure,
};
use system::{self, ensure_signed, ensure_root};
@@ -93,10 +94,20 @@ decl_storage! {
/// Proposals so far.
pub ProposalCount get(proposal_count): u32;
/// The current members of the collective. This is stored sorted (just by value).
pub Members get(members) config(): Vec<T::AccountId>;
pub Members get(members): Vec<T::AccountId>;
}
add_extra_genesis {
config(phantom): rstd::marker::PhantomData<I>;
config(members): Vec<T::AccountId>;
build(|
storage: &mut (sr_primitives::StorageOverlay, sr_primitives::ChildrenStorageOverlay),
config: &Self,
| {
runtime_io::with_storage(
storage,
|| Module::<T, I>::initialize_members(&config.members),
);
})
}
}
@@ -282,6 +293,15 @@ impl<T: Trait<I>, I: Instance> ChangeMembers<T::AccountId> for Module<T, I> {
}
}
impl<T: Trait<I>, I: Instance> InitializeMembers<T::AccountId> for Module<T, I> {
fn initialize_members(members: &[T::AccountId]) {
if !members.is_empty() {
assert!(<Members<T, I>>::get().is_empty(), "Members are already initialized!");
<Members<T, I>>::put_ref(members);
}
}
}
/// Ensure that the origin `o` represents at least `n` members. Returns `Ok` or an `Err`
/// otherwise.
pub fn ensure_members<OuterOrigin, AccountId, I>(o: OuterOrigin, n: MemberCount)