Мониторинг TVL (Total Value Locked)
TVL — операционный показатель DeFi-протокола, не маркетинговый. Резкое падение на 30% за час — либо взлом, либо «rug» крупного LP. Рост на 500% за день без соответствующего увеличения транзакций — подозрительная накрутка для листинга на DeFiLlama. Оба случая требуют системы, которая видит изменения в реальном времени и умеет их интерпретировать.
Как правильно считать TVL
Проблема мультивалютного учёта
Наивный подход: суммировать balanceOf всех токенов в контрактах протокола в USD по текущим ценам. Работает, пока нет следующих сценариев:
- Протокол принимает LP-токены Uniswap V2 как collateral.
balanceOf(LP_token)— количество LP-токен, не USD. Нужно вычислить underlying assets черезgetReserves()пула. - Synthetic токены (sUSD, stETH): их цена ≠ цене базового актива при депеге. Нужен отдельный price feed, не всегда доступный.
- Concentrated liquidity позиции (Uniswap V3 NFT): стоимость зависит от текущей цены и диапазона позиции — нужна off-chain математика tick/sqrtPrice.
Правильная архитектура: каждый тип актива — отдельный адаптер с логикой resolveToUSD(address asset, uint256 amount) → uint256. Это паттерн, который использует DeFiLlama в своих adapters.
Chainlink vs AMM-цены
Chainlink Data Feeds — эталон для основных активов (ETH, BTC, USDC, основные ERC-20). Heartbeat 1 час для стейблкоинов, 1 час для крупных активов. Проблема: для long-tail токенов нет Chainlink feed.
Fallback: Uniswap V3 TWAP через IUniswapV3Pool.observe() с periodSecond = 1800 (30 минут). TWAP защищает от flash loan манипуляций, но при низкой ликвидности пула — неточен.
Важно: Chainlink feed может вернуть stale данные. Всегда проверять answeredInRound >= roundId и updatedAt > block.timestamp - staleness_threshold.
Архитектура системы мониторинга
On-chain vs off-chain расчёт
Считать TVL полностью on-chain через смарт-контракт getTVL() — привлекательно для прозрачности, но:
- Дорого в gas при сложных вычислениях
- Ограничено размером call stack
- LP-токены Uniswap требуют внешних calls, что увеличивает gas экспоненциально
Лучший подход: off-chain сервис с доступом к архивной ноде. Алгоритм:
- Получить балансы через
eth_callбатчами (Multicall3 для эффективности) - Запросить цены из Chainlink + DeFiLlama API + CoinGecko Pro
- Рассчитать TVL с нормализацией по decimals
- Записать снапшот в базу данных с блок-номером и timestamp
- Выдать в API и дашборд
Частота: каждый блок для критичных алертов (~12 сек на Ethereum), каждые 5 минут для исторических данных.
The Graph subgraph для TVL
The Graph позволяет подписаться на события смарт-контрактов и агрегировать данные в GraphQL. Для TVL мониторинга subgraph обрабатывает события:
-
Deposit(address user, address asset, uint256 amount)— увеличение TVL -
Withdraw(address user, address asset, uint256 amount)— уменьшение -
Liquidation(...)— изменение collateral
Проблема subgraph: цены не хранятся on-chain, нужен oracle интеграцией через @priceOracle handler. Это замедляет индексацию и добавляет зависимость.
Альтернатива для быстрого деплоя: Dune Analytics с SQL-запросами поверх indexed Ethereum данных. Работает без разработки, но latency выше (5-15 минут).
Алерты при резких изменениях
Паттерн обнаружения аномалий:
currentTVL < previousTVL * (1 - threshold) → CRITICAL alert
currentTVL > previousTVL * (1 + spike_threshold) → WARNING (possible manipulation)
Threshold для critical: 10% за один блок — явная аномалия. 30% за 5 минут — критический инцидент.
Каналы алертов: Telegram Bot API для оперативных оповещений, PagerDuty для on-call ротации, Slack webhooks для командных нотификаций. Для DeFi-протоколов с TVL > $1M — обязательно 24/7 мониторинг.
Интеграция с дашбордами
Grafana + InfluxDB — стандартный стек для временных рядов TVL. Метрики: tvl_total, tvl_by_asset, tvl_by_chain, tvl_change_1h, tvl_change_24h.
DeFiLlama adapter: если протокол хочет попасть на DeFiLlama — нужен PR с адаптером в их репозиторий. Адаптер — это JavaScript функция tvl(api), которая использует их api.add(token, balance) интерфейс. Мы пишем и поддерживаем эти адаптеры.
Custom дашборд: React + recharts или Dune Analytics embedded charts для public-facing страницы протокола. Данные через собственный API endpoint или прямо из subgraph через Apollo Client.
| Метод | Latency | Стоимость | Сложность |
|---|---|---|---|
| Собственный off-chain сервис | ~блок (12s) | Высокая (нода) | Высокая |
| The Graph subgraph | 1-5 мин | Средняя (хостинг) | Средняя |
| Dune Analytics | 5-15 мин | Низкая (SQL) | Низкая |
| DeFiLlama API | 5-15 мин | Нулевая | Низкая |
Процесс работы
Аналитика (1 день). Инвентаризация контрактов протокола, типы принимаемых активов, события для отслеживания, требования к latency алертов.
Разработка (1-3 дня). Выбор стека исходя из требований → имплементация → настройка алертов → деплой дашборда.
Поддержка. При добавлении новых пулов или активов — обновление адаптеров. При форке сети или миграции контрактов — обновление адресов.
Ориентиры по срокам
Базовый мониторинг через The Graph + Telegram алерты — 1-2 дня. Полноценная система с собственным сервисом, Grafana дашбордом и DeFiLlama интеграцией — 3-5 дней.
Стоимость зависит от количества контрактов, типов активов и требований к latency.







