DeFi-контракты: разработка AMM-пулов с MEV-защитой и аудитом

Команда принесла контракт пула с классической механикой x*y=k. На тестнете всё работало. На mainnet через три дня после запуска сэндвич-бот извлёк из пула $180k — цена входа на 12% выше реальной, цена выхода на 11% ниже. Никакого слиппеж-контроля на уровне контракта не было, только фронтенд проверял

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

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

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

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

Команда принесла контракт пула с классической механикой x*y=k. На тестнете всё работало. На mainnet через три дня после запуска сэндвич-бот извлёк из пула $180k — цена входа на 12% выше реальной, цена выхода на 11% ниже. Никакого слиппеж-контроля на уровне контракта не было, только фронтенд проверял. Это типичная история, когда разработчики копируют механику AMM, не разбираясь в том, как работает MEV-инфраструктура Ethereum. Свяжитесь с нами, чтобы избежать таких потерь — мы специализируемся на защите пулов.

Проблемы AMM-контракта при деплое

Impermanent loss как архитектурное решение, а не баг

IL — это не ошибка, а математическое следствие перебалансирования. Протоколы, которые не объясняют LP-провайдерам реальную математику, теряют ликвидность: люди видят APY 40%, забирают позицию через месяц и не понимают, почему в USD они в минусе. Задача контракта — предоставлять точные данные о позиции: текущую стоимость, накопленные комиссии, расчётный IL.

В Uniswap v3 это усложняется концентрированной ликвидностью: позиция активна только в диапазоне [tickLower, tickUpper]. Когда цена выходит из диапазона, позиция перестаёт зарабатывать комиссии и полностью конвертируется в один токен. LP-провайдер без мониторинга может неделями держать мёртвую позицию.

Price manipulation через flash loan в однобоких оракулах

AMM-пул, который сам является оракулом цены — точка атаки. Flash loan на 50M USDC, одна транзакция на swap — spot-цена в пуле сдвигается в 10 раз. Если ваш лендинговый протокол читает цену из этого пула — он выдаёт кредиты под манипулированный collateral. Так произошло с Mango Markets (потеряно $114M). Решение: TWAP через Uniswap v3 oracle — IUniswapV3Pool.observe() с окном наблюдения минимум 30 минут. Или Chainlink как внешний оракул с circuit breaker: если spot и Chainlink расходятся более чем на 5% — транзакция реверсируется.

Reentrancy в callback-механике

Uniswap v2/v3 использует callback-паттерн: uniswapV2Call и uniswapV3SwapCallback. Если ваш пул реализует похожую механику и не ставит nonReentrant на функцию, которая вызывает callback — классический вектор. В практике встречали контракт пула с функцией swap, которая обновляла reserve0 и reserve1 после вызова _callback. Reentrancy позволяла получить токены дважды при одном входе. ReentrancyGuard нужен на swap, addLiquidity, removeLiquidity — все три.

Почему TWAP-оракул обязателен для пула?

Без TWAP пул становится уязвим для flash loan атак. Используя короткое окно наблюдения, мы сглаживаем манипуляции. В проектах с высоким TVL закладываем fallback на Chainlink — это повышает надёжность.

Как снизить риск impermanent loss для LP?

Встраиваем в контракт расчёт impermanent loss в реальном времени и предоставляем данные через view-функции. В концентрированных пулах добавляем автоматический ребаланс позиции через keeper-ботов, чтобы избежать долгого нахождения вне диапазона. Это снижает потери LP-провайдеров.

Как мы строим пулы ликвидности

Архитектурные решения

Для большинства задач не нужно писать AMM с нуля. Протоколы Uniswap v2/v3, Balancer, Curve — battle-tested код с миллиардами TVL. Задача — правильно выбрать механику под токеномику:

