for warrior_card_usage_ai in &ctx.remaining_accounts[0..warrior_cards_usage_len] { if warrior_card_usage_ai.data_is_empty() { msg!("creating warrior card usage account"); let rent_lamports = rent.minimum_balance(warrior_card_usage_data_len); let cpi_accounts = CreateAccount { from: ctx.accounts.payer.to_account_info(), to: (*warrior_card_usage_ai).clone(), }; let cpi_context = CpiContext::new( ctx.accounts.system_program.to_account_info(), cpi_accounts ); msg!("Expected data length: {}", warrior_card_usage_data_len); msg!("Minimum rent: {}", rent_lamports); create_account( cpi_context, rent_lamports, u64::try_from(warrior_card_usage_data_len).unwrap(), ctx.program_id )?; } let warrior_cards_usage: Account<WarriorCardsUsage> = Account::try_from(warrior_card_usage_ai)?; warrior_cards_usages.push(warrior_cards_usage); }
That is my test code
let [warriorCardsUsageTracker] = PublicKey.findProgramAddressSync( [ attacker.publicKey.toBuffer(), remainingAccountsMock[2].pubkey.toBuffer(), Buffer.from("warritor_cards_usage_tracker"), ], program.programId );
and pass it as remain account. but get FAy8Uq39nNtspAtnATYj4b543HjrVb9zTdKeYho5pqUZ's signer privilege escalated