Skip to main content
Разверните Solidity-контракты в Virtual Environment с помощью Foundry или Hardhat. Контракты, задеплоенные в Virtual Environment, называются virtual contracts и появляются в разделе Contracts на вкладке Virtual Contracts. Верифицируйте контракты по мере деплоя. Верифицированные контракты открывают доступ к Debugger, Gas Profiler, Simulator и более информативным представлениям транзакций в обозревателе.

Прежде чем начать

Для верификации в Virtual Environment не нужен отдельный access key: сам RPC URL является аутентификацией, а эндпоинт верификатора — это тот же URL с добавленным /verify.
По умолчанию контракты, верифицированные в Virtual Environment, приватны. В зависимости от настроек видимости публичного обозревателя, код может быть виден снаружи. Проверьте переключатель публичного обозревателя и видимость верификации перед верификацией того, что вы хотите оставить приватным.

Деплой и верификация

Настройте 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
При автообнаружении remappings payload верификации может содержать иные строки remapping, чем использовала сборка, что приводит к ошибкам несоответствия байткода.

Установите переменные окружения

showLineNumbers
Проверьте соединение перед деплоем. cast chain-id должен вывести chain ID Virtual Environment, а баланс деплойера должен быть ненулевым:

Деплой с forge create

Запустите forge create с флагами верификации. Аргументы конструктора передаются как сырые значения; Foundry сам ABI-кодирует их и отправляет закодированную форму верификатору:
showLineNumbers
Ставьте --constructor-args в конец. Он жадно поглощает остаток командной строки, поэтому любой флаг после него будет воспринят как ещё один аргумент конструктора.

Деплой с помощью 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. Ваши только что задеплоенные контракты появятся там, со статусом верификации по каждому контракту.

Устранение неполадок

Дальнейшие шаги