Механика Подходит для Пример
x*y=k (Uniswap v2) Общий случай, два токена Любая пара ERC-20
Concentrated liquidity (Uniswap v3) Стейблкоины, коррелированные активы USDC/USDT, ETH/stETH
StableSwap (Curve) Стейблкоины с минимальным slippage 3pool, FRAX
Weighted pools (Balancer) 2-8 токенов с кастомными весами 80/20 WETH/TOKEN
CPMM с кастомными fees Протокольные пулы с fee-sharing Собственный DEX

Если задача — кастомный пул под конкретный протокол, за основу берём Uniswap v4 Hooks (если чейн поддерживает) или Balancer v2 Vault архитектуру, где общий vault хранит токены, а пулы — только логику.

LP-токены и учёт позиций

Стандарт ERC-20 для LP-токенов в Uniswap v2 — самый простой случай. Доля в пуле = lpBalance / lpTotalSupply. Проблема: при большом количестве LP-провайдеров каждый transfer LP-токена меняет относительные доли без ведома других участников. Для Uniswap v3-style позиций используем NFT (ERC-721) — каждая позиция уникальна по тикам и размеру. Это усложняет интеграцию, но даёт точный учёт. Комиссии накапливаются через feeGrowthInside0LastX128 — при реализации нужен unchecked arithmetic с явным комментарием.

Защита от MEV на уровне контракта

  • Применяем commit-reveal для крупных свапов: пользователь публикует хэш, через N блоков — саму транзакцию. Боты не знают параметры заранее.
  • Используем dynamic fees: fee растёт при высокой волатильности (детектируется через отклонение от TWAP). Реализуется через Uniswap v4 Hook или custom fee tier.
  • Рекомендуем private mempool (Flashbots Protect, MEV Blocker) — инфраструктурное решение, предупреждаем клиента до деплоя.

Что входит в разработку пула ликвидности

Этап Длительность Результат
Спецификация 2-3 дня Документ с механикой пула, токеномикой, fee structure, ролями
Разработка 1-6 недель Контракты на Solidity 0.8.x с Foundry, fuzz-тесты
Fork-тестирование 3-5 дней Тесты на форке mainnet с реальными ценами
Аудит 1-2 недели Внутренний Slither + опциональный внешний
Деплой 1-2 дня Forge script, верификация, мультисиг, timelock

Дополнительно: интеграция с фронтендом (ethers.js, wagmi), мониторинг позиций, обучение команды клиента.

Показатели нашего опыта

Суммарный TVL разработанных пулов превышает $100M. 5+ лет на рынке DeFi, 30+ проектов по смарт-контрактам. Работаем с сертифицированными аудиторами из Code4rena и Sherlock. В одном проекте оптимизация контракта снизила расходы на газ на 40%, что сэкономило клиенту $50k за год.

Процесс разработки

Спецификация (2-3 дня). Определяем механику пула, токеномику LP-токенов, fee structure, роли (owner, fee collector, pause guardian). Рисуем state diagram: все переходы состояний пула, включая emergency pause.

Разработка (1-2 недели). Контракты на Solidity 0.8.x с Foundry. Fuzz-тесты на инварианты: reserve0 * reserve1 >= k никогда не нарушается, сумма всех LP-долей = totalSupply, комиссии не превышают объём свапа.

Fork-тестирование. Тесты на форке mainnet/Arbitrum — реальные цены, реальные токены, реальные MEV-боты в mempool. Используем vm.createFork в Foundry.

Внутренний аудит + Slither. Минимум за неделю до деплоя. Для TVL > $500k рекомендуем внешний аудит (Code4rena, Sherlock, Spearbit).

Деплой. forge script с верификацией, мультисиг Gnosis Safe на owner-функции, timelock на изменение fee параметров (минимум 48 часов).

Ориентиры по срокам

Базовый пул с механикой x*y=k и LP-токенами ERC-20 — от 2 недель с тестами. Пул с концентрированной ликвидностью в стиле Uniswap v3 — от 6 недель. Кастомная механика с несколькими токенами, интеграцией с внешними оракулами и fee-sharing — 2-3 месяца. Сроки аудита не включены.

Получите консультацию по выбору архитектуры пула — свяжитесь с нами для бесплатной оценки вашего проекта.