1234567891011121314151617use core::cmp::Ordering;1819use frame_support::{20 parameter_types,21 traits::{EnsureOrigin, PrivilegeCmp},22 weights::Weight,23};24use frame_system::{EnsureRoot, RawOrigin};25use pallet_unique_scheduler_v2::ScheduledEnsureOriginSuccess;26use parity_scale_codec::Decode;27use sp_runtime::Perbill;28use up_common::types::AccountId;2930use crate::{31 runtime_common::{config::substrate::RuntimeBlockWeights, scheduler::SchedulerPaymentExecutor},32 OriginCaller, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin,33};3435parameter_types! {36 pub MaximumSchedulerWeight: Weight = Perbill::from_percent(50) *37 RuntimeBlockWeights::get().max_block;38 pub const MaxScheduledPerBlock: u32 = 50;3940 pub const NoPreimagePostponement: Option<u32> = Some(10);41 pub const Preimage: Option<u32> = Some(10);42}4344pub struct EnsureSignedOrRoot<AccountId>(sp_std::marker::PhantomData<AccountId>);45impl<O: Into<Result<RawOrigin<AccountId>, O>> + From<RawOrigin<AccountId>>, AccountId: Decode>46 EnsureOrigin<O> for EnsureSignedOrRoot<AccountId>47{48 type Success = ScheduledEnsureOriginSuccess<AccountId>;49 fn try_origin(o: O) -> Result<Self::Success, O> {50 o.into().and_then(|o| match o {51 RawOrigin::Root => Ok(ScheduledEnsureOriginSuccess::Root),52 RawOrigin::Signed(who) => Ok(ScheduledEnsureOriginSuccess::Signed(who)),53 r => Err(O::from(r)),54 })55 }56}5758pub struct EqualOrRootOnly;59impl PrivilegeCmp<OriginCaller> for EqualOrRootOnly {60 fn cmp_privilege(left: &OriginCaller, right: &OriginCaller) -> Option<Ordering> {61 use RawOrigin::*;6263 let left = left.clone().try_into().ok()?;64 let right = right.clone().try_into().ok()?;6566 match (left, right) {67 (Root, Root) => Some(Ordering::Equal),68 (Root, _) => Some(Ordering::Greater),69 (_, Root) => Some(Ordering::Less),70 lr @ _ => (lr.0 == lr.1).then(|| Ordering::Equal),71 }72 }73}7475impl pallet_unique_scheduler_v2::Config for Runtime {76 type RuntimeEvent = RuntimeEvent;77 type RuntimeOrigin = RuntimeOrigin;78 type PalletsOrigin = OriginCaller;79 type RuntimeCall = RuntimeCall;80 type MaximumWeight = MaximumSchedulerWeight;81 type ScheduleOrigin = EnsureSignedOrRoot<AccountId>;82 type OriginPrivilegeCmp = EqualOrRootOnly;83 type MaxScheduledPerBlock = MaxScheduledPerBlock;84 type WeightInfo = ();85 type Preimages = ();86 type CallExecutor = SchedulerPaymentExecutor;87 type PrioritySetOrigin = EnsureRoot<AccountId>;88}