Отметим: когда ETH падает на 15% за час, сотни позиций одновременно пересекают порог ликвидации. Первый ликвидатор, вызвавший absorb, забирает дисконтированные коллатеральные активы. Второй — ничего. Это конкурентная среда с миллисекундами: Compound-ликвидации ловят MEV-боты с прямыми подключениями к builder'ам и кастомными Rust-имплементациями. Наша команда, имеющая более 7 лет опыта в DeFi и разработавшая свыше 40 торговых и ликвидационных ботов, строит решение, которое работает в этой среде. Средняя прибыль на одну успешную ликвидацию составляет $150–250, а экономия на газе по сравнению с наивным подходом достигает 35–45%.
Compound v3: новый подход к ликвидациям
Согласно документации Compound v3 (Comet), ликвидация происходит в два шага: absorb и buyCollateral.
Compound v3 (Comet) кардинально отличается от v2 по модели ликвидаций. В v2 был liquidateBorrow — ликвидатор погашает долг за заёмщика и получает его коллатераль с бонусом 8–15%. В v3 введена двухшаговая модель: absorb и buyCollateral. Profit на ликвидации в v3 приходит от арбитража между ценой покупки у Comet и рыночной ценой. Бот должен атомарно: вызвать buyCollateral, продать полученный актив на DEX, вернуть base token. Flash loan из Aave или Uniswap v3 для финансирования — стандартный паттерн.
Как определить несостоятельные позиции в реальном времени?
Позиция несостоятельна, когда borrowing capacity ниже долга. Compound v3 предоставляет isLiquidatable(address account) и getBorrowableOf(...). Для мониторинга сотен тысяч позиций поллинг каждой через eth_call — непрактично. Эффективный подход — event-based мониторинг: слушаем Supply, Withdraw, Transfer события от Comet, обновляем локальную копию состояний. Когда цена коллатераля падает (событие Chainlink AnswerUpdated) — пересчитываем health factor для позиций с этим коллатералем. Структура данных — sorted set в Redis по health factor, что позволяет за O(log n) находить ближайшие к ликвидации позиции.
| Параметр | Naive | Optimized |
|---|---|---|
| Обнаружение | Polling каждые 12 сек | WebSocket + event-based (в 3 раза быстрее) |
| Submission | Public mempool | Flashbots bundle |
| Gas price | Фиксированный | Dynamic (80th percentile + boost) |
| Execution | EOA транзакция | Контракт-ликвидатор (1 tx) |
Архитектура бота
Мониторинг позиций
Подробнее о мониторинге
Два уровня: The Graph subgraph для исторических данных, WebSocket подписка через ethers.js provider.on или viem watchContractEvent для реального времени. Subgraph обновляется с задержкой в 1–3 блока — для конкурентных ликвидаций этого достаточно. Chainlink price feeds — через AggregatorV3Interface с проверкой updatedAt (staleness check).
Smart contract ликвидатора
Атомарная ликвидация через flash loan:
contract CompoundLiquidator { function liquidate( address comet, address[] calldata accounts, address collateralAsset, uint baseAmount, address flashLoanPool // Uniswap v3 pool ) external { // 1. Flash loan base token из Uniswap v3 // 2. absorb(address(this), accounts) // 3. buyCollateral(collateralAsset, minOut, baseAmount, address(this)) // 4. Своп коллатераля -> base token через DEX // 5. Возврат flash loan + fee // 6. Profit идёт на msg.sender или treasury } } Критичная деталь: absorb и buyCollateral — это два отдельных вызова. Между ними другой бот может купить коллатераль. Нужно либо проверять доступный коллатераль перед покупкой (quoteCollateral), либо принять, что в редких случаях транзакция ревертируется.
Profitability фильтр
Не каждая ликвидируемая позиция прибыльна. Перед отправкой транзакции рассчитываем: profit = buyCollateralValue * (1 - storeFrontPriceFactor) - flashLoanFee - gasCost - swapSlippage
Если profit < threshold (обычно $50–100 с учётом риска) — пропускаем.
Как мы строим эффективного бота?
- Анализ архитектуры Compound v3 и развёртывание тестовой среды (Goerli/Sepolia).
- Разработка event-based мониторинга с Redis и health factor calculator.
- Реализация смарт-контракта ликвидатора с flash loan.
- Комплексное тестирование на форке mainnet.
- Деплой и настройка мониторинга (алерты, логи).
- Документация и передача исходного кода.
Атомарность вызовов критична
Раздельные вызовы absorb и buyCollateral создают окно для фронтраннинга. Другой MEV-бот может заметить событие Absorb и перехватить покупку коллатераля. Атомарность в одной транзакции (через контракт-агрегатор) устраняет этот риск.
Типичные ошибки и их решения
| Ошибка | Решение |
|---|---|
| Игнорирование cooldown после absorb | Логика retry с backoff |
| Неверный расчёт минимального выхода | Динамический расчёт на основе oracle price с 1–2% buffer |
| Не проверяется reserves протокола | Проверка getReserves() перед отправкой |
| Отсутствие атомарности | Использование контракта-агрегатора для одного вызова |
Что входит в разработку?
- Полный аудит модели ликвидаций и написание смарт-контракта ликвидатора (Solidity, с тестами на Foundry).
- Мониторинг-сервис на TypeScript или Rust с event-based подпиской и Redis.
- Интеграция с Flashbots для приватного мемпула.
- Тестирование на форке mainnet и dry-run в основной сети.
- Развёртывание и настройка алертов (Telegram, Slack).
- Документация и передача исходного кода с пояснениями.
- Поддержка в течение 1 месяца после запуска.
Ориентиры по срокам и стоимости
Базовый бот для Compound v3 на одном чейне — 2.5–3 недели. Мультипротокольный бот (Compound + Aave + Euler) с MEV-оптимизацией — 6–8 недель. Реализация для Arbitrum/Base добавляет 1 неделю на каждый чейн. Стоимость рассчитывается индивидуально; мы предоставляем оценку проекта под ключ за 2 дня.
Свяжитесь с нами для предварительной оценки вашего проекта — получите конкурентное преимущество на рынке ликвидаций. Мы гарантируем качество и соблюдение сроков. Получите консультацию по настройке MEV-бота.







