1use sp_core::{U256, H160};2use frame_support::{3 weights::{Weight, constants::WEIGHT_PER_SECOND},4 traits::{FindAuthor},5 parameter_types, ConsensusEngineId,6};7use sp_runtime::{RuntimeAppPublic, Perbill};8use crate::{9 runtime_common::{10 constants::*,11 dispatch::CollectionDispatchT,12 ethereum::{EvmSponsorshipHandler},13 config::sponsoring::DefaultSponsoringRateLimit,14 DealWithFees,15 },16 Runtime,17 Aura,18 Balances,19 Event,20 ChainId,21};22use pallet_evm::{23 EnsureAddressTruncated,24 HashedAddressMapping,25};2627pub type CrossAccountId = pallet_evm::account::BasicCrossAccountId<Runtime>;2829impl pallet_evm::account::Config for Runtime {30 type CrossAccountId = CrossAccountId;31 type EvmAddressMapping = pallet_evm::HashedAddressMapping<Self::Hashing>;32 type EvmBackwardsAddressMapping = fp_evm_mapping::MapBackwardsAddressTruncated;33}3435363738parameter_types! {39 pub const WritesPerSecond: u64 = WEIGHT_PER_SECOND / <Runtime as frame_system::Config>::DbWeight::get().write;40 pub const GasPerSecond: u64 = WritesPerSecond::get() * 20000;41 pub const WeightPerGas: u64 = WEIGHT_PER_SECOND / GasPerSecond::get();42}4344454647const EVM_DISPATCH_RATIO: Perbill = Perbill::from_percent(50);48parameter_types! {49 pub BlockGasLimit: U256 = U256::from(NORMAL_DISPATCH_RATIO * EVM_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT / WeightPerGas::get());50}5152pub enum FixedGasWeightMapping {}53impl pallet_evm::GasWeightMapping for FixedGasWeightMapping {54 fn gas_to_weight(gas: u64) -> Weight {55 gas.saturating_mul(WeightPerGas::get())56 }57 fn weight_to_gas(weight: Weight) -> u64 {58 weight / WeightPerGas::get()59 }60}6162pub struct FixedFee;63impl pallet_evm::FeeCalculator for FixedFee {64 fn min_gas_price() -> (U256, u64) {65 (MIN_GAS_PRICE.into(), 0)66 }67}6869pub struct EthereumFindAuthor<F>(core::marker::PhantomData<F>);70impl<F: FindAuthor<u32>> FindAuthor<H160> for EthereumFindAuthor<F> {71 fn find_author<'a, I>(digests: I) -> Option<H160>72 where73 I: 'a + IntoIterator<Item = (ConsensusEngineId, &'a [u8])>,74 {75 if let Some(author_index) = F::find_author(digests) {76 let authority_id = Aura::authorities()[author_index as usize].clone();77 return Some(H160::from_slice(&authority_id.to_raw_vec()[4..24]));78 }79 None80 }81}8283impl pallet_evm::Config for Runtime {84 type BlockGasLimit = BlockGasLimit;85 type FeeCalculator = FixedFee;86 type GasWeightMapping = FixedGasWeightMapping;87 type BlockHashMapping = pallet_ethereum::EthereumBlockHashMapping<Self>;88 type CallOrigin = EnsureAddressTruncated<Self>;89 type WithdrawOrigin = EnsureAddressTruncated<Self>;90 type AddressMapping = HashedAddressMapping<Self::Hashing>;91 type PrecompilesType = ();92 type PrecompilesValue = ();93 type Currency = Balances;94 type Event = Event;95 type OnMethodCall = (96 pallet_evm_migration::OnMethodCall<Self>,97 pallet_evm_contract_helpers::HelpersOnMethodCall<Self>,98 CollectionDispatchT<Self>,99 pallet_unique::eth::CollectionHelpersOnMethodCall<Self>,100 );101 type OnCreate = pallet_evm_contract_helpers::HelpersOnCreate<Self>;102 type ChainId = ChainId;103 type Runner = pallet_evm::runner::stack::Runner<Self>;104 type OnChargeTransaction = pallet_evm::EVMCurrencyAdapter<Balances, DealWithFees>;105 type TransactionValidityHack = pallet_evm_transaction_payment::TransactionValidityHack<Self>;106 type FindAuthor = EthereumFindAuthor<Aura>;107}108109impl pallet_evm_migration::Config for Runtime {110 type WeightInfo = pallet_evm_migration::weights::SubstrateWeight<Self>;111}112113impl pallet_ethereum::Config for Runtime {114 type Event = Event;115 type StateRoot = pallet_ethereum::IntermediateStateRoot<Self>;116}117118parameter_types! {119 120 pub const HelpersContractAddress: H160 = H160([121 0x84, 0x28, 0x99, 0xec, 0xf3, 0x80, 0x55, 0x3e, 0x8a, 0x4d, 0xe7, 0x5b, 0xf5, 0x34, 0xcd, 0xf6, 0xfb, 0xf6, 0x40, 0x49,122 ]);123124 125 pub const EvmCollectionHelpersAddress: H160 = H160([126 0x6c, 0x4e, 0x9f, 0xe1, 0xae, 0x37, 0xa4, 0x1e, 0x93, 0xce, 0xe4, 0x29, 0xe8, 0xe1, 0x88, 0x1a, 0xbd, 0xcb, 0xb5, 0x4f,127 ]);128}129130impl pallet_evm_contract_helpers::Config for Runtime {131 type ContractAddress = HelpersContractAddress;132 type DefaultSponsoringRateLimit = DefaultSponsoringRateLimit;133}134135impl pallet_evm_coder_substrate::Config for Runtime {}136137impl pallet_evm_transaction_payment::Config for Runtime {138 type EvmSponsorshipHandler = EvmSponsorshipHandler;139 type Currency = Balances;140}