From 558635c8a5e57e5eda32e98ab4b7ab50ef40e2a6 Mon Sep 17 00:00:00 2001 From: Baptiste Oueriagli Date: Sun, 11 Oct 2026 12:28:18 +0200 Subject: [PATCH 1/7] feat(zeronet): add Denim SystemConfig gas parameters task --- .../FACILITATOR.md | 66 ++++++++++++ .../2026-10-08-denim-system-config/Makefile | 49 +++++++++ .../config/zeronet/.env | 14 +++ .../config/zeronet/README.md | 29 +++++ .../script/UpdateDenimGasParams.s.sol | 102 ++++++++++++++++++ 5 files changed, 260 insertions(+) create mode 100644 active/evm/tasks/2026-10-08-denim-system-config/FACILITATOR.md create mode 100644 active/evm/tasks/2026-10-08-denim-system-config/Makefile create mode 100644 active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/.env create mode 100644 active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/README.md create mode 100644 active/evm/tasks/2026-10-08-denim-system-config/script/UpdateDenimGasParams.s.sol diff --git a/active/evm/tasks/2026-10-08-denim-system-config/FACILITATOR.md b/active/evm/tasks/2026-10-08-denim-system-config/FACILITATOR.md new file mode 100644 index 000000000..c8099b434 --- /dev/null +++ b/active/evm/tasks/2026-10-08-denim-system-config/FACILITATOR.md @@ -0,0 +1,66 @@ +# Denim SystemConfig Gas Parameters — Facilitator Guide + +This task writes the post-Denim gas limit and EIP-1559 denominator to `SystemConfig`, signed by the +Base multisig alone (the `SystemConfig` owner). + +At the first Denim block the node divides the gas limit by 10 and multiplies the EIP-1559 +denominator by 10 (`DENIM_GAS_PARAMETER_SCALING_FACTOR` in base/base +`crates/consensus/derive/src/attributes/stateful.rs`). This task records the same values on L1 so +that a later `SystemConfig` update does not restore the 2s-block ones. + +**Execute only after Denim activates** (October 14, 2026 at 18:00 UTC for Zeronet). In the L1 block +the first Denim block derives from, the node would scale the new values a second time, so the script +requires an L1 block timestamp strictly after `DENIM_ACTIVATION_TIMESTAMP`. + +Replace `` with the rollout network (`zeronet`). Every command requires `TASK_NETWORK` +explicitly. Run everything from this directory (`active/evm/tasks/2026-10-08-denim-system-config/`). + +## 1. Install dependencies + +```bash +make TASK_NETWORK= deps +``` + +## 2. Review the network config + +Open `config//.env` and confirm: + +- `OLD_GAS_LIMIT` and `OLD_EIP1559_DENOMINATOR` are the live `SystemConfig` values. The script asserts + them before building the calls. +- `NEW_GAS_LIMIT` is `OLD_GAS_LIMIT / 10` and `NEW_EIP1559_DENOMINATOR` is + `OLD_EIP1559_DENOMINATOR * 10`. The script asserts both ratios. +- `DENIM_ACTIVATION_TIMESTAMP` matches the activation registered in `ProtocolVersions`. + +The EIP-1559 elasticity and the DA footprint gas scalar are read from the live config and must stay +unchanged. + +## 3. Generate the validation file + +After Denim activates: + +```bash +make TASK_NETWORK= gen-validation-cb +``` + +This writes `config//validations/base-signer.json`. Replace any generated +`<>` or `<>` placeholders with reviewed contract names and state-change +descriptions. For any non-mainnet rollout, remove the generated `taskOriginConfig` and add this root +field: + +```json +"skipTaskOriginValidation": true +``` + +Commit it and share `config//README.md` with signers. + +## 4. Collect signatures and execute + +`SystemConfig` is owned by the Base multisig directly, so the collected signatures execute the +transaction without a separate approval step. + +```bash +SIGNATURES= make TASK_NETWORK= execute +``` + +After execution the script checks the new gas limit and denominator, and that elasticity and the DA +footprint gas scalar are unchanged. Set the README status to the execution transaction link. diff --git a/active/evm/tasks/2026-10-08-denim-system-config/Makefile b/active/evm/tasks/2026-10-08-denim-system-config/Makefile new file mode 100644 index 000000000..4f4c3145c --- /dev/null +++ b/active/evm/tasks/2026-10-08-denim-system-config/Makefile @@ -0,0 +1,49 @@ +include ../../../../Makefile +include $(REPO_ROOT)/Multisig.mk + +# Denim rolls out across several networks from this one task directory, so the network is never +# defaulted. Select it on every command line: +# make TASK_NETWORK=zeronet gen-validation-cb +ifndef TASK_NETWORK +$(error TASK_NETWORK is required, e.g. make TASK_NETWORK=zeronet $(MAKECMDGOALS)) +endif + +PROJECT_DIR := $(abspath ../..) + +include $(REPO_ROOT)/config/$(TASK_NETWORK).env +include config/$(TASK_NETWORK)/.env + +SIGNER_TOOL_PATH := $(REPO_ROOT)/signer-tool +VALIDATIONS_DIR := $(CURDIR)/config/$(TASK_NETWORK)/validations +RPC_URL := $(L1_RPC_URL) +TASK_ORIGIN_DIR := $(CURDIR)/config/$(TASK_NETWORK) +SIGNATURE_DIR := $(CURDIR)/signatures/$(TASK_NETWORK) + +TASK_DIR := tasks/2026-10-08-denim-system-config +SCRIPT_NAME := $(TASK_DIR)/script/UpdateDenimGasParams.s.sol:UpdateDenimGasParams + +CB_SENDER = $(shell $(MISE_EXEC) cast call $(CB_MULTISIG) "getOwners()(address[])" --rpc-url $(L1_RPC_URL) | tr -d '[]' | cut -d',' -f1) + +GAS_ENV = CB_MULTISIG=$(CB_MULTISIG) \ + SYSTEM_CONFIG=$(SYSTEM_CONFIG) \ + DENIM_ACTIVATION_TIMESTAMP=$(DENIM_ACTIVATION_TIMESTAMP) \ + OLD_GAS_LIMIT=$(OLD_GAS_LIMIT) \ + NEW_GAS_LIMIT=$(NEW_GAS_LIMIT) \ + OLD_EIP1559_DENOMINATOR=$(OLD_EIP1559_DENOMINATOR) \ + NEW_EIP1559_DENOMINATOR=$(NEW_EIP1559_DENOMINATOR) + +## +# Validation file +## +# SystemConfig is owned by the Base multisig alone, so it is the executing Safe and there are no +# nested Safes to approve. +.PHONY: gen-validation-cb +gen-validation-cb: deps-signer-tool + $(call GEN_VALIDATION,$(SCRIPT_NAME),,$(CB_SENDER),base-signer.json,$(GAS_ENV)) + +## +# Execute +## +.PHONY: execute +execute: + export $(GAS_ENV); $(call MULTISIG_EXECUTE,$(SIGNATURES)) diff --git a/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/.env b/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/.env new file mode 100644 index 000000000..3237fd589 --- /dev/null +++ b/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/.env @@ -0,0 +1,14 @@ +# https://github.com/base/contracts/commits/releases/v8.3.0/ +BASE_CONTRACTS_COMMIT=385f21a41f277d287db92fffe88dca41299162ea + +# Denim (upgrade id 13) activation, set by 2026-10-07-denim-upgrade: 2026-10-14 18:00:00 UTC. +# date -u -r 1792000800 +DENIM_ACTIVATION_TIMESTAMP=1792000800 + +# Live values verified against Zeronet on 2026-10-08. +OLD_GAS_LIMIT=1200000000 +OLD_EIP1559_DENOMINATOR=100 + +# Values the node applies from the first Denim block (gas limit / 10, denominator x 10). +NEW_GAS_LIMIT=120000000 +NEW_EIP1559_DENOMINATOR=1000 diff --git a/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/README.md b/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/README.md new file mode 100644 index 000000000..211cbf153 --- /dev/null +++ b/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/README.md @@ -0,0 +1,29 @@ +# Denim SystemConfig Gas Parameters + +Status: READY TO SIGN + +## Description + +Sets Zeronet's post-Denim gas parameters on `SystemConfig`: + +- gas limit from `1,200,000,000` to `120,000,000`; +- EIP-1559 denominator from `100` to `1000`. + +The node already applies these values from the first Denim block; this writes them to L1. Executes +after Denim activates on October 14, 2026 at 18:00 UTC. + +## Target + +| Contract | Address | +| -- | -- | +| `SystemConfig` | `0x0a111C7980152bDe41D71f48e2E1d8184f5f6187` | + +## Sign + +From the repository root: + +```bash +make sign-task +``` + +Select this Zeronet task, sign, and send the signature to the facilitator. diff --git a/active/evm/tasks/2026-10-08-denim-system-config/script/UpdateDenimGasParams.s.sol b/active/evm/tasks/2026-10-08-denim-system-config/script/UpdateDenimGasParams.s.sol new file mode 100644 index 000000000..cdc6d0a2c --- /dev/null +++ b/active/evm/tasks/2026-10-08-denim-system-config/script/UpdateDenimGasParams.s.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import {Vm} from "forge-std/Vm.sol"; + +import {MultisigScript, Enum} from "@base-contracts/scripts/universal/MultisigScript.sol"; +import {Simulation} from "@base-contracts/scripts/universal/Simulation.sol"; + +interface ISystemConfig { + function owner() external view returns (address); + function gasLimit() external view returns (uint64); + function minimumGasLimit() external view returns (uint64); + function maximumGasLimit() external view returns (uint64); + function eip1559Denominator() external view returns (uint32); + function eip1559Elasticity() external view returns (uint32); + function daFootprintGasScalar() external view returns (uint16); + function setGasLimit(uint64 _gasLimit) external; + function setEIP1559Params(uint32 _denominator, uint32 _elasticity) external; +} + +/// @notice Writes the post-Denim gas limit and EIP-1559 denominator to SystemConfig. +/// @dev At the first Denim block the node scales both values itself (gas limit / 10, denominator x 10). +/// This records the same values on L1 so a later SystemConfig update does not restore the 2s-block +/// ones. It must land in an L1 block strictly after the Denim activation timestamp: an L1 block at +/// that timestamp can be the origin of the first Denim block, which would scale the values again. +contract UpdateDenimGasParams is MultisigScript { + address internal immutable ownerSafe; + address internal immutable systemConfig; + uint256 internal immutable denimActivationTimestamp; + + uint64 internal immutable oldGasLimit; + uint64 internal immutable newGasLimit; + uint32 internal immutable oldDenominator; + uint32 internal immutable newDenominator; + + /// @dev Live values captured at construction and re-asserted after execution. + uint32 internal immutable elasticity; + uint16 internal immutable daFootprintGasScalar; + + constructor() { + ownerSafe = vm.envAddress("CB_MULTISIG"); + systemConfig = vm.envAddress("SYSTEM_CONFIG"); + denimActivationTimestamp = vm.envUint("DENIM_ACTIVATION_TIMESTAMP"); + + oldGasLimit = uint64(vm.envUint("OLD_GAS_LIMIT")); + newGasLimit = uint64(vm.envUint("NEW_GAS_LIMIT")); + oldDenominator = uint32(vm.envUint("OLD_EIP1559_DENOMINATOR")); + newDenominator = uint32(vm.envUint("NEW_EIP1559_DENOMINATOR")); + + ISystemConfig config = ISystemConfig(systemConfig); + elasticity = config.eip1559Elasticity(); + daFootprintGasScalar = config.daFootprintGasScalar(); + } + + function setUp() public view { + ISystemConfig config = ISystemConfig(systemConfig); + + require(config.owner() == ownerSafe, "system config owner mismatch"); + require(config.gasLimit() == oldGasLimit, "unexpected current gas limit"); + require(config.eip1559Denominator() == oldDenominator, "unexpected current denominator"); + + require(newGasLimit * 10 == oldGasLimit, "new gas limit is not old / 10"); + require(newDenominator == oldDenominator * 10, "new denominator is not old x 10"); + require(newGasLimit >= config.minimumGasLimit(), "new gas limit below minimum"); + require(newGasLimit <= config.maximumGasLimit(), "new gas limit above maximum"); + + require(block.timestamp > denimActivationTimestamp, "Denim not active yet"); + } + + function _buildCalls() internal view override returns (Call[] memory) { + Call[] memory calls = new Call[](2); + + calls[0] = Call({ + operation: Enum.Operation.Call, + target: systemConfig, + data: abi.encodeCall(ISystemConfig.setGasLimit, (newGasLimit)), + value: 0 + }); + + calls[1] = Call({ + operation: Enum.Operation.Call, + target: systemConfig, + data: abi.encodeCall(ISystemConfig.setEIP1559Params, (newDenominator, elasticity)), + value: 0 + }); + + return calls; + } + + function _postCheck(Vm.AccountAccess[] memory, Simulation.Payload memory) internal view override { + ISystemConfig config = ISystemConfig(systemConfig); + + require(config.gasLimit() == newGasLimit, "gas limit not updated"); + require(config.eip1559Denominator() == newDenominator, "denominator not updated"); + require(config.eip1559Elasticity() == elasticity, "elasticity changed"); + require(config.daFootprintGasScalar() == daFootprintGasScalar, "DA footprint gas scalar changed"); + } + + function _ownerSafe() internal view override returns (address) { + return ownerSafe; + } +} From c12ee8869687b4b95163334be78de7332d7791bb Mon Sep 17 00:00:00 2001 From: Baptiste Oueriagli Date: Wed, 14 Oct 2026 19:54:21 +0200 Subject: [PATCH 2/7] fix(zeronet): allow signing Denim gas parameters before activation --- .../2026-10-08-denim-system-config/FACILITATOR.md | 13 ++++++------- .../tasks/2026-10-08-denim-system-config/Makefile | 1 - .../config/zeronet/.env | 4 ---- .../script/UpdateDenimGasParams.s.sol | 8 ++------ 4 files changed, 8 insertions(+), 18 deletions(-) diff --git a/active/evm/tasks/2026-10-08-denim-system-config/FACILITATOR.md b/active/evm/tasks/2026-10-08-denim-system-config/FACILITATOR.md index c8099b434..08aec9b83 100644 --- a/active/evm/tasks/2026-10-08-denim-system-config/FACILITATOR.md +++ b/active/evm/tasks/2026-10-08-denim-system-config/FACILITATOR.md @@ -8,9 +8,10 @@ denominator by 10 (`DENIM_GAS_PARAMETER_SCALING_FACTOR` in base/base `crates/consensus/derive/src/attributes/stateful.rs`). This task records the same values on L1 so that a later `SystemConfig` update does not restore the 2s-block ones. -**Execute only after Denim activates** (October 14, 2026 at 18:00 UTC for Zeronet). In the L1 block -the first Denim block derives from, the node would scale the new values a second time, so the script -requires an L1 block timestamp strictly after `DENIM_ACTIVATION_TIMESTAMP`. +The validation file can be generated and signed before Denim activates. **Execute only after Denim +activates** (October 14, 2026 at 18:00 UTC for Zeronet), in an L1 block with a timestamp strictly +after the activation: a transaction included in or before the L1 block the first Denim block derives +from would have its new values scaled a second time by the node. Replace `` with the rollout network (`zeronet`). Every command requires `TASK_NETWORK` explicitly. Run everything from this directory (`active/evm/tasks/2026-10-08-denim-system-config/`). @@ -29,15 +30,12 @@ Open `config//.env` and confirm: them before building the calls. - `NEW_GAS_LIMIT` is `OLD_GAS_LIMIT / 10` and `NEW_EIP1559_DENOMINATOR` is `OLD_EIP1559_DENOMINATOR * 10`. The script asserts both ratios. -- `DENIM_ACTIVATION_TIMESTAMP` matches the activation registered in `ProtocolVersions`. The EIP-1559 elasticity and the DA footprint gas scalar are read from the live config and must stay unchanged. ## 3. Generate the validation file -After Denim activates: - ```bash make TASK_NETWORK= gen-validation-cb ``` @@ -56,7 +54,8 @@ Commit it and share `config//README.md` with signers. ## 4. Collect signatures and execute `SystemConfig` is owned by the Base multisig directly, so the collected signatures execute the -transaction without a separate approval step. +transaction without a separate approval step. Run it only once the latest L1 block timestamp is past +the Denim activation. ```bash SIGNATURES= make TASK_NETWORK= execute diff --git a/active/evm/tasks/2026-10-08-denim-system-config/Makefile b/active/evm/tasks/2026-10-08-denim-system-config/Makefile index 4f4c3145c..4fdea402b 100644 --- a/active/evm/tasks/2026-10-08-denim-system-config/Makefile +++ b/active/evm/tasks/2026-10-08-denim-system-config/Makefile @@ -26,7 +26,6 @@ CB_SENDER = $(shell $(MISE_EXEC) cast call $(CB_MULTISIG) "getOwners()(address[] GAS_ENV = CB_MULTISIG=$(CB_MULTISIG) \ SYSTEM_CONFIG=$(SYSTEM_CONFIG) \ - DENIM_ACTIVATION_TIMESTAMP=$(DENIM_ACTIVATION_TIMESTAMP) \ OLD_GAS_LIMIT=$(OLD_GAS_LIMIT) \ NEW_GAS_LIMIT=$(NEW_GAS_LIMIT) \ OLD_EIP1559_DENOMINATOR=$(OLD_EIP1559_DENOMINATOR) \ diff --git a/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/.env b/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/.env index 3237fd589..05f479ad4 100644 --- a/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/.env +++ b/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/.env @@ -1,10 +1,6 @@ # https://github.com/base/contracts/commits/releases/v8.3.0/ BASE_CONTRACTS_COMMIT=385f21a41f277d287db92fffe88dca41299162ea -# Denim (upgrade id 13) activation, set by 2026-10-07-denim-upgrade: 2026-10-14 18:00:00 UTC. -# date -u -r 1792000800 -DENIM_ACTIVATION_TIMESTAMP=1792000800 - # Live values verified against Zeronet on 2026-10-08. OLD_GAS_LIMIT=1200000000 OLD_EIP1559_DENOMINATOR=100 diff --git a/active/evm/tasks/2026-10-08-denim-system-config/script/UpdateDenimGasParams.s.sol b/active/evm/tasks/2026-10-08-denim-system-config/script/UpdateDenimGasParams.s.sol index cdc6d0a2c..e6422421d 100644 --- a/active/evm/tasks/2026-10-08-denim-system-config/script/UpdateDenimGasParams.s.sol +++ b/active/evm/tasks/2026-10-08-denim-system-config/script/UpdateDenimGasParams.s.sol @@ -21,12 +21,11 @@ interface ISystemConfig { /// @notice Writes the post-Denim gas limit and EIP-1559 denominator to SystemConfig. /// @dev At the first Denim block the node scales both values itself (gas limit / 10, denominator x 10). /// This records the same values on L1 so a later SystemConfig update does not restore the 2s-block -/// ones. It must land in an L1 block strictly after the Denim activation timestamp: an L1 block at -/// that timestamp can be the origin of the first Denim block, which would scale the values again. +/// ones. Execute it after Denim activates: before that, the node would scale the new values again +/// at the first Denim block. contract UpdateDenimGasParams is MultisigScript { address internal immutable ownerSafe; address internal immutable systemConfig; - uint256 internal immutable denimActivationTimestamp; uint64 internal immutable oldGasLimit; uint64 internal immutable newGasLimit; @@ -40,7 +39,6 @@ contract UpdateDenimGasParams is MultisigScript { constructor() { ownerSafe = vm.envAddress("CB_MULTISIG"); systemConfig = vm.envAddress("SYSTEM_CONFIG"); - denimActivationTimestamp = vm.envUint("DENIM_ACTIVATION_TIMESTAMP"); oldGasLimit = uint64(vm.envUint("OLD_GAS_LIMIT")); newGasLimit = uint64(vm.envUint("NEW_GAS_LIMIT")); @@ -63,8 +61,6 @@ contract UpdateDenimGasParams is MultisigScript { require(newDenominator == oldDenominator * 10, "new denominator is not old x 10"); require(newGasLimit >= config.minimumGasLimit(), "new gas limit below minimum"); require(newGasLimit <= config.maximumGasLimit(), "new gas limit above maximum"); - - require(block.timestamp > denimActivationTimestamp, "Denim not active yet"); } function _buildCalls() internal view override returns (Call[] memory) { From 23eb232b203d738fb3f6ce06e8ac58c7cb788230 Mon Sep 17 00:00:00 2001 From: Baptiste Oueriagli Date: Wed, 14 Oct 2026 20:06:23 +0200 Subject: [PATCH 3/7] chore(zeronet): add Denim gas parameters validation file --- .../zeronet/validations/base-signer.json | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/validations/base-signer.json diff --git a/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/validations/base-signer.json b/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/validations/base-signer.json new file mode 100644 index 000000000..8e6c3a659 --- /dev/null +++ b/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/validations/base-signer.json @@ -0,0 +1,67 @@ +{ + "cmd": "CB_MULTISIG=0x856611ed7e07d83243b15e93f6321f2df6865852 SYSTEM_CONFIG=0x0a111c7980152bde41d71f48e2e1d8184f5f6187 OLD_GAS_LIMIT=1200000000 NEW_GAS_LIMIT=120000000 OLD_EIP1559_DENOMINATOR=100 NEW_EIP1559_DENOMINATOR=1000 mise exec -- forge script --rpc-url https://c3-chainproxy-eth-hoodi-full-dev.cbhq.net tasks/2026-10-08-denim-system-config/script/UpdateDenimGasParams.s.sol:UpdateDenimGasParams --sig sign(address[]) [] --sender 0x2c1475476B586d66a85bC65A5aB396BBbAa4f3aD", + "ledgerId": 1, + "rpcUrl": "https://c3-chainproxy-eth-hoodi-full-dev.cbhq.net", + "expectedDomainAndMessageHashes": { + "address": "0x856611eD7E07D83243b15E93f6321f2df6865852", + "domainHash": "0xc88eae2baaa4c8513a3d87913666de9463f106158aaf8be5cd31588215ccd5c4", + "messageHash": "0x5433f20de7f056f5c7420d66e94a06be3de603f9648f34f6eea7ef4038561b16" + }, + "stateOverrides": [ + { + "name": "CB Signer Safe - Zeronet", + "address": "0x856611eD7E07D83243b15E93f6321f2df6865852", + "overrides": [ + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000004", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001", + "description": "Override the threshold to 1 so the transaction simulation can occur.", + "allowDifference": false + }, + { + "key": "0x2b25a1a0b52252deb68a67f882255eacc6adbfa7143cee991048bf6da0e7c174", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001", + "description": "Simulates an approval from msg.sender in order for the task simulation to succeed.", + "allowDifference": false + } + ] + } + ], + "stateChanges": [ + { + "name": "System Config - Zeronet", + "address": "0x0a111C7980152bDe41D71f48e2E1d8184f5f6187", + "changes": [ + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000068", + "before": "0x00000000000000000000000000000000000c3c9d000005580000000047868c00", + "after": "0x00000000000000000000000000000000000c3c9d000005580000000007270e00", + "description": "Sets gasLimit from 1,200,000,000 to 120,000,000. basefeeScalar and blobbasefeeScalar are unchanged.", + "allowDifference": false + }, + { + "key": "0x000000000000000000000000000000000000000000000000000000000000006a", + "before": "0x0000000000000000000000770000000000000000000000000000000f00000064", + "after": "0x0000000000000000000000770000000000000000000000000000000f000003e8", + "description": "Sets eip1559Denominator from 100 to 1000. eip1559Elasticity (15) and daFootprintGasScalar (119) are unchanged.", + "allowDifference": false + } + ] + }, + { + "name": "CB Signer Safe - Zeronet", + "address": "0x856611eD7E07D83243b15E93f6321f2df6865852", + "changes": [ + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000005", + "before": "0x0000000000000000000000000000000000000000000000000000000000000022", + "after": "0x0000000000000000000000000000000000000000000000000000000000000023", + "description": "Increments the nonce", + "allowDifference": false + } + ] + } + ], + "balanceChanges": [], + "skipTaskOriginValidation": true +} From 1d6b65dbde22a26db450edd33cc38eebffadd52d Mon Sep 17 00:00:00 2001 From: Baptiste Oueriagli Date: Wed, 14 Oct 2026 20:38:42 +0200 Subject: [PATCH 4/7] chore(zeronet): mark Denim gas parameters task executed --- .../560048/run-1792003092973.json | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 active/evm/tasks/2026-10-08-denim-system-config/records/UpdateDenimGasParams.s.sol/560048/run-1792003092973.json diff --git a/active/evm/tasks/2026-10-08-denim-system-config/records/UpdateDenimGasParams.s.sol/560048/run-1792003092973.json b/active/evm/tasks/2026-10-08-denim-system-config/records/UpdateDenimGasParams.s.sol/560048/run-1792003092973.json new file mode 100644 index 000000000..5dbc9fd99 --- /dev/null +++ b/active/evm/tasks/2026-10-08-denim-system-config/records/UpdateDenimGasParams.s.sol/560048/run-1792003092973.json @@ -0,0 +1,106 @@ +{ + "transactions": [ + { + "hash": "0x2bf7928e72e17a4657a3fd24e33907574881b63878ac04d0cfeaa5e7af880a5b", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x856611ed7e07d83243b15e93f6321f2df6865852", + "function": "execTransaction(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,bytes)", + "arguments": [ + "0xA8B8CA1d6F0F5Ce63dCEA9121A01b302c5801303", + "0", + "0x858cc8320000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000300000000000000000000000000a8b8ca1d6f0f5ce63dcea9121a01b302c580130300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022482ad56cb00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000a111c7980152bde41d71f48e2e1d8184f5f6187000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024b40a817c0000000000000000000000000000000000000000000000000000000007270e00000000000000000000000000000000000000000000000000000000000000000000000000000000000a111c7980152bde41d71f48e2e1d8184f5f6187000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044c0fd4b4100000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "1", + "0", + "0", + "0", + "0x0000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000", + "0x0ccd9f53a3d67af557f2b46cfbceabe463e7471c98c314f89c77131e83a25b0e7d6978d3a2e5b859b834ae1e0040fdd22740f245cbf027da41ae976044146ac51b6907d45a1cdf3866537008b808e9e1aa4716755c92be47b16646410a2c7d2b916d4c8d8d797d6566bb31f179e596af019e6f1dbca2daf6d2e8e553e36e47fe581b34b85c7e76b465fa1655c79d4eba287c20c036ae249efbf33c3c68e6b5b5ce316afe8f223ca7982aa304fbab3dc7069b3287ebedeb5c2f3deb3df038ce2ea6f61b" + ], + "transaction": { + "from": "0xb2d9a52e76841279ef0372c534c539a4f68f8c0b", + "to": "0x856611ed7e07d83243b15e93f6321f2df6865852", + "gas": "0x25c5e", + "value": "0x0", + "input": "0x6a761202000000000000000000000000a8b8ca1d6f0f5ce63dcea9121a01b302c580130300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000003c4858cc8320000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000300000000000000000000000000a8b8ca1d6f0f5ce63dcea9121a01b302c580130300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022482ad56cb00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000a111c7980152bde41d71f48e2e1d8184f5f6187000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024b40a817c0000000000000000000000000000000000000000000000000000000007270e00000000000000000000000000000000000000000000000000000000000000000000000000000000000a111c7980152bde41d71f48e2e1d8184f5f6187000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044c0fd4b4100000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c30ccd9f53a3d67af557f2b46cfbceabe463e7471c98c314f89c77131e83a25b0e7d6978d3a2e5b859b834ae1e0040fdd22740f245cbf027da41ae976044146ac51b6907d45a1cdf3866537008b808e9e1aa4716755c92be47b16646410a2c7d2b916d4c8d8d797d6566bb31f179e596af019e6f1dbca2daf6d2e8e553e36e47fe581b34b85c7e76b465fa1655c79d4eba287c20c036ae249efbf33c3c68e6b5b5ce316afe8f223ca7982aa304fbab3dc7069b3287ebedeb5c2f3deb3df038ce2ea6f61b0000000000000000000000000000000000000000000000000000000000", + "nonce": "0x7e", + "chainId": "0x88bb0" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xfae57", + "logs": [ + { + "address": "0x0a111c7980152bde41d71f48e2e1d8184f5f6187", + "topics": [ + "0x1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000002" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000007270e00", + "blockHash": "0xe8d3d5ee263cf827a8de6db003ae97fd631d1a64a994b4f3c9ee377867fee3c1", + "blockNumber": "0x3a3c1c", + "blockTimestamp": "0x6acfcc14", + "transactionHash": "0x2bf7928e72e17a4657a3fd24e33907574881b63878ac04d0cfeaa5e7af880a5b", + "transactionIndex": "0x16", + "logIndex": "0x12", + "removed": false + }, + { + "address": "0x0a111c7980152bde41d71f48e2e1d8184f5f6187", + "topics": [ + "0x1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000004" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000003e80000000f", + "blockHash": "0xe8d3d5ee263cf827a8de6db003ae97fd631d1a64a994b4f3c9ee377867fee3c1", + "blockNumber": "0x3a3c1c", + "blockTimestamp": "0x6acfcc14", + "transactionHash": "0x2bf7928e72e17a4657a3fd24e33907574881b63878ac04d0cfeaa5e7af880a5b", + "transactionIndex": "0x16", + "logIndex": "0x13", + "removed": false + }, + { + "address": "0x856611ed7e07d83243b15e93f6321f2df6865852", + "topics": [ + "0x442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e", + "0xf6d3969b962c35f37c56526d919810ab61d9aa223801a194d2c7efce72161674" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xe8d3d5ee263cf827a8de6db003ae97fd631d1a64a994b4f3c9ee377867fee3c1", + "blockNumber": "0x3a3c1c", + "blockTimestamp": "0x6acfcc14", + "transactionHash": "0x2bf7928e72e17a4657a3fd24e33907574881b63878ac04d0cfeaa5e7af880a5b", + "transactionIndex": "0x16", + "logIndex": "0x14", + "removed": false + } + ], + "logsBloom": "0x04000000400000000000000000000000000000000000000000000000040000001000000000000000000000000000000020000000000008100000000000000000000000000000000000000000000000000000000000000000000000000000000008000000020000000000000000040800000000000000000000000000000000000000000080000000000000240000000000008000000001000000000000000000000000000000000000000100000004000000000000000000002000000000000000000000000000000000000000000000000000008000000000000000000020000000000000000000000000000000000000000000008000000000008000000000", + "type": "0x2", + "transactionHash": "0x2bf7928e72e17a4657a3fd24e33907574881b63878ac04d0cfeaa5e7af880a5b", + "transactionIndex": "0x16", + "blockHash": "0xe8d3d5ee263cf827a8de6db003ae97fd631d1a64a994b4f3c9ee377867fee3c1", + "blockNumber": "0x3a3c1c", + "gasUsed": "0x1b58e", + "effectiveGasPrice": "0x44d90504", + "from": "0xb2d9a52e76841279ef0372c534c539a4f68f8c0b", + "to": "0x856611ed7e07d83243b15e93f6321f2df6865852", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1792003092973, + "chain": 560048, + "commit": "23eb232" +} \ No newline at end of file From 943d7b34ae89d3b96545d9c599d3f578fbf9f26f Mon Sep 17 00:00:00 2001 From: Baptiste Oueriagli Date: Wed, 14 Oct 2026 20:38:55 +0200 Subject: [PATCH 5/7] chore(zeronet): set Denim gas parameters README status to executed --- .../2026-10-08-denim-system-config/config/zeronet/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/README.md b/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/README.md index 211cbf153..622afc32c 100644 --- a/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/README.md +++ b/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/README.md @@ -1,6 +1,6 @@ # Denim SystemConfig Gas Parameters -Status: READY TO SIGN +Status: [EXECUTED](https://hoodi.etherscan.io/tx/0x2bf7928e72e17a4657a3fd24e33907574881b63878ac04d0cfeaa5e7af880a5b) ## Description From c52abd889ad69cd53884371cc72840a7fe028550 Mon Sep 17 00:00:00 2001 From: Baptiste Oueriagli Date: Thu, 15 Oct 2026 11:23:34 +0200 Subject: [PATCH 6/7] fix(zeronet): block Denim gas parameters execution before activation --- .../2026-10-08-denim-system-config/FACILITATOR.md | 15 ++++++++------- .../tasks/2026-10-08-denim-system-config/Makefile | 14 +++++++++++++- .../config/zeronet/.env | 4 ++++ 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/active/evm/tasks/2026-10-08-denim-system-config/FACILITATOR.md b/active/evm/tasks/2026-10-08-denim-system-config/FACILITATOR.md index 08aec9b83..466024c87 100644 --- a/active/evm/tasks/2026-10-08-denim-system-config/FACILITATOR.md +++ b/active/evm/tasks/2026-10-08-denim-system-config/FACILITATOR.md @@ -9,12 +9,12 @@ denominator by 10 (`DENIM_GAS_PARAMETER_SCALING_FACTOR` in base/base that a later `SystemConfig` update does not restore the 2s-block ones. The validation file can be generated and signed before Denim activates. **Execute only after Denim -activates** (October 14, 2026 at 18:00 UTC for Zeronet), in an L1 block with a timestamp strictly -after the activation: a transaction included in or before the L1 block the first Denim block derives -from would have its new values scaled a second time by the node. +activates**, in an L1 block with a timestamp strictly after `DENIM_ACTIVATION_TIMESTAMP` from +`config//.env`: a transaction included in or before the L1 block the first Denim block +derives from would have its new values scaled a second time by the node. `make execute` refuses to +run until the latest L1 block timestamp is past the activation. -Replace `` with the rollout network (`zeronet`). Every command requires `TASK_NETWORK` -explicitly. Run everything from this directory (`active/evm/tasks/2026-10-08-denim-system-config/`). +Replace `` with the rollout network. Every command requires `TASK_NETWORK` explicitly. Run everything from this directory (`active/evm/tasks/2026-10-08-denim-system-config/`). ## 1. Install dependencies @@ -30,6 +30,7 @@ Open `config//.env` and confirm: them before building the calls. - `NEW_GAS_LIMIT` is `OLD_GAS_LIMIT / 10` and `NEW_EIP1559_DENOMINATOR` is `OLD_EIP1559_DENOMINATOR * 10`. The script asserts both ratios. +- `DENIM_ACTIVATION_TIMESTAMP` matches the Denim activation registered in `ProtocolVersions`. The EIP-1559 elasticity and the DA footprint gas scalar are read from the live config and must stay unchanged. @@ -54,8 +55,8 @@ Commit it and share `config//README.md` with signers. ## 4. Collect signatures and execute `SystemConfig` is owned by the Base multisig directly, so the collected signatures execute the -transaction without a separate approval step. Run it only once the latest L1 block timestamp is past -the Denim activation. +transaction without a separate approval step. `execute` first checks that the latest L1 block +timestamp is past `DENIM_ACTIVATION_TIMESTAMP` and stops otherwise. ```bash SIGNATURES= make TASK_NETWORK= execute diff --git a/active/evm/tasks/2026-10-08-denim-system-config/Makefile b/active/evm/tasks/2026-10-08-denim-system-config/Makefile index 4fdea402b..9df72b117 100644 --- a/active/evm/tasks/2026-10-08-denim-system-config/Makefile +++ b/active/evm/tasks/2026-10-08-denim-system-config/Makefile @@ -43,6 +43,18 @@ gen-validation-cb: deps-signer-tool ## # Execute ## +# Signing does not depend on the activation, but execution must land after it: in or before the L1 +# block the first Denim block derives from, the node would scale the new values a second time. The +# transaction lands in a block after the latest one, so the latest L1 timestamp must be past it. +.PHONY: check-denim-active +check-denim-active: + $(call require_vars,check-denim-active,DENIM_ACTIVATION_TIMESTAMP L1_RPC_URL) + @latest=$$($(MISE_EXEC) cast block latest --field timestamp --rpc-url $(L1_RPC_URL)); \ + if [ "$$latest" -le "$(DENIM_ACTIVATION_TIMESTAMP)" ]; then \ + echo "Denim is not active: latest L1 block timestamp $$latest <= DENIM_ACTIVATION_TIMESTAMP $(DENIM_ACTIVATION_TIMESTAMP)" >&2; \ + exit 1; \ + fi + .PHONY: execute -execute: +execute: check-denim-active export $(GAS_ENV); $(call MULTISIG_EXECUTE,$(SIGNATURES)) diff --git a/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/.env b/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/.env index 05f479ad4..3237fd589 100644 --- a/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/.env +++ b/active/evm/tasks/2026-10-08-denim-system-config/config/zeronet/.env @@ -1,6 +1,10 @@ # https://github.com/base/contracts/commits/releases/v8.3.0/ BASE_CONTRACTS_COMMIT=385f21a41f277d287db92fffe88dca41299162ea +# Denim (upgrade id 13) activation, set by 2026-10-07-denim-upgrade: 2026-10-14 18:00:00 UTC. +# date -u -r 1792000800 +DENIM_ACTIVATION_TIMESTAMP=1792000800 + # Live values verified against Zeronet on 2026-10-08. OLD_GAS_LIMIT=1200000000 OLD_EIP1559_DENOMINATOR=100 From aefb41f6cbf90e3f38bc76f18f2045ac47fbfc70 Mon Sep 17 00:00:00 2001 From: Baptiste Oueriagli Date: Tue, 20 Oct 2026 14:28:51 +0200 Subject: [PATCH 7/7] chore(zeronet): add Denim gas parameters task status --- .../2026-10-08-denim-system-config/status.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 active/evm/tasks/2026-10-08-denim-system-config/status.json diff --git a/active/evm/tasks/2026-10-08-denim-system-config/status.json b/active/evm/tasks/2026-10-08-denim-system-config/status.json new file mode 100644 index 000000000..d9e6d8ced --- /dev/null +++ b/active/evm/tasks/2026-10-08-denim-system-config/status.json @@ -0,0 +1,15 @@ +{ + "schema_version": 1, + "task": "2026-10-08-denim-system-config", + "kind": "active", + "last_updated": "2026-10-20T12:28:09Z", + "networks": { + "zeronet": { + "step": "executed", + "pr": "https://github.com/base/contract-deployments/pull/808", + "blocksec_ticket": null, + "signatures": {}, + "executed_tx": "0x2bf7928e72e17a4657a3fd24e33907574881b63878ac04d0cfeaa5e7af880a5b" + } + } +}