1234567891011121314151617#![cfg_attr(not(feature = "std"), no_std)]1819pub use pallet::*;20use frame_support::pallet_prelude::*;21use frame_system::pallet_prelude::*;2223#[frame_support::pallet]24pub mod pallet {25 use frame_support::pallet_prelude::*;26 use frame_system::pallet_prelude::*;27 use pallet_unique_scheduler::{ScheduledId, Pallet as SchedulerPallet};2829 #[pallet::config]30 pub trait Config: frame_system::Config + pallet_unique_scheduler::Config {31 type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;32 }3334 #[pallet::event]35 #[pallet::generate_deposit(pub(super) fn deposit_event)]36 pub enum Event<T: Config> {37 ValueIsSet,38 ShouldRollback,39 }4041 #[pallet::pallet]42 #[pallet::generate_store(pub(super) trait Store)]43 pub struct Pallet<T>(_);4445 #[pallet::storage]46 #[pallet::getter(fn is_enabled)]47 pub type Enabled<T> = StorageValue<_, bool, ValueQuery>;4849 #[pallet::storage]50 #[pallet::getter(fn test_value)]51 pub type TestValue<T> = StorageValue<_, u32, ValueQuery>;5253 #[pallet::error]54 pub enum Error<T> {55 TestPalletDisabled,56 TriggerRollback,57 }5859 #[pallet::call]60 impl<T: Config> Pallet<T> {61 #[pallet::weight(10_000)]62 pub fn enable(origin: OriginFor<T>) -> DispatchResult {63 ensure_root(origin)?;64 <Enabled<T>>::set(true);6566 Ok(())67 }6869 #[pallet::weight(10_000)]70 pub fn set_test_value(origin: OriginFor<T>, value: u32) -> DispatchResult {71 Self::ensure_origin_and_enabled(origin)?;7273 <TestValue<T>>::put(value);7475 Self::deposit_event(Event::ValueIsSet);7677 Ok(())78 }7980 #[pallet::weight(10_000)]81 pub fn set_test_value_and_rollback(origin: OriginFor<T>, value: u32) -> DispatchResult {82 Self::set_test_value(origin, value)?;8384 Self::deposit_event(Event::ShouldRollback);8586 Err(<Error<T>>::TriggerRollback.into())87 }8889 #[pallet::weight(10_000)]90 pub fn inc_test_value(origin: OriginFor<T>) -> DispatchResult {91 Self::set_test_value(origin, <TestValue<T>>::get() + 1)92 }9394 #[pallet::weight(10_000)]95 pub fn self_canceling_inc(96 origin: OriginFor<T>,97 id: ScheduledId,98 max_test_value: u32,99 ) -> DispatchResult {100 Self::ensure_origin_and_enabled(origin.clone())?;101102 if <TestValue<T>>::get() < max_test_value {103 Self::inc_test_value(origin)?;104 } else {105 SchedulerPallet::<T>::cancel_named(origin, id)?;106 }107108 Ok(())109 }110111 #[pallet::weight(100_000_000)]112 pub fn just_take_fee(origin: OriginFor<T>) -> DispatchResult {113 Self::ensure_origin_and_enabled(origin)?;114 Ok(())115 }116 }117}118119impl<T: Config> Pallet<T> {120 fn ensure_origin_and_enabled(origin: OriginFor<T>) -> DispatchResult {121 ensure_signed(origin)?;122 <Enabled<T>>::get()123 .then(|| ())124 .ok_or(<Error<T>>::TestPalletDisabled.into())125 }126}