跳转到主要内容
适用于: Virtual Environments 和公共网络(主网和测试网)。同一插件同时处理两者;请在 hardhat.config.ts 中将其指向正确的网络。
Tenderly-Hardhat 插件在 Virtual Environments公共网络上验证从 Hardhat 部署的合约。使用自动验证在每次部署时进行验证,或使用手动验证从您的脚本中显式调用 tenderly.verify()
在公共网络上,插件默认公开验证。要私密验证(仅在您的项目/组织内可见),请在 hardhat.config.ts 中设置 privateVerification: true。请参阅配置认证和验证可见性

版本和兼容性

根据您与 Hardhat 一起使用的 Ethers 版本,您需要下载相应版本的 Tenderly-Hardhat 插件。
出于安全性和性能考虑,以及为了获得附加功能,强烈建议切换到 Ethers 6 并使用最新版本的 Tenderly-Hardhat 插件。

验证方法

Tenderly-Hardhat 插件支持三种合约验证方法。
  • 自动验证推荐):只需导入并设置插件。这种方式非常适合部署期间的验证,因为过程是完全自动化的。自动验证适用于普通的 Hardhat 部署设置,以及使用 hardhat-ignition。通过使用 TENDERLY_AUTOMATIC_VERIFICATION 环境变量来控制自动验证。
  • 手动验证(低代码):在您的代码中提供显式验证步骤,适用于部署后验证条件验证(例如仅在测试失败后)或验证工厂合约实例等场景。
  • 详尽手动验证(高代码):提供对验证过程的详细控制,指定库地址、源代码和编译器配置。这对于使用不同编译器版本或设置来验证多个合约是必要的。

示例

探索自动验证过程最好的方法是参考我们 GitHub 仓库中的示例。 所有示例都使用示例 Greeter 合约。直接浏览示例项目:

Tenderly-Hardhat 插件设置

按照下面的步骤安装并初始化 Tenderly-Hardhat 插件。
在以下部分中,您将了解如何使用不同的验证方法验证合约。

自动验证

在使用 Ethers.js 部署合约时会无缝进行自动验证。自动验证方法将在收集编译器设置、已部署合约的地址和源代码后自动执行验证。 要启用或禁用自动验证,请使用插件识别的 TENDERLY_AUTOMATIC_VERIFICATION 环境变量。 当 Tenderly-Hardhat 插件检测到合约已部署,且 Ethers 已收到部署交易的收据时,将验证合约。 要启用此功能,您需要在使用 Ethers 的辅助方法 ethers.deployContract()ethers.getContractFactory() 部署合约时 await 部署,方法是分别在合约实例上调用 waitForDeployment()deployed()
如果您打算与该合约交互,需要捕获 waitForDeployment()(Ethers 6)和 deployed()(Ethers 5)返回的合约对象的引用。

验证代理合约

使用 hardhat-upgrades 部署和升级的代理合约的自动验证在以下版本的 @tenderly/hardhat-tenderly 包中可用:
  • >= 1.10.0
  • >= 2.1.0
对于版本 1.x.x < 1.10.02.x.x < 2.1.0,请按照代理验证指南进行操作。

手动验证

通过 tenderly.verify() 进行的低代码验证使您能够在部署脚本或 Hardhat 测试中显式指定验证的确切时点。 此方法特别适合:
  • 通过自定义脚本验证之前部署的合约。
  • 验证工厂合约创建的实例。
  • 通过在失败测试套件末尾(after)选择性地验证合约来增强测试运行,从而加快执行速度。
要手动控制验证,请在运行脚本时将 TENDERLY_AUTOMATIC_VERIFICATION 更改为 false 以禁用自动验证。

verify 函数

verify() 函数接受一个对象,您必须在其中提供:
  • 合约的 name
  • 合约部署的 address
  • 合约使用的 libraries(可选)
Tenderly-Hardhat 插件将获取现有的编译器配置和合约源代码,以验证您指定的合约。
必须在合约部署之后调用 verify()如果您在部署时执行验证,需要在 Ethers 6 中 await waitForDeployment(),在 Ethers 5 中 await deployed()
如果您要验证多个合约,该函数具有可变参数:

详尽手动验证

方法 verifyMultiCompilerAPI() 让您完全控制验证过程,允许您指定验证过程的每一个细节。 通常不推荐这样做,但如果您正在验证使用不同编译器版本或配置编译的合约,它会很有用。 完全受控的验证方法允许您显式:
  • 指定合约的源代码(sources
  • 设置编译参数(compiler
  • 设置链接的库(libraries
以下示例演示了如何执行完全受控的验证。

验证参数

verifyMultiCompilerAPI() 方法接受一个参数——一个合约对象数组。每个合约对象由以下部分组成: