Транзакция упала с execution reverted — ни reason string, ни вменяемого лога. Или списала газа в 3 раза больше, чем ожидалось, и непонятно, почему. Или мультисиг отработал не так, но на каком именно вызове — загадка. console.log в Solidity не работает в mainnet, а смотреть raw opcodes в Etherscan — мучение. Такая ситуация — ежедневный хлеб разработчиков смарт-контрактов. В нашей практике около 40% обращений в поддержку связаны с непонятными revert'ами. Анализ трассировки вручную занимает от часа до полдня. Tenderly Debugger сокращает это до 2-3 минут. По данным Tenderly, команды экономят до 90% времени на поиске ошибок. В одном кейсе мы снизили расход газа на 25% после оптимизации, найденной через трассировку.
Как Tenderly Debugger помогает найти причину ошибки?
На каждую транзакцию Tenderly строит:
- Execution trace — пошаговое выполнение opcodes с состоянием стека и памяти
- Call tree — дерево вложенных вызовов (internal calls, delegatecall, staticcall)
- State changes — какие storage слоты изменились и с какого значения на какое
- Event logs — все эмитированные события, включая из вложенных вызовов
- Gas breakdown — сколько газа потребил каждый вызов в дереве
Для контрактов с верифицированным исходным кодом дебаггер показывает Solidity строки, а не opcodes. Это в десятки раз быстрее, чем искать ошибку вручную. Например, при отладке reentrancy-атаки Tenderly показывает точное количество рекурсивных вызовов withdraw() и сумму утекших ETH на каждой итерации.
Пример: отладка reverted транзакции
Частый сценарий: пользователь сообщает о failed транзакции, hash есть, а reason — пусто (контракт старый, require без сообщения). Вставляем hash в Tenderly — сразу видим строку в исходнике, где произошёл revert, и актуальные значения переменных. В одном из проектов мы так за 2 минуты нашли ошибку в расчёте slippage, которая приводила к потерям 0.5% ликвидности на каждой свопе.
Настройка проекта в Tenderly
Добавление контракта
npm install -g @tenderly/cli tenderly login tenderly init # создаёт tenderly.yaml в проекте Для Hardhat-проектов подключается плагин, который автоматически пушит артефакты:
// hardhat.config.js require("@tenderly/hardhat-tenderly"); module.exports = { tenderly: { username: "your-username", project: "your-project", privateVerification: false } }; После этого npx hardhat run scripts/deploy.js --network mainnet автоматически верифицирует контракты в Tenderly.
Fork для отладки
Tenderly Fork — снапшот состояния сети на конкретном блоке. Можно отправлять транзакции без риска потерять средства и видеть полную трассировку:
const axios = require('axios'); const response = await axios.post( `https://api.tenderly.co/api/v1/account/${username}/project/${project}/fork`, { network_id: "1", block_number: 19500000 }, { headers: { 'X-Access-Key': process.env.TENDERLY_ACCESS_KEY } } ); const forkId = response.data.simulation_fork.id; const forkRpc = `https://rpc.tenderly.co/fork/${forkId}`; Подключайтесь к forkRpc как к обычному JSON-RPC — все транзакции записываются и доступны для анализа.
Почему Tenderly Debugger лучше, чем локальная отладка?
| Параметр | Tenderly Debugger | Локальный debugger (Hardhat/Foundry) |
|---|---|---|
| Состояние сети | Реальное mainnet-состояние | Изолированное, локальное |
| Поддержка форков | Да, любой блок | Требуется импорт состояния |
| Визуализация call tree | Графическое дерево | Только текстовый лог |
| Интеграция с CI | Simulation API | Запуск скриптов |
| Доступность | SaaS, веб-интерфейс | Только локально |
Дополнительно: Tenderly позволяет сравнивать газовые затраты разных подходов. Например, типичный transfer тратит ~21000 gas, а swap через Uniswap V3 — от 80000 до 150000 gas в зависимости от проскальзывания.
| Операция | Расход газа (Ethereum mainnet) |
|---|---|
| Простой перевод ETH | 21000 gas |
Вызов approve() ERC-20 |
~45000 gas |
transferFrom() ERC-20 |
~35000 gas |
| Swap через Uniswap V3 | ~100000 gas |
| Деплой простого контракта | ~200000 gas |
Эти цифры помогают оценить, где скрываются неоптимальные вызовы.
Simulation API для тестирования
Simulation API позволяет симулировать транзакции перед отправкой в сеть. Используем в CI для автоматической регрессии:
const simulation = await axios.post( `https://api.tenderly.co/api/v1/account/${username}/project/${project}/simulate`, { network_id: "1", from: "0xSenderAddress", to: "0xContractAddress", input: contractInterface.encodeFunctionData("transfer", [recipient, amount]), gas: 200000, gas_price: "20000000000", value: "0", save: true }, { headers: { 'X-Access-Key': process.env.TENDERLY_ACCESS_KEY } } ); console.log(simulation.data.transaction.status); console.log(simulation.data.transaction.gas_used); Интеграция Simulation API в CI-пайплайн: получение API-ключа, создание эндпоинта, добавление шага в GitHub Actions или GitLab CI, проверка статуса и газа. Если параметры выходят за рамки, пайплайн падает.
Что входит в настройку Tenderly под ключ?
- Полная верификация всех контрактов проекта в Tenderly
- Настройка fork-окружения для отладки и тестирования
- Интеграция Simulation API в CI/CD
- Документация по использованию и конфигурации
- Обучение команды (1-2 сессии)
- Поддержка в течение месяца после внедрения
Мы — команда с 5-летним опытом в блокчейн-разработке, выполнили более 20 проектов смарт-контрактов и DApps. Наша экспертиза гарантирует быструю и качественную настройку.
Ориентиры по срокам
Базовая настройка с верификацией и подключением Hardhat плагина: 1-2 дня. Расширенная конфигурация с fork, Simulation API и мониторингом: до 5 дней.
Чтобы оценить возможности Tenderly для вашего проекта получите консультацию — свяжитесь с нами. Закажите настройку отладчика под ключ и получите полную прозрачность транзакций.







