@@ -179,11 +179,12 @@ handle_microblock( fd_bank_ctx_t * ctx,
179179 txn -> flags &= ~FD_TXN_P_FLAGS_EXECUTE_SUCCESS ;
180180
181181 txn_ctx -> exec_err = fd_runtime_prepare_and_execute_txn ( ctx -> banks , ctx -> _bank_idx , txn_ctx , txn , NULL , & ctx -> exec_stack , NULL , NULL );
182+ int to_pack = txn_ctx -> exec_err == FD_RUNTIME_EXECUTE_SUCCESS || txn_ctx -> exec_err == FD_RUNTIME_TXN_ERR_INSTRUCTION_ERROR || txn_ctx -> is_fees_only ;
182183
183184 /* Stash the result in the flags value so that pack can inspect it. */
184185 txn -> flags = (txn -> flags & 0x00FFFFFFU ) | ((uint )(- txn_ctx -> exec_err )<<24 );
185186
186- if ( FD_UNLIKELY ( !( txn_ctx -> flags & FD_TXN_P_FLAGS_SANITIZE_SUCCESS ) ) ) {
187+ if ( FD_UNLIKELY ( !to_pack ) ) {
187188 fd_pack_rebate_sum_add_txn ( ctx -> rebater , txn , NULL , 1UL );
188189 ctx -> metrics .txn_result [ fd_bank_err_from_runtime_err ( txn_ctx -> exec_err ) ]++ ;
189190 continue ;
@@ -192,7 +193,6 @@ handle_microblock( fd_bank_ctx_t * ctx,
192193 /* TXN_P_FLAGS_EXECUTE_SUCCESS means that it should be included in
193194 the block. It's a bit of a misnomer now that there are fee-only
194195 transactions. */
195- FD_TEST ( txn_ctx -> flags & FD_TXN_P_FLAGS_EXECUTE_SUCCESS );
196196 txn -> flags |= FD_TXN_P_FLAGS_EXECUTE_SUCCESS | FD_TXN_P_FLAGS_SANITIZE_SUCCESS ;
197197
198198 ctx -> metrics .txn_result [ fd_bank_err_from_runtime_err ( txn_ctx -> exec_err ) ]++ ;
@@ -211,7 +211,7 @@ handle_microblock( fd_bank_ctx_t * ctx,
211211 in finalize anyway. */
212212 fd_runtime_finalize_txn ( ctx -> txn_ctx -> funk , ctx -> txn_ctx -> progcache , txn_ctx -> status_cache , txn_ctx -> xid , txn_ctx , bank , NULL , & tips );
213213
214- if ( FD_UNLIKELY ( !txn_ctx -> flags ) ) {
214+ if ( FD_UNLIKELY ( !txn_ctx -> exec_err ) ) {
215215 /* If the transaction failed to fit into the block, we need to
216216 updated the transaction flag with the error code. */
217217 txn -> flags = (txn -> flags & 0x00FFFFFFU ) | ((uint )(- txn_ctx -> exec_err )<<24 );
@@ -356,7 +356,7 @@ handle_bundle( fd_bank_ctx_t * ctx,
356356
357357 txn_ctx -> exec_err = fd_runtime_prepare_and_execute_txn ( ctx -> banks , ctx -> _bank_idx , txn_ctx , txn , NULL , & ctx -> exec_stack_bundle [ i ], NULL , NULL );
358358 txn -> flags = (txn -> flags & 0x00FFFFFFU ) | ((uint )(- txn_ctx -> exec_err )<<24 );
359- if ( FD_UNLIKELY ( !( txn_ctx -> flags & FD_TXN_P_FLAGS_SANITIZE_SUCCESS ) || txn_ctx -> exec_err ) ) {
359+ if ( FD_UNLIKELY ( txn_ctx -> exec_err ) ) {
360360 execution_success = 0 ;
361361 continue ;
362362 }
@@ -377,7 +377,10 @@ handle_bundle( fd_bank_ctx_t * ctx,
377377
378378 txns [ i ].flags |= FD_TXN_P_FLAGS_EXECUTE_SUCCESS | FD_TXN_P_FLAGS_SANITIZE_SUCCESS ;
379379 fd_runtime_finalize_txn ( txn_ctx -> funk , txn_ctx -> progcache , txn_ctx -> status_cache , txn_ctx -> xid , txn_ctx , bank , NULL , & tips [ i ] );
380- if ( FD_UNLIKELY ( !txn_ctx -> flags ) ) {
380+ if ( FD_UNLIKELY ( txn_ctx -> exec_err == FD_RUNTIME_TXN_ERR_WOULD_EXCEED_MAX_BLOCK_COST_LIMIT ||
381+ txn_ctx -> exec_err == FD_RUNTIME_TXN_ERR_WOULD_EXCEED_MAX_VOTE_COST_LIMIT ||
382+ txn_ctx -> exec_err == FD_RUNTIME_TXN_ERR_WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT ||
383+ txn_ctx -> exec_err == FD_RUNTIME_TXN_ERR_WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT ) ) {
381384 txns [ i ].flags = (txns [ i ].flags & 0x00FFFFFFU ) | ((uint )(- txn_ctx -> exec_err )<<24 );
382385 fd_cost_tracker_t * cost_tracker = fd_bank_cost_tracker_locking_modify ( bank );
383386 int res = fd_cost_tracker_calculate_cost_and_add ( cost_tracker , txn_ctx );
@@ -390,6 +393,7 @@ handle_bundle( fd_bank_ctx_t * ctx,
390393 cost_tracker -> block_cost_limit , cost_tracker -> vote_cost_limit ,
391394 cost_tracker -> account_cost_limit ));
392395 }
396+ FD_TEST ( txn_ctx -> exec_err == FD_RUNTIME_EXECUTE_SUCCESS );
393397
394398 uint actual_execution_cus = (uint )(txn_ctx -> compute_budget_details .compute_unit_limit - txn_ctx -> compute_budget_details .compute_meter );
395399 uint actual_acct_data_cus = (uint )(txn_ctx -> loaded_accounts_data_size_cost );
0 commit comments