Skip to content

Commit c66cdcf

Browse files
committed
flamenco: cleanup unused / dirty fd_executor functions
1 parent 89082f9 commit c66cdcf

File tree

8 files changed

+112
-138
lines changed

8 files changed

+112
-138
lines changed

src/flamenco/runtime/fd_executor.c

Lines changed: 16 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -163,43 +163,6 @@ fd_executor_lookup_native_program( fd_txn_account_t const * prog_acc,
163163
return 0;
164164
}
165165

166-
static int
167-
fd_executor_is_system_nonce_account( fd_txn_account_t * account, fd_spad_t * exec_spad ) {
168-
if( !memcmp( fd_txn_account_get_owner( account ), fd_solana_system_program_id.uc, sizeof(fd_pubkey_t) ) ) {
169-
if( !fd_txn_account_get_data_len( account ) ) {
170-
return 0;
171-
} else {
172-
if( fd_txn_account_get_data_len( account )!=FD_SYSTEM_PROGRAM_NONCE_DLEN ) {
173-
return -1;
174-
}
175-
176-
int err;
177-
fd_nonce_state_versions_t * versions = fd_bincode_decode_spad(
178-
nonce_state_versions, exec_spad,
179-
fd_txn_account_get_data( account ),
180-
fd_txn_account_get_data_len( account ),
181-
&err );
182-
if( FD_UNLIKELY( err ) ) {
183-
return -1;
184-
}
185-
186-
fd_nonce_state_t * state = NULL;
187-
if( fd_nonce_state_versions_is_current( versions ) ) {
188-
state = &versions->inner.current;
189-
} else {
190-
state = &versions->inner.legacy;
191-
}
192-
193-
if( fd_nonce_state_is_initialized( state ) ) {
194-
return 1;
195-
}
196-
197-
}
198-
}
199-
200-
return -1;
201-
}
202-
203166
/* https://github.com/anza-xyz/agave/blob/v2.2.13/svm-rent-collector/src/svm_rent_collector.rs#L117-L136 */
204167
static uchar
205168
fd_executor_rent_transition_allowed( fd_rent_state_t const * pre_rent_state,
@@ -283,15 +246,15 @@ fd_validate_fee_payer( fd_txn_account_t * account,
283246
}
284247

285248
/* https://github.com/anza-xyz/agave/blob/v2.2.13/svm/src/account_loader.rs#L305-L308 */
286-
int is_nonce = fd_executor_is_system_nonce_account( account, exec_spad );
287-
if( FD_UNLIKELY( is_nonce<0 ) ) {
249+
int system_account_kind = fd_get_system_account_kind( account, exec_spad );
250+
if( FD_UNLIKELY( system_account_kind==FD_SYSTEM_PROGRAM_NONCE_ACCOUNT_KIND_UNKNOWN ) ) {
288251
return FD_RUNTIME_TXN_ERR_INVALID_ACCOUNT_FOR_FEE;
289252
}
290253

291254
/* https://github.com/anza-xyz/agave/blob/v2.2.13/svm/src/account_loader.rs#L309-L318 */
292255
ulong min_balance = 0UL;
293-
if( is_nonce ) {
294-
min_balance = fd_rent_exempt_minimum_balance( rent, 80 );
256+
if( system_account_kind==FD_SYSTEM_PROGRAM_NONCE_ACCOUNT_KIND_NONCE ) {
257+
min_balance = fd_rent_exempt_minimum_balance( rent, FD_SYSTEM_PROGRAM_NONCE_DLEN );
295258
}
296259

297260
/* https://github.com/anza-xyz/agave/blob/v2.2.13/svm/src/account_loader.rs#L320-L327 */
@@ -673,10 +636,9 @@ fd_increase_calculated_data_size( fd_exec_txn_ctx_t * txn_ctx,
673636
/* This function is represented as a closure in Agave.
674637
https://github.com/anza-xyz/agave/blob/v2.3.1/svm/src/account_loader.rs#L578-L640 */
675638
static int
676-
fd_collect_loaded_account( fd_exec_txn_ctx_t * txn_ctx,
677-
ushort idx,
678-
ulong loaded_acc_size ) {
679-
fd_txn_account_t const * account = &txn_ctx->accounts[idx];
639+
fd_collect_loaded_account( fd_exec_txn_ctx_t * txn_ctx,
640+
fd_txn_account_t const * account,
641+
ulong loaded_acc_size ) {
680642

681643
/* https://github.com/anza-xyz/agave/blob/v2.3.1/svm/src/account_loader.rs#L586-L590 */
682644
int err = fd_increase_calculated_data_size( txn_ctx, loaded_acc_size );
@@ -697,7 +659,7 @@ fd_collect_loaded_account( fd_exec_txn_ctx_t * txn_ctx,
697659

698660
/* Try to read the program state
699661
https://github.com/anza-xyz/agave/blob/v2.3.1/svm/src/account_loader.rs#L612-L634 */
700-
fd_bpf_upgradeable_loader_state_t * loader_state = read_bpf_upgradeable_loader_state_for_program( txn_ctx, idx, NULL );
662+
fd_bpf_upgradeable_loader_state_t * loader_state = fd_bpf_loader_program_get_state( account, txn_ctx->spad, NULL );
701663
if( FD_UNLIKELY( !loader_state ) ) {
702664
return FD_RUNTIME_EXECUTE_SUCCESS;
703665
}
@@ -785,7 +747,7 @@ fd_executor_load_transaction_accounts_simd_186( fd_exec_txn_ctx_t * txn_ctx ) {
785747
is enabled. */
786748
ulong loaded_acc_size = fd_ulong_sat_add( FD_TRANSACTION_ACCOUNT_BASE_SIZE,
787749
fd_txn_account_get_data_len( acct ) );
788-
int err = fd_collect_loaded_account( txn_ctx, i, loaded_acc_size );
750+
int err = fd_collect_loaded_account( txn_ctx, acct, loaded_acc_size );
789751
if( FD_UNLIKELY( err!=FD_RUNTIME_EXECUTE_SUCCESS ) ) {
790752
return err;
791753
}
@@ -795,7 +757,7 @@ fd_executor_load_transaction_accounts_simd_186( fd_exec_txn_ctx_t * txn_ctx ) {
795757
/* Load and collect any remaining accounts
796758
https://github.com/anza-xyz/agave/blob/v2.3.1/svm/src/account_loader.rs#L652-L659 */
797759
ulong loaded_acc_size = load_transaction_account( txn_ctx, acct, is_writable, epoch, unknown_acc );
798-
int err = fd_collect_loaded_account( txn_ctx, i, loaded_acc_size );
760+
int err = fd_collect_loaded_account( txn_ctx, acct, loaded_acc_size );
799761
if( FD_UNLIKELY( err!=FD_RUNTIME_EXECUTE_SUCCESS ) ) {
800762
return err;
801763
}
@@ -1487,12 +1449,12 @@ fd_executor_setup_txn_account( fd_exec_txn_ctx_t * txn_ctx,
14871449
return txn_account;
14881450
}
14891451

1490-
void
1491-
fd_executor_setup_executable_account( fd_exec_txn_ctx_t * txn_ctx,
1492-
ushort acc_idx,
1493-
ushort * executable_idx ) {
1452+
static void
1453+
fd_executor_setup_executable_account( fd_exec_txn_ctx_t * txn_ctx,
1454+
fd_txn_account_t const * account,
1455+
ushort * executable_idx ) {
14941456
int err = 0;
1495-
fd_bpf_upgradeable_loader_state_t * program_loader_state = read_bpf_upgradeable_loader_state_for_program( txn_ctx, acc_idx, &err );
1457+
fd_bpf_upgradeable_loader_state_t * program_loader_state = fd_bpf_loader_program_get_state( account, txn_ctx->spad, &err );
14961458
if( FD_UNLIKELY( !program_loader_state ) ) {
14971459
return;
14981460
}
@@ -1525,7 +1487,7 @@ fd_executor_setup_accounts_for_txn( fd_exec_txn_ctx_t * txn_ctx ) {
15251487

15261488
if( FD_UNLIKELY( txn_account &&
15271489
memcmp( fd_txn_account_get_owner( txn_account ), fd_solana_bpf_loader_upgradeable_program_id.key, sizeof(fd_pubkey_t) ) == 0 ) ) {
1528-
fd_executor_setup_executable_account( txn_ctx, i, &j );
1490+
fd_executor_setup_executable_account( txn_ctx, txn_account, &j );
15291491
}
15301492
}
15311493

src/flamenco/runtime/fd_executor_err.h

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,6 @@
1010

1111
/* Instruction error codes */
1212

13-
/* TODO make sure these are serialized consistently with solana_program::InstructionError */
14-
/* TODO FD_EXECUTOR_INSTR_SUCCESS is used like Ok(()) in Rust. But this is both overloaded and a
15-
misnomer, because the instruction hasn't necessarily been executed successfully yet */
16-
1713
#define FD_EXECUTOR_INSTR_ERR_FATAL ( INT_MIN ) /* Unrecoverable error */
1814
#define FD_EXECUTOR_INSTR_SUCCESS ( 0 ) /* Instruction executed successfully */
1915
#define FD_EXECUTOR_INSTR_ERR_GENERIC_ERR ( -1 ) /* The program instruction returned an error */
@@ -71,27 +67,4 @@
7167
#define FD_EXECUTOR_INSTR_ERR_MAX_INSN_TRACE_LENS_EXCEEDED ( -53 ) /* Max instruction trace length exceeded */
7268
#define FD_EXECUTOR_INSTR_ERR_BUILTINS_MUST_CONSUME_CUS ( -54 ) /* Builtin programs must consume compute units */
7369

74-
#define FD_EXECUTOR_SYSTEM_ERR_ACCOUNT_ALREADY_IN_USE ( -1 ) /* an account with the same address already exists */
75-
#define FD_EXECUTOR_SYSTEM_ERR_RESULTS_WITH_NEGATIVE_LAMPORTS ( -2 ) /* account does not have enough SOL to perform the operation */
76-
#define FD_EXECUTOR_SYSTEM_ERR_INVALID_PROGRAM_ID ( -3 ) /* cannot assign account to this program id */
77-
#define FD_EXECUTOR_SYSTEM_ERR_INVALID_ACCOUNT_DATA_LENGTH ( -4 ) /* cannot allocate account data of this length */
78-
#define FD_EXECUTOR_SYSTEM_ERR_MAX_SEED_LENGTH_EXCEEDED ( -5 ) /* length of requested seed is too long */
79-
#define FD_EXECUTOR_SYSTEM_ERR_ADDRESS_WITH_SEED_MISMATCH ( -6 ) /* provided address does not match addressed derived from seed */
80-
#define FD_EXECUTOR_SYSTEM_ERR_NONCE_NO_RECENT_BLOCKHASHES ( -7 ) /* advancing stored nonce requires a populated RecentBlockhashes sysvar */
81-
#define FD_EXECUTOR_SYSTEM_ERR_NONCE_BLOCKHASH_NOT_EXPIRED ( -8 ) /* stored nonce is still in recent_blockhashes */
82-
#define FD_EXECUTOR_SYSTEM_ERR_NONCE_UNEXPECTED_BLOCKHASH_VALUE ( -9 ) /* specified nonce does not match stored nonce */
83-
84-
/* PrecompileError
85-
https://github.com/anza-xyz/agave/blob/v1.18.12/sdk/src/precompiles.rs#L16
86-
Agave distinguishes between 5 errors and the returned one depends on
87-
the order they decided to write their code.
88-
These are all fatal errors, so the specific errors don't matter for
89-
consensus.
90-
To simplify our fuzzers, we return the same error code for all errors. */
91-
#define FD_EXECUTOR_PRECOMPILE_ERR_PUBLIC_KEY ( 0 )
92-
#define FD_EXECUTOR_PRECOMPILE_ERR_RECOVERY_ID ( 1 )
93-
#define FD_EXECUTOR_PRECOMPILE_ERR_SIGNATURE ( 2 )
94-
#define FD_EXECUTOR_PRECOMPILE_ERR_DATA_OFFSET ( 3 )
95-
#define FD_EXECUTOR_PRECOMPILE_ERR_INSTR_DATA_SIZE ( 4 )
96-
9770
#endif /* HEADER_fd_src_flamenco_runtime_fd_executor_err_h */

src/flamenco/runtime/program/fd_bpf_loader_program.c

Lines changed: 8 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -92,38 +92,6 @@ program_error_to_instr_error( ulong err,
9292
}
9393
}
9494

95-
/* TODO: This can be combined with the other bpf loader state decode function */
96-
fd_bpf_upgradeable_loader_state_t *
97-
read_bpf_upgradeable_loader_state_for_program( fd_exec_txn_ctx_t * txn_ctx,
98-
ushort program_id,
99-
int * opt_err ) {
100-
fd_txn_account_t * rec = NULL;
101-
int err = fd_exec_txn_ctx_get_account_at_index( txn_ctx,
102-
program_id,
103-
&rec,
104-
fd_txn_account_check_exists );
105-
if( FD_UNLIKELY( err ) ) {
106-
if( opt_err ) {
107-
*opt_err = err;
108-
}
109-
return NULL;
110-
}
111-
112-
fd_bpf_upgradeable_loader_state_t * res = fd_bincode_decode_spad(
113-
bpf_upgradeable_loader_state,
114-
txn_ctx->spad,
115-
fd_txn_account_get_data( rec ),
116-
fd_txn_account_get_data_len( rec ),
117-
&err );
118-
if( FD_UNLIKELY( err ) ) {
119-
if( opt_err ) {
120-
*opt_err = FD_EXECUTOR_INSTR_ERR_INVALID_ACC_DATA;
121-
}
122-
return NULL;
123-
}
124-
return res;
125-
}
126-
12795
/* https://github.com/anza-xyz/agave/blob/9b22f28104ec5fd606e4bb39442a7600b38bb671/programs/bpf_loader/src/lib.rs#L216-L229 */
12896
static ulong
12997
calculate_heap_cost( ulong heap_size, ulong heap_cost ) {
@@ -325,18 +293,20 @@ write_program_data( fd_exec_instr_ctx_t * instr_ctx,
325293
fd_bpf_upgradeable_loader_state_t *
326294
fd_bpf_loader_program_get_state( fd_txn_account_t const * acct,
327295
fd_spad_t * spad,
328-
int * err ) {
296+
int * opt_err ) {
297+
int err;
329298
fd_bpf_upgradeable_loader_state_t * res = fd_bincode_decode_spad(
330299
bpf_upgradeable_loader_state,
331300
spad,
332301
fd_txn_account_get_data( acct ),
333302
fd_txn_account_get_data_len( acct ),
334-
err );
335-
if( FD_UNLIKELY( *err ) ) {
336-
*err = FD_EXECUTOR_INSTR_ERR_INVALID_ACC_DATA;
337-
return NULL;
303+
&err );
304+
305+
if( opt_err ) {
306+
*opt_err = FD_UNLIKELY( err ) ? FD_EXECUTOR_INSTR_ERR_INVALID_ACC_DATA : FD_EXECUTOR_INSTR_SUCCESS;
338307
}
339-
return res;
308+
309+
return FD_UNLIKELY( err ) ? NULL : res;
340310
}
341311

342312
/* Mirrors solana_sdk::transaction_context::BorrowedAccount::set_state()

src/flamenco/runtime/program/fd_bpf_loader_program.h

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ FD_PROTOTYPES_BEGIN
5959
https://github.com/anza-xyz/agave/blob/v2.1.14/sdk/src/transaction_context.rs#L965-L969 */
6060

6161
fd_bpf_upgradeable_loader_state_t *
62-
fd_bpf_loader_program_get_state( fd_txn_account_t const * acc,
62+
fd_bpf_loader_program_get_state( fd_txn_account_t const * acct,
6363
fd_spad_t * spad,
64-
int * err );
64+
int * opt_err );
6565

6666
void
6767
fd_bpf_get_sbpf_versions( uint * sbpf_min_version,
@@ -84,14 +84,6 @@ fd_bpf_execute( fd_exec_instr_ctx_t * instr_ctx,
8484
int
8585
fd_bpf_loader_program_execute( fd_exec_instr_ctx_t * instr_ctx );
8686

87-
/* read_bpf_upgradeable_loader_state_for_program allocates and returns the
88-
bpf loader state for a given program id account within the scope of a txn. */
89-
90-
fd_bpf_upgradeable_loader_state_t *
91-
read_bpf_upgradeable_loader_state_for_program( fd_exec_txn_ctx_t * txn_ctx,
92-
ushort program_id,
93-
int * opt_err );
94-
9587
/* Public APIs */
9688

9789
/* This function is called from `fd_runtime.c` and only performs the ELF and VM validation checks necessary

src/flamenco/runtime/program/fd_precompiles.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,19 @@
44
#include "../fd_runtime.h"
55
#include "../context/fd_exec_instr_ctx.h"
66

7+
/* PrecompileError
8+
https://github.com/anza-xyz/agave/blob/v1.18.12/sdk/src/precompiles.rs#L16
9+
Agave distinguishes between 5 errors and the returned one depends on
10+
the order they decided to write their code.
11+
These are all fatal errors, so the specific errors don't matter for
12+
consensus.
13+
To simplify our fuzzers, we return the same error code for all errors. */
14+
#define FD_EXECUTOR_PRECOMPILE_ERR_PUBLIC_KEY ( 0 )
15+
#define FD_EXECUTOR_PRECOMPILE_ERR_RECOVERY_ID ( 1 )
16+
#define FD_EXECUTOR_PRECOMPILE_ERR_SIGNATURE ( 2 )
17+
#define FD_EXECUTOR_PRECOMPILE_ERR_DATA_OFFSET ( 3 )
18+
#define FD_EXECUTOR_PRECOMPILE_ERR_INSTR_DATA_SIZE ( 4 )
19+
720
FD_PROTOTYPES_BEGIN
821

922
/* fd_precompile_ed25519_verify is the instruction processing entrypoint

src/flamenco/runtime/program/fd_system_program.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -719,3 +719,50 @@ fd_system_program_execute( fd_exec_instr_ctx_t * ctx ) {
719719

720720
return result;
721721
}
722+
723+
/**********************************************************************/
724+
/* Public API */
725+
/**********************************************************************/
726+
727+
int
728+
fd_get_system_account_kind( fd_txn_account_t * account,
729+
fd_spad_t * exec_spad ) {
730+
/* https://github.com/anza-xyz/solana-sdk/blob/nonce-account%40v2.2.1/nonce-account/src/lib.rs#L56 */
731+
if( FD_UNLIKELY( memcmp( fd_txn_account_get_owner( account ), fd_solana_system_program_id.uc, sizeof(fd_pubkey_t) ) ) ) {
732+
return FD_SYSTEM_PROGRAM_NONCE_ACCOUNT_KIND_UNKNOWN;
733+
}
734+
735+
/* https://github.com/anza-xyz/solana-sdk/blob/nonce-account%40v2.2.1/nonce-account/src/lib.rs#L57-L58 */
736+
if( FD_LIKELY( !fd_txn_account_get_data_len( account ) ) ) {
737+
return FD_SYSTEM_PROGRAM_NONCE_ACCOUNT_KIND_SYSTEM;
738+
}
739+
740+
/* https://github.com/anza-xyz/solana-sdk/blob/nonce-account%40v2.2.1/nonce-account/src/lib.rs#L59 */
741+
if( FD_UNLIKELY( fd_txn_account_get_data_len( account )!=FD_SYSTEM_PROGRAM_NONCE_DLEN ) ) {
742+
return FD_SYSTEM_PROGRAM_NONCE_ACCOUNT_KIND_UNKNOWN;
743+
}
744+
745+
/* https://github.com/anza-xyz/solana-sdk/blob/nonce-account%40v2.2.1/nonce-account/src/lib.rs#L60-L64 */
746+
int err;
747+
fd_nonce_state_versions_t * versions = fd_bincode_decode_spad(
748+
nonce_state_versions, exec_spad,
749+
fd_txn_account_get_data( account ),
750+
fd_txn_account_get_data_len( account ),
751+
&err );
752+
if( FD_UNLIKELY( err ) ) {
753+
return FD_SYSTEM_PROGRAM_NONCE_ACCOUNT_KIND_UNKNOWN;
754+
}
755+
756+
fd_nonce_state_t * state = NULL;
757+
if( fd_nonce_state_versions_is_current( versions ) ) {
758+
state = &versions->inner.current;
759+
} else {
760+
state = &versions->inner.legacy;
761+
}
762+
763+
if( FD_LIKELY( fd_nonce_state_is_initialized( state ) ) ) {
764+
return FD_SYSTEM_PROGRAM_NONCE_ACCOUNT_KIND_NONCE;
765+
}
766+
767+
return FD_SYSTEM_PROGRAM_NONCE_ACCOUNT_KIND_UNKNOWN;
768+
}

src/flamenco/runtime/program/fd_system_program.h

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818

1919
#define FD_SYSTEM_PROGRAM_NONCE_DLEN (80UL)
2020

21+
/* https://github.com/anza-xyz/solana-sdk/blob/nonce-account%40v2.2.1/nonce-account/src/lib.rs#L49-L53 */
22+
#define FD_SYSTEM_PROGRAM_NONCE_ACCOUNT_KIND_UNKNOWN (-1)
23+
#define FD_SYSTEM_PROGRAM_NONCE_ACCOUNT_KIND_SYSTEM (0)
24+
#define FD_SYSTEM_PROGRAM_NONCE_ACCOUNT_KIND_NONCE (1)
25+
2126
FD_PROTOTYPES_BEGIN
2227

2328
/* fd_system_program_execute is the entrypoint for the system program */
@@ -42,14 +47,27 @@ int fd_system_program_exec_upgrade_nonce_account ( fd_exec_instr_ctx_t * ctx
4247

4348
/* User APIs */
4449

45-
/* fd_check_transaction_age returns 0 if the transactions age is
46-
valid, returns non-zero otherwise. This is determined by the age of
47-
the blockhash provided in the transaction message or by the
48-
validity of the nonce provided in the transaction. */
50+
/* fd_check_transaction_age returns 0 if the transactions age is valid,
51+
returns non-zero otherwise. This is determined by the age of the
52+
blockhash provided in the transaction message or by the validity of
53+
the nonce provided in the transaction. */
4954

5055
int
5156
fd_check_transaction_age( fd_exec_txn_ctx_t * txn_ctx );
5257

58+
/* `fd_get_system_account_kind()` determines whether an account is
59+
a normal system program account or a nonce account. Returns:
60+
- FD_SYSTEM_PROGRAM_NONCE_ACCOUNT_KIND_SYSTEM if the account is a
61+
normal system program account
62+
- FD_SYSTEM_PROGRAM_NONCE_ACCOUNT_KIND_NONCE if the account is a
63+
nonce account
64+
- FD_SYSTEM_PROGRAM_NONCE_ACCOUNT_KIND_UNKNOWN otherwise
65+
https://github.com/anza-xyz/solana-sdk/blob/nonce-account%40v2.2.1/nonce-account/src/lib.rs#L55-L71 */
66+
67+
int
68+
fd_get_system_account_kind( fd_txn_account_t * account,
69+
fd_spad_t * exec_spad );
70+
5371
FD_PROTOTYPES_END
5472

5573
#endif /* HEADER_fd_src_flamenco_runtime_program_fd_system_program_h */

src/flamenco/runtime/tests/harness/fd_instr_harness.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -196,11 +196,10 @@ fd_runtime_fuzz_instr_ctx_create( fd_runtime_fuzz_runner_t * runner,
196196
continue;
197197
}
198198

199-
if( FD_UNLIKELY( 0 == memcmp(meta->info.owner, fd_solana_bpf_loader_upgradeable_program_id.key, sizeof(fd_pubkey_t)) ) ) {
200-
int err = 0;
201-
fd_bpf_upgradeable_loader_state_t * program_loader_state = read_bpf_upgradeable_loader_state_for_program( txn_ctx,
202-
(ushort)i,
203-
&err );
199+
if( FD_UNLIKELY( !memcmp(meta->info.owner, fd_solana_bpf_loader_upgradeable_program_id.key, sizeof(fd_pubkey_t)) ) ) {
200+
fd_bpf_upgradeable_loader_state_t * program_loader_state = fd_bpf_loader_program_get_state( acc,
201+
txn_ctx->spad,
202+
NULL );
204203

205204
if( FD_UNLIKELY( !program_loader_state ) ) {
206205
continue;

0 commit comments

Comments
 (0)