solana_compute_budget_interface/
lib.rs#![cfg_attr(docsrs, feature(doc_auto_cfg))]
#![cfg_attr(feature = "frozen-abi", feature(min_specialization))]
#[cfg(feature = "borsh")]
use borsh::{BorshDeserialize, BorshSerialize};
use solana_instruction::Instruction;
pub use solana_sdk_ids::compute_budget::{check_id, id, ID};
#[cfg_attr(
feature = "frozen-abi",
derive(
solana_frozen_abi_macro::AbiExample,
solana_frozen_abi_macro::AbiEnumVisitor
)
)]
#[cfg_attr(feature = "borsh", derive(BorshSerialize, BorshDeserialize))]
#[cfg_attr(
feature = "serde",
derive(serde_derive::Deserialize, serde_derive::Serialize)
)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum ComputeBudgetInstruction {
Unused, RequestHeapFrame(u32),
SetComputeUnitLimit(u32),
SetComputeUnitPrice(u64),
SetLoadedAccountsDataSizeLimit(u32),
}
macro_rules! to_instruction {
($discriminator: expr, $num: expr, $num_type: ty) => {{
let mut data = [0u8; size_of::<$num_type>() + 1];
data[0] = $discriminator;
data[1..].copy_from_slice(&$num.to_le_bytes());
Instruction {
program_id: id(),
data: data.to_vec(),
accounts: vec![],
}
}};
}
impl ComputeBudgetInstruction {
pub fn request_heap_frame(bytes: u32) -> Instruction {
to_instruction!(1, bytes, u32)
}
pub fn set_compute_unit_limit(units: u32) -> Instruction {
to_instruction!(2, units, u32)
}
pub fn set_compute_unit_price(micro_lamports: u64) -> Instruction {
to_instruction!(3, micro_lamports, u64)
}
#[cfg(feature = "dev-context-only-utils")]
pub fn pack(self) -> Result<Vec<u8>, borsh::io::Error> {
borsh::to_vec(&self)
}
pub fn set_loaded_accounts_data_size_limit(bytes: u32) -> Instruction {
to_instruction!(4, bytes, u32)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_to_instruction() {
let ix = ComputeBudgetInstruction::set_compute_unit_limit(257);
assert_eq!(ix.data, vec![2, 1, 1, 0, 0]);
let ix = ComputeBudgetInstruction::set_compute_unit_price(u64::MAX);
assert_eq!(ix.data, vec![3, 255, 255, 255, 255, 255, 255, 255, 255]);
}
}