В процессе эволюции библиотеки Universal Router часть функций и
подходов была признана устаревшей. Это связано с изменениями в
архитектуре, улучшением безопасности, оптимизацией газовых затрат и
унификацией интерфейсов. Понимание deprecated-функционала важно для
поддержки существующего кода и корректной миграции на актуальные
версии.
Причины появления
устаревшего функционала
Основные причины, по которым элементы объявляются устаревшими:
- Изменение протоколов обмена — обновления в Uniswap
(например, переход от V2 к V3 и далее)
- Оптимизация газа — старые методы становятся менее
эффективными
- Безопасность — выявленные уязвимости или
потенциальные риски
- Унификация API — устранение дублирующих или
избыточных методов
- Поддержка мультиопераций — переход к более гибкой
системе маршрутизации через команды (commands)
Устаревшие команды (Commands)
Universal Router использует байтовую кодировку команд для выполнения
последовательности операций. Некоторые команды были исключены или
заменены:
Примеры deprecated-команд
Причины отказа от старых
команд
- Ограниченная гибкость
- Сложности при комбинировании с другими действиями (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
Устаревшие паттерны
маршрутизации
Последовательные транзакции
Ранее сложные операции выполнялись так:
- approve
- swap
- transfer
- 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
- Атомарность всех операций
Миграция с устаревшего
функционала
Основные шаги
Замена методов swap
swapExactTokensForTokens → execute
Переход на Permit2
- исключение
approve из пользовательского потока
Использование commands
- построение последовательности действий
Обновление ABI
- переход на
bytes[] inputs
Типичные
ошибки при использовании deprecated-функционала
- Использование старых ABI контрактов
- Попытка вызвать удалённые команды
- Неправильная кодировка inputs
- Игнорирование Permit2
- Смешивание старых и новых подходов
Рекомендации по работе с
legacy-кодом
- Изолировать устаревшие части
- Постепенно переписывать на
execute
- Проверять совместимость с текущей версией Universal Router
- Использовать официальные SDK и примеры
Обратная совместимость
Universal Router частично сохраняет обратную совместимость:
- Некоторые команды продолжают работать
- Но могут быть удалены в будущих версиях
- Не гарантируется стабильность deprecated API
Ключевой принцип:
deprecated ≠ удалённый, но ≠ безопасный для будущего
использования
Практическое значение
Понимание устаревшего функционала необходимо для:
- поддержки старых dApp
- аудита смарт-контрактов
- оптимизации газовых затрат
- безопасной миграции на новые версии
Игнорирование deprecated-элементов приводит к:
- ошибкам выполнения
- уязвимостям
- несовместимости с обновлениями протокола