From 49c14571d5538211094ea3dddf8654288265f4f1 Mon Sep 17 00:00:00 2001 From: Michael Vines Date: Mon, 11 Oct 2021 16:31:17 -0700 Subject: [PATCH] Add test to ensure instructions sysvar behaves as expected from within a CPI --- .../rust/instruction_introspection/src/lib.rs | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/programs/bpf/rust/instruction_introspection/src/lib.rs b/programs/bpf/rust/instruction_introspection/src/lib.rs index cf3a0685808c91..6e20f732564e07 100644 --- a/programs/bpf/rust/instruction_introspection/src/lib.rs +++ b/programs/bpf/rust/instruction_introspection/src/lib.rs @@ -2,14 +2,21 @@ extern crate solana_program; use solana_program::{ - account_info::next_account_info, account_info::AccountInfo, entrypoint, - entrypoint::ProgramResult, msg, program_error::ProgramError, pubkey::Pubkey, + account_info::next_account_info, + account_info::AccountInfo, + entrypoint, + entrypoint::ProgramResult, + instruction::{AccountMeta, Instruction}, + msg, + program::invoke, + program_error::ProgramError, + pubkey::Pubkey, sysvar::instructions, }; entrypoint!(process_instruction); fn process_instruction( - _program_id: &Pubkey, + program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8], ) -> ProgramResult { @@ -41,5 +48,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(()) }