Line data Source code
1 : #include "fd_sysvar.h" 2 : #include "../context/fd_exec_slot_ctx.h" 3 : #include "../context/fd_exec_instr_ctx.h" 4 : #include "../context/fd_exec_txn_ctx.h" 5 : 6 : #include "fd_sysvar_rent.h" 7 : 8 : /* https://github.com/anza-xyz/agave/blob/cbc8320d35358da14d79ebcada4dfb6756ffac79/runtime/src/bank.rs#L1813 */ 9 : int 10 : fd_sysvar_set( fd_bank_t * bank, 11 : fd_funk_t * funk, 12 : fd_funk_txn_t * funk_txn, 13 : fd_pubkey_t const * owner, 14 : fd_pubkey_t const * pubkey, 15 : void const * data, 16 : ulong sz, 17 0 : ulong slot ) { 18 : 19 0 : FD_TXN_ACCOUNT_DECL( rec ); 20 : 21 0 : int err = fd_txn_account_init_from_funk_mutable( rec, pubkey, funk, funk_txn, 1, sz ); 22 0 : if( FD_UNLIKELY( err != FD_ACC_MGR_SUCCESS ) ) 23 0 : return FD_ACC_MGR_ERR_READ_FAILED; 24 : 25 0 : fd_memcpy(rec->vt->get_data_mut( rec ), data, sz); 26 : 27 : /* https://github.com/anza-xyz/agave/blob/cbc8320d35358da14d79ebcada4dfb6756ffac79/runtime/src/bank.rs#L1825 */ 28 0 : fd_acc_lamports_t lamports_before = rec->vt->get_lamports( rec ); 29 : /* https://github.com/anza-xyz/agave/blob/ae18213c19ea5335dfc75e6b6116def0f0910aff/runtime/src/bank.rs#L6184 30 : The account passed in via the updater is always the current sysvar account, so we take the max of the 31 : current account lamports and the minimum rent exempt balance needed. */ 32 0 : fd_rent_t const * rent = fd_bank_rent_query( bank ); 33 0 : fd_acc_lamports_t lamports_after = fd_ulong_max( lamports_before, fd_rent_exempt_minimum_balance( rent, sz ) ); 34 0 : rec->vt->set_lamports( rec, lamports_after ); 35 : 36 : /* https://github.com/anza-xyz/agave/blob/cbc8320d35358da14d79ebcada4dfb6756ffac79/runtime/src/bank.rs#L1826 */ 37 0 : if( lamports_after > lamports_before ) { 38 0 : fd_bank_capitalization_set( bank, fd_bank_capitalization_get( bank ) + (lamports_after - lamports_before) ); 39 0 : } else if( lamports_after < lamports_before ) { 40 0 : fd_bank_capitalization_set( bank, fd_bank_capitalization_get( bank ) - (lamports_before - lamports_after) ); 41 0 : } 42 : 43 0 : rec->vt->set_data_len( rec, sz ); 44 0 : rec->vt->set_owner( rec, owner ); 45 0 : rec->vt->set_slot( rec, slot ); 46 : 47 0 : fd_txn_account_mutable_fini( rec, funk, funk_txn ); 48 0 : return 0; 49 0 : } 50 : 51 : int 52 : fd_sysvar_instr_acct_check( fd_exec_instr_ctx_t const * ctx, 53 : ulong idx, 54 0 : fd_pubkey_t const * addr_want ) { 55 : 56 0 : if( FD_UNLIKELY( idx >= ctx->instr->acct_cnt ) ) { 57 0 : return FD_EXECUTOR_INSTR_ERR_NOT_ENOUGH_ACC_KEYS; 58 0 : } 59 : 60 0 : ushort idx_in_txn = ctx->instr->accounts[idx].index_in_transaction; 61 0 : fd_pubkey_t const * addr_have = &ctx->txn_ctx->account_keys[ idx_in_txn ]; 62 0 : if( FD_UNLIKELY( 0!=memcmp( addr_have, addr_want, sizeof(fd_pubkey_t) ) ) ) { 63 0 : return FD_EXECUTOR_INSTR_ERR_INVALID_ARG; 64 0 : } 65 : 66 0 : return FD_EXECUTOR_INSTR_SUCCESS; 67 0 : }