Skip to content

Commit 3ca46d0

Browse files
committed
Add events summary and signature lengths to trace file
1 parent fa4fc29 commit 3ca46d0

File tree

6 files changed

+106
-25
lines changed

6 files changed

+106
-25
lines changed

Cargo.lock

Lines changed: 2 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,6 @@ derive_more = { version = "2.0.1", features = ["display"] }
115115
paste = "1.0.15"
116116
strum = "0.27"
117117
strum_macros = "0.27"
118+
119+
[patch.crates-io]
120+
cairo-annotations = { git = "https://github.com/software-mansion/cairo-annotations.git", branch = "szymczyk/l2-gas" }

crates/cheatnet/src/runtime_extensions/call_to_blockifier_runtime_extension/execution/entry_point.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ pub fn execute_call_entry_point(
9494
},
9595
&[],
9696
None,
97+
vec![],
9798
);
9899
let tracked_resource = *context
99100
.tracked_resource_stack
@@ -178,6 +179,14 @@ pub fn execute_call_entry_point(
178179
.pop()
179180
.expect("Unexpected empty tracked resource.");
180181

182+
let entrypoint_address = entry_point.code_address.unwrap_or_default();
183+
let signature = cheatnet_state
184+
.get_cheated_execution_info_for_contract(entrypoint_address)
185+
.tx_info
186+
.signature
187+
.as_value()
188+
.unwrap_or_default();
189+
181190
// region: Modified blockifier code
182191
match evaluate_execution_result(
183192
result,
@@ -199,6 +208,7 @@ pub fn execute_call_entry_point(
199208
context,
200209
cheatnet_state,
201210
vm_trace,
211+
signature,
202212
);
203213
Ok(call_info)
204214
}
@@ -302,6 +312,7 @@ fn remove_syscall_resources_and_exit_non_error_call(
302312
context: &mut EntryPointExecutionContext,
303313
cheatnet_state: &mut CheatnetState,
304314
vm_trace: Option<Vec<RelocatedTraceEntry>>,
315+
signature: Vec<Felt>,
305316
) {
306317
let versioned_constants = context.tx_context.block_context.versioned_constants();
307318
// We don't want the syscall resources to pollute the results
@@ -341,6 +352,7 @@ fn remove_syscall_resources_and_exit_non_error_call(
341352
CallResult::from_non_error(call_info),
342353
&call_info.execution.l2_to_l1_messages,
343354
vm_trace,
355+
signature,
344356
);
345357
}
346358

@@ -362,6 +374,7 @@ fn exit_error_call(
362374
CallResult::from_err(error, &identifier),
363375
&[],
364376
vm_trace,
377+
vec![],
365378
);
366379
}
367380

crates/cheatnet/src/state.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::runtime_extensions::forge_runtime_extension::cheatcodes::cheat_execut
1010
};
1111
use crate::runtime_extensions::forge_runtime_extension::cheatcodes::spy_events::Event;
1212
use crate::runtime_extensions::forge_runtime_extension::cheatcodes::spy_messages_to_l1::MessageToL1;
13-
use blockifier::execution::call_info::OrderedL2ToL1Message;
13+
use blockifier::execution::call_info::{OrderedEvent, OrderedL2ToL1Message};
1414
use blockifier::execution::contract_class::RunnableCompiledClass;
1515
use blockifier::execution::entry_point::CallEntryPoint;
1616
use blockifier::execution::syscalls::vm_syscall_utils::SyscallUsageMap;
@@ -219,6 +219,8 @@ pub struct CallTrace {
219219
pub used_syscalls_sierra_gas: SyscallUsageMap,
220220
pub vm_trace: Option<Vec<RelocatedTraceEntry>>,
221221
pub gas_consumed: u64,
222+
pub events: Vec<OrderedEvent>,
223+
pub signature: Vec<Felt>,
222224
}
223225

224226
impl CairoSerialize for CallTrace {
@@ -249,6 +251,8 @@ impl CallTrace {
249251
result: CallResult::Success { ret_data: vec![] },
250252
vm_trace: None,
251253
gas_consumed: u64::default(),
254+
events: vec![],
255+
signature: vec![],
252256
}
253257
}
254258

