-
Notifications
You must be signed in to change notification settings - Fork 16
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
311 additions
and
2 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,193 @@ | ||
//! Governance configurations for the Subsocial runtime. | ||
|
||
use crate::*; | ||
use frame_support::{parameter_types, traits::EitherOfDiverse}; | ||
use frame_support::traits::LockIdentifier; | ||
use static_assertions::const_assert; | ||
|
||
/// Macro to set a value (e.g. when using the `parameter_types` macro) to either a production value | ||
/// or to an environment variable or testing value (in case the `fast-runtime` feature is selected). | ||
/// Note that the environment variable is evaluated _at compile time_. | ||
/// | ||
/// Usage: | ||
/// ```Rust | ||
/// parameter_types! { | ||
/// // Note that the env variable version parameter cannot be const. | ||
/// pub LaunchPeriod: BlockNumber = prod_or_fast!(7 * DAYS, 1, "KSM_LAUNCH_PERIOD"); | ||
/// pub const VotingPeriod: BlockNumber = prod_or_fast!(7 * DAYS, 1 * MINUTES); | ||
/// } | ||
/// ``` | ||
#[macro_export] | ||
macro_rules! prod_or_fast { | ||
($prod:expr, $test:expr) => { | ||
if cfg!(feature = "fast-runtime") { | ||
$test | ||
} else { | ||
$prod | ||
} | ||
}; | ||
($prod:expr, $test:expr, $env:expr) => { | ||
if cfg!(feature = "fast-runtime") { | ||
core::option_env!($env).map(|s| s.parse().ok()).flatten().unwrap_or($test) | ||
} else { | ||
$prod | ||
} | ||
}; | ||
} | ||
|
||
parameter_types! { | ||
pub LaunchPeriod: BlockNumber = prod_or_fast!(7 * DAYS, 1, "KSM_LAUNCH_PERIOD"); | ||
pub VotingPeriod: BlockNumber = prod_or_fast!(7 * DAYS, 1 * MINUTES, "KSM_VOTING_PERIOD"); | ||
pub FastTrackVotingPeriod: BlockNumber = prod_or_fast!(3 * HOURS, 1 * MINUTES, "KSM_FAST_TRACK_VOTING_PERIOD"); | ||
pub const MinimumDeposit: Balance = 100 * UNIT; | ||
pub EnactmentPeriod: BlockNumber = prod_or_fast!(8 * DAYS, 1, "KSM_ENACTMENT_PERIOD"); | ||
pub CooloffPeriod: BlockNumber = prod_or_fast!(7 * DAYS, 1 * MINUTES, "KSM_COOLOFF_PERIOD"); | ||
pub const InstantAllowed: bool = true; | ||
pub const MaxVotes: u32 = 100; | ||
pub const MaxProposals: u32 = 100; | ||
} | ||
|
||
impl pallet_democracy::Config for Runtime { | ||
type RuntimeEvent = RuntimeEvent; | ||
type Currency = Balances; | ||
type EnactmentPeriod = EnactmentPeriod; | ||
type VoteLockingPeriod = EnactmentPeriod; | ||
type LaunchPeriod = LaunchPeriod; | ||
type VotingPeriod = VotingPeriod; | ||
type MinimumDeposit = MinimumDeposit; | ||
type SubmitOrigin = frame_system::EnsureSigned<AccountId>; | ||
/// A straight majority of the council can decide what their next motion is. | ||
type ExternalOrigin = | ||
pallet_collective::EnsureProportionAtLeast<AccountId, CouncilCollective, 1, 2>; | ||
/// A majority can have the next scheduled referendum be a straight majority-carries vote. | ||
type ExternalMajorityOrigin = | ||
pallet_collective::EnsureProportionAtLeast<AccountId, CouncilCollective, 1, 2>; | ||
/// A unanimous council can have the next scheduled referendum be a straight default-carries | ||
/// (NTB) vote. | ||
type ExternalDefaultOrigin = | ||
pallet_collective::EnsureProportionAtLeast<AccountId, CouncilCollective, 1, 1>; | ||
/// Two thirds of the technical committee can have an `ExternalMajority/ExternalDefault` vote | ||
/// be tabled immediately and with a shorter voting/enactment period. | ||
type FastTrackOrigin = | ||
pallet_collective::EnsureProportionAtLeast<AccountId, TechnicalCollective, 2, 3>; | ||
type InstantOrigin = | ||
pallet_collective::EnsureProportionAtLeast<AccountId, TechnicalCollective, 1, 1>; | ||
type InstantAllowed = InstantAllowed; | ||
type FastTrackVotingPeriod = FastTrackVotingPeriod; | ||
// To cancel a proposal which has been passed, 2/3 of the council must agree to it. | ||
type CancellationOrigin = EitherOfDiverse< | ||
EnsureRoot<AccountId>, | ||
pallet_collective::EnsureProportionAtLeast<AccountId, CouncilCollective, 2, 3>, | ||
>; | ||
type BlacklistOrigin = EnsureRoot<AccountId>; | ||
// To cancel a proposal before it has been passed, the technical committee must be unanimous or | ||
// Root must agree. | ||
type CancelProposalOrigin = EitherOfDiverse< | ||
EnsureRoot<AccountId>, | ||
pallet_collective::EnsureProportionAtLeast<AccountId, TechnicalCollective, 1, 1>, | ||
>; | ||
// Any single technical committee member may veto a coming council proposal, however they can | ||
// only do it once and it lasts only for the cooloff period. | ||
type VetoOrigin = pallet_collective::EnsureMember<AccountId, TechnicalCollective>; | ||
type CooloffPeriod = CooloffPeriod; | ||
type Slash = Treasury; | ||
type Scheduler = Scheduler; | ||
type PalletsOrigin = OriginCaller; | ||
type MaxVotes = MaxVotes; | ||
type WeightInfo = pallet_democracy::weights::SubstrateWeight<Runtime>; | ||
type MaxProposals = MaxProposals; | ||
type Preimages = Preimage; | ||
type MaxDeposits = ConstU32<100>; | ||
type MaxBlacklisted = ConstU32<100>; | ||
} | ||
|
||
parameter_types! { | ||
pub CouncilMotionDuration: BlockNumber = prod_or_fast!(3 * DAYS, 2 * MINUTES, "KSM_MOTION_DURATION"); | ||
pub const CouncilMaxProposals: u32 = 100; | ||
pub const CouncilMaxMembers: u32 = 100; | ||
} | ||
|
||
pub type CouncilCollective = pallet_collective::Instance1; | ||
impl pallet_collective::Config<CouncilCollective> for Runtime { | ||
type RuntimeOrigin = RuntimeOrigin; | ||
type Proposal = RuntimeCall; | ||
type RuntimeEvent = RuntimeEvent; | ||
type MotionDuration = CouncilMotionDuration; | ||
type MaxProposals = CouncilMaxProposals; | ||
type MaxMembers = CouncilMaxMembers; | ||
type DefaultVote = pallet_collective::PrimeDefaultVote; | ||
type SetMembersOrigin = EnsureRoot<AccountId>; | ||
type WeightInfo = pallet_collective::weights::SubstrateWeight<Runtime>; | ||
} | ||
|
||
parameter_types! { | ||
pub const CandidacyBond: Balance = 100 * UNIT; | ||
// 1 storage item created, key size is 32 bytes, value size is 16+16. | ||
pub const VotingBondBase: Balance = deposit(1, 64); | ||
// additional data per vote is 32 bytes (account id). | ||
pub const VotingBondFactor: Balance = deposit(0, 32); | ||
/// Daily council elections | ||
pub TermDuration: BlockNumber = prod_or_fast!(24 * HOURS, 2 * MINUTES, "KSM_TERM_DURATION"); | ||
pub const DesiredMembers: u32 = 19; | ||
pub const DesiredRunnersUp: u32 = 19; | ||
pub const MaxVotesPerVoter: u32 = 16; | ||
pub const MaxVoters: u32 = 10 * 1000; | ||
pub const MaxCandidates: u32 = 1000; | ||
pub const PhragmenElectionPalletId: LockIdentifier = *b"phrelect"; | ||
} | ||
|
||
// Make sure that there are no more than `MaxMembers` members elected via Phragmen. | ||
const_assert!(DesiredMembers::get() <= CouncilMaxMembers::get()); | ||
|
||
impl pallet_elections_phragmen::Config for Runtime { | ||
type RuntimeEvent = RuntimeEvent; | ||
type Currency = Balances; | ||
type ChangeMembers = Council; | ||
type InitializeMembers = Council; | ||
type CurrencyToVote = frame_support::traits::U128CurrencyToVote; | ||
type CandidacyBond = CandidacyBond; | ||
type VotingBondBase = VotingBondBase; | ||
type VotingBondFactor = VotingBondFactor; | ||
type LoserCandidate = Treasury; | ||
type KickedMember = Treasury; | ||
type DesiredMembers = DesiredMembers; | ||
type DesiredRunnersUp = DesiredRunnersUp; | ||
type TermDuration = TermDuration; | ||
type MaxVoters = MaxVoters; | ||
type MaxCandidates = MaxCandidates; | ||
type MaxVotesPerVoter = MaxVotesPerVoter; | ||
type PalletId = PhragmenElectionPalletId; | ||
type WeightInfo = pallet_elections_phragmen::weights::SubstrateWeight<Runtime>; | ||
} | ||
|
||
parameter_types! { | ||
pub TechnicalMotionDuration: BlockNumber = prod_or_fast!(3 * DAYS, 2 * MINUTES, "KSM_MOTION_DURATION"); | ||
pub const TechnicalMaxProposals: u32 = 100; | ||
pub const TechnicalMaxMembers: u32 = 100; | ||
} | ||
|
||
pub type TechnicalCollective = pallet_collective::Instance2; | ||
impl pallet_collective::Config<TechnicalCollective> for Runtime { | ||
type RuntimeOrigin = RuntimeOrigin; | ||
type Proposal = RuntimeCall; | ||
type RuntimeEvent = RuntimeEvent; | ||
type MotionDuration = TechnicalMotionDuration; | ||
type MaxProposals = TechnicalMaxProposals; | ||
type MaxMembers = TechnicalMaxMembers; | ||
type DefaultVote = pallet_collective::PrimeDefaultVote; | ||
type SetMembersOrigin = EnsureRoot<AccountId>; | ||
type WeightInfo = pallet_collective::weights::SubstrateWeight<Runtime>; | ||
} | ||
|
||
impl pallet_membership::Config<pallet_membership::Instance1> for Runtime { | ||
type RuntimeEvent = RuntimeEvent; | ||
type AddOrigin = EnsureRoot<AccountId>; | ||
type RemoveOrigin = EnsureRoot<AccountId>; | ||
type SwapOrigin = EnsureRoot<AccountId>; | ||
type ResetOrigin = EnsureRoot<AccountId>; | ||
type PrimeOrigin = EnsureRoot<AccountId>; | ||
type MembershipInitialized = TechnicalCommittee; | ||
type MembershipChanged = TechnicalCommittee; | ||
type MaxMembers = TechnicalMaxMembers; | ||
type WeightInfo = pallet_membership::weights::SubstrateWeight<Runtime>; | ||
} |
Oops, something went wrong.