Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Информация о версии. Все примеры на TypeScript используют @raydium-io/raydium-sdk-v2@0.2.42-alpha на Solana mainnet-beta, проверено в апреле 2026 г. Скелет Rust CPI использует raydium-cp-swap на ветке master, Anchor 0.30.x. Идентификаторы программ загружаются из констант в reference/program-addresses.

Предварительные требования

Каждый пример на этой странице соответствует файлу в raydium-sdk-V2-demo/src/cpmm; ссылка на GitHub находится рядом с каждым разделом. Инициализация следует шаблону config.ts.template из репозитория демонстраций (источник):
Экземпляр Raydium — это фасад SDK. Каждый пример ниже использует его. Он лениво загружает списки токенов и конфигурации комиссий из api-v3.raydium.io; вы можете инициализировать его собственными данными в автономных окружениях.

Создание пула CPMM

Источник: src/cpmm/createCpmmPool.ts
Несколько вещей, которые SDK делает автоматически:
  • Сортирует монеты в порядок token0/token1 перед выведением PDA.
  • Платит одноразовую create_pool_fee на poolFeeAccount.
  • Создает связанные токен-счета вызывающей стороны, если они отсутствуют.
  • Выбирает правильную программу токенов (SPL Token или Token-2022) для каждой стороны.
После подтверждения вы можете получить состояние активного пула с помощью:

Своп (base-input)

Источник: src/cpmm/swap.ts
Примечание: SDK всегда повторно загружает состояние пула из RPC внутри getPoolInfoFromRpc. Не используйте котировку из api-v3.raydium.io для транзакции, которую вы собираетесь подписать — котировка, которая на один блок устарела, может привести к ExceededSlippage при посадке.

Своп (base-output)

Источник: src/cpmm/swapBaseOut.ts

Депозит ликвидности

Источник: src/cpmm/deposit.ts
SDK преобразует lpAmount в needed_token_0 и needed_token_1, используя текущие резервы пула, увеличивает каждый на 1 + slippage для аргументов maximum_* инструкции и создает ATA при необходимости.

Вывод ликвидности

Источник: src/cpmm/withdraw.ts

Сбор комиссий протокола/фонда/создателя

Источник: src/cpmm/collectCreatorFee.ts, src/cpmm/collectAllCreatorFee.ts Сбор протокола и фонда остается защищенным полномочиями. Комиссии создателя имеют два пути: существующий подписанный создателем CollectCreatorFee и дополнительный CollectCreatorFeePermissionless, который может вызвать любой плательщик, но который может передавать только на канонические ATA создателя. Закрепленный SDK предоставляет существующие сырые построители:
@raydium-io/raydium-sdk-v2@0.2.42-alpha еще не предоставляет построитель для CollectCreatorFeePermissionless. До выпуска SDK, который его добавит, создавайте из обновленного IDL CPMM или вызывайте программу напрямую. Не переиспользуйте makeCollectCreatorFeeInstruction: новая инструкция имеет другой дискриминатор и заменяет позиции подписывающего создателя / amm_config на отдельные payer и неподписывающие creator счета.
Вне цепи вы можете читать накопленные комиссии непосредственно из PoolState:

Скелет Rust CPI

Если вы хотите вызвать CPMM из собственной программы Anchor — например, хранилища, которое выполняет своп от имени своих вкладчиков — контекст CPI выглядит так. Порядок счетов следует products/cpmm/instructions.
Если ваш CPI подписывает как PDA (например, вы управляете хранилищем от имени вкладчиков), замените CpiContext::new на CpiContext::new_with_signer и передайте ваши семена.

Распространенные ошибки

Краткий контрольный список перед открытием тикета поддержки:
  • Отсортированные монеты. Если ваш выведенный PDA poolState не совпадает с пулом в цепи, вы, вероятно, забыли отсортировать монеты.
  • Устаревшая котировка API. Никогда не передавайте значение резерва из api-v3.raydium.io в CurveCalculator.swap. Загружайте из RPC.
  • Неправильная программа токенов. Хранилище монеты Token-2022 принадлежит программе Token-2022, а не SPL Token. Всегда используйте поля token_0_program / token_1_program пула.
  • Slippage недостаточно для монет с комиссией за передачу. Если одна из сторон пула — это монета Token-2022 с комиссией за передачу, ваш minimum_amount_out должен быть номинирован в том, что пользователь фактически получает, а не в том, что отправляет хранилище.
  • NotApproved при своп. Проверьте PoolState.status — администратор может приостановить своп на этом пуле. См. products/cpmm/instructions для маски статуса.

Что дальше

Источники: