Что такое Universal Router

Universal Router — это смарт-контрактный маршрутизатор нового поколения, предназначенный для объединения различных операций в экосистеме децентрализованных финансов в одну транзакцию. Основная идея заключается в том, чтобы предоставить единый интерфейс для выполнения сложных цепочек действий: обмен токенов, работа с NFT, управление ликвидностью и другие операции.

В отличие от классических роутеров, которые ограничены одной функцией (например, только swap), Universal Router позволяет комбинировать несколько типов действий в рамках одного вызова.


Архитектурная идея

В основе Universal Router лежит концепция командного исполнения (command-based execution). Вместо вызова конкретной функции пользователь формирует последовательность команд, каждая из которых описывает отдельное действие.

Ключевые элементы:

  • Commands (команды) — байтовая последовательность, где каждая команда представляет действие
  • Inputs (входные данные) — параметры для каждой команды
  • Executor (исполнитель) — контракт, который последовательно интерпретирует команды

Такой подход позволяет:

  • минимизировать количество транзакций
  • снизить комиссии за газ
  • повысить гибкость сценариев

Основные возможности

1. Атомарные операции

Все действия выполняются в рамках одной транзакции. Если хотя бы один шаг завершается с ошибкой — откатывается вся цепочка.

Пример:

  • обмен ETH на USDC
  • покупка NFT
  • перевод NFT на другой адрес

Все три шага либо выполняются полностью, либо не выполняются вовсе.


2. Поддержка разных протоколов

Universal Router может взаимодействовать сразу с несколькими протоколами:

  • AMM (например, Uniswap V2/V3)
  • NFT-маркетплейсы
  • контракты ликвидности
  • кастомные контракты

Это достигается за счёт унифицированной системы команд.


3. Гибкость маршрутизации

Возможность строить сложные маршруты:

  • мульти-hop swap (несколько пулов ликвидности)
  • частичное распределение средств
  • комбинированные стратегии (swap + staking + NFT)

Формат команд

Каждая команда кодируется одним байтом. Этот байт определяет тип операции.

Пример логики:

0x00 — swap exact input
0x01 — swap exact output
0x02 — transfer token
0x03 — wrap ETH
0x04 — unwrap ETH
...

Команды объединяются в массив:

const commands = '0x000104';

Структура inputs

Каждая команда имеет соответствующий набор параметров. Все входные данные передаются в массиве inputs.

Пример:

const inputs = [
  encodeSwap(...),
  encodeTransfer(...),
  encodeWrap(...)
];

Важно:

  • порядок inputs строго соответствует порядку commands
  • каждая команда интерпретирует свой input по-разному

Вызов execute

Основная функция Universal Router:

execute(bytes commands, bytes[] inputs, uint256 deadline)

Параметры:

  • commands — последовательность действий
  • inputs — массив аргументов
  • deadline — время истечения транзакции

Пример вызова через JavaScript (ethers.js):

await router.execute(commands, inputs, deadline);

Работа с JavaScript

Подключение контракта

import { ethers } from "ethers";

const router = new ethers.Contract(
  ROUTER_ADDRESS,
  ROUTER_ABI,
  signer
);

Кодирование команд

Команды формируются вручную или через SDK:

const COMMAND_SWAP = 0x00;
const COMMAND_TRANSFER = 0x02;

const commands = ethers.utils.hexConcat([
  COMMAND_SWAP,
  COMMAND_TRANSFER
]);

Кодирование параметров

Для каждой команды требуется ABI-кодирование:

const abi = ethers.utils.defaultAbiCoder;

const swapInput = abi.encode(
  ["address", "uint256", "uint256"],
  [tokenIn, amountIn, amountOutMin]
);

Пример сценария: swap + transfer

  1. Swap токена
  2. Перевод результата на другой адрес
const commands = '0x0002';

const inputs = [
  encodeSwap(tokenIn, tokenOut, amount),
  encodeTransfer(recipient, amountOut)
];

await router.execute(commands, inputs, deadline);

Преимущества по сравнению с классическими роутерами

1. Универсальность

Один контракт заменяет множество специализированных:

  • SwapRouter
  • NFTRouter
  • LiquidityManager

2. Снижение затрат газа

  • объединение операций
  • меньше внешних вызовов
  • оптимизация calldata

3. Композиция логики

Возможность строить сложные сценарии:

  • arbitrage
  • multi-step trading
  • автоматизированные стратегии

Ограничения и особенности

Сложность разработки

  • требуется ручное кодирование команд
  • высокий риск ошибок в последовательности
  • сложная отладка

Безопасность

  • ошибки в inputs могут привести к потере средств

  • важно проверять:

    • адреса токенов
    • суммы
    • slippage
    • deadline

Читаемость

Код становится менее очевидным:

0x000104

не даёт интуитивного понимания без документации.


Внутренний механизм исполнения

Контракт выполняет команды последовательно:

  1. Читает байт команды
  2. Определяет обработчик
  3. Декодирует input
  4. Выполняет действие
  5. Переходит к следующей команде

Псевдологика:

for (uint i = 0; i < commands.length; i++) {
    executeCommand(commands[i], inputs[i]);
}

Поддержка ETH и ERC-20

Universal Router умеет работать с:

  • нативным ETH (через wrap/unwrap)
  • ERC-20 токенами

Команды:

  • wrap ETH → WETH
  • unwrap WETH → ETH

Роль deadline

Параметр deadline защищает от:

  • фронт-раннинга
  • исполнения устаревших транзакций

Пример:

const deadline = Math.floor(Date.now() / 1000) + 60 * 10;

Использование в сложных DeFi сценариях

Universal Router особенно полезен для:

Arbitrage

  • покупка на одном пуле
  • продажа на другом
  • фиксация прибыли

Aggregation

  • распределение ордера по разным пулам
  • минимизация проскальзывания

NFT + DeFi

  • покупка NFT
  • мгновенный залог
  • получение займа

Итоговая концепция

Universal Router — это не просто контракт, а интерпретатор транзакций, который:

  • принимает набор инструкций
  • последовательно их выполняет
  • гарантирует атомарность
  • объединяет различные протоколы в единую точку входа

Такой подход приближает смарт-контракты к модели программируемых транзакций, где логика формируется на стороне клиента и исполняется единым вызовом.