From b6ce2f0f47452ad9ff92b871a3f2283d6e774604 Mon Sep 17 00:00:00 2001 From: Joe Caulfield Date: Wed, 8 Oct 2025 02:38:51 +0000 Subject: [PATCH] harness: put precompile libs behind feature flag --- harness/Cargo.toml | 3 ++- harness/src/lib.rs | 21 ++++++++++++++++++++- harness/src/program.rs | 10 ++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/harness/Cargo.toml b/harness/Cargo.toml index 03302e7d..4ecc56c4 100644 --- a/harness/Cargo.toml +++ b/harness/Cargo.toml @@ -25,6 +25,7 @@ fuzz-fd = [ "dep:mollusk-svm-fuzz-fs", ] invocation-inspect-callback = [] +precompiles = ["dep:agave-precompiles"] serde = [ "dep:serde", "mollusk-svm-result/serde", @@ -32,7 +33,7 @@ serde = [ [dependencies] agave-feature-set = { workspace = true } -agave-precompiles = { workspace = true } +agave-precompiles = { workspace = true, optional = true } agave-syscalls = { workspace = true } bincode = { workspace = true } serde = { workspace = true, features = ["derive"], optional = true } diff --git a/harness/src/lib.rs b/harness/src/lib.rs index 4dde365b..b55aa8fb 100644 --- a/harness/src/lib.rs +++ b/harness/src/lib.rs @@ -452,6 +452,8 @@ pub mod sysvar; pub use mollusk_svm_result as result; #[cfg(any(feature = "fuzz", feature = "fuzz-fd"))] use mollusk_svm_result::Compare; +#[cfg(feature = "precompiles")] +use solana_precompile_error::PrecompileError; #[cfg(feature = "invocation-inspect-callback")] use solana_transaction_context::InstructionAccount; use { @@ -466,7 +468,6 @@ use { solana_compute_budget::compute_budget::ComputeBudget, solana_hash::Hash, solana_instruction::{AccountMeta, Instruction}, - solana_precompile_error::PrecompileError, solana_program_runtime::invoke_context::{EnvironmentConfig, InvokeContext}, solana_pubkey::Pubkey, solana_svm_callback::InvokeContextCallback, @@ -579,6 +580,7 @@ impl CheckContext for Mollusk { } struct MolluskInvokeContextCallback<'a> { + #[cfg_attr(not(feature = "precompiles"), allow(dead_code))] feature_set: &'a FeatureSet, epoch_stake: &'a EpochStake, } @@ -592,12 +594,19 @@ impl InvokeContextCallback for MolluskInvokeContextCallback<'_> { self.epoch_stake.get(vote_address).copied().unwrap_or(0) } + #[cfg(feature = "precompiles")] fn is_precompile(&self, program_id: &Pubkey) -> bool { agave_precompiles::is_precompile(program_id, |feature_id| { self.feature_set.is_active(feature_id) }) } + #[cfg(not(feature = "precompiles"))] + fn is_precompile(&self, _program_id: &Pubkey) -> bool { + false + } + + #[cfg(feature = "precompiles")] fn process_precompile( &self, program_id: &Pubkey, @@ -612,6 +621,16 @@ impl InvokeContextCallback for MolluskInvokeContextCallback<'_> { Err(PrecompileError::InvalidPublicKey) } } + + #[cfg(not(feature = "precompiles"))] + fn process_precompile( + &self, + _program_id: &Pubkey, + _data: &[u8], + _instruction_datas: Vec<&[u8]>, + ) -> Result<(), solana_precompile_error::PrecompileError> { + panic!("precompiles feature not enabled"); + } } impl Mollusk { diff --git a/harness/src/program.rs b/harness/src/program.rs index 7187b5c2..93c8f7ff 100644 --- a/harness/src/program.rs +++ b/harness/src/program.rs @@ -31,6 +31,7 @@ pub mod loader_keys { }; } +#[cfg(feature = "precompiles")] pub mod precompile_keys { use solana_pubkey::Pubkey; pub use solana_sdk_ids::{ @@ -46,6 +47,15 @@ pub mod precompile_keys { } } +#[cfg(not(feature = "precompiles"))] +pub mod precompile_keys { + use solana_pubkey::Pubkey; + + pub(crate) fn is_precompile(_program_id: &Pubkey) -> bool { + false + } +} + pub struct ProgramCache { cache: Rc>, // This stinks, but the `ProgramCacheForTxBatch` doesn't offer a way to