SuperAPI AI 工具集

etherscan-verification

编程与开发

查看项目

更新于 10-16 04:27

技能介绍

用途

本技能用于在 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 部署的真实验证示例。