Разработка системы мониторинга DeFi-позиций
Health factor 1.05 в Aave — это 5% до ликвидации. При высокой волатильности рынка от 1.05 до ликвидации может пройти несколько минут. Пользователь без системы мониторинга узнаёт о проблеме после: позиция ликвидирована, liquidation bonus (8-15%) ушёл ликвидатору. На крупных позициях это тысячи долларов, которые можно было сохранить, добавив collateral вовремя.
Что и как мониторить: технические детали
Health factor: формула и пороги для алертов
В Aave v3 health factor рассчитывается как:
HF = (sum(collateral_i * liquidationThreshold_i * price_i)) / (sum(debt_j * price_j))
Через смарт-контракт: IPool.getUserAccountData(address) возвращает healthFactor в формате 1e18 = 1.0. Значение ниже 1e18 — позиция ликвидируема.
Пороги для алертов:
- HF < 1.5 — предупреждение: добавьте collateral
- HF < 1.2 — критично: немедленное действие
- HF < 1.05 — экстренно: ликвидация неминуема
Polling через multicall (MakeDao Multicall3 на 0xcA11bde05977b3631167028862bE2a173976CA11) — за один RPC вызов запрашиваем HF для всех отслеживаемых адресов. Для 100 адресов — один eth_call вместо 100. Интервал polling: каждые 30 секунд в нормальном режиме, каждые 5 секунд при HF < 1.3.
Compound v3 и Euler: отличия механики
В Compound v3 нет единого health factor — есть isLiquidatable(address) bool метод и отдельно borrowBalanceOf + collateralBalanceOf. Для понимания proximity to liquidation: borrowBalance / (collateralBalance * collateralFactor * price).
Euler (до паузы в 2023 году) имел subaccount систему — один адрес = 256 независимых субсчётов. Система мониторинга должна перебирать субсчёты через eulerAccount = address(uint160(mainAddress) ^ subAccountId). Это неочевидно и многие системы мониторинга Euler игнорировали субсчёты.
LP-позиции Uniswap v3: fee накопление и out-of-range
Для LP-мониторинга нужны три метрики: текущая USD стоимость позиции, накопленные fees, статус in/out-of-range.
Текущая стоимость через NonfungiblePositionManager.positions(tokenId) + расчёт amount0/amount1 по текущему tick пула. Это можно делать через статик-колл к view функции или через The Graph subgraph (запрос каждые 5 минут).
Fees — периодически через NonfungiblePositionManager.collect с amount0Max = type(uint128).max в режиме симуляции (eth_call, не транзакция). Либо через расчёт feeGrowthInside как описано в Uniswap v3 whitepaper.
Out-of-range: подписка на Swap события пула, сравнение currentTick с tickLower/tickUpper позиции.
Архитектура системы
Компоненты
Indexer — сервис, который читает on-chain данные и сохраняет в базу данных. Два режима: polling (каждые N секунд через multicall) и event-driven (WebSocket subscriptions). Для мониторинга HF — polling. Для LP out-of-range events — event-driven.
Alert engine — применяет правила к текущим данным. Поддерживает пользовательские пороги: каждый пользователь настраивает свои HF thresholds, минимальные fees для уведомления о сборе, preferred notification channels.
Notification dispatcher — отправляет уведомления. Каналы: Telegram Bot (наиболее популярный в DeFi), Email через SendGrid/Resend, Webhook для кастомных интеграций, Push notifications через Web Push API.
API/Frontend — dashboard для пользователей: текущие позиции, история изменений HF, история ликвидаций, APY за период.
Хранение данных
PostgreSQL для time-series данных о позициях. Схема:
CREATE TABLE position_snapshots (
id BIGSERIAL PRIMARY KEY,
address VARCHAR(42) NOT NULL,
protocol VARCHAR(20) NOT NULL, -- 'aave_v3', 'compound_v3', 'uniswap_v3'
chain_id INTEGER NOT NULL,
health_factor NUMERIC,
collateral_usd NUMERIC,
debt_usd NUMERIC,
snapshot_at TIMESTAMPTZ NOT NULL
);
CREATE INDEX ON position_snapshots (address, protocol, snapshot_at DESC);
Для временных рядов с высокой частотой записи — TimescaleDB extension для PostgreSQL с automatic partitioning по времени.
The Graph subgraph для Uniswap v3 позиций снижает нагрузку на RPC: вместо вызова positions() для каждого tokenId — один GraphQL запрос по owner address. Но The Graph имеет задержку ~1-5 минут, поэтому для real-time мониторинга out-of-range — WebSocket subscriptions.
Мультичейн и газ-алерты
Современные пользователи DeFi работают на Ethereum, Arbitrum, Optimism, Polygon одновременно. Система должна агрегировать позиции со всех чейнов в едином dashboard. Для каждого чейна — отдельное WebSocket подключение к ноде.
Дополнительно полезно: мониторинг gas price (Ethereum base fee через eth_gasPrice) + уведомление «сейчас дёшево, хорошее время для rebalancing». Ethereum base fee ниже 10 gwei в нерабочее время — rare event, но пользователи ценят такие уведомления.
Стек разработки
Backend: Node.js (TypeScript) + viem для on-chain взаимодействий. Redis для очереди алертов и дедупликации. PostgreSQL + TimescaleDB для хранения. Bull.js для job scheduling (polling jobs).
Frontend: React + wagmi для wallet connection (пользователь логинится через кошелёк, не email/password). TanStack Query для data fetching. Recharts или TradingView Lightweight Charts для HF timeline.
Процесс работы
Проектирование (2-3 дня). Список протоколов, чейнов, метрик. Схема базы данных.
Разработка indexer + alert engine (1 неделя). Multicall polling, WebSocket subscriptions, alert rules.
Notification dispatcher (2-3 дня). Telegram bot, email, webhook.
Frontend dashboard (3-5 дней). Positions overview, HF timeline, alert configuration.
Деплой. VPS + managed PostgreSQL. Мониторинг самого сервиса через Uptime Robot.
Ориентиры по срокам
Базовая система (Aave + Compound, Telegram alerts): 1 неделя. Мультичейн система с LP мониторингом, dashboard и кастомными правилами: 2-3 недели.







