@@ -192,7 +192,7 @@ func (r *Layer1Relayer) ProcessGasPriceOracle() {
192
192
return
193
193
}
194
194
195
- txHash , _ , err := r .gasOracleSender .SendTransaction ("updateL1GasOracle-" + block .Hash , & r .cfg .GasPriceOracleContractAddress , data , nil )
195
+ txHash , _ , err := r .gasOracleSender .SendTransaction (block .Hash , & r .cfg .GasPriceOracleContractAddress , data , nil )
196
196
if err != nil {
197
197
log .Error ("Failed to send gas oracle update tx to layer2" , "block.Hash" , block .Hash , "block.Height" , block .Number , "baseFee" , baseFee , "blobBaseFee" , blobBaseFee , "err" , err )
198
198
return
@@ -302,31 +302,42 @@ func (r *Layer1Relayer) commitBatchReachTimeout() (bool, error) {
302
302
}
303
303
304
304
// calculateAverageFees returns the average base fee and blob base fee.
305
+ // Uses big.Int for intermediate calculations to avoid overflow.
305
306
func (r * Layer1Relayer ) calculateAverageFees (blocks []orm.L1Block ) (avgBaseFee uint64 , avgBlobBaseFee uint64 ) {
306
- count := uint64 (len (blocks ))
307
- if count == 0 {
307
+ if len (blocks ) == 0 {
308
308
return 0 , 0
309
309
}
310
310
311
- var totalBaseFee , totalBlobBaseFee uint64
312
- for i , b := range blocks {
313
- // Check for overflow before addition
314
- if totalBaseFee > ^ uint64 (0 )- b .BaseFee {
315
- log .Error ("Base fee overflow detected, using max uint64" , "totalBaseFee" , totalBaseFee , "blockBaseFee" , b .BaseFee )
316
- totalBaseFee = ^ uint64 (0 ) // Set to max uint64
317
- count = uint64 (i + 1 ) // set the count to the index of the block that caused the overflow
318
- break
319
- }
320
- if totalBlobBaseFee > ^ uint64 (0 )- b .BlobBaseFee {
321
- log .Error ("Blob base fee overflow detected, using max uint64" , "totalBlobBaseFee" , totalBlobBaseFee , "blockBlobBaseFee" , b .BlobBaseFee )
322
- totalBlobBaseFee = ^ uint64 (0 ) // Set to max uint64
323
- count = uint64 (i + 1 ) // set the count to the index of the block that caused the overflow
324
- break
325
- }
311
+ // Use big.Int to handle large sums without overflow
312
+ totalBaseFee := big .NewInt (0 )
313
+ totalBlobBaseFee := big .NewInt (0 )
314
+ count := big .NewInt (int64 (len (blocks )))
315
+
316
+ for _ , b := range blocks {
317
+ totalBaseFee .Add (totalBaseFee , big .NewInt (0 ).SetUint64 (b .BaseFee ))
318
+ totalBlobBaseFee .Add (totalBlobBaseFee , big .NewInt (0 ).SetUint64 (b .BlobBaseFee ))
319
+ }
320
+
321
+ // Calculate averages
322
+ avgBaseFeeBig := big .NewInt (0 ).Div (totalBaseFee , count )
323
+ avgBlobBaseFeeBig := big .NewInt (0 ).Div (totalBlobBaseFee , count )
326
324
327
- totalBaseFee += b .BaseFee
328
- totalBlobBaseFee += b .BlobBaseFee
325
+ // Check if results fit in uint64
326
+ maxUint64 := big .NewInt (0 ).SetUint64 (^ uint64 (0 ))
327
+
328
+ if avgBaseFeeBig .Cmp (maxUint64 ) > 0 {
329
+ log .Error ("Average base fee exceeds uint64 max, capping at max value" , "calculatedAvg" , avgBaseFeeBig .String ())
330
+ avgBaseFee = ^ uint64 (0 )
331
+ } else {
332
+ avgBaseFee = avgBaseFeeBig .Uint64 ()
333
+ }
334
+
335
+ if avgBlobBaseFeeBig .Cmp (maxUint64 ) > 0 {
336
+ log .Error ("Average blob base fee exceeds uint64 max, capping at max value" , "calculatedAvg" , avgBlobBaseFeeBig .String ())
337
+ avgBlobBaseFee = ^ uint64 (0 )
338
+ } else {
339
+ avgBlobBaseFee = avgBlobBaseFeeBig .Uint64 ()
329
340
}
330
341
331
- return totalBaseFee / count , totalBlobBaseFee / count
342
+ return avgBaseFee , avgBlobBaseFee
332
343
}
0 commit comments