Разработка системы маршрутизации ордеров через несколько DEX

Проектируем и разрабатываем блокчейн-решения полного цикла: от архитектуры смарт-контрактов до запуска DeFi-протоколов, NFT-маркетплейсов и криптобирж. Аудит безопасности, токеномика, интеграция с существующей инфраструктурой.
Показано 1 из 1Все 1305 услуг
Разработка системы маршрутизации ордеров через несколько DEX
Сложный
~1-2 недели
Часто задаваемые вопросы

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

Этапы блокчейн-разработки

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

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

Агрегатор 1inch показал простую идею: если ты ищешь лучшую цену только на одном DEX — ты оставляешь деньги на столе. С тех пор системы маршрутизации ордеров выросли до сложных решений с split routing, multi-hop и специализированными алгоритмами. Мы проектируем и внедряем такие системы под ключ — с нуля или как расширение существующей инфраструктуры.

Собственная система маршрутизации ордеров нужна, когда стандартные агрегаторы (1inch, Paraswap, 0x) не поддерживают нужный чейн; требуется интеграция кастомных протоколов; нужен контроль над источниками ликвидности; или существующие API слишком медленны для торгового бота. Наш опыт — 5+ лет в блокчейн-разработке и 30+ проектов в DeFi.

Как работает система маршрутизации ордеров через несколько DEX?

Маршрутизация — это задача поиска пути в взвешенном направленном графе. Вершины — токены. Рёбра — пулы (каждый пул создаёт два направленных ребра: A→B и B→A с ценой в данном направлении).

Для поиска лучшего пути при фиксированном amountIn — задача поиска пути с максимальным произведением обменных курсов (или эквивалентно — минимальной суммой отрицательных логарифмов). Это модификация алгоритма Беллмана-Форда или Дейкстры.

Но есть нюанс, который делает задачу сложнее: цена в пуле зависит от объёма. Для amountIn = 100 USDC лучший маршрут может быть Uniswap V3 пул 0.05%. Для amountIn = 1 000 000 USDC тот же пул даст 3% slippage, а split между несколькими пулами даст 0.3%. Это превращает задачу из поиска пути в граф с фиксированными весами в оптимизационную задачу с объёмо-зависимыми весами.

Как split routing снижает проскальзывание на крупных ордерах?

Для крупных ордеров оптимальное решение — не единый маршрут, а распределение объёма по нескольким путям. Подход через бинарный поиск оптимального split для двух маршрутов:

function findOptimalSplit(
  routeA: Route,
  routeB: Route,
  totalAmount: bigint,
  steps: number = 20
): { splitA: bigint; splitB: bigint; totalOut: bigint } {
  let bestSplit = { splitA: 0n, splitB: totalAmount, totalOut: 0n }
  
  for (let i = 0; i <= steps; i++) {
    const fraction = i / steps
    const amountA = BigInt(Math.floor(Number(totalAmount) * fraction))
    const amountB = totalAmount - amountA
    
    const outA = amountA > 0n ? simulateRoute(routeA, amountA) : 0n
    const outB = amountB > 0n ? simulateRoute(routeB, amountB) : 0n
    const totalOut = outA + outB
    
    if (totalOut > bestSplit.totalOut) {
      bestSplit = { splitA: amountA, splitB: amountB, totalOut }
    }
  }
  
  return bestSplit
}

Для N маршрутов задача становится N-мерной оптимизацией — применяют gradient descent или Nelder-Mead с ограничениями (сумма долей = 1, все доли ≥ 0).

Симуляция пулов: точность vs скорость

Uniswap V2: точная формула — разработка системы маршрутизации

function getAmountOutV2(amountIn: bigint, reserveIn: bigint, reserveOut: bigint): bigint {
  const amountInWithFee = amountIn * 997n
  const numerator = amountInWithFee * reserveOut
  const denominator = reserveIn * 1000n + amountInWithFee
  return numerator / denominator
}

Uniswap V2 Whitepaper

Uniswap V3: tick traversal

V3 требует итерации по tick bitmap для нахождения ближайших активных tick-ов. Полная симуляция точна, но медленна — несколько миллисекунд на крупный своп с traversal через множество tick-ов.

Для быстрой оценки (при скриннинге маршрутов) используем приближение через текущий sqrtPriceX96 и liquidity без tick traversal — точно для малых объёмов, с погрешностью для крупных. Точную симуляцию запускаем только для финальных кандидатов.

