Разработка бота ликвидаций для Aave
В сентябре 2023 года во время резкого падения рынка на Aave v3 в Ethereum стало доступно для ликвидации позиций на ~$47M. Боты, которые успели исполнить ликвидации первыми, суммарно заработали несколько миллионов долларов в виде liquidation bonus (5-15% от суммы долга). Боты, которые отправили транзакции на 200 мс позже — получили revert и потеряли только на газе.
Разрыв между «успел» и «не успел» — это архитектурные решения, принятые за месяцы до события.
Механика ликвидаций в Aave v3
Health factor и когда позиция открывается
Позиция становится ликвидируемой, когда healthFactor < 1. Формула:
HF = Σ(collateral_i * liquidationThreshold_i) / totalDebt
Liquidation threshold зависит от актива: для ETH это 82.5%, для WBTC — 75%, для более волатильных активов — 65% и ниже. При HF < 1 любой может вызвать liquidationCall() и получить collateral заёмщика со скидкой равной liquidation bonus.
Важный нюанс Aave v3: нельзя ликвидировать более 50% долга за один вызов (close factor = 0.5), если HF > 0.95. Если HF упал ниже 0.95 — можно ликвидировать 100% долга за один вызов. Это меняет расчёт прибыльности: при глубоком падении HF одна транзакция закрывает всю позицию.
Источники данных о позициях
Три подхода с разным trade-off между latency и полнотой:
| Источник | Latency | Полнота | Подходит для |
|---|---|---|---|
| The Graph (subgraph) | 15-60 сек | Все позиции | Фоновый скан |
| Aave API (positions) | 5-30 сек | Все позиции | Периодический опрос |
On-chain getUserAccountData |
~1 блок | Конкретные адреса | Мониторинг watchlist |
Событие Borrow + пересчёт |
Real-time | Новые позиции | Добавление в watchlist |
Рабочая архитектура: фоновый скан через The Graph для построения базы всех позиций с HF < 1.3 (pre-liquidation watchlist), плюс real-time мониторинг через WebSocket на события Borrow, Repay, LiquidationCall, ReserveDataUpdated для обновления HF в watchlist.
При изменении цены (событие ReserveDataUpdated) пересчитываем HF для всего watchlist и немедленно отправляем транзакции для позиций, где HF опустился ниже 1.
Критические детали реализации
Flash loan для capital-efficient ликвидаций
Aave liquidationCall требует предоставить погашаемый актив заранее. Для ликвидации позиции с долгом в $500k нужно иметь $500k в кошельке? Нет. Используем flash loan из того же Aave: занимаем debtAsset → вызываем liquidationCall → получаем collateral со скидкой → продаём часть collateral через Uniswap v3/Paraswap для погашения flash loan → оставляем profit.
Всё в одной атомарной транзакции. Если profit < gas cost — транзакция реверсируется, теряем только газ.
Контракт ликвидатора реализует интерфейс IFlashLoanSimpleReceiver (Aave v3). В executeOperation callback:
- Вызов
POOL.liquidationCall(collateralAsset, debtAsset, user, debtToCover, receiveAToken) - Проверка полученного количества collateral
- Swap через Uniswap v3 с ценовым слиппажем не более 0.5% (иначе ликвидация убыточна)
- Возврат flash loan + fee (0.05% для Aave v3)
Расчёт прибыльности перед отправкой
Отправлять транзакцию без предварительного расчёта — потеря газа. Симулируем через eth_call весь флоу ликвидации, получаем ожидаемый выход collateral, считаем swap output через Uniswap v3 Quoter (quoteExactInputSingle), вычитаем flash loan fee и gas cost при текущем baseFee.
Минимальный порог прибыльности — настраиваемый параметр. Типично: $50-200 минимальная прибыль на транзакцию, иначе пропускаем.
MEV и конкуренция
Ликвидации — высококонкурентная среда. В периоды волатильности сотни ботов одновременно атакуют одни и те же позиции. Без приоритизации — sandwich от MEV-ботов или front-running.
Варианты:
- Flashbots bundle на Ethereum: транзакция идёт напрямую к валидатору, не видна в mempool. Бот не получает MEV-sandwich, но конкурирует по размеру bribe
- Повышенный priorityFee: просто и работает, но дорого в периоды высокой конкуренции
- Private RPC (bloXroute, MEV Blocker): защита от front-running без Flashbots
На Arbitrum и Polygon Flashbots не работает, но там latency ниже и конкуренция меньше — прямые транзакции с чуть повышенным gasPrice обычно достаточны.
Поддержка нескольких сетей
Aave v3 развёрнут на Ethereum, Polygon, Arbitrum, Optimism, Base, Avalanche, Gnosis, Metis. Каждая сеть — свой пул контрактов, свои ставки ликвидации, своя конкурентная среда. На Ethereum конкуренция максимальная, но и суммы позиций крупнее. На Polygon и Arbitrum меньше конкурентов, быстрее финализация.
Как строим бота
Контракт ликвидатора (Solidity). Реализует IFlashLoanSimpleReceiver, интегрирован с Uniswap v3 Swap Router. Параметризован: поддерживает несколько DEX для свапа (fallback с Uniswap на Paraswap если слиппаж высокий). Деплоим через Foundry с forge script, верификация на Etherscan автоматически.
Off-chain движок (Node.js/TypeScript + viem). Watchlist management, мониторинг событий, расчёт прибыльности, отправка транзакций. Конфиг через .env: пороги HF, минимальная прибыль, поддерживаемые сети, Flashbots RPC.
Инфраструктура. Собственная нода или премиум RPC (Alchemy Growth/Business tier) для стабильного WebSocket. На Ethereum — обязательно, на L2 — по ситуации.
Мониторинг. Grafana dashboard: количество отсканированных позиций, количество ликвидаций (успешных/failed), P&L по дням, gas spent vs profit.
Ориентиры по срокам
Базовый бот для одной сети (Ethereum или Polygon) с flash loan и Uniswap свапом — 1-1.5 недели. Мультисетевая версия с Flashbots, динамическим роутингом свапов через нескольких DEX и full мониторингом — 2-3 недели. На сроки влияет сложность стратегии управления газом и требования к инфраструктуре.
Стоимость обсуждается индивидуально после анализа целевых сетей и желаемого функционала.







