Verify(ソース検証)メモ

このメモは、Etherscan / Blockscout などで コントラクトのソース検証(Verify) を行うときの“つまずきポイント”をまとめる。

1. Verifyとは

  • エクスプローラ上で「ソースコード ⇔ デプロイ済みバイトコード」を対応付ける作業。
  • Verifyすると、UI上でABIが読みやすくなり、Read/Write(読み取り/書き込み)画面が使いやすくなる。

2. 最短成功ルート(Hardhat)

1) .env を用意する(例:cp .env.example .env)。
2) コンパイルする:npx hardhat compile
3) Verifyする:npx hardhat verify --network <network> <address> <constructor args...>

デプロイした直後は、エクスプローラ側の反映が遅れることがある(環境依存)。その場合は時間を置いて再実行する。

3. 失敗時の切り分けルート(最小)

Verifyが失敗したときは、まず「どこがズレているか」を上から潰す。

1) --network はデプロイ先と一致しているか
2) <address> はデプロイしたコントラクトのアドレスか
3) APIキーは .env に入っているか(空ではないか)
4) コンストラクタ引数は「順序・型・値」が一致しているか
5) コンパイラ設定(Solidity/optimizer/viaIR など)はデプロイ時と一致しているか
6) デプロイ直後で、エクスプローラの反映待ちになっていないか

このリポジトリでは、デプロイ時の引数や設定を docs/DEPLOYMENTS.md に残す運用を推奨する(Verifyで迷子になりにくい)。

4. このリポジトリの環境変数

  • RPC:
    • SEPOLIA_RPC_URL, MAINNET_RPC_URL, OPTIMISM_RPC_URL
  • APIキー:
    • Ethereum(mainnet / Sepolia):ETHERSCAN_API_KEY
    • Optimism:OPTIMISTIC_ETHERSCAN_API_KEY

5. よくあるエラー(症状→原因候補→確認→解決)

| 症状 | 原因候補 | 確認 | 解決 | |—|—|—|—| | --network を変えても通らない | ネットワーク不一致 | デプロイ先と --network が一致しているか | デプロイ先のネットワークに合わせて再実行 | | API key が必要と言われる / 失敗する | APIキー未設定 / 空 | .envETHERSCAN_API_KEY(または OPTIMISTIC_ETHERSCAN_API_KEY)が入っているか | .env にキーを入れて再実行(鍵はコミットしない) | | constructor arguments が原因っぽい | 引数の不一致 | デプロイ時の引数(順序/型/値)を確認 | デプロイ時と同じ引数で Verify(文字列はクォートが必要なことがある) | | 設定が合っているはずなのに通らない | コンパイラ設定の不一致 | hardhat.config.tssolidity / optimizer / viaIR を確認 | デプロイ時と同じ設定に揃えて再実行(デプロイ後に設定を変えた場合は要注意) | | デプロイ直後に通らない / エクスプローラで見つからない | 反映遅延(取り込み待ち) | エクスプローラ側でTxやアドレスが見えるか | 時間を置いて再実行(混雑やサービス状況に依存) | | すでにVerify済みと言われる | すでにVerify済み | エクスプローラでソース表示できるか | ソースが表示できるなら実害なし(必要なら別アドレスで検証) | | 1ファイルに複数コントラクトがあり失敗する | 対象コントラクトの指定が曖昧 | Verify対象のコントラクト名を確認 | --contract contracts/Path.sol:ContractName で fully qualified name を指定 |

6. 補足:L2 / Blockscout

  • L2はエクスプローラがEtherscan系とは限らない(Blockscout等)。
  • その場合、hardhat.config.tscustomChains 設定が必要になることがある。
  • 本リポジトリは Optimism を例として設定している。他チェーンは必要に応じて更新する。