Esta página foi traduzida automaticamente por IA. A versão em inglês é a fonte oficial.Ver versão em inglês →
CPI (“invocação entre programas”) é o mecanismo por meio do qual um programa Solana chama outro. Os programas Anchor do Raydium vêm com crates wrapper CPI que tornam o local da chamada semelhante a uma chamada de função tipada — structs de conta com nomes de campo validados e helpers
cpi::<ix>(). Esta página documenta o padrão geral; para trechos específicos de cada produto, consulte a página code-demos de cada capítulo de produto.Dependências Cargo
cpi faz os crates compilarem apenas a superfície CPI (structs de conta + invocadores) em vez do programa completo, mantendo seu binário pequeno.
Para exemplos CPI funcionais que conectam os structs de conta de ponta a ponta, veja raydium-io/raydium-cpi-example (cobre AMM v4, CPMM e CLMM).
Construção de lista de contas
Cada CPI do Raydium requer um structAccounts no programa chamador. Os campos correspondem à ordem de contas da instrução do programa 1-para-1, com validadores em nível de campo:
UncheckedAccount porque a função chamada (Raydium) é responsável pela validação. Seu programa chamador apenas valida estritamente contas que você possui — ATAs de usuário, seus próprios PDAs. O comentário /// CHECK: suprime o aviso do Anchor sobre verificações ausentes.
Construindo a chamada CPI
Anchor gera um helper por instrução:cpi::swap_base_input é gerado a partir do IDL; sua lista de argumentos espelha a lista de argumentos da instrução Anchor.
Seeds de assinante (CPI assinado por PDA)
Quando seu programa assina a CPI em nome de um PDA (comum para vaults, escrows, etc.), useCpiContext::new_with_signer:
authority (ou função de assinante similar), o runtime Solana verifica que o PDA assina por meio destas seeds.
Contas restantes
Algumas instruções Raydium usam contas restantes — uma lista de comprimento variável anexada após as contas fixas. Os exemplos canônicos:- CLMM
SwapV2: anexa 1–8 contasTickArrayStatecorrespondentes aos tick arrays que o swap pode atravessar. - Farm v6
Deposit: anexa pares(reward_vault, user_reward_ata)para cada stream de recompensa ativa.
.with_remaining_accounts(...):
Propagação de erros
Os programas do Raydium retornam seus próprios enums de erro. Anchor os envolve; seu programa chamador os vê comoErr(ProgramError::Custom(code)). Para tratar erros específicos:
sdk-api/anchor-idl). Você pode testar contra códigos específicos comparando com o valor numérico.
Orçamento de computação em CPIs compostos
Cada frame CPI tem overhead (~1.500 CU pela chamada em si), e o consumo CU próprio da função chamada se acumula sobre o seu. Uma transação que chama CPMM swap de dentro do seu programa gasta:ComputeBudgetProgram::set_compute_unit_limit(...) na transação — o limite padrão de 200k CU se esgotará silenciosamente.
AMM v4 — construção manual de Instruction
AMM v4 não possui crate Anchor. Construa aInstruction manualmente:
products/amm-v4/code-demos para a lista completa de contas.
Farm v6 — contas restantes de pares de recompensa
Farm v6’sDeposit / Withdraw / Harvest usam o padrão de par (reward_vault_i, user_reward_ata_i) em contas restantes. Sequência exata:
farm_state.reward_infos[i].reward_state.
Testando um fluxo CPI
O desenvolvimento local requer que os programas Raydium estejam disponíveis no seu test validator. Opções:-
anchor testcom program clone — emAnchor.toml:Isso extrai o bytecode implantado da mainnet para seu validador local. -
Devnet — Raydium implanta todos os programas na devnet com os mesmos IDs de programa que a mainnet. Execute
anchor test --provider.cluster devnetpara acessar o código ao vivo. -
Deploy local — clone os repos Raydium e
anchor deploypara um validador local. Adiciona overhead de ciclo de teste mas permite modificar a função chamada para debugging.
Referências
products/cpmm/code-demos,products/clmm/code-demos,products/amm-v4/code-demos,products/farm-staking/code-demos— exemplos CPI específicos do produto.sdk-api/anchor-idl— recuperação de IDL e regeneração de cliente.integration-guides/cpi-integration— padrões de nível superior: escrows, vaults, composição de agregador.

