Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →

Два различных понятия

Price impact и slippage часто путают в интерфейсах, но они означают разные вещи.
  • Price impact — это детерминированное свойство сделки против конкретного состояния пула. Учитывая (Δin, reserves), price impact полностью вычисляется до отправки сделки.
  • Slippage — это реализованная разница между ценой, которую вы ожидали во время котировки, и ценой, которую вы фактически получили при исполнении. Это функция задержки, одновременных транзакций и порядка включения блоков — не математики пула.
Котировка 1% против неактивного пула имеет 0% slippage, если она попадает в следующий блок; 1% был price impact. Та же котировка будет на 0,2% хуже, если другая сделка сначала попадет в пул — дополнительные 0,2% — это slippage.

Формальные определения

Price impact

Для CPMM: impact ≈ 2 · Δin / reserve_in для небольших сделок. Для CLMM: зависит от количества пересекаемых тиков; часто плоский в пределах текущего диапазона тиков, скачок на каждом пересечении тика.

Реализованный slippage

Slippage всегда неотрицательный (или нулевой), при условии честной котировки. Отрицательное значение означало бы, что вы получили больше, чем котировалось — возможно, если состояние пула изменилось в вашу пользу между котировкой и исполнением.

Расчет minAmountOut и maxAmountIn

Каждый swap в Raydium принимает границу защиты от slippage:
  • SwapBaseInput(amount_in, min_amount_out) — точный ввод, нижняя граница вывода.
  • SwapBaseOutput(max_amount_in, amount_out) — точный вывод, верхняя граница ввода.
SDK рассчитывает эти значения для каждого продукта — все три не используют одну сигнатуру:
Во всех трех случаях minAmountOut равен amountOut × (1 − slippage) и это то, что идет в блокчейн как граница; priceImpact детерминирован только из состояния пула; fee — это общая взимаемая комиссия. Допуск slippage — это буфер вокруг price impact, а не сам price impact. Допуск 0,5% означает «принять максимум на 0,5% хуже, чем моя котировка» — независимо от того, был ли price impact 0,01% (крошечная сделка) или 2% (большая сделка). Для сделки с 2% price impact и 0,5% допуском minAmountOut на 2,5% ниже спот-цены до сделки — по сути сумма воздействия и допуска.

Рекомендуемые допуски slippage

Нет единого правильного числа; правильная граница зависит от:
  1. Стабильности пары. Пулы stablecoin-stablecoin могут безопасно использовать 0,1%. Волатильные пулы мем-пар часто нуждаются в 3–5% просто для надежного исполнения.
  2. Размера сделки. Большие сделки имеют больший price impact, поэтому допуск должен масштабироваться с ними, чтобы избежать отката. SDK использует автоматический slippage по умолчанию около max(0.5%, 2 × price_impact) по этой причине.
  3. Задержки включения блока. Транзакции, находящиеся в mempool несколько блоков, подвергаются большему количеству одновременных сделок. Jito bundles и priority fees это снижают.
Практические правила (значения по умолчанию в UI Raydium):

Различия между типами AMM

CPMM

Price impact гладкий и непрерывный (закрытая форма 2 · Δin / reserve_in). Допуск slippage масштабируется линейно с размером сделки.

AMM v4

Та же математика кривой, что и CPMM. После удаления OpenBook «эффективные резервы» — это просто балансы двух хранилищ:
  • Котируйте по сырым балансам хранилищ. Нет компонента на книге для добавления — Initialize2 записывает AmmInfo.open_orders = Pubkey::default() в каждый новый пул, и ни одна инструкция не читает аккаунт OpenOrders.
  • Вычтите накопленный PnL протокола (state_data.need_take_pnl_coin / need_take_pnl_pc) из балансов хранилищ, чтобы получить резервы, которые инвариант фактически использует.
  • Нет крана для предварительного запуска: MonitorStep теперь паникует с unimplemented! и не должен отправляться.

CLMM

Price impact кусочный. В пределах текущего диапазона тиков воздействие примерно линейно по Δin / L. Пересечение границы тика может дискретно изменить L, вызывая скачок предельной цены. Сделка, пересекающая несколько разреженно заполненных тиков, может иметь гораздо большее воздействие, чем предполагает правило 2 · Δin / reserve. SDK CLMM котировка итеративно выполняет шаг swap детерминированно, возвращая точный ожидаемый amountOut, поэтому minAmountOut = amountOut · (1 − slippage) корректен. Но возвращаемое значение priceImpact следует интерпретировать как «спред между спот до сделки и спот после сделки», который на CLMM может быть намного больше, чем эффективный slippage для пользователя, который заботится только об amount_out.

Кривая LaunchLab

Похожа на CPMM, но с асимметричной кривой (квадратичной или виртуальных резервов). Воздействие растет быстрее для поздних покупателей, когда кривая крутеет к выпуску. UI для предварительных покупателей должны предупреждать, когда покупка, как ожидается, сдвинет кривую более чем на ~5% от quote_reserve_target в одной транзакции.

Соображения MEV

На Solana извлечение MEV против swaps в основном принимает форму sandwich attacks: бот размещает back-run транзакцию, которая торгует после вашей, плюс front-run, который торгует до, оба в одном слоте. Ваша сделка исполняется по худшей цене, чем была бы без sandwich; back-run захватывает разницу. Смягчение:
  1. Жесткий minAmountOut. Агрессивные границы slippage вызывают откат жертвы транзакции при сильном sandwich, защищая средства (но тратя газ). На Solana это стандартная практика — отклонение дешево.
  2. Jito bundles. Отправка через Jito с bundled tip исключает посредников из переупорядочивания вашей tx. Bundles приземляются как атомарные блоки.
  3. Priority fees. Высокий priority fee увеличивает вероятность того, что ваша сделка попадет в блок текущего лидера раньше, чем sandwicher сможет среагировать. Менее надежно, чем bundles, более стандартно.
  4. Private RPC. Отправка через private RPC (или через прямую конечную точку валидатора) сокращает окно, в течение которого mempool sandwicher может наблюдать вашу транзакцию.
SDK Raydium не использует bundling; интеграторы обычно накладывают Jito сверху. Смотрите integration-guides/routing-and-mev для паттернов.

Slippage для многоскачковых маршрутов

Когда swap маршрутизируется через несколько пулов (например USDC → SOL → RAY), допуск slippage должен применяться за скачок, а не только конец-в-конец:
Маршрутизатор SDK применяет границы за скачок автоматически, когда вы вызываете raydium.tradeV2.swap. (Фасад — tradeV2 — raydium.trade не существует.) Для пользовательских маршрутизаторов повторите паттерн.

Отчетность пользователям

Практические правила для хорошего UI swap:
  • Отображайте оба ожидаемый price impact и допуск slippage отдельно.
  • Выделяйте, когда price impact превышает ~2% — предупреждение «высокое воздействие».
  • Выделяйте, когда price impact превышает допуск — транзакция почти наверняка откатится.
  • Для волатильных пар предложите режим «высокий slippage», который ослабляет границу и показывает более сильное предупреждение.

Ссылки

Источники:
  • Реализация slippage / impact в Raydium SDK v2.
  • Flashbots / Jito на Solana MEV.