Разработка MEV-оптимизированного бота ликвидаций для Compound

Отметим: когда ETH падает на 15% за час, сотни позиций одновременно пересекают порог ликвидации. Первый ликвидатор, вызвавший `absorb`, забирает дисконтированные коллатеральные активы. Второй — ничего. Это конкурентная среда с миллисекундами: Compound-ликвидации ловят [MEV](https://en.wikipedia.org/

Направления блокчейн-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1450
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1308
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1003
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1269
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    717
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1008

Отметим: когда 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 с учётом риска) — пропускаем.

Как мы строим эффективного бота?

  1. Анализ архитектуры Compound v3 и развёртывание тестовой среды (Goerli/Sepolia).
  2. Разработка event-based мониторинга с Redis и health factor calculator.
  3. Реализация смарт-контракта ликвидатора с flash loan.
  4. Комплексное тестирование на форке mainnet.
  5. Деплой и настройка мониторинга (алерты, логи).
  6. Документация и передача исходного кода.

Атомарность вызовов критична

Раздельные вызовы 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-бота.