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
2 changes: 2 additions & 0 deletions .semgrep/rules/sol-rules.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,8 @@ rules:
- packages/contracts-bedrock/src/L1/OPContractsManager.sol
- packages/contracts-bedrock/src/L1/opcm/OPContractsManagerV2.sol
- packages/contracts-bedrock/src/L1/opcm/OPContractsManagerContainer.sol
- packages/contracts-bedrock/src/L1/opcm/OPContractsManagerUtils.sol
- packages/contracts-bedrock/src/L1/opcm/OPContractsManagerUtilsCaller.sol
- packages/contracts-bedrock/src/L1/OptimismPortal2.sol
- packages/contracts-bedrock/src/L1/OptimismPortalInterop.sol
- packages/contracts-bedrock/src/L2/FeeVault.sol
Expand Down
1 change: 1 addition & 0 deletions op-chain-ops/addresses/contracts.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ type ImplementationsContracts struct {
OpcmUpgraderImpl common.Address
OpcmInteropMigratorImpl common.Address
OpcmStandardValidatorImpl common.Address
OpcmUtilsImpl common.Address
OpcmV2Impl common.Address
OpcmContainerImpl common.Address
DelayedWethImpl common.Address
Expand Down
1 change: 1 addition & 0 deletions op-chain-ops/interopgen/deployments.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ type Implementations struct {
OpcmUpgrader common.Address `json:"OPCMUpgrader"`
OpcmInteropMigrator common.Address `json:"OPCMInteropMigrator"`
OpcmStandardValidator common.Address `json:"OPCMStandardValidator"`
OpcmUtils common.Address `json:"OPCMUtils"`
OpcmV2 common.Address `json:"OPCMV2"`
OpcmContainer common.Address `json:"OPCMContainer"`
DelayedWETHImpl common.Address `json:"DelayedWETHImpl"`
Expand Down
1 change: 1 addition & 0 deletions op-deployer/pkg/deployer/opcm/implementations.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ type DeployImplementationsOutput struct {
OpcmUpgrader common.Address `json:"opcmUpgraderAddress"`
OpcmInteropMigrator common.Address `json:"opcmInteropMigratorAddress"`
OpcmStandardValidator common.Address `json:"opcmStandardValidatorAddress"`
OpcmUtils common.Address `json:"opcmUtilsAddress"`
OpcmV2 common.Address `json:"opcmV2Address"`
OpcmContainer common.Address `json:"opcmContainerAddress"`
DelayedWETHImpl common.Address `json:"delayedWETHImplAddress"`
Expand Down
1 change: 1 addition & 0 deletions op-deployer/pkg/deployer/verify/artifacts.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ var contractNameExceptions = map[string]string{
"OpcmStandardValidator": "OPContractsManagerStandardValidator.sol/OPContractsManagerStandardValidator.json",
"OpcmV2": "OPContractsManagerV2.sol/OPContractsManagerV2.json",
"OpcmContainer": "OPContractsManagerContainer.sol/OPContractsManagerContainer.json",
"OpcmUtils": "OPContractsManagerUtils.sol/OPContractsManagerUtils.json",
"Mips": "MIPS64.sol/MIPS64.json",
"EthLockbox": "ETHLockbox.sol/ETHLockbox.json",
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import { IOPContractsManagerContainer } from "interfaces/L1/opcm/IOPContractsManagerContainer.sol";
import { IProxyAdmin } from "interfaces/universal/IProxyAdmin.sol";
import { IAddressManager } from "interfaces/legacy/IAddressManager.sol";

interface IOPContractsManagerUtils {
struct ProxyDeployArgs {
IProxyAdmin proxyAdmin;
IAddressManager addressManager;
uint256 l2ChainId;
string saltMixer;
}

struct ExtraInstruction {
string key;
bytes data;
}

event ProxyCreation(string name, address proxy);

error OPContractsManagerUtils_DowngradeNotAllowed(address _contract);
error OPContractsManagerUtils_ConfigLoadFailed(string _name);
error OPContractsManagerUtils_ProxyMustLoad(string _name);
error ReservedBitsSet();
error UnsupportedERCVersion(uint8 version);
error SemverComp_InvalidSemverParts();
error DeploymentFailed();
error UnexpectedPreambleData(bytes data);
error NotABlueprint();
error EmptyInitcode();
error BytesArrayTooLong();
error IdentityPrecompileCallFailed();

function implementations() external view returns (IOPContractsManagerContainer.Implementations memory);
function blueprints() external view returns (IOPContractsManagerContainer.Blueprints memory);
function contractsContainer() external view returns (IOPContractsManagerContainer);
function chainIdToBatchInboxAddress(uint256 _l2ChainId) external pure returns (address);
function computeSalt(
uint256 _l2ChainId,
string memory _saltMixer,
string memory _contractName
)
external
pure
returns (bytes32);
function hasInstruction(
ExtraInstruction[] memory _instructions,
string memory _key,
bytes memory _data
)
external
pure
returns (bool);

function getInstructionByKey(
ExtraInstruction[] memory _instructions,
string memory _key
)
external
pure
returns (ExtraInstruction memory);

function loadBytes(
address _source,
bytes4 _selector,
string memory _name,
ExtraInstruction[] memory _instructions
)
external
view
returns (bytes memory);

function loadOrDeployProxy(
address _source,
bytes4 _selector,
ProxyDeployArgs memory _args,
string memory _contractName,
ExtraInstruction[] memory _instructions
)
external
returns (address payable);

function upgrade(
IProxyAdmin _proxyAdmin,
address _target,
address _implementation,
bytes memory _data,
bytes32 _slot,
uint8 _offset
)
external;

function __constructor__(IOPContractsManagerContainer _contractsContainer) external;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import { IOPContractsManagerUtils } from "interfaces/L1/opcm/IOPContractsManagerUtils.sol";

interface IOPContractsManagerUtilsCaller {
function __constructor__(IOPContractsManagerUtils _utils) external;
function utils() external view returns (IOPContractsManagerUtils);
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { IETHLockbox } from "interfaces/L1/IETHLockbox.sol";
import { IResourceMetering } from "interfaces/L1/IResourceMetering.sol";
import { IOPContractsManagerContainer } from "interfaces/L1/opcm/IOPContractsManagerContainer.sol";
import { IOPContractsManagerStandardValidator } from "interfaces/L1/IOPContractsManagerStandardValidator.sol";
import { IOPContractsManagerUtils } from "interfaces/L1/opcm/IOPContractsManagerUtils.sol";

interface IOPContractsManagerV2 {
/// @notice Configuration for the FaultDisputeGame.
Expand Down Expand Up @@ -82,32 +83,22 @@ interface IOPContractsManagerV2 {
DisputeGameConfig[] disputeGameConfigs;
}

struct ExtraInstruction {
string key;
bytes data;
}

struct UpgradeInput {
ISystemConfig systemConfig;
DisputeGameConfig[] disputeGameConfigs;
ExtraInstruction[] extraInstructions;
IOPContractsManagerUtils.ExtraInstruction[] extraInstructions;
}

struct SuperchainUpgradeInput {
ISuperchainConfig superchainConfig;
ExtraInstruction[] extraInstructions;
IOPContractsManagerUtils.ExtraInstruction[] extraInstructions;
}

event ProxyCreation(string name, address proxy);

error OPContractsManagerV2_InvalidGameConfigs();
error OPContractsManagerV2_InvalidUpgradeInput();
error OPContractsManagerV2_SuperchainConfigNeedsUpgrade();
error OPContractsManagerV2_UnsupportedGameType();
error OPContractsManagerV2_ProxyMustLoad(string _name);
error OPContractsManagerV2_DowngradeNotAllowed(address _contract);
error OPContractsManagerV2_InvalidUpgradeInstruction();
error OPContractsManagerV2_ConfigLoadFailed(string _name);
error IdentityPrecompileCallFailed();
error ReservedBitsSet();
error BytesArrayTooLong();
Expand All @@ -120,7 +111,8 @@ interface IOPContractsManagerV2 {

function __constructor__(
IOPContractsManagerContainer _contractsContainer,
IOPContractsManagerStandardValidator _standardValidator
IOPContractsManagerStandardValidator _standardValidator,
IOPContractsManagerUtils _utils
)
external;

Expand All @@ -132,6 +124,8 @@ interface IOPContractsManagerV2 {

function standardValidator() external view returns (IOPContractsManagerStandardValidator);

function utils() external view returns (IOPContractsManagerUtils);

function version() external view returns (string memory);

/// @notice Upgrades Superchain-wide contracts.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func main() {
// Process.
if _, err := common.ProcessFilesGlob(
[]string{"forge-artifacts/**/*.json"},
[]string{"forge-artifacts/OPContractsManager.sol/*.json", "forge-artifacts/OPContractsManagerV2.sol/*.json", "forge-artifacts/opcm/OPContractsManagerV2.sol/*.json"},
[]string{"forge-artifacts/OPContractsManager.sol/*.json", "forge-artifacts/OPContractsManagerV2.sol/*.json", "forge-artifacts/OPContractsManagerUtils.sol/*.json", "forge-artifacts/opcm/**/*.json"},
Comment thread
smartcontracts marked this conversation as resolved.
processFile,
); err != nil {
fmt.Printf("error: %v\n", err)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import {
} from "interfaces/L1/IOPContractsManager.sol";
import { IOPContractsManagerV2 } from "interfaces/L1/opcm/IOPContractsManagerV2.sol";
import { IOPContractsManagerContainer } from "interfaces/L1/opcm/IOPContractsManagerContainer.sol";
import { IOPContractsManagerUtils } from "interfaces/L1/opcm/IOPContractsManagerUtils.sol";
import { IOptimismPortal2 as IOptimismPortal } from "interfaces/L1/IOptimismPortal2.sol";
import { IOptimismPortalInterop } from "interfaces/L1/IOptimismPortalInterop.sol";
import { IETHLockbox } from "interfaces/L1/IETHLockbox.sol";
Expand Down Expand Up @@ -77,6 +78,7 @@ contract DeployImplementations is Script {
IOPContractsManagerUpgrader opcmUpgrader;
IOPContractsManagerInteropMigrator opcmInteropMigrator;
IOPContractsManagerStandardValidator opcmStandardValidator;
IOPContractsManagerUtils opcmUtils;
IOPContractsManagerV2 opcmV2;
IOPContractsManagerContainer opcmContainer; // v2 container
IDelayedWETH delayedWETHImpl;
Expand Down Expand Up @@ -222,6 +224,7 @@ contract DeployImplementations is Script {
deployOPCMUpgrader(_output);
deployOPCMInteropMigrator(_output);
deployOPCMStandardValidator(_input, _output, implementations);
deployOPCMUtils(_output);
deployOPCMV2(_output);

// Semgrep rule will fail because the arguments are encoded inside of a separate function.
Expand Down Expand Up @@ -762,13 +765,28 @@ contract DeployImplementations is Script {
_output.opcmStandardValidator = impl;
}

function deployOPCMUtils(Output memory _output) private {
IOPContractsManagerUtils impl = IOPContractsManagerUtils(
DeployUtils.createDeterministic({
_name: "OPContractsManagerUtils.sol:OPContractsManagerUtils",
_args: DeployUtils.encodeConstructor(
abi.encodeCall(IOPContractsManagerUtils.__constructor__, (_output.opcmContainer))
),
_salt: _salt
})
);
vm.label(address(impl), "OPContractsManagerUtilsImpl");
_output.opcmUtils = impl;
}

function deployOPCMV2(Output memory _output) private {
IOPContractsManagerV2 impl = IOPContractsManagerV2(
DeployUtils.createDeterministic({
_name: "OPContractsManagerV2.sol:OPContractsManagerV2",
_args: DeployUtils.encodeConstructor(
abi.encodeCall(
IOPContractsManagerV2.__constructor__, (_output.opcmContainer, _output.opcmStandardValidator)
IOPContractsManagerV2.__constructor__,
(_output.opcmContainer, _output.opcmStandardValidator, _output.opcmUtils)
)
),
_salt: _salt
Expand Down
Loading
Loading