#[cfg(feature = "serde")]
use serde_derive::{Deserialize, Serialize};
#[cfg(feature = "frozen-abi")]
use solana_frozen_abi_macro::AbiExample;
#[cfg(feature = "wincode")]
use wincode::{containers, len::ShortU16, SchemaRead, SchemaWrite};
use {solana_address::Address, solana_sanitize::Sanitize};
#[cfg_attr(feature = "frozen-abi", derive(AbiExample))]
#[cfg_attr(
feature = "serde",
derive(Deserialize, Serialize),
serde(rename_all = "camelCase")
)]
#[cfg_attr(feature = "wincode", derive(SchemaWrite, SchemaRead))]
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct CompiledInstruction {
pub program_id_index: u8,
#[cfg_attr(feature = "serde", serde(with = "solana_short_vec"))]
#[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16>"))]
pub accounts: Vec<u8>,
#[cfg_attr(feature = "serde", serde(with = "solana_short_vec"))]
#[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16>"))]
pub data: Vec<u8>,
}
impl Sanitize for CompiledInstruction {}
impl CompiledInstruction {
#[cfg(feature = "wincode")]
pub fn new<T: wincode::Serialize<Src = T>>(
program_ids_index: u8,
data: &T,
accounts: Vec<u8>,
) -> Self {
let data = wincode::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, tx_accounts: &'a [Address]) -> &'a Address {
&tx_accounts[self.program_id_index as usize]
}
}