orml_parameters/
lib.rs

1//! # Parameters
2//! Offer a central place to store and configure parameters.
3
4#![cfg_attr(not(feature = "std"), no_std)]
5#![allow(clippy::unused_unit)]
6
7use frame_support::pallet_prelude::*;
8use frame_system::pallet_prelude::*;
9
10use frame_support::traits::EnsureOriginWithArg;
11use orml_traits::parameters::{AggregratedKeyValue, Into2, Key, RuntimeParameterStore, TryInto2};
12
13mod mock;
14mod tests;
15mod weights;
16
17pub use module::*;
18pub use weights::WeightInfo;
19
20#[frame_support::pallet]
21pub mod module {
22	use super::*;
23
24	#[pallet::config]
25	pub trait Config: frame_system::Config {
26		type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
27
28		/// The key value type for parameters. Usually created by
29		/// orml_traits::parameters::define_aggregrated_parameters
30		type AggregratedKeyValue: AggregratedKeyValue;
31
32		/// The origin which may update the parameter.
33		type AdminOrigin: EnsureOriginWithArg<Self::RuntimeOrigin, KeyOf<Self>>;
34
35		/// Weight information for extrinsics in this module.
36		type WeightInfo: WeightInfo;
37	}
38
39	type KeyOf<T> = <<T as Config>::AggregratedKeyValue as AggregratedKeyValue>::AggregratedKey;
40	type ValueOf<T> = <<T as Config>::AggregratedKeyValue as AggregratedKeyValue>::AggregratedValue;
41
42	#[pallet::error]
43	pub enum Error<T> {}
44
45	#[pallet::event]
46	#[pallet::generate_deposit(pub(crate) fn deposit_event)]
47	pub enum Event<T: Config> {
48		/// Parameter is updated
49		Updated { key_value: T::AggregratedKeyValue },
50	}
51
52	/// Stored parameters.
53	///
54	/// map KeyOf<T> => Option<ValueOf<T>>
55	#[pallet::storage]
56	pub type Parameters<T: Config> = StorageMap<_, Blake2_128Concat, KeyOf<T>, ValueOf<T>, OptionQuery>;
57
58	#[pallet::pallet]
59	pub struct Pallet<T>(_);
60
61	#[pallet::call]
62	impl<T: Config> Pallet<T> {
63		/// Set parameter
64		#[pallet::call_index(0)]
65		#[pallet::weight(T::WeightInfo::set_parameter())]
66		pub fn set_parameter(origin: OriginFor<T>, key_value: T::AggregratedKeyValue) -> DispatchResult {
67			let (key, value) = key_value.clone().into_parts();
68
69			T::AdminOrigin::ensure_origin(origin, &key)?;
70
71			Parameters::<T>::mutate(key, |v| *v = value);
72
73			Self::deposit_event(Event::Updated { key_value });
74
75			Ok(())
76		}
77	}
78}
79
80impl<T: Config> RuntimeParameterStore for Pallet<T> {
81	type AggregratedKeyValue = T::AggregratedKeyValue;
82
83	fn get<KV, K>(key: K) -> Option<K::Value>
84	where
85		KV: AggregratedKeyValue,
86		K: Key + Into<<KV as AggregratedKeyValue>::AggregratedKey>,
87		<KV as AggregratedKeyValue>::AggregratedKey:
88			Into2<<<Self as RuntimeParameterStore>::AggregratedKeyValue as AggregratedKeyValue>::AggregratedKey>,
89		<<Self as RuntimeParameterStore>::AggregratedKeyValue as AggregratedKeyValue>::AggregratedValue:
90			TryInto2<<KV as AggregratedKeyValue>::AggregratedValue>,
91		<KV as AggregratedKeyValue>::AggregratedValue: TryInto<K::WrappedValue>,
92	{
93		let key: <KV as AggregratedKeyValue>::AggregratedKey = key.into();
94		let val = Parameters::<T>::get(key.into2());
95		val.and_then(|v| {
96			let val: <KV as AggregratedKeyValue>::AggregratedValue = v.try_into2().ok()?;
97			let val: K::WrappedValue = val.try_into().ok()?;
98			let val = val.into();
99			Some(val)
100		})
101	}
102}