LCOV - code coverage report
Current view: top level - flamenco/runtime/tests - fd_harness_common.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 0 108 0.0 %
Date: 2026-05-31 08:07:40 Functions: 0 8 0.0 %

          Line data    Source code
       1             : #include "fd_solfuzz_private.h"
       2             : #include "generated/context.pb.h"
       3             : #include "../fd_runtime.h"
       4             : #include "../fd_bank.h"
       5             : #include "../fd_system_ids.h"
       6             : #include "../../features/fd_features.h"
       7             : #include "../../accdb/fd_accdb_sync.h"
       8             : #include <assert.h>
       9             : 
      10             : void
      11             : fd_solfuzz_pb_restore_fee_rate_governor( fd_bank_t *                              bank,
      12           0 :                                          fd_exec_test_fee_rate_governor_t const * fee_rate_governor ) {
      13           0 :   fd_fee_rate_governor_t * frg = &bank->f.fee_rate_governor;
      14           0 :   *frg = (fd_fee_rate_governor_t){
      15           0 :     .target_lamports_per_signature = fee_rate_governor->target_lamports_per_signature,
      16           0 :     .target_signatures_per_slot    = fee_rate_governor->target_signatures_per_slot,
      17           0 :     .min_lamports_per_signature    = fee_rate_governor->min_lamports_per_signature,
      18           0 :     .max_lamports_per_signature    = fee_rate_governor->max_lamports_per_signature,
      19           0 :     .burn_percent                  = (uchar)fee_rate_governor->burn_percent,
      20           0 :   };
      21           0 : }
      22             : 
      23             : void
      24             : fd_solfuzz_pb_restore_epoch_schedule( fd_bank_t *                           bank,
      25           0 :                                       fd_exec_test_epoch_schedule_t const * epoch_schedule ) {
      26           0 :   fd_epoch_schedule_t * es = &bank->f.epoch_schedule;
      27           0 :   *es = (fd_epoch_schedule_t){
      28           0 :     .slots_per_epoch             = epoch_schedule->slots_per_epoch,
      29           0 :     .leader_schedule_slot_offset = epoch_schedule->leader_schedule_slot_offset,
      30           0 :     .warmup                      = epoch_schedule->warmup,
      31           0 :     .first_normal_epoch          = epoch_schedule->first_normal_epoch,
      32           0 :     .first_normal_slot           = epoch_schedule->first_normal_slot,
      33           0 :   };
      34           0 : }
      35             : 
      36             : void
      37             : fd_solfuzz_pb_restore_blockhash_queue( fd_bank_t *                                    bank,
      38             :                                        fd_exec_test_blockhash_queue_entry_t const *   entries,
      39           0 :                                        ulong                                          entries_cnt ) {
      40           0 :   ulong blockhash_seed; FD_TEST( fd_rng_secure( &blockhash_seed, sizeof(ulong) ) );
      41           0 :   fd_blockhashes_t * blockhashes = fd_blockhashes_init( &bank->f.block_hash_queue, blockhash_seed );
      42           0 :   for( ulong i=0UL; i<entries_cnt; i++ ) {
      43           0 :     fd_hash_t hash                   = FD_LOAD( fd_hash_t, entries[i].blockhash );
      44           0 :     ulong     lamports_per_signature = entries[i].lamports_per_signature;
      45             : 
      46           0 :     fd_blockhash_info_t * blockhash = fd_blockhashes_push_new( blockhashes, &hash );
      47           0 :     blockhash->lamports_per_signature = lamports_per_signature;
      48           0 :   }
      49           0 : }
      50             : 
      51             : ulong
      52             : fd_solfuzz_pb_get_slot( fd_exec_test_acct_state_t const * acct_states,
      53           0 :                         ulong                             acct_states_cnt ) {
      54           0 :   for( ulong i=0UL; i<acct_states_cnt; i++ ) {
      55           0 :     if( !memcmp( &acct_states[i].address, &fd_sysvar_clock_id, sizeof(fd_pubkey_t) ) ) {
      56           0 :       FD_TEST( acct_states[i].data->size==sizeof(fd_sol_sysvar_clock_t) );
      57           0 :       return FD_LOAD( ulong, acct_states[i].data->bytes );
      58           0 :     }
      59           0 :   }
      60           0 :   FD_LOG_ERR(( "invariant violation: clock sysvar account not found in acct states" ));
      61           0 : }
      62             : 
      63             : int
      64             : fd_solfuzz_pb_load_account( fd_runtime_t *                    runtime,
      65             :                             fd_accdb_user_t *                 accdb,
      66             :                             fd_funk_txn_xid_t const *         xid,
      67             :                             fd_exec_test_acct_state_t const * state,
      68           0 :                             ulong                             acc_idx ) {
      69           0 :   if( state->lamports==0UL ) return 0;
      70             : 
      71           0 :   ulong size = 0UL;
      72           0 :   if( state->data ) size = state->data->size;
      73             : 
      74           0 :   fd_pubkey_t pubkey[1];  memcpy( pubkey, state->address, sizeof(fd_pubkey_t) );
      75             : 
      76             :   /* Account must not yet exist */
      77           0 :   fd_accdb_ro_t ro[1];
      78           0 :   if( FD_UNLIKELY( fd_accdb_open_ro( accdb, ro, xid, pubkey ) ) ) {
      79           0 :     fd_accdb_close_ro( accdb, ro );
      80           0 :     return 0;
      81           0 :   }
      82             : 
      83           0 :   fd_accdb_rw_t rw[1];
      84           0 :   fd_accdb_open_rw( accdb, rw, xid, pubkey, size, FD_ACCDB_FLAG_CREATE );
      85           0 :   if( state->data ) {
      86           0 :     fd_accdb_ref_data_set( accdb, rw, state->data->bytes, size );
      87           0 :   }
      88           0 :   runtime->accounts.starting_lamports[ acc_idx ] = state->lamports;
      89           0 :   runtime->accounts.starting_dlen    [ acc_idx ] = size;
      90           0 :   fd_accdb_ref_lamports_set( rw, state->lamports   );
      91           0 :   fd_accdb_ref_exec_bit_set( rw, state->executable );
      92           0 :   fd_accdb_ref_owner_set   ( rw, state->owner      );
      93           0 :   fd_accdb_close_rw( accdb, rw );
      94             : 
      95           0 :   return 1;
      96           0 : }
      97             : 
      98             : int
      99             : fd_solfuzz_pb_restore_features( fd_features_t *                    features,
     100           0 :                                 fd_exec_test_feature_set_t const * feature_set ) {
     101           0 :   fd_features_disable_all( features );
     102           0 :   for( ulong j=0UL; j < feature_set->features_count; j++ ) {
     103           0 :     ulong                   prefix = feature_set->features[j];
     104           0 :     fd_feature_id_t const * id     = fd_feature_id_query( prefix );
     105           0 :     if( FD_UNLIKELY( !id ) ) {
     106           0 :       FD_LOG_WARNING(( "unsupported feature ID 0x%016lx", prefix ));
     107           0 :       return 0;
     108           0 :     }
     109             :     /* Enabled since genesis */
     110           0 :     fd_features_set( features, id, 0UL );
     111           0 :   }
     112           0 :   return 1;
     113           0 : }
     114             : 
     115             : void
     116             : fd_solfuzz_direct_mapping_handle_cu_exhaustion( fd_solfuzz_runner_t *       runner,
     117             :                                                 ulong                       cu_avail,
     118             :                                                 int                         has_err,
     119             :                                                 fd_exec_test_acct_state_t * accounts,
     120           0 :                                                 pb_size_t                   accounts_cnt ) {
     121           0 :   if( FD_FEATURE_ACTIVE_BANK( runner->bank, virtual_address_space_adjustments )
     122           0 :       && cu_avail == 0UL
     123           0 :       && has_err ) {
     124           0 :     for( pb_size_t i=0; i<accounts_cnt; i++ ) {
     125           0 :       accounts[i].data = NULL;
     126           0 :     }
     127           0 :   }
     128           0 : }
     129             : 
     130             : void
     131             : fd_solfuzz_pb_create_feature_accounts( fd_accdb_user_t *                  accdb,
     132             :                                        fd_funk_txn_xid_t const *          xid,
     133             :                                        fd_exec_test_feature_set_t const * feature_set,
     134             :                                        fd_exec_test_acct_state_t const *  acct_states,
     135           0 :                                        pb_size_t                          acct_states_count ) {
     136           0 :   for( ulong j=0UL; j<feature_set->features_count; j++ ) {
     137           0 :     fd_feature_id_t const * id = fd_feature_id_query( feature_set->features[j] );
     138           0 :     if( FD_UNLIKELY( !id ) ) continue;
     139             : 
     140             :     /* Skip if an acct_state already owns this pubkey so the
     141             :        caller-supplied state wins. */
     142           0 :     int collision = 0;
     143           0 :     for( pb_size_t i=0U; i<acct_states_count; i++ ) {
     144           0 :       if( !memcmp( acct_states[i].address, id->id.key, sizeof(fd_pubkey_t) ) ) {
     145           0 :         collision = 1;
     146           0 :         break;
     147           0 :       }
     148           0 :     }
     149           0 :     if( collision ) continue;
     150             : 
     151             :     /* Genesis activation slot */
     152           0 :     fd_feature_t feature = { .is_active = 1, .activation_slot = 0UL };
     153           0 :     uchar feature_data[ sizeof(fd_feature_t) ];
     154           0 :     fd_memcpy( feature_data, &feature, sizeof(feature) );
     155             : 
     156           0 :     fd_accdb_rw_t rw[1];
     157           0 :     FD_TEST( fd_accdb_open_rw( accdb, rw, xid, &id->id, sizeof(feature_data), FD_ACCDB_FLAG_CREATE ) );
     158           0 :     fd_accdb_ref_data_set    ( accdb, rw, feature_data, sizeof(feature_data) );
     159             : 
     160           0 :     fd_accdb_ref_lamports_set( rw, 100000000 );
     161           0 :     fd_accdb_ref_exec_bit_set( rw, 0 );
     162           0 :     fd_memcpy( rw->meta->owner, fd_solana_feature_program_id.key, sizeof(fd_pubkey_t) );
     163           0 :     fd_accdb_close_rw( accdb, rw );
     164           0 :   }
     165           0 : }

Generated by: LCOV version 1.14