11use std:: convert:: From ;
22use std:: fmt;
3- use std:: sync:: Arc ;
3+ use std:: sync:: { Arc , LazyLock , Mutex } ;
44
55use ark_ec:: short_weierstrass:: { Affine , Projective , SWCurveConfig } ;
66use ark_ff:: { BigInt , PrimeField } ;
@@ -45,6 +45,39 @@ use crate::versioned_constants::GasCosts;
4545
4646pub const CALL_CONTRACT_SELECTOR_NAME : & str = "call_contract" ;
4747pub const LIBRARY_CALL_SELECTOR_NAME : & str = "library_call" ;
48+
49+ pub static SYSCALL_COUNTER : LazyLock < Mutex < SyscallCounts > > =
50+ LazyLock :: new ( || Mutex :: new ( SyscallCounts :: default ( ) ) ) ;
51+
52+ #[ derive( Default , Clone , Copy ) ]
53+ pub struct SyscallCounts {
54+ pub get_block_hash : u64 ,
55+ pub get_execution_info : u64 ,
56+ pub get_execution_info_v2 : u64 ,
57+ pub deploy : u64 ,
58+ pub replace_class : u64 ,
59+ pub library_call : u64 ,
60+ pub call_contract : u64 ,
61+ pub storage_read : u64 ,
62+ pub storage_write : u64 ,
63+ pub emit_event : u64 ,
64+ pub send_message_to_l1 : u64 ,
65+ pub keccak : u64 ,
66+ pub secp256k1_new : u64 ,
67+ pub secp256k1_add : u64 ,
68+ pub secp256k1_mul : u64 ,
69+ pub secp256k1_get_point_from_x : u64 ,
70+ pub secp256k1_get_xy : u64 ,
71+ pub secp256r1_new : u64 ,
72+ pub secp256r1_add : u64 ,
73+ pub secp256r1_mul : u64 ,
74+ pub secp256r1_get_point_from_x : u64 ,
75+ pub secp256r1_get_xy : u64 ,
76+ pub sha256_process_block : u64 ,
77+ pub get_class_hash_at : u64 ,
78+ pub meta_tx_v0 : u64 ,
79+ }
80+
4881pub struct NativeSyscallHandler < ' state > {
4982 pub base : Box < SyscallHandlerBase < ' state > > ,
5083
@@ -239,6 +272,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
239272 block_number : u64 ,
240273 remaining_gas : & mut u64 ,
241274 ) -> SyscallResult < Felt > {
275+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . get_block_hash += 1 ;
276+
242277 self . pre_execute_syscall (
243278 remaining_gas,
244279 self . gas_costs ( ) . syscalls . get_block_hash . base_syscall_cost ( ) ,
@@ -251,6 +286,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
251286 }
252287
253288 fn get_execution_info ( & mut self , remaining_gas : & mut u64 ) -> SyscallResult < ExecutionInfo > {
289+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . get_execution_info += 1 ;
290+
254291 self . pre_execute_syscall (
255292 remaining_gas,
256293 self . gas_costs ( ) . syscalls . get_execution_info . base_syscall_cost ( ) ,
@@ -270,6 +307,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
270307 contract_address : Felt ,
271308 remaining_gas : & mut u64 ,
272309 ) -> SyscallResult < Felt > {
310+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . get_class_hash_at += 1 ;
311+
273312 self . pre_execute_syscall (
274313 remaining_gas,
275314 self . gas_costs ( ) . syscalls . get_class_hash_at . base_syscall_cost ( ) ,
@@ -285,6 +324,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
285324 }
286325
287326 fn get_execution_info_v2 ( & mut self , remaining_gas : & mut u64 ) -> SyscallResult < ExecutionInfoV2 > {
327+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . get_execution_info_v2 += 1 ;
328+
288329 self . pre_execute_syscall (
289330 remaining_gas,
290331 self . gas_costs ( ) . syscalls . get_execution_info . base_syscall_cost ( ) ,
@@ -307,6 +348,7 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
307348 deploy_from_zero : bool ,
308349 remaining_gas : & mut u64 ,
309350 ) -> SyscallResult < ( Felt , Vec < Felt > ) > {
351+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . deploy += 1 ;
310352 // The cost of deploying a contract is the base cost plus the linear cost of the calldata
311353 // len.
312354 let total_gas_cost =
@@ -330,6 +372,7 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
330372 Ok ( ( Felt :: from ( deployed_contract_address) , constructor_retdata) )
331373 }
332374 fn replace_class ( & mut self , class_hash : Felt , remaining_gas : & mut u64 ) -> SyscallResult < ( ) > {
375+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . replace_class += 1 ;
333376 self . pre_execute_syscall (
334377 remaining_gas,
335378 self . gas_costs ( ) . syscalls . replace_class . base_syscall_cost ( ) ,
@@ -348,6 +391,7 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
348391 calldata : & [ Felt ] ,
349392 remaining_gas : & mut u64 ,
350393 ) -> SyscallResult < Vec < Felt > > {
394+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . library_call += 1 ;
351395 self . pre_execute_syscall (
352396 remaining_gas,
353397 self . gas_costs ( ) . syscalls . library_call . base_syscall_cost ( ) ,
@@ -392,6 +436,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
392436 calldata : & [ Felt ] ,
393437 remaining_gas : & mut u64 ,
394438 ) -> SyscallResult < Vec < Felt > > {
439+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . call_contract += 1 ;
440+
395441 self . pre_execute_syscall (
396442 remaining_gas,
397443 self . gas_costs ( ) . syscalls . call_contract . base_syscall_cost ( ) ,
@@ -448,6 +494,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
448494 address : Felt ,
449495 remaining_gas : & mut u64 ,
450496 ) -> SyscallResult < Felt > {
497+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . storage_read += 1 ;
498+
451499 self . pre_execute_syscall (
452500 remaining_gas,
453501 self . gas_costs ( ) . syscalls . storage_read . base_syscall_cost ( ) ,
@@ -473,6 +521,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
473521 value : Felt ,
474522 remaining_gas : & mut u64 ,
475523 ) -> SyscallResult < ( ) > {
524+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . storage_write += 1 ;
525+
476526 self . pre_execute_syscall (
477527 remaining_gas,
478528 self . gas_costs ( ) . syscalls . storage_write . base_syscall_cost ( ) ,
@@ -497,6 +547,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
497547 data : & [ Felt ] ,
498548 remaining_gas : & mut u64 ,
499549 ) -> SyscallResult < ( ) > {
550+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . emit_event += 1 ;
551+
500552 self . pre_execute_syscall (
501553 remaining_gas,
502554 self . gas_costs ( ) . syscalls . emit_event . base_syscall_cost ( ) ,
@@ -517,6 +569,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
517569 payload : & [ Felt ] ,
518570 remaining_gas : & mut u64 ,
519571 ) -> SyscallResult < ( ) > {
572+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . send_message_to_l1 += 1 ;
573+
520574 self . pre_execute_syscall (
521575 remaining_gas,
522576 self . gas_costs ( ) . syscalls . send_message_to_l1 . base_syscall_cost ( ) ,
@@ -530,6 +584,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
530584 }
531585
532586 fn keccak ( & mut self , input : & [ u64 ] , remaining_gas : & mut u64 ) -> SyscallResult < U256 > {
587+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . keccak += 1 ;
588+
533589 self . pre_execute_syscall (
534590 remaining_gas,
535591 self . gas_costs ( ) . syscalls . keccak . base_syscall_cost ( ) ,
@@ -550,6 +606,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
550606 y : U256 ,
551607 remaining_gas : & mut u64 ,
552608 ) -> SyscallResult < Option < Secp256k1Point > > {
609+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256k1_new += 1 ;
610+
553611 self . pre_execute_syscall (
554612 remaining_gas,
555613 self . gas_costs ( ) . syscalls . secp256k1_new . base_syscall_cost ( ) ,
@@ -566,6 +624,7 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
566624 p1 : Secp256k1Point ,
567625 remaining_gas : & mut u64 ,
568626 ) -> SyscallResult < Secp256k1Point > {
627+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256k1_add += 1 ;
569628 self . pre_execute_syscall (
570629 remaining_gas,
571630 self . gas_costs ( ) . syscalls . secp256k1_add . base_syscall_cost ( ) ,
@@ -580,6 +639,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
580639 m : U256 ,
581640 remaining_gas : & mut u64 ,
582641 ) -> SyscallResult < Secp256k1Point > {
642+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256k1_mul += 1 ;
643+
583644 self . pre_execute_syscall (
584645 remaining_gas,
585646 self . gas_costs ( ) . syscalls . secp256k1_mul . base_syscall_cost ( ) ,
@@ -594,6 +655,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
594655 y_parity : bool ,
595656 remaining_gas : & mut u64 ,
596657 ) -> SyscallResult < Option < Secp256k1Point > > {
658+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256k1_get_point_from_x += 1 ;
659+
597660 self . pre_execute_syscall (
598661 remaining_gas,
599662 self . gas_costs ( ) . syscalls . secp256k1_get_point_from_x . base_syscall_cost ( ) ,
@@ -609,6 +672,7 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
609672 p : Secp256k1Point ,
610673 remaining_gas : & mut u64 ,
611674 ) -> SyscallResult < ( U256 , U256 ) > {
675+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256k1_get_xy += 1 ;
612676 self . pre_execute_syscall (
613677 remaining_gas,
614678 self . gas_costs ( ) . syscalls . secp256k1_get_xy . base_syscall_cost ( ) ,
@@ -623,6 +687,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
623687 y : U256 ,
624688 remaining_gas : & mut u64 ,
625689 ) -> SyscallResult < Option < Secp256r1Point > > {
690+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256r1_new += 1 ;
691+
626692 self . pre_execute_syscall (
627693 remaining_gas,
628694 self . gas_costs ( ) . syscalls . secp256r1_new . base_syscall_cost ( ) ,
@@ -639,6 +705,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
639705 p1 : Secp256r1Point ,
640706 remaining_gas : & mut u64 ,
641707 ) -> SyscallResult < Secp256r1Point > {
708+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256r1_add += 1 ;
709+
642710 self . pre_execute_syscall (
643711 remaining_gas,
644712 self . gas_costs ( ) . syscalls . secp256r1_add . base_syscall_cost ( ) ,
@@ -652,6 +720,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
652720 m : U256 ,
653721 remaining_gas : & mut u64 ,
654722 ) -> SyscallResult < Secp256r1Point > {
723+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256r1_mul += 1 ;
724+
655725 self . pre_execute_syscall (
656726 remaining_gas,
657727 self . gas_costs ( ) . syscalls . secp256r1_mul . base_syscall_cost ( ) ,
@@ -666,6 +736,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
666736 y_parity : bool ,
667737 remaining_gas : & mut u64 ,
668738 ) -> SyscallResult < Option < Secp256r1Point > > {
739+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256r1_get_point_from_x += 1 ;
740+
669741 self . pre_execute_syscall (
670742 remaining_gas,
671743 self . gas_costs ( ) . syscalls . secp256r1_get_point_from_x . base_syscall_cost ( ) ,
@@ -681,6 +753,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
681753 p : Secp256r1Point ,
682754 remaining_gas : & mut u64 ,
683755 ) -> SyscallResult < ( U256 , U256 ) > {
756+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . secp256r1_get_xy += 1 ;
757+
684758 self . pre_execute_syscall (
685759 remaining_gas,
686760 self . gas_costs ( ) . syscalls . secp256r1_get_xy . base_syscall_cost ( ) ,
@@ -695,6 +769,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
695769 current_block : & [ u32 ; 16 ] ,
696770 remaining_gas : & mut u64 ,
697771 ) -> SyscallResult < ( ) > {
772+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . sha256_process_block += 1 ;
773+
698774 self . pre_execute_syscall (
699775 remaining_gas,
700776 self . gas_costs ( ) . syscalls . sha256_process_block . base_syscall_cost ( ) ,
@@ -720,6 +796,7 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
720796 signature : & [ Felt ] ,
721797 remaining_gas : & mut u64 ,
722798 ) -> SyscallResult < Vec < Felt > > {
799+ SYSCALL_COUNTER . lock ( ) . unwrap ( ) . meta_tx_v0 += 1 ;
723800 todo ! (
724801 "implement meta_tx_v0 {:?}" ,
725802 ( address, entry_point_selector, calldata, signature, remaining_gas)
0 commit comments