Commit ef6ef6fd authored by Michael Amadi's avatar Michael Amadi Committed by GitHub

make interfaces for opcm contracts and use them in tests and scripts (#13922)

* make interfaces for opcm contracts and use them in tests and scripts

* fix opcm interop deployment
parent 95801790
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// Libraries
import { Claim, Duration, GameType } from "src/dispute/lib/Types.sol";
// Interfaces
import { IBigStepper } from "interfaces/dispute/IBigStepper.sol";
import { IDelayedWETH } from "interfaces/dispute/IDelayedWETH.sol";
import { IAnchorStateRegistry } from "interfaces/dispute/IAnchorStateRegistry.sol";
import { IAddressManager } from "interfaces/legacy/IAddressManager.sol";
import { IProxyAdmin } from "interfaces/universal/IProxyAdmin.sol";
import { IDelayedWETH } from "interfaces/dispute/IDelayedWETH.sol";
import { IDisputeGameFactory } from "interfaces/dispute/IDisputeGameFactory.sol";
import { IFaultDisputeGame } from "interfaces/dispute/IFaultDisputeGame.sol";
import { IPermissionedDisputeGame } from "interfaces/dispute/IPermissionedDisputeGame.sol";
import { ISuperchainConfig } from "interfaces/L1/ISuperchainConfig.sol";
import { IProtocolVersions } from "interfaces/L1/IProtocolVersions.sol";
import { IOptimismPortal2 } from "interfaces/L1/IOptimismPortal2.sol";
import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol";
import { IL1CrossDomainMessenger } from "interfaces/L1/IL1CrossDomainMessenger.sol";
import { IL1ERC721Bridge } from "interfaces/L1/IL1ERC721Bridge.sol";
import { IL1StandardBridge } from "interfaces/L1/IL1StandardBridge.sol";
import { IOptimismMintableERC20Factory } from "interfaces/universal/IOptimismMintableERC20Factory.sol";
interface IOPContractsManager {
// -------- Structs --------
/// @notice Represents the roles that can be set when deploying a standard OP Stack chain.
struct Roles {
address opChainProxyAdminOwner;
address systemConfigOwner;
address batcher;
address unsafeBlockSigner;
address proposer;
address challenger;
}
/// @notice The full set of inputs to deploy a new OP Stack chain.
struct DeployInput {
Roles roles;
uint32 basefeeScalar;
uint32 blobBasefeeScalar;
uint256 l2ChainId;
// The correct type is OutputRoot memory but OP Deployer does not yet support structs.
bytes startingAnchorRoot;
// The salt mixer is used as part of making the resulting salt unique.
string saltMixer;
uint64 gasLimit;
// Configurable dispute game parameters.
GameType disputeGameType;
Claim disputeAbsolutePrestate;
uint256 disputeMaxGameDepth;
uint256 disputeSplitDepth;
Duration disputeClockExtension;
Duration disputeMaxClockDuration;
}
/// @notice The full set of outputs from deploying a new OP Stack chain.
struct DeployOutput {
IProxyAdmin opChainProxyAdmin;
IAddressManager addressManager;
IL1ERC721Bridge l1ERC721BridgeProxy;
ISystemConfig systemConfigProxy;
IOptimismMintableERC20Factory optimismMintableERC20FactoryProxy;
IL1StandardBridge l1StandardBridgeProxy;
IL1CrossDomainMessenger l1CrossDomainMessengerProxy;
// Fault proof contracts below.
IOptimismPortal2 optimismPortalProxy;
IDisputeGameFactory disputeGameFactoryProxy;
IAnchorStateRegistry anchorStateRegistryProxy;
IFaultDisputeGame faultDisputeGame;
IPermissionedDisputeGame permissionedDisputeGame;
IDelayedWETH delayedWETHPermissionedGameProxy;
IDelayedWETH delayedWETHPermissionlessGameProxy;
}
/// @notice Addresses of ERC-5202 Blueprint contracts. There are used for deploying full size
/// contracts, to reduce the code size of this factory contract. If it deployed full contracts
/// using the `new Proxy()` syntax, the code size would get large fast, since this contract would
/// contain the bytecode of every contract it deploys. Therefore we instead use Blueprints to
/// reduce the code size of this contract.
struct Blueprints {
address addressManager;
address proxy;
address proxyAdmin;
address l1ChugSplashProxy;
address resolvedDelegateProxy;
address permissionedDisputeGame1;
address permissionedDisputeGame2;
address permissionlessDisputeGame1;
address permissionlessDisputeGame2;
}
/// @notice The latest implementation contracts for the OP Stack.
struct Implementations {
address l1ERC721BridgeImpl;
address optimismPortalImpl;
address systemConfigImpl;
address optimismMintableERC20FactoryImpl;
address l1CrossDomainMessengerImpl;
address l1StandardBridgeImpl;
address disputeGameFactoryImpl;
address anchorStateRegistryImpl;
address delayedWETHImpl;
address mipsImpl;
}
/// @notice The input required to identify a chain for upgrading.
struct OpChain {
ISystemConfig systemConfigProxy;
IProxyAdmin proxyAdmin;
}
struct AddGameInput {
string saltMixer;
ISystemConfig systemConfig;
IProxyAdmin proxyAdmin;
IDelayedWETH delayedWETH;
GameType disputeGameType;
Claim disputeAbsolutePrestate;
uint256 disputeMaxGameDepth;
uint256 disputeSplitDepth;
Duration disputeClockExtension;
Duration disputeMaxClockDuration;
uint256 initialBond;
IBigStepper vm;
bool permissioned;
}
struct AddGameOutput {
IDelayedWETH delayedWETH;
IFaultDisputeGame faultDisputeGame;
}
// -------- Constants and Variables --------
function version() external pure returns (string memory);
/// @notice Address of the SuperchainConfig contract shared by all chains.
function superchainConfig() external view returns (ISuperchainConfig);
/// @notice Address of the ProtocolVersions contract shared by all chains.
function protocolVersions() external view returns (IProtocolVersions);
/// @notice L1 smart contracts release deployed by this version of OPCM. This is used in opcm to signal which
/// version of the L1 smart contracts is deployed. It takes the format of `op-contracts/vX.Y.Z`.
function l1ContractsRelease() external view returns (string memory);
// -------- Events --------
/// @notice Emitted when a new OP Stack chain is deployed.
/// @param l2ChainId Chain ID of the new chain.
/// @param deployer Address that deployed the chain.
/// @param deployOutput ABI-encoded output of the deployment.
event Deployed(uint256 indexed l2ChainId, address indexed deployer, bytes deployOutput);
/// @notice Emitted when a chain is upgraded
/// @param systemConfig Address of the chain's SystemConfig contract
/// @param upgrader Address that initiated the upgrade
event Upgraded(uint256 indexed l2ChainId, ISystemConfig indexed systemConfig, address indexed upgrader);
// -------- Errors --------
error BytesArrayTooLong();
error DeploymentFailed();
error EmptyInitcode();
error IdentityPrecompileCallFailed();
error NotABlueprint();
error ReservedBitsSet();
error UnexpectedPreambleData(bytes data);
error UnsupportedERCVersion(uint8 version);
/// @notice Thrown when an address is the zero address.
error AddressNotFound(address who);
/// @notice Throw when a contract address has no code.
error AddressHasNoCode(address who);
/// @notice Thrown when a release version is already set.
error AlreadyReleased();
/// @notice Thrown when an invalid `l2ChainId` is provided to `deploy`.
error InvalidChainId();
/// @notice Thrown when a role's address is not valid.
error InvalidRoleAddress(string role);
/// @notice Thrown when the latest release is not set upon initialization.
error LatestReleaseNotSet();
/// @notice Thrown when the starting anchor root is not provided.
error InvalidStartingAnchorRoot();
/// @notice Thrown when certain methods are called outside of a DELEGATECALL.
error OnlyDelegatecall();
/// @notice Thrown when game configs passed to addGameType are invalid.
error InvalidGameConfigs();
/// @notice Thrown when the SuperchainConfig of the chain does not match the SuperchainConfig of this OPCM.
error SuperchainConfigMismatch(ISystemConfig systemConfig);
// -------- Methods --------
function __constructor__(
ISuperchainConfig _superchainConfig,
IProtocolVersions _protocolVersions,
string memory _l1ContractsRelease,
Blueprints memory _blueprints,
Implementations memory _implementations
)
external;
function deploy(DeployInput calldata _input) external returns (DeployOutput memory);
/// @notice Upgrades a set of chains to the latest implementation contracts
/// @param _opChains Array of OpChain structs, one per chain to upgrade
/// @dev This function is intended to be called via DELEGATECALL from the Upgrade Controller Safe
function upgrade(OpChain[] memory _opChains) external;
/// @notice addGameType deploys a new dispute game and links it to the DisputeGameFactory. The inputted _gameConfigs
/// must be added in ascending GameType order.
function addGameType(AddGameInput[] memory _gameConfigs) external returns (AddGameOutput[] memory);
/// @notice Maps an L2 chain ID to an L1 batch inbox address as defined by the standard
/// configuration's convention. This convention is `versionByte || keccak256(bytes32(chainId))[:19]`,
/// where || denotes concatenation`, versionByte is 0x00, and chainId is a uint256.
/// https://specs.optimism.io/protocol/configurability.html#consensus-parameters
function chainIdToBatchInboxAddress(uint256 _l2ChainId) external pure returns (address);
/// @notice Returns the blueprint contract addresses.
function blueprints() external view returns (Blueprints memory);
/// @notice Returns the implementation contract addresses.
function implementations() external view returns (Implementations memory);
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { ISuperchainConfig } from "interfaces/L1/ISuperchainConfig.sol";
import { IProtocolVersions } from "interfaces/L1/IProtocolVersions.sol";
import { IOPContractsManager } from "interfaces/L1/IOPContractsManager.sol";
interface IOPContractsManagerInterop is IOPContractsManager {
function __constructor__(
ISuperchainConfig _superchainConfig,
IProtocolVersions _protocolVersions,
string memory _l1ContractsRelease,
Blueprints memory _blueprints,
Implementations memory _implementations
)
external;
}
...@@ -17,10 +17,8 @@ import { Predeploys } from "src/libraries/Predeploys.sol"; ...@@ -17,10 +17,8 @@ import { Predeploys } from "src/libraries/Predeploys.sol";
import { Types } from "scripts/libraries/Types.sol"; import { Types } from "scripts/libraries/Types.sol";
import { Blueprint } from "src/libraries/Blueprint.sol"; import { Blueprint } from "src/libraries/Blueprint.sol";
// Contracts
import { OPContractsManager } from "src/L1/OPContractsManager.sol";
// Interfaces // Interfaces
import { IOPContractsManager } from "interfaces/L1/IOPContractsManager.sol";
import { IResourceMetering } from "interfaces/L1/IResourceMetering.sol"; import { IResourceMetering } from "interfaces/L1/IResourceMetering.sol";
import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol"; import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol";
import { ISuperchainConfig } from "interfaces/L1/ISuperchainConfig.sol"; import { ISuperchainConfig } from "interfaces/L1/ISuperchainConfig.sol";
...@@ -472,7 +470,7 @@ library ChainAssertions { ...@@ -472,7 +470,7 @@ library ChainAssertions {
/// @notice Asserts that the OPContractsManager is setup correctly /// @notice Asserts that the OPContractsManager is setup correctly
function checkOPContractsManager( function checkOPContractsManager(
Types.ContractSet memory _contracts, Types.ContractSet memory _contracts,
OPContractsManager _opcm, IOPContractsManager _opcm,
IMIPS _mips IMIPS _mips
) )
internal internal
...@@ -494,7 +492,7 @@ library ChainAssertions { ...@@ -494,7 +492,7 @@ library ChainAssertions {
require(bytes(_opcm.l1ContractsRelease()).length > 0, "CHECK-OPCM-40"); require(bytes(_opcm.l1ContractsRelease()).length > 0, "CHECK-OPCM-40");
// Ensure that the OPCM impls are correctly saved // Ensure that the OPCM impls are correctly saved
OPContractsManager.Implementations memory impls = _opcm.implementations(); IOPContractsManager.Implementations memory impls = _opcm.implementations();
require(impls.l1ERC721BridgeImpl == _contracts.L1ERC721Bridge, "CHECK-OPCM-50"); require(impls.l1ERC721BridgeImpl == _contracts.L1ERC721Bridge, "CHECK-OPCM-50");
require(impls.optimismPortalImpl == _contracts.OptimismPortal, "CHECK-OPCM-60"); require(impls.optimismPortalImpl == _contracts.OptimismPortal, "CHECK-OPCM-60");
require(impls.systemConfigImpl == _contracts.SystemConfig, "CHECK-OPCM-70"); require(impls.systemConfigImpl == _contracts.SystemConfig, "CHECK-OPCM-70");
...@@ -506,7 +504,7 @@ library ChainAssertions { ...@@ -506,7 +504,7 @@ library ChainAssertions {
require(impls.mipsImpl == address(_mips), "CHECK-OPCM-130"); require(impls.mipsImpl == address(_mips), "CHECK-OPCM-130");
// Verify that initCode is correctly set into the blueprints // Verify that initCode is correctly set into the blueprints
OPContractsManager.Blueprints memory blueprints = _opcm.blueprints(); IOPContractsManager.Blueprints memory blueprints = _opcm.blueprints();
Blueprint.Preamble memory addressManagerPreamble = Blueprint.Preamble memory addressManagerPreamble =
Blueprint.parseBlueprintPreamble(address(blueprints.addressManager).code); Blueprint.parseBlueprintPreamble(address(blueprints.addressManager).code);
require(keccak256(addressManagerPreamble.initcode) == keccak256(vm.getCode("AddressManager")), "CHECK-OPCM-140"); require(keccak256(addressManagerPreamble.initcode) == keccak256(vm.getCode("AddressManager")), "CHECK-OPCM-140");
......
...@@ -24,9 +24,6 @@ import { ...@@ -24,9 +24,6 @@ import {
DeployImplementationsOutput DeployImplementationsOutput
} from "scripts/deploy/DeployImplementations.s.sol"; } from "scripts/deploy/DeployImplementations.s.sol";
// Contracts
import { OPContractsManager } from "src/L1/OPContractsManager.sol";
// Libraries // Libraries
import { Constants } from "src/libraries/Constants.sol"; import { Constants } from "src/libraries/Constants.sol";
import { Types } from "scripts/libraries/Types.sol"; import { Types } from "scripts/libraries/Types.sol";
...@@ -35,6 +32,7 @@ import { StorageSlot, ForgeArtifacts } from "scripts/libraries/ForgeArtifacts.so ...@@ -35,6 +32,7 @@ import { StorageSlot, ForgeArtifacts } from "scripts/libraries/ForgeArtifacts.so
import { GameType, Claim, GameTypes, OutputRoot, Hash } from "src/dispute/lib/Types.sol"; import { GameType, Claim, GameTypes, OutputRoot, Hash } from "src/dispute/lib/Types.sol";
// Interfaces // Interfaces
import { IOPContractsManager } from "interfaces/L1/IOPContractsManager.sol";
import { IProxy } from "interfaces/universal/IProxy.sol"; import { IProxy } from "interfaces/universal/IProxy.sol";
import { IProxyAdmin } from "interfaces/universal/IProxyAdmin.sol"; import { IProxyAdmin } from "interfaces/universal/IProxyAdmin.sol";
import { IOptimismPortal2 } from "interfaces/L1/IOptimismPortal2.sol"; import { IOptimismPortal2 } from "interfaces/L1/IOptimismPortal2.sol";
...@@ -346,7 +344,7 @@ contract Deploy is Deployer { ...@@ -346,7 +344,7 @@ contract Deploy is Deployer {
}); });
ChainAssertions.checkOPContractsManager({ ChainAssertions.checkOPContractsManager({
_contracts: contracts, _contracts: contracts,
_opcm: OPContractsManager(address(dio.opcm())), _opcm: IOPContractsManager(address(dio.opcm())),
_mips: IMIPS(address(dio.mipsSingleton())) _mips: IMIPS(address(dio.mipsSingleton()))
}); });
if (_isInterop) { if (_isInterop) {
...@@ -362,10 +360,10 @@ contract Deploy is Deployer { ...@@ -362,10 +360,10 @@ contract Deploy is Deployer {
// Ensure that the requisite contracts are deployed // Ensure that the requisite contracts are deployed
address superchainConfigProxy = artifacts.mustGetAddress("SuperchainConfigProxy"); address superchainConfigProxy = artifacts.mustGetAddress("SuperchainConfigProxy");
OPContractsManager opcm = OPContractsManager(artifacts.mustGetAddress("OPContractsManager")); IOPContractsManager opcm = IOPContractsManager(artifacts.mustGetAddress("OPContractsManager"));
OPContractsManager.DeployInput memory deployInput = getDeployInput(); IOPContractsManager.DeployInput memory deployInput = getDeployInput();
OPContractsManager.DeployOutput memory deployOutput = opcm.deploy(deployInput); IOPContractsManager.DeployOutput memory deployOutput = opcm.deploy(deployInput);
// Save all deploy outputs from the OPCM, in the order they are declared in the DeployOutput struct // Save all deploy outputs from the OPCM, in the order they are declared in the DeployOutput struct
artifacts.save("ProxyAdmin", address(deployOutput.opChainProxyAdmin)); artifacts.save("ProxyAdmin", address(deployOutput.opChainProxyAdmin));
...@@ -854,10 +852,10 @@ contract Deploy is Deployer { ...@@ -854,10 +852,10 @@ contract Deploy is Deployer {
} }
/// @notice Get the DeployInput struct to use for testing /// @notice Get the DeployInput struct to use for testing
function getDeployInput() public view returns (OPContractsManager.DeployInput memory) { function getDeployInput() public view returns (IOPContractsManager.DeployInput memory) {
string memory saltMixer = "salt mixer"; string memory saltMixer = "salt mixer";
return OPContractsManager.DeployInput({ return IOPContractsManager.DeployInput({
roles: OPContractsManager.Roles({ roles: IOPContractsManager.Roles({
opChainProxyAdminOwner: msg.sender, opChainProxyAdminOwner: msg.sender,
systemConfigOwner: cfg.finalSystemOwner(), systemConfigOwner: cfg.finalSystemOwner(),
batcher: cfg.batchSenderAddress(), batcher: cfg.batchSenderAddress(),
......
...@@ -14,15 +14,14 @@ import { IPreimageOracle } from "interfaces/cannon/IPreimageOracle.sol"; ...@@ -14,15 +14,14 @@ import { IPreimageOracle } from "interfaces/cannon/IPreimageOracle.sol";
import { IMIPS } from "interfaces/cannon/IMIPS.sol"; import { IMIPS } from "interfaces/cannon/IMIPS.sol";
import { IDisputeGameFactory } from "interfaces/dispute/IDisputeGameFactory.sol"; import { IDisputeGameFactory } from "interfaces/dispute/IDisputeGameFactory.sol";
import { IAnchorStateRegistry } from "interfaces/dispute/IAnchorStateRegistry.sol"; import { IAnchorStateRegistry } from "interfaces/dispute/IAnchorStateRegistry.sol";
import { OPContractsManager } from "src/L1/OPContractsManager.sol"; import { IOPContractsManager } from "interfaces/L1/IOPContractsManager.sol";
import { IOPContractsManagerInterop } from "interfaces/L1/IOPContractsManagerInterop.sol";
import { IOptimismPortal2 } from "interfaces/L1/IOptimismPortal2.sol"; import { IOptimismPortal2 } from "interfaces/L1/IOptimismPortal2.sol";
import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol"; import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol";
import { IL1CrossDomainMessenger } from "interfaces/L1/IL1CrossDomainMessenger.sol"; import { IL1CrossDomainMessenger } from "interfaces/L1/IL1CrossDomainMessenger.sol";
import { IL1ERC721Bridge } from "interfaces/L1/IL1ERC721Bridge.sol"; import { IL1ERC721Bridge } from "interfaces/L1/IL1ERC721Bridge.sol";
import { IL1StandardBridge } from "interfaces/L1/IL1StandardBridge.sol"; import { IL1StandardBridge } from "interfaces/L1/IL1StandardBridge.sol";
import { IOptimismMintableERC20Factory } from "interfaces/universal/IOptimismMintableERC20Factory.sol"; import { IOptimismMintableERC20Factory } from "interfaces/universal/IOptimismMintableERC20Factory.sol";
import { OPContractsManagerInterop } from "src/L1/OPContractsManagerInterop.sol";
import { IOptimismPortalInterop } from "interfaces/L1/IOptimismPortalInterop.sol"; import { IOptimismPortalInterop } from "interfaces/L1/IOptimismPortalInterop.sol";
import { ISystemConfigInterop } from "interfaces/L1/ISystemConfigInterop.sol"; import { ISystemConfigInterop } from "interfaces/L1/ISystemConfigInterop.sol";
...@@ -131,7 +130,7 @@ contract DeployImplementationsInput is BaseDeployIO { ...@@ -131,7 +130,7 @@ contract DeployImplementationsInput is BaseDeployIO {
} }
contract DeployImplementationsOutput is BaseDeployIO { contract DeployImplementationsOutput is BaseDeployIO {
OPContractsManager internal _opcm; IOPContractsManager internal _opcm;
IDelayedWETH internal _delayedWETHImpl; IDelayedWETH internal _delayedWETHImpl;
IOptimismPortal2 internal _optimismPortalImpl; IOptimismPortal2 internal _optimismPortalImpl;
IPreimageOracle internal _preimageOracleSingleton; IPreimageOracle internal _preimageOracleSingleton;
...@@ -148,7 +147,7 @@ contract DeployImplementationsOutput is BaseDeployIO { ...@@ -148,7 +147,7 @@ contract DeployImplementationsOutput is BaseDeployIO {
require(_addr != address(0), "DeployImplementationsOutput: cannot set zero address"); require(_addr != address(0), "DeployImplementationsOutput: cannot set zero address");
// forgefmt: disable-start // forgefmt: disable-start
if (_sel == this.opcm.selector) _opcm = OPContractsManager(_addr); if (_sel == this.opcm.selector) _opcm = IOPContractsManager(_addr);
else if (_sel == this.optimismPortalImpl.selector) _optimismPortalImpl = IOptimismPortal2(payable(_addr)); else if (_sel == this.optimismPortalImpl.selector) _optimismPortalImpl = IOptimismPortal2(payable(_addr));
else if (_sel == this.delayedWETHImpl.selector) _delayedWETHImpl = IDelayedWETH(payable(_addr)); else if (_sel == this.delayedWETHImpl.selector) _delayedWETHImpl = IDelayedWETH(payable(_addr));
else if (_sel == this.preimageOracleSingleton.selector) _preimageOracleSingleton = IPreimageOracle(_addr); else if (_sel == this.preimageOracleSingleton.selector) _preimageOracleSingleton = IPreimageOracle(_addr);
...@@ -190,7 +189,7 @@ contract DeployImplementationsOutput is BaseDeployIO { ...@@ -190,7 +189,7 @@ contract DeployImplementationsOutput is BaseDeployIO {
assertValidDeploy(_dii); assertValidDeploy(_dii);
} }
function opcm() public view returns (OPContractsManager) { function opcm() public view returns (IOPContractsManager) {
DeployUtils.assertValidContractAddress(address(_opcm)); DeployUtils.assertValidContractAddress(address(_opcm));
return _opcm; return _opcm;
} }
...@@ -267,7 +266,7 @@ contract DeployImplementationsOutput is BaseDeployIO { ...@@ -267,7 +266,7 @@ contract DeployImplementationsOutput is BaseDeployIO {
} }
function assertValidOpcm(DeployImplementationsInput _dii) internal view { function assertValidOpcm(DeployImplementationsInput _dii) internal view {
OPContractsManager impl = OPContractsManager(address(opcm())); IOPContractsManager impl = IOPContractsManager(address(opcm()));
require(address(impl.superchainConfig()) == address(_dii.superchainConfigProxy()), "OPCMI-10"); require(address(impl.superchainConfig()) == address(_dii.superchainConfigProxy()), "OPCMI-10");
require(address(impl.protocolVersions()) == address(_dii.protocolVersionsProxy()), "OPCMI-20"); require(address(impl.protocolVersions()) == address(_dii.protocolVersionsProxy()), "OPCMI-20");
} }
...@@ -436,17 +435,17 @@ contract DeployImplementations is Script { ...@@ -436,17 +435,17 @@ contract DeployImplementations is Script {
function createOPCMContract( function createOPCMContract(
DeployImplementationsInput _dii, DeployImplementationsInput _dii,
DeployImplementationsOutput _dio, DeployImplementationsOutput _dio,
OPContractsManager.Blueprints memory _blueprints, IOPContractsManager.Blueprints memory _blueprints,
string memory _l1ContractsRelease string memory _l1ContractsRelease
) )
internal internal
virtual virtual
returns (OPContractsManager opcm_) returns (IOPContractsManager opcm_)
{ {
ISuperchainConfig superchainConfigProxy = _dii.superchainConfigProxy(); ISuperchainConfig superchainConfigProxy = _dii.superchainConfigProxy();
IProtocolVersions protocolVersionsProxy = _dii.protocolVersionsProxy(); IProtocolVersions protocolVersionsProxy = _dii.protocolVersionsProxy();
OPContractsManager.Implementations memory implementations = OPContractsManager.Implementations({ IOPContractsManager.Implementations memory implementations = IOPContractsManager.Implementations({
l1ERC721BridgeImpl: address(_dio.l1ERC721BridgeImpl()), l1ERC721BridgeImpl: address(_dio.l1ERC721BridgeImpl()),
optimismPortalImpl: address(_dio.optimismPortalImpl()), optimismPortalImpl: address(_dio.optimismPortalImpl()),
systemConfigImpl: address(_dio.systemConfigImpl()), systemConfigImpl: address(_dio.systemConfigImpl()),
...@@ -460,11 +459,14 @@ contract DeployImplementations is Script { ...@@ -460,11 +459,14 @@ contract DeployImplementations is Script {
}); });
vm.broadcast(msg.sender); vm.broadcast(msg.sender);
opcm_ = OPContractsManager( opcm_ = IOPContractsManager(
DeployUtils.createDeterministic({ DeployUtils.createDeterministic({
_name: "OPContractsManager", _name: "OPContractsManager",
_args: abi.encode( _args: DeployUtils.encodeConstructor(
superchainConfigProxy, protocolVersionsProxy, _l1ContractsRelease, _blueprints, implementations abi.encodeCall(
IOPContractsManager.__constructor__,
(superchainConfigProxy, protocolVersionsProxy, _l1ContractsRelease, _blueprints, implementations)
)
), ),
_salt: _salt _salt: _salt
}) })
...@@ -485,7 +487,7 @@ contract DeployImplementations is Script { ...@@ -485,7 +487,7 @@ contract DeployImplementations is Script {
// First we deploy the blueprints for the singletons deployed by OPCM. // First we deploy the blueprints for the singletons deployed by OPCM.
// forgefmt: disable-start // forgefmt: disable-start
OPContractsManager.Blueprints memory blueprints; IOPContractsManager.Blueprints memory blueprints;
vm.startBroadcast(msg.sender); vm.startBroadcast(msg.sender);
address checkAddress; address checkAddress;
(blueprints.addressManager, checkAddress) = DeployUtils.createDeterministicBlueprint(vm.getCode("AddressManager"), _salt); (blueprints.addressManager, checkAddress) = DeployUtils.createDeterministicBlueprint(vm.getCode("AddressManager"), _salt);
...@@ -505,7 +507,7 @@ contract DeployImplementations is Script { ...@@ -505,7 +507,7 @@ contract DeployImplementations is Script {
// forgefmt: disable-end // forgefmt: disable-end
vm.stopBroadcast(); vm.stopBroadcast();
OPContractsManager opcm = createOPCMContract(_dii, _dio, blueprints, l1ContractsRelease); IOPContractsManager opcm = createOPCMContract(_dii, _dio, blueprints, l1ContractsRelease);
vm.label(address(opcm), "OPContractsManager"); vm.label(address(opcm), "OPContractsManager");
_dio.set(_dio.opcm.selector, address(opcm)); _dio.set(_dio.opcm.selector, address(opcm));
...@@ -778,18 +780,18 @@ contract DeployImplementationsInterop is DeployImplementations { ...@@ -778,18 +780,18 @@ contract DeployImplementationsInterop is DeployImplementations {
function createOPCMContract( function createOPCMContract(
DeployImplementationsInput _dii, DeployImplementationsInput _dii,
DeployImplementationsOutput _dio, DeployImplementationsOutput _dio,
OPContractsManager.Blueprints memory _blueprints, IOPContractsManager.Blueprints memory _blueprints,
string memory _l1ContractsRelease string memory _l1ContractsRelease
) )
internal internal
virtual virtual
override override
returns (OPContractsManager opcm_) returns (IOPContractsManager opcm_)
{ {
ISuperchainConfig superchainConfigProxy = _dii.superchainConfigProxy(); ISuperchainConfig superchainConfigProxy = _dii.superchainConfigProxy();
IProtocolVersions protocolVersionsProxy = _dii.protocolVersionsProxy(); IProtocolVersions protocolVersionsProxy = _dii.protocolVersionsProxy();
OPContractsManager.Implementations memory implementations = OPContractsManager.Implementations({ IOPContractsManager.Implementations memory implementations = IOPContractsManager.Implementations({
l1ERC721BridgeImpl: address(_dio.l1ERC721BridgeImpl()), l1ERC721BridgeImpl: address(_dio.l1ERC721BridgeImpl()),
optimismPortalImpl: address(_dio.optimismPortalImpl()), optimismPortalImpl: address(_dio.optimismPortalImpl()),
systemConfigImpl: address(_dio.systemConfigImpl()), systemConfigImpl: address(_dio.systemConfigImpl()),
...@@ -803,11 +805,14 @@ contract DeployImplementationsInterop is DeployImplementations { ...@@ -803,11 +805,14 @@ contract DeployImplementationsInterop is DeployImplementations {
}); });
vm.broadcast(msg.sender); vm.broadcast(msg.sender);
opcm_ = OPContractsManagerInterop( opcm_ = IOPContractsManager(
DeployUtils.createDeterministic({ DeployUtils.createDeterministic({
_name: "OPContractsManagerInterop", _name: "OPContractsManagerInterop",
_args: abi.encode( _args: DeployUtils.encodeConstructor(
superchainConfigProxy, protocolVersionsProxy, _l1ContractsRelease, _blueprints, implementations abi.encodeCall(
IOPContractsManagerInterop.__constructor__,
(superchainConfigProxy, protocolVersionsProxy, _l1ContractsRelease, _blueprints, implementations)
)
), ),
_salt: _salt _salt: _salt
}) })
......
...@@ -10,7 +10,7 @@ import { DeployUtils } from "scripts/libraries/DeployUtils.sol"; ...@@ -10,7 +10,7 @@ import { DeployUtils } from "scripts/libraries/DeployUtils.sol";
import { ISuperchainConfig } from "interfaces/L1/ISuperchainConfig.sol"; import { ISuperchainConfig } from "interfaces/L1/ISuperchainConfig.sol";
import { IProtocolVersions } from "interfaces/L1/IProtocolVersions.sol"; import { IProtocolVersions } from "interfaces/L1/IProtocolVersions.sol";
import { OPContractsManager } from "src/L1/OPContractsManager.sol"; import { IOPContractsManager } from "interfaces/L1/IOPContractsManager.sol";
contract DeployOPCMInput is BaseDeployIO { contract DeployOPCMInput is BaseDeployIO {
ISuperchainConfig internal _superchainConfig; ISuperchainConfig internal _superchainConfig;
...@@ -172,17 +172,17 @@ contract DeployOPCMInput is BaseDeployIO { ...@@ -172,17 +172,17 @@ contract DeployOPCMInput is BaseDeployIO {
} }
contract DeployOPCMOutput is BaseDeployIO { contract DeployOPCMOutput is BaseDeployIO {
OPContractsManager internal _opcm; IOPContractsManager internal _opcm;
// Setter for address type // Setter for address type
function set(bytes4 _sel, address _addr) public { function set(bytes4 _sel, address _addr) public {
require(_addr != address(0), "DeployOPCMOutput: cannot set zero address"); require(_addr != address(0), "DeployOPCMOutput: cannot set zero address");
if (_sel == this.opcm.selector) _opcm = OPContractsManager(_addr); if (_sel == this.opcm.selector) _opcm = IOPContractsManager(_addr);
else revert("DeployOPCMOutput: unknown selector"); else revert("DeployOPCMOutput: unknown selector");
} }
// Getter // Getter
function opcm() public view returns (OPContractsManager) { function opcm() public view returns (IOPContractsManager) {
require(address(_opcm) != address(0), "DeployOPCMOutput: not set"); require(address(_opcm) != address(0), "DeployOPCMOutput: not set");
return _opcm; return _opcm;
} }
...@@ -190,7 +190,7 @@ contract DeployOPCMOutput is BaseDeployIO { ...@@ -190,7 +190,7 @@ contract DeployOPCMOutput is BaseDeployIO {
contract DeployOPCM is Script { contract DeployOPCM is Script {
function run(DeployOPCMInput _doi, DeployOPCMOutput _doo) public { function run(DeployOPCMInput _doi, DeployOPCMOutput _doo) public {
OPContractsManager.Blueprints memory blueprints = OPContractsManager.Blueprints({ IOPContractsManager.Blueprints memory blueprints = IOPContractsManager.Blueprints({
addressManager: _doi.addressManagerBlueprint(), addressManager: _doi.addressManagerBlueprint(),
proxy: _doi.proxyBlueprint(), proxy: _doi.proxyBlueprint(),
proxyAdmin: _doi.proxyAdminBlueprint(), proxyAdmin: _doi.proxyAdminBlueprint(),
...@@ -201,7 +201,7 @@ contract DeployOPCM is Script { ...@@ -201,7 +201,7 @@ contract DeployOPCM is Script {
permissionlessDisputeGame1: address(0), permissionlessDisputeGame1: address(0),
permissionlessDisputeGame2: address(0) permissionlessDisputeGame2: address(0)
}); });
OPContractsManager.Implementations memory implementations = OPContractsManager.Implementations({ IOPContractsManager.Implementations memory implementations = IOPContractsManager.Implementations({
l1ERC721BridgeImpl: address(_doi.l1ERC721BridgeImpl()), l1ERC721BridgeImpl: address(_doi.l1ERC721BridgeImpl()),
optimismPortalImpl: address(_doi.optimismPortalImpl()), optimismPortalImpl: address(_doi.optimismPortalImpl()),
systemConfigImpl: address(_doi.systemConfigImpl()), systemConfigImpl: address(_doi.systemConfigImpl()),
...@@ -214,7 +214,7 @@ contract DeployOPCM is Script { ...@@ -214,7 +214,7 @@ contract DeployOPCM is Script {
mipsImpl: address(_doi.mipsImpl()) mipsImpl: address(_doi.mipsImpl())
}); });
OPContractsManager opcm_ = deployOPCM( IOPContractsManager opcm_ = deployOPCM(
_doi.superchainConfig(), _doi.protocolVersions(), blueprints, implementations, _doi.l1ContractsRelease() _doi.superchainConfig(), _doi.protocolVersions(), blueprints, implementations, _doi.l1ContractsRelease()
); );
_doo.set(_doo.opcm.selector, address(opcm_)); _doo.set(_doo.opcm.selector, address(opcm_));
...@@ -225,27 +225,36 @@ contract DeployOPCM is Script { ...@@ -225,27 +225,36 @@ contract DeployOPCM is Script {
function deployOPCM( function deployOPCM(
ISuperchainConfig _superchainConfig, ISuperchainConfig _superchainConfig,
IProtocolVersions _protocolVersions, IProtocolVersions _protocolVersions,
OPContractsManager.Blueprints memory _blueprints, IOPContractsManager.Blueprints memory _blueprints,
OPContractsManager.Implementations memory _implementations, IOPContractsManager.Implementations memory _implementations,
string memory _l1ContractsRelease string memory _l1ContractsRelease
) )
public public
returns (OPContractsManager opcm_) returns (IOPContractsManager opcm_)
{ {
vm.broadcast(msg.sender); vm.broadcast(msg.sender);
opcm_ = new OPContractsManager( opcm_ = IOPContractsManager(
_superchainConfig, _protocolVersions, _l1ContractsRelease, _blueprints, _implementations DeployUtils.createDeterministic({
_name: "OPContractsManager",
_args: DeployUtils.encodeConstructor(
abi.encodeCall(
IOPContractsManager.__constructor__,
(_superchainConfig, _protocolVersions, _l1ContractsRelease, _blueprints, _implementations)
)
),
_salt: DeployUtils.DEFAULT_SALT
})
); );
vm.label(address(opcm_), "OPContractsManager"); vm.label(address(opcm_), "OPContractsManager");
} }
function assertValidOpcm(DeployOPCMInput _doi, DeployOPCMOutput _doo) public view { function assertValidOpcm(DeployOPCMInput _doi, DeployOPCMOutput _doo) public view {
OPContractsManager impl = OPContractsManager(address(_doo.opcm())); IOPContractsManager impl = IOPContractsManager(address(_doo.opcm()));
require(address(impl.superchainConfig()) == address(_doi.superchainConfig()), "OPCMI-10"); require(address(impl.superchainConfig()) == address(_doi.superchainConfig()), "OPCMI-10");
require(address(impl.protocolVersions()) == address(_doi.protocolVersions()), "OPCMI-20"); require(address(impl.protocolVersions()) == address(_doi.protocolVersions()), "OPCMI-20");
require(LibString.eq(impl.l1ContractsRelease(), _doi.l1ContractsRelease()), "OPCMI-30"); require(LibString.eq(impl.l1ContractsRelease(), _doi.l1ContractsRelease()), "OPCMI-30");
OPContractsManager.Blueprints memory blueprints = impl.blueprints(); IOPContractsManager.Blueprints memory blueprints = impl.blueprints();
require(blueprints.addressManager == _doi.addressManagerBlueprint(), "OPCMI-40"); require(blueprints.addressManager == _doi.addressManagerBlueprint(), "OPCMI-40");
require(blueprints.proxy == _doi.proxyBlueprint(), "OPCMI-50"); require(blueprints.proxy == _doi.proxyBlueprint(), "OPCMI-50");
require(blueprints.proxyAdmin == _doi.proxyAdminBlueprint(), "OPCMI-60"); require(blueprints.proxyAdmin == _doi.proxyAdminBlueprint(), "OPCMI-60");
...@@ -254,7 +263,7 @@ contract DeployOPCM is Script { ...@@ -254,7 +263,7 @@ contract DeployOPCM is Script {
require(blueprints.permissionedDisputeGame1 == _doi.permissionedDisputeGame1Blueprint(), "OPCMI-100"); require(blueprints.permissionedDisputeGame1 == _doi.permissionedDisputeGame1Blueprint(), "OPCMI-100");
require(blueprints.permissionedDisputeGame2 == _doi.permissionedDisputeGame2Blueprint(), "OPCMI-110"); require(blueprints.permissionedDisputeGame2 == _doi.permissionedDisputeGame2Blueprint(), "OPCMI-110");
OPContractsManager.Implementations memory implementations = impl.implementations(); IOPContractsManager.Implementations memory implementations = impl.implementations();
require(implementations.l1ERC721BridgeImpl == _doi.l1ERC721BridgeImpl(), "OPCMI-120"); require(implementations.l1ERC721BridgeImpl == _doi.l1ERC721BridgeImpl(), "OPCMI-120");
require(implementations.optimismPortalImpl == _doi.optimismPortalImpl(), "OPCMI-130"); require(implementations.optimismPortalImpl == _doi.optimismPortalImpl(), "OPCMI-130");
require(implementations.systemConfigImpl == _doi.systemConfigImpl(), "OPCMI-140"); require(implementations.systemConfigImpl == _doi.systemConfigImpl(), "OPCMI-140");
......
...@@ -18,7 +18,7 @@ import { Constants as ScriptConstants } from "scripts/libraries/Constants.sol"; ...@@ -18,7 +18,7 @@ import { Constants as ScriptConstants } from "scripts/libraries/Constants.sol";
import { IProxyAdmin } from "interfaces/universal/IProxyAdmin.sol"; import { IProxyAdmin } from "interfaces/universal/IProxyAdmin.sol";
import { IProxy } from "interfaces/universal/IProxy.sol"; import { IProxy } from "interfaces/universal/IProxy.sol";
import { IOPContractsManager } from "interfaces/L1/IOPContractsManager.sol";
import { IAddressManager } from "interfaces/legacy/IAddressManager.sol"; import { IAddressManager } from "interfaces/legacy/IAddressManager.sol";
import { IDelayedWETH } from "interfaces/dispute/IDelayedWETH.sol"; import { IDelayedWETH } from "interfaces/dispute/IDelayedWETH.sol";
import { IDisputeGameFactory } from "interfaces/dispute/IDisputeGameFactory.sol"; import { IDisputeGameFactory } from "interfaces/dispute/IDisputeGameFactory.sol";
...@@ -27,7 +27,6 @@ import { IFaultDisputeGame } from "interfaces/dispute/IFaultDisputeGame.sol"; ...@@ -27,7 +27,6 @@ import { IFaultDisputeGame } from "interfaces/dispute/IFaultDisputeGame.sol";
import { IPermissionedDisputeGame } from "interfaces/dispute/IPermissionedDisputeGame.sol"; import { IPermissionedDisputeGame } from "interfaces/dispute/IPermissionedDisputeGame.sol";
import { Claim, Duration, GameType, GameTypes, Hash } from "src/dispute/lib/Types.sol"; import { Claim, Duration, GameType, GameTypes, Hash } from "src/dispute/lib/Types.sol";
import { OPContractsManager } from "src/L1/OPContractsManager.sol";
import { IOptimismPortal2 } from "interfaces/L1/IOptimismPortal2.sol"; import { IOptimismPortal2 } from "interfaces/L1/IOptimismPortal2.sol";
import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol"; import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol";
import { IL1CrossDomainMessenger } from "interfaces/L1/IL1CrossDomainMessenger.sol"; import { IL1CrossDomainMessenger } from "interfaces/L1/IL1CrossDomainMessenger.sol";
...@@ -47,7 +46,7 @@ contract DeployOPChainInput is BaseDeployIO { ...@@ -47,7 +46,7 @@ contract DeployOPChainInput is BaseDeployIO {
uint32 internal _basefeeScalar; uint32 internal _basefeeScalar;
uint32 internal _blobBaseFeeScalar; uint32 internal _blobBaseFeeScalar;
uint256 internal _l2ChainId; uint256 internal _l2ChainId;
OPContractsManager internal _opcm; IOPContractsManager internal _opcm;
string internal _saltMixer; string internal _saltMixer;
uint64 internal _gasLimit; uint64 internal _gasLimit;
...@@ -68,7 +67,7 @@ contract DeployOPChainInput is BaseDeployIO { ...@@ -68,7 +67,7 @@ contract DeployOPChainInput is BaseDeployIO {
else if (_sel == this.unsafeBlockSigner.selector) _unsafeBlockSigner = _addr; else if (_sel == this.unsafeBlockSigner.selector) _unsafeBlockSigner = _addr;
else if (_sel == this.proposer.selector) _proposer = _addr; else if (_sel == this.proposer.selector) _proposer = _addr;
else if (_sel == this.challenger.selector) _challenger = _addr; else if (_sel == this.challenger.selector) _challenger = _addr;
else if (_sel == this.opcm.selector) _opcm = OPContractsManager(_addr); else if (_sel == this.opcm.selector) _opcm = IOPContractsManager(_addr);
else revert("DeployOPChainInput: unknown selector"); else revert("DeployOPChainInput: unknown selector");
} }
...@@ -174,7 +173,7 @@ contract DeployOPChainInput is BaseDeployIO { ...@@ -174,7 +173,7 @@ contract DeployOPChainInput is BaseDeployIO {
return abi.encode(ScriptConstants.DEFAULT_OUTPUT_ROOT()); return abi.encode(ScriptConstants.DEFAULT_OUTPUT_ROOT());
} }
function opcm() public view returns (OPContractsManager) { function opcm() public view returns (IOPContractsManager) {
require(address(_opcm) != address(0), "DeployOPChainInput: not set"); require(address(_opcm) != address(0), "DeployOPChainInput: not set");
DeployUtils.assertValidContractAddress(address(_opcm)); DeployUtils.assertValidContractAddress(address(_opcm));
return _opcm; return _opcm;
...@@ -339,9 +338,9 @@ contract DeployOPChain is Script { ...@@ -339,9 +338,9 @@ contract DeployOPChain is Script {
// -------- Core Deployment Methods -------- // -------- Core Deployment Methods --------
function run(DeployOPChainInput _doi, DeployOPChainOutput _doo) public { function run(DeployOPChainInput _doi, DeployOPChainOutput _doo) public {
OPContractsManager opcm = _doi.opcm(); IOPContractsManager opcm = _doi.opcm();
OPContractsManager.Roles memory roles = OPContractsManager.Roles({ IOPContractsManager.Roles memory roles = IOPContractsManager.Roles({
opChainProxyAdminOwner: _doi.opChainProxyAdminOwner(), opChainProxyAdminOwner: _doi.opChainProxyAdminOwner(),
systemConfigOwner: _doi.systemConfigOwner(), systemConfigOwner: _doi.systemConfigOwner(),
batcher: _doi.batcher(), batcher: _doi.batcher(),
...@@ -349,7 +348,7 @@ contract DeployOPChain is Script { ...@@ -349,7 +348,7 @@ contract DeployOPChain is Script {
proposer: _doi.proposer(), proposer: _doi.proposer(),
challenger: _doi.challenger() challenger: _doi.challenger()
}); });
OPContractsManager.DeployInput memory deployInput = OPContractsManager.DeployInput({ IOPContractsManager.DeployInput memory deployInput = IOPContractsManager.DeployInput({
roles: roles, roles: roles,
basefeeScalar: _doi.basefeeScalar(), basefeeScalar: _doi.basefeeScalar(),
blobBasefeeScalar: _doi.blobBaseFeeScalar(), blobBasefeeScalar: _doi.blobBaseFeeScalar(),
...@@ -366,7 +365,7 @@ contract DeployOPChain is Script { ...@@ -366,7 +365,7 @@ contract DeployOPChain is Script {
}); });
vm.broadcast(msg.sender); vm.broadcast(msg.sender);
OPContractsManager.DeployOutput memory deployOutput = opcm.deploy(deployInput); IOPContractsManager.DeployOutput memory deployOutput = opcm.deploy(deployInput);
vm.label(address(deployOutput.opChainProxyAdmin), "opChainProxyAdmin"); vm.label(address(deployOutput.opChainProxyAdmin), "opChainProxyAdmin");
vm.label(address(deployOutput.addressManager), "addressManager"); vm.label(address(deployOutput.addressManager), "addressManager");
...@@ -468,7 +467,7 @@ contract DeployOPChain is Script { ...@@ -468,7 +467,7 @@ contract DeployOPChain is Script {
"DPG-20" "DPG-20"
); );
OPContractsManager opcm = _doi.opcm(); IOPContractsManager opcm = _doi.opcm();
address mipsImpl = opcm.implementations().mipsImpl; address mipsImpl = opcm.implementations().mipsImpl;
require(game.vm() == IBigStepper(mipsImpl), "DPG-30"); require(game.vm() == IBigStepper(mipsImpl), "DPG-30");
......
...@@ -7,21 +7,21 @@ import { Script } from "forge-std/Script.sol"; ...@@ -7,21 +7,21 @@ import { Script } from "forge-std/Script.sol";
import { DeployUtils } from "scripts/libraries/DeployUtils.sol"; import { DeployUtils } from "scripts/libraries/DeployUtils.sol";
import { DeployOPChainOutput } from "scripts/deploy/DeployOPChain.s.sol"; import { DeployOPChainOutput } from "scripts/deploy/DeployOPChain.s.sol";
import { IMIPS } from "interfaces/cannon/IMIPS.sol"; import { IMIPS } from "interfaces/cannon/IMIPS.sol";
import { OPContractsManager } from "src/L1/OPContractsManager.sol"; import { IOPContractsManager } from "interfaces/L1/IOPContractsManager.sol";
import { IAddressManager } from "interfaces/legacy/IAddressManager.sol"; import { IAddressManager } from "interfaces/legacy/IAddressManager.sol";
import { IStaticL1ChugSplashProxy } from "interfaces/legacy/IL1ChugSplashProxy.sol"; import { IStaticL1ChugSplashProxy } from "interfaces/legacy/IL1ChugSplashProxy.sol";
contract ReadImplementationAddressesInput is DeployOPChainOutput { contract ReadImplementationAddressesInput is DeployOPChainOutput {
OPContractsManager internal _opcm; IOPContractsManager internal _opcm;
function set(bytes4 _sel, address _addr) public override { function set(bytes4 _sel, address _addr) public override {
require(_addr != address(0), "ReadImplementationAddressesInput: cannot set zero address"); require(_addr != address(0), "ReadImplementationAddressesInput: cannot set zero address");
if (_sel == this.opcm.selector) _opcm = OPContractsManager(_addr); if (_sel == this.opcm.selector) _opcm = IOPContractsManager(_addr);
else if (_sel == this.addressManager.selector) _addressManager = IAddressManager(_addr); else if (_sel == this.addressManager.selector) _addressManager = IAddressManager(_addr);
else super.set(_sel, _addr); else super.set(_sel, _addr);
} }
function opcm() public view returns (OPContractsManager) { function opcm() public view returns (IOPContractsManager) {
DeployUtils.assertValidContractAddress(address(_opcm)); DeployUtils.assertValidContractAddress(address(_opcm));
return _opcm; return _opcm;
} }
......
...@@ -9,6 +9,7 @@ import { DelegateCaller } from "test/mocks/Callers.sol"; ...@@ -9,6 +9,7 @@ import { DelegateCaller } from "test/mocks/Callers.sol";
// Scripts // Scripts
import { DeployOPChainInput } from "scripts/deploy/DeployOPChain.s.sol"; import { DeployOPChainInput } from "scripts/deploy/DeployOPChain.s.sol";
import { DeployUtils } from "scripts/libraries/DeployUtils.sol";
// Libraries // Libraries
import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol";
...@@ -24,6 +25,7 @@ import { IPermissionedDisputeGame } from "interfaces/dispute/IPermissionedDisput ...@@ -24,6 +25,7 @@ import { IPermissionedDisputeGame } from "interfaces/dispute/IPermissionedDisput
import { IDelayedWETH } from "interfaces/dispute/IDelayedWETH.sol"; import { IDelayedWETH } from "interfaces/dispute/IDelayedWETH.sol";
import { IFaultDisputeGame } from "interfaces/dispute/IFaultDisputeGame.sol"; import { IFaultDisputeGame } from "interfaces/dispute/IFaultDisputeGame.sol";
import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol"; import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol";
import { IOPContractsManager } from "interfaces/L1/IOPContractsManager.sol";
// Contracts // Contracts
import { OPContractsManager } from "src/L1/OPContractsManager.sol"; import { OPContractsManager } from "src/L1/OPContractsManager.sol";
...@@ -97,9 +99,13 @@ contract OPContractsManager_Deploy_Test is DeployOPChain_TestBase { ...@@ -97,9 +99,13 @@ contract OPContractsManager_Deploy_Test is DeployOPChain_TestBase {
// This helper function is used to convert the input struct type defined in DeployOPChain.s.sol // This helper function is used to convert the input struct type defined in DeployOPChain.s.sol
// to the input struct type defined in OPContractsManager.sol. // to the input struct type defined in OPContractsManager.sol.
function toOPCMDeployInput(DeployOPChainInput _doi) internal view returns (OPContractsManager.DeployInput memory) { function toOPCMDeployInput(DeployOPChainInput _doi)
return OPContractsManager.DeployInput({ internal
roles: OPContractsManager.Roles({ view
returns (IOPContractsManager.DeployInput memory)
{
return IOPContractsManager.DeployInput({
roles: IOPContractsManager.Roles({
opChainProxyAdminOwner: _doi.opChainProxyAdminOwner(), opChainProxyAdminOwner: _doi.opChainProxyAdminOwner(),
systemConfigOwner: _doi.systemConfigOwner(), systemConfigOwner: _doi.systemConfigOwner(),
batcher: _doi.batcher(), batcher: _doi.batcher(),
...@@ -123,17 +129,17 @@ contract OPContractsManager_Deploy_Test is DeployOPChain_TestBase { ...@@ -123,17 +129,17 @@ contract OPContractsManager_Deploy_Test is DeployOPChain_TestBase {
} }
function test_deploy_l2ChainIdEqualsZero_reverts() public { function test_deploy_l2ChainIdEqualsZero_reverts() public {
OPContractsManager.DeployInput memory deployInput = toOPCMDeployInput(doi); IOPContractsManager.DeployInput memory deployInput = toOPCMDeployInput(doi);
deployInput.l2ChainId = 0; deployInput.l2ChainId = 0;
vm.expectRevert(OPContractsManager.InvalidChainId.selector); vm.expectRevert(IOPContractsManager.InvalidChainId.selector);
opcm.deploy(deployInput); opcm.deploy(deployInput);
} }
function test_deploy_l2ChainIdEqualsCurrentChainId_reverts() public { function test_deploy_l2ChainIdEqualsCurrentChainId_reverts() public {
OPContractsManager.DeployInput memory deployInput = toOPCMDeployInput(doi); IOPContractsManager.DeployInput memory deployInput = toOPCMDeployInput(doi);
deployInput.l2ChainId = block.chainid; deployInput.l2ChainId = block.chainid;
vm.expectRevert(OPContractsManager.InvalidChainId.selector); vm.expectRevert(IOPContractsManager.InvalidChainId.selector);
opcm.deploy(deployInput); opcm.deploy(deployInput);
} }
...@@ -194,7 +200,7 @@ contract OPContractsManager_Upgrade_Harness is CommonTest { ...@@ -194,7 +200,7 @@ contract OPContractsManager_Upgrade_Harness is CommonTest {
uint256 l2ChainId; uint256 l2ChainId;
IProxyAdmin proxyAdmin; IProxyAdmin proxyAdmin;
address upgrader; address upgrader;
OPContractsManager.OpChain[] opChains; IOPContractsManager.OpChain[] opChains;
function setUp() public virtual override { function setUp() public virtual override {
super.disableUpgradedFork(); super.disableUpgradedFork();
...@@ -208,7 +214,7 @@ contract OPContractsManager_Upgrade_Harness is CommonTest { ...@@ -208,7 +214,7 @@ contract OPContractsManager_Upgrade_Harness is CommonTest {
upgrader = proxyAdmin.owner(); upgrader = proxyAdmin.owner();
vm.label(upgrader, "ProxyAdmin Owner"); vm.label(upgrader, "ProxyAdmin Owner");
opChains.push(OPContractsManager.OpChain({ systemConfigProxy: systemConfig, proxyAdmin: proxyAdmin })); opChains.push(IOPContractsManager.OpChain({ systemConfigProxy: systemConfig, proxyAdmin: proxyAdmin }));
// Retrieve the l2ChainId, which was read from the superchain-registry, and saved in Artifacts // Retrieve the l2ChainId, which was read from the superchain-registry, and saved in Artifacts
// encoded as an address. // encoded as an address.
...@@ -225,7 +231,7 @@ contract OPContractsManager_Upgrade_Harness is CommonTest { ...@@ -225,7 +231,7 @@ contract OPContractsManager_Upgrade_Harness is CommonTest {
contract OPContractsManager_Upgrade_Test is OPContractsManager_Upgrade_Harness { contract OPContractsManager_Upgrade_Test is OPContractsManager_Upgrade_Harness {
function test_upgrade_succeeds() public { function test_upgrade_succeeds() public {
vm.etch(upgrader, vm.getDeployedCode("test/mocks/Callers.sol:DelegateCaller")); vm.etch(upgrader, vm.getDeployedCode("test/mocks/Callers.sol:DelegateCaller"));
OPContractsManager.Implementations memory impls = opcm.implementations(); IOPContractsManager.Implementations memory impls = opcm.implementations();
address oldL1CrossDomainMessenger = addressManager.getAddress("OVM_L1CrossDomainMessenger"); address oldL1CrossDomainMessenger = addressManager.getAddress("OVM_L1CrossDomainMessenger");
expectEmitUpgraded(impls.systemConfigImpl, address(systemConfig)); expectEmitUpgraded(impls.systemConfigImpl, address(systemConfig));
...@@ -244,7 +250,7 @@ contract OPContractsManager_Upgrade_Test is OPContractsManager_Upgrade_Harness { ...@@ -244,7 +250,7 @@ contract OPContractsManager_Upgrade_Test is OPContractsManager_Upgrade_Harness {
} }
vm.expectEmit(true, true, true, true, address(upgrader)); vm.expectEmit(true, true, true, true, address(upgrader));
emit Upgraded(l2ChainId, opChains[0].systemConfigProxy, address(upgrader)); emit Upgraded(l2ChainId, opChains[0].systemConfigProxy, address(upgrader));
DelegateCaller(upgrader).dcForward(address(opcm), abi.encodeCall(OPContractsManager.upgrade, (opChains))); DelegateCaller(upgrader).dcForward(address(opcm), abi.encodeCall(IOPContractsManager.upgrade, (opChains)));
assertEq(impls.systemConfigImpl, EIP1967Helper.getImplementation(address(systemConfig))); assertEq(impls.systemConfigImpl, EIP1967Helper.getImplementation(address(systemConfig)));
assertEq(impls.l1ERC721BridgeImpl, EIP1967Helper.getImplementation(address(l1ERC721Bridge))); assertEq(impls.l1ERC721BridgeImpl, EIP1967Helper.getImplementation(address(l1ERC721Bridge)));
...@@ -275,7 +281,7 @@ contract OPContractsManager_Upgrade_Test is OPContractsManager_Upgrade_Harness { ...@@ -275,7 +281,7 @@ contract OPContractsManager_Upgrade_Test is OPContractsManager_Upgrade_Harness {
contract OPContractsManager_Upgrade_TestFails is OPContractsManager_Upgrade_Harness { contract OPContractsManager_Upgrade_TestFails is OPContractsManager_Upgrade_Harness {
function test_upgrade_notDelegateCalled_reverts() public { function test_upgrade_notDelegateCalled_reverts() public {
vm.prank(upgrader); vm.prank(upgrader);
vm.expectRevert(OPContractsManager.OnlyDelegatecall.selector); vm.expectRevert(IOPContractsManager.OnlyDelegatecall.selector);
opcm.upgrade(opChains); opcm.upgrade(opChains);
} }
...@@ -289,22 +295,22 @@ contract OPContractsManager_Upgrade_TestFails is OPContractsManager_Upgrade_Harn ...@@ -289,22 +295,22 @@ contract OPContractsManager_Upgrade_TestFails is OPContractsManager_Upgrade_Harn
); );
vm.expectRevert( vm.expectRevert(
abi.encodeWithSelector(OPContractsManager.SuperchainConfigMismatch.selector, address(systemConfig)) abi.encodeWithSelector(IOPContractsManager.SuperchainConfigMismatch.selector, address(systemConfig))
); );
DelegateCaller(upgrader).dcForward(address(opcm), abi.encodeCall(OPContractsManager.upgrade, (opChains))); DelegateCaller(upgrader).dcForward(address(opcm), abi.encodeCall(IOPContractsManager.upgrade, (opChains)));
} }
} }
contract OPContractsManager_AddGameType_Test is Test { contract OPContractsManager_AddGameType_Test is Test {
OPContractsManager internal opcm; IOPContractsManager internal opcm;
OPContractsManager.DeployOutput internal chainDeployOutput; IOPContractsManager.DeployOutput internal chainDeployOutput;
function setUp() public { function setUp() public {
ISuperchainConfig superchainConfigProxy = ISuperchainConfig(makeAddr("superchainConfig")); ISuperchainConfig superchainConfigProxy = ISuperchainConfig(makeAddr("superchainConfig"));
IProtocolVersions protocolVersionsProxy = IProtocolVersions(makeAddr("protocolVersions")); IProtocolVersions protocolVersionsProxy = IProtocolVersions(makeAddr("protocolVersions"));
bytes32 salt = hex"01"; bytes32 salt = hex"01";
OPContractsManager.Blueprints memory blueprints; IOPContractsManager.Blueprints memory blueprints;
(blueprints.addressManager,) = Blueprint.create(vm.getCode("AddressManager"), salt); (blueprints.addressManager,) = Blueprint.create(vm.getCode("AddressManager"), salt);
(blueprints.proxy,) = Blueprint.create(vm.getCode("Proxy"), salt); (blueprints.proxy,) = Blueprint.create(vm.getCode("Proxy"), salt);
(blueprints.proxyAdmin,) = Blueprint.create(vm.getCode("ProxyAdmin"), salt); (blueprints.proxyAdmin,) = Blueprint.create(vm.getCode("ProxyAdmin"), salt);
...@@ -317,7 +323,7 @@ contract OPContractsManager_AddGameType_Test is Test { ...@@ -317,7 +323,7 @@ contract OPContractsManager_AddGameType_Test is Test {
IPreimageOracle oracle = IPreimageOracle(address(new PreimageOracle(126000, 86400))); IPreimageOracle oracle = IPreimageOracle(address(new PreimageOracle(126000, 86400)));
OPContractsManager.Implementations memory impls = OPContractsManager.Implementations({ IOPContractsManager.Implementations memory impls = IOPContractsManager.Implementations({
l1ERC721BridgeImpl: address(new L1ERC721Bridge()), l1ERC721BridgeImpl: address(new L1ERC721Bridge()),
optimismPortalImpl: address(new OptimismPortal2(1, 1)), optimismPortalImpl: address(new OptimismPortal2(1, 1)),
systemConfigImpl: address(new SystemConfig()), systemConfigImpl: address(new SystemConfig()),
...@@ -333,11 +339,22 @@ contract OPContractsManager_AddGameType_Test is Test { ...@@ -333,11 +339,22 @@ contract OPContractsManager_AddGameType_Test is Test {
vm.etch(address(superchainConfigProxy), hex"01"); vm.etch(address(superchainConfigProxy), hex"01");
vm.etch(address(protocolVersionsProxy), hex"01"); vm.etch(address(protocolVersionsProxy), hex"01");
opcm = new OPContractsManager(superchainConfigProxy, protocolVersionsProxy, "dev", blueprints, impls); opcm = IOPContractsManager(
DeployUtils.createDeterministic({
_name: "OPContractsManager",
_args: DeployUtils.encodeConstructor(
abi.encodeCall(
IOPContractsManager.__constructor__,
(superchainConfigProxy, protocolVersionsProxy, "dev", blueprints, impls)
)
),
_salt: DeployUtils.DEFAULT_SALT
})
);
chainDeployOutput = opcm.deploy( chainDeployOutput = opcm.deploy(
OPContractsManager.DeployInput({ IOPContractsManager.DeployInput({
roles: OPContractsManager.Roles({ roles: IOPContractsManager.Roles({
opChainProxyAdminOwner: address(this), opChainProxyAdminOwner: address(this),
systemConfigOwner: address(this), systemConfigOwner: address(this),
batcher: address(this), batcher: address(this),
...@@ -364,8 +381,8 @@ contract OPContractsManager_AddGameType_Test is Test { ...@@ -364,8 +381,8 @@ contract OPContractsManager_AddGameType_Test is Test {
} }
function test_addGameType_permissioned_succeeds() public { function test_addGameType_permissioned_succeeds() public {
OPContractsManager.AddGameInput memory input = newGameInputFactory(true); IOPContractsManager.AddGameInput memory input = newGameInputFactory(true);
OPContractsManager.AddGameOutput memory output = addGameType(input); IOPContractsManager.AddGameOutput memory output = addGameType(input);
assertValidGameType(input, output); assertValidGameType(input, output);
IPermissionedDisputeGame newPDG = IPermissionedDisputeGame(address(output.faultDisputeGame)); IPermissionedDisputeGame newPDG = IPermissionedDisputeGame(address(output.faultDisputeGame));
IPermissionedDisputeGame oldPDG = chainDeployOutput.permissionedDisputeGame; IPermissionedDisputeGame oldPDG = chainDeployOutput.permissionedDisputeGame;
...@@ -374,8 +391,8 @@ contract OPContractsManager_AddGameType_Test is Test { ...@@ -374,8 +391,8 @@ contract OPContractsManager_AddGameType_Test is Test {
} }
function test_addGameType_permissionless_succeeds() public { function test_addGameType_permissionless_succeeds() public {
OPContractsManager.AddGameInput memory input = newGameInputFactory(false); IOPContractsManager.AddGameInput memory input = newGameInputFactory(false);
OPContractsManager.AddGameOutput memory output = addGameType(input); IOPContractsManager.AddGameOutput memory output = addGameType(input);
assertValidGameType(input, output); assertValidGameType(input, output);
IPermissionedDisputeGame notPDG = IPermissionedDisputeGame(address(output.faultDisputeGame)); IPermissionedDisputeGame notPDG = IPermissionedDisputeGame(address(output.faultDisputeGame));
vm.expectRevert(); // nosemgrep: sol-safety-expectrevert-no-args vm.expectRevert(); // nosemgrep: sol-safety-expectrevert-no-args
...@@ -385,76 +402,76 @@ contract OPContractsManager_AddGameType_Test is Test { ...@@ -385,76 +402,76 @@ contract OPContractsManager_AddGameType_Test is Test {
function test_addGameType_reusedDelayedWETH_succeeds() public { function test_addGameType_reusedDelayedWETH_succeeds() public {
IDelayedWETH delayedWETH = IDelayedWETH(payable(address(new DelayedWETH(1)))); IDelayedWETH delayedWETH = IDelayedWETH(payable(address(new DelayedWETH(1))));
vm.etch(address(delayedWETH), hex"01"); vm.etch(address(delayedWETH), hex"01");
OPContractsManager.AddGameInput memory input = newGameInputFactory(false); IOPContractsManager.AddGameInput memory input = newGameInputFactory(false);
input.delayedWETH = delayedWETH; input.delayedWETH = delayedWETH;
OPContractsManager.AddGameOutput memory output = addGameType(input); IOPContractsManager.AddGameOutput memory output = addGameType(input);
assertValidGameType(input, output); assertValidGameType(input, output);
assertEq(address(output.delayedWETH), address(delayedWETH), "delayedWETH address mismatch"); assertEq(address(output.delayedWETH), address(delayedWETH), "delayedWETH address mismatch");
} }
function test_addGameType_outOfOrderInputs_reverts() public { function test_addGameType_outOfOrderInputs_reverts() public {
OPContractsManager.AddGameInput memory input1 = newGameInputFactory(false); IOPContractsManager.AddGameInput memory input1 = newGameInputFactory(false);
input1.disputeGameType = GameType.wrap(2); input1.disputeGameType = GameType.wrap(2);
OPContractsManager.AddGameInput memory input2 = newGameInputFactory(false); IOPContractsManager.AddGameInput memory input2 = newGameInputFactory(false);
input2.disputeGameType = GameType.wrap(1); input2.disputeGameType = GameType.wrap(1);
OPContractsManager.AddGameInput[] memory inputs = new OPContractsManager.AddGameInput[](2); IOPContractsManager.AddGameInput[] memory inputs = new IOPContractsManager.AddGameInput[](2);
inputs[0] = input1; inputs[0] = input1;
inputs[1] = input2; inputs[1] = input2;
// For the sake of completeness, we run the call again to validate the success behavior. // For the sake of completeness, we run the call again to validate the success behavior.
(bool success,) = address(opcm).delegatecall(abi.encodeCall(OPContractsManager.addGameType, (inputs))); (bool success,) = address(opcm).delegatecall(abi.encodeCall(IOPContractsManager.addGameType, (inputs)));
assertFalse(success, "addGameType should have failed"); assertFalse(success, "addGameType should have failed");
} }
function test_addGameType_duplicateGameType_reverts() public { function test_addGameType_duplicateGameType_reverts() public {
OPContractsManager.AddGameInput memory input = newGameInputFactory(false); IOPContractsManager.AddGameInput memory input = newGameInputFactory(false);
OPContractsManager.AddGameInput[] memory inputs = new OPContractsManager.AddGameInput[](2); IOPContractsManager.AddGameInput[] memory inputs = new IOPContractsManager.AddGameInput[](2);
inputs[0] = input; inputs[0] = input;
inputs[1] = input; inputs[1] = input;
// See test above for why we run the call twice. // See test above for why we run the call twice.
(bool success, bytes memory revertData) = (bool success, bytes memory revertData) =
address(opcm).delegatecall(abi.encodeCall(OPContractsManager.addGameType, (inputs))); address(opcm).delegatecall(abi.encodeCall(IOPContractsManager.addGameType, (inputs)));
assertFalse(success, "addGameType should have failed"); assertFalse(success, "addGameType should have failed");
assertEq(bytes4(revertData), OPContractsManager.InvalidGameConfigs.selector, "revertData mismatch"); assertEq(bytes4(revertData), IOPContractsManager.InvalidGameConfigs.selector, "revertData mismatch");
} }
function test_addGameType_zeroLengthInput_reverts() public { function test_addGameType_zeroLengthInput_reverts() public {
OPContractsManager.AddGameInput[] memory inputs = new OPContractsManager.AddGameInput[](0); IOPContractsManager.AddGameInput[] memory inputs = new IOPContractsManager.AddGameInput[](0);
(bool success, bytes memory revertData) = (bool success, bytes memory revertData) =
address(opcm).delegatecall(abi.encodeCall(OPContractsManager.addGameType, (inputs))); address(opcm).delegatecall(abi.encodeCall(IOPContractsManager.addGameType, (inputs)));
assertFalse(success, "addGameType should have failed"); assertFalse(success, "addGameType should have failed");
assertEq(bytes4(revertData), OPContractsManager.InvalidGameConfigs.selector, "revertData mismatch"); assertEq(bytes4(revertData), IOPContractsManager.InvalidGameConfigs.selector, "revertData mismatch");
} }
function test_addGameType_notDelegateCall_reverts() public { function test_addGameType_notDelegateCall_reverts() public {
OPContractsManager.AddGameInput memory input = newGameInputFactory(true); IOPContractsManager.AddGameInput memory input = newGameInputFactory(true);
OPContractsManager.AddGameInput[] memory inputs = new OPContractsManager.AddGameInput[](1); IOPContractsManager.AddGameInput[] memory inputs = new IOPContractsManager.AddGameInput[](1);
inputs[0] = input; inputs[0] = input;
vm.expectRevert(OPContractsManager.OnlyDelegatecall.selector); vm.expectRevert(IOPContractsManager.OnlyDelegatecall.selector);
opcm.addGameType(inputs); opcm.addGameType(inputs);
} }
function addGameType(OPContractsManager.AddGameInput memory input) function addGameType(IOPContractsManager.AddGameInput memory input)
internal internal
returns (OPContractsManager.AddGameOutput memory) returns (IOPContractsManager.AddGameOutput memory)
{ {
OPContractsManager.AddGameInput[] memory inputs = new OPContractsManager.AddGameInput[](1); IOPContractsManager.AddGameInput[] memory inputs = new IOPContractsManager.AddGameInput[](1);
inputs[0] = input; inputs[0] = input;
(bool success, bytes memory rawGameOut) = (bool success, bytes memory rawGameOut) =
address(opcm).delegatecall(abi.encodeCall(OPContractsManager.addGameType, (inputs))); address(opcm).delegatecall(abi.encodeCall(IOPContractsManager.addGameType, (inputs)));
assertTrue(success, "addGameType failed"); assertTrue(success, "addGameType failed");
OPContractsManager.AddGameOutput[] memory addGameOutAll = IOPContractsManager.AddGameOutput[] memory addGameOutAll =
abi.decode(rawGameOut, (OPContractsManager.AddGameOutput[])); abi.decode(rawGameOut, (IOPContractsManager.AddGameOutput[]));
return addGameOutAll[0]; return addGameOutAll[0];
} }
function newGameInputFactory(bool permissioned) internal view returns (OPContractsManager.AddGameInput memory) { function newGameInputFactory(bool permissioned) internal view returns (IOPContractsManager.AddGameInput memory) {
return OPContractsManager.AddGameInput({ return IOPContractsManager.AddGameInput({
saltMixer: "hello", saltMixer: "hello",
systemConfig: chainDeployOutput.systemConfigProxy, systemConfig: chainDeployOutput.systemConfigProxy,
proxyAdmin: chainDeployOutput.opChainProxyAdmin, proxyAdmin: chainDeployOutput.opChainProxyAdmin,
...@@ -472,8 +489,8 @@ contract OPContractsManager_AddGameType_Test is Test { ...@@ -472,8 +489,8 @@ contract OPContractsManager_AddGameType_Test is Test {
} }
function assertValidGameType( function assertValidGameType(
OPContractsManager.AddGameInput memory agi, IOPContractsManager.AddGameInput memory agi,
OPContractsManager.AddGameOutput memory ago IOPContractsManager.AddGameOutput memory ago
) )
internal internal
view view
......
...@@ -12,7 +12,7 @@ import { IAnchorStateRegistry } from "interfaces/dispute/IAnchorStateRegistry.so ...@@ -12,7 +12,7 @@ import { IAnchorStateRegistry } from "interfaces/dispute/IAnchorStateRegistry.so
import { ISuperchainConfig } from "interfaces/L1/ISuperchainConfig.sol"; import { ISuperchainConfig } from "interfaces/L1/ISuperchainConfig.sol";
import { IProtocolVersions } from "interfaces/L1/IProtocolVersions.sol"; import { IProtocolVersions } from "interfaces/L1/IProtocolVersions.sol";
import { OPContractsManager } from "src/L1/OPContractsManager.sol"; import { IOPContractsManager } from "interfaces/L1/IOPContractsManager.sol";
import { IOptimismPortal2 } from "interfaces/L1/IOptimismPortal2.sol"; import { IOptimismPortal2 } from "interfaces/L1/IOptimismPortal2.sol";
import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol"; import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol";
import { IL1CrossDomainMessenger } from "interfaces/L1/IL1CrossDomainMessenger.sol"; import { IL1CrossDomainMessenger } from "interfaces/L1/IL1CrossDomainMessenger.sol";
...@@ -80,7 +80,7 @@ contract DeployImplementationsOutput_Test is Test { ...@@ -80,7 +80,7 @@ contract DeployImplementationsOutput_Test is Test {
} }
function test_set_succeeds() public { function test_set_succeeds() public {
OPContractsManager opcm = OPContractsManager(address(makeAddr("opcm"))); IOPContractsManager opcm = IOPContractsManager(address(makeAddr("opcm")));
IOptimismPortal2 optimismPortalImpl = IOptimismPortal2(payable(makeAddr("optimismPortalImpl"))); IOptimismPortal2 optimismPortalImpl = IOptimismPortal2(payable(makeAddr("optimismPortalImpl")));
IDelayedWETH delayedWETHImpl = IDelayedWETH(payable(makeAddr("delayedWETHImpl"))); IDelayedWETH delayedWETHImpl = IDelayedWETH(payable(makeAddr("delayedWETHImpl")));
IPreimageOracle preimageOracleSingleton = IPreimageOracle(makeAddr("preimageOracleSingleton")); IPreimageOracle preimageOracleSingleton = IPreimageOracle(makeAddr("preimageOracleSingleton"));
......
...@@ -3,7 +3,7 @@ pragma solidity 0.8.15; ...@@ -3,7 +3,7 @@ pragma solidity 0.8.15;
import { Test } from "forge-std/Test.sol"; import { Test } from "forge-std/Test.sol";
import { DeployOPCM, DeployOPCMInput, DeployOPCMOutput } from "scripts/deploy/DeployOPCM.s.sol"; import { DeployOPCM, DeployOPCMInput, DeployOPCMOutput } from "scripts/deploy/DeployOPCM.s.sol";
import { OPContractsManager } from "src/L1/OPContractsManager.sol"; import { IOPContractsManager } from "interfaces/L1/IOPContractsManager.sol";
import { ISuperchainConfig } from "interfaces/L1/ISuperchainConfig.sol"; import { ISuperchainConfig } from "interfaces/L1/ISuperchainConfig.sol";
import { IProtocolVersions } from "interfaces/L1/IProtocolVersions.sol"; import { IProtocolVersions } from "interfaces/L1/IProtocolVersions.sol";
...@@ -181,7 +181,7 @@ contract DeployOPCMOutput_Test is Test { ...@@ -181,7 +181,7 @@ contract DeployOPCMOutput_Test is Test {
} }
function test_set_succeeds() public { function test_set_succeeds() public {
OPContractsManager opcm = OPContractsManager(makeAddr("opcm")); IOPContractsManager opcm = IOPContractsManager(makeAddr("opcm"));
vm.etch(address(opcm), hex"01"); vm.etch(address(opcm), hex"01");
doo.set(doo.opcm.selector, address(opcm)); doo.set(doo.opcm.selector, address(opcm));
......
...@@ -24,7 +24,7 @@ import { IResolvedDelegateProxy } from "interfaces/legacy/IResolvedDelegateProxy ...@@ -24,7 +24,7 @@ import { IResolvedDelegateProxy } from "interfaces/legacy/IResolvedDelegateProxy
import { ISuperchainConfig } from "interfaces/L1/ISuperchainConfig.sol"; import { ISuperchainConfig } from "interfaces/L1/ISuperchainConfig.sol";
import { IProtocolVersions, ProtocolVersion } from "interfaces/L1/IProtocolVersions.sol"; import { IProtocolVersions, ProtocolVersion } from "interfaces/L1/IProtocolVersions.sol";
import { OPContractsManager } from "src/L1/OPContractsManager.sol"; import { IOPContractsManager } from "interfaces/L1/IOPContractsManager.sol";
import { IProxy } from "interfaces/universal/IProxy.sol"; import { IProxy } from "interfaces/universal/IProxy.sol";
import { Claim, Duration, GameType, GameTypes, Hash, OutputRoot } from "src/dispute/lib/Types.sol"; import { Claim, Duration, GameType, GameTypes, Hash, OutputRoot } from "src/dispute/lib/Types.sol";
...@@ -328,7 +328,7 @@ contract DeployOPChain_TestBase is Test { ...@@ -328,7 +328,7 @@ contract DeployOPChain_TestBase is Test {
uint32 blobBaseFeeScalar = 200; uint32 blobBaseFeeScalar = 200;
uint256 l2ChainId = 300; uint256 l2ChainId = 300;
OutputRoot startingAnchorRoot = OutputRoot({ root: Hash.wrap(keccak256("defaultOutputRoot")), l2BlockNumber: 400 }); OutputRoot startingAnchorRoot = OutputRoot({ root: Hash.wrap(keccak256("defaultOutputRoot")), l2BlockNumber: 400 });
OPContractsManager opcm = OPContractsManager(address(0)); IOPContractsManager opcm = IOPContractsManager(address(0));
string saltMixer = "defaultSaltMixer"; string saltMixer = "defaultSaltMixer";
uint64 gasLimit = 60_000_000; uint64 gasLimit = 60_000_000;
// Configurable dispute game parameters. // Configurable dispute game parameters.
......
...@@ -21,7 +21,7 @@ import { IDisputeGameFactory } from "interfaces/dispute/IDisputeGameFactory.sol" ...@@ -21,7 +21,7 @@ import { IDisputeGameFactory } from "interfaces/dispute/IDisputeGameFactory.sol"
import { IAddressManager } from "interfaces/legacy/IAddressManager.sol"; import { IAddressManager } from "interfaces/legacy/IAddressManager.sol";
import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol"; import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol";
import { IProxyAdmin } from "interfaces/universal/IProxyAdmin.sol"; import { IProxyAdmin } from "interfaces/universal/IProxyAdmin.sol";
import { OPContractsManager } from "src/L1/OPContractsManager.sol"; import { IOPContractsManager } from "interfaces/L1/IOPContractsManager.sol";
/// @title ForkLive /// @title ForkLive
/// @notice This script is called by Setup.sol as a preparation step for the foundry test suite, and is run as an /// @notice This script is called by Setup.sol as a preparation step for the foundry test suite, and is run as an
...@@ -141,7 +141,7 @@ contract ForkLive is Deployer { ...@@ -141,7 +141,7 @@ contract ForkLive is Deployer {
/// @notice Upgrades the contracts using the OPCM. /// @notice Upgrades the contracts using the OPCM.
function _upgrade() internal { function _upgrade() internal {
OPContractsManager opcm = OPContractsManager(artifacts.mustGetAddress("OPContractsManager")); IOPContractsManager opcm = IOPContractsManager(artifacts.mustGetAddress("OPContractsManager"));
ISystemConfig systemConfig = ISystemConfig(artifacts.mustGetAddress("SystemConfigProxy")); ISystemConfig systemConfig = ISystemConfig(artifacts.mustGetAddress("SystemConfigProxy"));
IProxyAdmin proxyAdmin = IProxyAdmin(EIP1967Helper.getAdmin(address(systemConfig))); IProxyAdmin proxyAdmin = IProxyAdmin(EIP1967Helper.getAdmin(address(systemConfig)));
...@@ -149,13 +149,13 @@ contract ForkLive is Deployer { ...@@ -149,13 +149,13 @@ contract ForkLive is Deployer {
address upgrader = proxyAdmin.owner(); address upgrader = proxyAdmin.owner();
vm.label(upgrader, "ProxyAdmin Owner"); vm.label(upgrader, "ProxyAdmin Owner");
OPContractsManager.OpChain[] memory opChains = new OPContractsManager.OpChain[](1); IOPContractsManager.OpChain[] memory opChains = new IOPContractsManager.OpChain[](1);
opChains[0] = OPContractsManager.OpChain({ systemConfigProxy: systemConfig, proxyAdmin: proxyAdmin }); opChains[0] = IOPContractsManager.OpChain({ systemConfigProxy: systemConfig, proxyAdmin: proxyAdmin });
// TODO Migrate from DelegateCaller to a Safe to reduce risk of mocks not properly // TODO Migrate from DelegateCaller to a Safe to reduce risk of mocks not properly
// reflecting the production system. // reflecting the production system.
vm.etch(upgrader, vm.getDeployedCode("test/mocks/Callers.sol:DelegateCaller")); vm.etch(upgrader, vm.getDeployedCode("test/mocks/Callers.sol:DelegateCaller"));
DelegateCaller(upgrader).dcForward(address(opcm), abi.encodeCall(OPContractsManager.upgrade, (opChains))); DelegateCaller(upgrader).dcForward(address(opcm), abi.encodeCall(IOPContractsManager.upgrade, (opChains)));
} }
/// @notice Saves the proxy and implementation addresses for a contract name /// @notice Saves the proxy and implementation addresses for a contract name
......
...@@ -20,10 +20,8 @@ import { Preinstalls } from "src/libraries/Preinstalls.sol"; ...@@ -20,10 +20,8 @@ import { Preinstalls } from "src/libraries/Preinstalls.sol";
import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol"; import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol";
import { Chains } from "scripts/libraries/Chains.sol"; import { Chains } from "scripts/libraries/Chains.sol";
// Contracts (TODO: move to interfaces)
import { OPContractsManager } from "src/L1/OPContractsManager.sol";
// Interfaces // Interfaces
import { IOPContractsManager } from "interfaces/L1/IOPContractsManager.sol";
import { IOptimismPortal2 } from "interfaces/L1/IOptimismPortal2.sol"; import { IOptimismPortal2 } from "interfaces/L1/IOptimismPortal2.sol";
import { IL1CrossDomainMessenger } from "interfaces/L1/IL1CrossDomainMessenger.sol"; import { IL1CrossDomainMessenger } from "interfaces/L1/IL1CrossDomainMessenger.sol";
import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol"; import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol";
...@@ -107,7 +105,7 @@ contract Setup { ...@@ -107,7 +105,7 @@ contract Setup {
IProtocolVersions protocolVersions; IProtocolVersions protocolVersions;
ISuperchainConfig superchainConfig; ISuperchainConfig superchainConfig;
IDataAvailabilityChallenge dataAvailabilityChallenge; IDataAvailabilityChallenge dataAvailabilityChallenge;
OPContractsManager opcm; IOPContractsManager opcm;
// L2 contracts // L2 contracts
IL2CrossDomainMessenger l2CrossDomainMessenger = IL2CrossDomainMessenger l2CrossDomainMessenger =
...@@ -229,7 +227,7 @@ contract Setup { ...@@ -229,7 +227,7 @@ contract Setup {
anchorStateRegistry = IAnchorStateRegistry(artifacts.mustGetAddress("AnchorStateRegistryProxy")); anchorStateRegistry = IAnchorStateRegistry(artifacts.mustGetAddress("AnchorStateRegistryProxy"));
disputeGameFactory = IDisputeGameFactory(artifacts.mustGetAddress("DisputeGameFactoryProxy")); disputeGameFactory = IDisputeGameFactory(artifacts.mustGetAddress("DisputeGameFactoryProxy"));
delayedWeth = IDelayedWETH(artifacts.mustGetAddress("DelayedWETHProxy")); delayedWeth = IDelayedWETH(artifacts.mustGetAddress("DelayedWETHProxy"));
opcm = OPContractsManager(artifacts.mustGetAddress("OPContractsManager")); opcm = IOPContractsManager(artifacts.mustGetAddress("OPContractsManager"));
if (deploy.cfg().useAltDA()) { if (deploy.cfg().useAltDA()) {
dataAvailabilityChallenge = dataAvailabilityChallenge =
......
...@@ -8,10 +8,8 @@ import { console2 as console } from "forge-std/console2.sol"; ...@@ -8,10 +8,8 @@ import { console2 as console } from "forge-std/console2.sol";
// Scripts // Scripts
import { ForgeArtifacts, Abi, AbiEntry } from "scripts/libraries/ForgeArtifacts.sol"; import { ForgeArtifacts, Abi, AbiEntry } from "scripts/libraries/ForgeArtifacts.sol";
// Contracts
import { OPContractsManager } from "src/L1/OPContractsManager.sol";
// Interfaces // Interfaces
import { IOPContractsManager } from "interfaces/L1/IOPContractsManager.sol";
import { IOptimismPortal2 } from "interfaces/L1/IOptimismPortal2.sol"; import { IOptimismPortal2 } from "interfaces/L1/IOptimismPortal2.sol";
import { IOptimismPortalInterop } from "interfaces/L1/IOptimismPortalInterop.sol"; import { IOptimismPortalInterop } from "interfaces/L1/IOptimismPortalInterop.sol";
import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol"; import { ISystemConfig } from "interfaces/L1/ISystemConfig.sol";
...@@ -781,24 +779,24 @@ contract Specification_Test is CommonTest { ...@@ -781,24 +779,24 @@ contract Specification_Test is CommonTest {
_addSpec({ _name: "OPContractsManager", _sel: _getSel("superchainConfig()") }); _addSpec({ _name: "OPContractsManager", _sel: _getSel("superchainConfig()") });
_addSpec({ _name: "OPContractsManager", _sel: _getSel("protocolVersions()") }); _addSpec({ _name: "OPContractsManager", _sel: _getSel("protocolVersions()") });
_addSpec({ _name: "OPContractsManager", _sel: _getSel("l1ContractsRelease()") }); _addSpec({ _name: "OPContractsManager", _sel: _getSel("l1ContractsRelease()") });
_addSpec({ _name: "OPContractsManager", _sel: OPContractsManager.deploy.selector }); _addSpec({ _name: "OPContractsManager", _sel: IOPContractsManager.deploy.selector });
_addSpec({ _name: "OPContractsManager", _sel: OPContractsManager.blueprints.selector }); _addSpec({ _name: "OPContractsManager", _sel: IOPContractsManager.blueprints.selector });
_addSpec({ _name: "OPContractsManager", _sel: OPContractsManager.chainIdToBatchInboxAddress.selector }); _addSpec({ _name: "OPContractsManager", _sel: IOPContractsManager.chainIdToBatchInboxAddress.selector });
_addSpec({ _name: "OPContractsManager", _sel: OPContractsManager.implementations.selector }); _addSpec({ _name: "OPContractsManager", _sel: IOPContractsManager.implementations.selector });
_addSpec({ _name: "OPContractsManager", _sel: OPContractsManager.upgrade.selector }); _addSpec({ _name: "OPContractsManager", _sel: IOPContractsManager.upgrade.selector });
_addSpec({ _name: "OPContractsManager", _sel: OPContractsManager.addGameType.selector }); _addSpec({ _name: "OPContractsManager", _sel: IOPContractsManager.addGameType.selector });
// OPContractsManagerInterop // OPContractsManagerInterop
_addSpec({ _name: "OPContractsManagerInterop", _sel: _getSel("version()") }); _addSpec({ _name: "OPContractsManagerInterop", _sel: _getSel("version()") });
_addSpec({ _name: "OPContractsManagerInterop", _sel: _getSel("superchainConfig()") }); _addSpec({ _name: "OPContractsManagerInterop", _sel: _getSel("superchainConfig()") });
_addSpec({ _name: "OPContractsManagerInterop", _sel: _getSel("protocolVersions()") }); _addSpec({ _name: "OPContractsManagerInterop", _sel: _getSel("protocolVersions()") });
_addSpec({ _name: "OPContractsManagerInterop", _sel: _getSel("l1ContractsRelease()") }); _addSpec({ _name: "OPContractsManagerInterop", _sel: _getSel("l1ContractsRelease()") });
_addSpec({ _name: "OPContractsManagerInterop", _sel: OPContractsManager.deploy.selector }); _addSpec({ _name: "OPContractsManagerInterop", _sel: IOPContractsManager.deploy.selector });
_addSpec({ _name: "OPContractsManagerInterop", _sel: OPContractsManager.blueprints.selector }); _addSpec({ _name: "OPContractsManagerInterop", _sel: IOPContractsManager.blueprints.selector });
_addSpec({ _name: "OPContractsManagerInterop", _sel: OPContractsManager.chainIdToBatchInboxAddress.selector }); _addSpec({ _name: "OPContractsManagerInterop", _sel: IOPContractsManager.chainIdToBatchInboxAddress.selector });
_addSpec({ _name: "OPContractsManagerInterop", _sel: OPContractsManager.implementations.selector }); _addSpec({ _name: "OPContractsManagerInterop", _sel: IOPContractsManager.implementations.selector });
_addSpec({ _name: "OPContractsManagerInterop", _sel: OPContractsManager.upgrade.selector }); _addSpec({ _name: "OPContractsManagerInterop", _sel: IOPContractsManager.upgrade.selector });
_addSpec({ _name: "OPContractsManagerInterop", _sel: OPContractsManager.addGameType.selector }); _addSpec({ _name: "OPContractsManagerInterop", _sel: IOPContractsManager.addGameType.selector });
// DeputyGuardianModule // DeputyGuardianModule
_addSpec({ _addSpec({
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment