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
1 change: 1 addition & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2547,6 +2547,7 @@ workflows:
- OPTIMISM_PORTAL_INTEROP
- CANNON_KONA,DEPLOY_V2_DISPUTE_GAMES
- CUSTOM_GAS_TOKEN
- OPCM_V2
context:
- circleci-repo-readonly-authenticated-github-token
- contracts-bedrock-tests:
Expand Down
2 changes: 2 additions & 0 deletions .semgrep/rules/sol-rules.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,8 @@ rules:
- packages/contracts-bedrock/src
exclude:
- 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/OptimismPortal2.sol
- packages/contracts-bedrock/src/L1/OptimismPortalInterop.sol
- packages/contracts-bedrock/src/L2/FeeVault.sol
Expand Down
3 changes: 3 additions & 0 deletions op-chain-ops/addresses/contracts.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ type ImplementationsContracts struct {
OpcmUpgraderImpl common.Address
OpcmInteropMigratorImpl common.Address
OpcmStandardValidatorImpl common.Address
OpcmV2Impl common.Address
OpcmContainerImpl common.Address
DelayedWethImpl common.Address
OptimismPortalImpl common.Address
OptimismPortalInteropImpl common.Address
Expand All @@ -49,6 +51,7 @@ type ImplementationsContracts struct {
AnchorStateRegistryImpl common.Address
FaultDisputeGameV2Impl common.Address
PermissionedDisputeGameV2Impl common.Address
StorageSetterImpl common.Address
}

// OpChainContracts struct contains all the contracts for a specific L2 OpChain
Expand Down
3 changes: 3 additions & 0 deletions op-chain-ops/interopgen/deployments.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ type Implementations struct {
OpcmUpgrader common.Address `json:"OPCMUpgrader"`
OpcmInteropMigrator common.Address `json:"OPCMInteropMigrator"`
OpcmStandardValidator common.Address `json:"OPCMStandardValidator"`
OpcmV2 common.Address `json:"OPCMV2"`
OpcmContainer common.Address `json:"OPCMContainer"`
DelayedWETHImpl common.Address `json:"DelayedWETHImpl"`
OptimismPortalImpl common.Address `json:"OptimismPortalImpl"`
OptimismPortalInteropImpl common.Address `json:"OptimismPortalInteropImpl"`
Expand All @@ -36,6 +38,7 @@ type Implementations struct {
PermissionedDisputeGameV2Impl common.Address `json:"PermissionedDisputeGameV2Impl"`
SuperFaultDisputeGameImpl common.Address `json:"SuperFaultDisputeGameImpl"`
SuperPermissionedDisputeGameImpl common.Address `json:"SuperPermissionedDisputeGameImpl"`
StorageSetterImpl common.Address `json:"StorageSetterImpl"`
}

type SuperchainDeployment struct {
Expand Down
3 changes: 3 additions & 0 deletions op-deployer/pkg/deployer/opcm/implementations.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ type DeployImplementationsOutput struct {
OpcmUpgrader common.Address `json:"opcmUpgraderAddress"`
OpcmInteropMigrator common.Address `json:"opcmInteropMigratorAddress"`
OpcmStandardValidator common.Address `json:"opcmStandardValidatorAddress"`
OpcmV2 common.Address `json:"opcmV2Address"`
OpcmContainer common.Address `json:"opcmContainerAddress"`
DelayedWETHImpl common.Address `json:"delayedWETHImplAddress"`
OptimismPortalImpl common.Address `json:"optimismPortalImplAddress"`
OptimismPortalInteropImpl common.Address `json:"optimismPortalInteropImplAddress"`
Expand All @@ -54,6 +56,7 @@ type DeployImplementationsOutput struct {
PermissionedDisputeGameV2Impl common.Address `json:"permissionedDisputeGameV2ImplAddress"`
SuperFaultDisputeGameImpl common.Address `json:"superFaultDisputeGameImplAddress"`
SuperPermissionedDisputeGameImpl common.Address `json:"superPermissionedDisputeGameImplAddress"`
StorageSetterImpl common.Address `json:"storageSetterImplAddress"`
}

type DeployImplementationsScript script.DeployScriptWithOutput[DeployImplementationsInput, DeployImplementationsOutput]
Expand Down
1 change: 1 addition & 0 deletions op-deployer/pkg/deployer/pipeline/implementations.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ func DeployImplementations(env *Env, intent *state.Intent, st *state.State) erro
AnchorStateRegistryImpl: dio.AnchorStateRegistryImpl,
FaultDisputeGameV2Impl: dio.FaultDisputeGameV2Impl,
PermissionedDisputeGameV2Impl: dio.PermissionedDisputeGameV2Impl,
StorageSetterImpl: dio.StorageSetterImpl,
}

return nil
Expand Down
2 changes: 2 additions & 0 deletions op-deployer/pkg/deployer/verify/artifacts.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ var contractNameExceptions = map[string]string{
"OpcmUpgrader": "OPContractsManager.sol/OPContractsManagerUpgrader.json",
"OpcmInteropMigrator": "OPContractsManager.sol/OPContractsManagerInteropMigrator.json",
"OpcmStandardValidator": "OPContractsManagerStandardValidator.sol/OPContractsManagerStandardValidator.json",
"OpcmV2": "OPContractsManagerV2.sol/OPContractsManagerV2.json",
"OpcmContainer": "OPContractsManagerContainer.sol/OPContractsManagerContainer.json",
"Mips": "MIPS64.sol/MIPS64.json",
"EthLockbox": "ETHLockbox.sol/ETHLockbox.json",
}
Expand Down
7 changes: 6 additions & 1 deletion packages/contracts-bedrock/foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,11 @@ compilation_restrictions = [
{ paths = "src/dispute/zk/OPSuccinctFaultDisputeGame.sol", optimizer_runs = 5000 },
{ paths = "src/L1/OPContractsManager.sol", optimizer_runs = 5000 },
{ paths = "src/L1/OPContractsManagerStandardValidator.sol", optimizer_runs = 5000 },
{ paths = "src/L1/opcm/OPContractsManagerV2.sol", optimizer_runs = 5000 },
{ paths = "src/L1/opcm/OPContractsManagerContainer.sol", optimizer_runs = 5000 },
{ paths = "src/L1/OptimismPortal2.sol", optimizer_runs = 5000 },
{ paths = "src/L1/ProtocolVersions.sol", optimizer_runs = 5000 }
{ paths = "src/L1/ProtocolVersions.sol", optimizer_runs = 5000 },
{ paths = "src/universal/StorageSetter.sol", optimizer_runs = 5000 }
]

extra_output = ['devdoc', 'userdoc', 'metadata', 'storageLayout']
Expand Down Expand Up @@ -155,6 +158,8 @@ compilation_restrictions = [
{ paths = "src/dispute/zk/OPSuccinctFaultDisputeGame.sol", optimizer_runs = 0 },
{ paths = "src/L1/OPContractsManager.sol", optimizer_runs = 0 },
{ paths = "src/L1/OPContractsManagerStandardValidator.sol", optimizer_runs = 0 },
{ paths = "src/L1/opcm/OPContractsManagerV2.sol", optimizer_runs = 0 },
{ paths = "src/L1/opcm/OPContractsManagerContainer.sol", optimizer_runs = 0 },
{ paths = "src/L1/OptimismPortal2.sol", optimizer_runs = 0 },
{ paths = "src/L1/ProtocolVersions.sol", optimizer_runs = 0 },
]
Expand Down
Comment thread
smartcontracts marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IOPContractsManagerContainer {
struct Blueprints {
address addressManager;
address proxy;
address proxyAdmin;
address l1ChugSplashProxy;
address resolvedDelegateProxy;
address permissionedDisputeGame1;
address permissionedDisputeGame2;
address permissionlessDisputeGame1;
address permissionlessDisputeGame2;
}

struct Implementations {
address superchainConfigImpl;
address protocolVersionsImpl;
address l1ERC721BridgeImpl;
address optimismPortalImpl;
address optimismPortalInteropImpl;
address ethLockboxImpl;
address systemConfigImpl;
address optimismMintableERC20FactoryImpl;
address l1CrossDomainMessengerImpl;
address l1StandardBridgeImpl;
address disputeGameFactoryImpl;
address anchorStateRegistryImpl;
address delayedWETHImpl;
address mipsImpl;
address faultDisputeGameV2Impl;
address permissionedDisputeGameV2Impl;
address superFaultDisputeGameImpl;
address superPermissionedDisputeGameImpl;
address storageSetterImpl;
}

error OPContractsManagerContractsContainer_DevFeatureInProd();

function blueprints() external view returns (Blueprints memory);
function implementations() external view returns (Implementations memory);
function isDevFeatureEnabled(bytes32 _feature) external view returns (bool);
function devFeatureBitmap() external view returns (bytes32);
function __constructor__(Blueprints memory _blueprints, Implementations memory _implementations, bytes32 _devFeatureBitmap) external;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// Libraries
import { Claim, GameType, Proposal } from "src/dispute/lib/Types.sol";

// Interfaces
import { IProxyAdmin } from "interfaces/universal/IProxyAdmin.sol";
import { ISuperchainConfig } from "interfaces/L1/ISuperchainConfig.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 { IOptimismPortal2 } from "interfaces/L1/IOptimismPortal2.sol";
import { IOptimismMintableERC20Factory } from "interfaces/universal/IOptimismMintableERC20Factory.sol";
import { IDisputeGameFactory } from "interfaces/dispute/IDisputeGameFactory.sol";
import { IAnchorStateRegistry } from "interfaces/dispute/IAnchorStateRegistry.sol";
import { IDelayedWETH } from "interfaces/dispute/IDelayedWETH.sol";
import { IAddressManager } from "interfaces/legacy/IAddressManager.sol";
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";

interface IOPContractsManagerV2 {
/// @notice Configuration for the FaultDisputeGame.
struct FaultDisputeGameConfig {
Claim absolutePrestate;
}

/// @notice Configuration for the PermissionedDisputeGame.
struct PermissionedDisputeGameConfig {
Claim absolutePrestate;
address proposer;
address challenger;
}

/// @notice Dispute game configuration for a specific game type.
struct DisputeGameConfig {
bool enabled;
uint256 initBond;
GameType gameType;
bytes gameArgs;
}

/// @notice Contracts that represent the Superchain system.
struct SuperchainContracts {
ISuperchainConfig superchainConfig;
}

/// @notice Addresses of the deployed and wired contracts for an OP Chain.
struct ChainContracts {
ISystemConfig systemConfig;
IProxyAdmin proxyAdmin;
IAddressManager addressManager;
IL1CrossDomainMessenger l1CrossDomainMessenger;
IL1ERC721Bridge l1ERC721Bridge;
IL1StandardBridge l1StandardBridge;
IOptimismPortal2 optimismPortal;
IETHLockbox ethLockbox;
IOptimismMintableERC20Factory optimismMintableERC20Factory;
IDisputeGameFactory disputeGameFactory;
IAnchorStateRegistry anchorStateRegistry;
IDelayedWETH delayedWETH;
}

/// @notice Full configuration for deploying a new OP Chain.
struct FullConfig {
string saltMixer;
ISuperchainConfig superchainConfig;
address proxyAdminOwner;
address systemConfigOwner;
address unsafeBlockSigner;
address batcher;
Proposal startingAnchorRoot;
GameType startingRespectedGameType;
uint32 basefeeScalar;
uint32 blobBasefeeScalar;
uint64 gasLimit;
uint256 l2ChainId;
IResourceMetering.ResourceConfig resourceConfig;
DisputeGameConfig[] disputeGameConfigs;
}

struct ExtraInstruction {
string key;
bytes data;
}

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

struct SuperchainUpgradeInput {
ISuperchainConfig superchainConfig;
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();
error SemverComp_InvalidSemverParts();
error UnsupportedERCVersion(uint8 version);
error NotABlueprint();
error DeploymentFailed();
error EmptyInitcode();
error UnexpectedPreambleData(bytes data);

function __constructor__(
IOPContractsManagerContainer _contractsContainer,
IOPContractsManagerStandardValidator _standardValidator
)
external;

function blueprints() external view returns (IOPContractsManagerContainer.Blueprints memory);

function implementations() external view returns (IOPContractsManagerContainer.Implementations memory);

function contractsContainer() external view returns (IOPContractsManagerContainer);

function standardValidator() external view returns (IOPContractsManagerStandardValidator);

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

/// @notice Upgrades Superchain-wide contracts.
function upgradeSuperchain(SuperchainUpgradeInput memory _inp)
external
returns (SuperchainContracts memory);

/// @notice Deploys and wires a complete OP Chain per the provided configuration.
function deploy(FullConfig memory _cfg) external returns (ChainContracts memory);

/// @notice Upgrades contracts on an existing OP Chain per the provided input.
function upgrade(UpgradeInput memory _inp) external returns (ChainContracts memory);

/// @notice Returns whether a development feature is enabled.
function isDevFeatureEnabled(bytes32 _feature) external view returns (bool);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IStorageSetter {
struct Slot {
bytes32 key;
bytes32 value;
}

function version() external view returns (string memory);
function setBytes32(bytes32 _slot, bytes32 _value) external;
function setBytes32(Slot[] calldata _slots) external;
function getBytes32(bytes32 _slot) external view returns (bytes32 value_);
function setUint(bytes32 _slot, uint256 _value) external;
function getUint(bytes32 _slot) external view returns (uint256 value_);
function setAddress(bytes32 _slot, address _address) external;
function getAddress(bytes32 _slot) external view returns (address addr_);
function setBool(bytes32 _slot, bool _value) external;
function getBool(bytes32 _slot) external view returns (bool value_);

function __constructor__() external;
}
2 changes: 1 addition & 1 deletion packages/contracts-bedrock/justfile
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ coverage-lcov-upgrade *ARGS: build-go-ffi
# Runs coverage-lcov and coverage-lcov-upgrade and merges their output files info one file
coverage-lcov-all *ARGS:
just coverage-lcov {{ARGS}} && \
just coverage-lcov-upgrade --match-contract OPContractsManager_Upgrade_Test {{ARGS}} && \
just coverage-lcov-upgrade --match-contract "OPContractsManager.*_Upgrade_Test" {{ARGS}} && \
lcov -a lcov.info -a lcov-upgrade.info -o lcov-all.info

########################################################
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"},
[]string{"forge-artifacts/OPContractsManager.sol/*.json", "forge-artifacts/OPContractsManagerV2.sol/*.json", "forge-artifacts/opcm/OPContractsManagerV2.sol/*.json"},
processFile,
); err != nil {
fmt.Printf("error: %v\n", err)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,9 @@ func checkTestStructure(artifact *solc.ForgeArtifact) []error {
if len(contractParts) == 2 && contractParts[1] == "TestInit" {
// Pattern: <ContractName>_TestInit
continue
} else if len(contractParts) == 3 && contractParts[2] == "TestInit" {
// Pattern: <ContractName>_<Subsystem>_TestInit
continue
} else if len(contractParts) == 2 && contractParts[1] == "Harness" {
// Pattern: <ContractName>_Harness
continue
Expand All @@ -250,7 +253,7 @@ func checkTestStructure(artifact *solc.ForgeArtifact) []error {
errors = append(errors, checkTestMethodName(artifact, contractName, contractParts[1], contractParts[2])...)
} else {
// Invalid naming pattern
errors = append(errors, fmt.Errorf("contract '%s': invalid naming pattern. Expected patterns: <ContractName>_TestInit, <ContractName>_<FunctionName>_Test, or <ContractName>_Uncategorized_Test", contractName))
errors = append(errors, fmt.Errorf("contract '%s': invalid naming pattern. Expected patterns: <ContractName>_TestInit, <ContractName>_<Subsystem>_TestInit, <ContractName>_Harness, <ContractName>_<FunctionName>_Test, <ContractName>_<Descriptor>_Harness, or <ContractName>_Uncategorized_Test", contractName))
}
}

Expand Down
Loading