diff --git a/.circleci/config.yml b/.circleci/config.yml index 3f21cf2fe24b8..e1c4854fc4997 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -923,8 +923,8 @@ jobs: command: semgrep - run-contracts-check: command: semver-lock-no-build - - run-contracts-check: - command: semver-diff-check-no-build + #- run-contracts-check: + #command: semver-diff-check-no-build - run-contracts-check: command: validate-deploy-configs - run-contracts-check: diff --git a/op-chain-ops/solc/types.go b/op-chain-ops/solc/types.go index d109231efff72..ab6568183acf9 100644 --- a/op-chain-ops/solc/types.go +++ b/op-chain-ops/solc/types.go @@ -26,11 +26,12 @@ type CompilerInput struct { } type CompilerSettings struct { - Optimizer OptimizerSettings `json:"optimizer"` - Metadata CompilerInputMetadata `json:"metadata"` - OutputSelection map[string]map[string][]string `json:"outputSelection"` - EvmVersion string `json:"evmVersion,omitempty"` - Libraries map[string]map[string]string `json:"libraries,omitempty"` + Optimizer OptimizerSettings `json:"optimizer"` + Metadata CompilerInputMetadata `json:"metadata"` + CompilationTarget map[string]string `json:"compilationTarget"` + OutputSelection map[string]map[string][]string `json:"outputSelection"` + EvmVersion string `json:"evmVersion,omitempty"` + Libraries map[string]map[string]string `json:"libraries,omitempty"` } type OptimizerSettings struct { diff --git a/packages/contracts-bedrock/foundry.toml b/packages/contracts-bedrock/foundry.toml index aafcc6c22b3d6..7f94d2bc88559 100644 --- a/packages/contracts-bedrock/foundry.toml +++ b/packages/contracts-bedrock/foundry.toml @@ -12,6 +12,7 @@ snapshots = 'notarealpath' # workaround for foundry#9477 optimizer = true optimizer_runs = 999999 +use_literal_content = true # IMPORTANT: # When adding any new compiler profiles or compilation restrictions, you must diff --git a/packages/contracts-bedrock/scripts/autogen/generate-semver-lock/main.go b/packages/contracts-bedrock/scripts/autogen/generate-semver-lock/main.go index 4e826c814592d..4a9e03b15a0c7 100644 --- a/packages/contracts-bedrock/scripts/autogen/generate-semver-lock/main.go +++ b/packages/contracts-bedrock/scripts/autogen/generate-semver-lock/main.go @@ -5,10 +5,10 @@ import ( "encoding/json" "fmt" "os" - "regexp" "sort" "strings" + "github.com/ethereum-optimism/optimism/op-chain-ops/solc" "github.com/ethereum-optimism/optimism/packages/contracts-bedrock/scripts/checks/common" "github.com/ethereum/go-ethereum/crypto" ) @@ -21,8 +21,8 @@ type SemverLockOutput struct { } type SemverLockResult struct { - SemverLockOutput - SourceFilePath string + ContractKey string + SemverLockOutput SemverLockOutput } func main() { @@ -32,7 +32,7 @@ func main() { processFile, ) if err != nil { - fmt.Printf("error: %v\n", err) + fmt.Printf("Failed to generate semver lock: %v\n", err) os.Exit(1) } @@ -42,7 +42,7 @@ func main() { if result == nil { continue } - output[result.SourceFilePath] = result.SemverLockOutput + output[result.ContractKey] = result.SemverLockOutput } // Get and sort the keys @@ -76,16 +76,60 @@ func processFile(file string) (*SemverLockResult, []error) { return nil, []error{fmt.Errorf("failed to read artifact: %w", err)} } + var sourceFilePath, contractName, contractKey string + for path, name := range artifact.Metadata.Settings.CompilationTarget { + sourceFilePath = path + contractName = name + contractKey = sourceFilePath + ":" + name + break + } + // Only apply to files in the src directory. - sourceFilePath := artifact.Ast.AbsolutePath if !strings.HasPrefix(sourceFilePath, "src/") { return nil, nil } - // Check if the contract uses semver. - semverRegex := regexp.MustCompile(`custom:semver`) - semver := semverRegex.FindStringSubmatch(artifact.RawMetadata) - if len(semver) == 0 { + // Check if the contract has a version function or variable with @custom:semver tag + hasSemverTag := false + for _, node := range artifact.Ast.Nodes { + if node.NodeType != "ContractDefinition" || node.Name != contractName { + continue + } + // Check each node inside the contract + for _, subNode := range node.Nodes { + // Skip nodes that aren't version functions or variables + if (subNode.NodeType != "FunctionDefinition" && + subNode.NodeType != "VariableDeclaration") || + subNode.Name != "version" { + continue + } + if subNode.Documentation == nil { + continue + } + // Handle documentation based on its actual type + var docText string + switch doc := subNode.Documentation.(type) { + case string: + docText = doc + case map[string]interface{}: + if text, ok := doc["text"].(string); ok { + docText = text + } + case solc.AstDocumentation: + docText = doc.Text + case *solc.AstDocumentation: + docText = doc.Text + } + if strings.Contains(docText, "@custom:semver") { + hasSemverTag = true + break + } + } + if hasSemverTag { + break + } + } + if !hasSemverTag { return nil, nil } @@ -101,13 +145,12 @@ func processFile(file string) (*SemverLockResult, []error) { return nil, []error{fmt.Errorf("failed to read source file: %w", err)} } - // Calculate hashes using Keccak256 trimmedSourceCode := []byte(strings.TrimSuffix(string(sourceCode), "\n")) initCodeHash := fmt.Sprintf("0x%x", crypto.Keccak256Hash(initCodeBytes)) sourceCodeHash := fmt.Sprintf("0x%x", crypto.Keccak256Hash(trimmedSourceCode)) return &SemverLockResult{ - SourceFilePath: sourceFilePath, + ContractKey: contractKey, SemverLockOutput: SemverLockOutput{ InitCodeHash: initCodeHash, SourceCodeHash: sourceCodeHash, diff --git a/packages/contracts-bedrock/scripts/checks/check-frozen-files.sh b/packages/contracts-bedrock/scripts/checks/check-frozen-files.sh index 95d7f8482f45d..28458bed22afd 100755 --- a/packages/contracts-bedrock/scripts/checks/check-frozen-files.sh +++ b/packages/contracts-bedrock/scripts/checks/check-frozen-files.sh @@ -48,66 +48,66 @@ changed_contracts=$(jq -r ' # In order to prevent a file from being modified, comment it out. Do not delete it. # All files in semver-lock.json should be in this list. ALLOWED_FILES=( - "src/L1/DataAvailabilityChallenge.sol" - "src/L1/L1CrossDomainMessenger.sol" - "src/L1/L1ERC721Bridge.sol" - "src/L1/L1StandardBridge.sol" - "src/L1/OPContractsManager.sol" - "src/L1/OPContractsManagerInterop.sol" - "src/L1/OPPrestateUpdater.sol" - "src/L1/OptimismPortal2.sol" - "src/L1/OptimismPortalInterop.sol" - "src/L1/ProtocolVersions.sol" - "src/L1/SuperchainConfig.sol" - "src/L1/SystemConfig.sol" - "src/L1/SystemConfigInterop.sol" - "src/L2/BaseFeeVault.sol" - "src/L2/CrossL2Inbox.sol" - "src/L2/ETHLiquidity.sol" - "src/L2/GasPriceOracle.sol" - "src/L2/L1Block.sol" - "src/L2/L1BlockInterop.sol" - "src/L2/L1FeeVault.sol" - "src/L2/L2CrossDomainMessenger.sol" - "src/L2/L2ERC721Bridge.sol" - "src/L2/L2StandardBridge.sol" - "src/L2/L2StandardBridgeInterop.sol" - "src/L2/L2ToL1MessagePasser.sol" - "src/L2/L2ToL2CrossDomainMessenger.sol" - "src/L2/OptimismMintableERC721.sol" - "src/L2/OptimismMintableERC721Factory.sol" - "src/L2/OptimismSuperchainERC20.sol" - "src/L2/OptimismSuperchainERC20Beacon.sol" - "src/L2/OptimismSuperchainERC20Factory.sol" - "src/L2/SequencerFeeVault.sol" - "src/L2/SuperchainERC20.sol" - "src/L2/SuperchainTokenBridge.sol" - "src/L2/SuperchainWETH.sol" - "src/L2/WETH.sol" - "src/cannon/MIPS.sol" - "src/cannon/MIPS2.sol" - "src/cannon/MIPS64.sol" - "src/cannon/PreimageOracle.sol" - "src/dispute/AnchorStateRegistry.sol" - "src/dispute/DelayedWETH.sol" - "src/dispute/DisputeGameFactory.sol" - "src/dispute/FaultDisputeGame.sol" - "src/dispute/PermissionedDisputeGame.sol" - "src/dispute/SuperFaultDisputeGame.sol" - "src/dispute/SuperPermissionedDisputeGame.sol" - "src/legacy/DeployerWhitelist.sol" - "src/legacy/L1BlockNumber.sol" - "src/legacy/LegacyMessagePasser.sol" - "src/safe/DeputyGuardianModule.sol" - "src/safe/DeputyPauseModule.sol" - "src/safe/LivenessGuard.sol" - "src/safe/LivenessModule.sol" - "src/universal/OptimismMintableERC20.sol" - "src/universal/OptimismMintableERC20Factory.sol" - "src/universal/StorageSetter.sol" - "src/vendor/asterisc/RISCV.sol" - "src/vendor/eas/EAS.sol" - "src/vendor/eas/SchemaRegistry.sol" + "src/L1/DataAvailabilityChallenge.sol:DataAvailabilityChallenge" + "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger" + "src/L1/L1ERC721Bridge.sol:L1ERC721Bridge" + "src/L1/L1StandardBridge.sol:L1StandardBridge" + "src/L1/OPContractsManager.sol:OPContractsManager" + "src/L1/OPContractsManagerInterop.sol:OPContractsManagerInterop" + "src/L1/OPPrestateUpdater.sol:OPPrestateUpdater" + "src/L1/OptimismPortal2.sol:OptimismPortal2" + "src/L1/OptimismPortalInterop.sol:OptimismPortalInterop" + "src/L1/ProtocolVersions.sol:ProtocolVersions" + "src/L1/SuperchainConfig.sol:SuperchainConfig" + "src/L1/SystemConfig.sol:SystemConfig" + "src/L1/SystemConfigInterop.sol:SystemConfigInterop" + "src/L2/BaseFeeVault.sol:BaseFeeVault" + "src/L2/CrossL2Inbox.sol:CrossL2Inbox" + "src/L2/ETHLiquidity.sol:ETHLiquidity" + "src/L2/GasPriceOracle.sol:GasPriceOracle" + "src/L2/L1Block.sol:L1Block" + "src/L2/L1BlockInterop.sol:L1BlockInterop" + "src/L2/L1FeeVault.sol:L1FeeVault" + "src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger" + "src/L2/L2ERC721Bridge.sol:L2ERC721Bridge" + "src/L2/L2StandardBridge.sol:L2StandardBridge" + "src/L2/L2StandardBridgeInterop.sol:L2StandardBridgeInterop" + "src/L2/L2ToL1MessagePasser.sol:L2ToL1MessagePasser" + "src/L2/L2ToL2CrossDomainMessenger.sol:L2ToL2CrossDomainMessenger" + "src/L2/OptimismMintableERC721.sol:OptimismMintableERC721" + "src/L2/OptimismMintableERC721Factory.sol:OptimismMintableERC721Factory" + "src/L2/OptimismSuperchainERC20.sol:OptimismSuperchainERC20" + "src/L2/OptimismSuperchainERC20Beacon.sol:OptimismSuperchainERC20Beacon" + "src/L2/OptimismSuperchainERC20Factory.sol:OptimismSuperchainERC20Factory" + "src/L2/SequencerFeeVault.sol:SequencerFeeVault" + "src/L2/SuperchainERC20.sol:SuperchainERC20" + "src/L2/SuperchainTokenBridge.sol:SuperchainTokenBridge" + "src/L2/SuperchainWETH.sol:SuperchainWETH" + "src/L2/WETH.sol:WETH" + "src/cannon/MIPS.sol:MIPS" + "src/cannon/MIPS2.sol:MIPS2" + "src/cannon/MIPS64.sol:MIPS64" + "src/cannon/PreimageOracle.sol:PreimageOracle" + "src/dispute/AnchorStateRegistry.sol:AnchorStateRegistry" + "src/dispute/DelayedWETH.sol:DelayedWETH" + "src/dispute/DisputeGameFactory.sol:DisputeGameFactory" + "src/dispute/FaultDisputeGame.sol:FaultDisputeGame" + "src/dispute/PermissionedDisputeGame.sol:PermissionedDisputeGame" + "src/dispute/SuperFaultDisputeGame.sol:SuperFaultDisputeGame" + "src/dispute/SuperPermissionedDisputeGame.sol:SuperPermissionedDisputeGame" + "src/legacy/DeployerWhitelist.sol:DeployerWhitelist" + "src/legacy/L1BlockNumber.sol:L1BlockNumber" + "src/legacy/LegacyMessagePasser.sol:LegacyMessagePasser" + "src/safe/DeputyGuardianModule.sol:DeputyGuardianModule" + "src/safe/DeputyPauseModule.sol:DeputyPauseModule" + "src/safe/LivenessGuard.sol:LivenessGuard" + "src/safe/LivenessModule.sol:LivenessModule" + "src/universal/OptimismMintableERC20.sol:OptimismMintableERC20" + "src/universal/OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory" + "src/universal/StorageSetter.sol:StorageSetter" + "src/vendor/asterisc/RISCV.sol:RISCV" + "src/vendor/eas/EAS.sol:EAS" + "src/vendor/eas/SchemaRegistry.sol:SchemaRegistry" ) MATCHED_FILES=() diff --git a/packages/contracts-bedrock/scripts/checks/check-semver-diff.sh b/packages/contracts-bedrock/scripts/checks/check-semver-diff.sh index 08540879a96d2..18f698f911178 100755 --- a/packages/contracts-bedrock/scripts/checks/check-semver-diff.sh +++ b/packages/contracts-bedrock/scripts/checks/check-semver-diff.sh @@ -56,7 +56,7 @@ changed_contracts=$(jq -r ' .key as $key | .value != $upstream[$key] ) - ) | map(.key); + ) | map(.key | split(":")[0]); changes[] ' "$temp_dir/local_semver_lock.json" "$temp_dir/upstream_semver_lock.json") diff --git a/packages/contracts-bedrock/snapshots/semver-lock.json b/packages/contracts-bedrock/snapshots/semver-lock.json index 8a31cd06dc979..5667bfa15807f 100644 --- a/packages/contracts-bedrock/snapshots/semver-lock.json +++ b/packages/contracts-bedrock/snapshots/semver-lock.json @@ -1,237 +1,237 @@ { - "src/L1/DataAvailabilityChallenge.sol": { + "src/L1/DataAvailabilityChallenge.sol:DataAvailabilityChallenge": { "initCodeHash": "0xacbae98cc7c0f7ecbf36dc44bbf7cb0a011e6e6b781e28b9dbf947e31482b30d", "sourceCodeHash": "0xe772f7db8033e4a738850cb28ac4849d3a454c93732135a8a10d4f7cb498088e" }, - "src/L1/L1CrossDomainMessenger.sol": { + "src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger": { "initCodeHash": "0x5a6272f6bd4346da460b7ff2ebc426d158d7ffc65dc0f2c0651a9e6d545bfd03", "sourceCodeHash": "0xf11fa72481dbe43dad4e7a48645fcf92d0feeefa0b98b282042bdda568508372" }, - "src/L1/L1ERC721Bridge.sol": { + "src/L1/L1ERC721Bridge.sol:L1ERC721Bridge": { "initCodeHash": "0x819fcccb74bef53241d7d651f73949115e5706b61c7cb8cdb9b6d9d34ef39e89", "sourceCodeHash": "0x5036f59ae3414d1106f148765bba9d1759844c9c2d3e18ab5c81bb49cf59eab8" }, - "src/L1/L1StandardBridge.sol": { + "src/L1/L1StandardBridge.sol:L1StandardBridge": { "initCodeHash": "0xbd4a03a3611a0de9669c4c8556f90c5aaef666b899d9ded1c07abc60263da8d6", "sourceCodeHash": "0x44797707aea8c63dec049a02d69ea056662a06e5cf320028ab8b388634bf1c67" }, - "src/L1/OPContractsManager.sol": { + "src/L1/OPContractsManager.sol:OPContractsManager": { "initCodeHash": "0x216fe3ceef5d3e839d18a00383793bd326f20944fc3b55ef099a26a22141de18", "sourceCodeHash": "0xd1de3414a3db731447cb6172df23a00cb1664783de56a93fb29f87d6bc8b8bb0" }, - "src/L1/OptimismPortal2.sol": { + "src/L1/OptimismPortal2.sol:OptimismPortal2": { "initCodeHash": "0xd1651b8a6f4d25611a0105d5cc7c1da3921417bd44da870ec63bf5ccd1bc7c63", "sourceCodeHash": "0xce7373d8c7df47caa8b090f3afb3d2539677f12cb3eff7fc0ab1fd85638f05c1" }, - "src/L1/OptimismPortalInterop.sol": { + "src/L1/OptimismPortalInterop.sol:OptimismPortalInterop": { "initCodeHash": "0xd59854648bf205dfbea96b483b2937441c32e9ef66b002468c2c14c0d6661728", "sourceCodeHash": "0xd00b267dcf125e77c10b28c088be4378ec779927e3bcfeb6aa9a7f3d51370490" }, - "src/L1/ProtocolVersions.sol": { + "src/L1/ProtocolVersions.sol:ProtocolVersions": { "initCodeHash": "0x5a76c8530cb24cf23d3baacc6eefaac226382af13f1e2a35535d2ec2b0573b29", "sourceCodeHash": "0xb3e32b18c95d4940980333e1e99b4dcf42d8a8bfce78139db4dc3fb06e9349d0" }, - "src/L1/SuperchainConfig.sol": { + "src/L1/SuperchainConfig.sol:SuperchainConfig": { "initCodeHash": "0x23c54871316523111f3385b5acd7fcbda3c91096d0d44a21d8bae61736c380d7", "sourceCodeHash": "0xfd56e63e76b1f203cceeb9bbb14396ae803cbbbf7e80ca0ee11fb586321812af" }, - "src/L1/SystemConfig.sol": { + "src/L1/SystemConfig.sol:SystemConfig": { "initCodeHash": "0xd5b8b8eb47763556d9953019d1f81b1d790f15433aa9696b159a3fc45ecee148", "sourceCodeHash": "0x6bfbc78b0fef2f65beff11a81f924728a7bd439a56986997621099551805aff9" }, - "src/L1/SystemConfigInterop.sol": { + "src/L1/SystemConfigInterop.sol:SystemConfigInterop": { "initCodeHash": "0xbef4696b2dcb6d43c3b3c438338bfb2224a1ea5002ed0612ec36a7821d7e3da2", "sourceCodeHash": "0x1653aaa4d2b44d34ca1f9f2b4971eeb7594c8c2d27771b1f68b8d38cb79f2368" }, - "src/L2/BaseFeeVault.sol": { + "src/L2/BaseFeeVault.sol:BaseFeeVault": { "initCodeHash": "0xc403d4c555d8e69a2699e01d192ae7327136701fa02da10a6d75a584b3c364c9", "sourceCodeHash": "0xfa56426153227e798150f6becc30a33fd20a3c6e0d73c797a3922dd631acbb57" }, - "src/L2/CrossL2Inbox.sol": { + "src/L2/CrossL2Inbox.sol:CrossL2Inbox": { "initCodeHash": "0x2bc4a3765004f9a9e6e5278753bce3c3d53cc95da62efcc0cb10c50d8c806cd4", "sourceCodeHash": "0x661d7659f09b7f909e8bd5e6c41e8c98f2091036ed2123b7e18a1a74120bd849" }, - "src/L2/ETHLiquidity.sol": { + "src/L2/ETHLiquidity.sol:ETHLiquidity": { "initCodeHash": "0x776ece4a1bb24d97287806769470327641da240b083898a90943e2844957cc46", "sourceCodeHash": "0xe5c08ce62327113e4bbaf29f47e5f1ddfad6fbd63c07132eedfba5af5325f331" }, - "src/L2/GasPriceOracle.sol": { + "src/L2/GasPriceOracle.sol:GasPriceOracle": { "initCodeHash": "0x38ef70b2783dd45ad807afcf57972c7df4abaaeb5d16d17cdb451b9e931a9cbb", "sourceCodeHash": "0x4351fe2ac1106c8c220b8cfe7839bc107c24d8084deb21259ac954f5a362725d" }, - "src/L2/L1Block.sol": { + "src/L2/L1Block.sol:L1Block": { "initCodeHash": "0xa1f984b8ea199574261c19122b5a9c8c7dbd3633980b1e7aaf6b7af24af60478", "sourceCodeHash": "0xd04d64355dcf55247ac937748518e7f9620ae3f9eabe80fae9a82c0115ed77bc" }, - "src/L2/L1BlockInterop.sol": { + "src/L2/L1BlockInterop.sol:L1BlockInterop": { "initCodeHash": "0x55d09f00ad284fd7ca4b55c45fb901ed021b83118012be217aec53876ab34c12", "sourceCodeHash": "0x7dd627c198a583fbe2c7d257f06001e1a2e563c6c7d79ea6ba9ca0d47cd1599b" }, - "src/L2/L1FeeVault.sol": { + "src/L2/L1FeeVault.sol:L1FeeVault": { "initCodeHash": "0x6745b7be3895a5e8d373df0066d931bae29c47672ac46c2f5829bd0052cc6d9e", "sourceCodeHash": "0xd0471c328c1d17c5863261322bf8d5aff2e7e9e3a1135631a993aa75667621df" }, - "src/L2/L2CrossDomainMessenger.sol": { + "src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger": { "initCodeHash": "0xe160be403df12709c371c33195d1b9c3b5e9499e902e86bdabc8eed749c3fd61", "sourceCodeHash": "0x12ea125038b87e259a0d203e119faa6e9726ab2bdbc30430f820ccd48fe87e14" }, - "src/L2/L2ERC721Bridge.sol": { + "src/L2/L2ERC721Bridge.sol:L2ERC721Bridge": { "initCodeHash": "0x863f0f5b410983f3e51cd97c60a3a42915141b7452864d0e176571d640002b81", "sourceCodeHash": "0xc05bfcfadfd09a56cfea68e7c1853faa36d114d9a54cd307348be143e442c35a" }, - "src/L2/L2StandardBridge.sol": { + "src/L2/L2StandardBridge.sol:L2StandardBridge": { "initCodeHash": "0xba5b288a396b34488ba7be68473305529c7da7c43e5f1cfc48d6a4aecd014103", "sourceCodeHash": "0x9dd26676cd1276c807ffd4747236783c5170d0919c70693e70b7e4c4c2675429" }, - "src/L2/L2StandardBridgeInterop.sol": { + "src/L2/L2StandardBridgeInterop.sol:L2StandardBridgeInterop": { "initCodeHash": "0xa7a2e7efe8116ebb21f47ee06c1e62d3b2f5a046478094611a2ab4b714154030", "sourceCodeHash": "0xde724da82ecf3c96b330c2876a7285b6e2b933ac599241eaa3174c443ebbe33a" }, - "src/L2/L2ToL1MessagePasser.sol": { + "src/L2/L2ToL1MessagePasser.sol:L2ToL1MessagePasser": { "initCodeHash": "0xf9d82084dcef31a3737a76d8ee4e5842ea190d0f77ed4678adb3bbb95217050f", "sourceCodeHash": "0xaef8ea36c5b78cd12e0e62811d51db627ccf0dfd2cc5479fb707a10ef0d42048" }, - "src/L2/L2ToL2CrossDomainMessenger.sol": { + "src/L2/L2ToL2CrossDomainMessenger.sol:L2ToL2CrossDomainMessenger": { "initCodeHash": "0xc56db8cb569efa0467fd53ab3fa218af3051e54f5517d7fafb7b5831b4350618", "sourceCodeHash": "0x72062343a044e9c56f4143dcfc71706286eb205902006c2afcf6a4cd90c3e9f8" }, - "src/L2/OperatorFeeVault.sol": { + "src/L2/OperatorFeeVault.sol:OperatorFeeVault": { "initCodeHash": "0x3d8c0d7736e8767f2f797da1c20c5fe30bd7f48a4cf75f376290481ad7c0f91f", "sourceCodeHash": "0x2022fdb4e32769eb9446dab4aed4b8abb5261fd866f381cccfa7869df1a2adff" }, - "src/L2/OptimismMintableERC721.sol": { + "src/L2/OptimismMintableERC721.sol:OptimismMintableERC721": { "initCodeHash": "0xcfa6ad9997a422aef5a19a490a0a535bc870ee34b1f5258c2949eb3680f71e8a", "sourceCodeHash": "0xb67b91f28c8666fee26c40375f835c61629e0f14054bfaf78bc3c61175bbf136" }, - "src/L2/OptimismMintableERC721Factory.sol": { + "src/L2/OptimismMintableERC721Factory.sol:OptimismMintableERC721Factory": { "initCodeHash": "0x9ccba9a5db77356c361fe4aea0e93498a56bda9fdac8d5e654d6f7abc4553028", "sourceCodeHash": "0x2e4b8535b1f7749a0479b2c1de86b3ff79ee4ff6122c6f87c52d66cd301f3f97" }, - "src/L2/OptimismSuperchainERC20.sol": { + "src/L2/OptimismSuperchainERC20.sol:OptimismSuperchainERC20": { "initCodeHash": "0xdac32a1057a6bc8a8d2ffdce1db8f34950cd0ffd1454d2133865736d21869192", "sourceCodeHash": "0x4a7924f2195074145ac8e6221d77b24cd22d97423db2053937897e9d788990e2" }, - "src/L2/OptimismSuperchainERC20Beacon.sol": { + "src/L2/OptimismSuperchainERC20Beacon.sol:OptimismSuperchainERC20Beacon": { "initCodeHash": "0x8a4d7cac6dd8ce583c996837893b93560297be1269f97f785a502748b25ba310", "sourceCodeHash": "0xb57024e16b528bade5fee7c236e03ffbb3f22e6376e6852e2109298af850b43c" }, - "src/L2/OptimismSuperchainERC20Factory.sol": { + "src/L2/OptimismSuperchainERC20Factory.sol:OptimismSuperchainERC20Factory": { "initCodeHash": "0x44659ea207ed173db4f1b519944c09c671d49f118e9d9ab85a010b8ebaf899e7", "sourceCodeHash": "0xa1c0346cfe6932dde05dc6c1d9505cac38434d8a8f9e1e437253b1f4115f2506" }, - "src/L2/SequencerFeeVault.sol": { + "src/L2/SequencerFeeVault.sol:SequencerFeeVault": { "initCodeHash": "0x02ca6cb6eebd2d6b91cf1eab483ee00b3233a7e8ad31f0e9cafc1f645ab3c24a", "sourceCodeHash": "0x85c740c0888368ee95607635818ee698c27582e8917f40bc590d240447376da9" }, - "src/L2/SuperchainERC20.sol": { + "src/L2/SuperchainERC20.sol:SuperchainERC20": { "initCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", "sourceCodeHash": "0x981dca5b09da9038a9dff071b40a880e1b52b20268c6780ef54be3bc98a4f629" }, - "src/L2/SuperchainTokenBridge.sol": { + "src/L2/SuperchainTokenBridge.sol:SuperchainTokenBridge": { "initCodeHash": "0x6b568ed564aede82a3a4cbcdb51282cad0e588a3fe6d91cf76616d3113df3901", "sourceCodeHash": "0xcd2b49cb7cf6d18616ee8bec9183fe5b5b460941875bc0b4158c4d5390ec3b0c" }, - "src/L2/SuperchainWETH.sol": { + "src/L2/SuperchainWETH.sol:SuperchainWETH": { "initCodeHash": "0x545686820e440d72529c815b7406844272d5ec33b741b2be6ebbe3a3db1ca8ad", "sourceCodeHash": "0x6145e61cc0a0c95db882a76ecffea15c358c2b574d5157e53b85a69908701613" }, - "src/L2/WETH.sol": { + "src/L2/WETH.sol:WETH": { "initCodeHash": "0x38b396fc35d72e8013bad2fe8d7dea5285499406d4c4b62e27c54252e1e0f00a", "sourceCodeHash": "0xf4f83ca89d2519045a2916c670bda66f39b431a13921e639a5342bfc6157b178" }, - "src/cannon/MIPS.sol": { + "src/cannon/MIPS.sol:MIPS": { "initCodeHash": "0x6072be7e25ad30d16ef86e2f95343b5378bc29d79541b3711f3463e712baebf6", "sourceCodeHash": "0x51d93a684bd9def207a47f6c1dbe481aba5def3f77533d4a6e490784204d113b" }, - "src/cannon/MIPS2.sol": { + "src/cannon/MIPS2.sol:MIPS2": { "initCodeHash": "0x1f4e7cfdbcf7a8ca0ebac69bc7fe74143286a0e51a06ee9cbd699d68efd26dba", "sourceCodeHash": "0x20256a2196daca39b56bfae1c90b8871349916dc47461b5ca078c2013c067571" }, - "src/cannon/MIPS64.sol": { + "src/cannon/MIPS64.sol:MIPS64": { "initCodeHash": "0x0a274f73b9fae62524a5773e480b398846e1140aed373be211a07cb586e4758e", "sourceCodeHash": "0xb710bd6d4844f9ee45f301bb815786619b5e2d6b2f85ae17f39bee4f414f1957" }, - "src/cannon/PreimageOracle.sol": { + "src/cannon/PreimageOracle.sol:PreimageOracle": { "initCodeHash": "0x6af5b0e83b455aab8d0946c160a4dc049a4e03be69f8a2a9e87b574f27b25a66", "sourceCodeHash": "0x03c160168986ffc8d26a90c37366e7ad6da03f49d83449e1f8b3de0f4b590f6f" }, - "src/dispute/AnchorStateRegistry.sol": { + "src/dispute/AnchorStateRegistry.sol:AnchorStateRegistry": { "initCodeHash": "0x08cc5a5e41eadb6c411fa6387ddc0cf12be360855599dd622cce84c0ba081e77", "sourceCodeHash": "0xe0aaa79f7184724ff0fba2e92e85f652f936fecd099288edb0a0f6b0e0240f34" }, - "src/dispute/DelayedWETH.sol": { + "src/dispute/DelayedWETH.sol:DelayedWETH": { "initCodeHash": "0xdd0b5e523f3b53563fe0b6e6165fb73605b14910ffa32a7cbed855cdebab47c6", "sourceCodeHash": "0x592fe720a86be12fd83511f641d5b3dee80834a7ed83a6ab81d3e7e4712c15d8" }, - "src/dispute/DisputeGameFactory.sol": { + "src/dispute/DisputeGameFactory.sol:DisputeGameFactory": { "initCodeHash": "0xfd3ead515b80db01722e56203bd3ef85c41fc2cb201cc6afa9fb42d8a9731bca", "sourceCodeHash": "0x08efbce44394f555a4e656816897029e2e80e455e4200a1b887fc18993294660" }, - "src/dispute/FaultDisputeGame.sol": { + "src/dispute/FaultDisputeGame.sol:FaultDisputeGame": { "initCodeHash": "0xd86a649deaa0d5ca6c4b60afb941c52fd2b5d10857657defda3629faaff6d77e", "sourceCodeHash": "0xf5d3760949af227ea161f552a1d0c5d605a26bfd24dc428f674c011cb7f0a416" }, - "src/dispute/PermissionedDisputeGame.sol": { + "src/dispute/PermissionedDisputeGame.sol:PermissionedDisputeGame": { "initCodeHash": "0x63ab07ca14b77da770de1814b112e1a21ea984c5132b8ff3beaab2cf88018c19", "sourceCodeHash": "0xba32e6f35777426839a60e5556c09844e805eaabc14b9d3732cc64f2a99ce7fc" }, - "src/dispute/SuperFaultDisputeGame.sol": { + "src/dispute/SuperFaultDisputeGame.sol:SuperFaultDisputeGame": { "initCodeHash": "0x397d9eda98459859f30f170f0d3c6f4320d474ea36510ae7ece020800b80ba22", "sourceCodeHash": "0xb08789200c909d24c8ebfbde9b9c55c50b9ebae2d21e761464c1b5abbbe59317" }, - "src/dispute/SuperPermissionedDisputeGame.sol": { + "src/dispute/SuperPermissionedDisputeGame.sol:SuperPermissionedDisputeGame": { "initCodeHash": "0x9613232c1c11abee8782e2e9a5bb963923c73643d8c228e558f06082e8886f67", "sourceCodeHash": "0xaefa8af211cee1b34063252f62020cd468175a2ab9cfc46b4e4cb03190e2d659" }, - "src/legacy/DeployerWhitelist.sol": { + "src/legacy/DeployerWhitelist.sol:DeployerWhitelist": { "initCodeHash": "0x53099379ed48b87f027d55712dbdd1da7d7099925426eb0531da9c0012e02c29", "sourceCodeHash": "0xf22c94ed20c32a8ed2705a22d12c6969c3c3bad409c4efe2f95b0db74f210e10" }, - "src/legacy/L1BlockNumber.sol": { + "src/legacy/L1BlockNumber.sol:L1BlockNumber": { "initCodeHash": "0x60dded11d35e42fe15ef5dd94d28aae6b8ff3e67c6fbbc667a6729fcb3ca7a9a", "sourceCodeHash": "0x53ef11021a52e9c87024a870566ec5dba1d1a12752396e654904384efdd8203e" }, - "src/legacy/LegacyMessagePasser.sol": { + "src/legacy/LegacyMessagePasser.sol:LegacyMessagePasser": { "initCodeHash": "0x3ca911b0578be7f8c91e7d01442a5609f04e5866768f99c8e31627c9ba79c9f0", "sourceCodeHash": "0x62c9a6182d82692fb9c173ddb0d7978bcff2d1d4dc8cd2f10625e1e65bda6888" }, - "src/safe/DeputyGuardianModule.sol": { + "src/safe/DeputyGuardianModule.sol:DeputyGuardianModule": { "initCodeHash": "0x5eaf823d81995ce1f703f26e31049c54c1d4902dd9873a0b4645d470f2f459a2", "sourceCodeHash": "0x17236a91c4171ae9525eae0e59fa65bb2dc320d62677cfc7d7eb942f182619fb" }, - "src/safe/DeputyPauseModule.sol": { + "src/safe/DeputyPauseModule.sol:DeputyPauseModule": { "initCodeHash": "0xa3b7bf0c93b41f39ebc18a81322b90127a633d684ae9f86c2f2a1c48fe7f1372", "sourceCodeHash": "0xfbe7f5733aa57de7557605e40e03e9708fbdec872bc8739c551905c4b1e1b61b" }, - "src/safe/LivenessGuard.sol": { + "src/safe/LivenessGuard.sol:LivenessGuard": { "initCodeHash": "0xc8e29e8b12f423c8cd229a38bc731240dd815d96f1b0ab96c71494dde63f6a81", "sourceCodeHash": "0x72b8d8d855e7af8beee29330f6cb9b9069acb32e23ce940002ec9a41aa012a16" }, - "src/safe/LivenessModule.sol": { + "src/safe/LivenessModule.sol:LivenessModule": { "initCodeHash": "0xde3b3273aa37604048b5fa228b90f3b05997db613dfcda45061545a669b2476a", "sourceCodeHash": "0x918965e52bbd358ac827ebe35998f5d8fa5ca77d8eb9ab8986b44181b9aaa48a" }, - "src/universal/OptimismMintableERC20.sol": { + "src/universal/OptimismMintableERC20.sol:OptimismMintableERC20": { "initCodeHash": "0xc3289416829b252c830ad7d389a430986a7404df4fe0be37cb19e1c40907f047", "sourceCodeHash": "0xf5e29dd5c750ea935c7281ec916ba5277f5610a0a9e984e53ae5d5245b3cf2f4" }, - "src/universal/OptimismMintableERC20Factory.sol": { + "src/universal/OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory": { "initCodeHash": "0xdb4d93a65cf9d3e3af77d3d62249f06580e80a0431542350f953f0a4041566b4", "sourceCodeHash": "0xd1bad4408c26eb9c7b0ddcb088f0d4e3be73a43d899263ec8610f4d41a178ec7" }, - "src/universal/StorageSetter.sol": { + "src/universal/StorageSetter.sol:StorageSetter": { "initCodeHash": "0x8831c079f7b7a52679e8a15e0ea14e30ea7bb4f93feed0fcd369942fe8c1f1ec", "sourceCodeHash": "0x42151e2547ec5270353977fd66e78fa1fde18f362d7021cf7ddce16d5201b3ec" }, - "src/vendor/asterisc/RISCV.sol": { + "src/vendor/asterisc/RISCV.sol:RISCV": { "initCodeHash": "0x7329cca924e189eeaa2d883234f6cb5fd787c8bf3339d8298e721778c2947ce5", "sourceCodeHash": "0x02025b303a8f37b4e541f8c7936a8651402a60ea0147a53176e06b51b15a1f84" }, - "src/vendor/eas/EAS.sol": { + "src/vendor/eas/EAS.sol:EAS": { "initCodeHash": "0xbd79d6fff128b3da3e09ead84b805b7540740190488f2791a6b4e5b7aabf9cff", "sourceCodeHash": "0x3512c3a1b5871341346f6646a04c0895dd563e9824f2ab7ab965b6a81a41ad2e" }, - "src/vendor/eas/SchemaRegistry.sol": { + "src/vendor/eas/SchemaRegistry.sol:SchemaRegistry": { "initCodeHash": "0x2bfce526f82622288333d53ca3f43a0a94306ba1bab99241daa845f8f4b18bd4", "sourceCodeHash": "0xf49d7b0187912a6bb67926a3222ae51121e9239495213c975b3b4b217ee57a1b" }