@@ -3,7 +3,8 @@ use crate::runtime_extensions::call_to_blockifier_runtime_extension::execution::
3
3
use crate :: runtime_extensions:: call_to_blockifier_runtime_extension:: rpc:: { AddressOrClassHash , CallResult } ;
4
4
use crate :: runtime_extensions:: call_to_blockifier_runtime_extension:: CheatnetState ;
5
5
use crate :: runtime_extensions:: common:: { get_relocated_vm_trace, get_syscalls_gas_consumed, sum_syscall_usage} ;
6
- use crate :: state:: { CallTrace , CallTraceNode , CheatStatus } ;
6
+ use crate :: runtime_extensions:: forge_runtime_extension:: { get_nested_calls_syscalls_sierra_gas, get_nested_calls_syscalls_vm_resources} ;
7
+ use crate :: state:: { CheatStatus } ;
7
8
use blockifier:: execution:: call_info:: { CallExecution , Retdata } ;
8
9
use blockifier:: execution:: contract_class:: { RunnableCompiledClass , TrackedResource } ;
9
10
use blockifier:: execution:: syscalls:: hint_processor:: { SyscallUsageMap , ENTRYPOINT_NOT_FOUND_ERROR , OUT_OF_GAS_ERROR } ;
@@ -28,9 +29,7 @@ use starknet_api::{
28
29
transaction:: { fields:: Calldata , TransactionVersion } ,
29
30
} ;
30
31
use starknet_types_core:: felt:: Felt ;
31
- use std:: cell:: RefCell ;
32
32
use std:: collections:: { HashMap , HashSet } ;
33
- use std:: rc:: Rc ;
34
33
use blockifier:: execution:: entry_point:: { EntryPointRevertInfo , ExecutableCallEntryPoint } ;
35
34
use blockifier:: execution:: stack_trace:: { extract_trailing_cairo1_revert_trace, Cairo1RevertHeader } ;
36
35
use thiserror:: Error ;
@@ -42,7 +41,8 @@ pub(crate) type ContractClassEntryPointExecutionResult =
42
41
43
42
pub ( crate ) struct CallInfoWithExecutionData {
44
43
pub call_info : CallInfo ,
45
- pub syscall_usage : SyscallUsageMap ,
44
+ pub syscall_usage_vm_resources : SyscallUsageMap ,
45
+ pub syscall_usage_sierra_gas : SyscallUsageMap ,
46
46
pub vm_trace : Option < Vec < RelocatedTraceEntry > > ,
47
47
}
48
48
@@ -82,7 +82,8 @@ pub fn execute_call_entry_point(
82
82
cheatnet_state. trace_data . exit_nested_call (
83
83
ExecutionResources :: default ( ) ,
84
84
u64:: default ( ) ,
85
- HashMap :: default ( ) ,
85
+ SyscallUsageMap :: default ( ) ,
86
+ SyscallUsageMap :: default ( ) ,
86
87
CallResult :: Success {
87
88
ret_data : ret_data_f252,
88
89
} ,
@@ -93,6 +94,7 @@ pub fn execute_call_entry_point(
93
94
. tracked_resource_stack
94
95
. last ( )
95
96
. expect ( "Unexpected empty tracked resource." ) ;
97
+
96
98
return Ok ( mocked_call_info (
97
99
entry_point. clone ( ) ,
98
100
ret_data. clone ( ) ,
@@ -193,16 +195,17 @@ pub fn execute_call_entry_point(
193
195
) {
194
196
Ok ( CallInfoWithExecutionData {
195
197
call_info,
196
- syscall_usage,
198
+ syscall_usage_vm_resources,
199
+ syscall_usage_sierra_gas,
197
200
vm_trace,
198
201
} ) => {
199
202
remove_syscall_resources_and_exit_non_error_call (
200
203
& call_info,
201
- & syscall_usage,
204
+ & syscall_usage_vm_resources,
205
+ & syscall_usage_sierra_gas,
202
206
context,
203
207
cheatnet_state,
204
208
vm_trace,
205
- current_tracked_resource,
206
209
) ;
207
210
Ok ( call_info)
208
211
}
@@ -291,40 +294,55 @@ fn call_info_from_pre_execution_error(
291
294
tracked_resource : current_tracked_resource,
292
295
..Default :: default ( )
293
296
} ,
294
- syscall_usage : SyscallUsageMap :: default ( ) ,
297
+ syscall_usage_vm_resources : SyscallUsageMap :: default ( ) ,
298
+ syscall_usage_sierra_gas : SyscallUsageMap :: default ( ) ,
295
299
vm_trace : None ,
296
300
}
297
301
}
298
302
299
303
fn remove_syscall_resources_and_exit_non_error_call (
300
304
call_info : & CallInfo ,
301
- syscall_usage : & SyscallUsageMap ,
305
+ syscall_usage_vm_resources : & SyscallUsageMap ,
306
+ syscall_usage_sierra_gas : & SyscallUsageMap ,
302
307
context : & mut EntryPointExecutionContext ,
303
308
cheatnet_state : & mut CheatnetState ,
304
309
vm_trace : Option < Vec < RelocatedTraceEntry > > ,
305
- current_tracked_resource : TrackedResource ,
306
310
) {
307
311
let versioned_constants = context. tx_context . block_context . versioned_constants ( ) ;
308
312
// We don't want the syscall resources to pollute the results
309
313
let mut resources = call_info. resources . clone ( ) ;
310
314
let mut gas_consumed = call_info. execution . gas_consumed ;
311
315
312
- match current_tracked_resource {
313
- TrackedResource :: CairoSteps => {
314
- resources -= & versioned_constants. get_additional_os_syscall_resources ( syscall_usage) ;
315
- }
316
- TrackedResource :: SierraGas => {
317
- gas_consumed -= get_syscalls_gas_consumed ( syscall_usage, versioned_constants) ;
318
- }
319
- }
316
+ // Remove resources consumed by syscalls from the current call
317
+ // `syscall_usage_vm_resources` and `syscall_usage_sierra_gas` are flat, meaning they only include syscalls from the specific call
318
+ resources -=
319
+ & versioned_constants. get_additional_os_syscall_resources ( syscall_usage_vm_resources) ;
320
+ gas_consumed -= get_syscalls_gas_consumed ( syscall_usage_sierra_gas, versioned_constants) ;
321
+
322
+ // Below syscall usages are cumulative.
323
+ let nested_syscall_usage_vm_resources =
324
+ get_nested_calls_syscalls_vm_resources ( & cheatnet_state. trace_data . current_call_stack . top ( ) ) ;
325
+ let nested_syscall_usage_sierra_gas =
326
+ get_nested_calls_syscalls_sierra_gas ( & cheatnet_state. trace_data . current_call_stack . top ( ) ) ;
327
+
328
+ // Remove resources consumed by syscalls from nested calls
329
+ resources -= & versioned_constants
330
+ . get_additional_os_syscall_resources ( & nested_syscall_usage_vm_resources) ;
331
+ gas_consumed -=
332
+ get_syscalls_gas_consumed ( & nested_syscall_usage_sierra_gas, versioned_constants) ;
333
+
334
+ let syscall_usage_vm_resources = sum_syscall_usage (
335
+ nested_syscall_usage_vm_resources,
336
+ syscall_usage_vm_resources,
337
+ ) ;
338
+ let syscall_usage_sierra_gas =
339
+ sum_syscall_usage ( nested_syscall_usage_sierra_gas, syscall_usage_sierra_gas) ;
320
340
321
- let nested_syscall_usage_sum =
322
- aggregate_nested_syscall_usage ( & cheatnet_state. trace_data . current_call_stack . top ( ) ) ;
323
- let syscall_usage = sum_syscall_usage ( nested_syscall_usage_sum, syscall_usage) ;
324
341
cheatnet_state. trace_data . exit_nested_call (
325
342
resources,
326
343
gas_consumed,
327
- syscall_usage,
344
+ syscall_usage_vm_resources,
345
+ syscall_usage_sierra_gas,
328
346
CallResult :: from_non_error ( call_info) ,
329
347
& call_info. execution . l2_to_l1_messages ,
330
348
vm_trace,
@@ -344,7 +362,8 @@ fn exit_error_call(
344
362
cheatnet_state. trace_data . exit_nested_call (
345
363
ExecutionResources :: default ( ) ,
346
364
u64:: default ( ) ,
347
- HashMap :: default ( ) ,
365
+ SyscallUsageMap :: default ( ) ,
366
+ SyscallUsageMap :: default ( ) ,
348
367
CallResult :: from_err ( error, & identifier) ,
349
368
& [ ] ,
350
369
vm_trace,
@@ -435,28 +454,6 @@ fn mocked_call_info(
435
454
}
436
455
}
437
456
438
- fn aggregate_nested_syscall_usage ( trace : & Rc < RefCell < CallTrace > > ) -> SyscallUsageMap {
439
- let mut result = SyscallUsageMap :: new ( ) ;
440
- for nested_call_node in & trace. borrow ( ) . nested_calls {
441
- if let CallTraceNode :: EntryPointCall ( nested_call) = nested_call_node {
442
- let sub_trace_counter = aggregate_syscall_usage ( nested_call) ;
443
- result = sum_syscall_usage ( result, & sub_trace_counter) ;
444
- }
445
- }
446
- result
447
- }
448
-
449
- fn aggregate_syscall_usage ( trace : & Rc < RefCell < CallTrace > > ) -> SyscallUsageMap {
450
- let mut result = trace. borrow ( ) . used_syscalls . clone ( ) ;
451
- for nested_call_node in & trace. borrow ( ) . nested_calls {
452
- if let CallTraceNode :: EntryPointCall ( nested_call) = nested_call_node {
453
- let sub_trace_counter = aggregate_nested_syscall_usage ( nested_call) ;
454
- result = sum_syscall_usage ( result, & sub_trace_counter) ;
455
- }
456
- }
457
- result
458
- }
459
-
460
457
#[ derive( Debug , Error ) ]
461
458
#[ error( "{}" , source) ]
462
459
pub struct EntryPointExecutionErrorWithTrace {
0 commit comments