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

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

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

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

Источник: src/cpmm/createCpmmPool.ts
Несколько вещей, которые SDK делает автоматически:
  • Сортирует mint в порядок 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 выводит парную сумму из текущих резервов пула, увеличивает каждую сторону на проскальзывание для аргументов maximum_* инструкции и создает ATA при необходимости. raydium.cpmm.computePairAmount({ ... }) возвращает те же числа, если вам нужны они для предпросмотра UI.

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

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

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

Источник: src/cpmm/collectCreatorFee.ts, src/cpmm/collectAllCreatorFee.ts Сбор комиссий протокола и фонда остаётся под контролем прав доступа. Комиссии создателя имеют два пути: подписанная создателем инструкция CollectCreatorFee и дополнительная CollectCreatorFeePermissionless, которую может вызвать любой плательщик, но которая может переводить средства только на канонические ATA создателя. В версии 0.2.64-alpha добавлены построители уровня модуля для обоих путей создателя:
Обе инструкции создателя изменили списки аккаунтов при обновлении программы 2026-09-19. Каждая теперь принимает PDA creator_fee_share по адресу ["creator_fee_share", creator, ammConfig], а версия без прав доступа также принимает amm_config — оба добавлены после system_program вместо вставки, поэтому аккаунты, которые уже были там, сохраняют свои позиции. Построитель, привязанный к версии SDK, предшествующей обновлению, выдаёт более короткий список, и транзакция отклоняется из-за отсутствия аккаунтов. Убедитесь, что установленная вами версия содержит новые аккаунты перед использованием этих помощников с обновлённой программой, и обновите IDL, если вы генерируете клиентов из него.Передача PDA обязательна даже когда он никогда не был создан — выведите его и передайте; программа использует AmmConfig.creator_fee_share_rate когда аккаунт пуст.
Две инструкции создателя имеют разные дискриминаторы и макеты аккаунтов — версия без прав доступа заменяет подписывающего создателя на отдельного payer и неподписывающего creator. Используйте соответствующий построитель вместо ручного обмена аккаунтами в другом.В SDK нет построителя для комиссий протокола или фонда (makeCollectProtocolFeeInstruction и makeCollectFundFeeInstruction не существуют ни под каким именем) — это пути администратора, как и CreateCreatorFeeShare / CloseCreatorFeeShare, которые также не имеют построителя. Низкоуровневые построители инструкций, которые существуют, это collectCpFeeInstruction, makeCollectCreatorFeeInstruction и collectCreatorFeePermissionlessInInstruction.
Вне цепи вы можете читать накопленные комиссии прямо из PoolState:

Скелет Rust CPI

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

Типичные ошибки

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

Что дальше

Источники: