astar_primitives/
precompiles.rs1use core::marker::PhantomData;
20
21use fp_evm::{ExitError, PrecompileFailure};
22use frame_support::{
23 dispatch::{DispatchClass, GetDispatchInfo, Pays},
24 traits::Contains,
25};
26use pallet_evm_precompile_dispatch::DispatchValidateT;
27
28pub struct DispatchFilterValidate<RuntimeCall, Filter: Contains<RuntimeCall>>(
30 PhantomData<(RuntimeCall, Filter)>,
31);
32
33impl<AccountId, RuntimeCall: GetDispatchInfo, Filter: Contains<RuntimeCall>>
34 DispatchValidateT<AccountId, RuntimeCall> for DispatchFilterValidate<RuntimeCall, Filter>
35{
36 fn validate_before_dispatch(
37 _origin: &AccountId,
38 call: &RuntimeCall,
39 ) -> Option<PrecompileFailure> {
40 let info = call.get_dispatch_info();
41 let paid_normal_call = info.pays_fee == Pays::Yes && info.class == DispatchClass::Normal;
42 if !paid_normal_call {
43 return Some(PrecompileFailure::Error {
44 exit_status: ExitError::Other("invalid call".into()),
45 });
46 }
47 if Filter::contains(call) {
48 None
49 } else {
50 Some(PrecompileFailure::Error {
51 exit_status: ExitError::Other("call filtered out".into()),
52 })
53 }
54 }
55}