1234567891011121314151617#![cfg_attr(not(feature = "std"), no_std)]1819pub use pallet::*;2021#[cfg(feature = "runtime-benchmarks")]22pub mod benchmarking;2324pub mod weights;2526#[frame_support::pallet]27pub mod pallet {28 use frame_support::{29 dispatch::*,30 pallet_prelude::*,31 traits::{QueryPreimage, StorePreimage},32 };33 use frame_system::pallet_prelude::*;34 use sp_core::H256;3536 use crate::weights::WeightInfo;3738 #[pallet::config]39 pub trait Config: frame_system::Config {40 41 type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;4243 44 type RuntimeOrigin: From<RawOrigin<Self::AccountId>>45 + IsType<<Self as frame_system::Config>::RuntimeOrigin>;4647 48 type RuntimeCall: Parameter49 + Dispatchable<50 RuntimeOrigin = <Self as Config>::RuntimeOrigin,51 PostInfo = PostDispatchInfo,52 > + GetDispatchInfo53 + From<frame_system::Call<Self>>;5455 56 type Preimages: QueryPreimage + StorePreimage;5758 59 type WeightInfo: WeightInfo;60 }6162 #[pallet::event]63 #[pallet::generate_deposit(pub(super) fn deposit_event)]64 pub enum Event<T: Config> {65 MaintenanceEnabled,66 MaintenanceDisabled,67 }6869 #[pallet::pallet]70 #[pallet::generate_store(pub(super) trait Store)]71 pub struct Pallet<T>(_);7273 #[pallet::storage]74 #[pallet::getter(fn is_enabled)]75 pub type Enabled<T> = StorageValue<_, bool, ValueQuery>;7677 #[pallet::error]78 pub enum Error<T> {}7980 #[pallet::call]81 impl<T: Config> Pallet<T> {82 #[pallet::call_index(0)]83 #[pallet::weight(<T as Config>::WeightInfo::enable())]84 pub fn enable(origin: OriginFor<T>) -> DispatchResult {85 ensure_root(origin)?;8687 <Enabled<T>>::set(true);8889 Self::deposit_event(Event::MaintenanceEnabled);9091 Ok(())92 }9394 #[pallet::call_index(1)]95 #[pallet::weight(<T as Config>::WeightInfo::disable())]96 pub fn disable(origin: OriginFor<T>) -> DispatchResult {97 ensure_root(origin)?;9899 <Enabled<T>>::set(false);100101 Self::deposit_event(Event::MaintenanceDisabled);102103 Ok(())104 }105106 #[pallet::call_index(2)]107 #[pallet::weight(<T as Config>::WeightInfo::execute_preimage())]108 pub fn execute_preimage(origin: OriginFor<T>, hash: H256) -> DispatchResult {109 ensure_root(origin)?;110111 let len = T::Preimages::len(&hash).ok_or(DispatchError::Unavailable)?;112 let bounded = T::Preimages::pick::<<T as Config>::RuntimeCall>(hash, len);113 let (call, _) =114 T::Preimages::realize(&bounded).map_err(|_| DispatchError::Unavailable)?;115116 let result = match call.dispatch(frame_system::RawOrigin::Root.into()) {117 Ok(_) => Ok(()),118 Err(error_and_info) => Err(error_and_info.error),119 };120121 result122 }123 }124}