referrerpolicy=no-referrer-when-downgrade

westend_runtime/governance/
origins.rs

1// Copyright (C) Parity Technologies (UK) Ltd.
2// This file is part of Polkadot.
3
4// Polkadot is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8
9// Polkadot is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12// GNU General Public License for more details.
13
14// You should have received a copy of the GNU General Public License
15// along with Polkadot. If not, see <http://www.gnu.org/licenses/>.
16
17//! Custom origins for governance interventions.
18
19pub use pallet_custom_origins::*;
20
21#[frame_support::pallet]
22pub mod pallet_custom_origins {
23	use crate::{Balance, CENTS, GRAND};
24	use frame_support::pallet_prelude::*;
25
26	#[pallet::config]
27	pub trait Config: frame_system::Config {}
28
29	#[pallet::pallet]
30	pub struct Pallet<T>(_);
31
32	#[derive(
33		PartialEq, Eq, Clone, MaxEncodedLen, Encode, Decode, DecodeWithMemTracking, TypeInfo, Debug,
34	)]
35	#[pallet::origin]
36	pub enum Origin {
37		/// Origin for cancelling slashes.
38		StakingAdmin,
39		/// Origin for spending (any amount of) funds.
40		Treasurer,
41		/// Origin for managing the composition of the fellowship.
42		FellowshipAdmin,
43		/// Origin for managing the registrar.
44		GeneralAdmin,
45		/// Origin for starting auctions.
46		AuctionAdmin,
47		/// Origin able to force slot leases.
48		LeaseAdmin,
49		/// Origin able to cancel referenda.
50		ReferendumCanceller,
51		/// Origin able to kill referenda.
52		ReferendumKiller,
53		/// Origin able to spend up to 1 KSM from the treasury at once.
54		SmallTipper,
55		/// Origin able to spend up to 5 KSM from the treasury at once.
56		BigTipper,
57		/// Origin able to spend up to 50 KSM from the treasury at once.
58		SmallSpender,
59		/// Origin able to spend up to 500 KSM from the treasury at once.
60		MediumSpender,
61		/// Origin able to spend up to 5,000 KSM from the treasury at once.
62		BigSpender,
63		/// Origin able to dispatch a whitelisted call.
64		WhitelistedCaller,
65		/// Origin commanded by any members of the Polkadot Fellowship (no Dan grade needed).
66		FellowshipInitiates,
67		/// Origin commanded by Polkadot Fellows (3rd Dan fellows or greater).
68		Fellows,
69		/// Origin commanded by Polkadot Experts (5th Dan fellows or greater).
70		FellowshipExperts,
71		/// Origin commanded by Polkadot Masters (7th Dan fellows of greater).
72		FellowshipMasters,
73		/// Origin commanded by rank 1 of the Polkadot Fellowship and with a success of 1.
74		Fellowship1Dan,
75		/// Origin commanded by rank 2 of the Polkadot Fellowship and with a success of 2.
76		Fellowship2Dan,
77		/// Origin commanded by rank 3 of the Polkadot Fellowship and with a success of 3.
78		Fellowship3Dan,
79		/// Origin commanded by rank 4 of the Polkadot Fellowship and with a success of 4.
80		Fellowship4Dan,
81		/// Origin commanded by rank 5 of the Polkadot Fellowship and with a success of 5.
82		Fellowship5Dan,
83		/// Origin commanded by rank 6 of the Polkadot Fellowship and with a success of 6.
84		Fellowship6Dan,
85		/// Origin commanded by rank 7 of the Polkadot Fellowship and with a success of 7.
86		Fellowship7Dan,
87		/// Origin commanded by rank 8 of the Polkadot Fellowship and with a success of 8.
88		Fellowship8Dan,
89		/// Origin commanded by rank 9 of the Polkadot Fellowship and with a success of 9.
90		Fellowship9Dan,
91	}
92
93	macro_rules! decl_unit_ensures {
94		( $name:ident: $success_type:ty = $success:expr ) => {
95			pub struct $name;
96			impl<O: OriginTrait + From<Origin>> EnsureOrigin<O> for $name
97			where
98				for <'a> &'a O::PalletsOrigin: TryInto<&'a Origin>,
99			{
100				type Success = $success_type;
101				fn try_origin(o: O) -> Result<Self::Success, O> {
102					match o.caller().try_into() {
103						Ok(Origin::$name) => return Ok($success),
104						_ => (),
105					}
106
107					Err(o)
108				}
109				#[cfg(feature = "runtime-benchmarks")]
110				fn try_successful_origin() -> Result<O, ()> {
111					Ok(O::from(Origin::$name))
112				}
113			}
114		};
115		( $name:ident ) => { decl_unit_ensures! { $name : () = () } };
116		( $name:ident: $success_type:ty = $success:expr, $( $rest:tt )* ) => {
117			decl_unit_ensures! { $name: $success_type = $success }
118			decl_unit_ensures! { $( $rest )* }
119		};
120		( $name:ident, $( $rest:tt )* ) => {
121			decl_unit_ensures! { $name }
122			decl_unit_ensures! { $( $rest )* }
123		};
124		() => {}
125	}
126	decl_unit_ensures!(
127		StakingAdmin,
128		Treasurer,
129		FellowshipAdmin,
130		GeneralAdmin,
131		AuctionAdmin,
132		LeaseAdmin,
133		ReferendumCanceller,
134		ReferendumKiller,
135		WhitelistedCaller,
136		FellowshipInitiates: u16 = 0,
137		Fellows: u16 = 3,
138		FellowshipExperts: u16 = 5,
139		FellowshipMasters: u16 = 7,
140	);
141
142	macro_rules! decl_ensure {
143		(
144			$vis:vis type $name:ident: EnsureOrigin<Success = $success_type:ty> {
145				$( $item:ident = $success:expr, )*
146			}
147		) => {
148			$vis struct $name;
149			impl<O: OriginTrait + From<Origin>> EnsureOrigin<O> for $name
150			where
151				for <'a> &'a O::PalletsOrigin: TryInto<&'a Origin>,
152			{
153				type Success = $success_type;
154				fn try_origin(o: O) -> Result<Self::Success, O> {
155					match o.caller().try_into() {
156						$(
157							Ok(Origin::$item) => return Ok($success),
158						)*
159						_ => (),
160					}
161
162					Err(o)
163				}
164				#[cfg(feature = "runtime-benchmarks")]
165				fn try_successful_origin() -> Result<O, ()> {
166					// By convention the more privileged origins go later, so for greatest chance
167					// of success, we want the last one.
168					let _result: Result<O, ()> = Err(());
169					$(
170						let _result: Result<O, ()> = Ok(O::from(Origin::$item));
171					)*
172					_result
173				}
174			}
175		}
176	}
177
178	decl_ensure! {
179		pub type Spender: EnsureOrigin<Success = Balance> {
180			SmallTipper = 250 * 3 * CENTS,
181			BigTipper = 1 * GRAND,
182			SmallSpender = 10 * GRAND,
183			MediumSpender = 100 * GRAND,
184			BigSpender = 1_000 * GRAND,
185			Treasurer = 10_000 * GRAND,
186		}
187	}
188
189	decl_ensure! {
190		pub type EnsureFellowship: EnsureOrigin<Success = u16> {
191			Fellowship1Dan = 1,
192			Fellowship2Dan = 2,
193			Fellowship3Dan = 3,
194			Fellowship4Dan = 4,
195			Fellowship5Dan = 5,
196			Fellowship6Dan = 6,
197			Fellowship7Dan = 7,
198			Fellowship8Dan = 8,
199			Fellowship9Dan = 9,
200		}
201	}
202}