Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ interface IOPContractsManagerStandardValidator {
bytes32 absolutePrestate;
uint256 l2ChainID;
address proposer;
bool isInitialDeployment;
}

struct ValidationInputDev {
Expand All @@ -36,6 +37,7 @@ interface IOPContractsManagerStandardValidator {
bytes32 cannonKonaPrestate;
uint256 l2ChainID;
address proposer;
bool isInitialDeployment;
}

struct ValidationOverrides {
Expand Down
29 changes: 10 additions & 19 deletions packages/contracts-bedrock/scripts/deploy/DeployOPChain.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -161,20 +161,13 @@ contract DeployOPChain is Script {
IOPContractsManagerUtils.DisputeGameConfig[] memory disputeGameConfigs =
new IOPContractsManagerUtils.DisputeGameConfig[](3);

// Determine which games should be enabled based on the starting respected game type
Comment thread
0xniha marked this conversation as resolved.
bool cannonEnabled = _input.disputeGameType.raw() == GameTypes.CANNON.raw();
bool permissionedCannonEnabled = true; // PERMISSIONED_CANNON must always be enabled
bool cannonKonaEnabled = _input.disputeGameType.raw() == GameTypes.CANNON_KONA.raw();

// Config 0: CANNON
IOPContractsManagerUtils.FaultDisputeGameConfig memory cannonConfig =
IOPContractsManagerUtils.FaultDisputeGameConfig({ absolutePrestate: _input.disputeAbsolutePrestate });

// Must be disabled for the initial deployment since no prestate exists for permissionless games.
disputeGameConfigs[0] = IOPContractsManagerUtils.DisputeGameConfig({
enabled: cannonEnabled,
initBond: cannonEnabled ? DEFAULT_INIT_BOND : 0,
enabled: false,
initBond: 0,
gameType: GameTypes.CANNON,
gameArgs: abi.encode(cannonConfig)
gameArgs: bytes("")
});

// Config 1: PERMISSIONED_CANNON (must be enabled)
Expand All @@ -186,21 +179,19 @@ contract DeployOPChain is Script {
});

disputeGameConfigs[1] = IOPContractsManagerUtils.DisputeGameConfig({
enabled: permissionedCannonEnabled,
enabled: true,
initBond: DEFAULT_INIT_BOND,
gameType: GameTypes.PERMISSIONED_CANNON,
gameArgs: abi.encode(pdgConfig)
});

// Config 2: CANNON_KONA
IOPContractsManagerUtils.FaultDisputeGameConfig memory cannonKonaConfig =
IOPContractsManagerUtils.FaultDisputeGameConfig({ absolutePrestate: _input.disputeAbsolutePrestate });

// Must be disabled for the initial deployment since no prestate exists for permissionless games.
disputeGameConfigs[2] = IOPContractsManagerUtils.DisputeGameConfig({
enabled: cannonKonaEnabled,
initBond: cannonKonaEnabled ? DEFAULT_INIT_BOND : 0,
enabled: false,
initBond: 0,
gameType: GameTypes.CANNON_KONA,
gameArgs: abi.encode(cannonKonaConfig)
gameArgs: bytes("")
});

config_ = IOPContractsManagerV2.FullConfig({
Expand All @@ -211,7 +202,7 @@ contract DeployOPChain is Script {
unsafeBlockSigner: _input.unsafeBlockSigner,
batcher: _input.batcher,
startingAnchorRoot: ScriptConstants.DEFAULT_OUTPUT_ROOT(),
startingRespectedGameType: _input.disputeGameType,
startingRespectedGameType: GameTypes.PERMISSIONED_CANNON,
basefeeScalar: _input.basefeeScalar,
blobBasefeeScalar: _input.blobBaseFeeScalar,
gasLimit: _input.gasLimit,
Expand Down
38 changes: 29 additions & 9 deletions packages/contracts-bedrock/snapshots/abi/OPContractsManager.json
Original file line number Diff line number Diff line change
Expand Up @@ -805,7 +805,12 @@
},
{
"internalType": "bytes32",
"name": "absolutePrestate",
"name": "cannonPrestate",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "cannonKonaPrestate",
"type": "bytes32"
},
{
Expand All @@ -817,9 +822,14 @@
"internalType": "address",
"name": "proposer",
"type": "address"
},
{
"internalType": "bool",
"name": "isInitialDeployment",
"type": "bool"
}
],
"internalType": "struct OPContractsManagerStandardValidator.ValidationInput",
"internalType": "struct OPContractsManagerStandardValidator.ValidationInputDev",
"name": "_input",
"type": "tuple"
},
Expand Down Expand Up @@ -851,12 +861,7 @@
},
{
"internalType": "bytes32",
"name": "cannonPrestate",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "cannonKonaPrestate",
"name": "absolutePrestate",
"type": "bytes32"
},
{
Expand All @@ -868,9 +873,14 @@
"internalType": "address",
"name": "proposer",
"type": "address"
},
{
"internalType": "bool",
"name": "isInitialDeployment",
"type": "bool"
}
],
"internalType": "struct OPContractsManagerStandardValidator.ValidationInputDev",
"internalType": "struct OPContractsManagerStandardValidator.ValidationInput",
"name": "_input",
"type": "tuple"
},
Expand Down Expand Up @@ -914,6 +924,11 @@
"internalType": "address",
"name": "proposer",
"type": "address"
},
{
"internalType": "bool",
"name": "isInitialDeployment",
"type": "bool"
}
],
"internalType": "struct OPContractsManagerStandardValidator.ValidationInput",
Expand Down Expand Up @@ -982,6 +997,11 @@
"internalType": "address",
"name": "proposer",
"type": "address"
},
{
"internalType": "bool",
"name": "isInitialDeployment",
"type": "bool"
}
],
"internalType": "struct OPContractsManagerStandardValidator.ValidationInputDev",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,12 @@
},
{
"internalType": "bytes32",
"name": "absolutePrestate",
"name": "cannonPrestate",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "cannonKonaPrestate",
"type": "bytes32"
},
{
Expand All @@ -377,9 +382,14 @@
"internalType": "address",
"name": "proposer",
"type": "address"
},
{
"internalType": "bool",
"name": "isInitialDeployment",
"type": "bool"
}
],
"internalType": "struct OPContractsManagerStandardValidator.ValidationInput",
"internalType": "struct OPContractsManagerStandardValidator.ValidationInputDev",
"name": "_input",
"type": "tuple"
},
Expand Down Expand Up @@ -411,12 +421,7 @@
},
{
"internalType": "bytes32",
"name": "cannonPrestate",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "cannonKonaPrestate",
"name": "absolutePrestate",
"type": "bytes32"
},
{
Expand All @@ -428,9 +433,14 @@
"internalType": "address",
"name": "proposer",
"type": "address"
},
{
"internalType": "bool",
"name": "isInitialDeployment",
"type": "bool"
}
],
"internalType": "struct OPContractsManagerStandardValidator.ValidationInputDev",
"internalType": "struct OPContractsManagerStandardValidator.ValidationInput",
"name": "_input",
"type": "tuple"
},
Expand Down Expand Up @@ -474,6 +484,11 @@
"internalType": "address",
"name": "proposer",
"type": "address"
},
{
"internalType": "bool",
"name": "isInitialDeployment",
"type": "bool"
}
],
"internalType": "struct OPContractsManagerStandardValidator.ValidationInput",
Expand Down Expand Up @@ -542,6 +557,11 @@
"internalType": "address",
"name": "proposer",
"type": "address"
},
{
"internalType": "bool",
"name": "isInitialDeployment",
"type": "bool"
}
],
"internalType": "struct OPContractsManagerStandardValidator.ValidationInputDev",
Expand Down
10 changes: 5 additions & 5 deletions packages/contracts-bedrock/snapshots/semver-lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,12 @@
"sourceCodeHash": "0xfca613b5d055ffc4c3cbccb0773ddb9030abedc1aa6508c9e2e7727cc0cd617b"
},
"src/L1/OPContractsManager.sol:OPContractsManager": {
"initCodeHash": "0xd4593c8b35e7a1d5371315011c48116594001b198168d416d5df6d43d49f97c8",
"initCodeHash": "0xef8060ab00bf797fafe507baa315a196b8389dc7fda18cceef9b79a116a47952",
"sourceCodeHash": "0xf8900a57ff29a27f99f6f68b2978b7964629a5d4b8bb351394c10431cae0f617"
},
"src/L1/OPContractsManagerStandardValidator.sol:OPContractsManagerStandardValidator": {
"initCodeHash": "0xdec828fdb9f9bb7a35ca03d851b041fcd088681957642e949b5d320358d9b9a1",
"sourceCodeHash": "0x17231caf75773e159b91ad37d798c600ed9662b77c236143022456dc9eb83e47"
"initCodeHash": "0xf8754bfbaa0ba2d3ae1c30c83ab770fa42147d50e7398699579eeb598d61793a",
"sourceCodeHash": "0x28f1be9fc2ebe29f147bb5e5508ff220b708b4a329982ecd73fcf3a31adf6bde"
},
"src/L1/OptimismPortal2.sol:OptimismPortal2": {
"initCodeHash": "0x2c01bc6c0a55a1a27263224e05c1b28703ff85c61075bae7ab384b3043820ed2",
Expand All @@ -52,8 +52,8 @@
"sourceCodeHash": "0xb3184aa5d95a82109e7134d1f61941b30e25f655b9849a0e303d04bbce0cde0b"
},
"src/L1/opcm/OPContractsManagerV2.sol:OPContractsManagerV2": {
"initCodeHash": "0x5f3548d6d5502669d34ff3104826d8498c3f74be2f6840a6acb9860e266d96a8",
"sourceCodeHash": "0xf7c02dec35e9c34e7e3e8f1fe939f7b84243064b423e38ba82fb06e389732cc7"
"initCodeHash": "0xa48d33442f8d4a9ae7f551d58d78e9a0c9a953b980c5ed65ddcb995cad6b5af6",
"sourceCodeHash": "0xb5ab1b13cac7cf3fb200298ab8c926c44881f6cecf8f5a62ba13feefef5f1df5"
},
"src/L2/BaseFeeVault.sol:BaseFeeVault": {
"initCodeHash": "0x838bbd7f381e84e21887f72bd1da605bfc4588b3c39aed96cbce67c09335b3ee",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ contract OPContractsManagerStandardValidator is ISemver {
bytes32 absolutePrestate;
uint256 l2ChainID;
address proposer;
bool isInitialDeployment;
}

/// @notice Struct containing the input parameters for the validation process when dev features are enabled.
Expand All @@ -135,6 +136,7 @@ contract OPContractsManagerStandardValidator is ISemver {
bytes32 cannonKonaPrestate;
uint256 l2ChainID;
address proposer;
bool isInitialDeployment;
}

/// @notice Struct containing override parameters for the validation process.
Expand Down Expand Up @@ -883,26 +885,30 @@ contract OPContractsManagerStandardValidator is ISemver {
_errors = assertValidPermissionedDisputeGame(
_errors, _input.sysCfg, _input.cannonPrestate, _input.l2ChainID, _proxyAdmin, _input.proposer, _overrides
);
_errors = assertValidPermissionlessDisputeGame(
_errors,
_input.sysCfg,
GameTypes.CANNON,
_input.cannonPrestate,
_input.l2ChainID,
_proxyAdmin,
_overrides,
"PLDG"
);
_errors = assertValidPermissionlessDisputeGame(
_errors,
_input.sysCfg,
GameTypes.CANNON_KONA,
_input.cannonKonaPrestate,
_input.l2ChainID,
_proxyAdmin,
_overrides,
"CKDG"
);

// During initial deployment, only PERMISSIONED_CANNON should be enabled.
if (!_input.isInitialDeployment) {
_errors = assertValidPermissionlessDisputeGame(
_errors,
_input.sysCfg,
GameTypes.CANNON,
_input.cannonPrestate,
_input.l2ChainID,
_proxyAdmin,
_overrides,
"PLDG"
);
_errors = assertValidPermissionlessDisputeGame(
_errors,
_input.sysCfg,
GameTypes.CANNON_KONA,
_input.cannonKonaPrestate,
_input.l2ChainID,
_proxyAdmin,
_overrides,
"CKDG"
);
}

_errors = assertValidETHLockbox(_errors, _input.sysCfg, _proxyAdmin);

Expand Down Expand Up @@ -935,7 +941,8 @@ contract OPContractsManagerStandardValidator is ISemver {
cannonPrestate: _input.absolutePrestate,
cannonKonaPrestate: bytes32(0),
l2ChainID: _input.l2ChainID,
proposer: _input.proposer
proposer: _input.proposer,
isInitialDeployment: _input.isInitialDeployment
});
}

