Deprecated функционал

В процессе эволюции библиотеки Universal Router часть функций и подходов была признана устаревшей. Это связано с изменениями в архитектуре, улучшением безопасности, оптимизацией газовых затрат и унификацией интерфейсов. Понимание deprecated-функционала важно для поддержки существующего кода и корректной миграции на актуальные версии.


Причины появления устаревшего функционала

Основные причины, по которым элементы объявляются устаревшими:

  • Изменение протоколов обмена — обновления в Uniswap (например, переход от V2 к V3 и далее)
  • Оптимизация газа — старые методы становятся менее эффективными
  • Безопасность — выявленные уязвимости или потенциальные риски
  • Унификация API — устранение дублирующих или избыточных методов
  • Поддержка мультиопераций — переход к более гибкой системе маршрутизации через команды (commands)

Устаревшие команды (Commands)

Universal Router использует байтовую кодировку команд для выполнения последовательности операций. Некоторые команды были исключены или заменены:

Примеры deprecated-команд

  • V2_SWAP_EXACT_IN (устаревший формат)

    • Использовался для точного ввода токенов в Uniswap V2
    • Заменён на более универсальные команды с гибкой маршрутизацией
  • V2_SWAP_EXACT_OUT

    • Аналогично устарел из-за перехода на более универсальные механизмы расчёта
  • Жёстко закодированные маршруты

    • Ранее маршруты задавались явно
    • В новых версиях используется динамическая маршрутизация через calldata

Причины отказа от старых команд

  • Ограниченная гибкость
  • Сложности при комбинировании с другими действиями (NFT, Permit2 и т.д.)
  • Дублирование логики

Устаревшие методы взаимодействия

Прямые вызовы swap-функций

Ранее использовались отдельные функции:

router.swapExactTokensForTokens(...)
router.swapTokensForExactTokens(...)

Эти методы:

  • Не поддерживают батчинг операций
  • Ограничены одним типом действия
  • Не интегрируются с Permit2

Замена

Используется единый метод:

universalRouter.execute(commands, inputs)

Где:

  • commands — байтовая строка команд
  • inputs — массив параметров для каждой команды

Устаревшая работа с разрешениями (approvals)

Использование стандартного ERC-20 approve

token.approve(routerAddress, amount)

Недостатки:

  • Требует отдельной транзакции
  • Повышает риск front-running атак
  • Неэффективно при множественных операциях

Современная альтернатива — Permit2

Permit2 позволяет:

  • Подписывать разрешения вне цепи (off-chain)
  • Использовать их в рамках одной транзакции
  • Повысить безопасность и UX

Устаревший подход постепенно вытесняется:

  • approve → deprecated в контексте сложных маршрутов
  • permit (EIP-2612) → частично заменён Permit2

Устаревшие паттерны маршрутизации

Последовательные транзакции

Ранее сложные операции выполнялись так:

  1. approve
  2. swap
  3. transfer
  4. mint NFT

Недостатки:

  • Высокая стоимость газа
  • Риск частичного выполнения
  • Плохой UX

Современный подход

Universal Router объединяет всё в одну транзакцию:

  • batching через execute
  • атомарность выполнения
  • возможность отката при ошибке

Устаревшие структуры данных

Жёсткие структуры calldata

Ранее параметры передавались в фиксированном формате:

{
  path: [...],
  amountIn: ...,
  amountOutMin: ...
}

Недостатки:

  • Ограниченная расширяемость
  • Сложность поддержки новых протоколов

Новая модель

  • Использование ABI-кодированных данных
  • Гибкая структура bytes[] inputs
  • Каждая команда самостоятельно декодирует свои параметры

Устаревшие подходы к работе с NFT

Прямые вызовы маркетплейсов

seaport.fulfillOrder(...)
looksRare.execute(...)

Недостатки:

  • Зависимость от конкретных контрактов
  • Отсутствие унификации

Новая модель

Universal Router:

  • Абстрагирует взаимодействие с NFT
  • Использует команды для разных маркетплейсов
  • Позволяет комбинировать NFT и swap в одной транзакции

Deprecated fallback-логика

Ранее использовались fallback-методы:

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

Проблемы:

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

Современный подход:

  • Явное описание всех шагов
  • Отсутствие скрытой логики
  • Полный контроль над выполнением

Устаревшие подходы к обработке ошибок

Silent fail

Ранее некоторые операции могли:

  • завершаться без ошибки
  • возвращать некорректные значения

Современный подход

  • Чёткие revert-сообщения
  • Использование require/assert
  • Атомарность всех операций

Миграция с устаревшего функционала

Основные шаги

  1. Замена методов swap

    • swapExactTokensForTokensexecute
  2. Переход на Permit2

    • исключение approve из пользовательского потока
  3. Использование commands

    • построение последовательности действий
  4. Обновление ABI

    • переход на bytes[] inputs

Типичные ошибки при использовании deprecated-функционала

  • Использование старых ABI контрактов
  • Попытка вызвать удалённые команды
  • Неправильная кодировка inputs
  • Игнорирование Permit2
  • Смешивание старых и новых подходов

Рекомендации по работе с legacy-кодом

  • Изолировать устаревшие части
  • Постепенно переписывать на execute
  • Проверять совместимость с текущей версией Universal Router
  • Использовать официальные SDK и примеры

Обратная совместимость

Universal Router частично сохраняет обратную совместимость:

  • Некоторые команды продолжают работать
  • Но могут быть удалены в будущих версиях
  • Не гарантируется стабильность deprecated API

Ключевой принцип:

deprecated ≠ удалённый, но ≠ безопасный для будущего использования


Практическое значение

Понимание устаревшего функционала необходимо для:

  • поддержки старых dApp
  • аудита смарт-контрактов
  • оптимизации газовых затрат
  • безопасной миграции на новые версии

Игнорирование deprecated-элементов приводит к:

  • ошибкам выполнения
  • уязвимостям
  • несовместимости с обновлениями протокола