diff --git a/programs/bpf/rust/instruction_introspection/src/lib.rs b/programs/bpf/rust/instruction_introspection/src/lib.rs index cf3a0685808c91..88a22c649098b3 100644 --- a/programs/bpf/rust/instruction_introspection/src/lib.rs +++ b/programs/bpf/rust/instruction_introspection/src/lib.rs @@ -3,13 +3,14 @@ extern crate solana_program; use solana_program::{ account_info::next_account_info, account_info::AccountInfo, entrypoint, - entrypoint::ProgramResult, msg, program_error::ProgramError, pubkey::Pubkey, + entrypoint::ProgramResult, msg, program::invoke, program_error::ProgramError, pubkey::Pubkey, sysvar::instructions, + instruction::{Instruction,AccountMeta}, }; entrypoint!(process_instruction); fn process_instruction( - _program_id: &Pubkey, + program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8], ) -> ProgramResult { @@ -41,5 +42,19 @@ fn process_instruction( msg!(&format!("data[0]: {}", instruction.data[0])); msg!(&format!("index: {}", current_instruction)); + + if instruction_data.len() == 2 { + // CPI ourself with the same arguments to confirm the instructions sysvar reports the same + // results from within a CPI + invoke( + &Instruction::new_with_bytes( + *program_id, + &[instruction_data[0], instruction_data[1], 1], + vec![AccountMeta::new_readonly(instructions::id(), false)], + ), + &[instruction_accounts.clone()], + )?; + } + Ok(()) }