From 295404b12920e445579e83afb0f5e9736ae3fed4 Mon Sep 17 00:00:00 2001 From: Vitaly Drogan Date: Fri, 20 Sep 2024 20:00:56 +0200 Subject: [PATCH] add comment to used state trace --- crates/rbuilder/src/building/evm_inspector.rs | 11 +++++++++++ .../src/building/testing/evm_inspector_tests/mod.rs | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/crates/rbuilder/src/building/evm_inspector.rs b/crates/rbuilder/src/building/evm_inspector.rs index 84ca16ba9..073c58890 100644 --- a/crates/rbuilder/src/building/evm_inspector.rs +++ b/crates/rbuilder/src/building/evm_inspector.rs @@ -14,6 +14,9 @@ pub struct SlotKey { } #[derive(Debug, Clone, Default, PartialEq, Eq)] +/// UsedStateTrace is an execution trace of the given order +/// Limitations: +/// * `written_slot_values`, `received_amount` and `sent_amount` are not correct if transaction reverts pub struct UsedStateTrace { /// read slot values contains first read pub read_slot_values: HashMap, @@ -173,6 +176,14 @@ where } fn selfdestruct(&mut self, contract: Address, target: Address, value: U256) { + // selfdestruct can be called multiple times during transaction execution + if self + .used_state_trace + .destructed_contracts + .contains(&contract) + { + return; + } self.used_state_trace.destructed_contracts.push(contract); if !value.is_zero() { *self diff --git a/crates/rbuilder/src/building/testing/evm_inspector_tests/mod.rs b/crates/rbuilder/src/building/testing/evm_inspector_tests/mod.rs index 49b9a857c..858e9ad7f 100644 --- a/crates/rbuilder/src/building/testing/evm_inspector_tests/mod.rs +++ b/crates/rbuilder/src/building/testing/evm_inspector_tests/mod.rs @@ -47,8 +47,8 @@ fn test_transfer() -> eyre::Result<()> { .get(&sender_nonce_slot_key); assert!(nonce_read_value.is_some()); assert!(nonce_written_value.is_some()); - let nonce_read_value: U256 = nonce_read_value.unwrap().clone().into(); - let nonce_written_value: U256 = nonce_written_value.unwrap().clone().into(); + let nonce_read_value: U256 = (*nonce_read_value.unwrap()).into(); + let nonce_written_value: U256 = (*nonce_written_value.unwrap()).into(); assert_eq!( nonce_written_value.checked_sub(nonce_read_value), Some(U256::from(1))