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