use solana_svm_callback::InvokeContextCallback;
#[cfg(feature = "precompiles")]
use {solana_address::Address, solana_precompile_error::PrecompileError};
use crate::{Svm, SvmTypesHost};
#[cfg(not(feature = "precompiles"))]
impl<T: SvmTypesHost> InvokeContextCallback for Svm<'_, T> {}
#[cfg(feature = "precompiles")]
impl<T: SvmTypesHost> InvokeContextCallback for Svm<'_, T> {
fn is_precompile(&self, program_id: &Address) -> bool {
self.precompiles
.get(program_id)
.is_some_and(|precompile| precompile.is_enabled(&self.version.feature_set))
}
fn process_precompile(
&self,
program_id: &Address,
data: &[u8],
instruction_data_slices: Vec<&[u8]>,
) -> Result<(), solana_precompile_error::PrecompileError> {
match self.precompiles.get(program_id) {
Some(precompile) if precompile.is_enabled(&self.version.feature_set) => {
precompile.verify(data, &instruction_data_slices, &self.version.feature_set)
}
_ => Err(PrecompileError::InvalidPublicKey),
}
}
}