LCOV - code coverage report
Current view: top level - flamenco/runtime - fd_accdb_svm.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 83 94 88.3 %
Date: 2026-08-28 06:53:58 Functions: 6 6 100.0 %

          Line data    Source code
       1             : #include "fd_accdb_svm.h"
       2             : #include "fd_hashes.h"
       3             : #include "fd_bank.h"
       4             : #include "../capture/fd_capture_ctx.h"
       5             : 
       6             : static void
       7             : log_account_change( fd_bank_t const *  bank,
       8             :                     fd_acc_t * ro,
       9        7194 :                     fd_capture_ctx_t * capture_ctx ) {
      10        7194 :   if( FD_UNLIKELY( capture_ctx &&
      11        7194 :                    capture_ctx->capture_solcap &&
      12        7194 :                   bank->f.slot>=capture_ctx->solcap_start_slot ) ) {
      13           0 :     fd_solana_account_meta_t solana_meta[1];
      14           0 :     fd_solana_account_meta_init( solana_meta, ro->lamports, ro->owner, ro->executable );
      15           0 :     fd_capture_link_write_account_update(
      16           0 :         capture_ctx,
      17           0 :         capture_ctx->current_txn_idx,
      18           0 :         (fd_pubkey_t const *)ro->pubkey,
      19           0 :         solana_meta,
      20           0 :         bank->f.slot,
      21           0 :         ro->data,
      22           0 :         ro->data_len );
      23           0 :   }
      24        7194 : }
      25             : 
      26             : fd_acc_t
      27             : fd_accdb_svm_open_rw( fd_bank_t *             bank,
      28             :                       fd_accdb_t *            accdb,
      29             :                       fd_accdb_svm_update_t * update,
      30             :                       fd_pubkey_t const *     pubkey,
      31        7206 :                       int                     create ) {
      32        7206 :   fd_acc_t acc = fd_accdb_write_one( accdb, bank->accdb_fork_id, pubkey->uc );
      33        7206 :   if( FD_UNLIKELY( !acc.lamports && !create ) ) {
      34          12 :     fd_accdb_unwrite_one( accdb, &acc );
      35          12 :     return acc;
      36          12 :   }
      37             : 
      38        7194 :   update->lamports_before = acc.lamports;
      39             : 
      40        7194 :   fd_lthash_value_t hash[1];
      41        7194 :   fd_hashes_account_lthash_simple( acc.pubkey, acc.owner, acc.lamports, acc.executable, acc.data, acc.data_len, hash );
      42             : 
      43        7194 :   fd_lthash_value_t * bank_lthash = fd_bank_lthash_locking_modify( bank );
      44        7194 :   fd_lthash_sub( bank_lthash, hash );
      45        7194 :   fd_bank_lthash_end_locking_modify( bank );
      46             : 
      47        7194 :   return acc;
      48        7206 : }
      49             : 
      50             : void
      51             : fd_accdb_svm_close_rw( fd_bank_t *             bank,
      52             :                        fd_accdb_t *            accdb,
      53             :                        fd_capture_ctx_t *      capture_ctx,
      54             :                        fd_acc_t *      acc,
      55        7194 :                        fd_accdb_svm_update_t * update ) {
      56        7194 :   if( FD_UNLIKELY( acc->lamports>update->lamports_before ) ) {
      57         147 :     ulong delta = acc->lamports-update->lamports_before;
      58         147 :     FD_TEST( !__builtin_uaddl_overflow( bank->f.capitalization, delta, &bank->f.capitalization ) );
      59        7047 :   } else if( FD_UNLIKELY( acc->lamports<update->lamports_before ) ) {
      60          12 :     ulong delta = update->lamports_before-acc->lamports;
      61          12 :     FD_TEST( !__builtin_usubl_overflow( bank->f.capitalization, delta, &bank->f.capitalization ) );
      62          12 :   }
      63             : 
      64        7194 :   fd_lthash_value_t hash[1];
      65        7194 :   fd_hashes_account_lthash_simple( acc->pubkey, acc->owner, acc->lamports, acc->executable, acc->data, acc->data_len, hash );
      66             : 
      67        7194 :   fd_lthash_value_t * bank_lthash = fd_bank_lthash_locking_modify( bank );
      68        7194 :   fd_lthash_add( bank_lthash, hash );
      69        7194 :   fd_bank_lthash_end_locking_modify( bank );
      70             : 
      71        7194 :   log_account_change( bank, acc, capture_ctx );
      72        7194 :   acc->commit = 1;
      73        7194 :   fd_accdb_unwrite_one( accdb, acc );
      74        7194 : }
      75             : 
      76             : void
      77             : fd_accdb_svm_credit( fd_bank_t *         bank,
      78             :                      fd_accdb_t *        accdb,
      79             :                      fd_capture_ctx_t *  capture_ctx,
      80             :                      fd_pubkey_t const * pubkey,
      81          42 :                      ulong               lamports_add ) {
      82          42 :   if( FD_UNLIKELY( !lamports_add ) ) return;
      83             : 
      84          42 :   fd_acc_t acc = fd_accdb_write_one( accdb, bank->accdb_fork_id, pubkey->uc );
      85             : 
      86          42 :   fd_lthash_value_t hash[1];
      87          42 :   fd_hashes_account_lthash_simple( acc.pubkey, acc.owner, acc.lamports, acc.executable, acc.data, acc.data_len, hash );
      88          42 :   FD_TEST( !__builtin_uaddl_overflow( acc.lamports, lamports_add, &acc.lamports ) );
      89          42 :   FD_TEST( !__builtin_uaddl_overflow( bank->f.capitalization, lamports_add, &bank->f.capitalization ) );
      90             : 
      91          42 :   fd_lthash_value_t post[1];
      92          42 :   fd_hashes_update_simple( post, hash, pubkey->uc, acc.owner, acc.lamports, acc.executable, acc.data, acc.data_len, bank, capture_ctx );
      93          42 :   acc.commit = 1;
      94          42 :   fd_accdb_unwrite_one( accdb, &acc );
      95          42 : }
      96             : 
      97             : void
      98             : fd_accdb_svm_write( fd_bank_t *         bank,
      99             :                     fd_accdb_t *        accdb,
     100             :                     fd_capture_ctx_t *  capture_ctx,
     101             :                     fd_pubkey_t const * pubkey,
     102             :                     fd_pubkey_t const * owner,
     103             :                     void const *        data,
     104             :                     ulong               sz,
     105             :                     ulong               lamports_min,
     106        5970 :                     int                 exec_bit ) {
     107        5970 :   fd_acc_t acc = fd_accdb_write_one( accdb, bank->accdb_fork_id, pubkey->uc );
     108             : 
     109        5970 :   fd_lthash_value_t hash[1];
     110        5970 :   fd_hashes_account_lthash_simple( acc.pubkey, acc.owner, acc.lamports, acc.executable, acc.data, acc.data_len, hash );
     111             : 
     112        5970 :   if( FD_UNLIKELY( acc.lamports<lamports_min ) ) {
     113         453 :     ulong delta = lamports_min - acc.lamports;
     114         453 :     acc.lamports = lamports_min;
     115         453 :     FD_TEST( !__builtin_uaddl_overflow( bank->f.capitalization, delta, &bank->f.capitalization ) );
     116         453 :   }
     117             : 
     118        5970 :   fd_memcpy( acc.owner, owner, 32UL );
     119        5970 :   acc.executable = !!exec_bit;
     120             : 
     121        5970 :   fd_memcpy( acc.data, data, sz );
     122        5970 :   acc.data_len = sz;
     123             : 
     124        5970 :   fd_lthash_value_t post[1];
     125        5970 :   fd_hashes_update_simple( post, hash, pubkey->uc, acc.owner, acc.lamports, acc.executable, acc.data, acc.data_len, bank, capture_ctx );
     126        5970 :   acc.commit = 1;
     127        5970 :   fd_accdb_unwrite_one( accdb, &acc );
     128        5970 : }
     129             : 
     130             : ulong
     131             : fd_accdb_svm_remove( fd_bank_t *         bank,
     132             :                      fd_accdb_t *        accdb,
     133             :                      fd_capture_ctx_t *  capture_ctx,
     134         345 :                      fd_pubkey_t const * pubkey ) {
     135         345 :   fd_acc_t acc = fd_accdb_write_one( accdb, bank->accdb_fork_id, pubkey->uc );
     136         345 :   if( FD_UNLIKELY( !acc.lamports ) ) {
     137         333 :     fd_accdb_unwrite_one( accdb, &acc );
     138         333 :     return 0UL;
     139         333 :   }
     140             : 
     141          12 :   ulong burned = acc.lamports;
     142             : 
     143          12 :   fd_lthash_value_t hash[1];
     144          12 :   fd_hashes_account_lthash_simple( acc.pubkey, acc.owner, acc.lamports, acc.executable, acc.data, acc.data_len, hash );
     145             : 
     146          12 :   bank->f.capitalization -= burned;
     147          12 :   acc.lamports = 0UL;
     148             : 
     149          12 :   fd_lthash_value_t post[1];
     150          12 :   fd_hashes_update_simple( post, hash, pubkey->uc, acc.owner, acc.lamports, acc.executable, acc.data, acc.data_len, bank, capture_ctx );
     151          12 :   acc.commit = 1;
     152          12 :   fd_accdb_unwrite_one( accdb, &acc );
     153          12 :   return burned;
     154         345 : }

Generated by: LCOV version 1.14