Skip to content

Conversation

@niran
Copy link
Contributor

@niran niran commented Jan 28, 2026

Updates the minBaseFee parameter from 1,000,000 wei to 2,000,000 wei (2x increase).

Parameters

Parameter From To
minBaseFee 1,000,000 wei 2,000,000 wei

Validation

Updates storage slot:

  • 0x6c: minBaseFee from 1,000,000 (0xf4240) to 2,000,000 (0x1e8480)

Includes rollback task that reverts to previous value if needed.

Diff from previous min base fee task

--- a/mainnet/2026-01-20-update-basefee-da-footprint/script/SetMinBaseFeeAndDAFootprint.s.sol
+++ b/mainnet/2026-01-28-update-min-base-fee/script/SetMinBaseFee.s.sol
@@ -10,18 +10,14 @@
 interface ISystemConfig {
     function minBaseFee() external view returns (uint64);
     function setMinBaseFee(uint64 _minBaseFee) external;
-    function daFootprintGasScalar() external view returns (uint16);
-    function setDAFootprintGasScalar(uint16 _daFootprintGasScalar) external;
 }
 
-contract SetMinBaseFeeAndDAFootprintScript is MultisigScript {
+contract SetMinBaseFeeScript is MultisigScript {
     address internal immutable OWNER_SAFE;
     address internal immutable SYSTEM_CONFIG;
 
     uint64 internal immutable MIN_BASE_FEE;
     uint64 internal immutable NEW_MIN_BASE_FEE;
-    uint16 internal immutable DA_FOOTPRINT_GAS_SCALAR;
-    uint16 internal immutable NEW_DA_FOOTPRINT_GAS_SCALAR;
 
     constructor() {
         OWNER_SAFE = vm.envAddress("OWNER_SAFE");
@@ -29,47 +25,20 @@
 
         MIN_BASE_FEE = uint64(vm.envUint("OLD_MIN_BASE_FEE"));
         NEW_MIN_BASE_FEE = uint64(vm.envUint("NEW_MIN_BASE_FEE"));
-
-        DA_FOOTPRINT_GAS_SCALAR = uint16(vm.envUint("OLD_DA_FOOTPRINT_GAS_SCALAR"));
-        NEW_DA_FOOTPRINT_GAS_SCALAR = uint16(vm.envUint("NEW_DA_FOOTPRINT_GAS_SCALAR"));
     }
 
     function _postCheck(Vm.AccountAccess[] memory, Simulation.Payload memory) internal view override {
         vm.assertEq(ISystemConfig(SYSTEM_CONFIG).minBaseFee(), NEW_MIN_BASE_FEE, "Min base fee mismatch");
-        vm.assertEq(
-            ISystemConfig(SYSTEM_CONFIG).daFootprintGasScalar(),
-            NEW_DA_FOOTPRINT_GAS_SCALAR,
-            "DA Footprint Gas Scalar mismatch"
-        );
     }
 
     function _simulationOverrides() internal view override returns (Simulation.StateOverride[] memory _stateOverrides) {
-        if (
-            MIN_BASE_FEE \!= ISystemConfig(SYSTEM_CONFIG).minBaseFee()
-                || DA_FOOTPRINT_GAS_SCALAR \!= ISystemConfig(SYSTEM_CONFIG).daFootprintGasScalar()
-        ) {
+        if (MIN_BASE_FEE \!= ISystemConfig(SYSTEM_CONFIG).minBaseFee()) {
             // Override SystemConfig state to the expected "from" values so simulations succeeds even
             // when the chain already reflects the post-change values (during rollback simulation).
 
             Simulation.StateOverride[] memory stateOverrides = new Simulation.StateOverride[](1);
-            Simulation.StorageOverride[] memory storageOverrides = new Simulation.StorageOverride[](2);
+            Simulation.StorageOverride[] memory storageOverrides = new Simulation.StorageOverride[](1);
 
-            // Update DA Footprint Gas Scalar (slot 0x6a)
-            // Storage layout (low to high bits):
-            //   - eip1559Denominator (uint32): bits 0-31
-            //   - eip1559Elasticity (uint32): bits 32-63
-            //   - operatorFeeScalar (uint32): bits 64-95
-            //   - operatorFeeConstant (uint64): bits 96-159
-            //   - daFootprintGasScalar (uint16): bits 160-175
-            // Load existing slot to preserve other fields, then update daFootprintGasScalar.
-            bytes32 eip1559SlotKey = bytes32(uint256(0x6a));
-            uint256 existingEip1559Word = uint256(vm.load(SYSTEM_CONFIG, eip1559SlotKey));
-            // Mask to preserve bits 0-159 (everything except daFootprintGasScalar)
-            uint256 preserveMask = (1 << 160) - 1;
-            uint256 preservedFields = existingEip1559Word & preserveMask;
-            uint256 composedEip1559Word = (uint256(DA_FOOTPRINT_GAS_SCALAR) << 160) | preservedFields;
-            storageOverrides[0] = Simulation.StorageOverride({key: eip1559SlotKey, value: bytes32(composedEip1559Word)});
-
             // Update minBaseFee (slot 0x6c)
             // Storage layout (low to high bits):
             //   - superchainConfig (address): bits 0-159
@@ -78,7 +47,7 @@
             bytes32 minBaseFeeSlotKey = bytes32(uint256(0x6c));
             uint256 existingMinBaseFeeWord = uint256(vm.load(SYSTEM_CONFIG, minBaseFeeSlotKey));
             uint256 updatedMinBaseFeeWord = (existingMinBaseFeeWord & ((1 << 160) - 1)) | (uint256(MIN_BASE_FEE) << 160);
-            storageOverrides[1] = Simulation.StorageOverride({key: minBaseFeeSlotKey, value: bytes32(updatedMinBaseFeeWord)});
+            storageOverrides[0] = Simulation.StorageOverride({key: minBaseFeeSlotKey, value: bytes32(updatedMinBaseFeeWord)});
 
             stateOverrides[0] = Simulation.StateOverride({contractAddress: SYSTEM_CONFIG, overrides: storageOverrides});
             return stateOverrides;
@@ -86,18 +55,11 @@
     }
 
     function _buildCalls() internal view override returns (IMulticall3.Call3Value[] memory) {
-        IMulticall3.Call3Value[] memory calls = new IMulticall3.Call3Value[](2);
+        IMulticall3.Call3Value[] memory calls = new IMulticall3.Call3Value[](1);
 
         calls[0] = IMulticall3.Call3Value({
             target: SYSTEM_CONFIG,
             allowFailure: false,
-            callData: abi.encodeCall(ISystemConfig.setDAFootprintGasScalar, (NEW_DA_FOOTPRINT_GAS_SCALAR)),
-            value: 0
-        });
-
-        calls[1] = IMulticall3.Call3Value({
-            target: SYSTEM_CONFIG,
-            allowFailure: false,
             callData: abi.encodeCall(ISystemConfig.setMinBaseFee, (NEW_MIN_BASE_FEE)),
             value: 0
         });

Update min base fee from 1,000,000 wei to 2,000,000 wei on mainnet.
Includes rollback support.
@cb-heimdall
Copy link
Collaborator

cb-heimdall commented Jan 28, 2026

✅ Heimdall Review Status

Requirement Status More Info
Reviews 2/2
Denominator calculation
Show calculation
1 if user is bot 0
1 if user is external 0
2 if repo is sensitive 0
From .codeflow.yml 2
Additional review requirements
Show calculation
Max 0
0
From CODEOWNERS 0
Global minimum 0
Max 2
2
1 if commit is unverified 0
Sum 2

- Fix TODO placeholder in FACILITATOR.md
- Run forge fmt on SetMinBaseFee.s.sol
- Add descriptive messages for validation state overrides and changes
@niran niran merged commit bf470aa into main Jan 29, 2026
5 checks passed
@niran niran deleted the update-min-base-fee-2m branch January 29, 2026 19:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants