Работает на: публичных сетях (mainnet и testnet). Для верификации прокси-контрактов в 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.
Обходное решение для более ранних версий
При использовании@tenderly/hardhat-tenderly версий < 1.10.0 и < 2.1.0 это обходное решение включает автоматическую верификацию.
Необходимо верифицировать следующее:
- Прокси-контракт (например, прокси от OpenZeppelin)
- Реализацию за прокси
- Любые зависимости реализации
- Новые экземпляры реализации, развёрнутые при апгрейдах
Обзор
В этом руководстве мы будем использовать пример Hardhat-проекта и плагин@tenderly/hardhat-tenderly для демонстрации верификации альтернатив OpenZeppelin: UUPSUpgradeable, TransparentUpgradeableProxy и BeaconProxy.
Для получения адреса развёрнутой реализации используйте пакет @openzeppelin/upgrades-core и функцию getImplementationAddress.
Верифицировать реализацию прокси обычно несложно; верифицируйте её так же, как любой другой контракт.
example.ts
- Загрузить точный смарт-контракт прокси в зависимости от типа используемого прокси, чтобы он был скомпилирован. Вам нужно будет импортировать прокси-контракты через компилятор, создав фиктивный .sol-файл.
- Изменить
hardhat.config.ts, чтобы указать настройки, с которыми компилировались контракты OpenZepplin.
example.ts
Верификация по типу прокси
Эти примеры кода показывают, как верифицировать реализацию и прокси для трёх паттернов прокси OpenZeppelin. Примеры используют проксированный контрактVault, ссылающийся на ERC-20 токен (TToken).
UUPS-прокси
Чтобы верифицировать UUPS-прокси и связанную информацию, вызовите плагинhardhat-tenderly дважды:
- Для верификации реализации необходимо указать:
nameвашего проксированного контракта (в нашем случаеVault)- Адрес, по которому был развёрнут контракт, полученный методом
getImplementationAddressиз@openzeppelin/upgrades-core.
- Для верификации прокси укажите:
ERC1967Proxyв качествеnameпрокси-контракта- Адрес прокси
proxy.address
example.ts
Полный пример кода
Ниже приведён полный тест Hardhat, который делает следующее:- Разворачивает
TToken(нужен для vault) - Разворачивает
Vaultкак прокси, инициализированный контрактомTToken - Верифицирует экземпляр прокси (
ERC1967Proxy), развёрнутый по адресуawait proxy.getAddress() - Верифицирует экземпляр реализации
Vault, развёрнутый по адресуgetImplementationAddress(ethers.provider, await proxy.getAddress()) - Апгрейдит прокси до
VaultV2
example.ts
Transparent-прокси
Чтобы верифицировать Transparent-прокси и связанную информацию, вызовитеhardhat-tenderly, передав два контракта: Vault для реализации и TransparentUpgradeableProxy для самого прокси.
example.ts
- Для верификации реализации укажите:
nameвашего проксированного контракта (в нашем случаеVault)- Адрес, по которому был развёрнут контракт, полученный методом
getImplementationAddressиз@openzeppelin/upgrades-core.
- Для верификации прокси укажите:
TransparentUpgradeableProxyв качествеnameпрокси-контракта- Адрес прокси
await proxy.getAddress()
Полный пример кода
example.ts
Beacon-прокси
Чтобы верифицировать Beacon-прокси и связанную информацию, необходимо верифицировать два контракта:Vault (реализация) и UpgradableBeacon от OpenZepplin:
example.ts
Полный пример кода
example.ts