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

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.

Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Задача агрегатора — предоставить пользователю лучшую возможную цену на множестве пулов, возможно распределив единый вход через несколько маршрутов пулов, и выполнить это атомарно. На этой странице описаны специфические для Raydium части этой работы: обнаружение пулов, получение котировок и сборка транзакций.

Обнаружение пулов

Инвентарь пулов

Вам нужен полный список активных пулов Raydium для каждого продукта. Три варианта:
  1. REST API (проще всего): GET https://api-v3.raydium.io/pools/info/list?poolType=all&pageSize=1000&page=1 возвращает пулы партиями по 1000. Пагинируйте, пока не получите все. Кэшируйте на 1–5 минут.
  2. Сканирование on-chain: getProgramAccounts на программах CPMM, CLMM и AMM v4, отфильтрованные по дискриминатору аккаунта состояния. Дает ~каждый активный пул за ~10 секунд RPC. Полезно, когда API недоступен или rate-limited.
  3. Гибридный подход: используйте API как основной источник; запускайте ежедневное сканирование on-chain как проверку целостности. Команда обязуется поддерживать API полным, но пулы, созданные прямым CPI (без фронтенда), иногда отстают.

Поиск по паре монет

Для конкретной пары (mintA, mintB) используйте GET /pools/info/mint?mint1=...&mint2=...&poolType=all&sort=liquidity. Возвращает каждый пул на любом уровне комиссии и типе продукта. До ~10 результатов на пару — обычное дело для часто используемых монет; сортируйте по TVL и возьмите несколько лучших для маршрутизации.

Получение котировок

Математика котировок отличается по продуктам. Используйте чистые математические функции SDK, чтобы не переImplementировать:
// CPMM
const cpmmQuote = raydium.cpmm.computeAmountOut({
  poolInfo: cpmmPool,
  amountIn,
  mintIn,
  mintOut,
  slippage: 0,        // compute exact expected; layer slippage at route level
});

// CLMM — crosses ticks; deterministic but more expensive.
// `computeAmountOutFormat` is the canonical helper exposed via `PoolUtils` in
// raydium-sdk-v2: the `*Format` suffix signals that it returns the output
// pre-shaped for transaction building (including `remainingAccounts` for tick arrays).
const { output: clmmOut, remainingAccounts } = PoolUtils.computeAmountOutFormat({
  poolInfo:  clmmPool,
  poolState: clmmPoolState,
  tickArrayCache,
  amountIn,
  tokenIn:   mintIn,
  slippage:  0,
});

// AMM v4
const ammV4Quote = raydium.liquidity.computeAmountOut({
  poolInfo: ammV4Pool,
  amountIn,
  mintIn: mintIn,
  mintOut: mintOut,
  slippage: 0,
});
Возвращаемые значения для всех трёх: { amountOut, fee, priceImpact, minAmountOut }. Для сравнения агрегаторов используйте amountOut (до slippage).

Свежесть кэша

Состояние пула устаревает быстро. Рекомендуемые целевые частоты обновления:
Тип пулаЧастота обновленияПричина
CPMM с <$100k TVL<10sРезервы меняются на каждой сделке.
CPMM с >$10M TVL30–60sРезервы доминирующие; малые сделки — шум.
CLMM<30sГраницы тиков; одна большая сделка может переконфигурировать ликвидность.
AMM v4<30sДвижения на стороне OpenBook не отражаются в vault’ах.
Для агрегатора, получающего котировки с интерактивной задержкой, подпишитесь на обновления WebSocket аккаунтов (accountSubscribe) для каждого релевантного состояния пула. Это переворачивает модель с polling на push.

Коррекции Token-2022

Если какой-либо mint в маршруте имеет комиссию за передачу Token-2022, математика котировки должна скорректировать входы и выходы согласно algorithms/token-2022-transfer-fees. SDK обрабатывает это, если poolInfo.mintA.extensions.transferFeeConfig заполнен. Проверьте поле .extensions перед доверием котировке.

Маршрутизация

Маршруты через один пул

Большинство маршрутов идут через один пул. Выберите пул с наибольшим amountOut. Если несколько близки по значению, разрешайте ничью по уровню комиссии (ниже лучше), затем по TVL (больше безопаснее).

Разделённая маршрутизация

Для больших сделок, где один пул имеет >5% ценового влияния, разделите по пулам. Простой жадный алгоритм:
remaining = amountIn
routes    = []
while remaining > 0:
    best_pool, best_size = argmax over pools of:
        marginal_out_per_in(pool, current_size_toward_pool + epsilon)
    size = min(remaining, best_pool.max_size_at_target_impact)
    routes.append((best_pool, size))
    remaining -= size
