Розробка бота ліквідацій для 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 одна транзакція закриває всю позицію.
Джерела даних про позиції
Три підходи з різними компромісами latency та повноти:
| Джерело | Latency | Повнота | Підходить для |
|---|---|---|---|
| The Graph (subgraph) | 15-60 сек | Всі позиції | Фоновий скан |
| Aave API (позиції) | 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 потребує надати pogashuvanu актив заранее. Для ліквідації позиції з боргом у $500k потрібно мати $500k у гаманці? Ні. Використовуємо flash loan з того ж Aave: займаємо debtAsset → викликаємо liquidationCall → отримуємо collateral зі скидкою → продаємо частину collateral через Uniswap v3/Paraswap для погашення flash loan → залишаємо profit.
Все в одній атомарній транзакції. Якщо profit < газ-cost — транзакція реверсується, втрачаємо тільки газ.
Контракт ліквідатора реалізує інтерфейс IFlashLoanSimpleReceiver (Aave v3). У executeOperation callback:
- Виклик
POOL.liquidationCall(collateralAsset, debtAsset, user, debtToCover, receiveAToken) - Перевірка отриманої кількості collateral
- Swap через Uniswap v3 з максимальним slippage 0.5% (інакше ліквідація збиткова)
- Повернення flash loan + fee (0.05% для Aave v3)
Розрахунок прибутковості перед відправкою
Відправляти без перерахунку — потеря газу. Моделюємо через eth_call весь флоу ліквідації, отримуємо очікуваний вихід collateral, рахуємо swap output через Uniswap v3 Quoter (quoteExactInputSingle), вираховуємо flash loan fee та газ-cost при поточному baseFee.
Мінімальний поріг прибутковості — настраюємий параметр. Типово: $50-200 мінімальна прибуток на транзакцію, інакше пропускаємо.
MEV та конкуренція
Ліквідації — висококонкурентне середовище. У періоди волатильності сотні ботів одночасно атакують одні й ті ж позиції. Без пріоритизації — sandwich від MEV-ботів або front-running.
Варіанти:
- Flashbots bundle на Ethereum: транзакція йде напрямки валідатору, не видна в mempool. Бот не отримує MEV-sandwich, але конкурує за розмір bribe
- Повищена priorityFee: просто та працює, але дорого в періоди високої конкуренції
- Приватний 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 якщо slippage високий). Деплоїмо через Foundry з forge script, автоматична верифікація на Etherscan.
Off-chain рухавик (Node.js/TypeScript + viem). Управління watchlist, моніторинг подій, розрахунок прибутковості, відправка транзакцій. Конфіг через .env: пороги HF, мінімальна прибуток, підтримувані сети, Flashbots RPC.
Інфраструктура. Власна нода або премиум RPC (Alchemy Growth/Business tier) для стійкого WebSocket. На Ethereum — обов'язково, на L2 — по ситуації.
Моніторинг. Grafana dashboard: кількість сканованих позицій, кількість ліквідацій (успішних/failed), P&L по дням, газ витрачений vs прибуток.
Орієнтири по срокам
Базовий бот для однієї сети (Ethereum або Polygon) з flash loan та Uniswap свапом — 1-1.5 тижня. Мультисетевая версія з Flashbots, динамічним routing свапів через кількох DEX та full моніторингом — 2-3 тижні. На терміни впливає складність стратегії управління газом та вимоги до інфраструктури.
Вартість обговорюється індивідуально після аналізу цільових сетей та бажаного функціоналу.







