Commit ffd9ed47 authored by smartcontracts's avatar smartcontracts Committed by GitHub

fix: initialization tests (#11674)

Fixes the initialization tests, existing tests were not properly
verifying that all of the initializable contracts were being
accounted for.
parent 91c7ed0d
......@@ -28,13 +28,15 @@ struct Deployment {
abstract contract Artifacts {
/// @notice Foundry cheatcode VM.
Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
/// @notice Error for when attempting to fetch a deployment and it does not exist
/// @notice Error for when attempting to fetch a deployment and it does not exist
error DeploymentDoesNotExist(string);
/// @notice Error for when trying to save an invalid deployment
error InvalidDeployment(string);
/// @notice The set of deployments that have been done during execution.
/// @notice Error for when attempting to load the initialized slot of an unsupported contract.
error UnsupportedInitializableContract(string);
/// @notice The set of deployments that have been done during execution.
mapping(string => Deployment) internal _namedDeployments;
/// @notice The same as `_namedDeployments` but as an array.
Deployment[] internal _newDeployments;
......@@ -211,6 +213,13 @@ abstract contract Artifacts {
/// @notice Returns the value of the internal `_initialized` storage slot for a given contract.
function loadInitializedSlot(string memory _contractName) public returns (uint8 initialized_) {
// FaultDisputeGame and PermissionedDisputeGame are initializable but cannot be loaded with
// this function yet because they are not properly labeled in the deploy script.
// TODO: Remove this restriction once the deploy script is fixed.
if (LibString.eq(_contractName, "FaultDisputeGame") || LibString.eq(_contractName, "PermissionedDisputeGame")) {
revert UnsupportedInitializableContract(_contractName);
}
address contractAddress;
// Check if the contract name ends with `Proxy` and, if so, get the implementation address
if (LibString.endsWith(_contractName, "Proxy")) {
......
......@@ -3,6 +3,7 @@ pragma solidity ^0.8.0;
import { Vm } from "forge-std/Vm.sol";
import { stdJson } from "forge-std/StdJson.sol";
import { LibString } from "@solady/utils/LibString.sol";
import { Executables } from "scripts/libraries/Executables.sol";
import { Process } from "scripts/libraries/Process.sol";
......@@ -83,6 +84,67 @@ library ForgeArtifacts {
ids_ = stdJson.readStringArray(string(res), "");
}
/// @notice Returns the kind of contract (i.e. library, contract, or interface).
/// @param _name The name of the contract to get the kind of.
/// @return kind_ The kind of contract ("library", "contract", or "interface").
function getContractKind(string memory _name) internal returns (string memory kind_) {
string[] memory cmd = new string[](3);
cmd[0] = Executables.bash;
cmd[1] = "-c";
cmd[2] = string.concat(
Executables.jq,
" -r '.ast.nodes[] | select(.nodeType == \"ContractDefinition\") | .contractKind' < ",
_getForgeArtifactPath(_name)
);
bytes memory res = Process.run(cmd);
kind_ = string(res);
}
/// @notice Returns whether or not a contract is proxied.
/// @param _name The name of the contract to check.
/// @return out_ Whether or not the contract is proxied.
function isProxiedContract(string memory _name) internal returns (bool out_) {
// TODO: Using the `@custom:proxied` tag is to determine if a contract is meant to be
// proxied is functional but developers can easily forget to add the tag when writing a new
// contract. We should consider determining whether a contract is proxied based on the
// deployment script since it's the source of truth for that. Current deployment script
// does not make this easy but an updated script should likely make this possible.
string[] memory cmd = new string[](3);
cmd[0] = Executables.bash;
cmd[1] = "-c";
cmd[2] = string.concat(
Executables.jq,
" -r '.rawMetadata' ",
_getForgeArtifactPath(_name),
" | ",
Executables.jq,
" -r '.output.devdoc' | jq -r 'has(\"custom:proxied\")'"
);
bytes memory res = Process.run(cmd);
out_ = stdJson.readBool(string(res), "");
}
/// @notice Returns whether or not a contract is predeployed.
/// @param _name The name of the contract to check.
/// @return out_ Whether or not the contract is predeployed.
function isPredeployedContract(string memory _name) internal returns (bool out_) {
// TODO: Similar to the above, using the `@custom:predeployed` tag is not reliable but
// functional for now. Deployment script should make this easier to determine.
string[] memory cmd = new string[](3);
cmd[0] = Executables.bash;
cmd[1] = "-c";
cmd[2] = string.concat(
Executables.jq,
" -r '.rawMetadata' ",
_getForgeArtifactPath(_name),
" | ",
Executables.jq,
" -r '.output.devdoc' | jq -r 'has(\"custom:predeploy\")'"
);
bytes memory res = Process.run(cmd);
out_ = stdJson.readBool(string(res), "");
}
function _getForgeArtifactDirectory(string memory _name) internal returns (string memory dir_) {
string[] memory cmd = new string[](3);
cmd[0] = Executables.bash;
......@@ -128,6 +190,14 @@ library ForgeArtifacts {
function getInitializedSlot(string memory _contractName) internal returns (StorageSlot memory slot_) {
string memory storageLayout = getStorageLayout(_contractName);
// FaultDisputeGame and PermissionedDisputeGame use a different name for the initialized storage slot.
string memory slotName = "_initialized";
string memory slotType = "t_uint8";
if (LibString.eq(_contractName, "FaultDisputeGame") || LibString.eq(_contractName, "PermissionedDisputeGame")) {
slotName = "initialized";
slotType = "t_bool";
}
string[] memory command = new string[](3);
command[0] = Executables.bash;
command[1] = "-c";
......@@ -138,7 +208,11 @@ library ForgeArtifacts {
"'",
" | ",
Executables.jq,
" '.storage[] | select(.label == \"_initialized\" and .type == \"t_uint8\")'"
" '.storage[] | select(.label == \"",
slotName,
"\" and .type == \"",
slotType,
"\")'"
);
bytes memory rawSlot = vm.parseJson(string(Process.run(command)));
slot_ = abi.decode(rawSlot, (StorageSlot));
......@@ -152,18 +226,21 @@ library ForgeArtifacts {
initialized_ = uint8((uint256(slotVal) >> (slot.offset * 8)) & 0xFF) != 0;
}
/// @notice Returns the function ABIs of all L1 contracts.
function getContractFunctionAbis(
string memory path,
string[] memory pathExcludes
/// @notice Returns the names of all contracts in a given directory.
/// @param _path The path to search for contracts.
/// @param _pathExcludes An array of paths to exclude from the search.
/// @return contractNames_ An array of contract names.
function getContractNames(
string memory _path,
string[] memory _pathExcludes
)
internal
returns (Abi[] memory abis_)
returns (string[] memory contractNames_)
{
string memory pathExcludesPat;
for (uint256 i = 0; i < pathExcludes.length; i++) {
pathExcludesPat = string.concat(pathExcludesPat, " -path \"", pathExcludes[i], "\"");
if (i != pathExcludes.length - 1) {
for (uint256 i = 0; i < _pathExcludes.length; i++) {
pathExcludesPat = string.concat(pathExcludesPat, " -path \"", _pathExcludes[i], "\"");
if (i != _pathExcludes.length - 1) {
pathExcludesPat = string.concat(pathExcludesPat, " -o ");
}
}
......@@ -174,7 +251,7 @@ library ForgeArtifacts {
command[2] = string.concat(
Executables.find,
" ",
path,
_path,
bytes(pathExcludesPat).length > 0 ? string.concat(" ! \\( ", pathExcludesPat, " \\)") : "",
" -type f ",
"-exec basename {} \\;",
......@@ -185,8 +262,19 @@ library ForgeArtifacts {
Executables.jq,
" -R -s 'split(\"\n\")[:-1]'"
);
string[] memory contractNames = abi.decode(vm.parseJson(string(Process.run(command))), (string[]));
contractNames_ = abi.decode(vm.parseJson(string(Process.run(command))), (string[]));
}
/// @notice Returns the function ABIs of all L1 contracts.
function getContractFunctionAbis(
string memory path,
string[] memory pathExcludes
)
internal
returns (Abi[] memory abis_)
{
string[] memory contractNames = getContractNames(path, pathExcludes);
abis_ = new Abi[](contractNames.length);
for (uint256 i; i < contractNames.length; i++) {
......
{
"src/EAS/EAS.sol": {
"initCodeHash": "0x1a097f352425b503a28c795dbfd390f2bc330e9c1f8a27bd26cf243b6c703499",
"sourceCodeHash": "0x23287e96b00c31ab57b05090525afdebf8e45ca09253a21b95052cf7d94e071b"
"initCodeHash": "0xf96d1ebc530ed95e2dffebcfa2b4a1f18103235e6352d97838b77b7a2c14567b",
"sourceCodeHash": "0xfaeb13f74d79a5fa8539ab3c9b8b8053b05cec78317aaf132bdeedb4018541cd"
},
"src/EAS/SchemaRegistry.sol": {
"initCodeHash": "0xf4c3155413be4a4ebaaba66b9f9daaf12db7b090afdea739dfb8a543df357289",
"sourceCodeHash": "0x2ed7a2d6d66839fb3d207952f44b001bce349334adc40ce66d0503ce64e48548"
"initCodeHash": "0x06ae2c0b39c215b7fa450d382916ce6f5c6f9f2d630e572db6b72d688255b3fd",
"sourceCodeHash": "0x7e716bd2827a8f696c9345ec01ed037559447540771ffbcf3eba38f57b085a20"
},
"src/L1/DataAvailabilityChallenge.sol": {
"initCodeHash": "0x9e9ac7238791b2eaade946e58b98f6f1f43f60b8b393664d85a553857a0ab5c7",
"sourceCodeHash": "0xf6c72a2cca24cfa7c9274d720e93b05d665a2751cca3d747105e6c511ccffc73"
"initCodeHash": "0xcc96cf2e4d841adb7ecb9dd84abeb0893dd62d913c0d47ab5b66a893c6e47e88",
"sourceCodeHash": "0x9d791696967f50c7a7b35b1fef3b00adaa61846623cc284e3a2b8599b77909ae"
},
"src/L1/DelayedVetoable.sol": {
"initCodeHash": "0x84f78e56211500a768b2c5bbafde8e7b411bd64c237297370d7d22326b68357c",
"sourceCodeHash": "0xc59b8574531162e016d7342aeb6e79d05574e90dbea6c0e5ede35b65010ad894"
},
"src/L1/L1CrossDomainMessenger.sol": {
"initCodeHash": "0x1f97347da46930d5b3cd40bd2699a6b78812e5f597793c8d59a90b0ef6800da8",
"sourceCodeHash": "0x56a2d3abed97eb7b292db758aac1e36fc08a12bfa44f7969824e26866a1417fa"
"initCodeHash": "0x48db42620b9f16e0dec2355f4076314f82fd0f60ef04c10cdbc266eac9472515",
"sourceCodeHash": "0xdfdbc9849a5147bb1f9ffd1d886fc0399016c3dccaabaa61fc6735c1b4af774b"
},
"src/L1/L1ERC721Bridge.sol": {
"initCodeHash": "0xd56de5c193758c0c2ef3456ef9331fbcb56f7f6f4185d4a2ceeebf4f31512013",
"sourceCodeHash": "0xa8b7c9682717efbc27212ead24ba345253d18f2068126b905cc7515603288553"
"initCodeHash": "0xda80d225e332f9ab38d5f3ae655df3eea1dd56dbb523036a25c78859d2931ada",
"sourceCodeHash": "0xa4e78a2440fb560366e84e5f0ba59932ee564ff47ac3aa9a2c489fff4d6fd061"
},
"src/L1/L1StandardBridge.sol": {
"initCodeHash": "0x508977d2517b49649bef57899e2c2519c271953708b2c84325377dae64a92baf",
"sourceCodeHash": "0x0d07e526c1891abb81c7e94f73642caa8ee386ab036b3b2a67f1b21ca85089c5"
"initCodeHash": "0x2868b09ecbe9f2bbc885605c2886b4c79f1c8e4171626c63776603b1b84698a8",
"sourceCodeHash": "0xfde1de7fa0f0d4840768abab775901c07e16ab59835a20e7a8ef512fa85acfcb"
},
"src/L1/L2OutputOracle.sol": {
"initCodeHash": "0x14c3a582ca46ef2a6abad5590323f4de26ff4de54415c927c62e131ccbf8d9ba",
"sourceCodeHash": "0xf5fcf570721e25459fadbb37e02f9efe349e1c8afcbf1e3b5fdb09c9f612cdc0"
"initCodeHash": "0x433fac9de52d8ce8fc3471b78ef6cc9cff1019f480c9ad91b6e09ab8738a8edb",
"sourceCodeHash": "0xf0c0655221c36cfe918818ca300cca74a3713be3da090b2072eb81ba29c59e38"
},
"src/L1/OPStackManager.sol": {
"initCodeHash": "0x1630942414d9711137028c48f37b6fcd7fbbedc147102e31ebcdcc03a9645c6a",
"sourceCodeHash": "0x8e9a47583c4c3d711c2b7cc5e0f86495e29d4e79c38415dd3d342e1d1aae4fb7"
"initCodeHash": "0x67bf02405bf1ca7d78c4215c350ad9c5c7b4cece35d9fab837f279d65f995c5d",
"sourceCodeHash": "0xf5db686a001aeb47cab09bb377ae226e872c806b4f5eff869d4dd6367f47c471"
},
"src/L1/OptimismPortal.sol": {
"initCodeHash": "0xfdc8cf0b0b26961f6ac493ee564761716447d263291bea4d366a7b94afe33392",
"sourceCodeHash": "0x9fe0a9001edecd2a04daada4ca9e17d66141b1c982f73653493b4703d2c675c4"
"initCodeHash": "0x6bf59539298b20221de6c51db21016be8d3278bdbe0be1cdd49638dc828e003e",
"sourceCodeHash": "0x9ca40fb207eae615087f07041d4ce5349c74d7beebae1c74181c91a8631162bb"
},
"src/L1/OptimismPortal2.sol": {
"initCodeHash": "0x12071439501e60420ab217cea4477306864014b66722d09b8cb8e01369f343ec",
"sourceCodeHash": "0xf597b9dcb97e733948a7179b8951dd46e4bb1ebc0715dd9440ffdabe0ecb0843"
"initCodeHash": "0x414ad1fdb6296ac32fc67ce01288b6e67bedd2ed239d7eb8ed40c7f55f9021f2",
"sourceCodeHash": "0x1af32dcddecb37ccc875edbc10203cac04319953de04bd3cba02a1740a6a0827"
},
"src/L1/OptimismPortalInterop.sol": {
"initCodeHash": "0xa8ce00980799cb918b44fbbfdf4370a069d3bd15a92b2ed6850e98ebc0388b86",
"sourceCodeHash": "0xe3805faeb962594d5c2c18cdeb35c2db1248393650bec2ad5cadf41759f151f2"
"initCodeHash": "0x9222fba222d1ab66898eef09ecea3ea757e64c8ae98def4da7808cd7cc8f39a8",
"sourceCodeHash": "0x3fc9d9fc1143bec92801f8a18ad3527533923dc26c4820d03d6905f519d735b4"
},
"src/L1/ProtocolVersions.sol": {
"initCodeHash": "0x72cd467e8bcf019c02675d72ab762e088bcc9cc0f1a4e9f587fa4589f7fdd1b8",
"sourceCodeHash": "0xbd56a23cd3221cb9d25029e80cd9f2afe2c615ae9c0b3956bf6ed373b8b805b6"
"initCodeHash": "0x8f033874dd8b36615b2209d553660dcff1ff91ca2bad3ca1de7b441dbfba4842",
"sourceCodeHash": "0xc823fcc6ddb4be71b5177b46748415fe5d54c2970696a00db896bec615b482d6"
},
"src/L1/SuperchainConfig.sol": {
"initCodeHash": "0xa71c67640d6a25c750fef910a5fe85776ebb7bb18c677bb1b9b95c2f3f561b0c",
"sourceCodeHash": "0xd6a894e371c2c7182b5960c507491f81c3775dda0efedd29475f7c30ca07b004"
"initCodeHash": "0xfca12d9016c746e5c275b186e0ca40cfd65cf45a5665aab7589a669fea3abb47",
"sourceCodeHash": "0x4dc2a082013a7d7b76c74d15b4e9c755b0c99511ee3dd3cb4e42e9a269575135"
},
"src/L1/SystemConfig.sol": {
"initCodeHash": "0x3324c93485f594bccb2af1a0c5a3551948ae9b347baea371764ce8fe239c39be",
"sourceCodeHash": "0xaed39fb8a0ce4b8d7a97ead42074e0c672fa18a58a57227b9d32abe2c3600223"
"initCodeHash": "0x2fc36af5b3c493a423a19e0b597f6ff230b756b861b68099f3192d69b6088dc0",
"sourceCodeHash": "0xd7b18e0acf8363edcffcf38cdfdc21b9a4b8eba4656b6c6524a4629bb09c9aef"
},
"src/L1/SystemConfigInterop.sol": {
"initCodeHash": "0x42e1000d8542f9cbb197314d423760543d4d716d9640b2134c0d881557b22f4f",
"sourceCodeHash": "0xccb5b1ea5f1d5c4a583a2a6941db072fc3ad60ac3d08d085f17a672f6a7e2851"
"initCodeHash": "0xc5a3ffc59dd7bf1ef238087414cfa04b37f0d83fc9a4f5e6d62a1059a23359f3",
"sourceCodeHash": "0x71606c81ff4e69bac78d04731287c34dfb20a648ad384646926a62c16344e0d7"
},
"src/L2/BaseFeeVault.sol": {
"initCodeHash": "0x623bf6892f0bdb536f2916bc9eb45e52012ad2c80893ff87d750757966b9be68",
"sourceCodeHash": "0x3a725791a0f5ed84dc46dcdae26f6170a759b2fe3dc360d704356d088b76cfd6"
"initCodeHash": "0x3bfcd57e25ad54b66c374f63e24e33a6cf107044aa8f5f69ef21202c380b5c5b",
"sourceCodeHash": "0x0861b8415b4657a3aee4ab5e019c42204730597ca2d6355f34e8cf7a76d3ce27"
},
"src/L2/CrossL2Inbox.sol": {
"initCodeHash": "0x071b53cd8cf0503af856c4ee0ee34643e85059d53c096453891225472e02abfa",
"sourceCodeHash": "0xc3478a7036b8c58ed1a90ad90556a62c99a4abb124b0fa47f2edfca31eec680f"
"initCodeHash": "0x926ec5b92a5ff032c00ae13f1156332cb43b98b89573467e9ddfab6fce9f3e95",
"sourceCodeHash": "0xdb08fd714670d13c9c9a191f7ba07e9a208d94db379103c1f0f3812ed805f2cd"
},
"src/L2/ETHLiquidity.sol": {
"initCodeHash": "0x98177562fca0de0dfea5313c9acefe2fdbd73dee5ce6c1232055601f208f0177",
"sourceCodeHash": "0x6dc23ceeed5a63fdc98ba8e5099df1822f3eeaa8c82afb1fa3235ff68a37b274"
},
"src/L2/GasPriceOracle.sol": {
"initCodeHash": "0xb16f1e370e58c7693fd113a21a1b1e7ccebc03d4f1e5a76786fc27847ef51ead",
"sourceCodeHash": "0x5529ee28aae94904a1c08a8b188f51a39a0f51fbd3b43f1abd4fee7bba57998c"
"initCodeHash": "0xa1aae095643272e2dd08f8121dd4425cc8d4fd798cd39db63e4b957863efa8c1",
"sourceCodeHash": "0xa170fff280d94991082efffa40b6daa3dd9eff7fe6c5b1bc31e40bc128bff94e"
},
"src/L2/L1Block.sol": {
"initCodeHash": "0xfd099da051edf13b147f4382ab4bed9db546d0c48157736ba298fb7e178b20d9",
"sourceCodeHash": "0x24db623574743432626ed0d7dd938bbd2149b570a00328c772debd7eb179ff1d"
"initCodeHash": "0xb12c0560e4e0aed12df5f65a1bc2b302afd183601c149285a26eafe5e4c20c0e",
"sourceCodeHash": "0x69c652c2920e6a6226f3f8f3e6ea3a977c7b15f9efb11916858613e8c8d6903b"
},
"src/L2/L1BlockInterop.sol": {
"initCodeHash": "0x6833a323934b3be1e5a5c7491c652b6e90bc5102416ddbb255b5f65aa6d5d4a1",
"sourceCodeHash": "0xd8ec2f814690d1ffd55e5b8496bca5a179d6d1772d61f71cdf8296c9058dc2c6"
"initCodeHash": "0xd2afdf64b0232264e4996e0557523c108c2f12a9b6d2de45dfd961f7a1c927e3",
"sourceCodeHash": "0xfd2283b341239be76b0b8fa067e8ccdf71ef5b29eb75df6783d9f004a9203530"
},
"src/L2/L1FeeVault.sol": {
"initCodeHash": "0x623bf6892f0bdb536f2916bc9eb45e52012ad2c80893ff87d750757966b9be68",
"sourceCodeHash": "0x29c64c43e3deedfa63572d36ce511febb99e500352a003242aed339716d3e3ce"
"initCodeHash": "0x3bfcd57e25ad54b66c374f63e24e33a6cf107044aa8f5f69ef21202c380b5c5b",
"sourceCodeHash": "0x35dc3bb4ab3d02cf9c1e12b0f6796d7eda9d314598bfdecab2812fe9159f443c"
},
"src/L2/L2CrossDomainMessenger.sol": {
"initCodeHash": "0xad95e4e98adf35ea2baeb15348d751fc76e1bb0d001474d4eaefba47f7aeaf5f",
"sourceCodeHash": "0x440d299b7429c44f6faa4005b33428f9edc1283027d9c78a63eb3d76452bfa47"
"initCodeHash": "0xe7090ce8119fe373d930baa68c1df585953b7f6e8beea2a0084589d394bcab64",
"sourceCodeHash": "0x22033cd1923c9d52d9520de773b332ae179528065e4b8f5e37a9aaf59d140735"
},
"src/L2/L2ERC721Bridge.sol": {
"initCodeHash": "0x72443939e0218f1faca4cabe957a77bb232db726d74d422bda15d1cb26857735",
"sourceCodeHash": "0xb0806d362ba5cc39acfb09e0606059a2b10a7c1d5bc1f86cd4561fd24f7dcada"
"initCodeHash": "0x827077e1a0ce6c8f9ee1196c409ea77d831efd440992b3969b05259083cdf0bd",
"sourceCodeHash": "0xd3c25187a46c7f42dfbbcb54e45b11101acc99c014e013ef8e5b9e868220f525"
},
"src/L2/L2StandardBridge.sol": {
"initCodeHash": "0xfbfc7bd101022024b94114c26128c6028c25dec07e8d40fdcfdb180c0ba6ddee",
"sourceCodeHash": "0xb1a5fb22b124e8fa8eb5bae4b8e0770abbdbebe32be00480317cf4aaada28ed3"
"initCodeHash": "0x01692b613e3d4e649d877a0fd8f0798a26401ba8ccc4cda0e61f1f9079729320",
"sourceCodeHash": "0x09cf9e0d84c8d29fbf9c3288a38807edcd7c456427e222e1fd1f7aa4dbf73352"
},
"src/L2/L2StandardBridgeInterop.sol": {
"initCodeHash": "0xd7f85eef12b60211104cddbd86d9f458cd31a0ba74f382404799bcf86ef003ba",
"sourceCodeHash": "0x00f415380689a5ee1762e93b032d5c3de2fcddb36b0a068cb5616f7e8001ddc0"
"initCodeHash": "0x5c9ef6b0817f715d1b8b097f3fc19e33bc54453426ca12bb48e4cea143076339",
"sourceCodeHash": "0xd28d1a4bf6c66fa26f180988b26ea564afa024f8181eca6c23e5dc5dfd5757cd"
},
"src/L2/L2ToL1MessagePasser.sol": {
"initCodeHash": "0x08bbede75cd6dfd076903b8f04d24f82fa7881576c135825098778632e37eebc",
"sourceCodeHash": "0x8388b9b8075f31d580fed815b66b45394e40fb1a63cd8cda2272d2c390fc908c"
"initCodeHash": "0x13fe3729beb9ed966c97bef09acb9fe5043fe651d453145073d05f2567fa988d",
"sourceCodeHash": "0xe4e768c5f60111188979a334b684a4d9c9267375cfa991897432b5a415bea516"
},
"src/L2/L2ToL2CrossDomainMessenger.sol": {
"initCodeHash": "0x3a18ecd5415ddcb7c26023f29f3acb3bc4e8a261091c3bc529b8b4d497b92469",
"sourceCodeHash": "0x972564d2e2fab111cd431f3c78d00c7b0f0ae422fa5e9a8bf5b202cdaef89bf9"
"initCodeHash": "0x3e4337542234c732a55e60fc20dcb1ad639ff2fb378e3f29e94b4059df9a637b",
"sourceCodeHash": "0x5d266f4f380cee7a267f000af16ed2fb9399fda773a7e4543d3dc1c9df982a65"
},
"src/L2/OptimismSuperchainERC20.sol": {
"initCodeHash": "0xd49214518ea1a30a43fac09f28b2cee9be570894a500cef342762c9820a070b0",
"sourceCodeHash": "0x6943d40010dcbd1d51dc3668d0a154fbb1568ea49ebcf3aa039d65ef6eab321b"
"initCodeHash": "0xdd16dbc0ccbbac53ec2d4273f06334960a907a9f20b7c40300833227ee31d0de",
"sourceCodeHash": "0x8566ff63d42f48ddae977c436dae4773e43f2223800c6a0eb9e4c6cf95b19d77"
},
"src/L2/SequencerFeeVault.sol": {
"initCodeHash": "0xb94145f571e92ee615c6fe903b6568e8aac5fe760b6b65148ffc45d2fb0f5433",
"sourceCodeHash": "0x8f2a54104e5e7105ba03ba37e3ef9b6684a447245f0e0b787ba4cca12957b97c"
"initCodeHash": "0x2e6551705e493bacba8cffe22e564d5c401ae5bb02577a5424e0d32784e13e74",
"sourceCodeHash": "0x846ff8fcc1091aa262cda06f93a6e1a57ae885206fe124bcf23550436a16597e"
},
"src/L2/SuperchainWETH.sol": {
"initCodeHash": "0x599e948350c70d699f8a8be945abffd126097de97fade056d29767128320fe75",
......@@ -156,32 +156,32 @@
"sourceCodeHash": "0x0a3cd959b361f1da998365da8b3c14362007d73b36196cced0606a9f082e63a8"
},
"src/dispute/AnchorStateRegistry.sol": {
"initCodeHash": "0x544f0398155e958b0de59f9448801e75c66042c95a7892e2264c015973be8bec",
"sourceCodeHash": "0x65944da862332e493bffd712648511041d4adff00e24cc0e539b9dd0ef013ba0"
"initCodeHash": "0x6198f305686e6fdfd94db7aeb840a12e263036dcdc234550db49d3f0b87039a8",
"sourceCodeHash": "0x178e5c971252a9eb4b5c3fb28be1e15911c0b5aa6d27c852b73777877475f046"
},
"src/dispute/DisputeGameFactory.sol": {
"initCodeHash": "0x7a7cb8f2c95df2f9afb3ce9eaefe4a6f997ccce7ed8ffda5d425a65a2474a792",
"sourceCodeHash": "0x918c395ac5d77357f2551616aad0613e68893862edd14e554623eb16ee6ba148"
"initCodeHash": "0xc1a10f65287c414076b68a7de6c238b91bc6252213187bdef35657d0f00f9382",
"sourceCodeHash": "0x5a31133388bbb0d3621993b72a5a292108f99299f9cad8bc8e709b13e1ae0bc2"
},
"src/dispute/FaultDisputeGame.sol": {
"initCodeHash": "0x8705f00408ff4405723bf59e2dce61a90aa49d8094da1c96a3652a2ebb169519",
"sourceCodeHash": "0x3df123ab9a19f7c097510afb191099e7c3098ab892111a13c8f061ab0f0e57a0"
},
"src/dispute/weth/DelayedWETH.sol": {
"initCodeHash": "0xdad40c84fe75a0f112c219bcc9553e325bacc8e11860f692353ea3ff110fd7cc",
"sourceCodeHash": "0xb1e22abf844715243a065ead50cab02e53303c5464b2857a8ee667f8d49d4d12"
"initCodeHash": "0x3e687c928b6c890b91c82584ccb1fec47b025b8e58cd9cbfa65229b38b304bae",
"sourceCodeHash": "0x7bec41daedccca173b93974f90ff2b345ac87305b29e242a386f7605b1208df9"
},
"src/legacy/DeployerWhitelist.sol": {
"initCodeHash": "0x8de80fb23b26dd9d849f6328e56ea7c173cd9e9ce1f05c9beea559d1720deb3d",
"sourceCodeHash": "0xb518a9f56136a910f2450098b4823c9982f93883fe4a9ef6f6b0a89355965d38"
"initCodeHash": "0x0b8177ed75b69eddbb9ce6537683f69a9935efed86a1d6faa8feaafbd151c1bd",
"sourceCodeHash": "0xaf70fdfbe98a5794cc83c2baa0ef4346592c67ffade186852030010827c2d2d2"
},
"src/legacy/L1BlockNumber.sol": {
"initCodeHash": "0xd586c4f93caf1753e53fcdc05eb547c1f3a69afda2904ae9f9d851b73e1c9c1d",
"sourceCodeHash": "0xed7d0d1695f28bf967626ee58debcf235204ecc5e814f53da369c94a9ed7cf0d"
"initCodeHash": "0xfc43380228388659578368ec31b4581404ad3f3d30f3fcedccd461b1feaeebb4",
"sourceCodeHash": "0x20c8f204aa7bcdf88c48d3f067c4c4c8e8c827e0ba7b7c4a21e6f8d8225561f5"
},
"src/legacy/LegacyMessagePasser.sol": {
"initCodeHash": "0x024ff54be1762f8946c6dc1796517bd5e622349a26a908f78a31872969f10369",
"sourceCodeHash": "0x31f66f771d912ed4fe06c166f4b1c44d9f2bce8537ab42271c3900360966999f"
"initCodeHash": "0xefc6ed9e325c2d614ea0d28c3eabfff1b345f7c6054e90253c6a091c29508267",
"sourceCodeHash": "0x6ccc02c966d1548c38754f665e650763fe8e17326e76b5438398680937e37f8f"
},
"src/periphery/op-nft/AttestationStation.sol": {
"initCodeHash": "0xf9b8ff2ecdcaca2b1521a96f0ebaea2d77aeb986ff1b9b7d82fb0cbc63f9169a",
......@@ -204,8 +204,8 @@
"sourceCodeHash": "0x52737b23e99bf79dd2c23196b3298e80aa41f740efc6adc7916e696833eb546a"
},
"src/universal/OptimismMintableERC20Factory.sol": {
"initCodeHash": "0x29a49fc387ad84f82199947e49a0d1960902f63492d974c26afd72372e748648",
"sourceCodeHash": "0xbc6cf74368c244bdea8ed64c501129d0b6d41db421dc91d1de051f7b505a4977"
"initCodeHash": "0x66df8ec6699dbedc70da57358ec6031d1d90b3d6672990380f4eb3dbd9cf5385",
"sourceCodeHash": "0x1fc420719e4a6bc1f53dfc4a0ddaa14f129c16c0e99f98f253a2e3c85b72a540"
},
"src/universal/OptimismMintableERC721.sol": {
"initCodeHash": "0xb400f430acf4d65bee9635e4935a6e1e3a0284fc50aea40ad8b7818dc826f31c",
......
......@@ -40,7 +40,7 @@ struct AttestationsResult {
bytes32[] uids; // UIDs of the new attestations.
}
/// @custom:proxied
/// @custom:proxied true
/// @custom:predeploy 0x4200000000000000000000000000000000000021
/// @title EAS
/// @notice The Ethereum Attestation Service protocol.
......@@ -80,8 +80,8 @@ contract EAS is IEAS, ISemver, EIP1271Verifier {
uint256[MAX_GAP - 3] private __gap;
/// @notice Semantic version.
/// @custom:semver 1.4.0
string public constant version = "1.4.0";
/// @custom:semver 1.4.1-beta.1
string public constant version = "1.4.1-beta.1";
/// @dev Creates a new EAS instance.
constructor() EIP1271Verifier("EAS", "1.3.0") { }
......
......@@ -6,7 +6,7 @@ import { ISchemaResolver } from "src/EAS/resolver/ISchemaResolver.sol";
import { EMPTY_UID, MAX_GAP } from "src/EAS/Common.sol";
import { ISchemaRegistry, SchemaRecord } from "src/EAS/ISchemaRegistry.sol";
/// @custom:proxied
/// @custom:proxied true
/// @custom:predeploy 0x4200000000000000000000000000000000000020
/// @title SchemaRegistry
/// @notice The global attestation schemas for the Ethereum Attestation Service protocol.
......@@ -20,8 +20,8 @@ contract SchemaRegistry is ISchemaRegistry, ISemver {
uint256[MAX_GAP - 1] private __gap;
/// @notice Semantic version.
/// @custom:semver 1.3.0
string public constant version = "1.3.0";
/// @custom:semver 1.3.1-beta.1
string public constant version = "1.3.1-beta.1";
/// @inheritdoc ISchemaRegistry
function register(string calldata schema, ISchemaResolver resolver, bool revocable) external returns (bytes32) {
......
......@@ -29,6 +29,7 @@ struct Challenge {
uint256 resolvedBlock;
}
/// @custom:proxied true
/// @title DataAvailabilityChallenge
/// @notice This contract enables data availability of a data commitment at a given block number to be challenged.
/// To challenge a commitment, the challenger must first post a bond (bondSize).
......@@ -88,8 +89,8 @@ contract DataAvailabilityChallenge is OwnableUpgradeable, ISemver {
event BalanceChanged(address account, uint256 balance);
/// @notice Semantic version.
/// @custom:semver 1.0.0
string public constant version = "1.0.0";
/// @custom:semver 1.0.1-beta.1
string public constant version = "1.0.1-beta.1";
/// @notice The fixed cost of resolving a challenge.
/// @dev The value is estimated by measuring the cost of resolving with `bytes(0)`
......
......@@ -8,7 +8,7 @@ import { ISemver } from "src/universal/ISemver.sol";
import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
import { SystemConfig } from "src/L1/SystemConfig.sol";
/// @custom:proxied
/// @custom:proxied true
/// @title L1CrossDomainMessenger
/// @notice The L1CrossDomainMessenger is a message passing interface between L1 and L2 responsible
/// for sending and receiving data on the L1 side. Users are encouraged to use this
......@@ -25,8 +25,8 @@ contract L1CrossDomainMessenger is CrossDomainMessenger, ISemver {
SystemConfig public systemConfig;
/// @notice Semantic version.
/// @custom:semver 2.4.0
string public constant version = "2.4.0";
/// @custom:semver 2.4.1-beta.1
string public constant version = "2.4.1-beta.1";
/// @notice Constructs the L1CrossDomainMessenger contract.
constructor() CrossDomainMessenger() {
......
......@@ -11,6 +11,7 @@ import { StandardBridge } from "src/universal/StandardBridge.sol";
import { Constants } from "src/libraries/Constants.sol";
import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
/// @custom:proxied true
/// @title L1ERC721Bridge
/// @notice The L1 ERC721 bridge is a contract which works together with the L2 ERC721 bridge to
/// make it possible to transfer ERC721 tokens from Ethereum to Optimism. This contract
......@@ -24,8 +25,8 @@ contract L1ERC721Bridge is ERC721Bridge, ISemver {
SuperchainConfig public superchainConfig;
/// @notice Semantic version.
/// @custom:semver 2.1.1+beta.1
string public constant version = "2.1.1+beta.1";
/// @custom:semver 2.1.1-beta.2
string public constant version = "2.1.1-beta.2";
/// @notice Constructs the L1ERC721Bridge contract.
constructor() ERC721Bridge() {
......
......@@ -9,7 +9,7 @@ import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
import { OptimismPortal } from "src/L1/OptimismPortal.sol";
import { SystemConfig } from "src/L1/SystemConfig.sol";
/// @custom:proxied
/// @custom:proxied true
/// @title L1StandardBridge
/// @notice The L1StandardBridge is responsible for transfering ETH and ERC20 tokens between L1 and
/// L2. In the case that an ERC20 token is native to L1, it will be escrowed within this
......@@ -71,8 +71,8 @@ contract L1StandardBridge is StandardBridge, ISemver {
);
/// @notice Semantic version.
/// @custom:semver 2.2.0
string public constant version = "2.2.0";
/// @custom:semver 2.2.1-beta.1
string public constant version = "2.2.1-beta.1";
/// @notice Address of the SuperchainConfig contract.
SuperchainConfig public superchainConfig;
......
......@@ -6,7 +6,7 @@ import { ISemver } from "src/universal/ISemver.sol";
import { Types } from "src/libraries/Types.sol";
import { Constants } from "src/libraries/Constants.sol";
/// @custom:proxied
/// @custom:proxied true
/// @title L2OutputOracle
/// @notice The L2OutputOracle contains an array of L2 state outputs, where each output is a
/// commitment to the state of the L2 chain. Other contracts like the OptimismPortal use
......@@ -56,8 +56,8 @@ contract L2OutputOracle is Initializable, ISemver {
event OutputsDeleted(uint256 indexed prevNextOutputIndex, uint256 indexed newNextOutputIndex);
/// @notice Semantic version.
/// @custom:semver 1.8.0
string public constant version = "1.8.0";
/// @custom:semver 1.8.1-beta.1
string public constant version = "1.8.1-beta.1";
/// @notice Constructs the L2OutputOracle contract. Initializes variables to the same values as
/// in the getting-started config.
......
......@@ -4,10 +4,10 @@ pragma solidity 0.8.15;
import { ISemver } from "src/universal/ISemver.sol";
import { SystemConfig } from "src/L1/SystemConfig.sol";
/// @custom:proxied
/// @custom:proxied true
contract OPStackManager is ISemver {
/// @custom:semver 1.0.0-beta.1
string public constant version = "1.0.0-beta.1";
/// @custom:semver 1.0.0-beta.2
string public constant version = "1.0.0-beta.2";
/// @notice Represents the roles that can be set when deploying a standard OP Stack chain.
struct Roles {
......
......@@ -19,7 +19,7 @@ import { L1Block } from "src/L2/L1Block.sol";
import { Predeploys } from "src/libraries/Predeploys.sol";
import "src/libraries/PortalErrors.sol";
/// @custom:proxied
/// @custom:proxied true
/// @title OptimismPortal
/// @notice The OptimismPortal is a low-level contract responsible for passing messages between L1
/// and L2. Messages sent directly to the OptimismPortal have no form of replayability.
......@@ -128,9 +128,9 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver {
}
/// @notice Semantic version.
/// @custom:semver 2.8.1-beta.1
/// @custom:semver 2.8.1-beta.2
function version() public pure virtual returns (string memory) {
return "2.8.1-beta.1";
return "2.8.1-beta.2";
}
/// @notice Constructs the OptimismPortal contract.
......
......@@ -22,7 +22,7 @@ import { Predeploys } from "src/libraries/Predeploys.sol";
import "src/libraries/PortalErrors.sol";
import "src/dispute/lib/Types.sol";
/// @custom:proxied
/// @custom:proxied true
/// @title OptimismPortal2
/// @notice The OptimismPortal is a low-level contract responsible for passing messages between L1
/// and L2. Messages sent directly to the OptimismPortal have no form of replayability.
......@@ -153,9 +153,9 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver {
}
/// @notice Semantic version.
/// @custom:semver 3.11.0-beta.2
/// @custom:semver 3.11.0-beta.3
function version() public pure virtual returns (string memory) {
return "3.11.0-beta.2";
return "3.11.0-beta.3";
}
/// @notice Constructs the OptimismPortal contract.
......
......@@ -6,7 +6,7 @@ import { L1BlockInterop, ConfigType } from "src/L2/L1BlockInterop.sol";
import { Predeploys } from "src/libraries/Predeploys.sol";
import { Constants } from "src/libraries/Constants.sol";
/// @custom:proxied
/// @custom:proxied true
/// @title OptimismPortalInterop
/// @notice The OptimismPortal is a low-level contract responsible for passing messages between L1
/// and L2. Messages sent directly to the OptimismPortal have no form of replayability.
......
......@@ -9,6 +9,7 @@ import { Constants } from "src/libraries/Constants.sol";
/// @notice ProtocolVersion is a numeric identifier of the protocol version.
type ProtocolVersion is uint256;
/// @custom:proxied true
/// @title ProtocolVersions
/// @notice The ProtocolVersions contract is used to manage superchain protocol version information.
contract ProtocolVersions is OwnableUpgradeable, ISemver {
......@@ -36,8 +37,8 @@ contract ProtocolVersions is OwnableUpgradeable, ISemver {
event ConfigUpdate(uint256 indexed version, UpdateType indexed updateType, bytes data);
/// @notice Semantic version.
/// @custom:semver 1.0.0
string public constant version = "1.0.0";
/// @custom:semver 1.0.1-beta.1
string public constant version = "1.0.1-beta.1";
/// @notice Constructs the ProtocolVersion contract. Cannot set
/// the owner to `address(0)` due to the Ownable contract's
......
......@@ -5,6 +5,7 @@ import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable
import { ISemver } from "src/universal/ISemver.sol";
import { Storage } from "src/libraries/Storage.sol";
/// @custom:proxied true
/// @custom:audit none This contracts is not yet audited.
/// @title SuperchainConfig
/// @notice The SuperchainConfig contract is used to manage configuration of global superchain values.
......@@ -35,8 +36,8 @@ contract SuperchainConfig is Initializable, ISemver {
event ConfigUpdate(UpdateType indexed updateType, bytes data);
/// @notice Semantic version.
/// @custom:semver 1.1.0
string public constant version = "1.1.0";
/// @custom:semver 1.1.1-beta.1
string public constant version = "1.1.1-beta.1";
/// @notice Constructs the SuperchainConfig contract.
constructor() {
......
......@@ -10,6 +10,7 @@ import { OptimismPortal } from "src/L1/OptimismPortal.sol";
import { GasPayingToken, IGasToken } from "src/libraries/GasPayingToken.sol";
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
/// @custom:proxied true
/// @title SystemConfig
/// @notice The SystemConfig contract is used to manage configuration of an Optimism network.
/// All configuration is stored on L1 and picked up by L2 as part of the derviation of
......@@ -124,9 +125,9 @@ contract SystemConfig is OwnableUpgradeable, ISemver, IGasToken {
event ConfigUpdate(uint256 indexed version, UpdateType indexed updateType, bytes data);
/// @notice Semantic version.
/// @custom:semver 2.3.0-beta.2
/// @custom:semver 2.3.0-beta.3
function version() public pure virtual returns (string memory) {
return "2.3.0-beta.2";
return "2.3.0-beta.3";
}
/// @notice Constructs the SystemConfig contract. Cannot set
......
......@@ -11,6 +11,7 @@ import { StaticConfig } from "src/libraries/StaticConfig.sol";
import { ResourceMetering } from "src/L1/ResourceMetering.sol";
import { Storage } from "src/libraries/Storage.sol";
/// @custom:proxied true
/// @title SystemConfigInterop
/// @notice The SystemConfig contract is used to manage configuration of an Optimism network.
/// All configuration is stored on L1 and picked up by L2 as part of the derviation of
......
......@@ -4,14 +4,14 @@ pragma solidity 0.8.15;
import { ISemver } from "src/universal/ISemver.sol";
import { FeeVault } from "src/universal/FeeVault.sol";
/// @custom:proxied
/// @custom:proxied true
/// @custom:predeploy 0x4200000000000000000000000000000000000019
/// @title BaseFeeVault
/// @notice The BaseFeeVault accumulates the base fee that is paid by transactions.
contract BaseFeeVault is FeeVault, ISemver {
/// @notice Semantic version.
/// @custom:semver 1.5.0-beta.1
string public constant version = "1.5.0-beta.1";
/// @custom:semver 1.5.0-beta.2
string public constant version = "1.5.0-beta.2";
/// @notice Constructs the BaseFeeVault contract.
/// @param _recipient Wallet that will receive the fees.
......
......@@ -26,7 +26,7 @@ error InvalidChainId();
/// @notice Thrown when trying to execute a cross chain message and the target call fails.
error TargetCallFailed();
/// @custom:proxied
/// @custom:proxied true
/// @custom:predeploy 0x4200000000000000000000000000000000000022
/// @title CrossL2Inbox
/// @notice The CrossL2Inbox is responsible for executing a cross chain message on the destination
......@@ -61,8 +61,8 @@ contract CrossL2Inbox is ICrossL2Inbox, ISemver, TransientReentrancyAware {
address internal constant DEPOSITOR_ACCOUNT = 0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001;
/// @notice Semantic version.
/// @custom:semver 1.0.0-beta.5
string public constant version = "1.0.0-beta.5";
/// @custom:semver 1.0.0-beta.6
string public constant version = "1.0.0-beta.6";
/// @notice Emitted when a cross chain message is being executed.
/// @param msgHash Hash of message payload being executed.
......
......@@ -7,7 +7,7 @@ import { L1Block } from "src/L2/L1Block.sol";
import { Constants } from "src/libraries/Constants.sol";
import { LibZip } from "@solady/utils/LibZip.sol";
/// @custom:proxied
/// @custom:proxied true
/// @custom:predeploy 0x420000000000000000000000000000000000000F
/// @title GasPriceOracle
/// @notice This contract maintains the variables responsible for computing the L1 portion of the
......@@ -26,8 +26,8 @@ contract GasPriceOracle is ISemver {
uint256 public constant DECIMALS = 6;
/// @notice Semantic version.
/// @custom:semver 1.3.0
string public constant version = "1.3.0";
/// @custom:semver 1.3.1-beta.1
string public constant version = "1.3.1-beta.1";
/// @notice This is the intercept value for the linear regression used to estimate the final size of the
/// compressed transaction.
......
......@@ -6,7 +6,7 @@ import { Constants } from "src/libraries/Constants.sol";
import { GasPayingToken, IGasToken } from "src/libraries/GasPayingToken.sol";
import "src/libraries/L1BlockErrors.sol";
/// @custom:proxied
/// @custom:proxied true
/// @custom:predeploy 0x4200000000000000000000000000000000000015
/// @title L1Block
/// @notice The L1Block predeploy gives users access to information about the last known L1 block.
......@@ -57,9 +57,9 @@ contract L1Block is ISemver, IGasToken {
/// @notice The latest L1 blob base fee.
uint256 public blobBaseFee;
/// @custom:semver 1.4.1-beta.1
/// @custom:semver 1.4.1-beta.2
function version() public pure virtual returns (string memory) {
return "1.4.1-beta.1";
return "1.4.1-beta.2";
}
/// @notice Returns the gas paying token, its decimals, name and symbol.
......
......@@ -17,7 +17,7 @@ enum ConfigType {
REMOVE_DEPENDENCY
}
/// @custom:proxied
/// @custom:proxied true
/// @custom:predeploy 0x4200000000000000000000000000000000000015
/// @title L1BlockInterop
/// @notice Interop extenstions of L1Block.
......
......@@ -4,14 +4,14 @@ pragma solidity 0.8.15;
import { ISemver } from "src/universal/ISemver.sol";
import { FeeVault } from "src/universal/FeeVault.sol";
/// @custom:proxied
/// @custom:proxied true
/// @custom:predeploy 0x420000000000000000000000000000000000001A
/// @title L1FeeVault
/// @notice The L1FeeVault accumulates the L1 portion of the transaction fees.
contract L1FeeVault is FeeVault, ISemver {
/// @notice Semantic version.
/// @custom:semver 1.5.0-beta.1
string public constant version = "1.5.0-beta.1";
/// @custom:semver 1.5.0-beta.2
string public constant version = "1.5.0-beta.2";
/// @notice Constructs the L1FeeVault contract.
/// @param _recipient Wallet that will receive the fees.
......
......@@ -10,15 +10,15 @@ import { Constants } from "src/libraries/Constants.sol";
import { L1Block } from "src/L2/L1Block.sol";
import { Predeploys } from "src/libraries/Predeploys.sol";
/// @custom:proxied
/// @custom:proxied true
/// @custom:predeploy 0x4200000000000000000000000000000000000007
/// @title L2CrossDomainMessenger
/// @notice The L2CrossDomainMessenger is a high-level interface for message passing between L1 and
/// L2 on the L2 side. Users are generally encouraged to use this contract instead of lower
/// level message passing contracts.
contract L2CrossDomainMessenger is CrossDomainMessenger, ISemver {
/// @custom:semver 2.1.0
string public constant version = "2.1.0";
/// @custom:semver 2.1.1-beta.1
string public constant version = "2.1.1-beta.1";
/// @notice Constructs the L2CrossDomainMessenger contract.
constructor() CrossDomainMessenger() {
......
......@@ -10,6 +10,8 @@ import { ISemver } from "src/universal/ISemver.sol";
import { Constants } from "src/libraries/Constants.sol";
import { Predeploys } from "src/libraries/Predeploys.sol";
/// @custom:proxied true
/// @custom:predeploy 0x4200000000000000000000000000000000000014
/// @title L2ERC721Bridge
/// @notice The L2 ERC721 bridge is a contract which works together with the L1 ERC721 bridge to
/// make it possible to transfer ERC721 tokens from Ethereum to Optimism. This contract
......@@ -20,8 +22,8 @@ import { Predeploys } from "src/libraries/Predeploys.sol";
/// wait for the one-week challenge period to elapse before their Optimism-native NFT
/// can be refunded on L2.
contract L2ERC721Bridge is ERC721Bridge, ISemver {
/// @custom:semver 1.7.1+beta.1
string public constant version = "1.7.1+beta.1";
/// @custom:semver 1.7.1-beta.2
string public constant version = "1.7.1-beta.2";
/// @notice Constructs the L2ERC721Bridge contract.
constructor() ERC721Bridge() {
......
......@@ -8,7 +8,7 @@ import { OptimismMintableERC20 } from "src/universal/OptimismMintableERC20.sol";
import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
import { L1Block } from "src/L2/L1Block.sol";
/// @custom:proxied
/// @custom:proxied true
/// @custom:predeploy 0x4200000000000000000000000000000000000010
/// @title L2StandardBridge
/// @notice The L2StandardBridge is responsible for transfering ETH and ERC20 tokens between L1 and
......@@ -53,9 +53,9 @@ contract L2StandardBridge is StandardBridge, ISemver {
);
/// @notice Semantic version.
/// @custom:semver 1.11.0
/// @custom:semver 1.11.1-beta.1
function version() public pure virtual returns (string memory) {
return "1.11.0";
return "1.11.1-beta.1";
}
/// @notice Constructs the L2StandardBridge contract.
......
......@@ -27,7 +27,7 @@ interface MintableAndBurnable is IERC20 {
function burn(address, uint256) external;
}
/// @custom:proxied
/// @custom:proxied true
/// @custom:predeploy 0x4200000000000000000000000000000000000010
/// @title L2StandardBridgeInterop
/// @notice The L2StandardBridgeInterop is an extension of the L2StandardBridge that allows for
......
......@@ -7,7 +7,7 @@ import { Encoding } from "src/libraries/Encoding.sol";
import { Burn } from "src/libraries/Burn.sol";
import { ISemver } from "src/universal/ISemver.sol";
/// @custom:proxied
/// @custom:proxied true
/// @custom:predeploy 0x4200000000000000000000000000000000000016
/// @title L2ToL1MessagePasser
/// @notice The L2ToL1MessagePasser is a dedicated contract where messages that are being sent from
......@@ -48,8 +48,8 @@ contract L2ToL1MessagePasser is ISemver {
/// @param amount Amount of ETh that was burned.
event WithdrawerBalanceBurnt(uint256 indexed amount);
/// @custom:semver 1.1.0
string public constant version = "1.1.0";
/// @custom:semver 1.1.1-beta.1
string public constant version = "1.1.1-beta.1";
/// @notice Allows users to withdraw ETH by sending directly to this contract.
receive() external payable {
......
......@@ -36,7 +36,7 @@ error MessageAlreadyRelayed();
/// @notice Thrown when a reentrant call is detected.
error ReentrantCall();
/// @custom:proxied
/// @custom:proxied true
/// @custom:predeploy 0x4200000000000000000000000000000000000023
/// @title L2ToL2CrossDomainMessenger
/// @notice The L2ToL2CrossDomainMessenger is a higher level abstraction on top of the CrossL2Inbox that provides
......@@ -57,8 +57,8 @@ contract L2ToL2CrossDomainMessenger is IL2ToL2CrossDomainMessenger, ISemver, Tra
uint16 public constant messageVersion = uint16(0);
/// @notice Semantic version.
/// @custom:semver 1.0.0-beta.3
string public constant version = "1.0.0-beta.3";
/// @custom:semver 1.0.0-beta.4
string public constant version = "1.0.0-beta.4";
/// @notice Mapping of message hashes to boolean receipt values. Note that a message will only be present in this
/// mapping if it has successfully been relayed on this chain, and can therefore not be relayed again.
......
......@@ -23,7 +23,7 @@ error OnlyBridge();
/// @notice Thrown when attempting to mint or burn tokens and the account is the zero address.
error ZeroAddress();
/// @custom:proxied
/// @custom:proxied true
/// @title OptimismSuperchainERC20
/// @notice OptimismSuperchainERC20 is a standard extension of the base ERC20 token contract that unifies ERC20 token
/// bridging to make it fungible across the Superchain. This construction allows the L2StandardBridge to burn
......@@ -70,8 +70,8 @@ contract OptimismSuperchainERC20 is IOptimismSuperchainERC20Extension, ERC20, IS
}
/// @notice Semantic version.
/// @custom:semver 1.0.0-beta.1
string public constant version = "1.0.0-beta.1";
/// @custom:semver 1.0.0-beta.2
string public constant version = "1.0.0-beta.2";
/// @notice Constructs the OptimismSuperchainERC20 contract.
constructor() {
......
......@@ -4,14 +4,14 @@ pragma solidity 0.8.15;
import { ISemver } from "src/universal/ISemver.sol";
import { FeeVault } from "src/universal/FeeVault.sol";
/// @custom:proxied
/// @custom:proxied true
/// @custom:predeploy 0x4200000000000000000000000000000000000011
/// @title SequencerFeeVault
/// @notice The SequencerFeeVault is the contract that holds any fees paid to the Sequencer during
/// transaction processing and block production.
contract SequencerFeeVault is FeeVault, ISemver {
/// @custom:semver 1.5.0-beta.1
string public constant version = "1.5.0-beta.1";
/// @custom:semver 1.5.0-beta.2
string public constant version = "1.5.0-beta.2";
/// @notice Constructs the SequencerFeeVault contract.
/// @param _recipient Wallet that will receive the fees.
......
......@@ -14,6 +14,7 @@ import "src/dispute/lib/Types.sol";
import { Unauthorized } from "src/libraries/errors/CommonErrors.sol";
import { UnregisteredGame, InvalidGameStatus } from "src/dispute/lib/Errors.sol";
/// @custom:proxied true
/// @title AnchorStateRegistry
/// @notice The AnchorStateRegistry is a contract that stores the latest "anchor" state for each available
/// FaultDisputeGame type. The anchor state is the latest state that has been proposed on L1 and was not
......@@ -27,8 +28,8 @@ contract AnchorStateRegistry is Initializable, IAnchorStateRegistry, ISemver {
}
/// @notice Semantic version.
/// @custom:semver 2.0.0-rc.1
string public constant version = "2.0.0-rc.1";
/// @custom:semver 2.0.1-beta.1
string public constant version = "2.0.1-beta.1";
/// @notice DisputeGameFactory address.
IDisputeGameFactory internal immutable DISPUTE_GAME_FACTORY;
......
......@@ -11,6 +11,7 @@ import { IDisputeGameFactory } from "src/dispute/interfaces/IDisputeGameFactory.
import "src/dispute/lib/Types.sol";
import "src/dispute/lib/Errors.sol";
/// @custom:proxied true
/// @title DisputeGameFactory
/// @notice A factory contract for creating `IDisputeGame` contracts. All created dispute games are stored in both a
/// mapping and an append only array. The timestamp of the creation time of the dispute game is packed tightly
......@@ -21,8 +22,8 @@ contract DisputeGameFactory is OwnableUpgradeable, IDisputeGameFactory, ISemver
using LibClone for address;
/// @notice Semantic version.
/// @custom:semver 1.0.0
string public constant version = "1.0.0";
/// @custom:semver 1.0.1-beta.1
string public constant version = "1.0.1-beta.1";
/// @inheritdoc IDisputeGameFactory
mapping(GameType => IDisputeGame) public gameImpls;
......
......@@ -10,6 +10,7 @@ import { WETH98 } from "src/dispute/weth/WETH98.sol";
import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
/// @custom:proxied true
/// @title DelayedWETH
/// @notice DelayedWETH is an extension to WETH9 that allows for delayed withdrawals. Accounts must trigger an unlock
/// function before they can withdraw WETH. Accounts must trigger unlock by specifying a sub-account and an
......@@ -21,8 +22,8 @@ import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
/// Not the prettiest contract in the world, but it gets the job done.
contract DelayedWETH is OwnableUpgradeable, WETH98, IDelayedWETH, ISemver {
/// @notice Semantic version.
/// @custom:semver 1.1.0-rc.1
string public constant version = "1.1.0-rc.1";
/// @custom:semver 1.1.1-beta.1
string public constant version = "1.1.1-beta.1";
/// @inheritdoc IDelayedWETH
mapping(address => mapping(address => WithdrawalRequest)) public withdrawals;
......
......@@ -3,7 +3,7 @@ pragma solidity 0.8.15;
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
/// @custom:legacy
/// @custom:legacy true
/// @title AddressManager
/// @notice AddressManager is a legacy contract that was used in the old version of the Optimism
/// system to manage a registry of string names to addresses. We now use a more standard
......
......@@ -3,8 +3,8 @@ pragma solidity 0.8.15;
import { ISemver } from "src/universal/ISemver.sol";
/// @custom:legacy
/// @custom:proxied
/// @custom:legacy true
/// @custom:proxied true
/// @custom:predeployed 0x4200000000000000000000000000000000000002
/// @title DeployerWhitelist
/// @notice DeployerWhitelist is a legacy contract that was originally used to act as a whitelist of
......@@ -41,8 +41,8 @@ contract DeployerWhitelist is ISemver {
}
/// @notice Semantic version.
/// @custom:semver 1.1.0
string public constant version = "1.1.0";
/// @custom:semver 1.1.1-beta.1
string public constant version = "1.1.1-beta.1";
/// @notice Adds or removes an address from the deployment whitelist.
/// @param _deployer Address to update permissions for.
......
......@@ -5,8 +5,8 @@ import { L1Block } from "src/L2/L1Block.sol";
import { Predeploys } from "src/libraries/Predeploys.sol";
import { ISemver } from "src/universal/ISemver.sol";
/// @custom:legacy
/// @custom:proxied
/// @custom:legacy true
/// @custom:proxied true
/// @custom:predeploy 0x4200000000000000000000000000000000000013
/// @title L1BlockNumber
/// @notice L1BlockNumber is a legacy contract that fills the roll of the OVM_L1BlockNumber contract
......@@ -15,8 +15,8 @@ import { ISemver } from "src/universal/ISemver.sol";
/// contract instead.
contract L1BlockNumber is ISemver {
/// @notice Semantic version.
/// @custom:semver 1.1.0
string public constant version = "1.1.0";
/// @custom:semver 1.1.1-beta.1
string public constant version = "1.1.1-beta.1";
/// @notice Returns the L1 block number.
receive() external payable {
......
......@@ -4,7 +4,7 @@ pragma solidity 0.8.15;
import { Constants } from "src/libraries/Constants.sol";
import { IL1ChugSplashDeployer } from "src/legacy/interfaces/IL1ChugSplashProxy.sol";
/// @custom:legacy
/// @custom:legacy true
/// @title L1ChugSplashProxy
/// @notice Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added
/// functions `setCode` and `setStorage` for changing the code or storage of the contract.
......
......@@ -3,8 +3,8 @@ pragma solidity 0.8.15;
import { ISemver } from "src/universal/ISemver.sol";
/// @custom:legacy
/// @custom:proxied
/// @custom:legacy true
/// @custom:proxied true
/// @custom:predeploy 0x4200000000000000000000000000000000000000
/// @title LegacyMessagePasser
/// @notice The LegacyMessagePasser was the low-level mechanism used to send messages from L2 to L1
......@@ -14,8 +14,8 @@ contract LegacyMessagePasser is ISemver {
mapping(bytes32 => bool) public sentMessages;
/// @notice Semantic version.
/// @custom:semver 1.1.0
string public constant version = "1.1.0";
/// @custom:semver 1.1.1-beta.1
string public constant version = "1.1.1-beta.1";
/// @notice Passes a message to L1.
/// @param _message Message to pass to L1.
......
......@@ -3,7 +3,7 @@ pragma solidity 0.8.15;
import { AddressManager } from "src/legacy/AddressManager.sol";
/// @custom:legacy
/// @custom:legacy true
/// @title ResolvedDelegateProxy
/// @notice ResolvedDelegateProxy is a legacy proxy contract that makes use of the AddressManager to
/// resolve the implementation address. We're maintaining this contract for backwards
......
......@@ -6,7 +6,7 @@ import { ISemver } from "src/universal/ISemver.sol";
import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
import { IOptimismERC20Factory } from "src/L2/IOptimismERC20Factory.sol";
/// @custom:proxied
/// @custom:proxied true
/// @custom:predeployed 0x4200000000000000000000000000000000000012
/// @title OptimismMintableERC20Factory
/// @notice OptimismMintableERC20Factory is a factory contract that generates OptimismMintableERC20
......@@ -48,8 +48,8 @@ contract OptimismMintableERC20Factory is ISemver, Initializable, IOptimismERC20F
/// the OptimismMintableERC20 token contract since this contract
/// is responsible for deploying OptimismMintableERC20 contracts.
/// @notice Semantic version.
/// @custom:semver 1.10.0
string public constant version = "1.10.0";
/// @custom:semver 1.10.1-beta.1
string public constant version = "1.10.1-beta.1";
/// @notice Constructs the OptimismMintableERC20Factory contract.
constructor() {
......
......@@ -13,36 +13,36 @@ contract DeploymentSummary is DeploymentSummaryCode {
Vm private constant vm = Vm(VM_ADDRESS);
address internal constant addressManagerAddress = 0x50EEf481cae4250d252Ae577A09bF514f224C6C4;
address internal constant anchorStateRegistryAddress = 0x63B71B96756C693f7065345fecD9b7843b3e7C57;
address internal constant anchorStateRegistryAddress = 0x0C21b289b76ae49983890aed23F78337333F0A5F;
address internal constant anchorStateRegistryProxyAddress = 0x970670459734a83899773A0fd45941B5afC1200e;
address internal constant delayedWETHAddress = 0x2A6347EDD3C7813CDE46DD7eA61FF1Cf2290BC05;
address internal constant delayedWETHProxyAddress = 0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92;
address internal constant disputeGameFactoryAddress = 0x20B168142354Cee65a32f6D8cf3033E592299765;
address internal constant disputeGameFactoryAddress = 0x8efDa795511CBBdfFC9eeca1a5bF30f5B1E1ef9E;
address internal constant disputeGameFactoryProxyAddress = 0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d;
address internal constant l1CrossDomainMessengerAddress = 0x094e6508ba9d9bf1ce421fff3dE06aE56e67901b;
address internal constant l1CrossDomainMessengerAddress = 0x357B6CdA94109749a0dA475ac1BFd395a61eb908;
address internal constant l1CrossDomainMessengerProxyAddress = 0xDeF3bca8c80064589E6787477FFa7Dd616B5574F;
address internal constant l1ERC721BridgeAddress = 0x5C4F5e749A61a9503c4AAE8a9393e89609a0e804;
address internal constant l1ERC721BridgeAddress = 0xA4BD7E58A30ED0477fe7372883d09bF86619Bb66;
address internal constant l1ERC721BridgeProxyAddress = 0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865;
address internal constant l1StandardBridgeAddress = 0xb7900B27Be8f0E0fF65d1C3A4671e1220437dd2b;
address internal constant l1StandardBridgeAddress = 0x6cb2c88ABCd6391F9496f44BE27d5D3b247E0159;
address internal constant l1StandardBridgeProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D;
address internal constant l2OutputOracleAddress = 0x19652082F846171168Daf378C4fD3ee85a0D4A60;
address internal constant l2OutputOracleAddress = 0x60d37db59d0D14f7EA5c7425A2C03244E08B162D;
address internal constant l2OutputOracleProxyAddress = 0x39Af23E00F1e662025aA01b0cEdA19542B78DF99;
address internal constant mipsAddress = 0x444e09fe6D839273316a87002aB0EFBeA6fe7806;
address internal constant optimismMintableERC20FactoryAddress = 0x7c06d3a0a2f45e39E1798afbd9C3330971332a4F;
address internal constant optimismMintableERC20FactoryAddress = 0x47a13af3fB62B24E4914C36aBD9882da23D0e29C;
address internal constant optimismMintableERC20FactoryProxyAddress = 0xc7B87b2b892EA5C3CfF47168881FE168C00377FB;
address internal constant optimismPortalAddress = 0xbdD90485FCbcac869D5b5752179815a3103d8131;
address internal constant optimismPortal2Address = 0xae5DadFc48928543f706a9E6Ce25c682aaD2b63b;
address internal constant optimismPortalAddress = 0xBE8eE5CEA97De55Ae8b020E778A5C93C2Af81Ed4;
address internal constant optimismPortal2Address = 0x5506077419b90A12C048500e2eBcafb4fC6Bab61;
address internal constant optimismPortalProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4;
address internal constant permissionedDelayedWETHProxyAddress = 0xd6EAF4c146261653EE059077B78ED088Add54309;
address internal constant preimageOracleAddress = 0x373d916D11cce55b548F7051002e76BCFBD7a85d;
address internal constant protocolVersionsAddress = 0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F;
address internal constant protocolVersionsAddress = 0xa99F1ab91821747b76Ec0cDFA38368DF4Ba06E84;
address internal constant protocolVersionsProxyAddress = 0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1;
address internal constant proxyAdminAddress = 0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1;
address internal constant safeProxyFactoryAddress = 0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496;
address internal constant safeSingletonAddress = 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3;
address internal constant superchainConfigAddress = 0x068E44eB31e111028c41598E4535be7468674D0A;
address internal constant superchainConfigAddress = 0xDAf629c26abd7a84B6330c369887053B75dB2AF2;
address internal constant superchainConfigProxyAddress = 0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351;
address internal constant systemConfigAddress = 0x67866A5052E5302aaD08e9f352331fd8622eB6DC;
address internal constant systemConfigAddress = 0xd9CEcA938f039e427Edf626FA1f377d23A6b60c9;
address internal constant systemConfigProxyAddress = 0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6;
address internal constant systemOwnerSafeAddress = 0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD;
address internal constant acc33Address = 0xb6b1579AA54e2F61e621a40d5F2704D717B3544F;
......@@ -107,7 +107,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a";
value = hex"000000000000000000000000daf629c26abd7a84b6330c369887053b75db2af2";
vm.store(superchainConfigProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......@@ -145,7 +145,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
value = hex"0000000000000000000000000000000000000000000000000000000000000002";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f";
value = hex"000000000000000000000000a99f1ab91821747b76ec0cdfa38368df4ba06e84";
vm.store(protocolVersionsProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......@@ -430,7 +430,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
value = hex"0000000000000000000000000000000000000000000000000000000000000003";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d8131";
value = hex"000000000000000000000000be8ee5cea97de55ae8b020e778a5c93c2af81ed4";
vm.store(optimismPortalProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......@@ -460,7 +460,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
value = hex"0000000000000000000000000000000000000000000000000000000000000004";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc";
value = hex"000000000000000000000000d9ceca938f039e427edf626fa1f377d23a6b60c9";
vm.store(systemConfigProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......@@ -529,7 +529,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
value = hex"0000000000000000000000000000000000000000000000000000000000000006";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b";
value = hex"0000000000000000000000006cb2c88abcd6391f9496f44be27d5d3b247e0159";
vm.store(l1StandardBridgeProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......@@ -556,7 +556,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
value = hex"0000000000000000000000000000000000000000000000000000000000000007";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"0000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e804";
value = hex"000000000000000000000000a4bd7e58a30ed0477fe7372883d09bf86619bb66";
vm.store(l1ERC721BridgeProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......@@ -580,7 +580,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
value = hex"0000000000000000000000000000000000000000000000000000000000000008";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"0000000000000000000000007c06d3a0a2f45e39e1798afbd9c3330971332a4f";
value = hex"00000000000000000000000047a13af3fb62b24e4914c36abd9882da23d0e29c";
vm.store(optimismMintableERC20FactoryProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......@@ -610,7 +610,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
value = hex"000000000000000000000000000000000000000000000000000000000000000b";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e";
value = hex"000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b";
value = hex"000000000000000000000000357b6cda94109749a0da475ac1bfd395a61eb908";
vm.store(addressManagerAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000010000000000000000000000000000000000000000";
......@@ -640,7 +640,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
value = hex"000000000000000000000000000000000000000000000000000000000000000c";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60";
value = hex"00000000000000000000000060d37db59d0d14f7ea5c7425a2c03244e08b162d";
vm.store(l2OutputOracleProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......@@ -676,7 +676,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
value = hex"000000000000000000000000000000000000000000000000000000000000000d";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765";
value = hex"0000000000000000000000008efda795511cbbdffc9eeca1a5bf30f5b1e1ef9e";
vm.store(disputeGameFactoryProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......@@ -745,7 +745,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
value = hex"0000000000000000000000000000000000000000000000000000000000000010";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"00000000000000000000000063b71b96756c693f7065345fecd9b7843b3e7c57";
value = hex"0000000000000000000000000c21b289b76ae49983890aed23f78337333f0a5f";
vm.store(anchorStateRegistryProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -13,36 +13,36 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode {
Vm private constant vm = Vm(VM_ADDRESS);
address internal constant addressManagerAddress = 0x50EEf481cae4250d252Ae577A09bF514f224C6C4;
address internal constant anchorStateRegistryAddress = 0x63B71B96756C693f7065345fecD9b7843b3e7C57;
address internal constant anchorStateRegistryAddress = 0x0C21b289b76ae49983890aed23F78337333F0A5F;
address internal constant anchorStateRegistryProxyAddress = 0x970670459734a83899773A0fd45941B5afC1200e;
address internal constant delayedWETHAddress = 0x2A6347EDD3C7813CDE46DD7eA61FF1Cf2290BC05;
address internal constant delayedWETHProxyAddress = 0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92;
address internal constant disputeGameFactoryAddress = 0x20B168142354Cee65a32f6D8cf3033E592299765;
address internal constant disputeGameFactoryAddress = 0x8efDa795511CBBdfFC9eeca1a5bF30f5B1E1ef9E;
address internal constant disputeGameFactoryProxyAddress = 0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d;
address internal constant l1CrossDomainMessengerAddress = 0x094e6508ba9d9bf1ce421fff3dE06aE56e67901b;
address internal constant l1CrossDomainMessengerAddress = 0x357B6CdA94109749a0dA475ac1BFd395a61eb908;
address internal constant l1CrossDomainMessengerProxyAddress = 0xDeF3bca8c80064589E6787477FFa7Dd616B5574F;
address internal constant l1ERC721BridgeAddress = 0x5C4F5e749A61a9503c4AAE8a9393e89609a0e804;
address internal constant l1ERC721BridgeAddress = 0xA4BD7E58A30ED0477fe7372883d09bF86619Bb66;
address internal constant l1ERC721BridgeProxyAddress = 0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865;
address internal constant l1StandardBridgeAddress = 0xb7900B27Be8f0E0fF65d1C3A4671e1220437dd2b;
address internal constant l1StandardBridgeAddress = 0x6cb2c88ABCd6391F9496f44BE27d5D3b247E0159;
address internal constant l1StandardBridgeProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D;
address internal constant l2OutputOracleAddress = 0x19652082F846171168Daf378C4fD3ee85a0D4A60;
address internal constant l2OutputOracleAddress = 0x60d37db59d0D14f7EA5c7425A2C03244E08B162D;
address internal constant l2OutputOracleProxyAddress = 0x39Af23E00F1e662025aA01b0cEdA19542B78DF99;
address internal constant mipsAddress = 0x444e09fe6D839273316a87002aB0EFBeA6fe7806;
address internal constant optimismMintableERC20FactoryAddress = 0x7c06d3a0a2f45e39E1798afbd9C3330971332a4F;
address internal constant optimismMintableERC20FactoryAddress = 0x47a13af3fB62B24E4914C36aBD9882da23D0e29C;
address internal constant optimismMintableERC20FactoryProxyAddress = 0xc7B87b2b892EA5C3CfF47168881FE168C00377FB;
address internal constant optimismPortalAddress = 0xbdD90485FCbcac869D5b5752179815a3103d8131;
address internal constant optimismPortal2Address = 0xae5DadFc48928543f706a9E6Ce25c682aaD2b63b;
address internal constant optimismPortalAddress = 0xBE8eE5CEA97De55Ae8b020E778A5C93C2Af81Ed4;
address internal constant optimismPortal2Address = 0x5506077419b90A12C048500e2eBcafb4fC6Bab61;
address internal constant optimismPortalProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4;
address internal constant permissionedDelayedWETHProxyAddress = 0xd6EAF4c146261653EE059077B78ED088Add54309;
address internal constant preimageOracleAddress = 0x373d916D11cce55b548F7051002e76BCFBD7a85d;
address internal constant protocolVersionsAddress = 0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F;
address internal constant protocolVersionsAddress = 0xa99F1ab91821747b76Ec0cDFA38368DF4Ba06E84;
address internal constant protocolVersionsProxyAddress = 0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1;
address internal constant proxyAdminAddress = 0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1;
address internal constant safeProxyFactoryAddress = 0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496;
address internal constant safeSingletonAddress = 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3;
address internal constant superchainConfigAddress = 0x068E44eB31e111028c41598E4535be7468674D0A;
address internal constant superchainConfigAddress = 0xDAf629c26abd7a84B6330c369887053B75dB2AF2;
address internal constant superchainConfigProxyAddress = 0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351;
address internal constant systemConfigAddress = 0x67866A5052E5302aaD08e9f352331fd8622eB6DC;
address internal constant systemConfigAddress = 0xd9CEcA938f039e427Edf626FA1f377d23A6b60c9;
address internal constant systemConfigProxyAddress = 0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6;
address internal constant systemOwnerSafeAddress = 0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD;
address internal constant acc33Address = 0xb6b1579AA54e2F61e621a40d5F2704D717B3544F;
......@@ -107,7 +107,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode {
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a";
value = hex"000000000000000000000000daf629c26abd7a84b6330c369887053b75db2af2";
vm.store(superchainConfigProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......@@ -145,7 +145,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode {
value = hex"0000000000000000000000000000000000000000000000000000000000000002";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f";
value = hex"000000000000000000000000a99f1ab91821747b76ec0cdfa38368df4ba06e84";
vm.store(protocolVersionsProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......@@ -430,7 +430,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode {
value = hex"0000000000000000000000000000000000000000000000000000000000000003";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"000000000000000000000000ae5dadfc48928543f706a9e6ce25c682aad2b63b";
value = hex"0000000000000000000000005506077419b90a12c048500e2ebcafb4fc6bab61";
vm.store(optimismPortalProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......@@ -463,7 +463,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode {
value = hex"0000000000000000000000000000000000000000000000000000000000000004";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc";
value = hex"000000000000000000000000d9ceca938f039e427edf626fa1f377d23a6b60c9";
vm.store(systemConfigProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......@@ -532,7 +532,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode {
value = hex"0000000000000000000000000000000000000000000000000000000000000006";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b";
value = hex"0000000000000000000000006cb2c88abcd6391f9496f44be27d5d3b247e0159";
vm.store(l1StandardBridgeProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......@@ -559,7 +559,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode {
value = hex"0000000000000000000000000000000000000000000000000000000000000007";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"0000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e804";
value = hex"000000000000000000000000a4bd7e58a30ed0477fe7372883d09bf86619bb66";
vm.store(l1ERC721BridgeProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......@@ -583,7 +583,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode {
value = hex"0000000000000000000000000000000000000000000000000000000000000008";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"0000000000000000000000007c06d3a0a2f45e39e1798afbd9c3330971332a4f";
value = hex"00000000000000000000000047a13af3fb62b24e4914c36abd9882da23d0e29c";
vm.store(optimismMintableERC20FactoryProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......@@ -613,7 +613,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode {
value = hex"000000000000000000000000000000000000000000000000000000000000000b";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e";
value = hex"000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b";
value = hex"000000000000000000000000357b6cda94109749a0da475ac1bfd395a61eb908";
vm.store(addressManagerAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000010000000000000000000000000000000000000000";
......@@ -643,7 +643,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode {
value = hex"000000000000000000000000000000000000000000000000000000000000000c";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60";
value = hex"00000000000000000000000060d37db59d0d14f7ea5c7425a2c03244e08b162d";
vm.store(l2OutputOracleProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......@@ -679,7 +679,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode {
value = hex"000000000000000000000000000000000000000000000000000000000000000d";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765";
value = hex"0000000000000000000000008efda795511cbbdffc9eeca1a5bf30f5b1e1ef9e";
vm.store(disputeGameFactoryProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......@@ -748,7 +748,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode {
value = hex"0000000000000000000000000000000000000000000000000000000000000010";
vm.store(systemOwnerSafeAddress, slot, value);
slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
value = hex"00000000000000000000000063b71b96756c693f7065345fecd9b7843b3e7c57";
value = hex"0000000000000000000000000c21b289b76ae49983890aed23f78337333f0a5f";
vm.store(anchorStateRegistryProxyAddress, slot, value);
slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
value = hex"0000000000000000000000000000000000000000000000000000000000000001";
......
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
import { LibString } from "@solady/utils/LibString.sol";
import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol";
import { Executables } from "scripts/libraries/Executables.sol";
import { Constants } from "src/libraries/Constants.sol";
import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
import { SystemConfig } from "src/L1/SystemConfig.sol";
import { SystemConfigInterop } from "src/L1/SystemConfigInterop.sol";
import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
import { ResourceMetering } from "src/L1/ResourceMetering.sol";
import { OptimismPortal } from "src/L1/OptimismPortal.sol";
import { ForgeArtifacts } from "scripts/libraries/ForgeArtifacts.sol";
import { AnchorStateRegistry } from "src/dispute/AnchorStateRegistry.sol";
import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol";
import { PermissionedDisputeGame } from "src/dispute/PermissionedDisputeGame.sol";
import { GameTypes } from "src/dispute/lib/Types.sol";
import { ForgeArtifacts, StorageSlot } from "scripts/libraries/ForgeArtifacts.sol";
import { Process } from "scripts/libraries/Process.sol";
import "src/L1/ProtocolVersions.sol";
import "src/dispute/lib/Types.sol";
......@@ -24,15 +31,19 @@ contract Initializer_Test is Bridge_Initializer {
/// @notice Contains the address of an `Initializable` contract and the calldata
/// used to initialize it.
struct InitializeableContract {
string name;
address target;
bytes initCalldata;
uint8 initializedSlotVal;
}
/// @notice Contains the addresses of the contracts to test as well as the calldata
/// used to initialize them.
/// @notice Array of contracts to test.
InitializeableContract[] contracts;
/// @notice Mapping of nickname to actual contract name.
/// @dev Nicknames are only used when one proxy contract has multiple potential implementations
/// as can happen when a new implementation is being developed.
mapping(string => string) nicknames;
function setUp() public override {
super.enableAltDA();
// Run the `Bridge_Initializer`'s `setUp()` function.
......@@ -44,98 +55,107 @@ contract Initializer_Test is Bridge_Initializer {
// SuperchainConfigImpl
contracts.push(
InitializeableContract({
name: "SuperchainConfig",
target: deploy.mustGetAddress("SuperchainConfig"),
initCalldata: abi.encodeCall(superchainConfig.initialize, (address(0), false)),
initializedSlotVal: deploy.loadInitializedSlot("SuperchainConfig")
initCalldata: abi.encodeCall(superchainConfig.initialize, (address(0), false))
})
);
// SuperchainConfigProxy
contracts.push(
InitializeableContract({
name: "SuperchainConfigProxy",
target: address(superchainConfig),
initCalldata: abi.encodeCall(superchainConfig.initialize, (address(0), false)),
initializedSlotVal: deploy.loadInitializedSlot("SuperchainConfigProxy")
initCalldata: abi.encodeCall(superchainConfig.initialize, (address(0), false))
})
);
// L1CrossDomainMessengerImpl
contracts.push(
InitializeableContract({
name: "L1CrossDomainMessenger",
target: deploy.mustGetAddress("L1CrossDomainMessenger"),
initCalldata: abi.encodeCall(
l1CrossDomainMessenger.initialize, (superchainConfig, optimismPortal, systemConfig)
),
initializedSlotVal: deploy.loadInitializedSlot("L1CrossDomainMessenger")
)
})
);
// L1CrossDomainMessengerProxy
contracts.push(
InitializeableContract({
name: "L1CrossDomainMessengerProxy",
target: address(l1CrossDomainMessenger),
initCalldata: abi.encodeCall(
l1CrossDomainMessenger.initialize, (superchainConfig, optimismPortal, systemConfig)
),
initializedSlotVal: deploy.loadInitializedSlot("L1CrossDomainMessengerProxy")
)
})
);
// DisputeGameFactoryImpl
contracts.push(
InitializeableContract({
name: "DisputeGameFactory",
target: deploy.mustGetAddress("DisputeGameFactory"),
initCalldata: abi.encodeCall(disputeGameFactory.initialize, (address(0))),
initializedSlotVal: deploy.loadInitializedSlot("DisputeGameFactory")
initCalldata: abi.encodeCall(disputeGameFactory.initialize, (address(0)))
})
);
// DisputeGameFactoryProxy
contracts.push(
InitializeableContract({
name: "DisputeGameFactoryProxy",
target: address(disputeGameFactory),
initCalldata: abi.encodeCall(disputeGameFactory.initialize, (address(0))),
initializedSlotVal: deploy.loadInitializedSlot("DisputeGameFactoryProxy")
initCalldata: abi.encodeCall(disputeGameFactory.initialize, (address(0)))
})
);
// DelayedWETHImpl
contracts.push(
InitializeableContract({
name: "DelayedWETH",
target: deploy.mustGetAddress("DelayedWETH"),
initCalldata: abi.encodeCall(delayedWeth.initialize, (address(0), SuperchainConfig(address(0)))),
initializedSlotVal: deploy.loadInitializedSlot("DelayedWETH")
initCalldata: abi.encodeCall(delayedWeth.initialize, (address(0), SuperchainConfig(address(0))))
})
);
// DelayedWETHProxy
contracts.push(
InitializeableContract({
name: "DelayedWETHProxy",
target: address(delayedWeth),
initCalldata: abi.encodeCall(delayedWeth.initialize, (address(0), SuperchainConfig(address(0)))),
initializedSlotVal: deploy.loadInitializedSlot("DelayedWETHProxy")
initCalldata: abi.encodeCall(delayedWeth.initialize, (address(0), SuperchainConfig(address(0))))
})
);
// L2OutputOracleImpl
contracts.push(
InitializeableContract({
name: "L2OutputOracle",
target: deploy.mustGetAddress("L2OutputOracle"),
initCalldata: abi.encodeCall(l2OutputOracle.initialize, (0, 0, 0, 0, address(0), address(0), 0)),
initializedSlotVal: deploy.loadInitializedSlot("L2OutputOracle")
initCalldata: abi.encodeCall(l2OutputOracle.initialize, (0, 0, 0, 0, address(0), address(0), 0))
})
);
// L2OutputOracleProxy
contracts.push(
InitializeableContract({
name: "L2OutputOracleProxy",
target: address(l2OutputOracle),
initCalldata: abi.encodeCall(l2OutputOracle.initialize, (0, 0, 0, 0, address(0), address(0), 0)),
initializedSlotVal: deploy.loadInitializedSlot("L2OutputOracleProxy")
initCalldata: abi.encodeCall(l2OutputOracle.initialize, (0, 0, 0, 0, address(0), address(0), 0))
})
);
// OptimismPortalImpl
contracts.push(
InitializeableContract({
name: "OptimismPortal",
target: deploy.mustGetAddress("OptimismPortal"),
initCalldata: abi.encodeCall(optimismPortal.initialize, (l2OutputOracle, systemConfig, superchainConfig)),
initializedSlotVal: deploy.loadInitializedSlot("OptimismPortal")
initCalldata: abi.encodeCall(optimismPortal.initialize, (l2OutputOracle, systemConfig, superchainConfig))
})
);
// OptimismPortalProxy
contracts.push(
InitializeableContract({
name: "OptimismPortalProxy",
target: address(optimismPortal),
initCalldata: abi.encodeCall(optimismPortal.initialize, (l2OutputOracle, systemConfig, superchainConfig))
})
);
// OptimismPortal2Impl
contracts.push(
InitializeableContract({
name: "OptimismPortal2",
target: deploy.mustGetAddress("OptimismPortal2"),
initCalldata: abi.encodeCall(
optimismPortal2.initialize,
......@@ -145,21 +165,13 @@ contract Initializer_Test is Bridge_Initializer {
superchainConfig,
GameType.wrap(uint32(deploy.cfg().respectedGameType()))
)
),
initializedSlotVal: deploy.loadInitializedSlot("OptimismPortal2")
})
);
// OptimismPortalProxy
contracts.push(
InitializeableContract({
target: address(optimismPortal),
initCalldata: abi.encodeCall(optimismPortal.initialize, (l2OutputOracle, systemConfig, superchainConfig)),
initializedSlotVal: deploy.loadInitializedSlot("OptimismPortalProxy")
)
})
);
// SystemConfigImpl
contracts.push(
InitializeableContract({
name: "SystemConfig",
target: deploy.mustGetAddress("SystemConfig"),
initCalldata: abi.encodeCall(
systemConfig.initialize,
......@@ -189,13 +201,13 @@ contract Initializer_Test is Bridge_Initializer {
gasPayingToken: Constants.ETHER
})
)
),
initializedSlotVal: deploy.loadInitializedSlot("SystemConfig")
)
})
);
// SystemConfigProxy
contracts.push(
InitializeableContract({
name: "SystemConfigProxy",
target: address(systemConfig),
initCalldata: abi.encodeCall(
systemConfig.initialize,
......@@ -225,240 +237,281 @@ contract Initializer_Test is Bridge_Initializer {
gasPayingToken: Constants.ETHER
})
)
),
initializedSlotVal: deploy.loadInitializedSlot("SystemConfigProxy")
)
})
);
// ProtocolVersionsImpl
contracts.push(
InitializeableContract({
name: "ProtocolVersions",
target: deploy.mustGetAddress("ProtocolVersions"),
initCalldata: abi.encodeCall(
protocolVersions.initialize, (address(0), ProtocolVersion.wrap(1), ProtocolVersion.wrap(2))
),
initializedSlotVal: deploy.loadInitializedSlot("ProtocolVersions")
)
})
);
// ProtocolVersionsProxy
contracts.push(
InitializeableContract({
name: "ProtocolVersionsProxy",
target: address(protocolVersions),
initCalldata: abi.encodeCall(
protocolVersions.initialize, (address(0), ProtocolVersion.wrap(1), ProtocolVersion.wrap(2))
),
initializedSlotVal: deploy.loadInitializedSlot("ProtocolVersionsProxy")
)
})
);
// L2CrossDomainMessenger
contracts.push(
InitializeableContract({
name: "L2CrossDomainMessenger",
target: address(l2CrossDomainMessenger),
initCalldata: abi.encodeCall(l2CrossDomainMessenger.initialize, (l1CrossDomainMessenger)),
initializedSlotVal: deploy.loadInitializedSlot("L2CrossDomainMessenger")
initCalldata: abi.encodeCall(l2CrossDomainMessenger.initialize, (l1CrossDomainMessenger))
})
);
// L1StandardBridgeImpl
contracts.push(
InitializeableContract({
name: "L1StandardBridge",
target: deploy.mustGetAddress("L1StandardBridge"),
initCalldata: abi.encodeCall(
l1StandardBridge.initialize, (l1CrossDomainMessenger, superchainConfig, systemConfig)
),
initializedSlotVal: deploy.loadInitializedSlot("L1StandardBridge")
)
})
);
// L1StandardBridgeProxy
contracts.push(
InitializeableContract({
name: "L1StandardBridgeProxy",
target: address(l1StandardBridge),
initCalldata: abi.encodeCall(
l1StandardBridge.initialize, (l1CrossDomainMessenger, superchainConfig, systemConfig)
),
initializedSlotVal: deploy.loadInitializedSlot("L1StandardBridgeProxy")
)
})
);
// L2StandardBridge
contracts.push(
InitializeableContract({
name: "L2StandardBridge",
target: address(l2StandardBridge),
initCalldata: abi.encodeCall(l2StandardBridge.initialize, (l1StandardBridge)),
initializedSlotVal: deploy.loadInitializedSlot("L2StandardBridge")
initCalldata: abi.encodeCall(l2StandardBridge.initialize, (l1StandardBridge))
})
);
// L2StandardBridgeInterop
contracts.push(
InitializeableContract({
name: "L2StandardBridgeInterop",
target: address(l2StandardBridge),
initCalldata: abi.encodeCall(l2StandardBridge.initialize, (l1StandardBridge)),
initializedSlotVal: deploy.loadInitializedSlot("L2StandardBridgeInterop")
initCalldata: abi.encodeCall(l2StandardBridge.initialize, (l1StandardBridge))
})
);
// L1ERC721BridgeImpl
contracts.push(
InitializeableContract({
name: "L1ERC721Bridge",
target: deploy.mustGetAddress("L1ERC721Bridge"),
initCalldata: abi.encodeCall(l1ERC721Bridge.initialize, (l1CrossDomainMessenger, superchainConfig)),
initializedSlotVal: deploy.loadInitializedSlot("L1ERC721Bridge")
initCalldata: abi.encodeCall(l1ERC721Bridge.initialize, (l1CrossDomainMessenger, superchainConfig))
})
);
// L1ERC721BridgeProxy
contracts.push(
InitializeableContract({
name: "L1ERC721BridgeProxy",
target: address(l1ERC721Bridge),
initCalldata: abi.encodeCall(l1ERC721Bridge.initialize, (l1CrossDomainMessenger, superchainConfig)),
initializedSlotVal: deploy.loadInitializedSlot("L1ERC721BridgeProxy")
initCalldata: abi.encodeCall(l1ERC721Bridge.initialize, (l1CrossDomainMessenger, superchainConfig))
})
);
// L2ERC721Bridge
contracts.push(
InitializeableContract({
name: "L2ERC721Bridge",
target: address(l2ERC721Bridge),
initCalldata: abi.encodeCall(l2ERC721Bridge.initialize, (payable(address(l1ERC721Bridge)))),
initializedSlotVal: deploy.loadInitializedSlot("L2ERC721Bridge")
initCalldata: abi.encodeCall(l2ERC721Bridge.initialize, (payable(address(l1ERC721Bridge))))
})
);
// OptimismMintableERC20FactoryImpl
contracts.push(
InitializeableContract({
name: "OptimismMintableERC20Factory",
target: deploy.mustGetAddress("OptimismMintableERC20Factory"),
initCalldata: abi.encodeCall(l1OptimismMintableERC20Factory.initialize, (address(l1StandardBridge))),
initializedSlotVal: deploy.loadInitializedSlot("OptimismMintableERC20Factory")
initCalldata: abi.encodeCall(l1OptimismMintableERC20Factory.initialize, (address(l1StandardBridge)))
})
);
// OptimismMintableERC20FactoryProxy
contracts.push(
InitializeableContract({
name: "OptimismMintableERC20FactoryProxy",
target: address(l1OptimismMintableERC20Factory),
initCalldata: abi.encodeCall(l1OptimismMintableERC20Factory.initialize, (address(l1StandardBridge))),
initializedSlotVal: deploy.loadInitializedSlot("OptimismMintableERC20FactoryProxy")
initCalldata: abi.encodeCall(l1OptimismMintableERC20Factory.initialize, (address(l1StandardBridge)))
})
);
// DataAvailabilityChallengeImpl
contracts.push(
InitializeableContract({
name: "DataAvailabilityChallenge",
target: deploy.mustGetAddress("DataAvailabilityChallenge"),
initCalldata: abi.encodeCall(dataAvailabilityChallenge.initialize, (address(0), 0, 0, 0, 0)),
initializedSlotVal: deploy.loadInitializedSlot("DataAvailabilityChallenge")
initCalldata: abi.encodeCall(dataAvailabilityChallenge.initialize, (address(0), 0, 0, 0, 0))
})
);
// DataAvailabilityChallengeProxy
contracts.push(
InitializeableContract({
name: "DataAvailabilityChallengeProxy",
target: address(dataAvailabilityChallenge),
initCalldata: abi.encodeCall(dataAvailabilityChallenge.initialize, (address(0), 0, 0, 0, 0)),
initializedSlotVal: deploy.loadInitializedSlot("DataAvailabilityChallengeProxy")
initCalldata: abi.encodeCall(dataAvailabilityChallenge.initialize, (address(0), 0, 0, 0, 0))
})
);
// AnchorStateRegistry
contracts.push(
InitializeableContract({
name: "AnchorStateRegistry",
target: address(anchorStateRegistry),
initCalldata: abi.encodeCall(
anchorStateRegistry.initialize,
(new AnchorStateRegistry.StartingAnchorRoot[](1), SuperchainConfig(address(0)))
)
})
);
// AnchorStateRegistryProxy
contracts.push(
InitializeableContract({
name: "AnchorStateRegistryProxy",
target: address(anchorStateRegistry),
initCalldata: abi.encodeCall(
anchorStateRegistry.initialize,
(new AnchorStateRegistry.StartingAnchorRoot[](1), SuperchainConfig(address(0)))
)
})
);
// Nicknamed contracts.
nicknames["OptimismPortal2Proxy"] = "OptimismPortalProxy";
}
/// @notice Tests that:
/// 1. All `Initializable` contracts in `src/L1` and `src/L2` are accounted for in the `contracts` array.
/// 2. The `_initialized` flag of each contract is properly set to `1`, signifying that the
/// contracts are initialized.
/// 3. The `initialize()` function of each contract cannot be called more than once.
/// 1. All `Initializable` contracts in `src/` (except periphery) are accounted for in `contracts`.
/// 2. The `_initialized` flag of each contract is properly set.
/// 3. The `initialize()` function of each contract cannot be called again.
function test_cannotReinitialize_succeeds() public {
// Ensure that all L1, L2 `Initializable` contracts are accounted for, in addition to
// OptimismMintableERC20FactoryImpl, OptimismMintableERC20FactoryProxy, OptimismPortal2,
// DisputeGameFactoryImpl, DisputeGameFactoryProxy, DelayedWETHImpl, DelayedWETHProxy.
// Omitting OptimismSuperchainERC20 due to using OZ v5 Initializable.
assertEq(_getNumInitializable(), contracts.length);
// Collect exclusions.
string[] memory excludes = new string[](6);
// TODO: Neither of these contracts are labeled properly in the deployment script. Both are
// currently being labeled as their non-interop versions. Remove these exclusions once
// the deployment script is fixed.
excludes[0] = "src/L1/SystemConfigInterop.sol";
excludes[1] = "src/L1/OptimismPortalInterop.sol";
// Contract is currently not being deployed as part of the standard deployment script.
excludes[2] = "src/L2/OptimismSuperchainERC20.sol";
// Periphery contracts don't get deployed as part of the standard deployment script.
excludes[3] = "src/periphery/*";
// TODO: Deployment script is currently "broken" in the sense that it doesn't properly
// label the FaultDisputeGame and PermissionedDisputeGame contracts and instead
// simply deploys them anonymously. Means that functions like "getInitializedSlot"
// don't work properly. Remove these exclusions once the deployment script is fixed.
excludes[4] = "src/dispute/FaultDisputeGame.sol";
excludes[5] = "src/dispute/PermissionedDisputeGame.sol";
// Attempt to re-initialize all contracts within the `contracts` array.
for (uint256 i; i < contracts.length; i++) {
InitializeableContract memory _contract = contracts[i];
uint256 size;
address target = _contract.target;
assembly {
size := extcodesize(target)
}
// Assert that the contract is already initialized.
assertEq(_contract.initializedSlotVal, 1);
// Get all contract names in the src directory, minus the excluded contracts.
string[] memory contractNames = ForgeArtifacts.getContractNames("src/*", excludes);
// Then, attempt to re-initialize the contract. This should fail.
(bool success, bytes memory returnData) = _contract.target.call(_contract.initCalldata);
assertFalse(success);
assertEq(_extractErrorString(returnData), "Initializable: contract is already initialized");
}
// Iterate over all contracts to assert that they are accounted for in the `contracts
// array. All contracts that have an `initialize()` function must be accounted for in the
// `contracts` array or an error will be thrown. If the contract is proxied, both the
// implementation and the proxy must be accounted for in the `contracts` array.
for (uint256 i; i < contractNames.length; i++) {
string memory contractName = contractNames[i];
string memory contractKind = ForgeArtifacts.getContractKind(contractName);
// Filter out non-contracts.
if (!LibString.eq(contractKind, "contract")) {
continue;
}
/// @dev Returns the number of contracts that are `Initializable` in `src/L1` and `src/L2`.
/// For L1 contracts, implementations are considered in addition to proxies
function _getNumInitializable() internal returns (uint256 numContracts_) {
// Construct the query for the initialize function in the contract's ABI.
string[] memory command = new string[](3);
command[0] = Executables.bash;
command[1] = "-c";
// Start by getting L1 contracts
command[2] = string.concat(
Executables.find,
" src/L1 -type f -exec basename {} \\;",
" | ",
Executables.sed,
" 's/\\.[^.]*$//'",
" | ",
Executables.jq,
" -R -s 'split(\"\n\")[:-1]'"
);
string[] memory l1ContractNames = abi.decode(vm.parseJson(string(Process.run(command))), (string[]));
for (uint256 i; i < l1ContractNames.length; i++) {
string memory contractName = l1ContractNames[i];
string memory contractAbi = ForgeArtifacts.getAbi(contractName);
// Query the contract's ABI for an `initialize()` function.
command[2] = string.concat(
Executables.echo,
" '",
contractAbi,
ForgeArtifacts.getAbi(contractName),
"'",
" | ",
Executables.jq,
" '.[] | select(.name == \"initialize\" and .type == \"function\")'"
);
bytes memory res = Process.run(command);
// If the contract has an `initialize()` function, the resulting query will be non-empty.
// In this case, increment the number of `Initializable` contracts.
if (res.length > 0) {
// Count Proxy + Impl
numContracts_ += 2;
}
// If the contract does not have an `initialize()` function, skip it.
if (Process.run(command).length == 0) {
continue;
}
// Then get L2 contracts
command[2] = string.concat(
Executables.find,
" src/L2 -type f -exec basename {} \\;",
" | ",
Executables.sed,
" 's/\\.[^.]*$//'",
" | ",
Executables.jq,
" -R -s 'split(\"\n\")[:-1]'"
// Check if this contract is in the contracts array.
assertTrue(
_hasMatchingContract(contractName), string.concat("Missing ", contractName, " from contracts array")
);
string[] memory l2ContractNames = abi.decode(vm.parseJson(string(Process.run(command))), (string[]));
for (uint256 i; i < l2ContractNames.length; i++) {
string memory contractName = l2ContractNames[i];
string memory contractAbi = ForgeArtifacts.getAbi(contractName);
// If the contract is proxied, check that the proxy is in the contracts array.
// Skip predeployed contracts for now since we don't yet keep track of the
// implementations inside of the deploy script.
// TODO: We should add support for this in the future so that we can properly check that
// the implementations for predeployed contracts are initialized too.
if (ForgeArtifacts.isProxiedContract(contractName) && !ForgeArtifacts.isPredeployedContract(contractName)) {
assertTrue(
_hasMatchingContract(string.concat(contractName, "Proxy")),
string.concat("Missing ", contractName, "Proxy from contracts array")
);
}
}
// Query the contract's ABI for an `initialize()` function.
command[2] = string.concat(
Executables.echo,
" '",
contractAbi,
"'",
" | ",
Executables.jq,
" '.[] | select(.name == \"initialize\" and .type == \"function\")'"
// Attempt to re-initialize all contracts within the `contracts` array.
for (uint256 i; i < contracts.length; i++) {
InitializeableContract memory _contract = contracts[i];
string memory name = _getRealContractName(_contract.name);
// Grab the value of the "initialized" storage slot. Must handle special case for the
// FaultDisputeGame and PermissionedDisputeGame contracts since these have a different
// name for the "initialized" storage slot and are currently not properly labeled in
// the deployment script.
// TODO: Update deployment script to properly label the dispute game contracts.
uint8 initializedSlotVal;
if (LibString.eq(name, "FaultDisputeGame") || LibString.eq(name, "PermissionedDisputeGame")) {
StorageSlot memory slot = ForgeArtifacts.getInitializedSlot(name);
bytes32 slotVal = vm.load(_contract.target, bytes32(vm.parseUint(slot.slot)));
initializedSlotVal = uint8((uint256(slotVal) >> (slot.offset * 8)) & 0xFF);
} else {
initializedSlotVal = deploy.loadInitializedSlot(name);
}
// Assert that the contract is already initialized.
assertTrue(
// Either 1 for initialized or type(uint8).max for initializer disabled.
initializedSlotVal == 1 || initializedSlotVal == type(uint8).max,
"Initializable: contract is not initialized"
);
bytes memory res = Process.run(command);
// If the contract has an `initialize()` function, the resulting query will be non-empty.
// In this case, increment the number of `Initializable` contracts.
if (res.length > 0) {
numContracts_++;
// Then, attempt to re-initialize the contract. This should fail.
(bool success, bytes memory returnData) = _contract.target.call(_contract.initCalldata);
assertFalse(success);
assertEq(_extractErrorString(returnData), "Initializable: contract is already initialized");
}
}
/// @dev Returns true if the contract with the given name is in the `contracts` array.
/// @param _name The name of the contract to check.
/// @return matching_ True if the contract is in the `contracts` array, false otherwise.
function _hasMatchingContract(string memory _name) internal view returns (bool matching_) {
for (uint256 i; i < contracts.length; i++) {
if (LibString.eq(contracts[i].name, _getRealContractName(_name))) {
matching_ = true;
}
}
}
/// @dev Returns the real name of the contract, including any nicknames.
/// @param _name The name of the contract.
/// @return real_ The real name of the contract.
function _getRealContractName(string memory _name) internal view returns (string memory real_) {
real_ = bytes(nicknames[_name]).length > 0 ? nicknames[_name] : _name;
}
/// @dev Extracts the revert string from returndata encoded in the form of `Error(string)`.
......
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