Розробка системи порівняння цін на DEX
Приходить задача: знайти кращий курс для свапу 50 ETH в USDC. Uniswap v3 дає одну ціну, Curve — іншу, Balancer — третю. Різниця в 0.3% на 50 ETH — це вже $150 тільки на одній транзакції. При торгівлі об'ємами від 100k USD розрив між DEX досягає 1-2%, і кожен своп без агрегації — прямі втрати.
Завдання системи порівняння цін — дати користувачеві або алгоритму актуальну картину по всім релевантним DEX за одне звернення, враховуючи slippage, вартість газу та split routing.
Де зазвичай ломається наївна реалізація
On-chain вызови в реальному часі — повільно і дорого
Перший підхід, який приходить в голову: викликати quoteExactInputSingle на Uniswap v3 Quoter, get_dy на Curve, queryBatchSwap на Balancer — і порівнювати. Проблема в тому, що це симуляція on-chain виконання через eth_call. На mainnet з 8-12 DEX та 3-4 варіантами маршрутів отримуємо 30+ RPC-запитів на кожен запит користувача. При 200ms на запит — 6 секунд очікування. За це время цена вже змінилася.
Конкретний кейс з практики: агрегатор з наївним last-write-wins кешем терпів втрату актуальності котировок за 3-5 блоків. Користувач бачив ціну X, натискав своп, отримував revert через slippage, платив газ впустую. Конверсія падала на 40%.
Stale data та блочний drift
Ціна в пулу Uniswap v3 змінюється з кожним свапом. Якщо кеш оновлюється раз в 12 секунд (1 блок на Ethereum), між оновленнями може пройти кілька крупних угод. Особливо критично для пулів з низькою ліквідністю — там зсув ціни на 1-2% за блок не рідкість.
Curve використовує іншу модель ценообразования — StableSwap invariant. Формула A * n^n * sum(x_i) + D = A * D * n^n + D^(n+1) / (n^n * prod(x_i)) чутлива до балансів пулу, які змінюються по-своєму. Не можна застосовувати одну і ту ж логіку розрахунку slippage для Uniswap v3 concentrated liquidity та Curve stable pools.
Архітектура системи
Два шари даних: off-chain індексація + on-chain верифікація
Робоча схема: The Graph субграфи для індексації стану пулів — ліквідність, поточні ціни, об'єми. Дані оновлюються по-блочно та доступні через GraphQL без RPC-навантаження. Для Uniswap v3 — офіційний subgraph з pools, ticks, positions. Для Curve — власний субграф або парсинг подій TokenExchange.
On-chain верифікація потрібна тільки в момент безпосереднього виконання: фінальний quoteExactInput перед транзакцією користувача з актуальним block state.
| Джерело | Latency | Точність | RPC-навантаження |
|---|---|---|---|
| The Graph subgraph | 2-5 сек (1 блок) | Висока | Мінімальна |
| Multicall + Quoter | 200-500 мс | Точна | Висока |
| DEX SDK (off-chain math) | <10 мс | Розрахункова | Немає |
| WebSocket подій | Real-time | Подієвна | Середня |
Off-chain math для швидкості
Uniswap v3 надає @uniswap/v3-sdk та @uniswap/smart-order-router — повний розрахунок маршруту з split routing відбувається локально, без RPC, на основі завантаженого стану пулів. Аналогічно для Curve — Python SDK або TypeScript-порт формули StableSwap дозволяє обчислити get_dy локально.
Такий підхід знижує latency до 10-50 мс та усуває залежність від RPC-провайдера на гарячому шляху.
WebSocket для стрімінга
Для інтерфейсів з realtime-оновленням цін — WebSocket підписка через ethers.js provider.on('block', ...) або viem watchBlocks. При кожному новому блоці перерахувати котировки тільки для активних торгових пар у UI, а не всього маркетплейсу.
Процес роботи
Аналітика (1-2 дні). Визначаємо список DEX під конкретний чейн, потрібні торгові пари, необхідну latency. Ethereum mainnet, Polygon, Arbitrum, Base — у кожного свої активні DEX та своя структура ліквідності.
Розробка backend (3-5 днів). Сервіс індексації з The Graph + Multicall, кеш стану пулів, REST/WebSocket API. Стек: Node.js + TypeScript, viem для on-chain взаємодій, Redis для кешу.
Розробка розрахункового модулю (2-3 дні). Off-chain math для кожного підключеного DEX, split routing алгоритм, облік gas cost при порівнянні.
Frontend інтеграція (1-2 дні). wagmi хуки для отримання котировок, відображення порівняння, інтеграція з трансакційним флоу.
Тестування. Fork-тесты на Hardhat/Foundry з реальним mainnet-станом — перевіряємо точність розрахунків проти реальних on-chain результатів.
Орієнтири за строками
Базова система порівняння для 3-5 DEX на одному чейні — 3-5 днів. Повноцінний агрегатор з multi-chain, split routing та realtime UI — від 2 тижнів. Строки залежать від кількості підключаємих DEX та вимог до latency.
Вартість рассчитується після уточнення чейнів, DEX та вимог до продуктивності.







