Skip to content

Commit 6b889d6

Browse files
committed
Support events and l1 messages spys
1 parent c0aeb63 commit 6b889d6

File tree

2 files changed

+51
-5
lines changed

2 files changed

+51
-5
lines changed

crates/cheatnet/src/runtime_extensions/native/native_syscall_handler.rs

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use crate::runtime_extensions::forge_runtime_extension::cheatcodes::spy_events::Event;
2+
use crate::runtime_extensions::forge_runtime_extension::cheatcodes::spy_messages_to_l1::MessageToL1;
13
use crate::runtime_extensions::native::call::execute_inner_call;
24
use crate::runtime_extensions::native::deploy::deploy;
35
use crate::state::CheatnetState;
@@ -540,8 +542,30 @@ impl StarknetSyscallHandler for &mut CheatableNativeSyscallHandler<'_> {
540542
data: &[Felt],
541543
remaining_gas: &mut u64,
542544
) -> SyscallResult<()> {
543-
self.native_syscall_handler
544-
.emit_event(keys, data, remaining_gas)
545+
let syscall_result = self
546+
.native_syscall_handler
547+
.emit_event(keys, data, remaining_gas);
548+
549+
if syscall_result.is_ok() {
550+
let contract_address = self
551+
.native_syscall_handler
552+
.base
553+
.call
554+
// TODO why we default to code_address??
555+
.code_address
556+
.unwrap_or(self.native_syscall_handler.base.call.storage_address);
557+
let event = self
558+
.native_syscall_handler
559+
.base
560+
.events
561+
.last()
562+
.expect("Event must have been emitted");
563+
self.cheatnet_state
564+
.detected_events
565+
.push(Event::from_ordered_event(event, contract_address));
566+
}
567+
568+
syscall_result
545569
}
546570

547571
fn send_message_to_l1(
@@ -550,8 +574,30 @@ impl StarknetSyscallHandler for &mut CheatableNativeSyscallHandler<'_> {
550574
payload: &[Felt],
551575
remaining_gas: &mut u64,
552576
) -> SyscallResult<()> {
553-
self.native_syscall_handler
554-
.send_message_to_l1(to_address, payload, remaining_gas)
577+
let syscall_result =
578+
self.native_syscall_handler
579+
.send_message_to_l1(to_address, payload, remaining_gas);
580+
581+
if syscall_result.is_ok() {
582+
let contract_address = self
583+
.native_syscall_handler
584+
.base
585+
.call
586+
// TODO why we default to code_address??
587+
.code_address
588+
.unwrap_or(self.native_syscall_handler.base.call.storage_address);
589+
let message = self
590+
.native_syscall_handler
591+
.base
592+
.l2_to_l1_messages
593+
.last()
594+
.expect("Message must have been sent");
595+
self.cheatnet_state
596+
.detected_messages_to_l1
597+
.push(MessageToL1::from_ordered_message(message, contract_address));
598+
}
599+
600+
syscall_result
555601
}
556602

557603
fn keccak(&mut self, input: &[u64], remaining_gas: &mut u64) -> SyscallResult<U256> {

crates/forge/tests/integration/too_many_events.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ fn too_many_events() {
140140
&result,
141141
"emit_too_many_events",
142142
&format!(
143-
"Got an exception while executing a hint: Exceeded the maximum number of events, number events: {emit_too_many_events}, max number events: {max_n_emitted_events}."
143+
"Got an exception while executing a hint: [..] Exceeded the maximum number of events, number events: {emit_too_many_events}, max number events: {max_n_emitted_events}."
144144
),
145145
);
146146
assert_case_output_contains(

0 commit comments

Comments
 (0)