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		/// The key value type for parameters. Usually created by
27		/// orml_traits::parameters::define_aggregrated_parameters
28		type AggregratedKeyValue: AggregratedKeyValue;
29
30		/// The origin which may update the parameter.
31		type AdminOrigin: EnsureOriginWithArg<Self::RuntimeOrigin, KeyOf<Self>>;
32
33		/// Weight information for extrinsics in this module.
34		type WeightInfo: WeightInfo;
35	}
36
37	type KeyOf<T> = <<T as Config>::AggregratedKeyValue as AggregratedKeyValue>::AggregratedKey;
38	type ValueOf<T> = <<T as Config>::AggregratedKeyValue as AggregratedKeyValue>::AggregratedValue;
39
40	#[pallet::error]
41	pub enum Error<T> {}
42
43	#[pallet::event]
44	#[pallet::generate_deposit(pub(crate) fn deposit_event)]
45	pub enum Event<T: Config> {
46		/// Parameter is updated
47		Updated { key_value: T::AggregratedKeyValue },
48	}
49
50	/// Stored parameters.
51	///
52	/// map KeyOf<T> => Option<ValueOf<T>>
53	#[pallet::storage]
54	pub type Parameters<T: Config> = StorageMap<_, Blake2_128Concat, KeyOf<T>, ValueOf<T>, OptionQuery>;
55
56	#[pallet::pallet]
57	pub struct Pallet<T>(_);
58
59	#[pallet::call]
60	impl<T: Config> Pallet<T> {
61		/// Set parameter
62		#[pallet::call_index(0)]
63		#[pallet::weight(T::WeightInfo::set_parameter())]
64		pub fn set_parameter(origin: OriginFor<T>, key_value: T::AggregratedKeyValue) -> DispatchResult {
65			let (key, value) = key_value.clone().into_parts();
66
67			T::AdminOrigin::ensure_origin(origin, &key)?;
68
69			Parameters::<T>::mutate(key, |v| *v = value);
70
71			Self::deposit_event(Event::Updated { key_value });
72
73			Ok(())
74		}
75	}
76}
77
78impl<T: Config> RuntimeParameterStore for Pallet<T> {
79	type AggregratedKeyValue = T::AggregratedKeyValue;
80
81	fn get<KV, K>(key: K) -> Option<K::Value>
82	where
83		KV: AggregratedKeyValue,
84		K: Key + Into<<KV as AggregratedKeyValue>::AggregratedKey>,
85		<KV as AggregratedKeyValue>::AggregratedKey:
86			Into2<<<Self as RuntimeParameterStore>::AggregratedKeyValue as AggregratedKeyValue>::AggregratedKey>,
87		<<Self as RuntimeParameterStore>::AggregratedKeyValue as AggregratedKeyValue>::AggregratedValue:
88			TryInto2<<KV as AggregratedKeyValue>::AggregratedValue>,
89		<KV as AggregratedKeyValue>::AggregratedValue: TryInto<K::WrappedValue>,
90	{
91		let key: <KV as AggregratedKeyValue>::AggregratedKey = key.into();
92		let val = Parameters::<T>::get(key.into2());
93		val.and_then(|v| {
94			let val: <KV as AggregratedKeyValue>::AggregratedValue = v.try_into2().ok()?;
95			let val: K::WrappedValue = val.try_into().ok()?;
96			let val = val.into();
97			Some(val)
98		})
99	}
100}