2525 transaction_batch:: TransactionBatch ,
2626 } ,
2727 solana_sdk:: {
28+ borsh0_10:: try_from_slice_unchecked,
2829 clock:: { Slot , FORWARD_TRANSACTIONS_TO_LEADER_AT_SLOT_OFFSET , MAX_PROCESSING_AGE } ,
30+ compute_budget:: { self , ComputeBudgetInstruction } ,
2931 feature_set,
3032 pubkey:: Pubkey ,
3133 saturating_add_assign,
@@ -68,6 +70,8 @@ pub struct ExecuteAndCommitTransactionsOutput {
6870 pub commit_transactions_result : Result < Vec < CommitTransactionDetails > , PohRecorderError > ,
6971 execute_and_commit_timings : LeaderExecuteAndCommitTimings ,
7072 error_counters : TransactionErrorMetrics ,
73+ scheduled_min_prioritization_fees : usize ,
74+ scheduled_max_prioritization_fees : usize ,
7175}
7276
7377pub struct Consumer {
@@ -297,6 +301,8 @@ impl Consumer {
297301 let mut total_execute_and_commit_timings = LeaderExecuteAndCommitTimings :: default ( ) ;
298302 let mut total_error_counters = TransactionErrorMetrics :: default ( ) ;
299303 let mut reached_max_poh_height = false ;
304+ let mut total_scheduled_min_prioritization_fees: usize = usize:: MAX ;
305+ let mut total_scheduled_max_prioritization_fees: usize = 0 ;
300306 while chunk_start != transactions. len ( ) {
301307 let chunk_end = std:: cmp:: min (
302308 transactions. len ( ) ,
@@ -327,6 +333,8 @@ impl Consumer {
327333 commit_transactions_result : new_commit_transactions_result,
328334 execute_and_commit_timings : new_execute_and_commit_timings,
329335 error_counters : new_error_counters,
336+ scheduled_min_prioritization_fees,
337+ scheduled_max_prioritization_fees,
330338 ..
331339 } = execute_and_commit_transactions_output;
332340
@@ -336,6 +344,14 @@ impl Consumer {
336344 total_transactions_attempted_execution_count,
337345 new_transactions_attempted_execution_count
338346 ) ;
347+ total_scheduled_min_prioritization_fees = std:: cmp:: min (
348+ total_scheduled_min_prioritization_fees,
349+ scheduled_min_prioritization_fees,
350+ ) ;
351+ total_scheduled_max_prioritization_fees = std:: cmp:: min (
352+ total_scheduled_max_prioritization_fees,
353+ scheduled_max_prioritization_fees,
354+ ) ;
339355
340356 trace ! (
341357 "process_transactions result: {:?}" ,
@@ -396,6 +412,8 @@ impl Consumer {
396412 cost_model_us : total_cost_model_us,
397413 execute_and_commit_timings : total_execute_and_commit_timings,
398414 error_counters : total_error_counters,
415+ scheduled_min_prioritization_fees : total_scheduled_min_prioritization_fees,
416+ scheduled_max_prioritization_fees : total_scheduled_max_prioritization_fees,
399417 }
400418 }
401419
@@ -425,7 +443,13 @@ impl Consumer {
425443 // Re-sanitized transaction should be equal to the original transaction,
426444 // but whether it will pass sanitization needs to be checked.
427445 let resanitized_tx =
428- bank. fully_verify_transaction ( tx. to_versioned_transaction ( ) ) ?;
446+ match bank. fully_verify_transaction ( tx. to_versioned_transaction ( ) ) {
447+ Ok ( resanitized_tx) => resanitized_tx,
448+ Err ( e) => {
449+ bank. notify_transaction_error ( tx, Some ( e. clone ( ) ) ) ;
450+ return Err ( e) ;
451+ }
452+ } ;
429453 if resanitized_tx != * tx {
430454 // Sanitization before/after epoch give different transaction data - do not execute.
431455 return Err ( TransactionError :: ResanitizationNeeded ) ;
@@ -563,6 +587,33 @@ impl Consumer {
563587 } ) ;
564588 execute_and_commit_timings. collect_balances_us = collect_balances_us;
565589
590+ let min_max = batch
591+ . sanitized_transactions ( )
592+ . iter ( )
593+ . filter_map ( |transaction| {
594+ let message = transaction. message ( ) ;
595+ for ( program_id, instruction) in message. program_instructions_iter ( ) {
596+ if compute_budget:: check_id ( program_id) {
597+ match try_from_slice_unchecked ( & instruction. data ) {
598+ Ok ( ComputeBudgetInstruction :: SetComputeUnitPrice ( micro_lamports) ) => {
599+ return Some ( micro_lamports) ;
600+ }
601+ Ok ( ComputeBudgetInstruction :: RequestUnitsDeprecated {
602+ additional_fee,
603+ ..
604+ } ) => {
605+ return Some ( additional_fee as u64 ) ;
606+ }
607+ _ => { }
608+ }
609+ }
610+ }
611+ None
612+ } )
613+ . minmax ( ) ;
614+ let ( scheduled_min_prioritization_fees, scheduled_max_prioritization_fees) =
615+ min_max. into_option ( ) . unwrap_or_default ( ) ;
616+
566617 let ( load_and_execute_transactions_output, load_execute_us) = measure_us ! ( bank
567618 . load_and_execute_transactions(
568619 batch,
@@ -638,6 +689,8 @@ impl Consumer {
638689 commit_transactions_result : Err ( recorder_err) ,
639690 execute_and_commit_timings,
640691 error_counters,
692+ scheduled_min_prioritization_fees : scheduled_min_prioritization_fees as usize ,
693+ scheduled_max_prioritization_fees : scheduled_max_prioritization_fees as usize ,
641694 } ;
642695 }
643696
@@ -693,6 +746,8 @@ impl Consumer {
693746 commit_transactions_result : Ok ( commit_transaction_statuses) ,
694747 execute_and_commit_timings,
695748 error_counters,
749+ scheduled_min_prioritization_fees : scheduled_min_prioritization_fees as usize ,
750+ scheduled_max_prioritization_fees : scheduled_max_prioritization_fees as usize ,
696751 }
697752 }
698753
0 commit comments