Транзакція впала з 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 для вашого проєкту, отримайте консультацію — зв'яжіться з нами. Замовте налаштування налагоджувача під ключ і отримайте повну прозорість транзакцій.







