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 };32 use frame_support::{33 traits::{QueryPreimage, StorePreimage},34 };35 use frame_system::pallet_prelude::*;36 use sp_core::H256;3738 use crate::weights::WeightInfo;3940 #[pallet::config]41 pub trait Config: frame_system::Config {42 43 type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;4445 46 type RuntimeOrigin: From<RawOrigin<Self::AccountId>>47 + IsType<<Self as frame_system::Config>::RuntimeOrigin>;4849 50 type RuntimeCall: Parameter51 + Dispatchable<52 RuntimeOrigin = <Self as Config>::RuntimeOrigin,53 PostInfo = PostDispatchInfo,54 > + GetDispatchInfo55 + From<frame_system::Call<Self>>;5657 58 type Preimages: QueryPreimage + StorePreimage;5960 61 type WeightInfo: WeightInfo;62 }6364 #[pallet::event]65 #[pallet::generate_deposit(pub(super) fn deposit_event)]66 pub enum Event<T: Config> {67 MaintenanceEnabled,68 MaintenanceDisabled,69 }7071 #[pallet::pallet]72 #[pallet::generate_store(pub(super) trait Store)]73 pub struct Pallet<T>(_);7475 #[pallet::storage]76 #[pallet::getter(fn is_enabled)]77 pub type Enabled<T> = StorageValue<_, bool, ValueQuery>;7879 #[pallet::error]80 pub enum Error<T> {}8182 #[pallet::call]83 impl<T: Config> Pallet<T> {84 #[pallet::call_index(0)]85 #[pallet::weight(<T as Config>::WeightInfo::enable())]86 pub fn enable(origin: OriginFor<T>) -> DispatchResult {87 ensure_root(origin)?;8889 <Enabled<T>>::set(true);9091 Self::deposit_event(Event::MaintenanceEnabled);9293 Ok(())94 }9596 #[pallet::call_index(1)]97 #[pallet::weight(<T as Config>::WeightInfo::disable())]98 pub fn disable(origin: OriginFor<T>) -> DispatchResult {99 ensure_root(origin)?;100101 <Enabled<T>>::set(false);102103 Self::deposit_event(Event::MaintenanceDisabled);104105 Ok(())106 }107108 #[pallet::call_index(2)]109 #[pallet::weight(<T as Config>::WeightInfo::execute_preimage())]110 pub fn execute_preimage(_origin: OriginFor<T>, _hash: H256) -> DispatchResult {111 #[cfg(feature = "governance")]112 {113 let origin = _origin;114 let hash = _hash;115 116 ensure_root(origin)?;117118 let len = T::Preimages::len(&hash).ok_or(DispatchError::Unavailable)?;119 let bounded = T::Preimages::pick::<<T as Config>::RuntimeCall>(hash, len);120 let (call, _) =121 T::Preimages::realize(&bounded).map_err(|_| DispatchError::Unavailable)?;122123 let result = match call.dispatch(frame_system::RawOrigin::Root.into()) {124 Ok(_) => Ok(()),125 Err(error_and_info) => Err(error_and_info.error),126 };127128 result129 }130131 #[cfg(not(feature = "governance"))]132 {133 Err(DispatchError::Unavailable)134 }135 }136 }137}