1use crate::{Runtime, RuntimeCall};
22use astar_primitives::precompiles::DispatchFilterValidate;
23use frame_support::pallet_prelude::ConstU32;
24use frame_support::{parameter_types, traits::Contains};
25use pallet_evm_precompile_assets_erc20::Erc20AssetsPrecompileSet;
26use pallet_evm_precompile_blake2::Blake2F;
27use pallet_evm_precompile_bn128::{Bn128Add, Bn128Mul, Bn128Pairing};
28use pallet_evm_precompile_dapp_staking::DappStakingV3Precompile;
29use pallet_evm_precompile_dispatch::Dispatch;
30use pallet_evm_precompile_dispatch_lockdrop::DispatchLockdrop;
31use pallet_evm_precompile_ed25519::Ed25519Verify;
32use pallet_evm_precompile_modexp::Modexp;
33use pallet_evm_precompile_sha3fips::Sha3FIPS256;
34use pallet_evm_precompile_simple::{ECRecover, ECRecoverPublicKey, Identity, Ripemd160, Sha256};
35use pallet_evm_precompile_sr25519::Sr25519Precompile;
36use pallet_evm_precompile_substrate_ecdsa::SubstrateEcdsaPrecompile;
37use pallet_evm_precompile_xcm::XcmPrecompile;
38use precompile_utils::precompile_set::*;
39use sp_std::fmt::Debug;
40
41pub const ASSET_PRECOMPILE_ADDRESS_PREFIX: &[u8] = &[255u8; 4];
44parameter_types! {
45 pub AssetPrefix: &'static [u8] = ASSET_PRECOMPILE_ADDRESS_PREFIX;
46}
47
48type EthereumPrecompilesChecks = (AcceptDelegateCall, CallableByContract, CallableByPrecompile);
51
52pub struct WhitelistedCalls;
54
55impl Contains<RuntimeCall> for WhitelistedCalls {
56 fn contains(t: &RuntimeCall) -> bool {
57 match t {
58 RuntimeCall::Utility(pallet_utility::Call::batch { calls })
59 | RuntimeCall::Utility(pallet_utility::Call::batch_all { calls }) => {
60 calls.iter().all(|call| WhitelistedCalls::contains(call))
61 }
62 RuntimeCall::DappStaking(_) => true,
63 RuntimeCall::Assets(pallet_assets::Call::transfer { .. }) => true,
64 RuntimeCall::XTokens(orml_xtokens::Call::transfer_multiasset_with_fee { .. }) => true,
65 RuntimeCall::XTokens(orml_xtokens::Call::transfer_multiasset { .. }) => true,
66 _ => false,
67 }
68 }
69}
70pub struct WhitelistedLockdropCalls;
72
73impl Contains<RuntimeCall> for WhitelistedLockdropCalls {
74 fn contains(t: &RuntimeCall) -> bool {
75 match t {
76 RuntimeCall::Utility(pallet_utility::Call::batch { calls })
77 | RuntimeCall::Utility(pallet_utility::Call::batch_all { calls }) => calls
78 .iter()
79 .all(|call| WhitelistedLockdropCalls::contains(call)),
80 RuntimeCall::DappStaking(pallet_dapp_staking::Call::unbond_and_unstake { .. }) => true,
81 RuntimeCall::DappStaking(pallet_dapp_staking::Call::withdraw_unbonded { .. }) => true,
82 RuntimeCall::Balances(pallet_balances::Call::transfer_all { .. }) => true,
83 RuntimeCall::Balances(pallet_balances::Call::transfer_keep_alive { .. }) => true,
84 RuntimeCall::Balances(pallet_balances::Call::transfer_allow_death { .. }) => true,
85 RuntimeCall::Assets(pallet_assets::Call::transfer { .. }) => true,
86 _ => false,
87 }
88 }
89}
90
91#[precompile_utils::precompile_name_from_address]
93pub type ShidenPrecompilesSetAt<R, C> = (
94 PrecompileAt<AddressU64<1>, ECRecover, EthereumPrecompilesChecks>,
97 PrecompileAt<AddressU64<2>, Sha256, EthereumPrecompilesChecks>,
98 PrecompileAt<AddressU64<3>, Ripemd160, EthereumPrecompilesChecks>,
99 PrecompileAt<AddressU64<4>, Identity, EthereumPrecompilesChecks>,
100 PrecompileAt<AddressU64<5>, Modexp, EthereumPrecompilesChecks>,
101 PrecompileAt<AddressU64<6>, Bn128Add, EthereumPrecompilesChecks>,
102 PrecompileAt<AddressU64<7>, Bn128Mul, EthereumPrecompilesChecks>,
103 PrecompileAt<AddressU64<8>, Bn128Pairing, EthereumPrecompilesChecks>,
104 PrecompileAt<AddressU64<9>, Blake2F, EthereumPrecompilesChecks>,
105 PrecompileAt<
107 AddressU64<1024>,
108 Sha3FIPS256<Runtime, ()>,
109 (CallableByContract, CallableByPrecompile),
110 >,
111 PrecompileAt<
112 AddressU64<1025>,
113 Dispatch<R, DispatchFilterValidate<RuntimeCall, WhitelistedCalls>>,
114 (),
116 >,
117 PrecompileAt<AddressU64<1026>, ECRecoverPublicKey, (CallableByContract, CallableByPrecompile)>,
118 PrecompileAt<AddressU64<1027>, Ed25519Verify, (CallableByContract, CallableByPrecompile)>,
119 PrecompileAt<
121 AddressU64<20481>,
122 DappStakingV3Precompile<R>,
123 (CallableByContract, CallableByPrecompile),
124 >,
125 PrecompileAt<
126 AddressU64<20482>,
127 Sr25519Precompile<R>,
128 (CallableByContract, CallableByPrecompile),
129 >,
130 PrecompileAt<
131 AddressU64<20483>,
132 SubstrateEcdsaPrecompile<R>,
133 (CallableByContract, CallableByPrecompile),
134 >,
135 PrecompileAt<
136 AddressU64<20484>,
137 XcmPrecompile<R, C>,
138 (
139 SubcallWithMaxNesting<1>,
140 CallableByContract,
141 CallableByPrecompile,
142 ),
143 >,
144 PrecompileAt<
147 AddressU64<20487>,
148 DispatchLockdrop<
149 R,
150 DispatchFilterValidate<RuntimeCall, WhitelistedLockdropCalls>,
151 ConstU32<8>,
152 >,
153 (),
155 >,
156);
157
158pub type ShidenPrecompiles<R, C> = PrecompileSetBuilder<
159 R,
160 (
161 PrecompilesInRangeInclusive<
163 (AddressU64<1>, AddressU64<20487>),
165 ShidenPrecompilesSetAt<R, C>,
166 >,
167 PrecompileSetStartingWith<AssetPrefix, Erc20AssetsPrecompileSet<R>, CallableByContract>,
169 ),
170>;