Прежде чем начать
- Virtual Environment. Скопируйте её RPC URL из панели.
- Пополненный адрес деплойера в этой Virtual Environment.
/verify.
Деплой и верификация
- Foundry
- Hardhat
Настройте foundry.toml
Верификатор Tenderly сопоставляет хеш метаданных, который компилятор Solidity добавляет к задеплоенному байткоду, с источником, который вы предоставляете. Сохраняйте метаданные в скомпилированном выводе, явно задавая cbor_metadata и bytecode_hash:foundry.toml
cbor_metadata = true и bytecode_hash = "ipfs" — значения Foundry по умолчанию, но некоторые шаблоны их убирают; bytecode_hash = "none" ломает верификацию. Зафиксируйте solc_version и настройки оптимизатора, чтобы повторная верификация компилировала тот же байткод.Если ваш проект использует библиотеки вроде OpenZeppelin, объявите remappings явно в remappings.txt:remappings.txt
Установите переменные окружения
showLineNumbers
cast chain-id должен вывести chain ID Virtual Environment, а баланс деплойера должен быть ненулевым:Деплой с forge create
Запустите forge create с флагами верификации. Аргументы конструктора передаются как сырые значения; Foundry сам ABI-кодирует их и отправляет закодированную форму верификатору:showLineNumbers
Деплой с помощью Foundry-скрипта
Используйтеforge script, чтобы задеплоить несколько контрактов за один запуск. Каждое new Foo(...) в скрипте автоматически отправляется на верификацию, с правильными аргументами конструктора, взятыми из broadcast log. Импорты обрабатываются прозрачно: верификатор получает standard-JSON payload со всеми исходными файлами, которых коснулся компилятор, так что локальные и библиотечные импорты (например, OpenZeppelin) верифицируются без дополнительных шагов.Используйте --slow, чтобы транзакции отправлялись по одной. Без этого пакетная отправка может отправить транзакцию до подтверждения предыдущей, что нестабильно с хостинговым RPC и может создавать гонку с шагом верификации.showLineNumbers
Верификация уже задеплоенного контракта
Уже развёрнутые контракты можно верифицировать черезforge verify-contract. В отличие от forge create, эта команда ожидает аргументы конструктора уже в ABI-кодированной форме; используйте cast abi-encode для их получения:showLineNumbers
--watch опрашивает верификатор, пока верификация не завершится, и печатает результат. Для развёртываний с несколькими контрактами запускайте forge verify-contract по одному разу на каждый задеплоенный адрес.Проверьте панель
В Tenderly Dashboard откройте Contracts и выберите вкладку Virtual Contracts. Ваши только что задеплоенные контракты появятся там, со статусом верификации по каждому контракту.Устранение неполадок
| Симптом | Вероятная причина | Решение |
|---|---|---|
Ответ верификатора unauthorized / -32004 | Неверный URL верификатора. Частая ошибка — добавление /verify/etherscan вместо /verify. | Убедитесь, что URL верификатора заканчивается ровно на /verify. |
Bytecode does not match deployed contract | Присланный исходный код скомпилировался иначе, чем то, что задеплоено: несовпадение optimizer_runs, другая solc_version или удалённый хеш метаданных. | Зафиксируйте solc_version, optimizer, optimizer_runs и bytecode_hash в foundry.toml. Выполните forge clean && forge build перед повторной верификацией. |
Failed to deserialize content | Верификатор вернул строку ошибки, которую Foundry не может распарсить — обычно оборачивает upstream-ошибку авторизации или пути. | Проверьте URL и повторите запуск с -vvvv, чтобы увидеть сырой ответ. |
Dry run enabled, not broadcasting transaction при forge create | Не передан --broadcast или его поглотил --constructor-args. | Переместите --constructor-args в конец, чтобы он был последним флагом. |
Только первый контракт верифицируется в forge script | Гонка RPC: вторая транзакция отправлена до получения чека первой. | Добавьте --slow. |
Верификатор сообщает OK, но обозреватель по-прежнему показывает контракт как неверифицированный | Кеширование UI. | Сделайте hard-refresh страницы обозревателя. Статус в ответе API является достоверным. |
Дальнейшие шаги
- Верификация прокси-контрактов с Foundry: верификация UUPS-имплементации и её ERC1967-прокси, включая апгрейды.
- Стейджинг контрактов: поделитесь RPC-ссылкой и адресами контрактов с командой.
- Стейджинг вашего dApp: направьте фронтенд на Virtual Environment.
- Форк Virtual Environment: ответвление от состояния Virtual Environment.