pub use pallet_custom_origins::*;
#[frame_support::pallet]
pub mod pallet_custom_origins {
use crate::{Balance, CENTS, GRAND};
use frame_support::pallet_prelude::*;
#[pallet::config]
pub trait Config: frame_system::Config {}
#[pallet::pallet]
pub struct Pallet<T>(_);
#[derive(
PartialEq, Eq, Clone, MaxEncodedLen, Encode, Decode, DecodeWithMemTracking, TypeInfo, Debug,
)]
#[pallet::origin]
pub enum Origin {
StakingAdmin,
Treasurer,
FellowshipAdmin,
GeneralAdmin,
AuctionAdmin,
LeaseAdmin,
ReferendumCanceller,
ReferendumKiller,
SmallTipper,
BigTipper,
SmallSpender,
MediumSpender,
BigSpender,
WhitelistedCaller,
FellowshipInitiates,
Fellows,
FellowshipExperts,
FellowshipMasters,
Fellowship1Dan,
Fellowship2Dan,
Fellowship3Dan,
Fellowship4Dan,
Fellowship5Dan,
Fellowship6Dan,
Fellowship7Dan,
Fellowship8Dan,
Fellowship9Dan,
}
macro_rules! decl_unit_ensures {
( $name:ident: $success_type:ty = $success:expr ) => {
pub struct $name;
impl<O: OriginTrait + From<Origin>> EnsureOrigin<O> for $name
where
for <'a> &'a O::PalletsOrigin: TryInto<&'a Origin>,
{
type Success = $success_type;
fn try_origin(o: O) -> Result<Self::Success, O> {
match o.caller().try_into() {
Ok(Origin::$name) => return Ok($success),
_ => (),
}
Err(o)
}
#[cfg(feature = "runtime-benchmarks")]
fn try_successful_origin() -> Result<O, ()> {
Ok(O::from(Origin::$name))
}
}
};
( $name:ident ) => { decl_unit_ensures! { $name : () = () } };
( $name:ident: $success_type:ty = $success:expr, $( $rest:tt )* ) => {
decl_unit_ensures! { $name: $success_type = $success }
decl_unit_ensures! { $( $rest )* }
};
( $name:ident, $( $rest:tt )* ) => {
decl_unit_ensures! { $name }
decl_unit_ensures! { $( $rest )* }
};
() => {}
}
decl_unit_ensures!(
StakingAdmin,
Treasurer,
FellowshipAdmin,
GeneralAdmin,
AuctionAdmin,
LeaseAdmin,
ReferendumCanceller,
ReferendumKiller,
WhitelistedCaller,
FellowshipInitiates: u16 = 0,
Fellows: u16 = 3,
FellowshipExperts: u16 = 5,
FellowshipMasters: u16 = 7,
);
macro_rules! decl_ensure {
(
$vis:vis type $name:ident: EnsureOrigin<Success = $success_type:ty> {
$( $item:ident = $success:expr, )*
}
) => {
$vis struct $name;
impl<O: OriginTrait + From<Origin>> EnsureOrigin<O> for $name
where
for <'a> &'a O::PalletsOrigin: TryInto<&'a Origin>,
{
type Success = $success_type;
fn try_origin(o: O) -> Result<Self::Success, O> {
match o.caller().try_into() {
$(
Ok(Origin::$item) => return Ok($success),
)*
_ => (),
}
Err(o)
}
#[cfg(feature = "runtime-benchmarks")]
fn try_successful_origin() -> Result<O, ()> {
let _result: Result<O, ()> = Err(());
$(
let _result: Result<O, ()> = Ok(O::from(Origin::$item));
)*
_result
}
}
}
}
decl_ensure! {
pub type Spender: EnsureOrigin<Success = Balance> {
SmallTipper = 250 * 3 * CENTS,
BigTipper = 1 * GRAND,
SmallSpender = 10 * GRAND,
MediumSpender = 100 * GRAND,
BigSpender = 1_000 * GRAND,
Treasurer = 10_000 * GRAND,
}
}
decl_ensure! {
pub type EnsureFellowship: EnsureOrigin<Success = u16> {
Fellowship1Dan = 1,
Fellowship2Dan = 2,
Fellowship3Dan = 3,
Fellowship4Dan = 4,
Fellowship5Dan = 5,
Fellowship6Dan = 6,
Fellowship7Dan = 7,
Fellowship8Dan = 8,
Fellowship9Dan = 9,
}
}
}