use crate::instructions::program_ids::COMPUTE_BUDGET_PROGRAM_ID;
use crate::types::{Instruction, Pubkey};
pub enum ComputeBudgetInstruction {
RequestUnits {
units: u32,
additional_fee: u32,
},
RequestHeapFrame {
bytes: u32,
},
SetComputeUnitPrice {
micro_lamports: u64,
},
SetComputeUnitLimit {
units: u32,
},
}
impl ComputeBudgetInstruction {
pub fn serialize(&self) -> Vec<u8> {
let mut data = Vec::new();
match self {
Self::RequestUnits {
units,
additional_fee,
} => {
data.push(0);
data.extend_from_slice(&units.to_le_bytes());
data.extend_from_slice(&additional_fee.to_le_bytes());
}
Self::RequestHeapFrame { bytes } => {
data.push(1);
data.extend_from_slice(&bytes.to_le_bytes());
}
Self::SetComputeUnitPrice { micro_lamports } => {
data.push(2);
data.extend_from_slice(µ_lamports.to_le_bytes());
}
Self::SetComputeUnitLimit { units } => {
data.push(3);
data.extend_from_slice(&units.to_le_bytes());
}
}
data
}
}
pub fn request_units(units: u32, additional_fee: u32) -> Instruction {
Instruction {
program_id: Pubkey::from_base58(COMPUTE_BUDGET_PROGRAM_ID).unwrap(),
accounts: vec![],
data: ComputeBudgetInstruction::RequestUnits {
units,
additional_fee,
}
.serialize(),
}
}
pub fn request_heap_frame(bytes: u32) -> Instruction {
Instruction {
program_id: Pubkey::from_base58(COMPUTE_BUDGET_PROGRAM_ID).unwrap(),
accounts: vec![],
data: ComputeBudgetInstruction::RequestHeapFrame { bytes }.serialize(),
}
}
pub fn set_compute_unit_price(micro_lamports: u64) -> Instruction {
Instruction {
program_id: Pubkey::from_base58(COMPUTE_BUDGET_PROGRAM_ID).unwrap(),
accounts: vec![],
data: ComputeBudgetInstruction::SetComputeUnitPrice { micro_lamports }.serialize(),
}
}
pub fn set_compute_unit_limit(units: u32) -> Instruction {
Instruction {
program_id: Pubkey::from_base58(COMPUTE_BUDGET_PROGRAM_ID).unwrap(),
accounts: vec![],
data: ComputeBudgetInstruction::SetComputeUnitLimit { units }.serialize(),
}
}