Curve StableSwap: итерационная формула

Curve использует инвариант A * n^n * sum(x_i) + D = A * D * n^n + D^(n+1) / (n^n * prod(x_i)). Расчёт amountOut — итерационный (Newton's method). Для JavaScript/TypeScript — BigInt арифметика с 18-decimal precision.

Balancer WeightedPool

Balancer с весовыми пулами (например, 80/20 BAL/ETH) использует другой инвариант. getAmountOut зависит от весов токенов в пуле — более сложная формула, чем V2.

On-chain vs off-chain маршрутизация

Маршрутизация может происходить полностью on-chain (смарт-контракт находит маршрут прямо в транзакции) или off-chain (вычисления вне чейна, результат передаётся в контракт).

On-chain маршрутизация: полная прозрачность, невозможность манипуляции со стороны aggregator-а. Проблема: ограниченный gas, нельзя перебрать все маршруты. Применяется для простых случаев (2–3 пула maximum).

Off-chain маршрутизация (подход 1inch, Paraswap): вычисления в backend, контракту передаётся готовый маршрут. Контракт только исполняет. Gas эффективнее, маршрут сложнее. Риск: backend может вернуть субоптимальный маршрут. Защита через slippage protection: minAmountOut в транзакции гарантирует пользователю минимум.

Как устроен router контракт?

Контракт должен поддерживать гетерогенные маршруты: часть через Uniswap V2, часть через V3, часть через Curve.

struct SwapStep {
    address pool;
    address tokenIn;
    address tokenOut;
    uint24 fee;       // Для V3
    uint8 dexType;    // 0=V2, 1=V3, 2=Curve, 3=Balancer
    bytes extraData;  // Дополнительные параметры под тип DEX
}

function multiSwap(
    SwapStep[] calldata steps,
    uint256 amountIn,
    uint256 minAmountOut,
    address recipient
) external returns (uint256 amountOut) {
    IERC20(steps[0].tokenIn).transferFrom(msg.sender, address(this), amountIn);
    
    uint256 currentAmount = amountIn;
    for (uint256 i = 0; i < steps.length; i++) {
        currentAmount = _executeStep(steps[i], currentAmount);
    }
    
    require(currentAmount >= minAmountOut, "Slippage exceeded");
    IERC20(steps[steps.length-1].tokenOut).transfer(recipient, currentAmount);
    return currentAmount;
}

_executeStep диспатчит к конкретной DEX-реализации по dexType. Каждая реализация — отдельная библиотека (Solidity library pattern) для экономии bytecode size.

Почему кэш пулов критичен для скорости?

Для быстрой маршрутизации без RPC-вызовов на каждый запрос нужен кэш актуального состояния пулов: WebSocket subscriptions на события Sync (V2 пулы) и Swap (V3 пулы) через eth_subscribe("logs"). При каждом событии обновляем reserves/sqrtPrice в памяти.

Для 500–1000 активных пулов это ~50–100 событий/блок на Ethereum mainnet. Обработка через event-driven архитектуру (Node.js EventEmitter или Rust tokio channel) с ≤1ms задержкой обновления.

Cold start: при запуске сервиса нужно загрузить текущее состояние всех пулов через multicall. Для 1000 пулов — 5–10 multicall транзакций (до 200 calls каждый), занимает 1–3 секунды.

Сравнение архитектурных подходов

Подход Когда подходит Сложность Latency
Простой multi-hop 3–5 чейнов, топ-5 DEX Низкая 200–500ms
Split routing Крупные ордера ($50K+) Средняя 500ms–1s
С кэшем пулов Торговый бот, < 50ms Высокая 10–50ms
On-chain router Максимальная прозрачность Средняя 1 блок

Ориентировочные сроки разработки

Этап Время
Аналитика (список DEX, требования к latency) 1–2 дня
Разработка routing engine (граф, алгоритм, симуляция) 5–7 дней
Router контракт (multi-step, fork-тесты) 3–5 дней
Кэш пулов (WebSocket + in-memory) 3–5 дней
Интеграция, тестирование, документация 2–3 дня

Этапы разработки в виде пошаговой инструкции

  1. Анализ пулов и графа ликвидности — составляем карту токенов и пулов для ваших чейнов.
  2. Разработка алгоритма поиска пути — реализация модифицированного Дейкстры с учётом объёмной зависимости.
  3. Интеграция симуляций — пишем симуляторы для Uniswap V2/V3, Curve, Balancer.
  4. Тестирование на mainnet fork — прогоняем ордера разных объёмов, сверяем с эталоном.
  5. Развёртывание и мониторинг — запуск в тестовой сети и mainnet, настройка алертов.

Что входит в работу

  • Архитектурная документация: описание графа пулов, схема кэширования, спецификация контракта.
  • Routing engine: реализация поиска пути и split routing с поддержкой V2/V3/Curve/Balancer.
  • Router контракт: multi-step исполнение с защитой от slippage.
  • Кэш пулов (опционально): WebSocket подписки + in-memory хранилище.
  • Тестирование: fork-тесты Foundry, фаззинг Echidna.
  • Интеграция: развёртывание в тестовой сети и mainnet, настройка мониторинга.
  • Обучение команды: внутренняя документация, code review.

Закажите консультацию — пришлём технико-коммерческое предложение через 1 день после брифа. Получите детальный анализ вашей текущей инфраструктуры и рекомендации по оптимизации маршрутизации. Свяжитесь с нами, чтобы обсудить ваш проект.

Разработка DeFi-протоколов

Мы проектируем модульные DeFi-протоколы, в которых математика стейблкоинов, ликвидности и оракулов работает без сбоев. Mango Markets — краш-тест: атакующий манипулировал spot price через один аккаунт, взял кредит под завышенный collateral и вывел $114 млн. Оракул брал цену с единственного источника без TWAP. Не баг в коде — это архитектурное решение, которое стало уязвимостью. Наш опыт показывает: любой DeFi-протокол — это система ставок на то, что все компоненты, от расчётов до экономических стимулов, выстроены правильно одновременно.

Мы не пишем код под «если всё работает, не трогай». Мы моделируем стресс-сценарии: каскадные ликвидации, депег, флеш-кредиты. И только после этого — события, которые не сломают протокол.

Почему оракулы — критический компонент DeFi?

Большинство крупных взломов DeFi начинались с манипуляции оракулом. Разберём три слоя, которые мы используем в каждом проекте.

Spot price как оракул — не вариант. Uniswap v2 spot price можно сдвинуть flash loan за одну транзакцию. Цена в конце блока — единственное, что попадает в state, её и читает оракул. Схема атаки: занять через flash loan → купить актив в пул → цена поднялась → взять кредит под завышенный collateral → продать актив → вернуть flash loan. Одна транзакция.

TWAP как защита. Uniswap v3 observe() усредняет цену за период (30 минут). Манипуляция требует удерживать цену несколько блоков — это стоит дорого. Но TWAP медленно реагирует на легитимные изменения, что открывает окно для arbitrage на liquidation при резких движениях.

Chainlink Price Feeds — агрегация от множества data providers с медианой. Стандарт для lending. Проблема: heartbeat 1–24 часа и deviation threshold 0.5%. Если цена не двигается, фид может не обновляться сутки. В волатильном рынке — lag.

Оракул Механизм Защита от манипуляции Задержка
Chainlink Медиана от независимых провайдеров Высокая (децентрализация) До 24 ч при 0% движения
Uniswap v3 TWAP Средняя цена за N блоков Высокая (сложно удерживать) 30 мин — 1 ч
Pyth Network Cross-chain low-latency Средняя (зависимость от publisher) Секунды

В продакшене мы используем двухуровневую проверку: Chainlink aggregator + Uniswap v3 TWAP как верификатор. Если расхождение больше N% — транзакция отклоняется, система ставится на паузу.

Как защитить DeFi-протокол от flash loan атак?

Flash loan превращает любого пользователя в обладателя неограниченного капитала на одну транзакцию. Поэтому при проектировании контрактов мы предполагаем: доступ к неограниченному капиталу есть у всех. Это меняет threat model полностью.

Легитимные применения flash loan — arbitrage, liquidation, самоликвидация. Но протокол должен проверять, что заём не используется для манипуляции: оракул не должен читать цену из пула, который можно сдвинуть за одну транзакцию. Мы добавляем проверки на block.timestamp и минимальную глубину ликвидности.

Ключевые компоненты DeFi-архитектуры

Тип протокола Основная механика Главный риск
DEX (AMM) x*y=k или concentrated liquidity impermanent loss, oracle manipulation
Lending collateral ratio, liquidation bad debt при каскадных ликвидациях
Yield aggregator автокомпаундинг стратегий rug через strategy upgrade
Derivatives / Perps funding rate, mark price liquidation cascades, socialized losses
Liquid staking stETH-style rebasing depegging при mass unstake

AMM: от x*y=k до concentrated liquidity

Uniswap v2 использует x * y = k. LP-токены ERC-20 — каждый пул выпускает свой токен пропорционально доле. Проблема: ликвидность размазана по всей кривой, большая часть не используется.

Uniswap v3 и позиции ERC-721: concentrated liquidity — LP предоставляет ликвидность в диапазоне [priceLow, priceHigh]. Capital efficiency до 4000x для стабильных пар. Но ERC-721 ломает vault-стратегии под ERC-20. Управление ranges — отдельная инженерная задача: позиция выходит из диапазона при движении цены, перестаёт зарабатывать fees, становится single-asset. Протоколы типа Arrakis Finance автоматически rebalance. Если строите vault поверх v3, нужен собственный range manager или интеграция с существующим.

Slippage в v3 рассчитывается через sqrtPriceX96 — 96-битная fixed-point математика. Ошибки на фронтенде приводят к расхождению между видимым и фактическим slippage.

Curve для пар с близкими ценами (stablecoin/stablecoin, stETH/ETH) использует инвариант, комбинирующий constant product и constant sum. Меньше slippage в диапазоне peg. Контракты на Vyper, код математически плотный, аудировать сложно.

Lending протоколы: collateral, liquidation, bad debt

LTV определяет максимальный кредит под collateral. Liquidation threshold — уровень ликвидации. Разница — буфер для liquidator. Типичный пример: LTV 75%, liquidation threshold 80%, bonus 5%. Если цена падает на 20%+, позиция открыта к ликвидации.

Каскадные ликвидации: много позиций ликвидируется одновременно → ликвидаторы продают collateral → цена падает → следующая волна. LUNA/UST 2022 — классический каскад.

Если collateral обесценивается быстрее ликвидации, протокол получает bad debt. Aave использует Safety Module (застейканный AAVE), Compound — reserves. Без backstop bad debt социализируется через dilution supply-токена или взаимозачёт.

Проектирование системы ликвидации требует моделирования стресс-сценариев: падение единственного liquidation bot, высокий gas, делистинг collateral.

Yield farming и incentive mechanics

Liquidity mining — раздача governance-токенов LP-провайдерам. Проблема mercenary capital: фармеры приходят, продают токены, уходят. TVL фиктивный.

Устойчивые механики: protocol-owned liquidity (Olympus bonding), veToken (CRV locked → boost + governance), locked staking с penalty. Ve-модель при неправильной реализации создаёт governance concentration. Нужен timelock на изменения gauge weights и лимиты на votingPower.

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

  • Архитектурная документация: диаграммы взаимодействия контрактов, стресс-тесты ликвидаций, расчёты оракулов.
  • Реализация на Solidity 0.8.x с OpenZeppelin 5.x (AccessControl, ReentrancyGuard, Pausable, TimelockController) и Solmate для gas-optimised base contracts.
  • Foundry fork-тесты на реальном mainnet (Uniswap, Chainlink, Aave) — тесты до деплоя покрывают все сценарии.
  • Аудит: минимум два независимых аудитора для TVL от $1M. Code4rena или Sherlock для bug bounty.
  • Деплой с Gnosis Safe 3/5 multisig + timelock 48–72 часа.
  • Мониторинг через Tenderly (alerts, симуляции), OpenZeppelin Defender (automation), Forta (on-chain threat detection).
  • Поддержка после запуска: обновления, патчи, апгрейды через proxy.

Наши компетенции и опыт

Мы разрабатываем DeFi-протоколы с 2020 года — за это время реализовали 30+ проектов с общим TVL более $150 млн. Среди клиентов — протоколы в топ-20 по TVL на Ethereum, Arbitrum и Base. Команда сертифицированных разработчиков Solidity, прошедших аудиторские треки ConsenSys Diligence.

DeFi на Wikipedia — базовые принципы, которые мы применяем на практике.

Сроки

  • DEX с AMM (Uniswap v2 fork): 6–10 недель
  • Lending protocol (Aave-style, один collateral): 3–5 месяцев
  • Yield aggregator с несколькими стратегиями: 2–4 месяца
  • Полноценный DeFi-протокол с governance: 5–8 месяцев включая аудит

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

Получите консультацию по архитектуре DeFi-протокола — мы проанализируем риски и предложим оптимальное решение.