@@ -192,7 +192,7 @@ func (r *Layer1Relayer) ProcessGasPriceOracle() {
192192 return
193193 }
194194
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 )
196196 if err != nil {
197197 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 )
198198 return
@@ -302,31 +302,42 @@ func (r *Layer1Relayer) commitBatchReachTimeout() (bool, error) {
302302}
303303
304304// calculateAverageFees returns the average base fee and blob base fee.
305+ // Uses big.Int for intermediate calculations to avoid overflow.
305306func (r * Layer1Relayer ) calculateAverageFees (blocks []orm.L1Block ) (avgBaseFee uint64 , avgBlobBaseFee uint64 ) {
306- count := uint64 (len (blocks ))
307- if count == 0 {
307+ if len (blocks ) == 0 {
308308 return 0 , 0
309309 }
310310
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 )
326324
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 ()
329340 }
330341
331- return totalBaseFee / count , totalBlobBaseFee / count
342+ return avgBaseFee , avgBlobBaseFee
332343}
0 commit comments