pinocchio_token/instructions/
initialize_account_2.rs1use core::slice::from_raw_parts;
2
3use solana_account_view::AccountView;
4use solana_address::Address;
5use solana_instruction_view::{cpi::invoke, InstructionAccount, InstructionView};
6use solana_program_error::ProgramResult;
7
8use crate::{write_bytes, UNINIT_BYTE};
9
10pub struct InitializeAccount2<'a> {
17 pub account: &'a AccountView,
19 pub mint: &'a AccountView,
21 pub rent_sysvar: &'a AccountView,
23 pub owner: &'a Address,
25}
26
27impl InitializeAccount2<'_> {
28 #[inline(always)]
29 pub fn invoke(&self) -> ProgramResult {
30 let instruction_accounts: [InstructionAccount; 3] = [
32 InstructionAccount::writable(self.account.address()),
33 InstructionAccount::readonly(self.mint.address()),
34 InstructionAccount::readonly(self.rent_sysvar.address()),
35 ];
36
37 let mut instruction_data = [UNINIT_BYTE; 33];
41
42 write_bytes(&mut instruction_data, &[16]);
44 write_bytes(&mut instruction_data[1..], self.owner.as_array());
46
47 let instruction = InstructionView {
48 program_id: &crate::ID,
49 accounts: &instruction_accounts,
50 data: unsafe { from_raw_parts(instruction_data.as_ptr() as _, 33) },
51 };
52
53 invoke(&instruction, &[self.account, self.mint, self.rent_sysvar])
54 }
55}