1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#![cfg_attr(not(feature = "std"), no_std)]
use frame_support::{
decl_event, decl_module,
traits::EnsureOrigin,
weights::{FunctionOf, GetDispatchInfo, Pays},
Parameter,
};
use frame_system as system;
use sp_runtime::{traits::Dispatchable, DispatchResult};
use sp_std::prelude::Box;
pub trait Trait: system::Trait {
type Event: From<Event> + Into<<Self as system::Trait>::Event>;
type Call: Parameter + Dispatchable<Origin = Self::Origin> + GetDispatchInfo;
type ExternalOrigin: EnsureOrigin<Self::Origin>;
}
decl_event!(
pub enum Event {
RootOp(DispatchResult),
}
);
decl_module! {
pub struct Module<T: Trait> for enum Call where origin: T::Origin {
fn deposit_event() = default;
#[weight = FunctionOf(
|args: (&Box<<T as Trait>::Call>,)| args.0.get_dispatch_info().weight + 10_000,
|args: (&Box<<T as Trait>::Call>,)| args.0.get_dispatch_info().class,
Pays::Yes,
)]
pub fn apply(origin, call: Box<<T as Trait>::Call>) {
T::ExternalOrigin::ensure_origin(origin)?;
let res = call.dispatch(frame_system::RawOrigin::Root.into());
Self::deposit_event(Event::RootOp(res.map(|_| ()).map_err(|e| e.error)));
}
}
}