@@ -55,6 +55,7 @@ typedef struct {
5555 for non-bundle execution. */
5656 fd_exec_txn_ctx_t txn_ctx [ FD_PACK_MAX_TXN_PER_BUNDLE ];
5757 fd_exec_accounts_t exec_accounts [ FD_PACK_MAX_TXN_PER_BUNDLE ];
58+ fd_txn_in_t txn_in [ FD_PACK_MAX_TXN_PER_BUNDLE ];
5859 fd_txn_out_t txn_out [ FD_PACK_MAX_TXN_PER_BUNDLE ];
5960 fd_exec_stack_t exec_stack ;
6061
@@ -173,6 +174,7 @@ handle_microblock( fd_bank_ctx_t * ctx,
173174 for ( ulong i = 0UL ; i < txn_cnt ; i ++ ) {
174175 fd_txn_p_t * txn = (fd_txn_p_t * )( dst + (i * sizeof (fd_txn_p_t )) );
175176 fd_exec_txn_ctx_t * txn_ctx = & ctx -> txn_ctx [ 0 ];
177+ fd_txn_in_t * txn_in = & ctx -> txn_in [ 0 ];
176178 fd_txn_out_t * txn_out = & ctx -> txn_out [ 0 ];
177179 ctx -> txn_ctx -> bundle .is_bundle = 0 ;
178180
@@ -186,12 +188,14 @@ handle_microblock( fd_bank_ctx_t * ctx,
186188 txn -> flags &= ~FD_TXN_P_FLAGS_SANITIZE_SUCCESS ;
187189 txn -> flags &= ~FD_TXN_P_FLAGS_EXECUTE_SUCCESS ;
188190
191+ txn_in -> txn = * txn ;
192+
189193 fd_bank_t * bank = fd_banks_bank_query ( ctx -> banks , ctx -> _bank_idx );
190194 FD_TEST ( bank );
191195 txn_out -> err .exec_err = fd_runtime_prepare_and_execute_txn ( & ctx -> runtime ,
192196 bank ,
197+ txn_in ,
193198 txn_ctx ,
194- txn ,
195199 txn_out ,
196200 NULL ,
197201 & ctx -> exec_accounts [0 ],
@@ -231,15 +235,15 @@ handle_microblock( fd_bank_ctx_t * ctx,
231235 if that happens. We cannot reject the transaction here as there
232236 would be no way to undo the partially applied changes to the bank
233237 in finalize anyway. */
234- fd_runtime_commit_txn ( & ctx -> runtime , bank , txn_out , txn_ctx , NULL , & tips );
238+ fd_runtime_commit_txn ( & ctx -> runtime , bank , txn_in , txn_out , txn_ctx , NULL , & tips );
235239
236240 if ( FD_UNLIKELY ( !txn_out -> err .is_committable ) ) {
237241 /* If the transaction failed to fit into the block, we need to
238242 updated the transaction flag with the error code. */
239243 txn -> flags = (txn -> flags & 0x00FFFFFFU ) | ((uint )(- txn_out -> err .exec_err )<<24 );
240244 fd_cost_tracker_t * cost_tracker = fd_bank_cost_tracker_locking_modify ( bank );
241- uchar * signature = (uchar * )txn_ctx -> txn .payload + TXN ( & txn_ctx -> txn )-> signature_off ;
242- int res = fd_cost_tracker_calculate_cost_and_add ( cost_tracker , txn_out , txn_ctx );
245+ uchar * signature = (uchar * )txn_in -> txn .payload + TXN ( & txn_in -> txn )-> signature_off ;
246+ int res = fd_cost_tracker_calculate_cost_and_add ( cost_tracker , txn_in , txn_out , txn_ctx );
243247 FD_LOG_HEXDUMP_WARNING (( "txn" , txn -> payload , txn -> payload_sz ));
244248 FD_LOG_CRIT (( "transaction %s failed to fit into block despite pack guaranteeing it would "
245249 "(res=%d) [block_cost=%lu, vote_cost=%lu, allocated_accounts_data_size=%lu, "
@@ -272,7 +276,7 @@ handle_microblock( fd_bank_ctx_t * ctx,
272276 /* The account keys in the transaction context are laid out such
273277 that first the non-alt accounts are laid out, then the writable
274278 alt accounts, and finally the read-only alt accounts. */
275- fd_txn_t * txn_descriptor = TXN ( & txn_ctx -> txn );
279+ fd_txn_t * txn_descriptor = TXN ( & txn_in -> txn );
276280 fd_acct_addr_t const * writable_alt = fd_type_pun_const ( txn_out -> accounts .account_keys + txn_descriptor -> acct_addr_cnt );
277281 fd_pack_rebate_sum_add_txn ( ctx -> rebater , txn , & writable_alt , 1UL );
278282
@@ -367,6 +371,7 @@ handle_bundle( fd_bank_ctx_t * ctx,
367371
368372 fd_txn_p_t * txn = & txns [ i ];
369373 fd_exec_txn_ctx_t * txn_ctx = & ctx -> txn_ctx [ i ];
374+ fd_txn_in_t * txn_in = & ctx -> txn_in [ i ];
370375 fd_txn_out_t * txn_out = & ctx -> txn_out [ i ];
371376 txn_ctx -> bundle .is_bundle = 1 ;
372377
@@ -377,17 +382,20 @@ handle_bundle( fd_bank_ctx_t * ctx,
377382 txn -> flags = (txn -> flags & 0x00FFFFFFU ) | ((uint )(- FD_RUNTIME_TXN_ERR_BUNDLE_PEER )<<24 );
378383 continue ;
379384 }
385+
386+ txn_in -> txn = * txn ;
387+
380388 fd_bank_t * bank = fd_banks_bank_query ( ctx -> banks , ctx -> _bank_idx );
381389 FD_TEST ( bank );
382390 txn_ctx -> bundle .is_bundle = 1 ;
383- txn_out -> err .exec_err = fd_runtime_prepare_and_execute_txn ( & ctx -> runtime , bank , txn_ctx , txn , txn_out , NULL , & ctx -> exec_accounts [ i ], NULL , NULL );
391+ txn_out -> err .exec_err = fd_runtime_prepare_and_execute_txn ( & ctx -> runtime , bank , txn_in , txn_ctx , txn_out , NULL , & ctx -> exec_accounts [ i ], NULL , NULL );
384392 txn -> flags = (txn -> flags & 0x00FFFFFFU ) | ((uint )(- txn_out -> err .exec_err )<<24 );
385393 if ( FD_UNLIKELY ( !txn_out -> err .is_committable || txn_out -> err .exec_err != FD_RUNTIME_EXECUTE_SUCCESS ) ) {
386394 execution_success = 0 ;
387395 continue ;
388396 }
389397
390- writable_alt [i ] = fd_type_pun_const ( txn_out -> accounts .account_keys + TXN ( & txn_ctx -> txn )-> acct_addr_cnt );
398+ writable_alt [i ] = fd_type_pun_const ( txn_out -> accounts .account_keys + TXN ( & txn_in -> txn )-> acct_addr_cnt );
391399 }
392400
393401 /* If all of the transactions in the bundle executed successfully, we
@@ -399,15 +407,16 @@ handle_bundle( fd_bank_ctx_t * ctx,
399407 for ( ulong i = 0UL ; i < txn_cnt ; i ++ ) {
400408
401409 fd_exec_txn_ctx_t * txn_ctx = & ctx -> txn_ctx [ i ];
410+ fd_txn_in_t * txn_in = & ctx -> txn_in [ i ];
402411 fd_txn_out_t * txn_out = & ctx -> txn_out [ i ];
403- uchar * signature = (uchar * )txn_ctx -> txn .payload + TXN ( & txn_ctx -> txn )-> signature_off ;
412+ uchar * signature = (uchar * )txn_in -> txn .payload + TXN ( & txn_in -> txn )-> signature_off ;
404413
405414 txns [ i ].flags |= FD_TXN_P_FLAGS_EXECUTE_SUCCESS | FD_TXN_P_FLAGS_SANITIZE_SUCCESS ;
406- fd_runtime_commit_txn ( & ctx -> runtime , bank , txn_out , txn_ctx , NULL , & tips [ i ] );
415+ fd_runtime_commit_txn ( & ctx -> runtime , bank , txn_in , txn_out , txn_ctx , NULL , & tips [ i ] );
407416 if ( FD_UNLIKELY ( !txn_out -> err .is_committable ) ) {
408417 txns [ i ].flags = (txns [ i ].flags & 0x00FFFFFFU ) | ((uint )(- txn_out -> err .exec_err )<<24 );
409418 fd_cost_tracker_t * cost_tracker = fd_bank_cost_tracker_locking_modify ( bank );
410- int res = fd_cost_tracker_calculate_cost_and_add ( cost_tracker , txn_out , txn_ctx );
419+ int res = fd_cost_tracker_calculate_cost_and_add ( cost_tracker , txn_in , txn_out , txn_ctx );
411420 FD_LOG_HEXDUMP_WARNING (( "txn" , txns [ i ].payload , txns [ i ].payload_sz ));
412421 FD_LOG_CRIT (( "transaction %s failed to fit into block despite pack guaranteeing it would "
413422 "(res=%d) [block_cost=%lu, vote_cost=%lu, allocated_accounts_data_size=%lu, "
0 commit comments