From bba14546ab328a6088370962e45479d5b18e2b85 Mon Sep 17 00:00:00 2001
From: Gavin Wood <gavin@parity.io>
Date: Wed, 1 Jul 2020 15:35:57 +0200
Subject: [PATCH] Allow voting in democracy (#1331)

* Allow voting in democracy.

* Ensire Root can begin referenda
---
 polkadot/runtime/polkadot/src/lib.rs | 37 ++++++++++++++++++++++------
 1 file changed, 30 insertions(+), 7 deletions(-)

diff --git a/polkadot/runtime/polkadot/src/lib.rs b/polkadot/runtime/polkadot/src/lib.rs
index 200ba5ec5c7..6e42c53657c 100644
--- a/polkadot/runtime/polkadot/src/lib.rs
+++ b/polkadot/runtime/polkadot/src/lib.rs
@@ -110,7 +110,12 @@ pub struct BaseFilter;
 impl Filter<Call> for BaseFilter {
 	fn filter(call: &Call) -> bool {
 		match call {
-			Call::Parachains(parachains::Call::set_heads(..)) => true,
+			Call::Parachains(parachains::Call::set_heads(..))
+				| Call::Democracy(democracy::Call::vote(..))
+				| Call::Democracy(democracy::Call::remove_vote(..))
+				| Call::Democracy(democracy::Call::delegate(..))
+				| Call::Democracy(democracy::Call::undelegate(..))
+				=> true,
 
 			// Governance stuff
 			Call::Democracy(_) | Call::Council(_) | Call::TechnicalCommittee(_) |
@@ -394,20 +399,38 @@ impl democracy::Trait for Runtime {
 	type VotingPeriod = VotingPeriod;
 	type MinimumDeposit = MinimumDeposit;
 	/// A straight majority of the council can decide what their next motion is.
-	type ExternalOrigin = collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilCollective>;
+	type ExternalOrigin = system::EnsureOneOf<AccountId,
+		collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilCollective>,
+		system::EnsureRoot<AccountId>,
+	>;
 	/// A 60% super-majority can have the next scheduled referendum be a straight majority-carries vote.
-	type ExternalMajorityOrigin = collective::EnsureProportionAtLeast<_3, _5, AccountId, CouncilCollective>;
+	type ExternalMajorityOrigin = system::EnsureOneOf<AccountId,
+		collective::EnsureProportionAtLeast<_3, _5, AccountId, CouncilCollective>,
+		system::EnsureRoot<AccountId>,
+	>;
 	/// A unanimous council can have the next scheduled referendum be a straight default-carries
 	/// (NTB) vote.
-	type ExternalDefaultOrigin = collective::EnsureProportionAtLeast<_1, _1, AccountId, CouncilCollective>;
+	type ExternalDefaultOrigin = system::EnsureOneOf<AccountId,
+		collective::EnsureProportionAtLeast<_1, _1, AccountId, CouncilCollective>,
+		system::EnsureRoot<AccountId>,
+	>;
 	/// Two thirds of the technical committee can have an ExternalMajority/ExternalDefault vote
 	/// be tabled immediately and with a shorter voting/enactment period.
-	type FastTrackOrigin = collective::EnsureProportionAtLeast<_2, _3, AccountId, TechnicalCollective>;
-	type InstantOrigin = collective::EnsureProportionAtLeast<_1, _1, AccountId, TechnicalCollective>;
+	type FastTrackOrigin = system::EnsureOneOf<AccountId,
+		collective::EnsureProportionAtLeast<_2, _3, AccountId, TechnicalCollective>,
+		system::EnsureRoot<AccountId>,
+	>;
+	type InstantOrigin = system::EnsureOneOf<AccountId,
+		collective::EnsureProportionAtLeast<_1, _1, AccountId, TechnicalCollective>,
+		system::EnsureRoot<AccountId>,
+	>;
 	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 = collective::EnsureProportionAtLeast<_2, _3, AccountId, CouncilCollective>;
+	type CancellationOrigin = system::EnsureOneOf<AccountId,
+		collective::EnsureProportionAtLeast<_2, _3, AccountId, CouncilCollective>,
+		system::EnsureRoot<AccountId>,
+	>;
 	// 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 = collective::EnsureMember<AccountId, TechnicalCollective>;
-- 
GitLab