Skip to main content
适用于: 公共网络(主网和测试网)。要在 Virtual Environment 上验证代理合约,请参阅 Verify proxy contracts with Foundry
本指南将引导您使用 @tenderly/hardhat-tenderly 完成代理合约验证。

要求

自动代理验证在以下版本的 @tenderly/hardhat-tenderly 中开箱即用:
  • >= 1.10.0(Ethers 5 系列)
  • >= 2.1.0(Ethers 6 系列)
它仅在您使用 @openzeppelin/hardhat-upgrades 部署代理时有效。Hardhat Ignition 目前不支持代理验证。 如果您使用的是较低版本的插件且无法升级,请使用下面的手动变通方法

自动验证

该插件可验证三种代理模式:TransparentUpgradeableProxyUUPSUpgradeableProxyBeaconProxy

较低版本的变通方法

在使用版本 < 1.10.0< 2.1.0@tenderly/hardhat-tenderly 时,此变通方法将启用自动验证。 您需要验证以下内容:
  • 代理合约(例如 OpenZeppelin 的代理)
  • 代理背后的实现
  • 实现的任何依赖项
  • 通过升级部署的新实现实例
验证过程根据代理合约类型和实现而有所不同。

概述

在本指南中,我们将使用一个示例 Hardhat 项目@tenderly/hardhat-tenderly 插件来演示 OpenZeppelin 的 UUPSUpgradeableTransparentUpgradeableProxyBeaconProxy 替代方案的验证。
代理合约需要手动验证。在此变通方法所针对的插件版本上(Ethers 6 系列低于 2.4.0,Ethers 5 系列低于 1.10.0),请在 hardhat.config.ts 中关闭自动验证:
hardhat.config.ts
要获取已部署实现的地址,请使用 @openzeppelin/upgrades-core 包和 getImplementationAddress 函数。 验证代理实现通常很简单;就像验证任何其他合约一样验证它。
example.ts
要验证代理实例,您需要完成以下两个准备步骤:
  1. 根据您使用的代理类型加载代理的确切智能合约,以便对其进行编译。您需要通过创建一个虚拟 .sol 文件将代理合约通过编译器导入。
  2. 修改 hardhat.config.ts 以指定 OpenZepplin 合约编译时使用的设置。
完成这些步骤后,您可以像验证任何其他合约一样继续验证代理。
example.ts

按代理类型验证

以下代码示例展示了如何验证 OpenZeppelin 三种代理模式的实现和代理。这些示例使用一个引用 ERC-20 代币(TToken)的代理化 Vault 合约。

UUPS 代理

要验证 UUPS 代理及其底层信息,请调用 hardhat-tenderly 插件两次:
  1. 要验证实现,您需要提供以下内容:
  • 代理化合约的 name(在我们的例子中是 Vault
  • 使用来自 @openzeppelin/upgrades-coregetImplementationAddress 方法获取的合约部署地址。
  1. 要验证代理,请提供以下内容:
  • ERC1967Proxy 作为代理合约的 name
  • 代理地址 proxy.address
example.ts

完整代码示例

以下是一个完整的 Hardhat 测试,执行以下操作:
  • 部署 TToken(Vault 所需)
  • 部署 Vault 作为代理,使用 TToken 合约初始化
  • 验证部署在 await proxy.getAddress() 的代理(ERC1967Proxy)实例
  • 验证部署在 getImplementationAddress(ethers.provider, await proxy.getAddress()) 的实现实例 Vault
  • 将代理升级到 VaultV2
example.ts

Transparent 代理

要验证 Transparent 代理及其底层信息,请调用 hardhat-tenderly 并传递两个合约:Vault 用于实现,TransparentUpgradeableProxy 用于代理本身。
example.ts
  1. 要验证实现,请提供以下内容:
  • 代理化合约的 name(在我们的例子中是 Vault
  • 使用来自 @openzeppelin/upgrades-coregetImplementationAddress 方法获取的合约部署地址。
  1. 要验证代理,请提供以下内容:
  • TransparentUpgradeableProxy 作为代理合约的 name
  • 代理地址 await proxy.getAddress()

完整代码示例

example.ts

Beacon 代理

要验证 Beacon 代理及其底层信息,您必须验证两个合约:Vault(实现)和 OpenZepplin 的 UpgradableBeacon
example.ts

完整代码示例

example.ts