diff --git a/Cargo.lock b/Cargo.lock index 5588ed8312..211e149390 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2291,7 +2291,7 @@ dependencies = [ [[package]] name = "evm" version = "0.41.1" -source = "git+https://github.com/moonbeam-foundation/evm?branch=v0.4.1-cancun#cfcc81a1e13f8d6c96b6c0c10015ebf5c85b253a" +source = "git+https://github.com/moonbeam-foundation/evm?branch=v0.4.1-cancun#8ee491bde0378d154e95ab13b80b8b1b205c3f10" dependencies = [ "auto_impl", "environmental", @@ -2311,7 +2311,7 @@ dependencies = [ [[package]] name = "evm-core" version = "0.41.0" -source = "git+https://github.com/moonbeam-foundation/evm?branch=v0.4.1-cancun#cfcc81a1e13f8d6c96b6c0c10015ebf5c85b253a" +source = "git+https://github.com/moonbeam-foundation/evm?branch=v0.4.1-cancun#8ee491bde0378d154e95ab13b80b8b1b205c3f10" dependencies = [ "parity-scale-codec", "primitive-types", @@ -2322,7 +2322,7 @@ dependencies = [ [[package]] name = "evm-gasometer" version = "0.41.0" -source = "git+https://github.com/moonbeam-foundation/evm?branch=v0.4.1-cancun#cfcc81a1e13f8d6c96b6c0c10015ebf5c85b253a" +source = "git+https://github.com/moonbeam-foundation/evm?branch=v0.4.1-cancun#8ee491bde0378d154e95ab13b80b8b1b205c3f10" dependencies = [ "environmental", "evm-core", @@ -2333,7 +2333,7 @@ dependencies = [ [[package]] name = "evm-runtime" version = "0.41.0" -source = "git+https://github.com/moonbeam-foundation/evm?branch=v0.4.1-cancun#cfcc81a1e13f8d6c96b6c0c10015ebf5c85b253a" +source = "git+https://github.com/moonbeam-foundation/evm?branch=v0.4.1-cancun#8ee491bde0378d154e95ab13b80b8b1b205c3f10" dependencies = [ "auto_impl", "environmental", diff --git a/frame/evm/src/lib.rs b/frame/evm/src/lib.rs index cbc2e4a1c1..71896e73f5 100644 --- a/frame/evm/src/lib.rs +++ b/frame/evm/src/lib.rs @@ -75,7 +75,7 @@ use scale_info::TypeInfo; // Substrate use frame_support::{ dispatch::{DispatchResultWithPostInfo, Pays, PostDispatchInfo}, - storage::{child::KillStorageResult, KeyPrefixIterator}, + storage::KeyPrefixIterator, traits::{ fungible::{Balanced, Credit, Debt}, tokens::{ @@ -821,32 +821,14 @@ impl Pallet { /// Remove an account. pub fn remove_account(address: &H160) { if >::contains_key(address) { - // Remember to call `dec_sufficients` when clearing Suicided. - >::insert(address, ()); - - // In theory, we can always have pre-EIP161 contracts, so we - // make sure the account nonce is at least one. let account_id = T::AddressMapping::into_account_id(*address); - frame_system::Pallet::::inc_account_nonce(&account_id); + let _ = frame_system::Pallet::::dec_sufficients(&account_id); } >::remove(address); >::remove(address); - - if T::SuicideQuickClearLimit::get() > 0 { - #[allow(deprecated)] - let res = >::remove_prefix(address, Some(T::SuicideQuickClearLimit::get())); - - match res { - KillStorageResult::AllRemoved(_) => { - >::remove(address); - - let account_id = T::AddressMapping::into_account_id(*address); - let _ = frame_system::Pallet::::dec_sufficients(&account_id); - } - KillStorageResult::SomeRemaining(_) => (), - } - } + #[allow(deprecated)] + let _ = >::remove_prefix(address, None); } /// Create an account. diff --git a/frame/evm/src/runner/stack.rs b/frame/evm/src/runner/stack.rs index 8b0a792b5b..041e435579 100644 --- a/frame/evm/src/runner/stack.rs +++ b/frame/evm/src/runner/stack.rs @@ -620,6 +620,7 @@ where struct SubstrateStackSubstate<'config> { metadata: StackSubstateMetadata<'config>, deletes: BTreeSet, + creates: BTreeSet, logs: Vec, parent: Option>>, } @@ -638,6 +639,7 @@ impl<'config> SubstrateStackSubstate<'config> { metadata: self.metadata.spit_child(gas_limit, is_static), parent: None, deletes: BTreeSet::new(), + creates: BTreeSet::new(), logs: Vec::new(), }; mem::swap(&mut entering, self); @@ -654,7 +656,7 @@ impl<'config> SubstrateStackSubstate<'config> { self.metadata.swallow_commit(exited.metadata)?; self.logs.append(&mut exited.logs); self.deletes.append(&mut exited.deletes); - + self.creates.append(&mut exited.creates); sp_io::storage::commit_transaction(); Ok(()) } @@ -689,10 +691,24 @@ impl<'config> SubstrateStackSubstate<'config> { false } + pub fn created(&self, address: H160) -> bool { + if self.creates.contains(&address) { + return true; + } + + if let Some(parent) = self.parent.as_ref() { + return parent.created(address); + } + + false + } + pub fn set_deleted(&mut self, address: H160) { self.deletes.insert(address); } + pub fn set_created(&mut self, address: H160) { self.creates.insert(address); } + pub fn log(&mut self, address: H160, topics: Vec, data: Vec) { self.logs.push(Log { address, @@ -746,6 +762,7 @@ impl<'vicinity, 'config, T: Config> SubstrateStackState<'vicinity, 'config, T> { substate: SubstrateStackSubstate { metadata, deletes: BTreeSet::new(), + creates: BTreeSet::new(), logs: Vec::new(), parent: None, }, @@ -900,6 +917,10 @@ where self.substate.deleted(address) } + fn created(&self, address: H160) -> bool { + self.substate.created(address) + } + fn inc_nonce(&mut self, address: H160) -> Result<(), ExitError> { let account_id = T::AddressMapping::into_account_id(address); frame_system::Pallet::::inc_account_nonce(&account_id); @@ -956,6 +977,8 @@ where self.substate.set_deleted(address) } + fn set_created(&mut self, address: H160) { self.substate.set_created(address); } + fn set_code(&mut self, address: H160, code: Vec) { log::debug!( target: "evm", diff --git a/frame/evm/src/tests.rs b/frame/evm/src/tests.rs index 455d2b3d19..4d503c2fac 100644 --- a/frame/evm/src/tests.rs +++ b/frame/evm/src/tests.rs @@ -1269,7 +1269,7 @@ fn handle_sufficient_reference() { assert_eq!(account_2.sufficients, 1); EVM::remove_account(&addr_2); let account_2 = frame_system::Account::::get(substrate_addr_2); - assert_eq!(account_2.sufficients, 1); + assert_eq!(account_2.sufficients, 0); }); }