Expand Down
13 changes: 11 additions & 2 deletions packages/contracts-bedrock/src/L1/opcm/OPContractsManagerV2.sol
Original file line number Diff line number Diff line change
Expand Up @@ -643,7 +643,7 @@ contract OPContractsManagerV2 is ISemver, OPContractsManagerUtilsCaller {

/// @notice Validates the deployment/upgrade config.
/// @param _cfg The full config.
function _assertValidFullConfig(FullConfig memory _cfg) internal pure {
function _assertValidFullConfig(FullConfig memory _cfg, bool _isInitialDeployment) internal pure {
// Start validating the dispute game configs. Put allowed game types here.
GameType[] memory validGameTypes = new GameType[](3);
validGameTypes[0] = GameTypes.CANNON;
Expand All @@ -667,6 +667,15 @@ contract OPContractsManagerV2 is ISemver, OPContractsManagerUtilsCaller {
if (!_cfg.disputeGameConfigs[i].enabled && _cfg.disputeGameConfigs[i].initBond != 0) {
revert OPContractsManagerV2_InvalidGameConfigs();
}

// During initial deployment, only PERMISSIONED_CANNON can be enabled, because no prestate exists for
// permissionless games.
if (
_isInitialDeployment && (validGameTypes[i].raw() != GameTypes.PERMISSIONED_CANNON.raw())
&& _cfg.disputeGameConfigs[i].enabled
) {
revert OPContractsManagerV2_InvalidGameConfigs();
}
}

// We currently REQUIRE that the PermissionedDisputeGame is enabled. We may be able to
Expand All @@ -691,7 +700,7 @@ contract OPContractsManagerV2 is ISemver, OPContractsManagerUtilsCaller {
returns (ChainContracts memory)
{
// Validate the config.
_assertValidFullConfig(_cfg);
_assertValidFullConfig(_cfg, _isInitialDeployment);

// Load the implementations.
IOPContractsManagerContainer.Implementations memory impls = implementations();
Expand Down
3 changes: 2 additions & 1 deletion packages/contracts-bedrock/test/L1/OPContractsManager.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,8 @@ contract OPContractsManager_Upgrade_Harness is CommonTest {
cannonPrestate: opChainConfigs[0].cannonPrestate.raw(),
cannonKonaPrestate: opChainConfigs[0].cannonKonaPrestate.raw(),
l2ChainID: l2ChainId,
proposer: initialProposer
proposer: initialProposer,
isInitialDeployment: false
}),
false,
validationOverrides
Expand Down
Loading