Разработка Telegram-бота для мониторинга DeFi-позиций
Позиция в Aave: $80k USDC залог, $50k USDT долг. Health factor 1.21. Рынок падает ночью — через три часа health factor пересекает 1.0, позиция ликвидирована, штраф 10%. Пользователь просыпается, смотрит в кошелёк. Стандартный сценарий, который бот с правильно настроенными алертами предотвращает за 15 минут до ликвидации.
Технические сложности, которые закапываются в продакшне
Polling vs WebSocket: задержка имеет значение
Наивная реализация — cron каждую минуту опрашивает RPC. Для health factor это работает, но при волатильности блоки на Ethereum выходят каждые 12 секунд, а цена оракула Chainlink обновляется per heartbeat (1 час) или при отклонении >0.5%. Минутный polling пропускает резкие движения.
Правильный подход: подписка на события через eth_subscribe("logs") по WebSocket. Aave v3 эмитит LiquidationCall(address collateralAsset, address debtAsset, address user, ...). Ловим это событие — и немедленно уведомляем. Для мониторинга health factor слушаем ReserveDataUpdated и пересчитываем позицию локально, не дожидаясь следующего eth_call.
Проблема с WebSocket: соединение рвётся. В продакшне нужен reconnect с exponential backoff, persistent subscription ID и replay пропущенных блоков при восстановлении через eth_getLogs с fromBlock: lastProcessedBlock.
Мультичейн: разные адреса, разные ABI
Пользователь держит позиции в Aave v3 на Ethereum, Optimism и Polygon одновременно. Три инстанса с разными PoolAddressesProvider. APY на Polygon может отличаться от Ethereum вдвое — это информация, которую пользователь хочет видеть в одном месте.
Архитектура: отдельный воркер на каждый чейн, общая PostgreSQL с таблицей positions(user_address, chain_id, protocol, collateral, debt, health_factor, updated_at). Telegram-бот читает из базы, а не из чейна — это даёт быстрый ответ на команды и снижает нагрузку на RPC.
Расчёт APY: пул не стоит на месте
Compound APY в Aave = (1 + APR/secondsPerYear)^secondsPerYear - 1. APR берётся из getReserveData().currentLiquidityRate (для депозитов) или currentVariableBorrowRate (для долга) — оба в ray (1e27). Ошибка на каждом втором проекте: делить на 1e18 вместо 1e27. Получают APY в тысячи процентов, пользователи радуются, пока не видят реальные цифры.
Что строим
Стек
| Слой | Технология |
|---|---|
| Чейн-мониторинг | viem (WebSocket transport), ethers.js fallback |
| Протоколы | Aave v3 Pool ABI, Compound v3 Comet ABI |
| Оракулы | Chainlink Price Feed (прямые вызовы + The Graph) |
| База данных | PostgreSQL — позиции, алерты, история |
| Очередь | BullMQ (Redis) — обработка уведомлений без пиков |
| Бот | grammY (TypeScript) или python-telegram-bot |
| Деплой | Docker + PM2, VPS с аптаймом 99.9% |
Алерт-логика
Конфигурируемые пороги на пользователя: health factor < 1.3, health factor < 1.1 (критично), изменение APY >20% за 24 часа, появление новой ликвидации по адресу. Дедупликация через Redis с TTL: одно уведомление на событие, повтор через 30 минут если ситуация не изменилась.
Для health factor: не просто текущее значение, а тренд — бот показывает "снизился на 0.15 за последние 6 часов". Это actionable информация.
Команды бота
/positions — все открытые позиции с health factor и текущим APY. /alerts — управление порогами. /history [address] — история изменений health factor за 7 дней, в виде текстового sparkline. /liquidations — последние ликвидации по отслеживаемым адресам.
Мультиаккаунт: один Telegram-пользователь может мониторить несколько адресов (собственные + командные кошельки).
Процесс работы
Аналитика (1-2 дня). Список протоколов, чейнов, типов позиций. Определяем, нужен ли мониторинг LP-позиций Uniswap v3 (impermanent loss, out-of-range алерты) — это отдельный модуль.
Разработка (3-5 дней). Chain listener + position calculator + Telegram bot + PostgreSQL schema. Юнит-тесты на расчёт APY и health factor с моками RPC.
Деплой и мониторинг. Docker Compose, логи в Loki, метрики задержки уведомлений в Grafana. SLA на алерт: <30 секунд от события в чейне до Telegram-сообщения.
Ориентиры по срокам
Базовый бот для Aave v3 на одном чейне с health factor алертами — 3-4 дня. Мультичейн с поддержкой Aave + Compound + мониторингом LP-позиций — 1.5-2 недели. Интеграция с собственным протоколом через кастомный ABI добавляет 2-3 дня.
Стоимость рассчитывается после анализа требований.







