From 897bd9684fb8da6e594bf905633afd96720e2431 Mon Sep 17 00:00:00 2001 From: Maurelian Date: Thu, 3 Oct 2024 10:14:10 -0400 Subject: [PATCH 1/5] feat: Add reasons to checkOptimismPortal2 --- .../scripts/deploy/ChainAssertions.sol | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol b/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol index 9227dd9141b3..7cbd536fd86b 100644 --- a/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol +++ b/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol @@ -362,9 +362,9 @@ library ChainAssertions { internal view { - console.log("Running chain assertions on the OptimismPortal2"); - IOptimismPortal2 portal = IOptimismPortal2(payable(_contracts.OptimismPortal2)); + console.log("Running chain assertions on the OptimismPortal2 at %s", address(portal)); + require(address(portal) != address(0), "CHECK-OP2-10"); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(portal), _slot: 0, _offset: 0 }); @@ -375,21 +375,21 @@ library ChainAssertions { } if (_isProxy) { - require(address(portal.disputeGameFactory()) == _contracts.DisputeGameFactory); - require(address(portal.systemConfig()) == _contracts.SystemConfig); - require(portal.guardian() == guardian); - require(address(portal.superchainConfig()) == address(_contracts.SuperchainConfig)); - require(portal.paused() == ISuperchainConfig(_contracts.SuperchainConfig).paused()); - require(portal.l2Sender() == Constants.DEFAULT_L2_SENDER); + require(address(portal.disputeGameFactory()) == _contracts.DisputeGameFactory, "CHECK-OP2-20"); + require(address(portal.systemConfig()) == _contracts.SystemConfig, "CHECK-OP2-30"); + require(portal.guardian() == guardian, "CHECK-OP2-40"); + require(address(portal.superchainConfig()) == address(_contracts.SuperchainConfig), "CHECK-OP2-50"); + require(portal.paused() == ISuperchainConfig(_contracts.SuperchainConfig).paused(), "CHECK-OP2-60"); + require(portal.l2Sender() == Constants.DEFAULT_L2_SENDER, "CHECK-OP2-70"); } else { - require(address(portal.disputeGameFactory()) == address(0)); - require(address(portal.systemConfig()) == address(0)); - require(address(portal.superchainConfig()) == address(0)); - require(portal.l2Sender() == Constants.DEFAULT_L2_SENDER); + require(address(portal.disputeGameFactory()) == address(0), "CHECK-OP2-80"); + require(address(portal.systemConfig()) == address(0), "CHECK-OP2-90"); + require(address(portal.superchainConfig()) == address(0), "CHECK-OP2-100"); + require(portal.l2Sender() == Constants.DEFAULT_L2_SENDER, "CHECK-OP2-110"); } // This slot is the custom gas token _balance and this check ensures // that it stays unset for forwards compatibility with custom gas token. - require(vm.load(address(portal), bytes32(uint256(61))) == bytes32(0)); + require(vm.load(address(portal), bytes32(uint256(61))) == bytes32(0), "CHECK-OP2-120"); } /// @notice Asserts that the ProtocolVersions is setup correctly From 9e832b738650519e24c200affcf7573e8becaf5c Mon Sep 17 00:00:00 2001 From: Maurelian Date: Thu, 3 Oct 2024 10:21:01 -0400 Subject: [PATCH 2/5] feat: log if impl of proxy add more functions --- .../scripts/deploy/ChainAssertions.sol | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol b/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol index 7cbd536fd86b..84d03d13f656 100644 --- a/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol +++ b/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol @@ -363,7 +363,11 @@ library ChainAssertions { view { IOptimismPortal2 portal = IOptimismPortal2(payable(_contracts.OptimismPortal2)); - console.log("Running chain assertions on the OptimismPortal2 at %s", address(portal)); + console.log( + "Running chain assertions on the OptimismPortal2 %s at %s", + _isProxy ? "proxy" : "implementation", + address(portal) + ); require(address(portal) != address(0), "CHECK-OP2-10"); // Check that the contract is initialized @@ -401,20 +405,25 @@ library ChainAssertions { internal view { - console.log("Running chain assertions on the ProtocolVersions"); IProtocolVersions versions = IProtocolVersions(_contracts.ProtocolVersions); + console.log( + "Running chain assertions on the ProtocolVersions %s at %s", + _isProxy ? "proxy" : "implementation", + address(versions) + ); + require(address(versions) != address(0), "CHECK-PV-10"); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(versions), _slot: 0, _offset: 0 }); if (_isProxy) { - require(versions.owner() == _cfg.finalSystemOwner()); - require(ProtocolVersion.unwrap(versions.required()) == _cfg.requiredProtocolVersion()); - require(ProtocolVersion.unwrap(versions.recommended()) == _cfg.recommendedProtocolVersion()); + require(versions.owner() == _cfg.finalSystemOwner(), "CHECK-PV-20"); + require(ProtocolVersion.unwrap(versions.required()) == _cfg.requiredProtocolVersion(), "CHECK-PV-30"); + require(ProtocolVersion.unwrap(versions.recommended()) == _cfg.recommendedProtocolVersion(), "CHECK-PV-40"); } else { - require(versions.owner() == address(0xdead)); - require(ProtocolVersion.unwrap(versions.required()) == 0); - require(ProtocolVersion.unwrap(versions.recommended()) == 0); + require(versions.owner() == address(0xdead), "CHECK-PV-50"); + require(ProtocolVersion.unwrap(versions.required()) == 0, "CHECK-PV-60"); + require(ProtocolVersion.unwrap(versions.recommended()) == 0, "CHECK-PV-70"); } } @@ -428,18 +437,23 @@ library ChainAssertions { internal view { - console.log("Running chain assertions on the SuperchainConfig"); ISuperchainConfig superchainConfig = ISuperchainConfig(_contracts.SuperchainConfig); + console.log( + "Running chain assertions on the SuperchainConfig %s at %s", + _isProxy ? "proxy" : "implementation", + address(superchainConfig) + ); + require(address(superchainConfig) != address(0), "CHECK-SC-10"); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(superchainConfig), _slot: 0, _offset: 0 }); if (_isProxy) { - require(superchainConfig.guardian() == _cfg.superchainConfigGuardian()); - require(superchainConfig.paused() == _isPaused); + require(superchainConfig.guardian() == _cfg.superchainConfigGuardian(), "CHECK-SC-20"); + require(superchainConfig.paused() == _isPaused, "CHECK-SC-30"); } else { - require(superchainConfig.guardian() == address(0)); - require(superchainConfig.paused() == false); + require(superchainConfig.guardian() == address(0), "CHECK-SC-40"); + require(superchainConfig.paused() == false, "CHECK-SC-50"); } } From 2016ed302678c6f18df48aebd90456b88add12b4 Mon Sep 17 00:00:00 2001 From: Maurelian Date: Thu, 3 Oct 2024 10:38:01 -0400 Subject: [PATCH 3/5] feat: More ChainAssertions reason strings --- .../scripts/deploy/ChainAssertions.sol | 152 +++++++++++------- 1 file changed, 90 insertions(+), 62 deletions(-) diff --git a/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol b/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol index 84d03d13f656..bba3526c58de 100644 --- a/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol +++ b/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol @@ -198,19 +198,22 @@ library ChainAssertions { internal view { - console.log("Running chain assertions on the DelayedWETH"); IDelayedWETH weth = IDelayedWETH(payable(_contracts.DelayedWETH)); + console.log( + "Running chain assertions on the DelayedWETH %s at %s", _isProxy ? "proxy" : "implementation", address(weth) + ); + require(address(weth) != address(0), "CHECK-DWETH-10"); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(weth), _slot: 0, _offset: 0 }); if (_isProxy) { - require(weth.owner() == _expectedOwner); - require(weth.delay() == _cfg.faultGameWithdrawalDelay()); - require(weth.config() == ISuperchainConfig(_contracts.SuperchainConfig)); + require(weth.owner() == _expectedOwner, "CHECK-DWETH-20"); + require(weth.delay() == _cfg.faultGameWithdrawalDelay(), "CHECK-DWETH-30"); + require(weth.config() == ISuperchainConfig(_contracts.SuperchainConfig), "CHECK-DWETH-40"); } else { - require(weth.owner() == _expectedOwner); - require(weth.delay() == _cfg.faultGameWithdrawalDelay()); + require(weth.owner() == _expectedOwner, "CHECK-DWETH-50"); + require(weth.delay() == _cfg.faultGameWithdrawalDelay(), "CHECK-DWETH-60"); } } @@ -224,19 +227,24 @@ library ChainAssertions { internal view { - console.log("Running chain assertions on the permissioned DelayedWETH"); IDelayedWETH weth = IDelayedWETH(payable(_contracts.PermissionedDelayedWETH)); + console.log( + "Running chain assertions on the PermissionedDelayedWETH %s at %s", + _isProxy ? "proxy" : "implementation", + address(weth) + ); + require(address(weth) != address(0), "CHECK-PDWETH-10"); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(weth), _slot: 0, _offset: 0 }); if (_isProxy) { - require(weth.owner() == _expectedOwner); - require(weth.delay() == _cfg.faultGameWithdrawalDelay()); - require(weth.config() == ISuperchainConfig(_contracts.SuperchainConfig)); + require(weth.owner() == _expectedOwner, "CHECK-PDWETH-20"); + require(weth.delay() == _cfg.faultGameWithdrawalDelay(), "CHECK-PDWETH-30"); + require(weth.config() == ISuperchainConfig(_contracts.SuperchainConfig), "CHECK-PDWETH-40"); } else { - require(weth.owner() == _expectedOwner); - require(weth.delay() == _cfg.faultGameWithdrawalDelay()); + require(weth.owner() == _expectedOwner, "CHECK-PDWETH-50"); + require(weth.delay() == _cfg.faultGameWithdrawalDelay(), "CHECK-PDWETH-60"); } } @@ -250,55 +258,65 @@ library ChainAssertions { internal view { - console.log("Running chain assertions on the L2OutputOracle"); IL2OutputOracle oracle = IL2OutputOracle(_contracts.L2OutputOracle); + console.log( + "Running chain assertions on the L2OutputOracle %s at %s", + _isProxy ? "proxy" : "implementation", + address(oracle) + ); + require(address(oracle) != address(0), "CHECK-L2OO-10"); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(oracle), _slot: 0, _offset: 0 }); if (_isProxy) { - require(oracle.SUBMISSION_INTERVAL() == _cfg.l2OutputOracleSubmissionInterval()); - require(oracle.submissionInterval() == _cfg.l2OutputOracleSubmissionInterval()); - require(oracle.L2_BLOCK_TIME() == _cfg.l2BlockTime()); - require(oracle.l2BlockTime() == _cfg.l2BlockTime()); - require(oracle.PROPOSER() == _cfg.l2OutputOracleProposer()); - require(oracle.proposer() == _cfg.l2OutputOracleProposer()); - require(oracle.CHALLENGER() == _cfg.l2OutputOracleChallenger()); - require(oracle.challenger() == _cfg.l2OutputOracleChallenger()); - require(oracle.FINALIZATION_PERIOD_SECONDS() == _cfg.finalizationPeriodSeconds()); - require(oracle.finalizationPeriodSeconds() == _cfg.finalizationPeriodSeconds()); - require(oracle.startingBlockNumber() == _cfg.l2OutputOracleStartingBlockNumber()); - require(oracle.startingTimestamp() == _l2OutputOracleStartingTimestamp); + require(oracle.SUBMISSION_INTERVAL() == _cfg.l2OutputOracleSubmissionInterval(), "CHECK-L2OO-20"); + require(oracle.submissionInterval() == _cfg.l2OutputOracleSubmissionInterval(), "CHECK-L2OO-30"); + require(oracle.L2_BLOCK_TIME() == _cfg.l2BlockTime(), "CHECK-L2OO-40"); + require(oracle.l2BlockTime() == _cfg.l2BlockTime(), "CHECK-L2OO-50"); + require(oracle.PROPOSER() == _cfg.l2OutputOracleProposer(), "CHECK-L2OO-60"); + require(oracle.proposer() == _cfg.l2OutputOracleProposer(), "CHECK-L2OO-70"); + require(oracle.CHALLENGER() == _cfg.l2OutputOracleChallenger(), "CHECK-L2OO-80"); + require(oracle.challenger() == _cfg.l2OutputOracleChallenger(), "CHECK-L2OO-90"); + require(oracle.FINALIZATION_PERIOD_SECONDS() == _cfg.finalizationPeriodSeconds(), "CHECK-L2OO-100"); + require(oracle.finalizationPeriodSeconds() == _cfg.finalizationPeriodSeconds(), "CHECK-L2OO-110"); + require(oracle.startingBlockNumber() == _cfg.l2OutputOracleStartingBlockNumber(), "CHECK-L2OO-120"); + require(oracle.startingTimestamp() == _l2OutputOracleStartingTimestamp, "CHECK-L2OO-130"); } else { - require(oracle.SUBMISSION_INTERVAL() == 1); - require(oracle.submissionInterval() == 1); - require(oracle.L2_BLOCK_TIME() == 1); - require(oracle.l2BlockTime() == 1); - require(oracle.PROPOSER() == address(0)); - require(oracle.proposer() == address(0)); - require(oracle.CHALLENGER() == address(0)); - require(oracle.challenger() == address(0)); - require(oracle.FINALIZATION_PERIOD_SECONDS() == 0); - require(oracle.finalizationPeriodSeconds() == 0); - require(oracle.startingBlockNumber() == 0); - require(oracle.startingTimestamp() == 0); + require(oracle.SUBMISSION_INTERVAL() == 1, "CHECK-L2OO-140"); + require(oracle.submissionInterval() == 1, "CHECK-L2OO-150"); + require(oracle.L2_BLOCK_TIME() == 1, "CHECK-L2OO-160"); + require(oracle.l2BlockTime() == 1, "CHECK-L2OO-170"); + require(oracle.PROPOSER() == address(0), "CHECK-L2OO-180"); + require(oracle.proposer() == address(0), "CHECK-L2OO-190"); + require(oracle.CHALLENGER() == address(0), "CHECK-L2OO-200"); + require(oracle.challenger() == address(0), "CHECK-L2OO-210"); + require(oracle.FINALIZATION_PERIOD_SECONDS() == 0, "CHECK-L2OO-220"); + require(oracle.finalizationPeriodSeconds() == 0, "CHECK-L2OO-230"); + require(oracle.startingBlockNumber() == 0, "CHECK-L2OO-240"); + require(oracle.startingTimestamp() == 0, "CHECK-L2OO-250"); } } /// @notice Asserts that the OptimismMintableERC20Factory is setup correctly function checkOptimismMintableERC20Factory(Types.ContractSet memory _contracts, bool _isProxy) internal view { - console.log("Running chain assertions on the OptimismMintableERC20Factory"); IOptimismMintableERC20Factory factory = IOptimismMintableERC20Factory(_contracts.OptimismMintableERC20Factory); + console.log( + "Running chain assertions on the OptimismMintableERC20Factory %s at %s", + _isProxy ? "proxy" : "implementation", + address(factory) + ); + require(address(factory) != address(0), "CHECK-MERC20F-10"); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(factory), _slot: 0, _offset: 0 }); if (_isProxy) { - require(factory.BRIDGE() == _contracts.L1StandardBridge); - require(factory.bridge() == _contracts.L1StandardBridge); + require(factory.BRIDGE() == _contracts.L1StandardBridge, "CHECK-MERC20F-10"); + require(factory.bridge() == _contracts.L1StandardBridge, "CHECK-MERC20F-20"); } else { - require(factory.BRIDGE() == address(0)); - require(factory.bridge() == address(0)); + require(factory.BRIDGE() == address(0), "CHECK-MERC20F-30"); + require(factory.bridge() == address(0), "CHECK-MERC20F-40"); } } @@ -306,29 +324,39 @@ library ChainAssertions { function checkL1ERC721Bridge(Types.ContractSet memory _contracts, bool _isProxy) internal view { console.log("Running chain assertions on the L1ERC721Bridge"); IL1ERC721Bridge bridge = IL1ERC721Bridge(_contracts.L1ERC721Bridge); + console.log( + "Running chain assertions on the L1ERC721Bridge %s at %s", + _isProxy ? "proxy" : "implementation", + address(bridge) + ); + require(address(bridge) != address(0), "CHECK-L1ERC721B-10"); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(bridge), _slot: 0, _offset: 0 }); - require(address(bridge.OTHER_BRIDGE()) == Predeploys.L2_ERC721_BRIDGE); - require(address(bridge.otherBridge()) == Predeploys.L2_ERC721_BRIDGE); + require(address(bridge.OTHER_BRIDGE()) == Predeploys.L2_ERC721_BRIDGE, "CHECK-L1ERC721B-10"); + require(address(bridge.otherBridge()) == Predeploys.L2_ERC721_BRIDGE, "CHECK-L1ERC721B-20"); if (_isProxy) { - require(address(bridge.MESSENGER()) == _contracts.L1CrossDomainMessenger); - require(address(bridge.messenger()) == _contracts.L1CrossDomainMessenger); - require(address(bridge.superchainConfig()) == _contracts.SuperchainConfig); + require(address(bridge.MESSENGER()) == _contracts.L1CrossDomainMessenger, "CHECK-L1ERC721B-30"); + require(address(bridge.messenger()) == _contracts.L1CrossDomainMessenger, "CHECK-L1ERC721B-40"); + require(address(bridge.superchainConfig()) == _contracts.SuperchainConfig, "CHECK-L1ERC721B-50"); } else { - require(address(bridge.MESSENGER()) == address(0)); - require(address(bridge.messenger()) == address(0)); - require(address(bridge.superchainConfig()) == address(0)); + require(address(bridge.MESSENGER()) == address(0), "CHECK-L1ERC721B-60"); + require(address(bridge.messenger()) == address(0), "CHECK-L1ERC721B-70"); + require(address(bridge.superchainConfig()) == address(0), "CHECK-L1ERC721B-80"); } } /// @notice Asserts the OptimismPortal is setup correctly function checkOptimismPortal(Types.ContractSet memory _contracts, DeployConfig _cfg, bool _isProxy) internal view { - console.log("Running chain assertions on the OptimismPortal"); - IOptimismPortal portal = IOptimismPortal(payable(_contracts.OptimismPortal)); + console.log( + "Running chain assertions on the OptimismPortal %s at %s", + _isProxy ? "proxy" : "implementation", + address(portal) + ); + require(address(portal) != address(0), "CHECK-OP-10"); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(portal), _slot: 0, _offset: 0 }); @@ -339,17 +367,17 @@ library ChainAssertions { } if (_isProxy) { - require(address(portal.l2Oracle()) == _contracts.L2OutputOracle); - require(address(portal.systemConfig()) == _contracts.SystemConfig); - require(portal.guardian() == guardian); - require(address(portal.superchainConfig()) == address(_contracts.SuperchainConfig)); - require(portal.paused() == ISuperchainConfig(_contracts.SuperchainConfig).paused()); - require(portal.l2Sender() == Constants.DEFAULT_L2_SENDER); + require(address(portal.l2Oracle()) == _contracts.L2OutputOracle, "CHECK-OP-20"); + require(address(portal.systemConfig()) == _contracts.SystemConfig, "CHECK-OP-30"); + require(portal.guardian() == guardian, "CHECK-OP-40"); + require(address(portal.superchainConfig()) == address(_contracts.SuperchainConfig), "CHECK-OP-50"); + require(portal.paused() == ISuperchainConfig(_contracts.SuperchainConfig).paused(), "CHECK-OP-60"); + require(portal.l2Sender() == Constants.DEFAULT_L2_SENDER, "CHECK-OP-70"); } else { - require(address(portal.l2Oracle()) == address(0)); - require(address(portal.systemConfig()) == address(0)); - require(address(portal.superchainConfig()) == address(0)); - require(portal.l2Sender() == Constants.DEFAULT_L2_SENDER); + require(address(portal.l2Oracle()) == address(0), "CHECK-OP-80"); + require(address(portal.systemConfig()) == address(0), "CHECK-OP-90"); + require(address(portal.superchainConfig()) == address(0), "CHECK-OP-100"); + require(portal.l2Sender() == Constants.DEFAULT_L2_SENDER, "CHECK-OP-110"); } } From f86bd8c5dca6f3fe63c3297f54e1f6ee2660fd4d Mon Sep 17 00:00:00 2001 From: Maurelian Date: Thu, 3 Oct 2024 10:39:03 -0400 Subject: [PATCH 4/5] feat: checkDisputeGameFactory for isProxy --- .../scripts/deploy/ChainAssertions.sol | 19 ++++++++++++++++--- .../scripts/deploy/Deploy.s.sol | 14 +++++++++++--- .../scripts/fpac/FPACOPS.s.sol | 2 +- .../scripts/fpac/FPACOPS2.s.sol | 2 +- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol b/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol index bba3526c58de..7e7645b9d584 100644 --- a/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol +++ b/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol @@ -178,14 +178,27 @@ library ChainAssertions { } /// @notice Asserts that the DisputeGameFactory is setup correctly - function checkDisputeGameFactory(Types.ContractSet memory _contracts, address _expectedOwner) internal view { - console.log("Running chain assertions on the DisputeGameFactory"); + function checkDisputeGameFactory( + Types.ContractSet memory _contracts, + address _expectedOwner, + bool _isProxy + ) + internal + view + { IDisputeGameFactory factory = IDisputeGameFactory(_contracts.DisputeGameFactory); + console.log( + "Running chain assertions on the DisputeGameFactory %s at %s", + _isProxy ? "proxy" : "implementation", + address(factory) + ); + require(address(factory) != address(0), "CHECK-DG-10"); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(factory), _slot: 0, _offset: 0 }); - require(factory.owner() == _expectedOwner); + // The same check is made for both proxy and implementation + require(factory.owner() == _expectedOwner, "CHECK-DG-20"); } /// @notice Asserts that the DelayedWETH is setup correctly diff --git a/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol b/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol index 4ef9eff43ab4..b89ef5a0612d 100644 --- a/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol @@ -757,7 +757,7 @@ contract Deploy is Deployer { // `DisputeGameFactory` implementation alongside dependent contracts, which are always proxies. Types.ContractSet memory contracts = _proxiesUnstrict(); contracts.DisputeGameFactory = address(factory); - ChainAssertions.checkDisputeGameFactory({ _contracts: contracts, _expectedOwner: address(0) }); + ChainAssertions.checkDisputeGameFactory({ _contracts: contracts, _expectedOwner: address(0), _isProxy: true }); addr_ = address(factory); } @@ -957,7 +957,11 @@ contract Deploy is Deployer { string memory version = IDisputeGameFactory(disputeGameFactoryProxy).version(); console.log("DisputeGameFactory version: %s", version); - ChainAssertions.checkDisputeGameFactory({ _contracts: _proxiesUnstrict(), _expectedOwner: msg.sender }); + ChainAssertions.checkDisputeGameFactory({ + _contracts: _proxiesUnstrict(), + _expectedOwner: msg.sender, + _isProxy: true + }); } function initializeDelayedWETH() public broadcast { @@ -1345,7 +1349,11 @@ contract Deploy is Deployer { disputeGameFactory.transferOwnership(finalSystemOwner); console.log("DisputeGameFactory ownership transferred to final system owner at: %s", finalSystemOwner); } - ChainAssertions.checkDisputeGameFactory({ _contracts: _proxiesUnstrict(), _expectedOwner: finalSystemOwner }); + ChainAssertions.checkDisputeGameFactory({ + _contracts: _proxiesUnstrict(), + _expectedOwner: finalSystemOwner, + _isProxy: true + }); } /// @notice Transfer ownership of the DelayedWETH contract to the final system owner diff --git a/packages/contracts-bedrock/scripts/fpac/FPACOPS.s.sol b/packages/contracts-bedrock/scripts/fpac/FPACOPS.s.sol index a68f0bf615f5..21da41e12d5e 100644 --- a/packages/contracts-bedrock/scripts/fpac/FPACOPS.s.sol +++ b/packages/contracts-bedrock/scripts/fpac/FPACOPS.s.sol @@ -172,7 +172,7 @@ contract FPACOPS is Deploy, StdAssertions { address dgfProxyAddr = mustGetAddress("DisputeGameFactoryProxy"); IDisputeGameFactory dgfProxy = IDisputeGameFactory(dgfProxyAddr); assertEq(address(uint160(uint256(vm.load(dgfProxyAddr, Constants.PROXY_OWNER_ADDRESS)))), _proxyAdmin); - ChainAssertions.checkDisputeGameFactory(contracts, _finalSystemOwner); + ChainAssertions.checkDisputeGameFactory(contracts, _finalSystemOwner, true); address wethProxyAddr = mustGetAddress("DelayedWETHProxy"); assertEq(address(uint160(uint256(vm.load(wethProxyAddr, Constants.PROXY_OWNER_ADDRESS)))), _proxyAdmin); ChainAssertions.checkDelayedWETH(contracts, cfg, true, _finalSystemOwner); diff --git a/packages/contracts-bedrock/scripts/fpac/FPACOPS2.s.sol b/packages/contracts-bedrock/scripts/fpac/FPACOPS2.s.sol index 0f372e752b87..d16282cd4e49 100644 --- a/packages/contracts-bedrock/scripts/fpac/FPACOPS2.s.sol +++ b/packages/contracts-bedrock/scripts/fpac/FPACOPS2.s.sol @@ -224,7 +224,7 @@ contract FPACOPS2 is Deploy, StdAssertions { assertEq(address(uint160(uint256(vm.load(soyWethProxyAddr, Constants.PROXY_OWNER_ADDRESS)))), _proxyAdmin); // Run standard assertions for DGF and DelayedWETH. - ChainAssertions.checkDisputeGameFactory(contracts, _finalSystemOwner); + ChainAssertions.checkDisputeGameFactory(contracts, _finalSystemOwner, true); ChainAssertions.checkDelayedWETH(contracts, cfg, true, _finalSystemOwner); ChainAssertions.checkPermissionedDelayedWETH(contracts, cfg, true, _finalSystemOwner); From 9a892f35f6c9ad70b106746e52a6d3917734d2a6 Mon Sep 17 00:00:00 2001 From: Maurelian Date: Thu, 3 Oct 2024 10:44:22 -0400 Subject: [PATCH 5/5] feat: Final checkAssertions error codes --- .../scripts/deploy/ChainAssertions.sol | 144 ++++++++++-------- 1 file changed, 79 insertions(+), 65 deletions(-) diff --git a/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol b/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol index 7e7645b9d584..95af3fffcb89 100644 --- a/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol +++ b/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol @@ -67,8 +67,12 @@ library ChainAssertions { /// @notice Asserts that the SystemConfig is setup correctly function checkSystemConfig(Types.ContractSet memory _contracts, DeployConfig _cfg, bool _isProxy) internal view { - console.log("Running chain assertions on the SystemConfig"); ISystemConfig config = ISystemConfig(_contracts.SystemConfig); + console.log( + "Running chain assertions on the SystemConfig %s at %s", + _isProxy ? "proxy" : "implementation", + address(config) + ); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(config), _slot: 0, _offset: 0 }); @@ -76,104 +80,114 @@ library ChainAssertions { IResourceMetering.ResourceConfig memory resourceConfig = config.resourceConfig(); if (_isProxy) { - require(config.owner() == _cfg.finalSystemOwner()); - require(config.basefeeScalar() == _cfg.basefeeScalar()); - require(config.blobbasefeeScalar() == _cfg.blobbasefeeScalar()); - require(config.batcherHash() == bytes32(uint256(uint160(_cfg.batchSenderAddress())))); - require(config.gasLimit() == uint64(_cfg.l2GenesisBlockGasLimit())); - require(config.unsafeBlockSigner() == _cfg.p2pSequencerAddress()); - require(config.scalar() >> 248 == 1); + require(config.owner() == _cfg.finalSystemOwner(), "CHECK-SCFG-10"); + require(config.basefeeScalar() == _cfg.basefeeScalar(), "CHECK-SCFG-20"); + require(config.blobbasefeeScalar() == _cfg.blobbasefeeScalar(), "CHECK-SCFG-30"); + require(config.batcherHash() == bytes32(uint256(uint160(_cfg.batchSenderAddress()))), "CHECK-SCFG-40"); + require(config.gasLimit() == uint64(_cfg.l2GenesisBlockGasLimit()), "CHECK-SCFG-50"); + require(config.unsafeBlockSigner() == _cfg.p2pSequencerAddress(), "CHECK-SCFG-60"); + require(config.scalar() >> 248 == 1, "CHECK-SCFG-70"); // Check _config IResourceMetering.ResourceConfig memory rconfig = Constants.DEFAULT_RESOURCE_CONFIG(); - require(resourceConfig.maxResourceLimit == rconfig.maxResourceLimit); - require(resourceConfig.elasticityMultiplier == rconfig.elasticityMultiplier); - require(resourceConfig.baseFeeMaxChangeDenominator == rconfig.baseFeeMaxChangeDenominator); - require(resourceConfig.systemTxMaxGas == rconfig.systemTxMaxGas); - require(resourceConfig.minimumBaseFee == rconfig.minimumBaseFee); - require(resourceConfig.maximumBaseFee == rconfig.maximumBaseFee); + require(resourceConfig.maxResourceLimit == rconfig.maxResourceLimit, "CHECK-SCFG-80"); + require(resourceConfig.elasticityMultiplier == rconfig.elasticityMultiplier, "CHECK-SCFG-90"); + require(resourceConfig.baseFeeMaxChangeDenominator == rconfig.baseFeeMaxChangeDenominator, "CHECK-SCFG-100"); + require(resourceConfig.systemTxMaxGas == rconfig.systemTxMaxGas, "CHECK-SCFG-110"); + require(resourceConfig.minimumBaseFee == rconfig.minimumBaseFee, "CHECK-SCFG-120"); + require(resourceConfig.maximumBaseFee == rconfig.maximumBaseFee, "CHECK-SCFG-130"); // Depends on start block being set to 0 in `initialize` uint256 cfgStartBlock = _cfg.systemConfigStartBlock(); - require(config.startBlock() == (cfgStartBlock == 0 ? block.number : cfgStartBlock)); - require(config.batchInbox() == _cfg.batchInboxAddress()); + require(config.startBlock() == (cfgStartBlock == 0 ? block.number : cfgStartBlock), "CHECK-SCFG-140"); + require(config.batchInbox() == _cfg.batchInboxAddress(), "CHECK-SCFG-150"); // Check _addresses - require(config.l1CrossDomainMessenger() == _contracts.L1CrossDomainMessenger); - require(config.l1ERC721Bridge() == _contracts.L1ERC721Bridge); - require(config.l1StandardBridge() == _contracts.L1StandardBridge); - require(config.disputeGameFactory() == _contracts.DisputeGameFactory); - require(config.optimismPortal() == _contracts.OptimismPortal); - require(config.optimismMintableERC20Factory() == _contracts.OptimismMintableERC20Factory); + require(config.l1CrossDomainMessenger() == _contracts.L1CrossDomainMessenger, "CHECK-SCFG-160"); + require(config.l1ERC721Bridge() == _contracts.L1ERC721Bridge, "CHECK-SCFG-170"); + require(config.l1StandardBridge() == _contracts.L1StandardBridge, "CHECK-SCFG-180"); + require(config.disputeGameFactory() == _contracts.DisputeGameFactory, "CHECK-SCFG-190"); + require(config.optimismPortal() == _contracts.OptimismPortal, "CHECK-SCFG-200"); + require(config.optimismMintableERC20Factory() == _contracts.OptimismMintableERC20Factory, "CHECK-SCFG-210"); } else { - require(config.owner() == address(0xdead)); - require(config.overhead() == 0); - require(config.scalar() == uint256(0x01) << 248); // version 1 - require(config.basefeeScalar() == 0); - require(config.blobbasefeeScalar() == 0); - require(config.batcherHash() == bytes32(0)); - require(config.gasLimit() == 1); - require(config.unsafeBlockSigner() == address(0)); + require(config.owner() == address(0xdead), "CHECK-SCFG-220"); + require(config.overhead() == 0, "CHECK-SCFG-230"); + require(config.scalar() == uint256(0x01) << 248, "CHECK-SCFG-240"); // version 1 + require(config.basefeeScalar() == 0, "CHECK-SCFG-250"); + require(config.blobbasefeeScalar() == 0, "CHECK-SCFG-260"); + require(config.batcherHash() == bytes32(0), "CHECK-SCFG-270"); + require(config.gasLimit() == 1, "CHECK-SCFG-280"); + require(config.unsafeBlockSigner() == address(0), "CHECK-SCFG-290"); // Check _config - require(resourceConfig.maxResourceLimit == 1); - require(resourceConfig.elasticityMultiplier == 1); - require(resourceConfig.baseFeeMaxChangeDenominator == 2); - require(resourceConfig.systemTxMaxGas == 0); - require(resourceConfig.minimumBaseFee == 0); - require(resourceConfig.maximumBaseFee == 0); + require(resourceConfig.maxResourceLimit == 1, "CHECK-SCFG-300"); + require(resourceConfig.elasticityMultiplier == 1, "CHECK-SCFG-310"); + require(resourceConfig.baseFeeMaxChangeDenominator == 2, "CHECK-SCFG-320"); + require(resourceConfig.systemTxMaxGas == 0, "CHECK-SCFG-330"); + require(resourceConfig.minimumBaseFee == 0, "CHECK-SCFG-340"); + require(resourceConfig.maximumBaseFee == 0, "CHECK-SCFG-350"); // Check _addresses - require(config.startBlock() == type(uint256).max); - require(config.batchInbox() == address(0)); - require(config.l1CrossDomainMessenger() == address(0)); - require(config.l1ERC721Bridge() == address(0)); - require(config.l1StandardBridge() == address(0)); - require(config.disputeGameFactory() == address(0)); - require(config.optimismPortal() == address(0)); - require(config.optimismMintableERC20Factory() == address(0)); + require(config.startBlock() == type(uint256).max, "CHECK-SCFG-360"); + require(config.batchInbox() == address(0), "CHECK-SCFG-370"); + require(config.l1CrossDomainMessenger() == address(0), "CHECK-SCFG-380"); + require(config.l1ERC721Bridge() == address(0), "CHECK-SCFG-390"); + require(config.l1StandardBridge() == address(0), "CHECK-SCFG-400"); + require(config.disputeGameFactory() == address(0), "CHECK-SCFG-410"); + require(config.optimismPortal() == address(0), "CHECK-SCFG-420"); + require(config.optimismMintableERC20Factory() == address(0), "CHECK-SCFG-430"); } } /// @notice Asserts that the L1CrossDomainMessenger is setup correctly function checkL1CrossDomainMessenger(Types.ContractSet memory _contracts, Vm _vm, bool _isProxy) internal view { - console.log("Running chain assertions on the L1CrossDomainMessenger"); IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(_contracts.L1CrossDomainMessenger); + console.log( + "Running chain assertions on the L1CrossDomainMessenger %s at %s", + _isProxy ? "proxy" : "implementation", + address(messenger) + ); + require(address(messenger) != address(0), "CHECK-L1XDM-10"); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(messenger), _slot: 0, _offset: 20 }); - require(address(messenger.OTHER_MESSENGER()) == Predeploys.L2_CROSS_DOMAIN_MESSENGER); - require(address(messenger.otherMessenger()) == Predeploys.L2_CROSS_DOMAIN_MESSENGER); + require(address(messenger.OTHER_MESSENGER()) == Predeploys.L2_CROSS_DOMAIN_MESSENGER, "CHECK-L1XDM-20"); + require(address(messenger.otherMessenger()) == Predeploys.L2_CROSS_DOMAIN_MESSENGER, "CHECK-L1XDM-30"); if (_isProxy) { - require(address(messenger.PORTAL()) == _contracts.OptimismPortal); - require(address(messenger.portal()) == _contracts.OptimismPortal); - require(address(messenger.superchainConfig()) == _contracts.SuperchainConfig); + require(address(messenger.PORTAL()) == _contracts.OptimismPortal, "CHECK-L1XDM-40"); + require(address(messenger.portal()) == _contracts.OptimismPortal, "CHECK-L1XDM-50"); + require(address(messenger.superchainConfig()) == _contracts.SuperchainConfig, "CHECK-L1XDM-60"); bytes32 xdmSenderSlot = _vm.load(address(messenger), bytes32(uint256(204))); - require(address(uint160(uint256(xdmSenderSlot))) == Constants.DEFAULT_L2_SENDER); + require(address(uint160(uint256(xdmSenderSlot))) == Constants.DEFAULT_L2_SENDER, "CHECK-L1XDM-70"); } else { - require(address(messenger.PORTAL()) == address(0)); - require(address(messenger.portal()) == address(0)); - require(address(messenger.superchainConfig()) == address(0)); + require(address(messenger.PORTAL()) == address(0), "CHECK-L1XDM-80"); + require(address(messenger.portal()) == address(0), "CHECK-L1XDM-90"); + require(address(messenger.superchainConfig()) == address(0), "CHECK-L1XDM-100"); } } /// @notice Asserts that the L1StandardBridge is setup correctly function checkL1StandardBridge(Types.ContractSet memory _contracts, bool _isProxy) internal view { - console.log("Running chain assertions on the L1StandardBridge"); IL1StandardBridge bridge = IL1StandardBridge(payable(_contracts.L1StandardBridge)); + console.log( + "Running chain assertions on the L1StandardBridge %s at %s", + _isProxy ? "proxy" : "implementation", + address(bridge) + ); + require(address(bridge) != address(0), "CHECK-L1SB-10"); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(bridge), _slot: 0, _offset: 0 }); if (_isProxy) { - require(address(bridge.MESSENGER()) == _contracts.L1CrossDomainMessenger); - require(address(bridge.messenger()) == _contracts.L1CrossDomainMessenger); - require(address(bridge.OTHER_BRIDGE()) == Predeploys.L2_STANDARD_BRIDGE); - require(address(bridge.otherBridge()) == Predeploys.L2_STANDARD_BRIDGE); - require(address(bridge.superchainConfig()) == _contracts.SuperchainConfig); + require(address(bridge.MESSENGER()) == _contracts.L1CrossDomainMessenger, "CHECK-L1SB-20"); + require(address(bridge.messenger()) == _contracts.L1CrossDomainMessenger, "CHECK-L1SB-30"); + require(address(bridge.OTHER_BRIDGE()) == Predeploys.L2_STANDARD_BRIDGE, "CHECK-L1SB-40"); + require(address(bridge.otherBridge()) == Predeploys.L2_STANDARD_BRIDGE, "CHECK-L1SB-50"); + require(address(bridge.superchainConfig()) == _contracts.SuperchainConfig, "CHECK-L1SB-60"); } else { - require(address(bridge.MESSENGER()) == address(0)); - require(address(bridge.messenger()) == address(0)); - require(address(bridge.OTHER_BRIDGE()) == Predeploys.L2_STANDARD_BRIDGE); - require(address(bridge.otherBridge()) == Predeploys.L2_STANDARD_BRIDGE); - require(address(bridge.superchainConfig()) == address(0)); + require(address(bridge.MESSENGER()) == address(0), "CHECK-L1SB-70"); + require(address(bridge.messenger()) == address(0), "CHECK-L1SB-80"); + require(address(bridge.OTHER_BRIDGE()) == Predeploys.L2_STANDARD_BRIDGE, "CHECK-L1SB-90"); + require(address(bridge.otherBridge()) == Predeploys.L2_STANDARD_BRIDGE, "CHECK-L1SB-100"); + require(address(bridge.superchainConfig()) == address(0), "CHECK-L1SB-110"); } }