适用于: 公共网络(主网和测试网)。要在 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 目前不支持代理验证。
如果您使用的是较低版本的插件且无法升级,请使用下面的手动变通方法。
自动验证
该插件可验证三种代理模式:TransparentUpgradeableProxy、UUPSUpgradeableProxy 和 BeaconProxy。
较低版本的变通方法
在使用版本< 1.10.0 和 < 2.1.0 的 @tenderly/hardhat-tenderly 时,此变通方法将启用自动验证。
您需要验证以下内容:
- 代理合约(例如 OpenZeppelin 的代理)
- 代理背后的实现
- 实现的任何依赖项
- 通过升级部署的新实现实例
概述
在本指南中,我们将使用一个示例 Hardhat 项目和@tenderly/hardhat-tenderly 插件来演示 OpenZeppelin 的 UUPSUpgradeable、TransparentUpgradeableProxy 和 BeaconProxy 替代方案的验证。
要获取已部署实现的地址,请使用 @openzeppelin/upgrades-core 包和 getImplementationAddress 函数。
验证代理实现通常很简单;就像验证任何其他合约一样验证它。
example.ts
- 根据您使用的代理类型加载代理的确切智能合约,以便对其进行编译。您需要通过创建一个虚拟 .sol 文件将代理合约通过编译器导入。
- 修改
hardhat.config.ts以指定 OpenZepplin 合约编译时使用的设置。
example.ts
按代理类型验证
以下代码示例展示了如何验证 OpenZeppelin 三种代理模式的实现和代理。这些示例使用一个引用 ERC-20 代币(TToken)的代理化 Vault 合约。
UUPS 代理
要验证 UUPS 代理及其底层信息,请调用hardhat-tenderly 插件两次:
- 要验证实现,您需要提供以下内容:
- 代理化合约的
name(在我们的例子中是Vault) - 使用来自
@openzeppelin/upgrades-core的getImplementationAddress方法获取的合约部署地址。
- 要验证代理,请提供以下内容:
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
- 要验证实现,请提供以下内容:
- 代理化合约的
name(在我们的例子中是Vault) - 使用来自
@openzeppelin/upgrades-core的getImplementationAddress方法获取的合约部署地址。
- 要验证代理,请提供以下内容:
TransparentUpgradeableProxy作为代理合约的name- 代理地址
await proxy.getAddress()
完整代码示例
example.ts
Beacon 代理
要验证 Beacon 代理及其底层信息,您必须验证两个合约:Vault(实现)和 OpenZepplin 的 UpgradableBeacon:
example.ts
完整代码示例
example.ts