Это создает вектор маршрутизации [(pool_A, 0.6), (pool_B, 0.3), (pool_C, 0.1)], который минимизирует совокупное влияние. Надлежащее решение выпуклой оптимизации (например, уравнивание предельных цен по пулам) на практике находится в пределах ~1% от жадного результата.

Многопрыжковые маршруты

USDC → RAY → SOL через два отдельных пула обычен, когда ни один прямой пул USDC-SOL не дает хорошей котировки (редко). Применяйте границы slippage на каждом прыжке; каждый прыжок обеспечивает свой собственный minAmountOut. Смотрите algorithms/slippage-and-price-impact. Многопрыжок по одному пулу (например, два прыжка CLMM на SOL-USDC) всегда субоптимален в сравнении с одним прыжком — не генерируйте такие маршруты.

Сборка транзакций

Один прыжок, один пул

Используйте напрямую raydium.trade.swap из SDK:
const { execute } = await raydium.trade.swap({
  poolKeys:        poolInfo,
  amountIn,
  amountOut:       quote.minAmountOut,
  fixedSide:       "in",
  inputMint:       mintIn,
  txVersion:       TxVersion.V0,
  computeBudgetConfig: {
    units:         250_000,
    microLamports: priorityFee,
  },
});

Разделённые и многопрыжковые маршруты

Композируйте ATA + инструкции вручную. Шаблон:
[1] ComputeBudget set_compute_unit_limit
[2] ComputeBudget set_compute_unit_price
[3] createATA (если требуется, один раз на mint, который пользователь не держит)
[4..N] SwapInstruction для каждого (pool, size) в маршрутах
[N+1] CloseAccount (если вы оборачиваете/развораичваете SOL)
Всё в одной транзакции для атомарности. Для 3-пулового разделения на V0 с таблицами поиска адресов, это обычно вмещается в ~1100 байт. Для 4+ пулов, ограничение размера транзакции заставляет либо мультитранзакцию, либо консолидацию на mint-центре.

Атомарность

Агрегаторы должны гарантировать атомарность: либо весь маршрут выполняется, либо ничего. Инструкции swap Raydium реверт на ExceededSlippage, поэтому многопуловой маршрут, где один прыжок падает, вызывает откат всей транзакции. Бесплатно. Исключение: если ваш маршрут идёт через Raydium + сторонний DEX, убедитесь, что этот DEX также имеет модель revert-on-slippage. Некоторые программы игнорируют границы slippage (редко).

Подводные камни

1. Устаревшие котировки

Между тем, как пользователь видит “Вы получите 125.43 RAY” и приземлением транзакции, резервы могут сдвинуться. Переполучите состояние пула непосредственно перед отправкой; переквотируйте; если новая котировка на >1% хуже, пауза и переподтверждение с пользователем.

2. Чёрные списки пулов

Некоторые пулы Raydium — это токены мошенников с комиссиями передачи 99% или с не передаваемыми расширениями. REST API помечает их (см. поле tags); пропускайте любой пул, помеченный scam или honeypot. Запуск собственных проверок безопасности поверх тегов Raydium — благоразумно.

3. Требование observation-state на CLMM

CLMM SwapV2 принимает аккаунт observation_state. SDK заполняет его за вас; вручную построенные инструкции часто забывают, что вызывает откат программы с AccountNotFound. Всегда включайте его.

4. Таблицы поиска адресов

Raydium поддерживает публичные таблицы поиска для своих наиболее используемых аккаунтов (основные mint’ы, ID программ, AmmConfigs). Агрегаторы должны их потреблять — это экономит ~100 байт на транзакцию и позволяет большим маршрутам вмещаться в V0. Получение адресов LUT:
const raydiumLUTs = await raydium.getRaydiumLutAddresses();

5. Обработка перегрузки

Во время окон с высоким объёмом, транзакции могут сидеть в mempool несколько блоков. Агрессивный retry на TX expiry (не на revert — reverts детерминированы) рекомендуется. Опция sendAndConfirm SDK выполняет базовые retry’и; production-агрегаторы накладывают свою собственную логику (Jito bundles, мультиRPC трансляция) сверху.

Контрольный список

Перед запуском в production, проверьте:
  • Обнаружение пулов охватывает CPMM + CLMM + AMM v4 исчерпывающе.
  • Котировки совпадают с собственной котировкой Raydium UI в пределах 1 basis point на нескольких тестовых сделках.
  • Разделённая маршрутизация активируется для сделок >5% влияния на любом одном пуле.
  • Priority fees согласованы с недавними комиссиями pool-program (смотрите integration-guides/priority-fee-tuning).
  • Комиссии передачи Token-2022 вычислены и показаны пользователю.
  • Транзакции откатываются чисто при превышении slippage.
  • Логика retry различает tx expiry (retry) от revert (не retry).

Ссылки

Источники: