@@ -97,6 +97,7 @@ pub struct Batcher {
9797 disabled_verifiers : Mutex < U256 > ,
9898 aggregator_fee_percentage_multiplier : u128 ,
9999 aggregator_gas_cost : u128 ,
100+ latest_block_gas_price : RwLock < U256 > ,
100101 pub metrics : metrics:: BatcherMetrics ,
101102 pub telemetry : TelemetrySender ,
102103}
@@ -276,6 +277,7 @@ impl Batcher {
276277 posting_batch : Mutex :: new ( false ) ,
277278 batch_state : Mutex :: new ( batch_state) ,
278279 disabled_verifiers : Mutex :: new ( disabled_verifiers) ,
280+ latest_block_gas_price : RwLock :: new ( U256 :: zero ( ) ) ,
279281 metrics,
280282 telemetry,
281283 }
@@ -767,6 +769,22 @@ impl Batcher {
767769 let mut batch_state_lock = self . batch_state . lock ( ) . await ;
768770
769771 let msg_max_fee = nonced_verification_data. max_fee ;
772+
773+ // Verify that the max fee is enough to cover a batch of 32 proofs at least
774+ // TODO move number to config file
775+ let gas_price = * self . latest_block_gas_price . read ( ) . await ;
776+ let min_max_fee_per_proof =
777+ aligned_sdk:: verification_layer:: compute_fee_per_proof_formula ( 32 , gas_price) ;
778+ if msg_max_fee < min_max_fee_per_proof {
779+ std:: mem:: drop ( batch_state_lock) ;
780+ send_message (
781+ ws_conn_sink. clone ( ) ,
782+ SubmitProofResponseMessage :: UnderpricedProof ,
783+ )
784+ . await ;
785+ return Ok ( ( ) ) ;
786+ }
787+
770788 let Some ( user_last_max_fee_limit) =
771789 batch_state_lock. get_user_last_max_fee_limit ( & addr) . await
772790 else {
@@ -1502,6 +1520,9 @@ impl Batcher {
15021520 let gas_price = gas_price. map_err ( |_| BatcherError :: GasPriceError ) ?;
15031521
15041522 {
1523+ let mut latest_block_gas_price = self . latest_block_gas_price . write ( ) . await ;
1524+ * latest_block_gas_price = gas_price;
1525+
15051526 let new_disable_verifiers = disable_verifiers
15061527 . map_err ( |e| BatcherError :: DisabledVerifiersError ( e. to_string ( ) ) ) ?;
15071528 let mut disabled_verifiers_lock = self . disabled_verifiers . lock ( ) . await ;
0 commit comments