From a6ddb55df6e966a35efda939a723abaab3b78b8d Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Fri, 31 Jul 2020 14:22:52 +0200 Subject: [PATCH] pips: flesh out `ensure_signed_by` re. committees. Add dummy technical & upgrade committees. --- pallets/pips/src/lib.rs | 17 +++++++-- pallets/runtime/develop/src/lib.rs | 4 ++ pallets/runtime/develop/src/runtime.rs | 44 ++++++++++++++++++++-- pallets/runtime/testnet-v1/src/runtime.rs | 43 +++++++++++++++++++++- src/chain_spec.rs | 45 +++++++++++++++++++++++ 5 files changed, 144 insertions(+), 9 deletions(-) diff --git a/pallets/pips/src/lib.rs b/pallets/pips/src/lib.rs index 5b409325b9..1ff4e3914b 100644 --- a/pallets/pips/src/lib.rs +++ b/pallets/pips/src/lib.rs @@ -309,6 +309,12 @@ pub trait Trait: /// Committee type GovernanceCommittee: GovernanceGroupTrait<::Moment>; + /// Voting majority origin for Technical Committee. + type TechnicalCommitteeVMO: EnsureOrigin; + + /// Voting majority origin for Upgrade Committee. + type UpgradeCommitteeVMO: EnsureOrigin; + type Treasury: TreasuryTrait<::Balance>; /// The overarching event type. @@ -928,7 +934,7 @@ decl_module! { // Only keep pending PIPs. .filter(|pip| matches!(pip.state, ProposalState::Pending)) .map(|pip| pip.id) - // Omit cooling-off community PIPs. + // Only keep community PIPs not cooling-off. .filter(|id| { >::get(id) .filter(|meta| meta.cool_off_until > created_at) @@ -1046,9 +1052,12 @@ impl Module { Proposer::Community(acc) => { ensure!(acc == &ensure_signed(origin)?, Error::::BadOrigin) } - // TODO(centril): add actual checks for committees. - Proposer::Committee(Committee::Technical) => todo!(), - Proposer::Committee(Committee::Upgrade) => todo!(), + Proposer::Committee(Committee::Technical) => { + T::TechnicalCommitteeVMO::ensure_origin(origin)?; + } + Proposer::Committee(Committee::Upgrade) => { + T::UpgradeCommitteeVMO::ensure_origin(origin)?; + } } Ok(()) } diff --git a/pallets/runtime/develop/src/lib.rs b/pallets/runtime/develop/src/lib.rs index 9b45bb8ac9..f2e2f75d32 100644 --- a/pallets/runtime/develop/src/lib.rs +++ b/pallets/runtime/develop/src/lib.rs @@ -35,6 +35,10 @@ pub mod config { pub type StakingConfig = pallet_staking::GenesisConfig; pub type PolymeshCommitteeConfig = committee::GenesisConfig; + pub type TechnicalCommitteeConfig = + committee::GenesisConfig; + pub type UpgradeCommitteeConfig = + committee::GenesisConfig; pub type PipsConfig = pallet_pips::GenesisConfig; pub type ContractsConfig = pallet_contracts::GenesisConfig; pub type IndicesConfig = pallet_indices::GenesisConfig; diff --git a/pallets/runtime/develop/src/runtime.rs b/pallets/runtime/develop/src/runtime.rs index d84158db6a..730f09c229 100644 --- a/pallets/runtime/develop/src/runtime.rs +++ b/pallets/runtime/develop/src/runtime.rs @@ -374,6 +374,10 @@ impl pallet_staking::Trait for Runtime { parameter_types! { pub const MotionDuration: BlockNumber = 0; } + +/// Voting majority origin for `Instance`. +type VMO = committee::EnsureProportionAtLeast<_1, _2, AccountId, Instance>; + type GovernanceCommittee = committee::Instance1; impl committee::Trait for Runtime { type Origin = Origin; @@ -383,7 +387,6 @@ impl committee::Trait for Runtime { type MotionDuration = MotionDuration; type EnactProposalMaker = Runtime; } - /// PolymeshCommittee as an instance of group impl group::Trait for Runtime { type Event = Event; @@ -395,12 +398,41 @@ impl group::Trait for Runtime { type MembershipChanged = PolymeshCommittee; } +macro_rules! committee_config { + ($committee:ident, $instance:ident) => { + impl committee::Trait for Runtime { + type Origin = Origin; + type Proposal = Call; + // Can act upon itself. + type CommitteeOrigin = VMO; + type Event = Event; + type MotionDuration = MotionDuration; + type EnactProposalMaker = Runtime; + } + impl group::Trait for Runtime { + type Event = Event; + // Can manage its own addition, deletion, and swapping of membership... + type AddOrigin = VMO; + type RemoveOrigin = VMO; + type SwapOrigin = VMO; + // ...but it cannot reset its own membership; GC needs to do that. + type ResetOrigin = VMO; + type MembershipInitialized = $committee; + type MembershipChanged = $committee; + } + }; +} + +committee_config!(TechnicalCommittee, Instance3); +committee_config!(UpgradeCommittee, Instance4); + impl pallet_pips::Trait for Runtime { type Currency = Balances; type CommitteeOrigin = frame_system::EnsureRoot; - type VotingMajorityOrigin = - committee::EnsureProportionAtLeast<_1, _2, AccountId, GovernanceCommittee>; + type VotingMajorityOrigin = VMO; type GovernanceCommittee = PolymeshCommittee; + type TechnicalCommitteeVMO = VMO; + type UpgradeCommitteeVMO = VMO; type Treasury = Treasury; type Event = Event; } @@ -749,6 +781,12 @@ construct_runtime!( CommitteeMembership: group::::{Module, Call, Storage, Event, Config}, Pips: pallet_pips::{Module, Call, Storage, Event, Config}, + TechnicalCommittee: committee::::{Module, Call, Storage, Origin, Event, Config}, + TechnicalCommitteeMembership: group::::{Module, Call, Storage, Event, Config}, + + UpgradeCommittee: committee::::{Module, Call, Storage, Origin, Event, Config}, + UpgradeCommitteeMembership: group::::{Module, Call, Storage, Event, Config}, + //Polymesh Asset: asset::{Module, Call, Storage, Config, Event}, Dividend: dividend::{Module, Call, Storage, Event}, diff --git a/pallets/runtime/testnet-v1/src/runtime.rs b/pallets/runtime/testnet-v1/src/runtime.rs index 15d8cffd2b..3d2da61324 100644 --- a/pallets/runtime/testnet-v1/src/runtime.rs +++ b/pallets/runtime/testnet-v1/src/runtime.rs @@ -373,6 +373,10 @@ impl pallet_staking::Trait for Runtime { parameter_types! { pub const MotionDuration: BlockNumber = 0; } + +/// Voting majority origin for `Instance`. +type VMO = committee::EnsureProportionAtLeast<_2, _3, AccountId, Instance>; + type GovernanceCommittee = committee::Instance1; impl committee::Trait for Runtime { type Origin = Origin; @@ -394,12 +398,41 @@ impl group::Trait for Runtime { type MembershipChanged = PolymeshCommittee; } +macro_rules! committee_config { + ($committee:ident, $instance:ident) => { + impl committee::Trait for Runtime { + type Origin = Origin; + type Proposal = Call; + // Can act upon itself. + type CommitteeOrigin = VMO; + type Event = Event; + type MotionDuration = MotionDuration; + type EnactProposalMaker = Runtime; + } + impl group::Trait for Runtime { + type Event = Event; + // Can manage its own addition, deletion, and swapping of membership... + type AddOrigin = VMO; + type RemoveOrigin = VMO; + type SwapOrigin = VMO; + // ...but it cannot reset its own membership; GC needs to do that. + type ResetOrigin = VMO; + type MembershipInitialized = $committee; + type MembershipChanged = $committee; + } + }; +} + +committee_config!(TechnicalCommittee, Instance3); +committee_config!(UpgradeCommittee, Instance4); + impl pallet_pips::Trait for Runtime { type Currency = Balances; type CommitteeOrigin = frame_system::EnsureRoot; - type VotingMajorityOrigin = - committee::EnsureProportionAtLeast<_2, _3, AccountId, GovernanceCommittee>; + type VotingMajorityOrigin = VMO; type GovernanceCommittee = PolymeshCommittee; + type TechnicalCommitteeVMO = VMO; + type UpgradeCommitteeVMO = VMO; type Treasury = Treasury; type Event = Event; } @@ -720,6 +753,12 @@ construct_runtime!( CommitteeMembership: group::::{Module, Call, Storage, Event, Config}, Pips: pallet_pips::{Module, Call, Storage, Event, Config}, + TechnicalCommittee: committee::::{Module, Call, Storage, Origin, Event, Config}, + TechnicalCommitteeMembership: group::::{Module, Call, Storage, Event, Config}, + + UpgradeCommittee: committee::::{Module, Call, Storage, Origin, Event, Config}, + UpgradeCommitteeMembership: group::::{Module, Call, Storage, Event, Config}, + //Polymesh Asset: asset::{Module, Call, Storage, Config, Event}, Dividend: dividend::{Module, Call, Storage, Event}, diff --git a/src/chain_spec.rs b/src/chain_spec.rs index 820a7d9d59..0d622859fc 100644 --- a/src/chain_spec.rs +++ b/src/chain_spec.rs @@ -313,6 +313,7 @@ fn general_testnet_genesis( ..Default::default() }, }), + // Governance Council: group_Instance1: Some(general::runtime::CommitteeMembershipConfig { active_members: vec![ IdentityId::from(3), @@ -337,6 +338,28 @@ fn general_testnet_genesis( ], phantom: Default::default(), }), + // Technical Committee: + group_Instance3: Some(general::runtime::TechnicalCommitteeMembershipConfig { + active_members: vec![IdentityId::from(3)], + phantom: Default::default(), + }), + committee_Instance3: Some(GeneralConfig::TechnicalCommitteeConfig { + vote_threshold: (1, 2), + members: vec![], + release_coordinator: IdentityId::from(3), + phantom: Default::default(), + }), + // Upgrade Committee: + group_Instance4: Some(general::runtime::UpgradeCommitteeMembershipConfig { + active_members: vec![IdentityId::from(4)], + phantom: Default::default(), + }), + committee_Instance4: Some(GeneralConfig::UpgradeCommitteeConfig { + vote_threshold: (1, 2), + members: vec![], + release_coordinator: IdentityId::from(4), + phantom: Default::default(), + }), protocol_fee: Some(GeneralConfig::ProtocolFeeConfig { base_fees: vec![ (ProtocolOp::AssetCreateAsset, 10_000 * 1_000_000), @@ -783,6 +806,28 @@ fn aldebaran_testnet_genesis( ], phantom: Default::default(), }), + // Technical Committee: + group_Instance3: Some(aldebaran::runtime::TechnicalCommitteeMembershipConfig { + active_members: vec![IdentityId::from(4)], + phantom: Default::default(), + }), + committee_Instance3: Some(aldebaran::runtime::TechnicalCommitteeConfig { + vote_threshold: (1, 2), + members: vec![], + release_coordinator: IdentityId::from(4), + phantom: Default::default(), + }), + // Upgrade Committee: + group_Instance4: Some(aldebaran::runtime::UpgradeCommitteeMembershipConfig { + active_members: vec![IdentityId::from(5)], + phantom: Default::default(), + }), + committee_Instance4: Some(aldebaran::runtime::UpgradeCommitteeConfig { + vote_threshold: (1, 2), + members: vec![], + release_coordinator: IdentityId::from(5), + phantom: Default::default(), + }), protocol_fee: Some(AldebaranConfig::ProtocolFeeConfig { base_fees: vec![ (ProtocolOp::AssetCreateAsset, 10_000 * 1_000_000),