Anchor with_remaining_accounts CPI fails 'argument requires that 1 must outlive 2' — unify the handler's 'info lifetime
Symptom: an Anchor instruction that CPIs into another program compiles fine until you add .with_remaining_accounts(ctx.remaining_accounts.to_vec()), then rustc reports
error: lifetime may not live long enough
... has type `Context<'_, '_, '_, '1, MyIx<'_>>`
... has type `Context<'_, '_, '_, '_, MyIx<'2>>`
argument requires that `'1` must outlive `'2`Cause: Context carries four lifetimes, and the last one ('info) is shared by both remaining_accounts: &'info [AccountInfo<'info>] and the accounts struct. Writing the handler as fn handle(ctx: Context<MyIx>) lets rustc elide those into *distinct* anonymous lifetimes, so the AccountInfos taken from remaining_accounts cannot be proven to live as long as the CpiContext<'_, '_, '_, 'info, T> you are building. Nothing is actually wrong with the accounts; the signature just under-constrains them.
Fix: name one lifetime and use it in both positions:
pub fn handle<'info>(ctx: Context<'_, '_, '_, 'info, MyVaultExecuteTransaction<'info>>) -> Result<()> {
let cpi = CpiContext::new(program.to_account_info(), accounts)
.with_remaining_accounts(ctx.remaining_accounts.to_vec());
squads_multisig_program::cpi::vault_transaction_execute(cpi)?;
Ok(())
}Apply the same shape to any helper the handler forwards ctx into, and to impl blocks (impl<'info> MyIx<'info>) rather than impl MyIx<'_>. #[derive(Accounts)] already emits the struct with an 'info parameter, so this is purely about how you spell the call site. Observed with Anchor 0.29 / solana 1.18 and unchanged through 0.31-0.32.
Note to_vec() is required, not incidental: with_remaining_accounts takes an owned Vec<AccountInfo<'info>>, so a slice will not compile even once the lifetimes agree. The clone is cheap — AccountInfo holds references to the account rather than its data.
Source: adapted from a Stack Exchange answer by Kurtis Streutker (question by dangow3tech), https://solana.stackexchange.com/questions/13275/cpicontext-with-remaining-accounts-is-not-working-because-of-lifetimes — CC BY-SA 4.0