From 818fd7cd4c336a7eb73bfbeeea18653b33f7eb76 Mon Sep 17 00:00:00 2001 From: Edidiong Umana Date: Tue, 6 Oct 2026 08:23:51 +0000 Subject: [PATCH 1/3] docs(fees): document the post-Jovian base fee floor and current FeeHandler split The fee pages still described the pre-Jovian eip1559BaseFeeFloor (25 Gwei) and a FeeHandler split that was 'not confirmed yet (as of 2024-11-15)'. - deployments: minimum base fee is 200 Gwei on mainnet and 50 Gwei on Celo Sepolia (Jovian minBaseFee, read from block extraData and L1 SystemConfig); drop the eip1559BaseFeeFloor row; sequencerWindowSize 7200 and finalizationPeriodSeconds 604800 per the published mainnet deploy config. - transaction-fees: describe the Jovian minBaseFee mechanism and link to deployments for values; replace the stale FeeHandler paragraph with the on-chain mainnet split (burn 0, carbon 0, one beneficiary 'cLabs' at 100%) and the getters to read it. - native-bridge: replace the hardcoded FeeCurrencyDirectory address, which reverts with 'No Implementation set', with a link to the core contracts page. Co-Authored-By: Claude Opus 5.5 --- operate/specification/deployments.mdx | 13 +++++++------ operate/specification/native-bridge.mdx | 2 +- operate/specification/transaction-fees.mdx | 7 +++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/operate/specification/deployments.mdx b/operate/specification/deployments.mdx index 0b70fcc530..1f24fe7247 100644 --- a/operate/specification/deployments.mdx +++ b/operate/specification/deployments.mdx @@ -14,7 +14,7 @@ The Celo L2 network has the following chain properties: - Block gas target: 6,000,000 gas (see EIP-1559 elasticity multiplier) - EIP-1559 elasticity multiplier: 5 - EIP-1559 denominator: 400 -- EIP-1559 floor: 25 Gwei +- Minimum base fee: 200 Gwei ([Jovian](/operate/specification/upgrades/jovian) `minBaseFee`) ### Parameters @@ -31,14 +31,14 @@ L1 and L2 contract addresses are listed in the documentation. ## Celo Sepolia testnet -The Celo Sepolia testnet has the same chain properties as Celo Mainnet: +The Celo Sepolia testnet has the same chain properties as Celo Mainnet, except for a lower minimum base fee: - Block period: 1 second - Block gas limit: 30,000,000 gas - Block gas target: 6,000,000 gas (see EIP-1559 elasticity multiplier) - EIP-1559 elasticity multiplier: 5 - EIP-1559 denominator: 400 -- EIP-1559 floor: 25 Gwei +- Minimum base fee: 50 Gwei ([Jovian](/operate/specification/upgrades/jovian) `minBaseFee`) ### Contract addresses @@ -53,13 +53,14 @@ L1 and L2 contract addresses are listed in the documentation. | Config | Celo | OP | |-----------------------------------|-------------|--------| | `maxSequencerDrift` | 2892 | 1800 | -| `sequencerWindowSize` | 3600 | 3600 | +| `sequencerWindowSize` | 7200 | 3600 | | `channelTimeout` | 300 | 300 | -| `finalizationPeriodSeconds` | 12 | 12 | +| `finalizationPeriodSeconds` | 604800 | 12 | | `enableGovernance` | `false` | `true` | | `eip1559Denominator` | 400 | 50 | | `eip1559DenominatorCanyon` | 400 | 250 | | `eip1559Elasticity` | 5 | 6 | -| `eip1559BaseFeeFloor` | 25000000000 | - | | `gasPriceOracleBaseFeeScalar` | 0 | 1368 | | `gasPriceOracleBlobBaseFeeScalar` | 0 | 810949 | + +The minimum base fee is not part of this config. It is the `minBaseFee` value in the L1 `SystemConfig` contract, encoded in every L2 block header; see [Transaction fees](/operate/specification/transaction-fees#base-fee-floor). diff --git a/operate/specification/native-bridge.mdx b/operate/specification/native-bridge.mdx index 19a0735f12..7fb5ab55aa 100644 --- a/operate/specification/native-bridge.mdx +++ b/operate/specification/native-bridge.mdx @@ -25,4 +25,4 @@ ERC20 tokens can be bridged the same way as in the unmodified OP Stack, see [Bri ## Using Bridged Tokens as Fee Abstraction -The `OptimismMintableERC20` (used to represent ERC20 tokens from L1 on L2) supports the [`IFeeCurrency`](https://github.com/celo-org/fee-currency-example/blob/master/src/IFeeCurrency.sol) interface, which is a requirement to use them as a Fee Abstraction token. Before a new `OptimismMintableERC20` instance can actually be used as Fee Abstraction, it still has to be added to the `FeeCurrencyDirectory` (`0x71FFbD48E34bdD5a87c3c683E866dc63b8B2a685`) by Celo governance. This is currently only the case for `WETH`. +The `OptimismMintableERC20` (used to represent ERC20 tokens from L1 on L2) supports the [`IFeeCurrency`](https://github.com/celo-org/fee-currency-example/blob/master/src/IFeeCurrency.sol) interface, which is a requirement to use them as a Fee Abstraction token. Before a new `OptimismMintableERC20` instance can actually be used as Fee Abstraction, it still has to be added to the [`FeeCurrencyDirectory`](/tooling/contracts/core-contracts#celo-mainnet) by Celo governance. This is currently only the case for `WETH`. diff --git a/operate/specification/transaction-fees.mdx b/operate/specification/transaction-fees.mdx index a86495c00f..67707dff42 100644 --- a/operate/specification/transaction-fees.mdx +++ b/operate/specification/transaction-fees.mdx @@ -26,11 +26,10 @@ If you are coming from Ethereum, not having L1 data and operator fees is what yo Celo follows the usual [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) rules to determine a block's base fee with on modification: The base fee can't fall below a certain limit, the base fee floor. This prevents the chain to be spammed with unimportant transactions that will make the chain state grow rapidly and make future scaling harder. The floor is set sufficiently low to still keep average transactions below 0.01 USD. -The base fee floor is set in the `eip1559BaseFeeFloor` rollup configuration variable and is denominated in native CELO token. If Fee Abstraction is used to pay in other tokens, the base fee is converted to the token's value at the current exchange rate. +The base fee floor is the `minBaseFee` value introduced by the [Jovian upgrade](/operate/specification/upgrades/jovian). It is set in the L1 `SystemConfig` contract and encoded in the `extraData` field of every L2 block header, next to the EIP-1559 denominator and elasticity: bytes 9 to 16 hold the floor in wei as a big-endian `u64`. The current value for each network is listed on [Deployments](/operate/specification/deployments). The floor is denominated in native CELO token. If Fee Abstraction is used to pay in other tokens, the base fee is converted to the token's value at the current exchange rate. ## FeeHandler -All base fees are sent to the FeeHandler contract, which is responsible for deciding what to eventually do with the fees. The final behavior for Celo L2 mainnet has not been confirmed yet (as of 2024-11-15). On Celo L1, the FeeHandler: +All base fees are sent to the [FeeHandler](/tooling/contracts/core-contracts#celo-mainnet) contract, which decides what to do with the fees. Celo governance sets how the FeeHandler splits them between burning, carbon offsetting and other beneficiaries. On Celo Mainnet the burn fraction and the carbon fraction are both 0, and a single other beneficiary, registered under the name `cLabs`, receives 100% of the fees. -- burns 80% of the fees (after converting non-CELO fees to CELO) -- sends 20% of the fees to carbon offsetting projects as part of the Ultragreen Money initiative. +To read the current split, call `getBurnFraction()`, `getCarbonFraction()`, `getOtherBeneficiariesAddresses()` and `getOtherBeneficiariesInfo(address)` on the FeeHandler. Fractions are fixed-point values where `10^24` is 100%. From c873b0fde2371973546a9ad06c03e42a842037e8 Mon Sep 17 00:00:00 2001 From: Defi Messiah Date: Tue, 6 Oct 2026 17:51:58 +0000 Subject: [PATCH 2/3] docs(fees): address review on the floor wording, FeeHandler testnet split and OP column - deployments: channelTimeout 50 for Celo and OP (Granite constant), OP finalizationPeriodSeconds 604800 and maxSequencerDrift 600 from OP's mainnet deploy config, note on channelTimeout under the table - transaction-fees: canonical fee wording, sentence-case heading, fix two typos, add the Celo Sepolia FeeHandler split - point the two new core-contracts links at /build/tools after #2368 Co-Authored-By: Claude Fable 5.1 --- operate/specification/deployments.mdx | 8 +++++--- operate/specification/native-bridge.mdx | 2 +- operate/specification/transaction-fees.mdx | 6 +++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/operate/specification/deployments.mdx b/operate/specification/deployments.mdx index 1f24fe7247..e69e20d227 100644 --- a/operate/specification/deployments.mdx +++ b/operate/specification/deployments.mdx @@ -52,10 +52,10 @@ L1 and L2 contract addresses are listed in the documentation. | Config | Celo | OP | |-----------------------------------|-------------|--------| -| `maxSequencerDrift` | 2892 | 1800 | +| `maxSequencerDrift` | 2892 | 600 | | `sequencerWindowSize` | 7200 | 3600 | -| `channelTimeout` | 300 | 300 | -| `finalizationPeriodSeconds` | 604800 | 12 | +| `channelTimeout` | 50 | 50 | +| `finalizationPeriodSeconds` | 604800 | 604800 | | `enableGovernance` | `false` | `true` | | `eip1559Denominator` | 400 | 50 | | `eip1559DenominatorCanyon` | 400 | 250 | @@ -63,4 +63,6 @@ L1 and L2 contract addresses are listed in the documentation. | `gasPriceOracleBaseFeeScalar` | 0 | 1368 | | `gasPriceOracleBlobBaseFeeScalar` | 0 | 810949 | +`channelTimeout` shows the value in force: since the Granite upgrade it is a protocol constant of 50 L1 blocks on every OP Stack chain, and the deploy-config value of 300 no longer applies. + The minimum base fee is not part of this config. It is the `minBaseFee` value in the L1 `SystemConfig` contract, encoded in every L2 block header; see [Transaction fees](/operate/specification/transaction-fees#base-fee-floor). diff --git a/operate/specification/native-bridge.mdx b/operate/specification/native-bridge.mdx index 7fb5ab55aa..e844391615 100644 --- a/operate/specification/native-bridge.mdx +++ b/operate/specification/native-bridge.mdx @@ -25,4 +25,4 @@ ERC20 tokens can be bridged the same way as in the unmodified OP Stack, see [Bri ## Using Bridged Tokens as Fee Abstraction -The `OptimismMintableERC20` (used to represent ERC20 tokens from L1 on L2) supports the [`IFeeCurrency`](https://github.com/celo-org/fee-currency-example/blob/master/src/IFeeCurrency.sol) interface, which is a requirement to use them as a Fee Abstraction token. Before a new `OptimismMintableERC20` instance can actually be used as Fee Abstraction, it still has to be added to the [`FeeCurrencyDirectory`](/tooling/contracts/core-contracts#celo-mainnet) by Celo governance. This is currently only the case for `WETH`. +The `OptimismMintableERC20` (used to represent ERC20 tokens from L1 on L2) supports the [`IFeeCurrency`](https://github.com/celo-org/fee-currency-example/blob/master/src/IFeeCurrency.sol) interface, which is a requirement to use them as a Fee Abstraction token. Before a new `OptimismMintableERC20` instance can actually be used as Fee Abstraction, it still has to be added to the [`FeeCurrencyDirectory`](/build/tools/contracts/core-contracts#celo-mainnet) by Celo governance. This is currently only the case for `WETH`. diff --git a/operate/specification/transaction-fees.mdx b/operate/specification/transaction-fees.mdx index 67707dff42..4c9cfc772b 100644 --- a/operate/specification/transaction-fees.mdx +++ b/operate/specification/transaction-fees.mdx @@ -22,14 +22,14 @@ The [Isthmus](/operate/specification/upgrades/isthmus) upgrade also introduces a If you are coming from Ethereum, not having L1 data and operator fees is what you are used to, and you will feel right at home on Celo. -## Base Fee Floor +## Base fee floor -Celo follows the usual [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) rules to determine a block's base fee with on modification: The base fee can't fall below a certain limit, the base fee floor. This prevents the chain to be spammed with unimportant transactions that will make the chain state grow rapidly and make future scaling harder. The floor is set sufficiently low to still keep average transactions below 0.01 USD. +Celo follows the usual [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) rules to determine a block's base fee with one modification: the base fee can't fall below a certain limit, the base fee floor. This prevents the chain from being spammed with unimportant transactions that will make the chain state grow rapidly and make future scaling harder. The floor is set low enough to keep fees below $0.01 for a typical transaction. The base fee floor is the `minBaseFee` value introduced by the [Jovian upgrade](/operate/specification/upgrades/jovian). It is set in the L1 `SystemConfig` contract and encoded in the `extraData` field of every L2 block header, next to the EIP-1559 denominator and elasticity: bytes 9 to 16 hold the floor in wei as a big-endian `u64`. The current value for each network is listed on [Deployments](/operate/specification/deployments). The floor is denominated in native CELO token. If Fee Abstraction is used to pay in other tokens, the base fee is converted to the token's value at the current exchange rate. ## FeeHandler -All base fees are sent to the [FeeHandler](/tooling/contracts/core-contracts#celo-mainnet) contract, which decides what to do with the fees. Celo governance sets how the FeeHandler splits them between burning, carbon offsetting and other beneficiaries. On Celo Mainnet the burn fraction and the carbon fraction are both 0, and a single other beneficiary, registered under the name `cLabs`, receives 100% of the fees. +All base fees are sent to the [FeeHandler](/build/tools/contracts/core-contracts#celo-mainnet) contract, which decides what to do with the fees. Celo governance sets how the FeeHandler splits them between burning, carbon offsetting and other beneficiaries. On Celo Mainnet the burn fraction and the carbon fraction are both 0, and a single other beneficiary, registered under the name `cLabs`, receives 100% of the fees. On Celo Sepolia the FeeHandler has the same address but a different split: the burn fraction is 20% and the carbon fraction is 80%, with no other beneficiaries, as returned by `getBurnFraction()` and `getCarbonFraction()`. To read the current split, call `getBurnFraction()`, `getCarbonFraction()`, `getOtherBeneficiariesAddresses()` and `getOtherBeneficiariesInfo(address)` on the FeeHandler. Fractions are fixed-point values where `10^24` is 100%. From d2e2cbd2d836cd2d2b98a98053c25dd51d574c4e Mon Sep 17 00:00:00 2001 From: Defi Messiah Date: Thu, 8 Oct 2026 10:01:03 +0000 Subject: [PATCH 3/3] docs(fees): address second review on #2375 (sequencer drift constant, OP mutable rows, learn fee split) Co-Authored-By: Claude Opus 5.5 --- .../epoch-rewards/carbon-offsetting-fund.mdx | 4 ++-- learn/protocol/transactions/overview.mdx | 18 ++---------------- operate/specification/deployments.mdx | 16 +++++++++------- 3 files changed, 13 insertions(+), 25 deletions(-) diff --git a/learn/protocol/epoch-rewards/carbon-offsetting-fund.mdx b/learn/protocol/epoch-rewards/carbon-offsetting-fund.mdx index 02dfa22bde..ab21c35438 100644 --- a/learn/protocol/epoch-rewards/carbon-offsetting-fund.mdx +++ b/learn/protocol/epoch-rewards/carbon-offsetting-fund.mdx @@ -11,7 +11,7 @@ Check out the ["The Great Celo Halvening – Proposed Tokenomics in the Era of C The Carbon Offsetting Fund represents Celo's commitment to environmental sustainability by making the platform's infrastructure **carbon-negative**. The fund automatically transfers resources every epoch to partner organizations that use these assets for verified carbon offsetting projects. -## How the Carbon Offsetting Fund Receives Assets +## How the Carbon Offsetting Fund receives assets - **Epoch rewards**: the Carbon Offsetting Fund receives 0.1% of epoch rewards, adjustable via governance and distributed automatically at each epoch. -- **Transaction fees**: the Carbon Offsetting Fund receives 10% of transaction fees, adjustable via governance. \ No newline at end of file +- **Transaction fees**: the Carbon Offsetting Fund receives the share of transaction fees that Celo governance sets in the FeeHandler; see [Transaction fees](/operate/specification/transaction-fees#feehandler) for the current split. \ No newline at end of file diff --git a/learn/protocol/transactions/overview.mdx b/learn/protocol/transactions/overview.mdx index ee82a65924..d251d0572b 100644 --- a/learn/protocol/transactions/overview.mdx +++ b/learn/protocol/transactions/overview.mdx @@ -30,23 +30,9 @@ used to pay gas fees are controlled via governance and the list of tokens allowe FeeCurrencyDirectory.sol. Fee abstraction on Celo works with EOAs. No paymaster required! Learn all about [fee abstraction](/build/fee-abstraction/overview). -## Transaction Fee Allocation Post-L2 Transition +## Transaction fee allocation -With the shift to L2, the allocation of transaction fees has been restructured to support the network's evolving operational needs: - -- [**Carbon Offset Fund**](/learn/protocol/epoch-rewards/carbon-offsetting-fund): 10% of transaction fees continue to support the carbon offset fund, maintaining Celo's environmental commitment. This adjustment reflects the network's reduced carbon footprint following the L2 upgrade. - -- **Network Operations**: The remaining 90% of transaction fees are allocated to essential network operations, including: - - - **Data Availability**: Ensuring that transaction data is accessible and secure. - - - **Layer 1 Fees**: Covering costs associated with interactions between Celo's L2 and the Ethereum mainnet. - - - **Sequencer and Batcher Operations**: Supporting the infrastructure that orders and batches transactions on the network. - - - **Revenue Sharing with the OP-Stack**: Complying with the Superchain Ecosystem requirements, which involve sharing revenue with the OP-Stack. - -This reallocation ensures that transaction fees are utilized effectively to maintain network sustainability and operational efficiency in the L2 environment. +Celo governance sets how the FeeHandler splits collected fees; see [Transaction fees](/operate/specification/transaction-fees#feehandler) for the current split. ## Conclusion diff --git a/operate/specification/deployments.mdx b/operate/specification/deployments.mdx index e69e20d227..8be098c623 100644 --- a/operate/specification/deployments.mdx +++ b/operate/specification/deployments.mdx @@ -52,17 +52,19 @@ L1 and L2 contract addresses are listed in the documentation. | Config | Celo | OP | |-----------------------------------|-------------|--------| -| `maxSequencerDrift` | 2892 | 600 | +| `maxSequencerDrift` | 2892 | 1800 | | `sequencerWindowSize` | 7200 | 3600 | | `channelTimeout` | 50 | 50 | | `finalizationPeriodSeconds` | 604800 | 604800 | | `enableGovernance` | `false` | `true` | -| `eip1559Denominator` | 400 | 50 | -| `eip1559DenominatorCanyon` | 400 | 250 | -| `eip1559Elasticity` | 5 | 6 | -| `gasPriceOracleBaseFeeScalar` | 0 | 1368 | -| `gasPriceOracleBlobBaseFeeScalar` | 0 | 810949 | +| `eip1559Denominator` | 400 | - | +| `eip1559DenominatorCanyon` | 400 | - | +| `eip1559Elasticity` | 5 | - | +| `gasPriceOracleBaseFeeScalar` | 0 | - | +| `gasPriceOracleBlobBaseFeeScalar` | 0 | - | -`channelTimeout` shows the value in force: since the Granite upgrade it is a protocol constant of 50 L1 blocks on every OP Stack chain, and the deploy-config value of 300 no longer applies. +`channelTimeout` and `maxSequencerDrift` show the values in force. The Granite and Fjord upgrades made them protocol constants: 50 L1 blocks for `channelTimeout`, and 1800 seconds for `maxSequencerDrift`, which Celo's op-node raises by 1092 seconds to 2892 because the sequencer waits for L1 finality. The older configured values (`channel_timeout` 300 in Celo's `rollup.json`, and `maxSequencerDrift` 600 in OP's deploy config) no longer apply. + +OP Mainnet can change its EIP-1559 and gas price oracle values in its `SystemConfig` contract, so the OP column leaves them out. OP Mainnet's configuration and `SystemConfig` address are in the [Superchain Registry](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/configs/mainnet/op.toml). The minimum base fee is not part of this config. It is the `minBaseFee` value in the L1 `SystemConfig` contract, encoded in every L2 block header; see [Transaction fees](/operate/specification/transaction-fees#base-fee-floor).