spl_instruction_padding/
processor.rs

1use {
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}