spl_instruction_padding/
processor.rs1use {
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}