| 
 | 1 | +# The Verify Command  | 
 | 2 | + | 
 | 3 | +Once you have deployed contracts via [bootstrap][bootstrap], you can use the `verify` command to verify the source code on Etherscan. Constructor args used in the verification request are extracted automatically from contract initcode via the tx that created the contract.  | 
 | 4 | + | 
 | 5 | +[bootstrap]: bootstrap.md  | 
 | 6 | + | 
 | 7 | +You can call the `verify` command like this:  | 
 | 8 | + | 
 | 9 | +```shell  | 
 | 10 | +op-deployer verify \  | 
 | 11 | +  --l1-rpc-url <l1 rpc url> \  | 
 | 12 | +  --input-file <filepath to input .json file> \  | 
 | 13 | +  --etherscan-api-key <your free etherscan api key> \  | 
 | 14 | +  --artifacts-locator <l1 forge-artifacts locator>  | 
 | 15 | +```  | 
 | 16 | + | 
 | 17 | +## CLI Args  | 
 | 18 | + | 
 | 19 | +### `--l1-rpc-url`  | 
 | 20 | + | 
 | 21 | +Defines the RPC URL of the L1 chain to deploy to (currently only supports mainnet and sepolia).  | 
 | 22 | + | 
 | 23 | +### `--input-file`  | 
 | 24 | + | 
 | 25 | +The full filepath to the input .json file. This file should be a key/value store where the key is a contract name and the value is the contract address. The output of the `bootstrap superchain|implementations` commands is a good example of this format, and those output files can be fed directly into `verify`. Unless the `--contract-name` flag is passed, all contracts in the input file will be verified.  | 
 | 26 | + | 
 | 27 | +{  | 
 | 28 | +  "Opcm": "0x3a1f523a4bc09cd344a2745a108bb0398288094f",  | 
 | 29 | +  "OpcmContractsContainer": "0x660aeaac7508258f622cfdc489c16c864b4d8629",  | 
 | 30 | +  "OpcmGameTypeAdder": "0xc9060f6283b78e1feebfd1993cb6350b5626f115",  | 
 | 31 | +  "OpcmDeployer": "0x88e39ea5cfe6c4d450305eec5fd90dd1fba87f45",  | 
 | 32 | +  "OpcmUpgrader": "0xbf098a12edcf99f8e6db258b7ac567a1fd020f4b",  | 
 | 33 | +  "DelayedWETHImpl": "0x5e40b9231b86984b5150507046e354dbfbed3d9e",  | 
 | 34 | +  "OptimismPortalImpl": "0xb443da3e07052204a02d630a8933dac05a0d6fb4",  | 
 | 35 | +  "PreimageOracleSingleton": "0x1fb8cdfc6831fc866ed9c51af8817da5c287add3",  | 
 | 36 | +  "MipsSingleton": "0xf027f4a985560fb13324e943edf55ad6f1d15dc1",  | 
 | 37 | +  "SystemConfigImpl": "0x340f923e5c7cbb2171146f64169ec9d5a9ffe647",  | 
 | 38 | +  "L1CrossDomainMessengerImpl": "0x5d5a095665886119693f0b41d8dfee78da033e8b",  | 
 | 39 | +  "L1ERC721BridgeImpl": "0x7ae1d3bd877a4c5ca257404ce26be93a02c98013",  | 
 | 40 | +  "L1StandardBridgeImpl": "0x0b09ba359a106c9ea3b181cbc5f394570c7d2a7a",  | 
 | 41 | +  "OptimismMintableERC20FactoryImpl": "0x5493f4677a186f64805fe7317d6993ba4863988f",  | 
 | 42 | +  "DisputeGameFactoryImpl": "0x4bba758f006ef09402ef31724203f316ab74e4a0",  | 
 | 43 | +  "AnchorStateRegistryImpl": "0x7b465370bb7a333f99edd19599eb7fb1c2d3f8d2",  | 
 | 44 | +  "SuperchainConfigImpl": "0x4da82a327773965b8d4d85fa3db8249b387458e7",  | 
 | 45 | +  "ProtocolVersionsImpl": "0x37e15e4d6dffa9e5e320ee1ec036922e563cb76c"  | 
 | 46 | +}  | 
 | 47 | + | 
 | 48 | +### `--contract-name` (optional)  | 
 | 49 | + | 
 | 50 | +Specifies a single contract name, matching a contract key within the input file, to verify. If not provided, all contracts in the input file will be verified.  | 
 | 51 | + | 
 | 52 | +### `--artifacts-locator`  | 
 | 53 | + | 
 | 54 | +The locator to forge-artifacts containing the output of the `forge build` command (i.e. compiled bytecode and solidity source code). This can be a local path (with a `file://` prefix), remote URL (with a `http://` or `https://` prefix), or standard contracts tag (with a `tag://op-contracts/v` prefix).  | 
 | 55 | + | 
 | 56 | +## Output  | 
 | 57 | + | 
 | 58 | +Output logs will be printed to the console and look something like the following. If the final results show `numFailed=0`, all contracts were verified successfully.  | 
 | 59 | +```sh  | 
 | 60 | +INFO [03-05|15:56:55.900] Formatting etherscan verify request      name=superchainConfigProxyAddress            address=0x805fc6750ec23bdD58f7BBd6ce073649134C638A  | 
 | 61 | +INFO [03-05|15:56:55.900] Opening artifact                         path=Proxy.sol/Proxy.json           name=superchainConfigProxyAddress  | 
 | 62 | +INFO [03-05|15:56:55.905] contractName                             name=src/universal/Proxy.sol:Proxy  | 
 | 63 | +INFO [03-05|15:56:55.905] Extracting constructor args from initcode address=0x805fc6750ec23bdD58f7BBd6ce073649134C638A argSlots=1  | 
 | 64 | +INFO [03-05|15:56:56.087] Contract creation tx hash                txHash=0x71b377ccc11304afc32e1016c4828a34010a0d3d81701c7164fb19525ba4fbc4  | 
 | 65 | +INFO [03-05|15:56:56.494] Successfully extracted constructor args  address=0x805fc6750ec23bdD58f7BBd6ce073649134C638A  | 
 | 66 | +INFO [03-05|15:56:56.683] Verification request submitted           name=superchainConfigProxyAddress            address=0x805fc6750ec23bdD58f7BBd6ce073649134C638A  | 
 | 67 | +INFO [03-05|15:57:02.035] Verification complete                    name=superchainConfigProxyAddress            address=0x805fc6750ec23bdD58f7BBd6ce073649134C638A  | 
 | 68 | +INFO [03-05|15:57:02.208] Formatting etherscan verify request      name=protocolVersionsImplAddress             address=0x658812BEb9bF6286D03fBF1B5B936e1af490b768  | 
 | 69 | +INFO [03-05|15:57:02.208] Opening artifact                         path=ProtocolVersions.sol/ProtocolVersions.json name=protocolVersionsImplAddress  | 
 | 70 | +INFO [03-05|15:57:02.215] contractName                             name=src/L1/ProtocolVersions.sol:ProtocolVersions  | 
 | 71 | +INFO [03-05|15:57:02.418] Verification request submitted           name=protocolVersionsImplAddress             address=0x658812BEb9bF6286D03fBF1B5B936e1af490b768  | 
 | 72 | +INFO [03-05|15:57:07.789] Verification complete                    name=protocolVersionsImplAddress             address=0x658812BEb9bF6286D03fBF1B5B936e1af490b768  | 
 | 73 | +INFO [03-05|15:57:07.971] Contract is already verified             name=protocolVersionsProxyAddress            address=0x17C64430Fa08475D41801Dfe36bAFeE9667c6fA7  | 
 | 74 | +INFO [03-05|15:57:07.971] --- COMPLETE ---  | 
 | 75 | +INFO [03-05|15:57:07.971] final results                            numVerified=4 numSkipped=1 numFailed=0  | 
 | 76 | +```  | 
 | 77 | + | 
 | 78 | +## Known Limitations  | 
 | 79 | + | 
 | 80 | +- Does not currently work for contracts in the `opchain` bundle (deployed via `op-deployer apply`) that have constructor args. Those constructors args cannot be extracted from the deployment `tx.Data()` since `OPContractsManager.deploy()` uses factory pattern with CREATE2 to deploy those contracts.  | 
 | 81 | + | 
 | 82 | +- Currently only supports etherscan block explorers. Blockscout support is planned but not yet implemented.  | 
0 commit comments