diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 4298a6eced430d378b787d410e638558b88720a7..8f8a7ceef3cfe3d3223ceeb3848a98ae51e94fff 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -992,6 +992,7 @@ impl pallet_collective::Config<CouncilCollective> for Runtime { type MaxMembers = CouncilMaxMembers; type DefaultVote = pallet_collective::PrimeDefaultVote; type WeightInfo = pallet_collective::weights::SubstrateWeight<Runtime>; + type SetMembersOrigin = EnsureRoot<Self::AccountId>; } parameter_types! { @@ -1051,6 +1052,7 @@ impl pallet_collective::Config<TechnicalCollective> for Runtime { type MaxMembers = TechnicalMaxMembers; type DefaultVote = pallet_collective::PrimeDefaultVote; type WeightInfo = pallet_collective::weights::SubstrateWeight<Runtime>; + type SetMembersOrigin = EnsureRoot<Self::AccountId>; } type EnsureRootOrHalfCouncil = EitherOfDiverse< @@ -1652,6 +1654,7 @@ impl pallet_collective::Config<AllianceCollective> for Runtime { type MaxMembers = AllianceMaxMembers; type DefaultVote = pallet_collective::PrimeDefaultVote; type WeightInfo = pallet_collective::weights::SubstrateWeight<Runtime>; + type SetMembersOrigin = EnsureRoot<Self::AccountId>; } parameter_types! { diff --git a/substrate/frame/alliance/src/mock.rs b/substrate/frame/alliance/src/mock.rs index e708d29d529fe1e2ae6e78bdc4f1b31d6fe09b34..0f774dc4853fa03530ddfcc31d022d0e177eb732 100644 --- a/substrate/frame/alliance/src/mock.rs +++ b/substrate/frame/alliance/src/mock.rs @@ -104,6 +104,7 @@ impl pallet_collective::Config<AllianceCollective> for Test { type MaxMembers = MaxMembers; type DefaultVote = pallet_collective::PrimeDefaultVote; type WeightInfo = (); + type SetMembersOrigin = EnsureRoot<Self::AccountId>; } parameter_types! { diff --git a/substrate/frame/collective/src/lib.rs b/substrate/frame/collective/src/lib.rs index 0fe05dbb01ac058efb88c29a411b4280b5a5cc6f..7d625a69a4bf7b4baf216ad45ecbf1e53e902e28 100644 --- a/substrate/frame/collective/src/lib.rs +++ b/substrate/frame/collective/src/lib.rs @@ -215,6 +215,9 @@ pub mod pallet { /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; + + /// Origin allowed to set collective members + type SetMembersOrigin: EnsureOrigin<<Self as frame_system::Config>::RuntimeOrigin>; } #[pallet::genesis_config] @@ -349,7 +352,7 @@ pub mod pallet { /// - `old_count`: The upper bound for the previous number of members in storage. Used for /// weight estimation. /// - /// Requires root origin. + /// The dispatch of this call must be `SetMembersOrigin`. /// /// NOTE: Does not enforce the expected `MaxMembers` limit on the amount of members, but /// the weight estimations rely on it to estimate dispatchable weight. @@ -389,7 +392,7 @@ pub mod pallet { prime: Option<T::AccountId>, old_count: MemberCount, ) -> DispatchResultWithPostInfo { - ensure_root(origin)?; + T::SetMembersOrigin::ensure_origin(origin)?; if new_members.len() > T::MaxMembers::get() as usize { log::error!( target: LOG_TARGET, diff --git a/substrate/frame/collective/src/tests.rs b/substrate/frame/collective/src/tests.rs index 5c90de9f91bf72c7585f7495f9e059a462fdde2e..b7cdeb33833754a99df58736da1ae5a8011eb310 100644 --- a/substrate/frame/collective/src/tests.rs +++ b/substrate/frame/collective/src/tests.rs @@ -24,7 +24,7 @@ use frame_support::{ traits::{ConstU32, ConstU64, GenesisBuild, StorageVersion}, Hashable, }; -use frame_system::{EventRecord, Phase}; +use frame_system::{EnsureRoot, EventRecord, Phase}; use sp_core::H256; use sp_runtime::{ testing::Header, @@ -127,6 +127,7 @@ impl Config<Instance1> for Test { type MaxMembers = MaxMembers; type DefaultVote = PrimeDefaultVote; type WeightInfo = (); + type SetMembersOrigin = EnsureRoot<Self::AccountId>; } impl Config<Instance2> for Test { type RuntimeOrigin = RuntimeOrigin; @@ -137,6 +138,7 @@ impl Config<Instance2> for Test { type MaxMembers = MaxMembers; type DefaultVote = MoreThanMajorityThenPrimeDefaultVote; type WeightInfo = (); + type SetMembersOrigin = EnsureRoot<Self::AccountId>; } impl mock_democracy::Config for Test { type RuntimeEvent = RuntimeEvent; @@ -151,6 +153,7 @@ impl Config for Test { type MaxMembers = MaxMembers; type DefaultVote = PrimeDefaultVote; type WeightInfo = (); + type SetMembersOrigin = EnsureRoot<Self::AccountId>; } pub fn new_test_ext() -> sp_io::TestExternalities { diff --git a/substrate/frame/utility/src/tests.rs b/substrate/frame/utility/src/tests.rs index f9d6a16c1a0d4b6336ee0637ba0fff97bca4f5aa..c63ed24c6aafb9baa6feb3d88f4dcc15d8101773 100644 --- a/substrate/frame/utility/src/tests.rs +++ b/substrate/frame/utility/src/tests.rs @@ -217,6 +217,7 @@ impl pallet_collective::Config<CouncilCollective> for Test { type MaxMembers = MaxMembers; type DefaultVote = pallet_collective::PrimeDefaultVote; type WeightInfo = (); + type SetMembersOrigin = frame_system::EnsureRoot<Self::AccountId>; } impl example::Config for Test {}