referrerpolicy=no-referrer-when-downgrade

collectives_westend_runtime/ambassador/
origins.rs

1// Copyright (C) 2022 Parity Technologies (UK) Ltd.
2// SPDX-License-Identifier: Apache-2.0
3
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// 	http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16//! The Ambassador Program's origins.
17
18#[frame_support::pallet]
19pub mod pallet_origins {
20	use crate::ambassador::ranks;
21	use frame_support::pallet_prelude::*;
22	use pallet_ranked_collective::Rank;
23
24	#[pallet::pallet]
25	pub struct Pallet<T>(PhantomData<T>);
26
27	/// The pallet configuration trait.
28	#[pallet::config]
29	pub trait Config: frame_system::Config {}
30
31	#[derive(
32		PartialEq,
33		Eq,
34		Clone,
35		MaxEncodedLen,
36		Encode,
37		Decode,
38		DecodeWithMemTracking,
39		TypeInfo,
40		RuntimeDebug,
41	)]
42	#[pallet::origin]
43	pub enum Origin {
44		/// Plurality voice of the [ranks::AMBASSADOR_TIER_1] members or above given via
45		/// referendum.
46		Ambassadors,
47		/// Plurality voice of the [ranks::AMBASSADOR_TIER_2] members or above given via
48		/// referendum.
49		AmbassadorsTier2,
50		/// Plurality voice of the [ranks::SENIOR_AMBASSADOR_TIER_3] members or above given via
51		/// referendum.
52		SeniorAmbassadors,
53		/// Plurality voice of the [ranks::SENIOR_AMBASSADOR_TIER_4] members or above given via
54		/// referendum.
55		SeniorAmbassadorsTier4,
56		/// Plurality voice of the [ranks::HEAD_AMBASSADOR_TIER_5] members or above given via
57		/// referendum.
58		HeadAmbassadors,
59		/// Plurality voice of the [ranks::HEAD_AMBASSADOR_TIER_6] members or above given via
60		/// referendum.
61		HeadAmbassadorsTier6,
62		/// Plurality voice of the [ranks::HEAD_AMBASSADOR_TIER_7] members or above given via
63		/// referendum.
64		HeadAmbassadorsTier7,
65		/// Plurality voice of the [ranks::MASTER_AMBASSADOR_TIER_8] members or above given via
66		/// referendum.
67		MasterAmbassadors,
68		/// Plurality voice of the [ranks::MASTER_AMBASSADOR_TIER_9] members or above given via
69		/// referendum.
70		MasterAmbassadorsTier9,
71	}
72
73	impl Origin {
74		/// Returns the rank that the origin `self` speaks for, or `None` if it doesn't speak for
75		/// any.
76		pub fn as_voice(&self) -> Option<Rank> {
77			Some(match &self {
78				Origin::Ambassadors => ranks::AMBASSADOR_TIER_1,
79				Origin::AmbassadorsTier2 => ranks::AMBASSADOR_TIER_2,
80				Origin::SeniorAmbassadors => ranks::SENIOR_AMBASSADOR_TIER_3,
81				Origin::SeniorAmbassadorsTier4 => ranks::SENIOR_AMBASSADOR_TIER_4,
82				Origin::HeadAmbassadors => ranks::HEAD_AMBASSADOR_TIER_5,
83				Origin::HeadAmbassadorsTier6 => ranks::HEAD_AMBASSADOR_TIER_6,
84				Origin::HeadAmbassadorsTier7 => ranks::HEAD_AMBASSADOR_TIER_7,
85				Origin::MasterAmbassadors => ranks::MASTER_AMBASSADOR_TIER_8,
86				Origin::MasterAmbassadorsTier9 => ranks::MASTER_AMBASSADOR_TIER_9,
87			})
88		}
89	}
90
91	/// Implementation of the [EnsureOrigin] trait for the [Origin::HeadAmbassadors] origin.
92	pub struct EnsureHeadAmbassadorsVoice;
93	impl<O: OriginTrait + From<Origin>> EnsureOrigin<O> for EnsureHeadAmbassadorsVoice
94	where
95		for<'a> &'a O::PalletsOrigin: TryInto<&'a Origin>,
96	{
97		type Success = ();
98		fn try_origin(o: O) -> Result<Self::Success, O> {
99			match o.caller().try_into() {
100				Ok(Origin::HeadAmbassadors) => return Ok(()),
101				_ => (),
102			}
103
104			Err(o)
105		}
106
107		#[cfg(feature = "runtime-benchmarks")]
108		fn try_successful_origin() -> Result<O, ()> {
109			Ok(O::from(Origin::HeadAmbassadors))
110		}
111	}
112
113	/// Implementation of the [EnsureOrigin] trait for the plurality voice [Origin]s
114	/// from a given rank `R` with the success result of the corresponding [Rank].
115	pub struct EnsureAmbassadorsVoiceFrom<R>(PhantomData<R>);
116	impl<R: Get<Rank>, O: OriginTrait + From<Origin>> EnsureOrigin<O> for EnsureAmbassadorsVoiceFrom<R>
117	where
118		for<'a> &'a O::PalletsOrigin: TryInto<&'a Origin>,
119	{
120		type Success = Rank;
121		fn try_origin(o: O) -> Result<Self::Success, O> {
122			match o.caller().try_into().map(|o| Origin::as_voice(o)) {
123				Ok(Some(r)) if r >= R::get() => return Ok(r),
124				_ => (),
125			}
126
127			Err(o)
128		}
129
130		#[cfg(feature = "runtime-benchmarks")]
131		fn try_successful_origin() -> Result<O, ()> {
132			ranks::MASTER_AMBASSADOR_TIER_9
133				.ge(&R::get())
134				.then(|| O::from(Origin::MasterAmbassadorsTier9))
135				.ok_or(())
136		}
137	}
138
139	/// Implementation of the [EnsureOrigin] trait for the plurality voice [Origin]s with the
140	/// success result of the corresponding [Rank].
141	pub struct EnsureAmbassadorsVoice;
142	impl<O: OriginTrait + From<Origin>> EnsureOrigin<O> for EnsureAmbassadorsVoice
143	where
144		for<'a> &'a O::PalletsOrigin: TryInto<&'a Origin>,
145	{
146		type Success = Rank;
147		fn try_origin(o: O) -> Result<Self::Success, O> {
148			match o.caller().try_into().map(|o| Origin::as_voice(o)) {
149				Ok(Some(r)) => return Ok(r),
150				_ => (),
151			}
152
153			Err(o)
154		}
155
156		#[cfg(feature = "runtime-benchmarks")]
157		fn try_successful_origin() -> Result<O, ()> {
158			Ok(O::from(Origin::MasterAmbassadorsTier9))
159		}
160	}
161}