use lazy_static::lazy_static; use solana_sdk::{ hash::{Hash, Hasher}, pubkey::Pubkey, }; use std::collections::{HashMap, HashSet}; pub mod instructions_sysvar_enabled { solana_sdk::declare_id!("EnvhHCLvg55P7PDtbvR1NwuTuAeodqpusV3MR5QEK8gs"); } pub mod secp256k1_program_enabled { solana_sdk::declare_id!("E3PHP7w8kB7np3CTQ1qQ2tW3KCtjRSXBQgW9vM2mWv2Y"); } lazy_static! { /// Map of feature identifiers to user-visible description pub static ref FEATURE_NAMES: HashMap = [ (instructions_sysvar_enabled::id(), "instructions sysvar"), (secp256k1_program_enabled::id(), "secp256k1 program") /*************** ADD NEW FEATURES HERE ***************/ ] .iter() .cloned() .collect(); /// Unique identifier of the current software's feature set pub static ref ID: Hash = { let mut hasher = Hasher::default(); let mut feature_ids = FEATURE_NAMES.keys().collect::>(); feature_ids.sort(); for feature in feature_ids { hasher.hash(feature.as_ref()); } hasher.result() }; } /// `FeatureSet` holds the set of currently active/inactive runtime features #[derive(AbiExample, Clone)] pub struct FeatureSet { pub active: HashSet, pub inactive: HashSet, } impl FeatureSet { pub fn is_active(&self, feature_id: &Pubkey) -> bool { self.active.contains(feature_id) } } impl Default for FeatureSet { fn default() -> Self { // All features disabled Self { active: HashSet::new(), inactive: FEATURE_NAMES.keys().cloned().collect(), } } } impl FeatureSet { pub fn enabled() -> Self { Self { active: FEATURE_NAMES.keys().cloned().collect(), inactive: HashSet::new(), } } }