Skip to main content
Работает на: публичных сетях (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.
Прокси-контракты нужно верифицировать вручную. В версиях плагина, на которые рассчитано это обходное решение (старше 2.4.0 в линейке Ethers 6 и 1.10.0 в линейке Ethers 5), отключите автоматическую верификацию в hardhat.config.ts:
hardhat.config.ts
Для получения адреса развёрнутой реализации используйте пакет @openzeppelin/upgrades-core и функцию getImplementationAddress. Верифицировать реализацию прокси обычно несложно; верифицируйте её так же, как любой другой контракт.
example.ts
Чтобы верифицировать экземпляр прокси, необходимо выполнить два предварительных шага:
  1. Загрузить точный смарт-контракт прокси в зависимости от типа используемого прокси, чтобы он был скомпилирован. Вам нужно будет импортировать прокси-контракты через компилятор, создав фиктивный .sol-файл.
  2. Изменить hardhat.config.ts, чтобы указать настройки, с которыми компилировались контракты OpenZepplin.
После выполнения этих шагов вы можете верифицировать прокси так же, как любой другой контракт.
example.ts

Верификация по типу прокси

Эти примеры кода показывают, как верифицировать реализацию и прокси для трёх паттернов прокси OpenZeppelin. Примеры используют проксированный контракт Vault, ссылающийся на ERC-20 токен (TToken).

UUPS-прокси

Чтобы верифицировать UUPS-прокси и связанную информацию, вызовите плагин hardhat-tenderly дважды:
  1. Для верификации реализации необходимо указать:
  • name вашего проксированного контракта (в нашем случае Vault)
  • Адрес, по которому был развёрнут контракт, полученный методом getImplementationAddress из @openzeppelin/upgrades-core.
  1. Для верификации прокси укажите:
  • 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
  1. Для верификации реализации укажите:
  • name вашего проксированного контракта (в нашем случае Vault)
  • Адрес, по которому был развёрнут контракт, полученный методом getImplementationAddress из @openzeppelin/upgrades-core.
  1. Для верификации прокси укажите:
  • TransparentUpgradeableProxy в качестве name прокси-контракта
  • Адрес прокси await proxy.getAddress()

Полный пример кода

example.ts

Beacon-прокси

Чтобы верифицировать Beacon-прокси и связанную информацию, необходимо верифицировать два контракта: Vault (реализация) и UpgradableBeacon от OpenZepplin:
example.ts

Полный пример кода

example.ts