用途
本技能用于在 Etherscan 兼容的区块浏览器上验证已部署的智能合约,基于 Foundry 的 forge verify-contract 命令。当用户要求“验证合约”“在 etherscan 上验证”等操作时使用。
主要能力
- 在 Etherscan 兼容浏览器上验证已部署的智能合约
- 验证代理合约(ERC1967、UUPS)
- 验证工厂创建的合约(CREATE2)
- 从部署数据中提取构造函数参数
前提条件
| 要求 | 获取方式 |
|---|---|
| Foundry ≥1.3.6 | 运行 forge -V 检查版本 |
| 合约地址 | 来自部署广播或用户提供 |
| 链 ID | 来自浏览器或网络配置 |
| 浏览器 API 密钥 | 来自 Etherscan 账户(适用于 V2 多链) |
| 源代码 | 必须与部署字节码完全匹配 |
版本检查
开始前,验证 Foundry 版本:
forge -V
如果版本低于 1.3.6,请停止操作。
验证方法
方法 1:标准(原生支持)
适用于 Foundry 原生支持的链:
FOUNDRY_PROFILE=optimized forge verify-contract \
<CONTRACT_ADDRESS> \
src/<Contract>.sol:<Contract> \
--rpc-url <chain_name> \
--verifier etherscan \
--etherscan-api-key $ETHERSCAN_API_KEY \
--watch
方法 2:Etherscan V2 API(Foundry 不支持的链)
当 Foundry 显示“No known Etherscan API URL for chain X”时:
FOUNDRY_PROFILE=optimized forge verify-contract \
<CONTRACT_ADDRESS> \
src/<Contract>.sol:<Contract> \
--verifier etherscan \
--verifier-url "https://api.etherscan.io/v2/api?chainid=<CHAIN_ID>" \
--etherscan-api-key $ETHERSCAN_API_KEY \
--watch
支持的链列表:https://docs.etherscan.io/supported-chains
方法 3:带构造函数参数
适用于有构造函数参数的合约:
FOUNDRY_PROFILE=optimized forge verify-contract \
<CONTRACT_ADDRESS> \
src/<Contract>.sol:<Contract> \
--verifier etherscan \
--verifier-url "https://api.etherscan.io/v2/api?chainid=<CHAIN_ID>" \
--etherscan-api-key $ETHERSCAN_API_KEY \
--constructor-args <ABI_ENCODED_ARGS> \
--watch
使用 cast abi-encode 生成构造函数参数:
cast abi-encode "constructor(address,uint256)" 0x123... 1000
特殊案例
参考:./references/special-cases.md
代理合约
分别验证实现合约和代理合约。ERC1967 模式请参阅参考文档。
工厂创建的合约
使用 scripts/extract_constructor_args.py 从广播 initCode 中提取构造函数参数。
库验证
对于库,使用完整路径:
src/libraries/<Library>.sol:<Library>
故障排查
参考:./references/troubleshooting.md
常见问题
| 错误 | 原因 | 解决方案 |
|---|---|---|
| "No known Etherscan API URL" | 链不在 Foundry 中 | 使用 --verifier-url 配合 V2 API |
| "Bytecode does not match" | 编译漂移 | 检出部署提交并重新安装依赖 |
| "Constructor args mismatch" | 参数错误或缺失 | 从广播中提取或手动编码 |
| "Already verified" | 之前已验证 | 无需操作 |
输出
验证成功后:
- 合约源码在浏览器上可见
- ABI 可用于交互
- 构造函数参数已解码
- 显示“Contract Source Code Verified”徽章
示例
参考:./references/examples.md 获取来自 Monad 部署的真实验证示例。