Skip to content

Commit 3dd9ab6

Browse files
committed
address comment
1 parent 94da520 commit 3dd9ab6

File tree

1 file changed

+32
-21
lines changed

1 file changed

+32
-21
lines changed

rollup/internal/controller/relayer/l1_relayer.go

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
305306
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 {
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

Comments
 (0)