Skip to content

Commit b8cd5d6

Browse files
committed
Extended execute_input method
1 parent c8eb8cf commit b8cd5d6

File tree

2 files changed

+51
-9
lines changed

2 files changed

+51
-9
lines changed

crates/core/src/driver/mod.rs

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
use alloy::{
44
primitives::{Address, map::HashMap},
5-
rpc::types::trace::geth::GethTrace,
5+
rpc::types::trace::geth::{AccountState, DiffMode, GethTrace},
66
};
77
use revive_dt_compiler::{Compiler, CompilerInput, SolidityCompiler};
88
use revive_dt_config::Arguments;
@@ -94,15 +94,22 @@ where
9494
&mut self,
9595
input: &Input,
9696
node: &T::Blockchain,
97-
) -> anyhow::Result<GethTrace> {
97+
) -> anyhow::Result<(GethTrace, DiffMode)> {
9898
let receipt = node.execute_transaction(input.legacy_transaction(
9999
self.config.network_id,
100100
0,
101101
&self.deployed_contracts,
102102
)?)?;
103-
dbg!(&receipt);
104-
//node.trace_transaction(receipt)
105-
todo!()
103+
104+
log::debug!("Transaction receipt: {:?}", receipt);
105+
106+
let trace = node.trace_transaction(receipt.clone())?;
107+
108+
log::debug!("Trace result: {:?}", trace);
109+
110+
let diff = node.state_diff(receipt)?;
111+
112+
Ok((trace, diff))
106113
}
107114
}
108115

@@ -132,6 +139,32 @@ where
132139
}
133140
}
134141

142+
pub fn print_diff_mode(label: &str, diff: &DiffMode) {
143+
println!("🔍 {} - PRE STATE:", label);
144+
for (addr, state) in &diff.pre {
145+
Self::print_account_state(" [pre]", addr, state);
146+
}
147+
148+
println!("🔍 {} - POST STATE:", label);
149+
for (addr, state) in &diff.post {
150+
Self::print_account_state(" [post]", addr, state);
151+
}
152+
}
153+
154+
fn print_account_state(prefix: &str, addr: &Address, state: &AccountState) {
155+
println!("{} 0x{:x}", prefix, addr);
156+
157+
if let Some(balance) = &state.balance {
158+
println!("{} balance: {}", prefix, balance);
159+
}
160+
if let Some(nonce) = &state.nonce {
161+
println!("{} nonce: {}", prefix, nonce);
162+
}
163+
if let Some(code) = &state.code {
164+
println!("{} code: {}", prefix, code);
165+
}
166+
}
167+
135168
pub fn execute(&mut self, span: Span) -> anyhow::Result<()> {
136169
for mode in self.metadata.solc_modes() {
137170
let mut leader_state = State::<L>::new(self.config, span);
@@ -142,8 +175,17 @@ where
142175

143176
for case in &self.metadata.cases {
144177
for input in &case.inputs {
145-
let _ = leader_state.execute_input(input, self.leader_node)?;
146-
let _ = follower_state.execute_input(input, self.follower_node)?;
178+
let (_, leader_diff) = leader_state.execute_input(input, self.leader_node)?;
179+
let (_, follower_diff) =
180+
follower_state.execute_input(input, self.follower_node)?;
181+
182+
if leader_diff == follower_diff {
183+
log::info!("State diffs match between leader and follower.");
184+
} else {
185+
log::warn!("State diffs mismatch between leader and follower.");
186+
Self::print_diff_mode("Leader", &leader_diff);
187+
Self::print_diff_mode("Follower", &follower_diff);
188+
}
147189
}
148190
}
149191
}

crates/core/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
66
use revive_dt_compiler::{SolidityCompiler, revive_resolc, solc};
77
use revive_dt_config::TestingPlatform;
8-
use revive_dt_node::geth;
8+
use revive_dt_node::{geth, kitchensink::KitchensinkNode};
99
use revive_dt_node_interaction::EthereumNode;
1010

1111
pub mod driver;
@@ -37,7 +37,7 @@ impl Platform for Geth {
3737
pub struct Kitchensink;
3838

3939
impl Platform for Kitchensink {
40-
type Blockchain = geth::Instance;
40+
type Blockchain = KitchensinkNode;
4141
type Compiler = revive_resolc::Resolc;
4242

4343
fn config_id() -> TestingPlatform {

0 commit comments

Comments
 (0)