solana_program/
instruction.rs#[cfg(feature = "frozen-abi")]
use solana_frozen_abi_macro::AbiExample;
pub use solana_instruction::{
error::InstructionError, AccountMeta, Instruction, ProcessedSiblingInstruction,
TRANSACTION_LEVEL_STACK_HEIGHT,
};
use {
bincode::serialize, serde::Serialize, solana_pubkey::Pubkey, solana_sanitize::Sanitize,
solana_short_vec as short_vec,
};
#[cfg_attr(feature = "frozen-abi", derive(AbiExample))]
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
#[serde(rename_all = "camelCase")]
pub struct CompiledInstruction {
pub program_id_index: u8,
#[serde(with = "short_vec")]
pub accounts: Vec<u8>,
#[serde(with = "short_vec")]
pub data: Vec<u8>,
}
impl Sanitize for CompiledInstruction {}
impl CompiledInstruction {
pub fn new<T: Serialize>(program_ids_index: u8, data: &T, accounts: Vec<u8>) -> Self {
let data = serialize(data).unwrap();
Self {
program_id_index: program_ids_index,
accounts,
data,
}
}
pub fn new_from_raw_parts(program_id_index: u8, data: Vec<u8>, accounts: Vec<u8>) -> Self {
Self {
program_id_index,
accounts,
data,
}
}
pub fn program_id<'a>(&self, program_ids: &'a [Pubkey]) -> &'a Pubkey {
&program_ids[self.program_id_index as usize]
}
}
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)
}