diff --git a/cannon/mipsevm/tests/evm_multithreaded_test.go b/cannon/mipsevm/tests/evm_multithreaded_test.go index a3c0999d35c37..3ba429108f85a 100644 --- a/cannon/mipsevm/tests/evm_multithreaded_test.go +++ b/cannon/mipsevm/tests/evm_multithreaded_test.go @@ -234,7 +234,6 @@ func TestEVM_MT_StoreOpsClearMemReservation32(t *testing.T) { } func TestEVM_SysClone_FlagHandling(t *testing.T) { - contracts := testutil.TestContractsSetup(t, testutil.MipsMultithreaded) cases := []struct { name string @@ -283,7 +282,7 @@ func TestEVM_SysClone_FlagHandling(t *testing.T) { require.Equal(t, 2, state.ThreadCount()) } - testutil.ValidateEVM(t, stepWitness, curStep, goVm, multithreaded.GetStateHashFn(), contracts) + testutil.ValidateEVM(t, stepWitness, curStep, goVm, multithreaded.GetStateHashFn(), version.Contracts) }) } } diff --git a/cannon/mipsevm/tests/helpers.go b/cannon/mipsevm/tests/helpers.go index 7c81a70f76834..180473127416a 100644 --- a/cannon/mipsevm/tests/helpers.go +++ b/cannon/mipsevm/tests/helpers.go @@ -99,7 +99,7 @@ type VersionedVMTestCase struct { func GetSingleThreadedTestCase(t require.TestingT) VersionedVMTestCase { return VersionedVMTestCase{ Name: "single-threaded", - Contracts: testutil.TestContractsSetup(t, testutil.MipsSingleThreaded), + Contracts: testutil.TestContractsSetup(t, testutil.MipsSingleThreaded, 0), StateHashFn: singlethreaded.GetStateHashFn(), VMFactory: singleThreadedVmFactory, ElfVMFactory: singleThreadElfVmFactory, @@ -112,7 +112,7 @@ func GetMultiThreadedTestCase(t require.TestingT, version versions.StateVersion) features := versions.FeaturesForVersion(version) return VersionedVMTestCase{ Name: version.String(), - Contracts: testutil.TestContractsSetup(t, testutil.MipsMultithreaded), + Contracts: testutil.TestContractsSetup(t, testutil.MipsMultithreaded, uint8(version)), StateHashFn: multithreaded.GetStateHashFn(), VMFactory: func(po mipsevm.PreimageOracle, stdOut, stdErr io.Writer, log log.Logger, opts ...testutil.StateOption) mipsevm.FPVM { return multiThreadedVmFactory(po, stdOut, stdErr, log, features, opts...) diff --git a/cannon/mipsevm/testutil/evm.go b/cannon/mipsevm/testutil/evm.go index 25f05f124baf6..5dbf83a235c08 100644 --- a/cannon/mipsevm/testutil/evm.go +++ b/cannon/mipsevm/testutil/evm.go @@ -12,6 +12,7 @@ import ( "github.com/ethereum/go-ethereum/core/tracing" "github.com/ethereum/go-ethereum/eth/tracers/logger" "github.com/ethereum/go-ethereum/triedb" + "github.com/holiman/uint256" "github.com/stretchr/testify/require" "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" @@ -42,9 +43,10 @@ type Addresses struct { type ContractMetadata struct { Artifacts *Artifacts Addresses *Addresses + Version uint8 // versions.StateVersion can't be used as it causes dependency cycles } -func TestContractsSetup(t require.TestingT, version MipsVersion) *ContractMetadata { +func TestContractsSetup(t require.TestingT, version MipsVersion, stateVersion uint8) *ContractMetadata { artifacts, err := loadArtifacts(version) require.NoError(t, err) @@ -55,7 +57,7 @@ func TestContractsSetup(t require.TestingT, version MipsVersion) *ContractMetada FeeRecipient: common.Address{0xaa}, } - return &ContractMetadata{Artifacts: artifacts, Addresses: addrs} + return &ContractMetadata{Artifacts: artifacts, Addresses: addrs, Version: stateVersion} } // loadArtifacts loads the Cannon contracts, from the contracts package. @@ -116,9 +118,19 @@ func NewEVMEnv(contracts *ContractMetadata) (*vm.EVM, *state.StateDB) { // pre-deploy the contracts env.StateDB.SetCode(contracts.Addresses.Oracle, contracts.Artifacts.Oracle.DeployedBytecode.Object) - var mipsCtorArgs [32]byte - copy(mipsCtorArgs[12:], contracts.Addresses.Oracle[:]) - mipsDeploy := append(bytes.Clone(contracts.Artifacts.MIPS.Bytecode.Object), mipsCtorArgs[:]...) + var ctorArgs []byte + if contracts.Version == 0 { // Old MIPS.sol doesn't specify the state version in the constructor + var mipsCtorArgs [32]byte + copy(mipsCtorArgs[12:], contracts.Addresses.Oracle[:]) + ctorArgs = mipsCtorArgs[:] + } else { + var mipsCtorArgs [64]byte + copy(mipsCtorArgs[12:], contracts.Addresses.Oracle[:]) + vers := uint256.NewInt(uint64(contracts.Version)).Bytes32() + copy(mipsCtorArgs[32:], vers[:]) + ctorArgs = mipsCtorArgs[:] + } + mipsDeploy := append(bytes.Clone(contracts.Artifacts.MIPS.Bytecode.Object), ctorArgs...) startingGas := uint64(30_000_000) _, deployedMipsAddr, leftOverGas, err := env.Create(contracts.Addresses.Sender, mipsDeploy, startingGas, common.U2560) if err != nil { diff --git a/op-chain-ops/interopgen/recipe.go b/op-chain-ops/interopgen/recipe.go index 22a276e2a3a7a..1ddd035a23e4b 100644 --- a/op-chain-ops/interopgen/recipe.go +++ b/op-chain-ops/interopgen/recipe.go @@ -76,7 +76,7 @@ func (recipe *InteropDevRecipe) Build(addrs devkeys.Addresses) (*WorldConfig, er ChallengePeriodSeconds: big.NewInt(120), ProofMaturityDelaySeconds: big.NewInt(12), DisputeGameFinalityDelaySeconds: big.NewInt(6), - MipsVersion: big.NewInt(2), + MipsVersion: big.NewInt(6), }, UseInterop: true, }, diff --git a/op-deployer/pkg/deployer/bootstrap/implementations.go b/op-deployer/pkg/deployer/bootstrap/implementations.go index 12655bff3761e..50369ce92782f 100644 --- a/op-deployer/pkg/deployer/bootstrap/implementations.go +++ b/op-deployer/pkg/deployer/bootstrap/implementations.go @@ -75,8 +75,8 @@ func (c *ImplementationsConfig) Check() error { } else { c.L1ContractsRelease = "dev" } - if c.MIPSVersion != 1 && c.MIPSVersion != 2 { - return errors.New("MIPS version must be specified as either 1 or 2") + if c.MIPSVersion != 1 && c.MIPSVersion != 6 { + return errors.New("MIPS version must be specified as either 1 or 6") } if c.WithdrawalDelaySeconds == 0 { return errors.New("withdrawal delay in seconds must be specified") diff --git a/op-deployer/pkg/deployer/integration_test/apply_test.go b/op-deployer/pkg/deployer/integration_test/apply_test.go index 3b5fd24cb17ec..66c20e39c3396 100644 --- a/op-deployer/pkg/deployer/integration_test/apply_test.go +++ b/op-deployer/pkg/deployer/integration_test/apply_test.go @@ -352,7 +352,7 @@ func TestProofParamOverrides(t *testing.T) { "preimageOracleChallengePeriod": standard.ChallengePeriodSeconds + 1, "proofMaturityDelaySeconds": standard.ProofMaturityDelaySeconds + 1, "disputeGameFinalityDelaySeconds": standard.DisputeGameFinalityDelaySeconds + 1, - "mipsVersion": standard.MIPSVersion + 1, + "mipsVersion": 6, // Contract enforces a valid value be used "respectedGameType": standard.DisputeGameType, // This must be set to the permissioned game "faultGameAbsolutePrestate": common.Hash{'A', 'B', 'S', 'O', 'L', 'U', 'T', 'E'}, "faultGameMaxDepth": standard.DisputeMaxGameDepth + 1, diff --git a/op-deployer/pkg/deployer/pipeline/dispute_games.go b/op-deployer/pkg/deployer/pipeline/dispute_games.go index 5363ba7c49796..e98dc084d1ccd 100644 --- a/op-deployer/pkg/deployer/pipeline/dispute_games.go +++ b/op-deployer/pkg/deployer/pipeline/dispute_games.go @@ -87,7 +87,7 @@ func deployDisputeGame( case state.VMTypeCannon1, state.VMTypeCannon2: mipsVersion := 1 if game.VMType == state.VMTypeCannon2 { - mipsVersion = 2 + mipsVersion = 6 } out, err := opcm.DeployMIPS(env.L1ScriptHost, opcm.DeployMIPSInput{ diff --git a/op-deployer/pkg/deployer/standard/standard.go b/op-deployer/pkg/deployer/standard/standard.go index 04e971d5b6b71..c36a5537ecdae 100644 --- a/op-deployer/pkg/deployer/standard/standard.go +++ b/op-deployer/pkg/deployer/standard/standard.go @@ -25,7 +25,7 @@ const ( ChallengePeriodSeconds uint64 = 86400 ProofMaturityDelaySeconds uint64 = 604800 DisputeGameFinalityDelaySeconds uint64 = 302400 - MIPSVersion uint64 = 2 + MIPSVersion uint64 = 6 DisputeGameType uint32 = 1 // PERMISSIONED game type DisputeMaxGameDepth uint64 = 73 DisputeSplitDepth uint64 = 30 diff --git a/packages/contracts-bedrock/interfaces/cannon/IMIPS2.sol b/packages/contracts-bedrock/interfaces/cannon/IMIPS2.sol index c1a054e4a53c2..8ce918e87be33 100644 --- a/packages/contracts-bedrock/interfaces/cannon/IMIPS2.sol +++ b/packages/contracts-bedrock/interfaces/cannon/IMIPS2.sol @@ -50,5 +50,5 @@ interface IMIPS2 is ISemver { external returns (bytes32 postState_); - function __constructor__(IPreimageOracle _oracle) external; + function __constructor__(IPreimageOracle _oracle, uint256 /*_stateVersion*/) external; } diff --git a/packages/contracts-bedrock/scripts/checks/check-frozen-files.sh b/packages/contracts-bedrock/scripts/checks/check-frozen-files.sh index e5d7723543108..c44a559918189 100755 --- a/packages/contracts-bedrock/scripts/checks/check-frozen-files.sh +++ b/packages/contracts-bedrock/scripts/checks/check-frozen-files.sh @@ -80,9 +80,9 @@ ALLOWED_FILES=( "src/L2/SuperchainTokenBridge.sol:SuperchainTokenBridge" "src/L2/SuperchainETHBridge.sol:SuperchainETHBridge" "src/L2/WETH.sol:WETH" - # "src/cannon/MIPS.sol:MIPS" - # "src/cannon/MIPS2.sol:MIPS2" - # "src/cannon/MIPS64.sol:MIPS64" + "src/cannon/MIPS.sol:MIPS" + "src/cannon/MIPS2.sol:MIPS2" + "src/cannon/MIPS64.sol:MIPS64" "src/cannon/PreimageOracle.sol:PreimageOracle" # "src/dispute/AnchorStateRegistry.sol:AnchorStateRegistry" "src/dispute/DelayedWETH.sol:DelayedWETH" diff --git a/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol b/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol index 5ec161f3e5d9c..076b3aec27d5a 100644 --- a/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol @@ -262,7 +262,7 @@ contract Deploy is Deployer { dii.set(dii.challengePeriodSeconds.selector, cfg.preimageOracleChallengePeriod()); dii.set(dii.proofMaturityDelaySeconds.selector, cfg.proofMaturityDelaySeconds()); dii.set(dii.disputeGameFinalityDelaySeconds.selector, cfg.disputeGameFinalityDelaySeconds()); - dii.set(dii.mipsVersion.selector, Config.useMultithreadedCannon() ? 2 : 1); + dii.set(dii.mipsVersion.selector, Config.useMultithreadedCannon() ? 6 : 1); string memory release = "dev"; dii.set(dii.l1ContractsRelease.selector, release); dii.set(dii.protocolVersionsProxy.selector, artifacts.mustGetAddress("ProtocolVersionsProxy")); diff --git a/packages/contracts-bedrock/scripts/deploy/DeployImplementations.s.sol b/packages/contracts-bedrock/scripts/deploy/DeployImplementations.s.sol index 1c356ad616d8c..be0570bc53cae 100644 --- a/packages/contracts-bedrock/scripts/deploy/DeployImplementations.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/DeployImplementations.s.sol @@ -15,6 +15,7 @@ import { IProtocolVersions } from "interfaces/L1/IProtocolVersions.sol"; import { IDelayedWETH } from "interfaces/dispute/IDelayedWETH.sol"; import { IPreimageOracle } from "interfaces/cannon/IPreimageOracle.sol"; import { IMIPS } from "interfaces/cannon/IMIPS.sol"; +import { IMIPS2 } from "interfaces/cannon/IMIPS2.sol"; import { IDisputeGameFactory } from "interfaces/dispute/IDisputeGameFactory.sol"; import { IAnchorStateRegistry } from "interfaces/dispute/IAnchorStateRegistry.sol"; import { @@ -838,23 +839,36 @@ contract DeployImplementations is Script { } function deployMipsSingleton(DeployImplementationsInput _dii, DeployImplementationsOutput _dio) public virtual { + IMIPS singleton; uint256 mipsVersion = _dii.mipsVersion(); IPreimageOracle preimageOracle = IPreimageOracle(address(_dio.preimageOracleSingleton())); // We want to ensure that the OPCM for upgrade 13 is deployed with Mips32 on production networks. - if (mipsVersion != 2) { + if (mipsVersion < 2) { if (block.chainid == Chains.Mainnet || block.chainid == Chains.Sepolia) { revert("DeployImplementations: Only Mips64 should be deployed on Mainnet or Sepolia"); } } - IMIPS singleton = IMIPS( - DeployUtils.createDeterministic({ - _name: mipsVersion == 1 ? "MIPS" : "MIPS64", - _args: DeployUtils.encodeConstructor(abi.encodeCall(IMIPS.__constructor__, (preimageOracle))), - _salt: _salt - }) - ); + if (mipsVersion == 1) { + singleton = IMIPS( + DeployUtils.createDeterministic({ + _name: "MIPS", + _args: DeployUtils.encodeConstructor(abi.encodeCall(IMIPS.__constructor__, (preimageOracle))), + _salt: DeployUtils.DEFAULT_SALT + }) + ); + } else { + singleton = IMIPS( + DeployUtils.createDeterministic({ + _name: "MIPS64", + _args: DeployUtils.encodeConstructor( + abi.encodeCall(IMIPS2.__constructor__, (preimageOracle, mipsVersion)) + ), + _salt: DeployUtils.DEFAULT_SALT + }) + ); + } vm.label(address(singleton), "MIPSSingleton"); _dio.set(_dio.mipsSingleton.selector, address(singleton)); } diff --git a/packages/contracts-bedrock/scripts/deploy/DeployImplementations2.s.sol b/packages/contracts-bedrock/scripts/deploy/DeployImplementations2.s.sol index 457fafdcc316b..4fa0c06c8dbda 100644 --- a/packages/contracts-bedrock/scripts/deploy/DeployImplementations2.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/DeployImplementations2.s.sol @@ -14,6 +14,7 @@ import { IProtocolVersions } from "interfaces/L1/IProtocolVersions.sol"; import { IDelayedWETH } from "interfaces/dispute/IDelayedWETH.sol"; import { IPreimageOracle } from "interfaces/cannon/IPreimageOracle.sol"; import { IMIPS } from "interfaces/cannon/IMIPS.sol"; +import { IMIPS2 } from "interfaces/cannon/IMIPS2.sol"; import { IDisputeGameFactory } from "interfaces/dispute/IDisputeGameFactory.sol"; import { IAnchorStateRegistry } from "interfaces/dispute/IAnchorStateRegistry.sol"; import { @@ -400,23 +401,36 @@ contract DeployImplementations2 is Script { } function deployMipsSingleton(Input memory _input, Output memory _output) private { + IMIPS singleton; uint256 mipsVersion = _input.mipsVersion; IPreimageOracle preimageOracle = IPreimageOracle(address(_output.preimageOracleSingleton)); // We want to ensure that the OPCM for upgrade 13 is deployed with Mips32 on production networks. - if (mipsVersion != 2) { + if (mipsVersion < 2) { if (block.chainid == Chains.Mainnet || block.chainid == Chains.Sepolia) { revert("DeployImplementations: Only Mips64 should be deployed on Mainnet or Sepolia"); } } - IMIPS singleton = IMIPS( - DeployUtils.createDeterministic({ - _name: mipsVersion == 1 ? "MIPS" : "MIPS64", - _args: DeployUtils.encodeConstructor(abi.encodeCall(IMIPS.__constructor__, (preimageOracle))), - _salt: _salt - }) - ); + if (mipsVersion == 1) { + singleton = IMIPS( + DeployUtils.createDeterministic({ + _name: "MIPS", + _args: DeployUtils.encodeConstructor(abi.encodeCall(IMIPS.__constructor__, (preimageOracle))), + _salt: DeployUtils.DEFAULT_SALT + }) + ); + } else { + singleton = IMIPS( + DeployUtils.createDeterministic({ + _name: "MIPS64", + _args: DeployUtils.encodeConstructor( + abi.encodeCall(IMIPS2.__constructor__, (preimageOracle, mipsVersion)) + ), + _salt: DeployUtils.DEFAULT_SALT + }) + ); + } vm.label(address(singleton), "MIPSSingleton"); _output.mipsSingleton = singleton; } diff --git a/packages/contracts-bedrock/scripts/deploy/DeployMIPS.s.sol b/packages/contracts-bedrock/scripts/deploy/DeployMIPS.s.sol index f1d58e970015a..b77c21435a385 100644 --- a/packages/contracts-bedrock/scripts/deploy/DeployMIPS.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/DeployMIPS.s.sol @@ -11,6 +11,7 @@ import { DeployUtils } from "scripts/libraries/DeployUtils.sol"; // Interfaces import { IPreimageOracle } from "interfaces/cannon/IPreimageOracle.sol"; import { IMIPS } from "interfaces/cannon/IMIPS.sol"; +import { IMIPS2 } from "interfaces/cannon/IMIPS2.sol"; /// @title DeployMIPSInput contract DeployMIPSInput is BaseDeployIO { @@ -22,7 +23,7 @@ contract DeployMIPSInput is BaseDeployIO { function set(bytes4 _sel, uint256 _value) public { if (_sel == this.mipsVersion.selector) { - require(_value == 1 || _value == 2, "DeployMIPS: unknown mips version"); + require(_value == 1 || _value == 6, "DeployMIPS: unknown mips version"); _mipsVersion = _value; } else { revert("DeployMIPS: unknown selector"); @@ -40,7 +41,7 @@ contract DeployMIPSInput is BaseDeployIO { function mipsVersion() public view returns (uint256) { require(_mipsVersion != 0, "DeployMIPS: mipsVersion not set"); - require(_mipsVersion == 1 || _mipsVersion == 2, "DeployMIPS: unknown mips version"); + require(_mipsVersion == 1 || _mipsVersion == 6, "DeployMIPS: unknown mips version"); return _mipsVersion; } @@ -80,13 +81,25 @@ contract DeployMIPS is Script { IMIPS singleton; uint256 mipsVersion = _mi.mipsVersion(); IPreimageOracle preimageOracle = IPreimageOracle(_mi.preimageOracle()); - singleton = IMIPS( - DeployUtils.createDeterministic({ - _name: mipsVersion == 1 ? "MIPS" : "MIPS64", - _args: DeployUtils.encodeConstructor(abi.encodeCall(IMIPS.__constructor__, (preimageOracle))), - _salt: DeployUtils.DEFAULT_SALT - }) - ); + if (mipsVersion == 1) { + singleton = IMIPS( + DeployUtils.createDeterministic({ + _name: "MIPS", + _args: DeployUtils.encodeConstructor(abi.encodeCall(IMIPS.__constructor__, (preimageOracle))), + _salt: DeployUtils.DEFAULT_SALT + }) + ); + } else { + singleton = IMIPS( + DeployUtils.createDeterministic({ + _name: "MIPS64", + _args: DeployUtils.encodeConstructor( + abi.encodeCall(IMIPS2.__constructor__, (preimageOracle, mipsVersion)) + ), + _salt: DeployUtils.DEFAULT_SALT + }) + ); + } vm.label(address(singleton), "MIPSSingleton"); _mo.set(_mo.mipsSingleton.selector, address(singleton)); diff --git a/packages/contracts-bedrock/scripts/deploy/DeployMIPS2.s.sol b/packages/contracts-bedrock/scripts/deploy/DeployMIPS2.s.sol index 402988a45c098..c6420c401845c 100644 --- a/packages/contracts-bedrock/scripts/deploy/DeployMIPS2.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/DeployMIPS2.s.sol @@ -10,6 +10,7 @@ import { DeployUtils } from "scripts/libraries/DeployUtils.sol"; // Interfaces import { IPreimageOracle } from "interfaces/cannon/IPreimageOracle.sol"; import { IMIPS } from "interfaces/cannon/IMIPS.sol"; +import { IMIPS2 } from "interfaces/cannon/IMIPS2.sol"; /// @title DeployMIPS contract DeployMIPS2 is Script { @@ -33,16 +34,28 @@ contract DeployMIPS2 is Script { } function deployMipsSingleton(Input memory _input, Output memory _output) internal { + IMIPS singleton; uint256 mipsVersion = _input.mipsVersion; - string memory contractName = mipsVersion == 1 ? "MIPS" : "MIPS64"; - IMIPS singleton = IMIPS( - DeployUtils.createDeterministic({ - _name: contractName, - _args: DeployUtils.encodeConstructor(abi.encodeCall(IMIPS.__constructor__, (_input.preimageOracle))), - _salt: DeployUtils.DEFAULT_SALT - }) - ); + if (mipsVersion == 1) { + singleton = IMIPS( + DeployUtils.createDeterministic({ + _name: "MIPS", + _args: DeployUtils.encodeConstructor(abi.encodeCall(IMIPS.__constructor__, (_input.preimageOracle))), + _salt: DeployUtils.DEFAULT_SALT + }) + ); + } else { + singleton = IMIPS( + DeployUtils.createDeterministic({ + _name: "MIPS64", + _args: DeployUtils.encodeConstructor( + abi.encodeCall(IMIPS2.__constructor__, (_input.preimageOracle, mipsVersion)) + ), + _salt: DeployUtils.DEFAULT_SALT + }) + ); + } vm.label(address(singleton), "MIPSSingleton"); _output.mipsSingleton = singleton; @@ -51,7 +64,7 @@ contract DeployMIPS2 is Script { function assertValidInput(Input memory _input) public pure { require(address(_input.preimageOracle) != address(0), "DeployMIPS: preimageOracle not set"); require(_input.mipsVersion != 0, "DeployMIPS: mipsVersion not set"); - require(_input.mipsVersion == 1 || _input.mipsVersion == 2, "DeployMIPS: unknown mips version"); + require(_input.mipsVersion == 1 || _input.mipsVersion == 6, "DeployMIPS: unknown mips version"); } function assertValidOutput(Input memory _input, Output memory _output) public view { diff --git a/packages/contracts-bedrock/snapshots/abi/MIPS2.json b/packages/contracts-bedrock/snapshots/abi/MIPS2.json index 348868bfba0ad..61542d0055f9c 100644 --- a/packages/contracts-bedrock/snapshots/abi/MIPS2.json +++ b/packages/contracts-bedrock/snapshots/abi/MIPS2.json @@ -5,6 +5,11 @@ "internalType": "contract IPreimageOracle", "name": "_oracle", "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" } ], "stateMutability": "nonpayable", diff --git a/packages/contracts-bedrock/snapshots/abi/MIPS64.json b/packages/contracts-bedrock/snapshots/abi/MIPS64.json index a12c96c7a70db..6c660085dacd4 100644 --- a/packages/contracts-bedrock/snapshots/abi/MIPS64.json +++ b/packages/contracts-bedrock/snapshots/abi/MIPS64.json @@ -5,6 +5,11 @@ "internalType": "contract IPreimageOracle", "name": "_oracle", "type": "address" + }, + { + "internalType": "uint256", + "name": "_stateVersion", + "type": "uint256" } ], "stateMutability": "nonpayable", @@ -23,6 +28,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "stateVersion", + "outputs": [ + { + "internalType": "uint256", + "name": "stateVersion_", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -89,5 +107,10 @@ "inputs": [], "name": "InvalidSecondMemoryProof", "type": "error" + }, + { + "inputs": [], + "name": "UnsupportedStateVersion", + "type": "error" } ] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/semver-lock.json b/packages/contracts-bedrock/snapshots/semver-lock.json index be735d36ccc54..e902300426763 100644 --- a/packages/contracts-bedrock/snapshots/semver-lock.json +++ b/packages/contracts-bedrock/snapshots/semver-lock.json @@ -136,12 +136,12 @@ "sourceCodeHash": "0x51d93a684bd9def207a47f6c1dbe481aba5def3f77533d4a6e490784204d113b" }, "src/cannon/MIPS2.sol:MIPS2": { - "initCodeHash": "0x1f4e7cfdbcf7a8ca0ebac69bc7fe74143286a0e51a06ee9cbd699d68efd26dba", - "sourceCodeHash": "0x20256a2196daca39b56bfae1c90b8871349916dc47461b5ca078c2013c067571" + "initCodeHash": "0x74b8f6d89518f661c159df3462430357c42a57449f39a674bd4119c0e1dce024", + "sourceCodeHash": "0x856b07ed8bf3c6c11657af1fcea46cd4b8362fcaa6a9cb90cafe9274c3f8f23e" }, "src/cannon/MIPS64.sol:MIPS64": { - "initCodeHash": "0x0a274f73b9fae62524a5773e480b398846e1140aed373be211a07cb586e4758e", - "sourceCodeHash": "0xb710bd6d4844f9ee45f301bb815786619b5e2d6b2f85ae17f39bee4f414f1957" + "initCodeHash": "0xb0d1143d94422953b1eb8b384cb93f83ee83d00c274ce7fb290ab9b02d89df9a", + "sourceCodeHash": "0x352b1d02660ebe9ea51af30cf10de0c941188806a334bf2cb0bc510464670e84" }, "src/cannon/PreimageOracle.sol:PreimageOracle": { "initCodeHash": "0x6af5b0e83b455aab8d0946c160a4dc049a4e03be69f8a2a9e87b574f27b25a66", diff --git a/packages/contracts-bedrock/src/cannon/MIPS2.sol b/packages/contracts-bedrock/src/cannon/MIPS2.sol index 107edca117e5d..6cf9b8eae9d8b 100644 --- a/packages/contracts-bedrock/src/cannon/MIPS2.sol +++ b/packages/contracts-bedrock/src/cannon/MIPS2.sol @@ -61,8 +61,8 @@ contract MIPS2 is ISemver { } /// @notice The semantic version of the MIPS2 contract. - /// @custom:semver 1.0.0-beta.29 - string public constant version = "1.0.0-beta.29"; + /// @custom:semver 1.1.0 + string public constant version = "1.1.0"; /// @notice The preimage oracle contract. IPreimageOracle internal immutable ORACLE; @@ -83,7 +83,7 @@ contract MIPS2 is ISemver { uint256 internal constant TC_MEM_OFFSET = 0x260; /// @param _oracle The address of the preimage oracle contract. - constructor(IPreimageOracle _oracle) { + constructor(IPreimageOracle _oracle, uint256 /*_stateVersion*/ ) { ORACLE = _oracle; } diff --git a/packages/contracts-bedrock/src/cannon/MIPS64.sol b/packages/contracts-bedrock/src/cannon/MIPS64.sol index 564f7bcddfdb1..51a6fa07d1c50 100644 --- a/packages/contracts-bedrock/src/cannon/MIPS64.sol +++ b/packages/contracts-bedrock/src/cannon/MIPS64.sol @@ -2,19 +2,22 @@ pragma solidity 0.8.15; // Libraries +import { + InvalidMemoryProof, + InvalidRMWInstruction, + InvalidSecondMemoryProof, + UnsupportedStateVersion +} from "src/cannon/libraries/CannonErrors.sol"; +import { MIPS64Arch as arch } from "src/cannon/libraries/MIPS64Arch.sol"; +import { MIPS64Instructions as ins } from "src/cannon/libraries/MIPS64Instructions.sol"; import { MIPS64Memory } from "src/cannon/libraries/MIPS64Memory.sol"; -import { MIPS64Syscalls as sys } from "src/cannon/libraries/MIPS64Syscalls.sol"; import { MIPS64State as st } from "src/cannon/libraries/MIPS64State.sol"; -import { MIPS64Instructions as ins } from "src/cannon/libraries/MIPS64Instructions.sol"; -import { MIPS64Arch as arch } from "src/cannon/libraries/MIPS64Arch.sol"; +import { MIPS64Syscalls as sys } from "src/cannon/libraries/MIPS64Syscalls.sol"; import { VMStatuses } from "src/dispute/lib/Types.sol"; -import { - InvalidMemoryProof, InvalidRMWInstruction, InvalidSecondMemoryProof -} from "src/cannon/libraries/CannonErrors.sol"; // Interfaces -import { ISemver } from "interfaces/universal/ISemver.sol"; import { IPreimageOracle } from "interfaces/cannon/IPreimageOracle.sol"; +import { ISemver } from "interfaces/universal/ISemver.sol"; /// @title MIPS64 /// @notice The MIPS64 contract emulates a single MIPS instruction. @@ -63,12 +66,15 @@ contract MIPS64 is ISemver { } /// @notice The semantic version of the MIPS64 contract. - /// @custom:semver 1.0.0 - string public constant version = "1.0.0"; + /// @custom:semver 1.1.0 + string public constant version = "1.1.0"; /// @notice The preimage oracle contract. IPreimageOracle internal immutable ORACLE; + /// @notice The state version implemented. This identifies the specific state transition rules applied. + uint256 internal immutable STATE_VERSION; + // The offset of the start of proof calldata (_threadWitness.offset) in the step() function uint256 internal constant THREAD_PROOF_OFFSET = 356; @@ -85,8 +91,13 @@ contract MIPS64 is ISemver { uint256 internal constant TC_MEM_OFFSET = 0x260; /// @param _oracle The address of the preimage oracle contract. - constructor(IPreimageOracle _oracle) { + constructor(IPreimageOracle _oracle, uint256 _stateVersion) { + // Supports VersionMultiThreaded64_v3 (v6) + if (_stateVersion != 6) { + revert UnsupportedStateVersion(); + } ORACLE = _oracle; + STATE_VERSION = _stateVersion; } /// @notice Getter for the pre-image oracle contract. @@ -95,6 +106,12 @@ contract MIPS64 is ISemver { oracle_ = ORACLE; } + /// @notice Getter for the state version. + /// @return stateVersion_ The state version implemented by this contract. + function stateVersion() external view returns (uint256 stateVersion_) { + stateVersion_ = STATE_VERSION; + } + /// @notice Executes a single step of the multi-threaded vm. /// Will revert if any required input state is missing. /// @param _stateData The encoded state witness data. diff --git a/packages/contracts-bedrock/src/cannon/libraries/CannonErrors.sol b/packages/contracts-bedrock/src/cannon/libraries/CannonErrors.sol index dd0e78a3a33a1..f2402e1601da6 100644 --- a/packages/contracts-bedrock/src/cannon/libraries/CannonErrors.sol +++ b/packages/contracts-bedrock/src/cannon/libraries/CannonErrors.sol @@ -63,3 +63,6 @@ error InvalidSecondMemoryProof(); /// @notice Thrown when an RMW instruction is expected, but a different instruction is provided. error InvalidRMWInstruction(); + +/// @notice Thrown when the state version set is not supported. +error UnsupportedStateVersion(); diff --git a/packages/contracts-bedrock/test/L1/OPContractsManager.t.sol b/packages/contracts-bedrock/test/L1/OPContractsManager.t.sol index 767d039d04782..30d13b4f74773 100644 --- a/packages/contracts-bedrock/test/L1/OPContractsManager.t.sol +++ b/packages/contracts-bedrock/test/L1/OPContractsManager.t.sol @@ -25,7 +25,7 @@ import { IL1ERC721Bridge } from "interfaces/L1/IL1ERC721Bridge.sol"; import { IL1StandardBridge } from "interfaces/L1/IL1StandardBridge.sol"; import { IOptimismMintableERC20Factory } from "interfaces/universal/IOptimismMintableERC20Factory.sol"; import { IL1CrossDomainMessenger } from "interfaces/L1/IL1CrossDomainMessenger.sol"; -import { IMIPS } from "interfaces/cannon/IMIPS.sol"; +import { IMIPS2 } from "interfaces/cannon/IMIPS2.sol"; import { IOptimismPortal2 } from "interfaces/L1/IOptimismPortal2.sol"; import { IProxy } from "interfaces/universal/IProxy.sol"; import { IProxyAdmin } from "interfaces/universal/IProxyAdmin.sol"; @@ -942,7 +942,7 @@ contract OPContractsManager_TestInit is Test { }), mipsImpl: DeployUtils.create1({ _name: "MIPS64", - _args: DeployUtils.encodeConstructor(abi.encodeCall(IMIPS.__constructor__, (oracle))) + _args: DeployUtils.encodeConstructor(abi.encodeCall(IMIPS2.__constructor__, (oracle, 6))) }) }); diff --git a/packages/contracts-bedrock/test/cannon/MIPS2.t.sol b/packages/contracts-bedrock/test/cannon/MIPS2.t.sol index efc903fae448d..c3bf167cab75f 100644 --- a/packages/contracts-bedrock/test/cannon/MIPS2.t.sol +++ b/packages/contracts-bedrock/test/cannon/MIPS2.t.sol @@ -144,7 +144,7 @@ contract MIPS2_Test is CommonTest { DeployUtils.create1({ _name: "MIPS2", _args: DeployUtils.encodeConstructor( - abi.encodeCall(IMIPS2.__constructor__, (IPreimageOracle(address(oracle)))) + abi.encodeCall(IMIPS2.__constructor__, (IPreimageOracle(address(oracle)), 6)) ) }) ); diff --git a/packages/contracts-bedrock/test/opcm/DeployMIPS2.t.sol b/packages/contracts-bedrock/test/opcm/DeployMIPS2.t.sol index 3ae0bc9916688..9e5ad0ec330e6 100644 --- a/packages/contracts-bedrock/test/opcm/DeployMIPS2.t.sol +++ b/packages/contracts-bedrock/test/opcm/DeployMIPS2.t.sol @@ -41,13 +41,13 @@ contract DeployMIPS2_Test is Test { function testFuzz_run_mipsVersion2_succeeds(DeployMIPS2.Input memory _input) public { vm.assume(address(_input.preimageOracle) != address(0)); - _input.mipsVersion = 2; + _input.mipsVersion = 6; // Run the deployment script. DeployMIPS2.Output memory output1 = deployMIPS.run(_input); // Make sure we deployed the correct MIPS - MIPS64 mips = new MIPS64(_input.preimageOracle); + MIPS64 mips = new MIPS64(_input.preimageOracle, _input.mipsVersion); assertEq(address(output1.mipsSingleton).code, address(mips).code, "100"); // Run the deployment script again