Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
cpi::<ix>(). На этой странице один раз описан общий паттерн, затем различия для каждой программы. Для работающих примеров на TypeScript см. страницу code-demos каждого раздела продукта.
Какой паттерн применяется к какой программе
Если вы интегрируете CPMM, CLMM или LaunchLab, сначала прочитайте общий паттерн, затем перейдите к разделу вашей программы для списка аккаунтов и любых различий. Farm v6 и AMM v4 достаточно отличаются, чтобы их разделы стоило читать отдельно.
Зависимости Cargo
branch = "master" отслеживает последний опубликованный исходный код; закрепите конкретный rev = "<commit>", если вам нужна воспроизводимая сборка. Это рекомендуется после прототипирования, так как изменение макета аккаунта на master разломает вашу сборку без предупреждения.
Флаг функции cpi заставляет крейты компилироваться только в поверхность CPI (структуры аккаунтов + вызыватели), а не в полную программу, поэтому ваш бинарный файл остаётся маленьким.
anchor-lang / anchor-spl должны совпадать с тем, что закрепляет целевой крейт:
Для работающих примеров 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), поэтому рассматривайте его как тот же паттерн, а не ту же форму. См. раздел каждой программы, а не предполагайте, что список аккаунтов из этого пошагового руководства переносится напрямую.
Построение списка аккаунтов
Каждый CPI Raydium требует структуру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, не подтверждено; см. его раздел.
Seeds подписантов (CPI, подписанный PDA)
Когда ваша программа подписывает CPI от имени PDA (обычно для хранилищ, escrow и т. д.), используйте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.Измеренное, а не оценённое.
swap_base_input CPMM на 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: паттерны интеграции более высокого уровня, такие как escrow, хранилища и композиция агрегатора.
- raydium-cp-swap
- raydium-clmm
- raydium-idl: IDL LaunchLab (исходный код программы закрыт)
- Anchor CPI docs

