-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Whitelist pallet preimage provider upgrade #12834
Changes from 3 commits
4691052
9719350
c84eba4
cd53109
20db956
d894da1
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -27,7 +27,7 @@ | |
//! with the root origin. | ||
//! | ||
//! In the meantime the call corresponding to the hash must have been submitted to the pre-image | ||
//! handler [`PreimageProvider`]. | ||
//! handler [`pallet::Config::Preimages`]. | ||
|
||
#![cfg_attr(not(feature = "std"), no_std)] | ||
|
||
|
@@ -44,11 +44,12 @@ use codec::{DecodeLimit, Encode, FullCodec}; | |
use frame_support::{ | ||
dispatch::{GetDispatchInfo, PostDispatchInfo}, | ||
ensure, | ||
traits::{PreimageProvider, PreimageRecipient}, | ||
traits::{Hash, QueryPreimage, StorePreimage}, | ||
weights::Weight, | ||
Hashable, | ||
}; | ||
use scale_info::TypeInfo; | ||
use sp_runtime::traits::{Dispatchable, Hash}; | ||
use sp_runtime::traits::Dispatchable; | ||
use sp_std::prelude::*; | ||
|
||
pub use pallet::*; | ||
|
@@ -80,8 +81,7 @@ pub mod pallet { | |
type DispatchWhitelistedOrigin: EnsureOrigin<Self::RuntimeOrigin>; | ||
|
||
/// The handler of pre-images. | ||
// NOTE: recipient is only needed for benchmarks. | ||
type PreimageProvider: PreimageProvider<Self::Hash> + PreimageRecipient<Self::Hash>; | ||
ggwpez marked this conversation as resolved.
Show resolved
Hide resolved
|
||
type Preimages: QueryPreimage + StorePreimage; | ||
|
||
/// The weight information for this pallet. | ||
type WeightInfo: WeightInfo; | ||
|
@@ -94,9 +94,9 @@ pub mod pallet { | |
#[pallet::event] | ||
#[pallet::generate_deposit(pub(super) fn deposit_event)] | ||
pub enum Event<T: Config> { | ||
CallWhitelisted { call_hash: T::Hash }, | ||
WhitelistedCallRemoved { call_hash: T::Hash }, | ||
WhitelistedCallDispatched { call_hash: T::Hash, result: DispatchResultWithPostInfo }, | ||
CallWhitelisted { call_hash: Hash }, | ||
WhitelistedCallRemoved { call_hash: Hash }, | ||
WhitelistedCallDispatched { call_hash: Hash, result: DispatchResultWithPostInfo }, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe you can change these to There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could also be There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. updated. |
||
} | ||
|
||
#[pallet::error] | ||
|
@@ -114,12 +114,12 @@ pub mod pallet { | |
} | ||
|
||
#[pallet::storage] | ||
pub type WhitelistedCall<T: Config> = StorageMap<_, Twox64Concat, T::Hash, (), OptionQuery>; | ||
pub type WhitelistedCall<T: Config> = StorageMap<_, Twox64Concat, Hash, (), OptionQuery>; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we always use There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I very much doubt any are. |
||
|
||
#[pallet::call] | ||
impl<T: Config> Pallet<T> { | ||
#[pallet::weight(T::WeightInfo::whitelist_call())] | ||
pub fn whitelist_call(origin: OriginFor<T>, call_hash: T::Hash) -> DispatchResult { | ||
pub fn whitelist_call(origin: OriginFor<T>, call_hash: Hash) -> DispatchResult { | ||
T::WhitelistOrigin::ensure_origin(origin)?; | ||
|
||
ensure!( | ||
|
@@ -128,32 +128,34 @@ pub mod pallet { | |
); | ||
|
||
WhitelistedCall::<T>::insert(call_hash, ()); | ||
T::PreimageProvider::request_preimage(&call_hash); | ||
T::Preimages::request(&call_hash); | ||
|
||
Self::deposit_event(Event::<T>::CallWhitelisted { call_hash }); | ||
|
||
Ok(()) | ||
} | ||
|
||
#[pallet::weight(T::WeightInfo::remove_whitelisted_call())] | ||
pub fn remove_whitelisted_call(origin: OriginFor<T>, call_hash: T::Hash) -> DispatchResult { | ||
pub fn remove_whitelisted_call(origin: OriginFor<T>, call_hash: Hash) -> DispatchResult { | ||
T::WhitelistOrigin::ensure_origin(origin)?; | ||
|
||
WhitelistedCall::<T>::take(call_hash).ok_or(Error::<T>::CallIsNotWhitelisted)?; | ||
|
||
T::PreimageProvider::unrequest_preimage(&call_hash); | ||
T::Preimages::unrequest(&call_hash); | ||
|
||
Self::deposit_event(Event::<T>::WhitelistedCallRemoved { call_hash }); | ||
|
||
Ok(()) | ||
} | ||
|
||
#[pallet::weight( | ||
T::WeightInfo::dispatch_whitelisted_call().saturating_add(*call_weight_witness) | ||
T::WeightInfo::dispatch_whitelisted_call(*call_encoded_len) | ||
.saturating_add(*call_weight_witness) | ||
)] | ||
pub fn dispatch_whitelisted_call( | ||
origin: OriginFor<T>, | ||
call_hash: T::Hash, | ||
call_hash: Hash, | ||
call_encoded_len: u32, | ||
call_weight_witness: Weight, | ||
) -> DispatchResultWithPostInfo { | ||
T::DispatchWhitelistedOrigin::ensure_origin(origin)?; | ||
|
@@ -163,8 +165,8 @@ pub mod pallet { | |
Error::<T>::CallIsNotWhitelisted, | ||
); | ||
|
||
let call = T::PreimageProvider::get_preimage(&call_hash) | ||
.ok_or(Error::<T>::UnavailablePreImage)?; | ||
let call = T::Preimages::fetch(&call_hash, Some(call_encoded_len)) | ||
.map_err(|_| Error::<T>::UnavailablePreImage)?; | ||
|
||
let call = <T as Config>::RuntimeCall::decode_all_with_depth_limit( | ||
sp_api::MAX_EXTRINSIC_DEPTH, | ||
|
@@ -177,8 +179,9 @@ pub mod pallet { | |
Error::<T>::InvalidCallWeightWitness | ||
); | ||
|
||
let actual_weight = Self::clean_and_dispatch(call_hash, call) | ||
.map(|w| w.saturating_add(T::WeightInfo::dispatch_whitelisted_call())); | ||
let actual_weight = Self::clean_and_dispatch(call_hash, call).map(|w| { | ||
w.saturating_add(T::WeightInfo::dispatch_whitelisted_call(call_encoded_len)) | ||
}); | ||
|
||
Ok(actual_weight.into()) | ||
} | ||
|
@@ -196,7 +199,7 @@ pub mod pallet { | |
) -> DispatchResultWithPostInfo { | ||
T::DispatchWhitelistedOrigin::ensure_origin(origin)?; | ||
|
||
let call_hash = <T as frame_system::Config>::Hashing::hash_of(&call); | ||
let call_hash = call.blake2_256().into(); | ||
|
||
ensure!( | ||
WhitelistedCall::<T>::contains_key(call_hash), | ||
|
@@ -217,10 +220,10 @@ impl<T: Config> Pallet<T> { | |
/// Clean whitelisting/preimage and dispatch call. | ||
/// | ||
/// Return the call actual weight of the dispatched call if there is some. | ||
fn clean_and_dispatch(call_hash: T::Hash, call: <T as Config>::RuntimeCall) -> Option<Weight> { | ||
fn clean_and_dispatch(call_hash: Hash, call: <T as Config>::RuntimeCall) -> Option<Weight> { | ||
WhitelistedCall::<T>::remove(call_hash); | ||
|
||
T::PreimageProvider::unrequest_preimage(&call_hash); | ||
T::Preimages::unrequest(&call_hash); | ||
|
||
let result = call.dispatch(frame_system::Origin::<T>::Root.into()); | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
updated it everywhere.