Перейти к основному содержанию

Documentation Index

Fetch the complete documentation index at: https://docs.raydium.io/llms.txt

Use this file to discover all available pages before exploring further.

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

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

Ценовой импакт и слиппедж часто путают в UI, но это разные вещи.
  • Ценовой импакт — детерминированное свойство сделки при конкретном состоянии пула. Зная (Δin, reserves), ценовой импакт можно полностью вычислить ещё до подачи сделки.
  • Слиппедж — фактическая разница между ценой, которую вы ожидали на момент котировки, и ценой, которую вы получили при исполнении. Это функция задержки, конкурирующих транзакций и порядка включения блока — а не математики пула.
Котировка 1% против свободного пула имеет 0% слиппеджа, если попадает в следующий блок; этот 1% — ценовой импакт. Та же котировка исполнится на 0.2% хуже, если кто-то торговал в пулу перед вами — это дополнительные 0.2% — слиппедж.

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

Ценовой импакт

p_before = pool.spot_price()
p_after  = pool.spot_price_if_trade(Δin) applied
impact   = (p_before − p_after) / p_before       // может быть со знаком
Для CPMM: impact ≈ 2 · Δin / reserve_in при маленьких сделках. Для CLMM: зависит от того, сколько тиков пересекает сделка; часто плоский внутри текущего диапазона тиков, скачкообразный при переходе.

Реализованный слиппедж

quoted_out = amount_out вычислен в момент котировки
actual_out = amount_out наблюдается на цепи
slippage   = (quoted_out − actual_out) / quoted_out
Слиппедж всегда неотрицательный (или ноль), если котировка была честной. Отрицательное значение означало бы, что вы получили больше, чем котировано — возможно, если состояние пула сдвинулось в вашу пользу между котировкой и исполнением.

Расчёт minAmountOut и maxAmountIn

Каждый swap в Raydium имеет защиту от слиппеджа:
  • SwapBaseInput(amount_in, min_amount_out) — точный ввод, нижняя граница выхода.
  • SwapBaseOutput(max_amount_in, amount_out) — точный вывод, верхняя граница входа.
SDK вычисляет это так:
const computed = raydium.<pool_type>.computeAmountOut({
  poolInfo,
  amountIn,
  mintIn,
  mintOut,
  slippage: 0.005,     // 0.5% допуска
});

// computed.amountOut         — ожидаемая котировка
// computed.minAmountOut      — amountOut × (1 − slippage), используется как граница на цепи
// computed.priceImpact       — детерминированный, только состояние пула
// computed.fee               — общая комиссия (все компоненты суммированы)
Толерантность слиппеджа — это буфер вокруг ценового импакта, не сам ценовой импакт. Толерантность 0.5% означает «принять максимум 0.5% хуже, чем моя котировка» — независимо от того, был ли ценовой импакт 0.01% (крошечная сделка) или 2% (большая сделка). Для сделки с 2% ценовым импактом и 0.5% толерантностью minAmountOut будет на 2.5% ниже спот-цены до сделки — по сути сумма импакта и толерантности.

Рекомендуемые толерантности слиппеджа

Нет единого правильного числа; правильная граница зависит от:
  1. Стабильность пары. Пулы stablecoin-stablecoin могут безопасно использовать 0.1%. Волатильные мем-пулы часто требуют 3–5% просто для надёжного исполнения.
  2. Размер сделки. Более крупные сделки имеют больший ценовой импакт, поэтому толерантность должна масштабироваться с ним, чтобы избежать отката. По этой причине автоматический слиппедж SDK по умолчанию примерно max(0.5%, 2 × price_impact).
  3. Задержка включения в блок. Транзакции, ожидающие в мемпуле несколько блоков, подвержены большему количеству конкурирующих сделок. Jito bundles и приоритетные комиссии это снижают.
Практические правила (значения по умолчанию в Raydium UI):
Тип парыТолерантность по умолчанию
Stablecoin-stablecoin (USDC-USDT, USDC-USDS)0.1%
Stablecoin-мажор (USDC-SOL, USDC-BTC)0.5%
Мажор-мажор (SOL-BTC, SOL-ETH)1%
Волатильные (мем-токены, илликвидные)3–5%

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

CPMM

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

AMM v4

Та же кривая, что и CPMM, но «эффективные резервы» включают размещённые в OpenBook лимит-ордера пула. На практике это означает:
  • Котировка с использованием сырых балансов vault недооценивает резервы и поэтому переоценивает импакт.
  • SDK получает AmmInfo и суммирует vault + on_book.free + on_book.locked для правильного числа.
  • Устаревшее состояние OpenBook (заблокированная краник) может вызвать расхождение между котируемым импактом и цепочкой. Агрегаторы регулярно предварительно запускают краник (permissionless MonitorStep) перед большой сделкой AMM-v4.

CLMM

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

LaunchLab curve

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

MEV-соображения

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

Слиппедж для много-хоповых маршрутов

Когда своп маршрутизируется через несколько пулов (например USDC → SOL → RAY), толерантность слиппеджа должна применяться за каждый хоп, не просто конец-в-конец:
// Плохо: 0.5% применён только в конце, поэтому любой промежуточный хоп разрушит второй хоп.
const finalMin = finalAmount * (1 - 0.005);

// Лучше: каждый хоп обеспечивает свою границу.
const hop1Min  = hop1Amount * (1 - 0.005);
const hop2Min  = hop2Amount * (1 - 0.005);
// Конец-в-конец это жёстче (составной), но атомарный — если какой-либо хоп ухудшается, транзакция откатывается рано.
Маршрутизатор SDK применяет границы за каждый хоп автоматически, когда вы вызываете raydium.trade.swap. Для пользовательских маршрутизаторов повторите шаблон.

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

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

Ссылки

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