@@ -563,6 +567,7 @@ impl TraceData {
563567
result: CallResult,
564568
l2_to_l1_messages: &[OrderedL2ToL1Message],
565569
vm_trace: Option<Vec<RelocatedTraceEntry>>,
570+
signature: Vec<Felt>,
566571
) {
567572
let CallStackElement {
568573
call_trace: last_call,
@@ -582,6 +587,7 @@ impl TraceData {
582587

583588
last_call.result = result;
584589
last_call.vm_trace = vm_trace;
590+
last_call.signature = signature;
585591
}
586592

587593
pub fn add_deploy_without_constructor_node(&mut self) {

crates/forge-runner/src/build_trace_data.rs

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@ use blockifier::execution::syscalls::vm_syscall_utils::{
55
SyscallSelector, SyscallUsage, SyscallUsageMap,
66
};
77

8+
use blockifier::execution::call_info::OrderedEvent;
89
use cairo_annotations::trace_data::{
910
CairoExecutionInfo, CallEntryPoint as ProfilerCallEntryPoint,
1011
CallTraceNode as ProfilerCallTraceNode, CallTraceV1 as ProfilerCallTrace,
1112
CallType as ProfilerCallType, CasmLevelInfo, ContractAddress,
1213
DeprecatedSyscallSelector as ProfilerDeprecatedSyscallSelector,
1314
EntryPointSelector as ProfilerEntryPointSelector, EntryPointType as ProfilerEntryPointType,
14-
ExecutionResources as ProfilerExecutionResources, SyscallUsage as ProfilerSyscallUsage,
15-
TraceEntry as ProfilerTraceEntry, VersionedCallTrace as VersionedProfilerCallTrace,
16-
VmExecutionResources,
15+
ExecutionResources as ProfilerExecutionResources, SummedUpEvent,
16+
SyscallUsage as ProfilerSyscallUsage, TraceEntry as ProfilerTraceEntry,
17+
VersionedCallTrace as VersionedProfilerCallTrace, VmExecutionResources,
1718
};
1819
use cairo_vm::vm::runners::cairo_runner::ExecutionResources;
1920
use cairo_vm::vm::trace::trace_entry::RelocatedTraceEntry;
@@ -27,6 +28,7 @@ use runtime::starknet::constants::{TEST_CONTRACT_CLASS_HASH, TEST_ENTRY_POINT_SE
2728
use starknet::core::utils::get_selector_from_name;
2829
use starknet_api::contract_class::EntryPointType;
2930
use starknet_api::core::{ClassHash, EntryPointSelector};
31+
use starknet_types_core::felt::Felt;
3032
use std::cell::RefCell;
3133
use std::fs;
3234
use std::path::PathBuf;
@@ -45,8 +47,13 @@ pub fn build_profiler_call_trace(
4547
) -> ProfilerCallTrace {
4648
let value = value.borrow();
4749

48-
let entry_point =
49-
build_profiler_call_entry_point(value.entry_point.clone(), contracts_data, fork_data);
50+
let entry_point = build_profiler_call_entry_point(
51+
value.entry_point.clone(),
52+
contracts_data,
53+
fork_data,
54+
&value.events,
55+
&value.signature,
56+
);
5057
let vm_trace = value
5158
.vm_trace
5259
.as_ref()
@@ -160,6 +167,8 @@ pub fn build_profiler_call_entry_point(
160167
value: CallEntryPoint,
161168
contracts_data: &ContractsData,
162169
fork_data: &ForkData,
170+
events: &[OrderedEvent],
171+
signature: &[Felt],
163172
) -> ProfilerCallEntryPoint {
164173
let CallEntryPoint {
165174
class_hash,
@@ -174,6 +183,7 @@ pub fn build_profiler_call_entry_point(
174183
let contract_name = get_contract_name(class_hash, contracts_data);
175184
let function_name = get_function_name(&entry_point_selector, contracts_data, fork_data);
176185
let calldata_len = calldata.0.len();
186+
let signature_len = signature.len();
177187

178188
ProfilerCallEntryPoint {
179189
class_hash: class_hash.map(|ch| cairo_annotations::trace_data::ClassHash(ch.0)),
@@ -184,6 +194,8 @@ pub fn build_profiler_call_entry_point(
184194
contract_name,
185195
function_name,
186196
calldata_len: Some(calldata_len),
197+
events_summary: Some(to_summed_up_events(events)),
198+
signature_len: Some(signature_len),
187199
}
188200
}
189201

@@ -344,3 +356,13 @@ pub fn save_trace_data(
344356
.context("Failed to write call trace to a file")?;
345357
Ok(dir_to_save_trace.join(&filename))
346358
}
359+
360+
fn to_summed_up_events(events: &[OrderedEvent]) -> Vec<SummedUpEvent> {
361+
events
362+
.iter()
363+
.map(|ev| SummedUpEvent {
364+
keys_len: ev.event.keys.len(),
365+
data_len: ev.event.data.0.len(),
366+
})
367+
.collect()
368+
}

crates/forge-runner/src/running.rs

Lines changed: 54 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ use crate::gas::calculate_used_gas;
44
use crate::package_tests::with_config_resolved::{ResolvedForkConfig, TestCaseWithResolvedConfig};
55
use crate::test_case_summary::{Single, TestCaseSummary};
66
use anyhow::{Result, bail};
7-
use blockifier::execution::call_info::CallInfo;
7+
use blockifier::execution::call_info::{CallInfo, OrderedEvent};
88
use blockifier::execution::contract_class::TrackedResource;
9-
use blockifier::execution::entry_point::EntryPointExecutionContext;
9+
use blockifier::execution::entry_point::{CallEntryPoint, EntryPointExecutionContext};
1010
use blockifier::execution::entry_point_execution::{prepare_call_arguments, run_entry_point};
1111
use blockifier::execution::errors::EntryPointExecutionError;
1212
use blockifier::state::cached_state::CachedState;
@@ -25,7 +25,8 @@ use cheatnet::runtime_extensions::forge_runtime_extension::{
2525
update_top_call_l1_resources, update_top_call_resources, update_top_call_vm_trace,
2626
};
2727
use cheatnet::state::{
28-
BlockInfoReader, CallTrace, CheatnetState, EncounteredErrors, ExtendedStateReader,
28+
BlockInfoReader, CallTrace, CallTraceNode, CheatnetState, EncounteredErrors,
29+
ExtendedStateReader,
2930
};
3031
use execution::finalize_execution;
3132
use foundry_ui::UI;
@@ -35,6 +36,7 @@ use runtime::starknet::context::{build_context, set_max_steps};
3536
use runtime::{ExtendedRuntime, StarknetRuntime};
3637
use starknet_api::execution_resources::GasVector;
3738
use std::cell::RefCell;
39+
use std::collections::HashMap;
3840
use std::default::Default;
3941
use std::marker::PhantomData;
4042
use std::rc::Rc;
@@ -360,19 +362,22 @@ pub fn run_test_case(
360362
.unwrap_or_default();
361363

362364
Ok(match result {
363-
Ok(result) => RunResult::Completed(Box::new(RunCompleted {
364-
status: if result.execution.failed {
365-
RunStatus::Panic(result.execution.retdata.0)
366-
} else {
367-
RunStatus::Success(result.execution.retdata.0)
368-
},
369-
call_trace: call_trace_ref,
370-
gas_used,
371-
used_resources,
372-
encountered_errors,
373-
fuzzer_args,
374-
fork_data,
375-
})),
365+
Ok(result) => {
366+
collect_and_assign_events(&result, &call_trace_ref);
367+
RunResult::Completed(Box::new(RunCompleted {
368+
status: if result.execution.failed {
369+
RunStatus::Panic(result.execution.retdata.0)
370+
} else {
371+
RunStatus::Success(result.execution.retdata.0)
372+
},
373+
call_trace: call_trace_ref,
374+
gas_used,
375+
used_resources,
376+
encountered_errors,
377+
fuzzer_args,
378+
fork_data,
379+
}))
380+
}
376381
Err(error) => RunResult::Error(RunError {
377382
error: Box::new(error),
378383
call_trace: call_trace_ref,
@@ -477,3 +482,36 @@ fn get_call_trace_ref(runtime: &mut ForgeRuntime) -> Rc<RefCell<CallTrace>> {
477482
.current_call_stack
478483
.top()
479484
}
485+
486+
fn entry_point_key(ep: &CallEntryPoint) -> String {
487+
format!("{ep:?}")
488+
}
489+
490+
fn collect_events(call_info: &CallInfo, map: &mut HashMap<String, Vec<OrderedEvent>>) {
491+
map.insert(
492+
entry_point_key(&call_info.call),
493+
call_info.execution.events.clone(),
494+
);
495+
for inner_info in &call_info.inner_calls {
496+
collect_events(inner_info, map);
497+
}
498+
}
499+
500+
fn assign_events(trace_rc: &Rc<RefCell<CallTrace>>, map: &HashMap<String, Vec<OrderedEvent>>) {
501+
let mut trace = trace_rc.borrow_mut();
502+
if let Some(events) = map.get(&entry_point_key(&trace.entry_point)) {
503+
trace.events.clone_from(events);
504+
}
505+
506+
for nested_node in &trace.nested_calls {
507+
if let CallTraceNode::EntryPointCall(nested_trace) = nested_node {
508+
assign_events(nested_trace, map);
509+
}
510+
}
511+
}
512+
513+
fn collect_and_assign_events(call_info: &CallInfo, trace_rc: &Rc<RefCell<CallTrace>>) {
514+
let mut events_lookup = HashMap::new();
515+
collect_events(call_info, &mut events_lookup);
516+
assign_events(trace_rc, &events_lookup);
517+
}

0 commit comments

Comments
 (0)