Інтеграція UniswapX
UniswapX — принципово інша архітектура виконання свопів порівняно з Uniswap V2/V3. Замість прямої взаємодії з пулами AMM — система на основі намірів: користувач підписує намір виконати своп, заповнювач (професійний маркет-мейкер або бот арбітражу) виконує його оптимально. Це змінює не тільки UX, але й всю технічну схему інтеграції.
Як працює виконання на основі намірів
Потік ордерів
Традиційний своп Uniswap V3: користувач → транзакція → маршрутизатор → пул → виконання. Кожен крок в блокчейні, користувач платить за газ, MEV видобувають боти sandwich-атак.
Потік ордерів UniswapX:
- Користувач підписує
SignedOrder(поза блокчейном, без газу) - Ордер публікується в потік ордерів UniswapX (відкритий голландський аукціон)
- Заповнювачі конкурують за виконання ордера
- Переможець виконує транзакцію в блокчейні (заповнювач платить газ)
- Заповнювач отримує різницю між ціною аукціону та реальною ціною виконання
Для кінцевого користувача: без комісій за газ (або значно зменшені), захист від MEV (sandwich неможливий — нема відкритого ордера в mempool), краща ціна через конкуренцію заповнювачів.
Механіка голландського аукціону
UniswapX використовує голландський аукціон для визначення ціни. Початкова ціна ордера встановлюється вигідно для заповнювачів (великий спред), з часом зміщується на користь користувача. Заповнювач, що приймає ордер першим за прийнятною для нього ціною — перемагає.
Параметри ордера визначають криву аукціону:
-
inputAmount— що дає користувач -
outputs[].startAmount— мінімальний вихід на початку аукціону (вигідно для заповнювачів) -
outputs[].endAmount— мінимальний вихід в кінці аукціону (вигідно для користувача) -
deadline— коли закінчується ордер
Оптимальна крива аукціону залежить від волатильності активу та очікуваного часу виконання. Для активних пар (ETH/USDC) — агресивна крива з швидкою збіжністю. Для неактивних пар — м'яка крива.
Інтеграція через SDK UniswapX
Створення та підпис ордера
import { DutchOrderBuilder, NonceManager, PERMIT2_ADDRESS } from "@uniswap/uniswapx-sdk";
import { ethers } from "ethers";
const provider = new ethers.JsonRpcProvider(RPC_URL);
const wallet = new ethers.Wallet(PRIVATE_KEY, provider);
// Отримуємо nonce через NonceManager
const nonceManager = new NonceManager(provider, chainId, PERMIT2_ADDRESS);
const nonce = await nonceManager.useNonce(wallet.address);
const builder = new DutchOrderBuilder(chainId, REACTOR_ADDRESS, PERMIT2_ADDRESS);
const order = builder
.deadline(Math.floor(Date.now() / 1000) + 300) // 5 хвилин
.decayStartTime(Math.floor(Date.now() / 1000))
.decayEndTime(Math.floor(Date.now() / 1000) + 180) // аукціон 3 хвилини
.nonce(nonce)
.input({
token: WETH_ADDRESS,
startAmount: ethers.parseEther("1"),
endAmount: ethers.parseEther("1"), // вхід не змінюється
})
.output({
token: USDC_ADDRESS,
startAmount: ethers.parseUnits("3150", 6), // вигідно для заповнювача
endAmount: ethers.parseUnits("3180", 6), // цільова ціна користувача
recipient: wallet.address,
})
.build();
// Підписуємо через Permit2
const { domain, types, values } = order.permitData();
const signature = await wallet.signTypedData(domain, types, values);
const signedOrder = { order: order.serialize(), sig: signature };
Permit2: навіщо він потрібен
UniswapX використовує Permit2 (підпис EIP-712 для дозволів) замість стандартного затвердження ERC-20. Це дозволяє групові затвердження, часово обмежені дозволи та підпис без транзакції в блокчейні. Користувач затверджує PERMIT2_ADDRESS один раз на токен, потім тільки підписи поза блокчейном.
Для інтеграції dApp: перевірити наявність затвердження Permit2 при першій взаємодії, запросити затвердження, якщо його немає. Один раз на токен — не на кожний своп.
Відправка ордера до API
// Відправляємо в потік ордерів UniswapX
const response = await fetch("https://api.uniswap.org/v2/orders", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(signedOrder),
});
const { hash } = await response.json();
// Моніторимо статус
const statusResponse = await fetch(`https://api.uniswap.org/v2/orders?orderHash=${hash}`);
const { orderStatus } = await statusResponse.json();
// orderStatus: "open" | "filled" | "cancelled" | "expired"
Відстеження виконання
Опитування API UniswapX — простий підхід. Для оновлень у реальному часі: підпишіться на події Fill(orderHash, filler, swapper, nonce) від контракту Reactor через WebSocket або The Graph.
Інтеграція на стороні заповнювача
Якщо мета — стати заповнювачем (виконавцем ордерів) для отримання доходу:
Архітектура заповнювача: Сервіс моніторить відкриті ордери через API UniswapX, оцінює прибутковість кожного ордера (поточна ціна vs ціна аукціону), виконує через execute() або executeBatch() на контракті Reactor.
Джерела ліквідності для заповнювача:
- Власний запас (попередньо фундовані токени)
- Flash swap через Uniswap V3 (атомарно: отримати з пула → відправити користувачу → повернути в пул)
- Маршрутизація через Jupiter/1inch для пошуку кращої ціни виконання
Контракт реактора заповнювача:
contract UniswapXFiller is IReactorCallback {
function reactorCallback(
ResolvedOrder[] calldata resolvedOrders,
bytes calldata callbackData
) external override {
// Токени вже передані від користувача до цього контракту
// Виконуємо маршрутизацію через Uniswap V3 або інший джерело
// Повертаємо необхідні вихідні токени до Reactor
}
}
Підтримувані мережі
| Мережа | Адреса Reactor | Статус |
|---|---|---|
| Ethereum mainnet | ExclusiveDutchOrderReactor | Production |
| Polygon | ExclusiveDutchOrderReactor | Production |
| Arbitrum | ExclusiveDutchOrderReactor | Production |
| Optimism | ExclusiveDutchOrderReactor | Production |
| Base | ExclusiveDutchOrderReactor | Production |
Для міжланцюгових свопів — UniswapX з міжланцюговою маршрутизацією (експериментально, на основі Across Protocol).
Процес розробки
Аналітика (1-2 дні). Визначення завдання: інтегратор (додати UniswapX до існуючого dApp) або заповнювач (заробляти на виконанні ордерів).
Розробка (3-5 днів).
- Для інтегратора: інтеграція SDK, потік Permit2, компоненти UI, відстеження ордерів.
- Для заповнювача: контракт заповнювача, сервіс моніторингу ордерів, логіка маршрутизації, розрахунок прибутку.
Тестування. UniswapX забезпечує розгортання на testnet (Sepolia). Тестуємо повний потік: підпис → відправка → моніторинг → виконання.
Орієнтири за часом
Базова інтеграція UniswapX у існуючий dApp (створення ордерів, Permit2, відстеження) — 3-5 днів. Бот заповнювача з логікою маршрутизації та flash swap — 1-2 тижні. Вартість розраховується індивідуально.







