-
Notifications
You must be signed in to change notification settings - Fork 52
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
sep/027: upgrade and re-initialize SystemConfig
across sepolia superchain
#418
base: main
Are you sure you want to change the base?
Changes from 52 commits
e5623ea
14500b8
9c83d58
cc782b3
dcd607c
c04293c
eb21f18
4014438
fcda94c
d130513
ef18399
35b4718
1355535
bb163d9
0b39283
85aac3a
ca3699e
7b7f0d1
80aa1cc
7e0c7fe
127d370
6786304
1ccf1b6
e0364ba
b1ef291
6c2961f
e568b3a
35c68f8
94a0e19
5098753
ab72af4
ddad3df
3d0999f
0b4dbee
8a770be
1ce96af
7d05ab9
7f5ac68
2cd5a75
58bc135
5253651
0f0c539
ece1fe9
dd88bab
deac638
ce792fc
9ffc1a6
d2162ee
4892a5c
06f91d1
566477e
497007f
e843ff4
7c2a9c8
a44a491
556d1d5
cd7ec86
a14b6a3
1389e43
1a12121
ce9614d
89e4726
ef7ccef
c5da1ab
c904f92
1e1fc2b
3eec9d8
31ab749
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. is the forge-std upgrade intended? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes. It pulls in |
+193 −0 | CONTRIBUTING.md | |
+17 −1 | README.md | |
+1 −1 | package.json | |
+12 −1 | scripts/vm.py | |
+14 −1 | src/StdChains.sol | |
+5 −5 | src/StdCheats.sol | |
+18 −3 | src/StdInvariant.sol | |
+104 −0 | src/StdJson.sol | |
+1 −1 | src/StdStorage.sol | |
+104 −0 | src/StdToml.sol | |
+581 −74 | src/Vm.sol | |
+635 −608 | src/console.sol | |
+1 −1,555 | src/console2.sol | |
+2 −2 | src/interfaces/IERC4626.sol | |
+1 −5 | src/mocks/MockERC721.sol | |
+693 −4 | src/safeconsole.sol | |
+1 −1 | test/StdAssertions.t.sol | |
+21 −15 | test/StdChains.t.sol | |
+10 −10 | test/StdCheats.t.sol | |
+12 −12 | test/StdError.t.sol | |
+1 −1 | test/StdJson.t.sol | |
+4 −14 | test/StdMath.t.sol | |
+13 −5 | test/StdStorage.t.sol | |
+1 −1 | test/StdStyle.t.sol | |
+1 −1 | test/StdToml.t.sol | |
+12 −12 | test/StdUtils.t.sol | |
+9 −6 | test/Vm.t.sol |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,187 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// SPDX-License-Identifier: MIT | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pragma solidity ^0.8.15; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import {console2 as console} from "forge-std/console2.sol"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import {LibString} from "solady/utils/LibString.sol"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import {ISystemConfig} from "./ISystemConfig.sol"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import {IResourceMetering} from "./IResourceMetering.sol"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import {SuperchainRegistry} from "script/verification/Verification.s.sol"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// HoloceneSystemConfigUpgrade is a contract that can be used to verify the Holocene upgrade of the SystemConfig contract. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// The upgrade paths supported are: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// 1.12.0 -> 2.3.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// 2.2.0 -> 2.3.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// 2.3.0 -> 2.3.0 (this case covers where the SystemConfig contract is already at the target version but was upgraded incorrectly) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// The verification checks that the following storage values are properly modified if appropriate: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// - scalar (may be migrated to a different encoding version) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// - basefeeScalar (new storage variable, needs to be set in a way which is consistent with the previous scalar) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// - blobbasefeeScalar (new storage variable, needs to be set in a way which is consistent with the previous scalar) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// - gasPayingToken (new storage variable, needs to be set to a magic value representing ETH) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// - disputeGameFactory (does not exist @ 1.12.0, needs to be set to zero address for changes on this upgrade path) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// It also verified that remaining storage variables are unchanged. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
contract HoloceneSystemConfigUpgrade is SuperchainRegistry { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
using LibString for string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address public systemConfigAddress; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ISystemConfig sysCfg; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Storage variables which exist in the existing and target | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// SystemConfig contract versions irrespective of upgrade path, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// and which should be preserved: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
struct BaseSysCfgVars { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address owner; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bytes32 batcherHash; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uint256 gasLimit; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address unsafeBlockSigner; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
IResourceMetering.ResourceConfig resourceConfig; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address batchInbox; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address l1CrossDomainMessenger; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address l1StandardBridge; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address l1ERC721Bridge; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address optimismPortal; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address optimismMintableERC20Factory; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
BaseSysCfgVars previous; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Values which may change during the upgrade, depending on the chain:: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uint256 previousScalar; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// The target value for the DisputeGameFactory address, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// this getter does not exist in the SystemConfig contract @ 1.12.0: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address targetDGF; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Target values for gasPayingToken and its decimals. This should represent ETH | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// on all upgrade paths: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address constant targetGasPayingToken = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uint8 constant targetDecimals = 18; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// The target version of the SystemConfig contract, read from the SCR @ specified release: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
string targetVersion; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// The constructor caches some information from the SCR and from the existing SystemConfig contract | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
geoknee marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// before the upgrade is executed. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
constructor(string memory _l1ChainName, string memory _l2ChainName, string memory _release) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SuperchainRegistry(_l1ChainName, _l2ChainName, _release) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sebastianst marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
systemConfigAddress = proxies.SystemConfig; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sysCfg = ISystemConfig(proxies.SystemConfig); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// cache the values of the SystemConfig contract before the upgrade | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
previous = getBaseSysCfgVars(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
previousScalar = sysCfg.scalar(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Read target version from SCR @ specified release | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
targetVersion = standardVersions.SystemConfig.version; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (sysCfg.version().eq("2.3.0")) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Supported initial version | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
targetDGF = sysCfg.disputeGameFactory(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else if (sysCfg.version().eq("2.2.0")) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Supported initial version | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
targetDGF = sysCfg.disputeGameFactory(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. could merge them
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else if (sysCfg.version().eq("1.12.0")) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Supported initial version | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
targetDGF = address(0); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
revert("unsupported SystemConfig version"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/// @notice Public function that must be called by the verification script. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function checkSystemConfigUpgrade() public view { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sebastianst marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
checkTargetVersion(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
checkScalar(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
checkDGF(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
checkGasPayingToken(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
checkBaseSysCfgVars(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function getCodeExceptions() public view returns (address[] memory exceptions) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uint256 len = block.chainid == 1 ? 3 : 4; // Mainnet doesn't need owner exception. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
exceptions = new address[](len); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uint256 i = 0; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (block.chainid != 1) exceptions[i++] = previous.owner; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
exceptions[i++] = address(uint160(uint256((previous.batcherHash)))); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
exceptions[i++] = previous.unsafeBlockSigner; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
exceptions[i++] = previous.batchInbox; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+95
to
+103
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. A better pattern with the verification framework is to make the contract also a
Suggested change
then call function getAllowedStorageAccess() internal view override returns (address[] memory) {
return allowedStorageAccess;
}
function getCodeExceptions() internal view override returns (address[] memory) {
return codeExceptions;
} see for example the check script for task eth/022. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. OK I realize you need to collect all those code exceptions from multiple instances. Still you could inherit the
Suggested change
this way, if this check contract is directly used in a task that only updates a single SystemConfig via inheriting this contract, it automatically has all the right code exceptions set. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not sure this will work for my multi chain task though? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I tried it, and it doesn't work -- because my top level script doesn't inherit the base validation script (it deploys multiple copies of it). That's why I thought I need to actually pass the values back from the children to the parent explicitly. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. My proposal still gives you that. It just has two advantages
Note that my proposal gives you the exact same To clarify further, of course you still need to explicitly call |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Checks semver of SystemConfig is correct after the upgrade | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function checkTargetVersion() internal view { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
require( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
keccak256(abi.encode(getSysCfgVersion())) == keccak256(abi.encode(targetVersion)), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"system-config-050: targetVersion" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
console.log("confirmed SystemConfig upgraded to version", targetVersion); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Checks scalar, basefeeScalar, blobbasefeeScalar are set consistently: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function checkScalar() internal view { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
geoknee marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uint256 reencodedScalar = | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(uint256(0x01) << 248) | (uint256(sysCfg.blobbasefeeScalar()) << 32) | sysCfg.basefeeScalar(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
console.log( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"checking baseFeeScalar and blobbaseFeeScalar ", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
LibString.toString(sysCfg.basefeeScalar()), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
LibString.toString(sysCfg.blobbasefeeScalar()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// If the scalar version (i.e. the most significant bit of the scalar) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// is 1, we expect it to be unchanged during the upgrade. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uint8(previousScalar >> 248) == 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
geoknee marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
require(reencodedScalar == previousScalar, "scalar-100 scalar mismatch"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Otherwise, if the scalar version is 0, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// and the blobbasefeeScalar is 0, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// the upgrade will migrate the scalar version to 1 and preserve | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// everything else. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// See https://specs.optimism.io/protocol/system-config.html?highlight=ecotone%20scalar#ecotone-scalar-overhead-uint256uint256-change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
require(previousScalar >> 248 == 0, "scalar-101 previous scalar version != 0 or 1"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
require(reencodedScalar >> 248 == 1, "scalar-102 reenconded scalar version != 1"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
require(sysCfg.blobbasefeeScalar() == uint32(0), "scalar-103 blobbasefeeScalar !=0"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
require(reencodedScalar << 8 == previousScalar << 8, "scalar-104 scalar mismatch"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Two comments on this:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Looks like this is not working indeed, i tried with the mask There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fixed this here. In fact what I was trying to do was compare the scalars without the scalar version (first byte). 556d1d5 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes that's right. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Check that basefeeScalar and blobbasefeeScalar are correct by re-encoding them and comparing to the new scalar value. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
require(sysCfg.scalar() == reencodedScalar, "scalar-105"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Checks the disputeGameFactory address is set correctly after the upgrade | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function checkDGF() internal view { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
require(sysCfg.disputeGameFactory() == targetDGF, "scalar-106"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Checks gasPayingToken and its decimals are set correctly after the upgrade | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function checkGasPayingToken() internal view { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(address t, uint8 d) = sysCfg.gasPayingToken(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
require(t == targetGasPayingToken, "scalar-107"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
require(d == targetDecimals, "scalar-108"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// CHecsk the remaining storage variables are unchanged after the upgrade | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function checkBaseSysCfgVars() internal view { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Check remaining storage variables didn't change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
require(keccak256(abi.encode(getBaseSysCfgVars())) == keccak256(abi.encode(previous)), "system-config-100"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sebastianst marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Reads | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function getSysCfgVersion() internal view returns (string memory) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return sysCfg.version(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sebastianst marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function getBaseSysCfgVars() internal view returns (BaseSysCfgVars memory) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return BaseSysCfgVars({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
owner: sysCfg.owner(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
batcherHash: sysCfg.batcherHash(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gasLimit: sysCfg.gasLimit(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
unsafeBlockSigner: sysCfg.unsafeBlockSigner(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
resourceConfig: sysCfg.resourceConfig(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
batchInbox: sysCfg.batchInbox(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
l1CrossDomainMessenger: sysCfg.l1CrossDomainMessenger(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
l1StandardBridge: sysCfg.l1StandardBridge(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
l1ERC721Bridge: sysCfg.l1ERC721Bridge(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
optimismPortal: sysCfg.optimismPortal(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
optimismMintableERC20Factory: sysCfg.optimismMintableERC20Factory() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity ^0.8.0; | ||
|
||
interface IResourceMetering { | ||
struct ResourceParams { | ||
uint128 prevBaseFee; | ||
uint64 prevBoughtGas; | ||
uint64 prevBlockNum; | ||
} | ||
|
||
struct ResourceConfig { | ||
uint32 maxResourceLimit; | ||
uint8 elasticityMultiplier; | ||
uint8 baseFeeMaxChangeDenominator; | ||
uint32 minimumBaseFee; | ||
uint32 systemTxMaxGas; | ||
uint128 maximumBaseFee; | ||
} | ||
|
||
error OutOfGas(); | ||
|
||
event Initialized(uint8 version); | ||
|
||
function params() external view returns (uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum); // nosemgrep | ||
|
||
function __constructor__() external; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
NIT: curious to know if this is required? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity ^0.8.0; | ||
|
||
import {IResourceMetering} from "./IResourceMetering.sol"; | ||
|
||
/// @notice This interface corresponds to the Custom Gas Token version of the SystemConfig contract. | ||
interface ISystemConfig { | ||
enum UpdateType { | ||
BATCHER, | ||
FEE_SCALARS, | ||
GAS_LIMIT, | ||
UNSAFE_BLOCK_SIGNER, | ||
EIP_1559_PARAMS | ||
} | ||
|
||
struct Addresses { | ||
address l1CrossDomainMessenger; | ||
address l1ERC721Bridge; | ||
address l1StandardBridge; | ||
address disputeGameFactory; | ||
address optimismPortal; | ||
address optimismMintableERC20Factory; | ||
address gasPayingToken; | ||
} | ||
|
||
event ConfigUpdate(uint256 indexed version, UpdateType indexed updateType, bytes data); | ||
event Initialized(uint8 version); | ||
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); | ||
|
||
function BATCH_INBOX_SLOT() external view returns (bytes32); | ||
function DISPUTE_GAME_FACTORY_SLOT() external view returns (bytes32); | ||
function L1_CROSS_DOMAIN_MESSENGER_SLOT() external view returns (bytes32); | ||
function L1_ERC_721_BRIDGE_SLOT() external view returns (bytes32); | ||
function L1_STANDARD_BRIDGE_SLOT() external view returns (bytes32); | ||
function OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT() external view returns (bytes32); | ||
function OPTIMISM_PORTAL_SLOT() external view returns (bytes32); | ||
function START_BLOCK_SLOT() external view returns (bytes32); | ||
function UNSAFE_BLOCK_SIGNER_SLOT() external view returns (bytes32); | ||
function VERSION() external view returns (uint256); | ||
function basefeeScalar() external view returns (uint32); | ||
function batchInbox() external view returns (address addr_); | ||
function batcherHash() external view returns (bytes32); | ||
function blobbasefeeScalar() external view returns (uint32); | ||
function disputeGameFactory() external view returns (address addr_); | ||
function gasLimit() external view returns (uint64); | ||
function eip1559Denominator() external view returns (uint32); | ||
function eip1559Elasticity() external view returns (uint32); | ||
function gasPayingToken() external view returns (address addr_, uint8 decimals_); | ||
function gasPayingTokenName() external view returns (string memory name_); | ||
function gasPayingTokenSymbol() external view returns (string memory symbol_); | ||
function initialize( | ||
address _owner, | ||
uint32 _basefeeScalar, | ||
uint32 _blobbasefeeScalar, | ||
bytes32 _batcherHash, | ||
uint64 _gasLimit, | ||
address _unsafeBlockSigner, | ||
IResourceMetering.ResourceConfig memory _config, | ||
address _batchInbox, | ||
Addresses memory _addresses | ||
) external; | ||
function isCustomGasToken() external view returns (bool); | ||
function l1CrossDomainMessenger() external view returns (address addr_); | ||
function l1ERC721Bridge() external view returns (address addr_); | ||
function l1StandardBridge() external view returns (address addr_); | ||
function maximumGasLimit() external pure returns (uint64); | ||
function minimumGasLimit() external view returns (uint64); | ||
function optimismMintableERC20Factory() external view returns (address addr_); | ||
function optimismPortal() external view returns (address addr_); | ||
function overhead() external view returns (uint256); | ||
function owner() external view returns (address); | ||
function renounceOwnership() external; | ||
function resourceConfig() external view returns (IResourceMetering.ResourceConfig memory); | ||
function scalar() external view returns (uint256); | ||
function setBatcherHash(bytes32 _batcherHash) external; | ||
function setGasConfig(uint256 _overhead, uint256 _scalar) external; | ||
function setGasConfigEcotone(uint32 _basefeeScalar, uint32 _blobbasefeeScalar) external; | ||
function setGasLimit(uint64 _gasLimit) external; | ||
function setUnsafeBlockSigner(address _unsafeBlockSigner) external; | ||
function setEIP1559Params(uint32 _denominator, uint32 _elasticity) external; | ||
function startBlock() external view returns (uint256 startBlock_); | ||
function transferOwnership(address newOwner) external; // nosemgrep | ||
function unsafeBlockSigner() external view returns (address addr_); | ||
function version() external pure returns (string memory); | ||
|
||
function __constructor__() external; | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,8 +3,9 @@ pragma solidity ^0.8.15; | |
|
||
import {LibString} from "solady/utils/LibString.sol"; | ||
import {Types} from "@eth-optimism-bedrock/scripts/Types.sol"; | ||
import {CommonBase} from "forge-std/Base.sol"; | ||
import {ScriptBase} from "forge-std/Base.sol"; | ||
import {stdToml} from "forge-std/StdToml.sol"; | ||
import {console2 as console} from "forge-std/console2.sol"; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this is already happening on line 4? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good catch, removed. |
||
|
||
// TODO(#427): Proposing to just merge this contract into JsonTxBuilderBase. | ||
contract VerificationBase { | ||
|
@@ -20,7 +21,7 @@ contract VerificationBase { | |
} | ||
} | ||
|
||
contract SuperchainRegistry is CommonBase { | ||
contract SuperchainRegistry is ScriptBase { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. what's the difference? why don't we want or need this for all other script contacts? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think I may be able to revert this. I had it previously because it exposed There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I reverted this change in the end. |
||
using LibString for string; | ||
|
||
struct StandardVersion { | ||
|
@@ -100,12 +101,15 @@ contract SuperchainRegistry is CommonBase { | |
proxies.L1CrossDomainMessenger = stdToml.readAddress(toml, "$.addresses.L1CrossDomainMessengerProxy"); | ||
proxies.L1StandardBridge = stdToml.readAddress(toml, "$.addresses.L1StandardBridgeProxy"); | ||
proxies.SystemConfig = stdToml.readAddress(toml, "$.addresses.SystemConfigProxy"); | ||
proxies.AnchorStateRegistry = stdToml.readAddress(toml, "$.addresses.AnchorStateRegistryProxy"); | ||
proxies.DisputeGameFactory = stdToml.readAddress(toml, "$.addresses.DisputeGameFactoryProxy"); | ||
|
||
// Not all chains have the following values specified in the registry, so we will | ||
// set them to the zero address if they are not found. | ||
proxies.AnchorStateRegistry = stdToml.readAddressOr(toml, "$.addresses.AnchorStateRegistryProxy", address(0)); | ||
proxies.DisputeGameFactory = stdToml.readAddressOr(toml, "$.addresses.DisputeGameFactoryProxy", address(0)); | ||
chainConfig.unsafeBlockSigner = stdToml.readAddressOr(toml, "$.addresses.UnsafeBlockSigner", address(0)); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd still put this line back to where it was, so it's grouped with the other chainConfig setters as before. |
||
|
||
chainConfig.chainId = stdToml.readUint(toml, "$.chain_id"); | ||
chainConfig.systemConfigOwner = stdToml.readAddress(toml, "$.addresses.SystemConfigOwner"); | ||
chainConfig.unsafeBlockSigner = stdToml.readAddress(toml, "$.addresses.UnsafeBlockSigner"); | ||
chainConfig.batchSubmitter = stdToml.readAddress(toml, "$.addresses.BatchSubmitter"); | ||
chainConfig.batchInbox = stdToml.readAddress(toml, "$.batch_inbox_addr"); | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
ETH_RPC_URL="https://ethereum-sepolia.publicnode.com" | ||
COUNCIL_SAFE=0xf64bc17485f0B4Ea5F06A96514182FC4cB561977 | ||
FOUNDATION_SAFE=0xDEe57160aAfCF04c34C887B5962D0a69676d3C8B | ||
OWNER_SAFE=0x1Eb2fFc903729a0F03966B917003800b145F56E2 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
forge script
): script broadcast dry runs should log transaction info to the terminal foundry-rs/foundry#9648)