From a20959c8f0c9b2258a628386706bffdf8f9bbf6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Garamv=C3=B6lgyi?= Date: Thu, 27 Nov 2025 16:15:10 +0100 Subject: [PATCH] add limits --- rollup/internal/config/relayer.go | 4 ++++ rollup/internal/controller/relayer/l1_relayer.go | 11 +++++++++++ .../controller/relayer/l1_relayer_metrics.go | 15 ++++++++++----- rollup/internal/controller/sender/sender.go | 7 ++++--- rollup/internal/controller/watcher/l1_watcher.go | 7 ++++--- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/rollup/internal/config/relayer.go b/rollup/internal/config/relayer.go index d82fd861a..c993b4e3c 100644 --- a/rollup/internal/config/relayer.go +++ b/rollup/internal/config/relayer.go @@ -109,6 +109,10 @@ type GasOracleConfig struct { L1BaseFeeDefault uint64 `json:"l1_base_fee_default"` L1BlobBaseFeeDefault uint64 `json:"l1_blob_base_fee_default"` + // Limit values for gas oracle updates + L1BaseFeeLimit uint64 `json:"l1_base_fee_limit"` + L1BlobBaseFeeLimit uint64 `json:"l1_blob_base_fee_limit"` + // L1BlobBaseFeeThreshold the threshold of L1 blob base fee to enter the default gas price mode L1BlobBaseFeeThreshold uint64 `json:"l1_blob_base_fee_threshold"` } diff --git a/rollup/internal/controller/relayer/l1_relayer.go b/rollup/internal/controller/relayer/l1_relayer.go index d9f0835d5..da6a19f29 100644 --- a/rollup/internal/controller/relayer/l1_relayer.go +++ b/rollup/internal/controller/relayer/l1_relayer.go @@ -173,6 +173,17 @@ func (r *Layer1Relayer) ProcessGasPriceOracle() { } else if err != nil { return } + // set limit + if baseFee > r.cfg.GasOracleConfig.L1BaseFeeLimit { + log.Error("L1 base fee exceed max limit, set to max limit", "baseFee", baseFee, "maxLimit", r.cfg.GasOracleConfig.L1BaseFeeLimit) + r.metrics.rollupL1RelayerGasPriceOracleFeeOverLimitTotal.Inc() + baseFee = r.cfg.GasOracleConfig.L1BaseFeeLimit + } + if blobBaseFee > r.cfg.GasOracleConfig.L1BlobBaseFeeLimit { + log.Error("L1 blob base fee exceed max limit, set to max limit", "blobBaseFee", blobBaseFee, "maxLimit", r.cfg.GasOracleConfig.L1BlobBaseFeeLimit) + r.metrics.rollupL1RelayerGasPriceOracleFeeOverLimitTotal.Inc() + blobBaseFee = r.cfg.GasOracleConfig.L1BlobBaseFeeLimit + } data, err := r.l1GasOracleABI.Pack("setL1BaseFeeAndBlobBaseFee", new(big.Int).SetUint64(baseFee), new(big.Int).SetUint64(blobBaseFee)) if err != nil { log.Error("Failed to pack setL1BaseFeeAndBlobBaseFee", "block.Hash", block.Hash, "block.Height", block.Number, "block.BaseFee", baseFee, "block.BlobBaseFee", blobBaseFee, "err", err) diff --git a/rollup/internal/controller/relayer/l1_relayer_metrics.go b/rollup/internal/controller/relayer/l1_relayer_metrics.go index 433c37396..0efb6264e 100644 --- a/rollup/internal/controller/relayer/l1_relayer_metrics.go +++ b/rollup/internal/controller/relayer/l1_relayer_metrics.go @@ -8,11 +8,12 @@ import ( ) type l1RelayerMetrics struct { - rollupL1RelayerGasPriceOraclerRunTotal prometheus.Counter - rollupL1RelayerLatestBaseFee prometheus.Gauge - rollupL1RelayerLatestBlobBaseFee prometheus.Gauge - rollupL1UpdateGasOracleConfirmedTotal prometheus.Counter - rollupL1UpdateGasOracleConfirmedFailedTotal prometheus.Counter + rollupL1RelayerGasPriceOraclerRunTotal prometheus.Counter + rollupL1RelayerLatestBaseFee prometheus.Gauge + rollupL1RelayerLatestBlobBaseFee prometheus.Gauge + rollupL1UpdateGasOracleConfirmedTotal prometheus.Counter + rollupL1UpdateGasOracleConfirmedFailedTotal prometheus.Counter + rollupL1RelayerGasPriceOracleFeeOverLimitTotal prometheus.Counter } var ( @@ -43,6 +44,10 @@ func initL1RelayerMetrics(reg prometheus.Registerer) *l1RelayerMetrics { Name: "rollup_layer1_update_gas_oracle_confirmed_failed_total", Help: "The total number of updating layer1 gas oracle confirmed failed", }), + rollupL1RelayerGasPriceOracleFeeOverLimitTotal: promauto.With(reg).NewCounter(prometheus.CounterOpts{ + Name: "rollup_layer1_gas_price_oracle_fee_over_limit_total", + Help: "The total number of layer1 gas price oracle fee over limit", + }), } }) return l1RelayerMetric diff --git a/rollup/internal/controller/sender/sender.go b/rollup/internal/controller/sender/sender.go index 282c8be58..4f6e95925 100644 --- a/rollup/internal/controller/sender/sender.go +++ b/rollup/internal/controller/sender/sender.go @@ -846,11 +846,12 @@ func (s *Sender) getBlockNumberAndTimestampAndBaseFeeAndBlobFee(ctx context.Cont // that approach requires syncing any future L1 configuration changes. // Note: The fetched blob base fee might not correspond to the block // that we fetched in the previous step, but this is acceptable. - var hex hexutil.Big - if err := s.rpcClient.CallContext(ctx, &hex, "eth_blobBaseFee"); err != nil { + var blobBaseFeeHex hexutil.Big + if err := s.rpcClient.CallContext(ctx, &blobBaseFeeHex, "eth_blobBaseFee"); err != nil { return 0, 0, 0, 0, fmt.Errorf("failed to call eth_blobBaseFee, err: %w", err) } - blobBaseFee := hex.ToInt().Uint64() + // A correct L1 node could not return a value that overflows uint64 + blobBaseFee := blobBaseFeeHex.ToInt().Uint64() // header.Number.Uint64() returns the pendingBlockNumber, so we minus 1 to get the latestBlockNumber. return header.Number.Uint64() - 1, header.Time, baseFee, blobBaseFee, nil diff --git a/rollup/internal/controller/watcher/l1_watcher.go b/rollup/internal/controller/watcher/l1_watcher.go index ed2b69e66..7bd7dc8c7 100644 --- a/rollup/internal/controller/watcher/l1_watcher.go +++ b/rollup/internal/controller/watcher/l1_watcher.go @@ -87,11 +87,12 @@ func (w *L1WatcherClient) FetchBlockHeader(blockHeight uint64) error { // that approach requires syncing any future L1 configuration changes. // Note: The fetched blob base fee might not correspond to the block // that we fetched in the previous step, but this is acceptable. - var hex hexutil.Big - if err := w.rpcClient.CallContext(w.ctx, &hex, "eth_blobBaseFee"); err != nil { + var blobBaseFeeHex hexutil.Big + if err := w.rpcClient.CallContext(w.ctx, &blobBaseFeeHex, "eth_blobBaseFee"); err != nil { return fmt.Errorf("failed to call eth_blobBaseFee, err: %w", err) } - blobBaseFee := hex.ToInt().Uint64() + // A correct L1 node could not return a value that overflows uint64 + blobBaseFee := blobBaseFeeHex.ToInt().Uint64() l1Block := orm.L1Block{ Number: blockHeight,