From 89349782bae31f263f72b2bdbdef5d00f61be1af Mon Sep 17 00:00:00 2001 From: Roman Krasiuk Date: Mon, 15 May 2023 15:27:02 +0300 Subject: [PATCH] test(executor): touched unchanged account (#2672) --- crates/revm/src/executor.rs | 38 ++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/crates/revm/src/executor.rs b/crates/revm/src/executor.rs index 8193a412d2..b7a9d64fe6 100644 --- a/crates/revm/src/executor.rs +++ b/crates/revm/src/executor.rs @@ -615,7 +615,7 @@ mod tests { use reth_rlp::Decodable; use std::{collections::HashMap, str::FromStr}; - const DEFAULT_REVM_ACCOUNT: Lazy = Lazy::new(|| RevmAccount { + static DEFAULT_REVM_ACCOUNT: Lazy = Lazy::new(|| RevmAccount { info: AccountInfo::default(), storage: hash_map::HashMap::default(), is_destroyed: false, @@ -1153,4 +1153,40 @@ mod tests { assert!(post_state.account_changes().is_empty()); } + + /// If the account was touched, but remained unchanged over the course of multiple transactions, + /// no changeset should be generated. + #[test] + fn test_touched_unchanged_account() { + let address = Address::random(); + + let mut db = SubState::new(State::new(StateProviderTest::default())); + db.load_account(address).unwrap(); // hot load the non-existing account + + let chain_spec = Arc::new(ChainSpecBuilder::mainnet().shanghai_activated().build()); + let mut executor = Executor::new(chain_spec, db); + let mut post_state = PostState::default(); + + executor.commit_changes( + 1, + hash_map::HashMap::from([( + address, + RevmAccount { is_touched: true, ..DEFAULT_REVM_ACCOUNT.clone() }, + )]), + true, + &mut post_state, + ); + assert!(post_state.account_changes().is_empty()); + + executor.commit_changes( + 1, + hash_map::HashMap::from([( + address, + RevmAccount { is_touched: true, ..DEFAULT_REVM_ACCOUNT.clone() }, + )]), + true, + &mut post_state, + ); + assert!(post_state.account_changes().is_empty()); + } }