Passando Contas Restantes
Encaminhe remaining_accounts para CPIs quando o chamado espera listas de contas variáveis (roteamento, oráculos, trocas multi-hop).
Busque em todas as páginas da documentação
Encaminhe remaining_accounts para CPIs quando o chamado espera listas de contas variáveis (roteamento, oráculos, trocas multi-hop).
let mut cpi_ctx = CpiContext::new(program, accounts);
cpi_ctx = cpi_ctx.with_remaining_accounts(
ctx.remaining_accounts.iter().map(|a| a.to_account_info()).collect(),
);Quando usar isso: O programa chamado documenta contas além do seu layout fixo de IDL.
use anchor_lang::prelude::*;
declare_program!(target);
pub const MAX_REMAINING: usize = 8;
#[error_code]
pub enum RelayError {
#[msg("Remaining account has unexpected owner")]
BadAccount,
#[msg("Too many remaining accounts")]
TooMany,
}
#[derive(Accounts)]
pub struct Relay<'info> {
pub admin: Signer<'info>,
pub target_program: Program<'info, target::program::Target>,
}
pub fn relay(ctx: Context<Relay>) -> Result<()> {
require!(
ctx.remaining_accounts.len() <= MAX_REMAINING,
RelayError::TooMany
);
for acc in ctx.remaining_accounts.iter() {
require_keys_eq!(*acc.owner, target::ID, RelayError::BadAccount);
}
let mut cpi_ctx = CpiContext::new(
ctx.accounts.target_program.to_account_info(),
target::cpi::accounts::Handle { admin: ctx.accounts.admin.to_account_info() },
);
cpi_ctx = cpi_ctx.with_remaining_accounts(ctx.remaining_accounts.to_vec());
target::cpi::handle(cpi_ctx)?;
Ok(())
}O que isso demonstra:
declare_programClientes anexam contas após as contas fixas da IDL nas metadados da transação. Incompatibilidade causa falha do chamado ou bugs de segurança.
Iterar grandes conjuntos restantes consome CU; limite a contagem com require!(len <= MAX).
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Struct de conta fixa | Layout conhecido | Roteadores dinâmicos |
| Metadados de conta nos dados da instrução | Padrões raros | remaining_accounts padrão |
Códigos personalizados na IDL mais strings #[msg].
emit_cpi! custa mais CU, mas melhora a confiabilidade da captura.
Evite, exceto atrás de flags de recursos.
Da IDL via Anchor ou geração de código Codama.
Sim, tipos #[event] são listados.
Sim, com @MyError::Variant.
Cada linha de log e string formatada.
anchor test esperando códigos de erro.
Sim, mas não um contrato de API; use eventos.
Veja Relacionados para CPIs restantes.
ctx.remaining_accountsVersões da Stack: Esta página foi escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, e LiteSVM 0.6.x.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026