#![cfg(test)] use super::*; use std::{str::FromStr, collections::BTreeMap}; use frame_support::{ assert_ok, impl_outer_origin, parameter_types, impl_outer_dispatch, }; use sp_core::{Blake2Hasher, H256}; use sp_runtime::{ Perbill, testing::Header, traits::{BlakeTwo256, IdentityLookup}, }; impl_outer_origin! { pub enum Origin for Test where system = frame_system {} } impl_outer_dispatch! { pub enum OuterCall for Test where origin: Origin { self::EVM, } } #[derive(Clone, Eq, PartialEq)] pub struct Test; parameter_types! { pub const BlockHashCount: u64 = 250; pub const MaximumBlockWeight: Weight = 1024; pub const MaximumBlockLength: u32 = 2 * 1024; pub const AvailableBlockRatio: Perbill = Perbill::one(); } impl frame_system::Trait for Test { type BaseCallFilter = (); type Origin = Origin; type Index = u64; type BlockNumber = u64; type Hash = H256; type Call = OuterCall; type Hashing = BlakeTwo256; type AccountId = AccountId32; type Lookup = IdentityLookup; type Header = Header; type Event = (); type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); type ModuleToIndex = (); type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); } parameter_types! { pub const ExistentialDeposit: u64 = 1; } impl pallet_balances::Trait for Test { type Balance = u64; type DustRemoval = (); type Event = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; type WeightInfo = (); } parameter_types! { pub const MinimumPeriod: u64 = 1000; } impl pallet_timestamp::Trait for Test { type Moment = u64; type OnTimestampSet = (); type MinimumPeriod = MinimumPeriod; type WeightInfo = (); } /// Fixed gas price of `0`. pub struct FixedGasPrice; impl FeeCalculator for FixedGasPrice { fn min_gas_price() -> U256 { // Gas price is always one token per gas. 0.into() } } impl Trait for Test { type FeeCalculator = FixedGasPrice; type CallOrigin = EnsureAddressRoot; type WithdrawOrigin = EnsureAddressNever; type AddressMapping = HashedAddressMapping; type Currency = Balances; type Event = Event; type Precompiles = (); type ChainId = SystemChainId; } type System = frame_system::Module; type Balances = pallet_balances::Module; type EVM = Module; pub fn new_test_ext() -> sp_io::TestExternalities { let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); let mut accounts = BTreeMap::new(); accounts.insert( H160::from_str("1000000000000000000000000000000000000001").unwrap(), GenesisAccount { nonce: U256::from(1), balance: U256::from(1000000), storage: Default::default(), code: vec![ 0x00, // STOP ], } ); accounts.insert( H160::from_str("1000000000000000000000000000000000000002").unwrap(), GenesisAccount { nonce: U256::from(1), balance: U256::from(1000000), storage: Default::default(), code: vec![ 0xff, // INVALID ], } ); pallet_balances::GenesisConfig::::default().assimilate_storage(&mut t).unwrap(); GenesisConfig { accounts }.assimilate_storage::(&mut t).unwrap(); t.into() } #[test] fn fail_call_return_ok() { new_test_ext().execute_with(|| { assert_ok!(EVM::call( Origin::root(), H160::default(), H160::from_str("1000000000000000000000000000000000000001").unwrap(), Vec::new(), U256::default(), 1000000, U256::default(), None, )); assert_ok!(EVM::call( Origin::root(), H160::default(), H160::from_str("1000000000000000000000000000000000000002").unwrap(), Vec::new(), U256::default(), 1000000, U256::default(), None, )); }); }