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