pub use {
crate::message::compiled_instruction::CompiledInstruction,
solana_instruction::{
error::InstructionError, AccountMeta, Instruction, ProcessedSiblingInstruction,
TRANSACTION_LEVEL_STACK_HEIGHT,
},
};
pub fn get_processed_sibling_instruction(index: usize) -> Option<Instruction> {
#[cfg(target_os = "solana")]
{
let mut meta = ProcessedSiblingInstruction::default();
let mut program_id = solana_pubkey::Pubkey::default();
if 1 == unsafe {
solana_instruction::syscalls::sol_get_processed_sibling_instruction(
index as u64,
&mut meta,
&mut program_id,
&mut u8::default(),
&mut AccountMeta::default(),
)
} {
let mut data = Vec::new();
let mut accounts = Vec::new();
data.resize_with(meta.data_len as usize, u8::default);
accounts.resize_with(meta.accounts_len as usize, AccountMeta::default);
let _ = unsafe {
solana_instruction::syscalls::sol_get_processed_sibling_instruction(
index as u64,
&mut meta,
&mut program_id,
data.as_mut_ptr(),
accounts.as_mut_ptr(),
)
};
Some(Instruction::new_with_bytes(program_id, &data, accounts))
} else {
None
}
}
#[cfg(not(target_os = "solana"))]
crate::program_stubs::sol_get_processed_sibling_instruction(index)
}
pub fn get_stack_height() -> usize {
#[cfg(target_os = "solana")]
unsafe {
solana_instruction::syscalls::sol_get_stack_height() as usize
}
#[cfg(not(target_os = "solana"))]
{
crate::program_stubs::sol_get_stack_height() as usize
}
}
#[doc(hidden)]
pub fn checked_add(a: u64, b: u64) -> Result<u64, InstructionError> {
a.checked_add(b).ok_or(InstructionError::InsufficientFunds)
}