Интеграция с UniswapX
UniswapX — принципиально другая архитектура исполнения свапов по сравнению с Uniswap V2/V3. Вместо прямого взаимодействия с AMM пулами — intent-based система: пользователь подписывает намерение сделать свап, filler (профессиональный маркет-мейкер или арбитражный бот) исполняет его оптимальным способом. Это меняет не только UX, но и всю техническую схему интеграции.
Как работает intent-based исполнение
Order flow
Традиционный Uniswap V3 свап: пользователь → транзакция → Router → Pool → исполнение. Каждый шаг on-chain, gas платит пользователь, MEV извлекается sandwich ботами.
UniswapX order flow:
- Пользователь подписывает
SignedOrder(off-chain, без gas) - Order публикуется в UniswapX order stream (open dutch auction)
- Fillers конкурируют за исполнение ордера
- Winning filler исполняет транзакцию on-chain (gas платит filler)
- Filler получает разницу между auction price и реальной ценой исполнения
Для конечного пользователя: no gas fees (или значительно сниженные), MEV protection (sandwich impossible — нет открытого ордера в mempool), лучшая цена через filler конкуренцию.
Dutch Auction механика
UniswapX использует Dutch Auction для price discovery. Начальная цена ордера выставляется выгодно для fillers (большой спред), со временем сдвигается в сторону пользователя. Filler, который принимает ордер первым при приемлемой для него цене — wins.
Параметры ордера определяют auction curve:
-
inputAmount— что пользователь отдаёт -
outputs[].startAmount— минимальный вывод в начале аукциона (выгодно fillers) -
outputs[].endAmount— минимальный вывод в конце аукциона (выгодно пользователю) -
deadline— когда ордер истекает
Оптимальная auction curve зависит от волатильности актива и ожидаемого времени исполнения. Для highly liquid пар (ETH/USDC) — агрессивная кривая с быстрым convergence. Для illiquid пар — более мягкая.
Интеграция через UniswapX SDK
Создание и подпись ордера
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) // auction 3 минуты
.nonce(nonce)
.input({
token: WETH_ADDRESS,
startAmount: ethers.parseEther("1"),
endAmount: ethers.parseEther("1"), // input не меняется
})
.output({
token: USDC_ADDRESS,
startAmount: ethers.parseUnits("3150", 6), // выгодно filler
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 approve. Это даёт batch approvals, time-limited permissions и подпись без on-chain транзакции. Пользователь один раз делает approve(PERMIT2_ADDRESS, MAX_UINT256) для каждого токена, далее — только off-chain подписи.
Для интеграции в dApp: проверить наличие Permit2 approval при первом взаимодействии, запросить approve если нет. Один раз на токен — не каждый свап.
Отправка ордера в API
// Отправка в UniswapX order stream
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"
Отслеживание исполнения
UniswapX API polling — простой подход. Для real-time обновлений: подписаться на events Fill(orderHash, filler, swapper, nonce) от Reactor контракта через WebSocket или The Graph.
Интеграция на стороне filler
Если задача — стать filler (исполнителем ордеров) для получения дохода:
Filler архитектура: Сервис мониторит open orders через UniswapX API, оценивает прибыльность каждого ордера (текущая цена vs auction price), исполняет через execute() или executeBatch() на Reactor контракте.
Источники ликвидности для filler:
- Собственный inventory (pre-funded токены)
- Flash swap через Uniswap V3 (атомарно: получить из пула → отправить пользователю → вернуть в пул)
- Routing через Jupiter/1inch для поиска лучшей цены исполнения
Реактивный контракт filler:
contract UniswapXFiller is IReactorCallback {
function reactorCallback(
ResolvedOrder[] calldata resolvedOrders,
bytes calldata callbackData
) external override {
// Токены уже перечислены от swapper на этот контракт
// Выполняем routing через Uniswap V3 или другой источник
// Возвращаем требуемые output tokens на Reactor
}
}
Поддерживаемые сети
| Сеть | Reactor адрес | Статус |
|---|---|---|
| Ethereum mainnet | ExclusiveDutchOrderReactor | Production |
| Polygon | ExclusiveDutchOrderReactor | Production |
| Arbitrum | ExclusiveDutchOrderReactor | Production |
| Optimism | ExclusiveDutchOrderReactor | Production |
| Base | ExclusiveDutchOrderReactor | Production |
Для кросс-чейн свапов — UniswapX с cross-chain routing (экспериментально, на базе Across Protocol).
Процесс разработки
Аналитика (1-2 дня). Определение задачи: integrator (добавить UniswapX в существующий dApp) или filler (зарабатывать на исполнении ордеров).
Разработка (3-5 дней).
- Для integrator: SDK интеграция, Permit2 flow, UI компоненты, order tracking.
- Для filler: filler контракт, order monitoring сервис, routing логика, profit calculation.
Тестирование. UniswapX предоставляет testnet deployment (Sepolia). Тестируем полный flow: подпись → отправка → мониторинг → исполнение.
Ориентиры по срокам
Базовая интеграция UniswapX в существующий dApp (создание ордеров, Permit2, tracking) — 3-5 дней. Filler бот с routing логикой и flash swap — 1-2 недели. Стоимость рассчитывается индивидуально.







