Внутри самого быстрого свопа Stellar: мульти-маршрутная оценка
Как Shadow Pocket оценивает маршруты ордербука и AMM-пулов параллельно, чтобы найти лучший курс обмена на Stellar, обновляя его каждый леджер.
Большинство DEX-интерфейсов на Stellar выбирают один маршрут для вашего свопа. Они проверяют ордербук, может быть, смотрят на пул ликвидности и выдают число. Shadow Pocket делает принципиально другое — оценивает все возможные маршруты параллельно и отправляет 100% вашей сделки через тот, который возвращает максимальный выход.
Проблема одномаршрутных свопов
Когда вы обмениваете Актив A на Актив B в Stellar, существует несколько возможных площадок исполнения:
- Ордербук SDEX — лимитные ордера, размещённые трейдерами и маркет-мейкерами.
- AMM-пулы ликвидности — пулы с постоянным произведением, где цена определяется алгоритмически.
- Кросс-пейр пути — маршруты A → C → B, использующие промежуточные активы как мосты.
Одномаршрутный подход выбирает один и надеется на лучшее. Но ликвидность смещается с каждым закрытием леджера (примерно каждые 5 секунд). Ордербук может иметь отличную цену на малой глубине, но разваливаться на больших объёмах. Пул может предлагать лучшие курсы для крупных свопов благодаря непрерывной кривой ликвидности. А иногда кросс-пейр путь через XLM или USDC бьёт оба прямых варианта.
Ошибка в выборе стоит пользователю реальных денег.
Как работает параллельная оценка
Бэкенд Shadow Pocket оценивает все доступные маршруты независимо для каждого запроса котировки. Вот процесс:
- Обнаружение — система определяет все жизнеспособные маршруты: прямой ордербук, каждый релевантный AMM-пул и кросс-пейр пути через основные мостовые активы.
- Параллельная симуляция — каждый маршрут симулируется независимо с точной суммой ввода. Симуляция ордербука проходит по книге, заполняя ордера на каждом ценовом уровне. Симуляция пулов использует формулу постоянного произведения. Симуляция путей цепочкой связывает множественные операции.
- Сравнение выхода — каждый маршрут возвращает симулированную сумму выхода с учётом проскальзывания при конкретном размере ввода.
- Выбор победителя — маршрут с наибольшим выходом выбирается. Без разделения, без частичного заполнения — 100% сделки идёт через лучший путь.
Бэкенд всегда возвращает результат ордербука первым в ответе, за ним следуют маршруты пулов, чтобы фронтенд мог отображать информацию о ликвидности по маршрутам, хотя исполняется только лучший.
Почему 100% в один маршрут (а не разделение)
Разделение маршрутов звучит умно в теории — отправить часть сделки через ордербук и часть через пул, чтобы минимизировать ценовое воздействие. На практике, в Stellar, это вносит сложность, которая редко окупается:
- Комиссии транзакций пренебрежимо малы — нет причин оптимизации газа для батчинга.
- Атомарное исполнение — транзакции Stellar либо полностью выполняются, либо полностью откатываются. Разделение добавляет операции, увеличивая шанс частичного сбоя.
- Тайминг леджера — цены меняются каждые 5 секунд. К моменту исполнения разделённого ордера оптимальное соотношение разделения может сместиться.
Для подавляющего большинства объёмов сделок на Stellar отправка 100% через единственный лучший маршрут превосходит любую стратегию разделения. Математика проста: симулируй все варианты, выбери победителя.
Обновление по леджеру через SSE
Котировки свопов быстро устаревают. Shadow Pocket поддерживает их актуальность с помощью Server-Sent Events (SSE), подключённых к потоку леджеров Stellar:
- Фронтенд открывает SSE-соединение к эндпоинту
/ledgers?cursor=now. - Каждый раз, когда закрывается новый леджер (~5 секунд), срабатывает событие.
- Фронтенд применяет debounce и запускает новый запрос котировки.
- Бэкенд заново оценивает все маршруты с текущим состоянием ордербука и пулов.
- UI обновляет отображаемый курс, сумму выхода и разбивку по маршрутам.
Это означает, что пользователь всегда видит котировку, отражающую текущее состояние леджера — а не что-то 30-секундной давности, что могло значительно измениться.
Детали реализации
Несколько инженерных решений, обеспечивающих надёжную работу:
Управление debounce-таймером — таймер debounce обновления котировки должен корректно обнуляться в callback setTimeout. Если ссылка на таймер устарела, UI может застрять в состоянии загрузки навсегда.
Независимость состояния загрузки — индикатор загрузки котировки свопа сбрасывается вне проверки abort signal. Это предотвращает дедлок, при котором отменённый запрос навсегда оставляет UI в состоянии загрузки.
Обход Service Worker — content type text/event-stream для SSE исключён из логики precache Service Worker. Без этого обхода Service Worker перехватывал бы потоковое соединение и ломал обновления в реальном времени.
Независимая оценка маршрутов — бэкенд не использует жадный подход (сначала проверить ордербук, потом заполнить остаток из пулов). Каждый маршрут оценивается для полной суммы независимо, обеспечивая честное сравнение.
Результат
Пользователь видит интерфейс обмена, обновляющийся в реальном времени, показывающий точно, по какому маршруту пойдёт его сделка, и гарантирующий лучший доступный курс по всем площадкам исполнения на Stellar. Без ручного выбора маршрута, без устаревших котировок, без угадывания с разделением.
Быстрые свопы — это не о сырой скорости. Это о том, чтобы всегда иметь самую свежую, самую точную информацию, когда нажимаешь «Обменять».