Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
CPI («cross-program invocation» — кросс-программный вызов) — это механизм, посредством которого одна программа Solana вызывает другую. Большинство программ Raydium поставляются с крейтами-обёртками Anchor CPI, которые делают место вызова похожим на типизированный вызов функции с структурами аккаунтов, имеющими проверенные имена полей и помощники
cpi::<ix>(). На этой странице один раз документируется общий паттерн, затем различия для каждой программы. Для работающих примеров на TypeScript см. страницу code-demos каждой главы продукта.Какой паттерн применяется к какой программе
Если вы интегрируете CPMM, CLMM или LaunchLab, сначала прочитайте общий паттерн, затем перейдите к разделу вашей программы для списка аккаунтов и любых различий. Farm v6 и AMM v4 достаточно отличаются, чтобы их разделы стоило читать отдельно.
Зависимости Cargo
branch = "master" отслеживает последний опубликованный исходный код; привяжитесь к конкретному rev = "<commit>", если вам нужна воспроизводимая сборка. Это рекомендуется после прототипирования, так как изменение макета аккаунта на master разломает вашу сборку без предупреждения.
Флаг функции cpi заставляет крейты компилироваться только в поверхность CPI (структуры аккаунтов + вызыватели) вместо полной программы, поэтому ваш бинарник остаётся маленьким.
anchor-lang / anchor-spl должны совпадать с тем, что привязывает целевой крейт, и по состоянию на 2026-09 два публичных крейта Raydium не согласны:
Для работающих примеров CPI, которые подключают структуры аккаунтов от начала до конца, см.
raydium-io/raydium-cpi-example (охватывает AMM v4, CPMM и CLMM). Его новейшая ветка — anchor-0.31.0 — ветки Anchor 1.x ещё нет, поэтому рассматривайте этот репо как справочник для подключения структур аккаунтов, а не для привязок версий, которые требует эта страница.
Общий паттерн Anchor CPI
Этот раздел проходит через CPMM от начала до конца как рабочий пример: структураAccounts, CpiContext, cpi::<ix>(). CLMM следует идентичной форме с другим списком аккаунтов и требованием оставшихся аккаунтов. LaunchLab следует той же механике, но его список аккаунтов содержит несколько аккаунтов без эквивалента в CPMM/CLMM (global_config, platform_config, event_authority, program), поэтому рассматривайте его как тот же паттерн, а не ту же форму. См. раздел каждой программы вместо предположения, что список аккаунтов из этого пошагового руководства переносится напрямую.
Построение списка аккаунтов
Каждый Raydium CPI требует структуруAccounts в вызывающей программе. Её поля — это любые аккаунты, которые нужны вашей инструкции, с валидаторами на уровне полей; их порядок объявления не должен совпадать с порядком аккаунтов инструкции самого Raydium, так как ваш собственный клиент, сгенерированный IDL, обращается к ним по имени, а не по позиции:
UncheckedAccount, потому что вызываемый (Raydium) владеет валидацией. Ваша вызывающая программа строго валидирует только аккаунты, которыми вы владеете, такие как пользовательские ATA и ваши собственные PDA. Комментарий /// CHECK: подавляет предупреждение Anchor об отсутствующих проверках. Единственное исключение на стороне Raydium — это сама cpmm_program: это вызываемая программа, а не аккаунт данных, который Raydium валидирует внутри, поэтому она типизирована как Program<T> и получает автоматическую проверку адреса Anchor вместо ручной /// CHECK:. Эта в основном UncheckedAccount форма, где Raydium валидирует свои собственные аккаунты, одинакова для CLMM и LaunchLab. Этот пример предполагает, что оба mint — это классический SPL Token; если любая сторона может быть mint Token-2022, добавьте поле token_program_2022: Program<'info, anchor_spl::token_2022::Token2022> и передайте его как input_token_program/output_token_program этой стороны в вызове CPI ниже вместо token_program.
Построение вызова CPI
Anchor генерирует один помощник на инструкцию вместе со структурой CPI-аккаунтов (cpi::accounts::Swap, ниже переименована в CpmmSwap). В отличие от вашей собственной структуры MyProxySwap выше, имена полей и порядок этой структуры фиксированы raydium-cp-swap’s собственным IDL и должны совпадать точно:
cpi::swap_base_input генерируется из IDL; его список аргументов отражает список аргументов инструкции Anchor. Каждая подтверждённая программа Raydium на основе Anchor (CPMM, CLMM, LaunchLab) генерирует свои помощники cpi::<ix>() одинаково, с именем функции, совпадающим с именем инструкции в snake_case. Распространяется ли это на Farm v6, неподтверждено; см. его раздел.
Signer seeds (CPI, подписанный PDA)
Когда ваша программа подписывает CPI от имени PDA (обычно для хранилищ, условных депозитов и т. д.), используйтеCpiContext::new_with_signer:
authority (или аналогичная роль подписанта), среда выполнения Solana проверяет, что PDA подписывает через эти seeds.
Оставшиеся аккаунты
Некоторые инструкции Raydium принимают оставшиеся аккаунты, список переменной длины, добавленный после фиксированных аккаунтов. Помощники CPI Anchor не проверяют типы оставшихся аккаунтов; передайте их через.with_remaining_accounts(...):
- CLMM
SwapV2: массивы тиков, упорядоченные по направлению. - Farm v6: пары
(reward_vault, user_reward_ata), но только со второго потока вознаграждения и далее; см. Farm v6 для того, что показывает декодирование реальной транзакции.
Применение паттерна: CLMM
SwapV2 следует общему паттерну выше с другим списком аккаунтов и требованием оставшихся аккаунтов для массивов тиков. Модуль #[program] крейта называется raydium_clmm, что также является его путём Rust use.
TickArrayNotFound (см. products/clmm/instructions для полной таблицы аккаунтов и списка ошибок). Передайте их в направлении прогулки цены: первый массив в направлении свопа первым.
Применение паттерна: LaunchLab
LaunchLab основан на Anchor и IDL опубликован:raydium_launchpad/raydium_launchpad.json в публичном репо raydium-idl. Внутренний идентификатор метаданных этого IDL — raydium_launchpad, техническое имя для базовой программы, а не альтернативное имя продукта. В отличие от CPMM и CLMM, однако, исходный код программы не доступен публично (см. reference/program-addresses). Нет git = "..." зависимости для указания Cargo, и нет исходного кода для подтверждения того, каким был бы реальный путь Rust use крейта.
Сгенерируйте привязки из опубликованного IDL, используя макрос declare_program! Anchor. Сохраните JSON IDL как idls/raydium_launchpad.json в вашем крейте (Cargo ищет директорию idls/ относительно CARGO_MANIFEST_DIR), затем declare_program!(raydium_launchpad); генерирует структуры raydium_launchpad::cpi::accounts::<Ix> и функции cpi::<ix>() прямо из IDL, без исходного кода программы. Сгенерированное имя структуры аккаунтов всегда имя инструкции в PascalCase (buy_exact_in → BuyExactIn), и имена полей совпадают с именами аккаунтов IDL точно, тот же список аккаунтов, уже используемый в MyProxyBuy ниже.
Форма CPI следует общему паттерну. Список аккаунтов и аргументы ниже поступают из инструкции buy_exact_in IDL на цепи, а не из products/launchlab/instructions.mdx:
pool_state.migrate_type, который products/launchlab/accounts.mdx говорит устанавливается во время Initialize. Ваш список аккаунтов CPI должен быть подготовлен для любого из них, или вам нужно сначала прочитать migrate_type из PoolState и разветвиться.
Распространение ошибок
Каждая программа Raydium на основе Anchor возвращает свой собственный enum ошибок; Anchor оборачивает их, поэтому ваша вызывающая программа видит их какErr(ProgramError::Custom(code)). Для обработки конкретных ошибок:
raydium_clmm::error::ErrorCode для CLMM и так далее). Номера кодов ошибок стабильны согласно политике IDL (sdk-api/anchor-idl), поэтому вы можете тестировать против конкретных кодов, сравнивая с числовым значением. Полные таблицы ошибок: CPMM, CLMM, AMM v4, Farm v6 и LaunchLab.
Бюджет вычислений в составных CPI
Каждый кадр CPI имеет накладные расходы, и собственное потребление CU вызываемого складывается поверх вашего, поэтому транзакция, которая вызывает Raydium изнутри вашей программы, требует явного бюджета вычислений вместо полагания на стандартный лимит 200k CU.Измеренный, а не оценённый. CPMM
swap_base_input на mainnet потребляет ~23,000 CU в самой программе CPMM — выборка от 2026-09-09 по восьми живым свопам на пуле с высоким объёмом (22,721–23,052), прочитано из строки логов Program CPMMoo8… consumed N of M compute units. Для сравнения: AMM v4 swap ~26,000; CLMM swap ~41,000; CLMM swap_v2 ~48,000 (43,838–52,887), растёт с каждым пересечением тика.Более ранняя версия этой страницы сообщала ~47,700 CU для CPI прокси-свопа. Эта цифра была всей транзакцией (computeUnitsConsumed), которая включает вашу собственную программу, кадр CPI и любую настройку ATA — не стоимость вызываемого. Обе полезны, но это не одно и то же число, поэтому сравнивайте подобное с подобным. Измерьте вашу собственную транзакцию вместо бюджетирования по числу из документации.remaining_accounts, добавляя CU за массив), но только цифра CPMM выше — это измеренное значение. Всегда устанавливайте явный лимит ComputeBudgetProgram::set_compute_unit_limit(...) размером из вашего собственного измерения, а не число, скопированное из документации, так как стандартный лимит 200k CU молча исчерпается и затраты на инструкцию смещаются по мере обновления программ.
AMM v4: ручное построение инструкции
AMM v4 предшествует Anchor и не имеет крейта CPI, что делает его единственной программой в этом документе, которая не следует общему паттерну выше. ПостройтеInstruction вручную:
products/amm-v4/code-demos для полного списка аккаунтов.
Farm v6
Используйте TS SDK, если это вариант для вашей интеграции.raydium.farm.deposit(...) (см. products/farm-staking/code-demos) используется реальными демонстрациями и не зависит от того, существует ли крейт Rust Anchor для этой программы.
Если вам всё же нужен Rust CPI, например при составлении из другой программы на цепи, постройте Instruction вручную, так же как AMM v4: выведите реальный список аккаунтов и дискриминаторы инструкций независимо, например декодируя макеты TypeScript SDK (raydium-sdk-V2’s farm модуль), декодируя реальные транзакции напрямую (см. ниже) или дампируя и дизассемблируя развёрнутую программу.
Для формы инструкции с нулевыми аргументами, согласованной с вызовом harvest или claim, реальный порядок аккаунтов — это фиксированный префикс (token_program, аккаунт состояния фермы, PDA авторитета хранилища, первое хранилище вознаграждения этого PDA, второй PDA, вызывающий и ATA вызывающего для этого первого mint вознаграждения), за которым следуют пары (reward_vault_i, user_reward_ata_i) в remaining_accounts для каждого потока вознаграждения после первого. Соглашение о парировании реально, но оно начинается только со второго потока вознаграждения: хранилище и ATA первого потока — это фиксированные аккаунты, а не соседние друг с другом и вообще не часть remaining_accounts.
Тестирование потока CPI
Локальная разработка требует, чтобы программы Raydium были доступны в вашем тестовом валидаторе. Три варианта:anchor testс клонированием программы. Вытягивает развёрнутый bytecode mainnet в ваш локальный валидатор; см. Клонирование программ в локальный валидатор ниже для конфигурацииAnchor.tomlи двух вещей, которые особенно запутывают тесты создания пула.- Devnet. Raydium развёртывает большинство программ на devnet, но с разными ID программ, чем mainnet для каждой программы (CPMM, CLMM, AMM v4, Stable AMM и LaunchLab каждый имеют отдельный адрес devnet; см. таблицу Devnet в
reference/program-addresses). Farm v3/v5/v6 не надёжно опубликованы на devnet; живой API (https://api-v3-devnet.raydium.io/main/info) имеет текущую картину. Если вы используете встроенные константыDEVNET_PROGRAM_IDraydium_clmm(или эквивалент для других крейтов), не предполагайте, что ID mainnet также работает на devnet. Запуститеanchor test --provider.cluster devnetдля попадания в живой код, когда у вас есть правильные адреса. - Локальное развёртывание. Клонируйте репо Raydium (CPMM, CLMM; исходный код LaunchLab недоступен для этого варианта) и
anchor deployв локальный валидатор. Добавляет накладные расходы цикла тестирования, но позволяет вам изменять вызываемого для отладки.
anchor test, или anchor build сначала и anchor test --skip-build после, если вы итерируете по файлу теста без изменения программы.
Клонирование программ в локальный валидатор
reference/program-addresses — это источник истины для каждого адреса здесь.
Указатели
products/cpmm/code-demos,products/clmm/code-demos,products/amm-v4/code-demos,products/farm-staking/code-demos,products/launchlab/code-demos: примеры CPI и TypeScript для каждого продукта.sdk-api/anchor-idl: получение IDL и регенерация клиента, включая путь IDL-codegen для LaunchLab.integration-guides/cpi-integration: паттерны интеграции более высокого уровня, такие как условные депозиты, хранилища и композиция агрегатора.
- raydium-cp-swap
- raydium-clmm
- raydium-idl: IDL LaunchLab (исходный код программы закрыт)
- Документация Anchor CPI

