spl_instruction_padding/
processor.rs1use {
2 crate::instruction::{PadInstruction, WrapData},
3 miraland_program::{
4 account_info::AccountInfo,
5 entrypoint::ProgramResult,
6 instruction::{AccountMeta, Instruction},
7 program::invoke,
8 program_error::ProgramError,
9 pubkey::Pubkey,
10 },
11 std::convert::TryInto,
12};
13
14pub fn process(
15 _program_id: &Pubkey,
16 account_infos: &[AccountInfo],
17 instruction_data: &[u8],
18) -> ProgramResult {
19 let (tag, rest) = instruction_data
20 .split_first()
21 .ok_or(ProgramError::InvalidInstructionData)?;
22 match (*tag)
23 .try_into()
24 .map_err(|_| ProgramError::InvalidInstructionData)?
25 {
26 PadInstruction::Noop => Ok(()),
27 PadInstruction::Wrap => {
28 let WrapData {
29 num_accounts,
30 instruction_size,
31 instruction_data,
32 } = WrapData::unpack(rest)?;
33 let mut data = Vec::with_capacity(instruction_size as usize);
34 data.extend_from_slice(instruction_data);
35
36 let program_id = *account_infos[num_accounts as usize].key;
37
38 let accounts = account_infos
39 .iter()
40 .take(num_accounts as usize)
41 .map(|a| AccountMeta {
42 pubkey: *a.key,
43 is_signer: a.is_signer,
44 is_writable: a.is_writable,
45 })
46 .collect::<Vec<_>>();
47
48 let instruction = Instruction {
49 program_id,
50 accounts,
51 data,
52 };
53
54 invoke(&instruction, &account_infos[..num_accounts as usize])
55 }
56 }
57}