spl_instruction_padding/
processor.rs

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