Работает на: Virtual Environments и публичных сетях (mainnet и testnet). Один и тот же плагин работает и там, и там; укажите нужную сеть в
hardhat.config.ts.tenderly.verify() явно из ваших скриптов.
В публичных сетях плагин по умолчанию верифицирует публично. Чтобы верифицировать приватно (видимо только внутри вашего проекта/организации), установите
privateVerification: true в hardhat.config.ts. См. Настройка аутентификации и видимости верификации.Версии и совместимость
В зависимости от версии Ethers, которую вы используете с Hardhat, вам нужно установить соответствующую версию плагина Tenderly-Hardhat.| Ваш стек | Версия Hardhat | Версия плагина Tenderly-Hardhat |
|---|---|---|
| Ethers 6+ с Hardhat Ignition | >=2.19.0 <=2.22.0 | @tenderly/hardhat-tenderly@^2.3.0 |
| Ethers 6+ с hardhat-verify | >=2.19.0 <=2.22.0 | @tenderly/hardhat-tenderly@^2.2.1 |
| Ethers 5+ с hardhat-verify | < 2.19.0 | @tenderly/hardhat-tenderly@1.8.0 |
Методы верификации
Плагин Tenderly-Hardhat поддерживает три метода верификации контрактов.-
Автоматическая верификация (рекомендуется): просто импортируйте и настройте плагин. Этот метод идеален для верификации во время деплоя, поскольку процесс полностью автоматизирован. Автоматическая верификация работает как с обычной настройкой деплоя Hardhat, так и при использовании hardhat-ignition. Управляйте автоматической верификацией через переменную окружения
TENDERLY_AUTOMATIC_VERIFICATION. - Ручная верификация (low-code): предоставляет явный шаг верификации внутри вашего кода, что полезно в сценариях типа пост-деплойной верификации, условной верификации (например, только после падения теста) или верификации экземпляров, созданных фабричными контрактами.
- Подробная ручная верификация (high-code): даёт детальный контроль над процессом верификации, позволяя задать адреса библиотек, исходный код и конфигурации компилятора. Необходима для верификации нескольких контрактов с разными версиями или настройками компилятора.
Примеры
Лучший способ изучить процесс автоматической верификации — пройти пример, который есть в нашем GitHub-репозитории. Все примеры используют образцовый контрактGreeter. Просмотрите примеры проектов напрямую:
Настройка плагина Tenderly-Hardhat
Выполните шаги ниже, чтобы установить и инициализировать плагин Tenderly-Hardhat.Плагин требует, чтобы вы были залогинены в Tenderly CLI.
Включите пакет Tenderly-Hardhat в файл
hardhat.config.ts или hardhat.config.js простым импортом и вызовом метода setup.Импортируйте
@tenderly/hardhat-tenderly после других пакетов, таких как @nomicfoundation/hardhat-toolbox, @nomiclabs/hardhat-ethers, @openzeppelin/hardhat-upgrades и подобных.privateVerification гарантирует, что исходный код виден только соавторам вашего проекта или организации.TENDERLY_PUBLIC_VERIFICATION.
const config: HardhatUserConfig = {
solidity: "0.8.19",
tenderly: {
username: "Your account slug" ?? "error",
project: "Your project slug",
// Contract visible only in Tenderly.
// Omitting or setting to `false` makes it visible to the whole world.
// Alternatively, configure verification visibility using
// an environment variable `TENDERLY_PUBLIC_VERIFICATION`.
privateVerification: process.env.TENDERLY_PUBLIC_VERIFICATION !== 'true',
},
};
export default config;
Настроив плагин Tenderly-Hardhat в проекте Hardhat, вы можете верифицировать контракты, развёрнутые в различных сетях для разработки и продакшена:
Чтобы включить верификацию при работе с hardhat-ignition, задайте конфигурацию
etherscan. В качестве apiUrl используйте URL верификации: $TENDERLY_VIRTUAL_TESTNET_RPC/verify/etherscan.Автоматическая верификация
Автоматическая верификация происходит бесшовно, когда вы разворачиваете контракт через Ethers.js. Подход с автоматической верификацией выполняет верификацию автоматически, собирая настройки компилятора, адрес развёрнутого контракта и исходный код. Чтобы включить или отключить автоматическую верификацию, используйте переменную окруженияTENDERLY_AUTOMATIC_VERIFICATION, которую распознаёт плагин.
Плагин Tenderly-Hardhat верифицирует контракты, когда обнаруживает, что контракт развёрнут и Ethers получил квитанцию о транзакции деплоя.
Чтобы это работало, нужно await-ать деплой при развёртывании через вспомогательные методы Ethers ethers.deployContract() и ethers.getContractFactory(), вызывая waitForDeployment() или deployed() на экземпляре контракта соответственно.
Ethers 6
Измените скрипт Hardhat так, чтобы захватить значение, возвращённое из В более компактной форме:
waitForDeployment().deploy.ts
Ethers 5
Лучший способ изучить, как работает процесс автоматической верификации, — пройти пример в нашем GitHub-репозитории.Этот пример использует наш образцовый контракт В более компактной форме:
Greeter.Измените скрипт Hardhat так, чтобы захватить значение, возвращённое из deployed().deploy.ts
При запуске скриптов Hardhat вы можете установить переменную окружения
TENDERLY_AUTOMATIC_VERIFICATION в true, чтобы включить автоматическую верификацию для конкретного запуска. Hardhat Ignition (Virtual Environment)
При запуске команды обязательно добавляйте
--deployment-id с конкретным значением. Hardhat (Virtual Environment)
Публичная сеть
При деплое в публичный mainnet или testnet укажите, нужна ли публичная или приватная верификация. Убедитесь, что в разделе
tenderly вашего hardhat.config.ts эта переменная окружения считывается.Верификация прокси-контрактов
Автоматическая верификация прокси-контрактов, развёрнутых и обновляемых черезhardhat-upgrades, возможна в следующих версиях пакета @tenderly/hardhat-tenderly:
- >= 1.10.0
- >= 2.1.0
1.x.x < 1.10.0 и 2.x.x < 2.1.0 следуйте руководству по верификации прокси.
Ручная верификация
Low-code верификация черезtenderly.verify() позволяет явно указать точку верификации внутри скрипта деплоя или теста Hardhat.
Этот метод особенно полезен для:
- Верификации ранее развёрнутых контрактов через кастомные скрипты.
- Верификации экземпляров, созданных фабричными контрактами.
- Улучшения тестовых прогонов за счёт выборочной верификации контрактов в конце падающего набора (
after), что ускоряет выполнение.
TENDERLY_AUTOMATIC_VERIFICATION на false при запуске скриптов.
Функция verify
Функция verify() принимает объект, в котором необходимо указать:
nameконтрактаaddress, по которому развёрнут контрактlibraries(необязательно), используемые контрактом
Необходимо вызывать
verify() после того, как контракт развёрнут.Если вы выполняете верификацию параллельно с деплоем, необходимо await-ать waitForDeployment() в случае Ethers 6 и deployed() в случае Ethers 5.
- tdly.setup();
+ tdly.setup({automaticVerifications: false});
const config: HardhatUserConfig = {
Здесь используются те же примеры, что и при автоматической верификации, но на этот раз для верификации контракта применяется метод
tenderly.verify().При запуске скриптов Hardhat вы можете установить переменную окружения
TENDERLY_AUTOMATIC_VERIFICATION в false, чтобы отключить автоматическую верификацию.Подробная ручная верификация
МетодverifyMultiCompilerAPI() даёт вам полный контроль над процессом верификации, позволяя указать каждую деталь процесса.
Это редко рекомендуется, но может быть полезно, если вы верифицируете контракты, скомпилированные разными версиями или конфигурациями компилятора.
Полностью управляемый метод верификации позволяет явно:
- Указать исходный код контрактов (
sources) - Задать аргументы компиляции (
compiler) - Задать связанные библиотеки (
libraries)
Аргументы верификации
МетодverifyMultiCompilerAPI() принимает один аргумент — массив объектов-контрактов. Каждый объект-контракт состоит из следующих полей:
contractToVerify | string | Имя контракта, который нужно верифицировать. Это может быть короткое имя вроде Greeter или полностью квалифицированное имя контракта вроде contracts/A/Greeter.sol:Greeter. |
sources | map | Карта всех источников, необходимых для компиляции контракта. Ключ карты — путь к исходному коду контракта, а значение — объект с именем и UTF-8-кодированным исходником. js sources: { 'contracts/Greeter.sol': { name: 'Greeter', code: readFileSync('contracts/Greeter.sol', 'utf-8').toString(), }, 'hardhat/console.sol': { name: 'console', code: readFileSync('node_modules/hardhat/console.sol', 'utf-8').toString(), }, }, |
networks | map | Карта, содержащая все адреса деплоев в разных сетях. js { networks: { [NETWORK_ID]: { address: greeterAddress, }, }, } |
libraries | map | Карта, содержащая информацию о деплоях библиотек. Ключ — относительный путь к исходнику библиотеки, относительно папки contracts. js compiler.settings.libraries = { "path/to/lib.sol": { addresses: { "LibName1": "0x...", "LibName2": "0x..." } } } |