asset_hub_westend_runtime/governance/
origins.rs1pub use pallet_custom_origins::*;
20
21#[frame_support::pallet]
23pub mod pallet_custom_origins {
24 use crate::{Balance, CENTS, GRAND};
25 use frame_support::pallet_prelude::*;
26
27 #[pallet::config]
28 pub trait Config: frame_system::Config {}
29
30 #[pallet::pallet]
31 pub struct Pallet<T>(_);
32
33 #[derive(
34 PartialEq,
35 Eq,
36 Clone,
37 MaxEncodedLen,
38 Encode,
39 Decode,
40 DecodeWithMemTracking,
41 TypeInfo,
42 RuntimeDebug,
43 )]
44 #[pallet::origin]
45 pub enum Origin {
46 StakingAdmin,
48 Treasurer,
51 FellowshipAdmin,
53 GeneralAdmin,
55 AuctionAdmin,
57 LeaseAdmin,
59 ReferendumCanceller,
61 ReferendumKiller,
63 SmallTipper,
65 BigTipper,
67 SmallSpender,
69 MediumSpender,
71 BigSpender,
73 WhitelistedCaller,
75 }
76
77 macro_rules! decl_unit_ensures {
78 ( $name:ident: $success_type:ty = $success:expr ) => {
79 pub struct $name;
80 impl<O: Into<Result<Origin, O>> + From<Origin>>
81 EnsureOrigin<O> for $name
82 {
83 type Success = $success_type;
84 fn try_origin(o: O) -> Result<Self::Success, O> {
85 o.into().and_then(|o| match o {
86 Origin::$name => Ok($success),
87 r => Err(O::from(r)),
88 })
89 }
90 #[cfg(feature = "runtime-benchmarks")]
91 fn try_successful_origin() -> Result<O, ()> {
92 Ok(O::from(Origin::$name))
93 }
94 }
95 };
96 ( $name:ident ) => { decl_unit_ensures! { $name : () = () } };
97 ( $name:ident: $success_type:ty = $success:expr, $( $rest:tt )* ) => {
98 decl_unit_ensures! { $name: $success_type = $success }
99 decl_unit_ensures! { $( $rest )* }
100 };
101 ( $name:ident, $( $rest:tt )* ) => {
102 decl_unit_ensures! { $name }
103 decl_unit_ensures! { $( $rest )* }
104 };
105 () => {}
106 }
107 decl_unit_ensures!(
108 StakingAdmin,
109 Treasurer,
110 FellowshipAdmin,
111 GeneralAdmin,
112 AuctionAdmin,
113 LeaseAdmin,
114 ReferendumCanceller,
115 ReferendumKiller,
116 WhitelistedCaller,
117 );
118
119 macro_rules! decl_ensure {
120 (
121 $vis:vis type $name:ident: EnsureOrigin<Success = $success_type:ty> {
122 $( $item:ident = $success:expr, )*
123 }
124 ) => {
125 $vis struct $name;
126 impl<O: Into<Result<Origin, O>> + From<Origin>>
127 EnsureOrigin<O> for $name
128 {
129 type Success = $success_type;
130 fn try_origin(o: O) -> Result<Self::Success, O> {
131 o.into().and_then(|o| match o {
132 $(
133 Origin::$item => Ok($success),
134 )*
135 r => Err(O::from(r)),
136 })
137 }
138 #[cfg(feature = "runtime-benchmarks")]
139 fn try_successful_origin() -> Result<O, ()> {
140 let _result: Result<O, ()> = Err(());
143 $(
144 let _result: Result<O, ()> = Ok(O::from(Origin::$item));
145 )*
146 _result
147 }
148 }
149 }
150 }
151
152 decl_ensure! {
153 pub type Spender: EnsureOrigin<Success = Balance> {
154 SmallTipper = 250 * 3 * CENTS,
155 BigTipper = 1 * GRAND,
156 SmallSpender = 10 * GRAND,
157 MediumSpender = 100 * GRAND,
158 BigSpender = 1_000 * GRAND,
159 Treasurer = 10_000 * GRAND,
160 }
161 }
162}