I am trying to transfer 0.1 SOL from the signer account to all the accounts passed in the remaining_accounts to the function call. Here's a breakdown of the code.
anchor
pub fn purchase_package(ctx: Context<PurchasePackage>) -> Result<()> {
let total_amount: u64 = ctx.accounts.user.to_account_info().lamports();
let LAMPORTS_PER_SOL: u64 = 1_000_000_000; // Number of lamports in one SOL
let transfer_amount: u64 = LAMPORTS_PER_SOL / 10; // 0.1 SOL in lamports
for i in 0..ctx.remaining_accounts.len() {
let account_info: &AccountInfo = &ctx.remaining_accounts[i];
if !account_info.is_writable || account_info.is_signer {
return Err(ErrorCode::InvalidAccount.into());
}
let transfer_instruction = system_instruction::transfer(
&ctx.accounts.user.key(),
account_info.key,
transfer_amount,
);
// Use a more explicit invocation pattern
invoke(
&transfer_instruction,
&[
ctx.accounts.user.to_account_info(),
account_info.clone(), // Cloning here to get a new reference
],
)?;
distributed_amount += transfer_amount;
}
Ok(())
}
The Javascript to call this function:
const response = await program.methods.purchasePackage().accounts({
user: wallet.publicKey,
systemProgram: SystemProgram.programId,
lpWallet: lpWallet,
})
.signers([wallet.payer])
.remainingAccounts(referralChainArray.map((referral) => ({
pubkey: referral,
isWritable: true,
isSigner: false
})))
When I build the anchor contract, I get error saying:
ctx.accounts.user.to_account_info()
^^^^^^^^^^^^^^^^^^^^^^argument requires that `'2` must outlive `'1`
I also tried passing the clone() of the account, but the error still persists.