agave_feature_set/
lib.rs

1#![cfg_attr(
2    not(feature = "agave-unstable-api"),
3    deprecated(
4        since = "3.1.0",
5        note = "This crate has been marked for formal inclusion in the Agave Unstable API. From \
6                v4.0.0 onward, the `agave-unstable-api` crate feature must be specified to \
7                acknowledge use of an interface that may break without warning."
8    )
9)]
10#![cfg_attr(feature = "frozen-abi", feature(min_specialization))]
11
12use {
13    ahash::{AHashMap, AHashSet},
14    solana_epoch_schedule::EpochSchedule,
15    solana_hash::Hash,
16    solana_pubkey::Pubkey,
17    solana_sha256_hasher::Hasher,
18    solana_svm_feature_set::SVMFeatureSet,
19    std::sync::LazyLock,
20};
21
22#[cfg_attr(feature = "frozen-abi", derive(solana_frozen_abi_macro::AbiExample))]
23#[derive(Debug, Clone, Eq, PartialEq)]
24pub struct FeatureSet {
25    active: AHashMap<Pubkey, u64>,
26    inactive: AHashSet<Pubkey>,
27}
28
29impl Default for FeatureSet {
30    fn default() -> Self {
31        Self {
32            // All features disabled
33            active: AHashMap::new(),
34            inactive: AHashSet::from_iter((*FEATURE_NAMES).keys().cloned()),
35        }
36    }
37}
38
39impl FeatureSet {
40    pub fn new(active: AHashMap<Pubkey, u64>, inactive: AHashSet<Pubkey>) -> Self {
41        Self { active, inactive }
42    }
43
44    pub fn active(&self) -> &AHashMap<Pubkey, u64> {
45        &self.active
46    }
47
48    pub fn active_mut(&mut self) -> &mut AHashMap<Pubkey, u64> {
49        &mut self.active
50    }
51
52    pub fn inactive(&self) -> &AHashSet<Pubkey> {
53        &self.inactive
54    }
55
56    pub fn inactive_mut(&mut self) -> &mut AHashSet<Pubkey> {
57        &mut self.inactive
58    }
59
60    pub fn is_active(&self, feature_id: &Pubkey) -> bool {
61        self.active.contains_key(feature_id)
62    }
63
64    pub fn activated_slot(&self, feature_id: &Pubkey) -> Option<u64> {
65        self.active.get(feature_id).copied()
66    }
67
68    /// Activate a feature
69    pub fn activate(&mut self, feature_id: &Pubkey, slot: u64) {
70        self.inactive.remove(feature_id);
71        self.active.insert(*feature_id, slot);
72    }
73
74    /// Deactivate a feature
75    pub fn deactivate(&mut self, feature_id: &Pubkey) {
76        self.active.remove(feature_id);
77        self.inactive.insert(*feature_id);
78    }
79
80    /// List of enabled features that trigger full inflation
81    pub fn full_inflation_features_enabled(&self) -> AHashSet<Pubkey> {
82        let mut hash_set = FULL_INFLATION_FEATURE_PAIRS
83            .iter()
84            .filter_map(|pair| {
85                if self.is_active(&pair.vote_id) && self.is_active(&pair.enable_id) {
86                    Some(pair.enable_id)
87                } else {
88                    None
89                }
90            })
91            .collect::<AHashSet<_>>();
92
93        if self.is_active(&full_inflation::devnet_and_testnet::id()) {
94            hash_set.insert(full_inflation::devnet_and_testnet::id());
95        }
96        hash_set
97    }
98
99    /// All features enabled, useful for testing
100    pub fn all_enabled() -> Self {
101        Self {
102            active: AHashMap::from_iter((*FEATURE_NAMES).keys().cloned().map(|key| (key, 0))),
103            inactive: AHashSet::new(),
104        }
105    }
106
107    pub fn new_warmup_cooldown_rate_epoch(&self, epoch_schedule: &EpochSchedule) -> Option<u64> {
108        self.activated_slot(&reduce_stake_warmup_cooldown::id())
109            .map(|slot| epoch_schedule.get_epoch(slot))
110    }
111
112    pub fn runtime_features(&self) -> SVMFeatureSet {
113        SVMFeatureSet {
114            move_precompile_verification_to_svm: self
115                .is_active(&move_precompile_verification_to_svm::id()),
116            stricter_abi_and_runtime_constraints: self
117                .is_active(&stricter_abi_and_runtime_constraints::id()),
118            account_data_direct_mapping: self.is_active(&account_data_direct_mapping::id()),
119            enable_bpf_loader_set_authority_checked_ix: self
120                .is_active(&enable_bpf_loader_set_authority_checked_ix::id()),
121            enable_loader_v4: self.is_active(&enable_loader_v4::id()),
122            deplete_cu_meter_on_vm_failure: self.is_active(&deplete_cu_meter_on_vm_failure::id()),
123            abort_on_invalid_curve: self.is_active(&abort_on_invalid_curve::id()),
124            blake3_syscall_enabled: self.is_active(&blake3_syscall_enabled::id()),
125            curve25519_syscall_enabled: self.is_active(&curve25519_syscall_enabled::id()),
126            disable_deploy_of_alloc_free_syscall: self
127                .is_active(&disable_deploy_of_alloc_free_syscall::id()),
128            disable_fees_sysvar: self.is_active(&disable_fees_sysvar::id()),
129            disable_sbpf_v0_execution: self.is_active(&disable_sbpf_v0_execution::id()),
130            enable_alt_bn128_compression_syscall: self
131                .is_active(&enable_alt_bn128_compression_syscall::id()),
132            enable_alt_bn128_syscall: self.is_active(&enable_alt_bn128_syscall::id()),
133            enable_big_mod_exp_syscall: self.is_active(&enable_big_mod_exp_syscall::id()),
134            enable_get_epoch_stake_syscall: self.is_active(&enable_get_epoch_stake_syscall::id()),
135            enable_poseidon_syscall: self.is_active(&enable_poseidon_syscall::id()),
136            enable_sbpf_v1_deployment_and_execution: self
137                .is_active(&enable_sbpf_v1_deployment_and_execution::id()),
138            enable_sbpf_v2_deployment_and_execution: self
139                .is_active(&enable_sbpf_v2_deployment_and_execution::id()),
140            enable_sbpf_v3_deployment_and_execution: self
141                .is_active(&enable_sbpf_v3_deployment_and_execution::id()),
142            get_sysvar_syscall_enabled: self.is_active(&get_sysvar_syscall_enabled::id()),
143            last_restart_slot_sysvar: self.is_active(&last_restart_slot_sysvar::id()),
144            reenable_sbpf_v0_execution: self.is_active(&reenable_sbpf_v0_execution::id()),
145            remaining_compute_units_syscall_enabled: self
146                .is_active(&remaining_compute_units_syscall_enabled::id()),
147            remove_bpf_loader_incorrect_program_id: self
148                .is_active(&remove_bpf_loader_incorrect_program_id::id()),
149            move_stake_and_move_lamports_ixs: self
150                .is_active(&move_stake_and_move_lamports_ixs::id()),
151            stake_raise_minimum_delegation_to_1_sol: self
152                .is_active(&stake_raise_minimum_delegation_to_1_sol::id()),
153            deprecate_legacy_vote_ixs: self.is_active(&deprecate_legacy_vote_ixs::id()),
154            mask_out_rent_epoch_in_vm_serialization: self
155                .is_active(&mask_out_rent_epoch_in_vm_serialization::id()),
156            simplify_alt_bn128_syscall_error_codes: self
157                .is_active(&simplify_alt_bn128_syscall_error_codes::id()),
158            fix_alt_bn128_multiplication_input_length: self
159                .is_active(&fix_alt_bn128_multiplication_input_length::id()),
160            increase_tx_account_lock_limit: self.is_active(&increase_tx_account_lock_limit::id()),
161            enable_extend_program_checked: self.is_active(&enable_extend_program_checked::id()),
162            formalize_loaded_transaction_data_size: self
163                .is_active(&formalize_loaded_transaction_data_size::id()),
164            disable_zk_elgamal_proof_program: self
165                .is_active(&disable_zk_elgamal_proof_program::id()),
166            reenable_zk_elgamal_proof_program: self
167                .is_active(&reenable_zk_elgamal_proof_program::id()),
168            raise_cpi_nesting_limit_to_8: self.is_active(&raise_cpi_nesting_limit_to_8::id()),
169            provide_instruction_data_offset_in_vm_r2: self
170                .is_active(&provide_instruction_data_offset_in_vm_r2::id()),
171            increase_cpi_account_info_limit: self.is_active(&increase_cpi_account_info_limit::id()),
172            vote_state_v4: self.is_active(&vote_state_v4::id()),
173            poseidon_enforce_padding: self.is_active(&poseidon_enforce_padding::id()),
174            fix_alt_bn128_pairing_length_check: self
175                .is_active(&fix_alt_bn128_pairing_length_check::id()),
176        }
177    }
178}
179
180pub mod deprecate_rewards_sysvar {
181    solana_pubkey::declare_id!("GaBtBJvmS4Arjj5W1NmFcyvPjsHN38UGYDq2MDwbs9Qu");
182}
183
184pub mod pico_inflation {
185    solana_pubkey::declare_id!("4RWNif6C2WCNiKVW7otP4G7dkmkHGyKQWRpuZ1pxKU5m");
186}
187
188pub mod full_inflation {
189    pub mod devnet_and_testnet {
190        solana_pubkey::declare_id!("DT4n6ABDqs6w4bnfwrXT9rsprcPf6cdDga1egctaPkLC");
191    }
192
193    pub mod mainnet {
194        pub mod certusone {
195            pub mod vote {
196                solana_pubkey::declare_id!("BzBBveUDymEYoYzcMWNQCx3cd4jQs7puaVFHLtsbB6fm");
197            }
198            pub mod enable {
199                solana_pubkey::declare_id!("7XRJcS5Ud5vxGB54JbK9N2vBZVwnwdBNeJW1ibRgD9gx");
200            }
201        }
202    }
203}
204
205pub mod secp256k1_program_enabled {
206    solana_pubkey::declare_id!("E3PHP7w8kB7np3CTQ1qQ2tW3KCtjRSXBQgW9vM2mWv2Y");
207}
208
209pub mod spl_token_v2_multisig_fix {
210    solana_pubkey::declare_id!("E5JiFDQCwyC6QfT9REFyMpfK2mHcmv1GUDySU1Ue7TYv");
211}
212
213pub mod no_overflow_rent_distribution {
214    solana_pubkey::declare_id!("4kpdyrcj5jS47CZb2oJGfVxjYbsMm2Kx97gFyZrxxwXz");
215}
216
217pub mod filter_stake_delegation_accounts {
218    solana_pubkey::declare_id!("GE7fRxmW46K6EmCD9AMZSbnaJ2e3LfqCZzdHi9hmYAgi");
219}
220
221pub mod require_custodian_for_locked_stake_authorize {
222    solana_pubkey::declare_id!("D4jsDcXaqdW8tDAWn8H4R25Cdns2YwLneujSL1zvjW6R");
223}
224
225pub mod spl_token_v2_self_transfer_fix {
226    solana_pubkey::declare_id!("BL99GYhdjjcv6ys22C9wPgn2aTVERDbPHHo4NbS3hgp7");
227}
228
229pub mod warp_timestamp_again {
230    solana_pubkey::declare_id!("GvDsGDkH5gyzwpDhxNixx8vtx1kwYHH13RiNAPw27zXb");
231}
232
233pub mod check_init_vote_data {
234    solana_pubkey::declare_id!("3ccR6QpxGYsAbWyfevEtBNGfWV4xBffxRj2tD6A9i39F");
235}
236
237pub mod secp256k1_recover_syscall_enabled {
238    solana_pubkey::declare_id!("6RvdSWHh8oh72Dp7wMTS2DBkf3fRPtChfNrAo3cZZoXJ");
239}
240
241pub mod system_transfer_zero_check {
242    solana_pubkey::declare_id!("BrTR9hzw4WBGFP65AJMbpAo64DcA3U6jdPSga9fMV5cS");
243}
244
245pub mod blake3_syscall_enabled {
246    solana_pubkey::declare_id!("HTW2pSyErTj4BV6KBM9NZ9VBUJVxt7sacNWcf76wtzb3");
247}
248
249pub mod dedupe_config_program_signers {
250    solana_pubkey::declare_id!("8kEuAshXLsgkUEdcFVLqrjCGGHVWFW99ZZpxvAzzMtBp");
251}
252
253pub mod verify_tx_signatures_len {
254    solana_pubkey::declare_id!("EVW9B5xD9FFK7vw1SBARwMA4s5eRo5eKJdKpsBikzKBz");
255}
256
257pub mod vote_stake_checked_instructions {
258    solana_pubkey::declare_id!("BcWknVcgvonN8sL4HE4XFuEVgfcee5MwxWPAgP6ZV89X");
259}
260
261pub mod rent_for_sysvars {
262    solana_pubkey::declare_id!("BKCPBQQBZqggVnFso5nQ8rQ4RwwogYwjuUt9biBjxwNF");
263}
264
265pub mod libsecp256k1_0_5_upgrade_enabled {
266    solana_pubkey::declare_id!("DhsYfRjxfnh2g7HKJYSzT79r74Afa1wbHkAgHndrA1oy");
267}
268
269pub mod tx_wide_compute_cap {
270    solana_pubkey::declare_id!("5ekBxc8itEnPv4NzGJtr8BVVQLNMQuLMNQQj7pHoLNZ9");
271}
272
273pub mod spl_token_v2_set_authority_fix {
274    solana_pubkey::declare_id!("FToKNBYyiF4ky9s8WsmLBXHCht17Ek7RXaLZGHzzQhJ1");
275}
276
277pub mod merge_nonce_error_into_system_error {
278    solana_pubkey::declare_id!("21AWDosvp3pBamFW91KB35pNoaoZVTM7ess8nr2nt53B");
279}
280
281pub mod disable_fees_sysvar {
282    solana_pubkey::declare_id!("JAN1trEUEtZjgXYzNBYHU9DYd7GnThhXfFP7SzPXkPsG");
283}
284
285pub mod stake_merge_with_unmatched_credits_observed {
286    solana_pubkey::declare_id!("meRgp4ArRPhD3KtCY9c5yAf2med7mBLsjKTPeVUHqBL");
287}
288
289pub mod zk_token_sdk_enabled {
290    solana_pubkey::declare_id!("zk1snxsc6Fh3wsGNbbHAJNHiJoYgF29mMnTSusGx5EJ");
291}
292
293pub mod curve25519_syscall_enabled {
294    solana_pubkey::declare_id!("7rcw5UtqgDTBBv2EcynNfYckgdAaH1MAsCjKgXMkN7Ri");
295}
296
297pub mod curve25519_restrict_msm_length {
298    solana_pubkey::declare_id!("eca6zf6JJRjQsYYPkBHF3N32MTzur4n2WL4QiiacPCL");
299}
300
301pub mod versioned_tx_message_enabled {
302    solana_pubkey::declare_id!("3KZZ6Ks1885aGBQ45fwRcPXVBCtzUvxhUTkwKMR41Tca");
303}
304
305pub mod libsecp256k1_fail_on_bad_count {
306    solana_pubkey::declare_id!("8aXvSuopd1PUj7UhehfXJRg6619RHp8ZvwTyyJHdUYsj");
307}
308
309pub mod libsecp256k1_fail_on_bad_count2 {
310    solana_pubkey::declare_id!("54KAoNiUERNoWWUhTWWwXgym94gzoXFVnHyQwPA18V9A");
311}
312
313pub mod instructions_sysvar_owned_by_sysvar {
314    solana_pubkey::declare_id!("H3kBSaKdeiUsyHmeHqjJYNc27jesXZ6zWj3zWkowQbkV");
315}
316
317pub mod stake_program_advance_activating_credits_observed {
318    solana_pubkey::declare_id!("SAdVFw3RZvzbo6DvySbSdBnHN4gkzSTH9dSxesyKKPj");
319}
320
321pub mod credits_auto_rewind {
322    solana_pubkey::declare_id!("BUS12ciZ5gCoFafUHWW8qaFMMtwFQGVxjsDheWLdqBE2");
323}
324
325pub mod demote_program_write_locks {
326    solana_pubkey::declare_id!("3E3jV7v9VcdJL8iYZUMax9DiDno8j7EWUVbhm9RtShj2");
327}
328
329pub mod ed25519_program_enabled {
330    solana_pubkey::declare_id!("6ppMXNYLhVd7GcsZ5uV11wQEW7spppiMVfqQv5SXhDpX");
331}
332
333pub mod return_data_syscall_enabled {
334    solana_pubkey::declare_id!("DwScAzPUjuv65TMbDnFY7AgwmotzWy3xpEJMXM3hZFaB");
335}
336
337pub mod reduce_required_deploy_balance {
338    solana_pubkey::declare_id!("EBeznQDjcPG8491sFsKZYBi5S5jTVXMpAKNDJMQPS2kq");
339}
340
341pub mod sol_log_data_syscall_enabled {
342    solana_pubkey::declare_id!("6uaHcKPGUy4J7emLBgUTeufhJdiwhngW6a1R9B7c2ob9");
343}
344
345pub mod stakes_remove_delegation_if_inactive {
346    solana_pubkey::declare_id!("HFpdDDNQjvcXnXKec697HDDsyk6tFoWS2o8fkxuhQZpL");
347}
348
349pub mod do_support_realloc {
350    solana_pubkey::declare_id!("75m6ysz33AfLA5DDEzWM1obBrnPQRSsdVQ2nRmc8Vuu1");
351}
352
353pub mod prevent_calling_precompiles_as_programs {
354    solana_pubkey::declare_id!("4ApgRX3ud6p7LNMJmsuaAcZY5HWctGPr5obAsjB3A54d");
355}
356
357pub mod optimize_epoch_boundary_updates {
358    solana_pubkey::declare_id!("265hPS8k8xJ37ot82KEgjRunsUp5w4n4Q4VwwiN9i9ps");
359}
360
361pub mod remove_native_loader {
362    solana_pubkey::declare_id!("HTTgmruMYRZEntyL3EdCDdnS6e4D5wRq1FA7kQsb66qq");
363}
364
365pub mod send_to_tpu_vote_port {
366    solana_pubkey::declare_id!("C5fh68nJ7uyKAuYZg2x9sEQ5YrVf3dkW6oojNBSc3Jvo");
367}
368
369pub mod requestable_heap_size {
370    solana_pubkey::declare_id!("CCu4boMmfLuqcmfTLPHQiUo22ZdUsXjgzPAURYaWt1Bw");
371}
372
373pub mod disable_fee_calculator {
374    solana_pubkey::declare_id!("2jXx2yDmGysmBKfKYNgLj2DQyAQv6mMk2BPh4eSbyB4H");
375}
376
377pub mod add_compute_budget_program {
378    solana_pubkey::declare_id!("4d5AKtxoh93Dwm1vHXUU3iRATuMndx1c431KgT2td52r");
379}
380
381pub mod nonce_must_be_writable {
382    solana_pubkey::declare_id!("BiCU7M5w8ZCMykVSyhZ7Q3m2SWoR2qrEQ86ERcDX77ME");
383}
384
385pub mod spl_token_v3_3_0_release {
386    solana_pubkey::declare_id!("Ftok2jhqAqxUWEiCVRrfRs9DPppWP8cgTB7NQNKL88mS");
387}
388
389pub mod leave_nonce_on_success {
390    solana_pubkey::declare_id!("E8MkiWZNNPGU6n55jkGzyj8ghUmjCHRmDFdYYFYHxWhQ");
391}
392
393pub mod reject_empty_instruction_without_program {
394    solana_pubkey::declare_id!("9kdtFSrXHQg3hKkbXkQ6trJ3Ja1xpJ22CTFSNAciEwmL");
395}
396
397pub mod fixed_memcpy_nonoverlapping_check {
398    solana_pubkey::declare_id!("36PRUK2Dz6HWYdG9SpjeAsF5F3KxnFCakA2BZMbtMhSb");
399}
400
401pub mod reject_non_rent_exempt_vote_withdraws {
402    solana_pubkey::declare_id!("7txXZZD6Um59YoLMF7XUNimbMjsqsWhc7g2EniiTrmp1");
403}
404
405pub mod evict_invalid_stakes_cache_entries {
406    solana_pubkey::declare_id!("EMX9Q7TVFAmQ9V1CggAkhMzhXSg8ECp7fHrWQX2G1chf");
407}
408
409pub mod allow_votes_to_directly_update_vote_state {
410    solana_pubkey::declare_id!("Ff8b1fBeB86q8cjq47ZhsQLgv5EkHu3G1C99zjUfAzrq");
411}
412
413pub mod max_tx_account_locks {
414    solana_pubkey::declare_id!("CBkDroRDqm8HwHe6ak9cguPjUomrASEkfmxEaZ5CNNxz");
415}
416
417pub mod require_rent_exempt_accounts {
418    solana_pubkey::declare_id!("BkFDxiJQWZXGTZaJQxH7wVEHkAmwCgSEVkrvswFfRJPD");
419}
420
421pub mod filter_votes_outside_slot_hashes {
422    solana_pubkey::declare_id!("3gtZPqvPpsbXZVCx6hceMfWxtsmrjMzmg8C7PLKSxS2d");
423}
424
425pub mod update_syscall_base_costs {
426    solana_pubkey::declare_id!("2h63t332mGCCsWK2nqqqHhN4U9ayyqhLVFvczznHDoTZ");
427}
428
429pub mod stake_deactivate_delinquent_instruction {
430    solana_pubkey::declare_id!("437r62HoAdUb63amq3D7ENnBLDhHT2xY8eFkLJYVKK4x");
431}
432
433pub mod vote_withdraw_authority_may_change_authorized_voter {
434    solana_pubkey::declare_id!("AVZS3ZsN4gi6Rkx2QUibYuSJG3S6QHib7xCYhG6vGJxU");
435}
436
437pub mod spl_associated_token_account_v1_0_4 {
438    solana_pubkey::declare_id!("FaTa4SpiaSNH44PGC4z8bnGVTkSRYaWvrBs3KTu8XQQq");
439}
440
441pub mod reject_vote_account_close_unless_zero_credit_epoch {
442    solana_pubkey::declare_id!("ALBk3EWdeAg2WAGf6GPDUf1nynyNqCdEVmgouG7rpuCj");
443}
444
445pub mod add_get_processed_sibling_instruction_syscall {
446    solana_pubkey::declare_id!("CFK1hRCNy8JJuAAY8Pb2GjLFNdCThS2qwZNe3izzBMgn");
447}
448
449pub mod bank_transaction_count_fix {
450    solana_pubkey::declare_id!("Vo5siZ442SaZBKPXNocthiXysNviW4UYPwRFggmbgAp");
451}
452
453pub mod disable_bpf_deprecated_load_instructions {
454    solana_pubkey::declare_id!("3XgNukcZWf9o3HdA3fpJbm94XFc4qpvTXc8h1wxYwiPi");
455}
456
457pub mod disable_bpf_unresolved_symbols_at_runtime {
458    solana_pubkey::declare_id!("4yuaYAj2jGMGTh1sSmi4G2eFscsDq8qjugJXZoBN6YEa");
459}
460
461pub mod record_instruction_in_transaction_context_push {
462    solana_pubkey::declare_id!("3aJdcZqxoLpSBxgeYGjPwaYS1zzcByxUDqJkbzWAH1Zb");
463}
464
465pub mod syscall_saturated_math {
466    solana_pubkey::declare_id!("HyrbKftCdJ5CrUfEti6x26Cj7rZLNe32weugk7tLcWb8");
467}
468
469pub mod check_physical_overlapping {
470    solana_pubkey::declare_id!("nWBqjr3gpETbiaVj3CBJ3HFC5TMdnJDGt21hnvSTvVZ");
471}
472
473pub mod limit_secp256k1_recovery_id {
474    solana_pubkey::declare_id!("7g9EUwj4j7CS21Yx1wvgWLjSZeh5aPq8x9kpoPwXM8n8");
475}
476
477pub mod disable_deprecated_loader {
478    solana_pubkey::declare_id!("GTUMCZ8LTNxVfxdrw7ZsDFTxXb7TutYkzJnFwinpE6dg");
479}
480
481pub mod check_slice_translation_size {
482    solana_pubkey::declare_id!("GmC19j9qLn2RFk5NduX6QXaDhVpGncVVBzyM8e9WMz2F");
483}
484
485pub mod stake_split_uses_rent_sysvar {
486    solana_pubkey::declare_id!("FQnc7U4koHqWgRvFaBJjZnV8VPg6L6wWK33yJeDp4yvV");
487}
488
489pub mod add_get_minimum_delegation_instruction_to_stake_program {
490    solana_pubkey::declare_id!("St8k9dVXP97xT6faW24YmRSYConLbhsMJA4TJTBLmMT");
491}
492
493pub mod error_on_syscall_bpf_function_hash_collisions {
494    solana_pubkey::declare_id!("8199Q2gMD2kwgfopK5qqVWuDbegLgpuFUFHCcUJQDN8b");
495}
496
497pub mod reject_callx_r10 {
498    solana_pubkey::declare_id!("3NKRSwpySNwD3TvP5pHnRmkAQRsdkXWRr1WaQh8p4PWX");
499}
500
501pub mod drop_redundant_turbine_path {
502    solana_pubkey::declare_id!("4Di3y24QFLt5QEUPZtbnjyfQKfm6ZMTfa6Dw1psfoMKU");
503}
504
505pub mod executables_incur_cpi_data_cost {
506    solana_pubkey::declare_id!("7GUcYgq4tVtaqNCKT3dho9r4665Qp5TxCZ27Qgjx3829");
507}
508
509pub mod fix_recent_blockhashes {
510    solana_pubkey::declare_id!("6iyggb5MTcsvdcugX7bEKbHV8c6jdLbpHwkncrgLMhfo");
511}
512
513pub mod update_rewards_from_cached_accounts {
514    solana_pubkey::declare_id!("28s7i3htzhahXQKqmS2ExzbEoUypg9krwvtK2M9UWXh9");
515}
516
517pub mod partitioned_epoch_rewards_superfeature {
518    solana_pubkey::declare_id!("PERzQrt5gBD1XEe2c9XdFWqwgHY3mr7cYWbm5V772V8");
519}
520
521pub mod spl_token_v3_4_0 {
522    solana_pubkey::declare_id!("Ftok4njE8b7tDffYkC5bAbCaQv5sL6jispYrprzatUwN");
523}
524
525pub mod spl_associated_token_account_v1_1_0 {
526    solana_pubkey::declare_id!("FaTa17gVKoqbh38HcfiQonPsAaQViyDCCSg71AubYZw8");
527}
528
529pub mod default_units_per_instruction {
530    solana_pubkey::declare_id!("J2QdYx8crLbTVK8nur1jeLsmc3krDbfjoxoea2V1Uy5Q");
531}
532
533pub mod stake_allow_zero_undelegated_amount {
534    solana_pubkey::declare_id!("sTKz343FM8mqtyGvYWvbLpTThw3ixRM4Xk8QvZ985mw");
535}
536
537pub mod require_static_program_ids_in_transaction {
538    solana_pubkey::declare_id!("8FdwgyHFEjhAdjWfV2vfqk7wA1g9X3fQpKH7SBpEv3kC");
539}
540
541pub mod stake_raise_minimum_delegation_to_1_sol {
542    // This is a feature-proposal *feature id*.  The feature keypair address is `GQXzC7YiSNkje6FFUk6sc2p53XRvKoaZ9VMktYzUMnpL`.
543    solana_pubkey::declare_id!("9onWzzvCzNC2jfhxxeqRgs5q7nFAAKpCUvkj6T6GJK9i");
544}
545
546pub mod stake_minimum_delegation_for_rewards {
547    solana_pubkey::declare_id!("G6ANXD6ptCSyNd9znZm7j4dEczAJCfx7Cy43oBx3rKHJ");
548}
549
550pub mod add_set_compute_unit_price_ix {
551    solana_pubkey::declare_id!("98std1NSHqXi9WYvFShfVepRdCoq1qvsp8fsR2XZtG8g");
552}
553
554pub mod disable_deploy_of_alloc_free_syscall {
555    solana_pubkey::declare_id!("79HWsX9rpnnJBPcdNURVqygpMAfxdrAirzAGAVmf92im");
556}
557
558pub mod include_account_index_in_rent_error {
559    solana_pubkey::declare_id!("2R72wpcQ7qV7aTJWUumdn8u5wmmTyXbK7qzEy7YSAgyY");
560}
561
562pub mod add_shred_type_to_shred_seed {
563    solana_pubkey::declare_id!("Ds87KVeqhbv7Jw8W6avsS1mqz3Mw5J3pRTpPoDQ2QdiJ");
564}
565
566pub mod warp_timestamp_with_a_vengeance {
567    solana_pubkey::declare_id!("3BX6SBeEBibHaVQXywdkcgyUk6evfYZkHdztXiDtEpFS");
568}
569
570pub mod separate_nonce_from_blockhash {
571    solana_pubkey::declare_id!("Gea3ZkK2N4pHuVZVxWcnAtS6UEDdyumdYt4pFcKjA3ar");
572}
573
574pub mod enable_durable_nonce {
575    solana_pubkey::declare_id!("4EJQtF2pkRyawwcTVfQutzq4Sa5hRhibF6QAK1QXhtEX");
576}
577
578pub mod vote_state_update_credit_per_dequeue {
579    solana_pubkey::declare_id!("CveezY6FDLVBToHDcvJRmtMouqzsmj4UXYh5ths5G5Uv");
580}
581
582pub mod quick_bail_on_panic {
583    solana_pubkey::declare_id!("DpJREPyuMZ5nDfU6H3WTqSqUFSXAfw8u7xqmWtEwJDcP");
584}
585
586pub mod nonce_must_be_authorized {
587    solana_pubkey::declare_id!("HxrEu1gXuH7iD3Puua1ohd5n4iUKJyFNtNxk9DVJkvgr");
588}
589
590pub mod nonce_must_be_advanceable {
591    solana_pubkey::declare_id!("3u3Er5Vc2jVcwz4xr2GJeSAXT3fAj6ADHZ4BJMZiScFd");
592}
593
594pub mod vote_authorize_with_seed {
595    solana_pubkey::declare_id!("6tRxEYKuy2L5nnv5bgn7iT28MxUbYxp5h7F3Ncf1exrT");
596}
597
598pub mod preserve_rent_epoch_for_rent_exempt_accounts {
599    solana_pubkey::declare_id!("HH3MUYReL2BvqqA3oEcAa7txju5GY6G4nxJ51zvsEjEZ");
600}
601
602pub mod enable_bpf_loader_extend_program_ix {
603    solana_pubkey::declare_id!("8Zs9W7D9MpSEtUWSQdGniZk2cNmV22y6FLJwCx53asme");
604}
605
606pub mod enable_early_verification_of_account_modifications {
607    solana_pubkey::declare_id!("7Vced912WrRnfjaiKRiNBcbuFw7RrnLv3E3z95Y4GTNc");
608}
609
610pub mod skip_rent_rewrites {
611    solana_pubkey::declare_id!("CGB2jM8pwZkeeiXQ66kBMyBR6Np61mggL7XUsmLjVcrw");
612}
613
614pub mod prevent_crediting_accounts_that_end_rent_paying {
615    solana_pubkey::declare_id!("812kqX67odAp5NFwM8D2N24cku7WTm9CHUTFUXaDkWPn");
616}
617
618pub mod cap_bpf_program_instruction_accounts {
619    solana_pubkey::declare_id!("9k5ijzTbYPtjzu8wj2ErH9v45xecHzQ1x4PMYMMxFgdM");
620}
621
622pub mod loosen_cpi_size_restriction {
623    solana_pubkey::declare_id!("GDH5TVdbTPUpRnXaRyQqiKUa7uZAbZ28Q2N9bhbKoMLm");
624}
625
626pub mod use_default_units_in_fee_calculation {
627    solana_pubkey::declare_id!("8sKQrMQoUHtQSUP83SPG4ta2JDjSAiWs7t5aJ9uEd6To");
628}
629
630pub mod compact_vote_state_updates {
631    solana_pubkey::declare_id!("86HpNqzutEZwLcPxS6EHDcMNYWk6ikhteg9un7Y2PBKE");
632}
633
634pub mod incremental_snapshot_only_incremental_hash_calculation {
635    solana_pubkey::declare_id!("25vqsfjk7Nv1prsQJmA4Xu1bN61s8LXCBGUPp8Rfy1UF");
636}
637
638pub mod disable_cpi_setting_executable_and_rent_epoch {
639    solana_pubkey::declare_id!("B9cdB55u4jQsDNsdTK525yE9dmSc5Ga7YBaBrDFvEhM9");
640}
641
642pub mod on_load_preserve_rent_epoch_for_rent_exempt_accounts {
643    solana_pubkey::declare_id!("CpkdQmspsaZZ8FVAouQTtTWZkc8eeQ7V3uj7dWz543rZ");
644}
645
646pub mod account_hash_ignore_slot {
647    solana_pubkey::declare_id!("SVn36yVApPLYsa8koK3qUcy14zXDnqkNYWyUh1f4oK1");
648}
649
650pub mod set_exempt_rent_epoch_max {
651    solana_pubkey::declare_id!("5wAGiy15X1Jb2hkHnPDCM8oB9V42VNA9ftNVFK84dEgv");
652}
653
654pub mod relax_authority_signer_check_for_lookup_table_creation {
655    solana_pubkey::declare_id!("FKAcEvNgSY79RpqsPNUV5gDyumopH4cEHqUxyfm8b8Ap");
656}
657
658pub mod stop_sibling_instruction_search_at_parent {
659    solana_pubkey::declare_id!("EYVpEP7uzH1CoXzbD6PubGhYmnxRXPeq3PPsm1ba3gpo");
660}
661
662pub mod vote_state_update_root_fix {
663    solana_pubkey::declare_id!("G74BkWBzmsByZ1kxHy44H3wjwp5hp7JbrGRuDpco22tY");
664}
665
666pub mod cap_accounts_data_allocations_per_transaction {
667    solana_pubkey::declare_id!("9gxu85LYRAcZL38We8MYJ4A9AwgBBPtVBAqebMcT1241");
668}
669
670pub mod epoch_accounts_hash {
671    solana_pubkey::declare_id!("5GpmAKxaGsWWbPp4bNXFLJxZVvG92ctxf7jQnzTQjF3n");
672}
673
674pub mod remove_deprecated_request_unit_ix {
675    solana_pubkey::declare_id!("EfhYd3SafzGT472tYQDUc4dPd2xdEfKs5fwkowUgVt4W");
676}
677
678pub mod disable_rehash_for_rent_epoch {
679    solana_pubkey::declare_id!("DTVTkmw3JSofd8CJVJte8PXEbxNQ2yZijvVr3pe2APPj");
680}
681
682pub mod increase_tx_account_lock_limit {
683    solana_pubkey::declare_id!("9LZdXeKGeBV6hRLdxS1rHbHoEUsKqesCC2ZAPTPKJAbK");
684}
685
686pub mod limit_max_instruction_trace_length {
687    solana_pubkey::declare_id!("GQALDaC48fEhZGWRj9iL5Q889emJKcj3aCvHF7VCbbF4");
688}
689
690pub mod check_syscall_outputs_do_not_overlap {
691    solana_pubkey::declare_id!("3uRVPBpyEJRo1emLCrq38eLRFGcu6uKSpUXqGvU8T7SZ");
692}
693
694pub mod enable_bpf_loader_set_authority_checked_ix {
695    solana_pubkey::declare_id!("5x3825XS7M2A3Ekbn5VGGkvFoAg5qrRWkTrY4bARP1GL");
696}
697
698pub mod enable_alt_bn128_syscall {
699    solana_pubkey::declare_id!("A16q37opZdQMCbe5qJ6xpBB9usykfv8jZaMkxvZQi4GJ");
700}
701
702pub mod simplify_alt_bn128_syscall_error_codes {
703    solana_pubkey::declare_id!("JDn5q3GBeqzvUa7z67BbmVHVdE3EbUAjvFep3weR3jxX");
704}
705
706pub mod enable_alt_bn128_compression_syscall {
707    solana_pubkey::declare_id!("EJJewYSddEEtSZHiqugnvhQHiWyZKjkFDQASd7oKSagn");
708}
709
710pub mod fix_alt_bn128_multiplication_input_length {
711    solana_pubkey::declare_id!("bn2puAyxUx6JUabAxYdKdJ5QHbNNmKw8dCGuGCyRrFN");
712}
713
714pub mod enable_program_redeployment_cooldown {
715    solana_pubkey::declare_id!("J4HFT8usBxpcF63y46t1upYobJgChmKyZPm5uTBRg25Z");
716}
717
718pub mod commission_updates_only_allowed_in_first_half_of_epoch {
719    solana_pubkey::declare_id!("noRuG2kzACwgaY7TVmLRnUNPLKNVQE1fb7X55YWBehp");
720}
721
722pub mod enable_turbine_fanout_experiments {
723    solana_pubkey::declare_id!("D31EFnLgdiysi84Woo3of4JMu7VmasUS3Z7j9HYXCeLY");
724}
725
726pub mod disable_turbine_fanout_experiments {
727    solana_pubkey::declare_id!("turbnbNRp22nwZCmgVVXFSshz7H7V23zMzQgA46YpmQ");
728}
729
730pub mod move_serialized_len_ptr_in_cpi {
731    solana_pubkey::declare_id!("74CoWuBmt3rUVUrCb2JiSTvh6nXyBWUsK4SaMj3CtE3T");
732}
733
734pub mod update_hashes_per_tick {
735    solana_pubkey::declare_id!("3uFHb9oKdGfgZGJK9EHaAXN4USvnQtAFC13Fh5gGFS5B");
736}
737
738pub mod enable_big_mod_exp_syscall {
739    solana_pubkey::declare_id!("EBq48m8irRKuE7ZnMTLvLg2UuGSqhe8s8oMqnmja1fJw");
740}
741
742pub mod disable_builtin_loader_ownership_chains {
743    solana_pubkey::declare_id!("4UDcAfQ6EcA6bdcadkeHpkarkhZGJ7Bpq7wTAiRMjkoi");
744}
745
746pub mod cap_transaction_accounts_data_size {
747    solana_pubkey::declare_id!("DdLwVYuvDz26JohmgSbA7mjpJFgX5zP2dkp8qsF2C33V");
748}
749
750pub mod remove_congestion_multiplier_from_fee_calculation {
751    solana_pubkey::declare_id!("A8xyMHZovGXFkorFqEmVH2PKGLiBip5JD7jt4zsUWo4H");
752}
753
754pub mod enable_request_heap_frame_ix {
755    solana_pubkey::declare_id!("Hr1nUA9b7NJ6eChS26o7Vi8gYYDDwWD3YeBfzJkTbU86");
756}
757
758pub mod prevent_rent_paying_rent_recipients {
759    solana_pubkey::declare_id!("Fab5oP3DmsLYCiQZXdjyqT3ukFFPrsmqhXU4WU1AWVVF");
760}
761
762pub mod delay_visibility_of_program_deployment {
763    solana_pubkey::declare_id!("GmuBvtFb2aHfSfMXpuFeWZGHyDeCLPS79s48fmCWCfM5");
764}
765
766pub mod apply_cost_tracker_during_replay {
767    solana_pubkey::declare_id!("2ry7ygxiYURULZCrypHhveanvP5tzZ4toRwVp89oCNSj");
768}
769
770pub mod stricter_abi_and_runtime_constraints {
771    solana_pubkey::declare_id!("Eoh7e1sDqtyPtuiWAhBNSJinvtJWTTDgeUMRi3RF8zWS");
772}
773
774pub mod account_data_direct_mapping {
775    solana_pubkey::declare_id!("6f2qai82RU7Dutj1WJfRzLJKYA36QWvTa89CR1imgj7N");
776}
777
778pub mod add_set_tx_loaded_accounts_data_size_instruction {
779    solana_pubkey::declare_id!("G6vbf1UBok8MWb8m25ex86aoQHeKTzDKzuZADHkShqm6");
780}
781
782pub mod switch_to_new_elf_parser {
783    solana_pubkey::declare_id!("Cdkc8PPTeTNUPoZEfCY5AyetUrEdkZtNPMgz58nqyaHD");
784}
785
786pub mod round_up_heap_size {
787    solana_pubkey::declare_id!("CE2et8pqgyQMP2mQRg3CgvX8nJBKUArMu3wfiQiQKY1y");
788}
789
790pub mod remove_bpf_loader_incorrect_program_id {
791    solana_pubkey::declare_id!("2HmTkCj9tXuPE4ueHzdD7jPeMf9JGCoZh5AsyoATiWEe");
792}
793
794pub mod include_loaded_accounts_data_size_in_fee_calculation {
795    solana_pubkey::declare_id!("EaQpmC6GtRssaZ3PCUM5YksGqUdMLeZ46BQXYtHYakDS");
796}
797
798pub mod native_programs_consume_cu {
799    solana_pubkey::declare_id!("8pgXCMNXC8qyEFypuwpXyRxLXZdpM4Qo72gJ6k87A6wL");
800}
801
802pub mod simplify_writable_program_account_check {
803    solana_pubkey::declare_id!("5ZCcFAzJ1zsFKe1KSZa9K92jhx7gkcKj97ci2DBo1vwj");
804}
805
806pub mod stop_truncating_strings_in_syscalls {
807    solana_pubkey::declare_id!("16FMCmgLzCNNz6eTwGanbyN2ZxvTBSLuQ6DZhgeMshg");
808}
809
810pub mod clean_up_delegation_errors {
811    solana_pubkey::declare_id!("Bj2jmUsM2iRhfdLLDSTkhM5UQRQvQHm57HSmPibPtEyu");
812}
813
814pub mod vote_state_add_vote_latency {
815    solana_pubkey::declare_id!("7axKe5BTYBDD87ftzWbk5DfzWMGyRvqmWTduuo22Yaqy");
816}
817
818pub mod checked_arithmetic_in_fee_validation {
819    solana_pubkey::declare_id!("5Pecy6ie6XGm22pc9d4P9W5c31BugcFBuy6hsP2zkETv");
820}
821
822pub mod last_restart_slot_sysvar {
823    solana_pubkey::declare_id!("HooKD5NC9QNxk25QuzCssB8ecrEzGt6eXEPBUxWp1LaR");
824}
825
826pub mod reduce_stake_warmup_cooldown {
827    solana_pubkey::declare_id!("GwtDQBghCTBgmX2cpEGNPxTEBUTQRaDMGTr5qychdGMj");
828}
829
830pub mod revise_turbine_epoch_stakes {
831    solana_pubkey::declare_id!("BTWmtJC8U5ZLMbBUUA1k6As62sYjPEjAiNAT55xYGdJU");
832}
833
834pub mod enable_poseidon_syscall {
835    solana_pubkey::declare_id!("FL9RsQA6TVUoh5xJQ9d936RHSebA1NLQqe3Zv9sXZRpr");
836}
837
838pub mod timely_vote_credits {
839    solana_pubkey::declare_id!("tvcF6b1TRz353zKuhBjinZkKzjmihXmBAHJdjNYw1sQ");
840}
841
842pub mod remaining_compute_units_syscall_enabled {
843    solana_pubkey::declare_id!("5TuppMutoyzhUSfuYdhgzD47F92GL1g89KpCZQKqedxP");
844}
845
846pub mod enable_loader_v4 {
847    solana_pubkey::declare_id!("2aQJYqER2aKyb3cZw22v4SL2xMX7vwXBRWfvS4pTrtED");
848}
849
850pub mod require_rent_exempt_split_destination {
851    solana_pubkey::declare_id!("D2aip4BBr8NPWtU9vLrwrBvbuaQ8w1zV38zFLxx4pfBV");
852}
853
854pub mod better_error_codes_for_tx_lamport_check {
855    solana_pubkey::declare_id!("Ffswd3egL3tccB6Rv3XY6oqfdzn913vUcjCSnpvCKpfx");
856}
857
858pub mod update_hashes_per_tick2 {
859    solana_pubkey::declare_id!("EWme9uFqfy1ikK1jhJs8fM5hxWnK336QJpbscNtizkTU");
860}
861
862pub mod update_hashes_per_tick3 {
863    solana_pubkey::declare_id!("8C8MCtsab5SsfammbzvYz65HHauuUYdbY2DZ4sznH6h5");
864}
865
866pub mod update_hashes_per_tick4 {
867    solana_pubkey::declare_id!("8We4E7DPwF2WfAN8tRTtWQNhi98B99Qpuj7JoZ3Aikgg");
868}
869
870pub mod update_hashes_per_tick5 {
871    solana_pubkey::declare_id!("BsKLKAn1WM4HVhPRDsjosmqSg2J8Tq5xP2s2daDS6Ni4");
872}
873
874pub mod update_hashes_per_tick6 {
875    solana_pubkey::declare_id!("FKu1qYwLQSiehz644H6Si65U5ZQ2cp9GxsyFUfYcuADv");
876}
877
878pub mod validate_fee_collector_account {
879    solana_pubkey::declare_id!("prpFrMtgNmzaNzkPJg9o753fVvbHKqNrNTm76foJ2wm");
880}
881
882pub mod disable_rent_fees_collection {
883    solana_pubkey::declare_id!("CJzY83ggJHqPGDq8VisV3U91jDJLuEaALZooBrXtnnLU");
884}
885
886pub mod enable_zk_transfer_with_fee {
887    solana_pubkey::declare_id!("zkNLP7EQALfC1TYeB3biDU7akDckj8iPkvh9y2Mt2K3");
888}
889
890pub mod drop_legacy_shreds {
891    solana_pubkey::declare_id!("GV49KKQdBNaiv2pgqhS2Dy3GWYJGXMTVYbYkdk91orRy");
892}
893
894pub mod allow_commission_decrease_at_any_time {
895    solana_pubkey::declare_id!("decoMktMcnmiq6t3u7g5BfgcQu91nKZr6RvMYf9z1Jb");
896}
897
898pub mod add_new_reserved_account_keys {
899    solana_pubkey::declare_id!("8U4skmMVnF6k2kMvrWbQuRUT3qQSiTYpSjqmhmgfthZu");
900}
901
902pub mod consume_blockstore_duplicate_proofs {
903    solana_pubkey::declare_id!("6YsBCejwK96GZCkJ6mkZ4b68oP63z2PLoQmWjC7ggTqZ");
904}
905
906pub mod index_erasure_conflict_duplicate_proofs {
907    solana_pubkey::declare_id!("dupPajaLy2SSn8ko42aZz4mHANDNrLe8Nw8VQgFecLa");
908}
909
910pub mod merkle_conflict_duplicate_proofs {
911    solana_pubkey::declare_id!("mrkPjRg79B2oK2ZLgd7S3AfEJaX9B6gAF3H9aEykRUS");
912}
913
914pub mod disable_bpf_loader_instructions {
915    solana_pubkey::declare_id!("7WeS1vfPRgeeoXArLh7879YcB9mgE9ktjPDtajXeWfXn");
916}
917
918pub mod enable_zk_proof_from_account {
919    solana_pubkey::declare_id!("zkiTNuzBKxrCLMKehzuQeKZyLtX2yvFcEKMML8nExU8");
920}
921
922pub mod cost_model_requested_write_lock_cost {
923    solana_pubkey::declare_id!("wLckV1a64ngtcKPRGU4S4grVTestXjmNjxBjaKZrAcn");
924}
925
926pub mod enable_gossip_duplicate_proof_ingestion {
927    solana_pubkey::declare_id!("FNKCMBzYUdjhHyPdsKG2LSmdzH8TCHXn3ytj8RNBS4nG");
928}
929
930pub mod chained_merkle_conflict_duplicate_proofs {
931    solana_pubkey::declare_id!("chaie9S2zVfuxJKNRGkyTDokLwWxx6kD2ZLsqQHaDD8");
932}
933
934pub mod enable_chained_merkle_shreds {
935    solana_pubkey::declare_id!("7uZBkJXJ1HkuP6R3MJfZs7mLwymBcDbKdqbF51ZWLier");
936}
937
938pub mod remove_rounding_in_fee_calculation {
939    solana_pubkey::declare_id!("BtVN7YjDzNE6Dk7kTT7YTDgMNUZTNgiSJgsdzAeTg2jF");
940}
941
942pub mod enable_tower_sync_ix {
943    solana_pubkey::declare_id!("tSynMCspg4xFiCj1v3TDb4c7crMR5tSBhLz4sF7rrNA");
944}
945
946pub mod deprecate_unused_legacy_vote_plumbing {
947    solana_pubkey::declare_id!("6Uf8S75PVh91MYgPQSHnjRAPQq6an5BDv9vomrCwDqLe");
948}
949
950pub mod reward_full_priority_fee {
951    solana_pubkey::declare_id!("3opE3EzAKnUftUDURkzMgwpNgimBAypW1mNDYH4x4Zg7");
952}
953
954pub mod get_sysvar_syscall_enabled {
955    solana_pubkey::declare_id!("CLCoTADvV64PSrnR6QXty6Fwrt9Xc6EdxSJE4wLRePjq");
956}
957
958pub mod abort_on_invalid_curve {
959    solana_pubkey::declare_id!("FuS3FPfJDKSNot99ECLXtp3rueq36hMNStJkPJwWodLh");
960}
961
962pub mod migrate_feature_gate_program_to_core_bpf {
963    solana_pubkey::declare_id!("4eohviozzEeivk1y9UbrnekbAFMDQyJz5JjA9Y6gyvky");
964}
965
966pub mod vote_only_full_fec_sets {
967    solana_pubkey::declare_id!("ffecLRhhakKSGhMuc6Fz2Lnfq4uT9q3iu9ZsNaPLxPc");
968}
969
970pub mod migrate_config_program_to_core_bpf {
971    solana_pubkey::declare_id!("2Fr57nzzkLYXW695UdDxDeR5fhnZWSttZeZYemrnpGFV");
972}
973
974pub mod enable_get_epoch_stake_syscall {
975    solana_pubkey::declare_id!("FKe75t4LXxGaQnVHdUKM6DSFifVVraGZ8LyNo7oPwy1Z");
976}
977
978pub mod migrate_address_lookup_table_program_to_core_bpf {
979    solana_pubkey::declare_id!("C97eKZygrkU4JxJsZdjgbUY7iQR7rKTr4NyDWo2E5pRm");
980}
981
982pub mod zk_elgamal_proof_program_enabled {
983    solana_pubkey::declare_id!("zkhiy5oLowR7HY4zogXjCjeMXyruLqBwSWH21qcFtnv");
984}
985
986pub mod verify_retransmitter_signature {
987    solana_pubkey::declare_id!("51VCKU5eV6mcTc9q9ArfWELU2CqDoi13hdAjr6fHMdtv");
988}
989
990pub mod move_stake_and_move_lamports_ixs {
991    solana_pubkey::declare_id!("7bTK6Jis8Xpfrs8ZoUfiMDPazTcdPcTWheZFJTA5Z6X4");
992}
993
994pub mod ed25519_precompile_verify_strict {
995    solana_pubkey::declare_id!("ed9tNscbWLYBooxWA7FE2B5KHWs8A6sxfY8EzezEcoo");
996}
997
998pub mod vote_only_retransmitter_signed_fec_sets {
999    solana_pubkey::declare_id!("RfEcA95xnhuwooVAhUUksEJLZBF7xKCLuqrJoqk4Zph");
1000}
1001
1002pub mod move_precompile_verification_to_svm {
1003    solana_pubkey::declare_id!("9ypxGLzkMxi89eDerRKXWDXe44UY2z4hBig4mDhNq5Dp");
1004}
1005
1006pub mod enable_transaction_loading_failure_fees {
1007    solana_pubkey::declare_id!("PaymEPK2oqwT9TXAVfadjztH2H6KfLEB9Hhd5Q5frvP");
1008}
1009
1010pub mod enable_turbine_extended_fanout_experiments {
1011    solana_pubkey::declare_id!("turbRpTzBzDU6PJmWvRTbcJXXGxUs19CvQamUrRD9bN");
1012}
1013
1014pub mod deprecate_legacy_vote_ixs {
1015    solana_pubkey::declare_id!("depVvnQ2UysGrhwdiwU42tCadZL8GcBb1i2GYhMopQv");
1016}
1017
1018pub mod disable_sbpf_v0_execution {
1019    solana_pubkey::declare_id!("TestFeature11111111111111111111111111111111");
1020}
1021
1022pub mod reenable_sbpf_v0_execution {
1023    solana_pubkey::declare_id!("TestFeature21111111111111111111111111111111");
1024}
1025
1026pub mod enable_sbpf_v1_deployment_and_execution {
1027    solana_pubkey::declare_id!("JE86WkYvTrzW8HgNmrHY7dFYpCmSptUpKupbo2AdQ9cG");
1028}
1029
1030pub mod enable_sbpf_v2_deployment_and_execution {
1031    solana_pubkey::declare_id!("F6UVKh1ujTEFK3en2SyAL3cdVnqko1FVEXWhmdLRu6WP");
1032}
1033
1034pub mod enable_sbpf_v3_deployment_and_execution {
1035    solana_pubkey::declare_id!("BUwGLeF3Lxyfv1J1wY8biFHBB2hrk2QhbNftQf3VV3cC");
1036}
1037
1038pub mod remove_accounts_executable_flag_checks {
1039    solana_pubkey::declare_id!("FXs1zh47QbNnhXcnB6YiAQoJ4sGB91tKF3UFHLcKT7PM");
1040}
1041
1042pub mod disable_account_loader_special_case {
1043    solana_pubkey::declare_id!("EQUMpNFr7Nacb1sva56xn1aLfBxppEoSBH8RRVdkcD1x");
1044}
1045
1046pub mod enable_secp256r1_precompile {
1047    solana_pubkey::declare_id!("srremy31J5Y25FrAApwVb9kZcfXbusYMMsvTK9aWv5q");
1048}
1049
1050pub mod accounts_lt_hash {
1051    solana_pubkey::declare_id!("LTHasHQX6661DaDD4S6A2TFi6QBuiwXKv66fB1obfHq");
1052}
1053
1054pub mod snapshots_lt_hash {
1055    solana_pubkey::declare_id!("LTsNAP8h1voEVVToMNBNqoiNQex4aqfUrbFhRH3mSQ2");
1056}
1057
1058pub mod remove_accounts_delta_hash {
1059    solana_pubkey::declare_id!("LTdLt9Ycbyoipz5fLysCi1NnDnASsZfmJLJXts5ZxZz");
1060}
1061
1062pub mod migrate_stake_program_to_core_bpf {
1063    solana_pubkey::declare_id!("6M4oQ6eXneVhtLoiAr4yRYQY43eVLjrKbiDZDJc892yk");
1064}
1065
1066pub mod deplete_cu_meter_on_vm_failure {
1067    solana_pubkey::declare_id!("B7H2caeia4ZFcpE3QcgMqbiWiBtWrdBRBSJ1DY6Ktxbq");
1068}
1069
1070pub mod reserve_minimal_cus_for_builtin_instructions {
1071    solana_pubkey::declare_id!("C9oAhLxDBm3ssWtJx1yBGzPY55r2rArHmN1pbQn6HogH");
1072}
1073
1074pub mod raise_block_limits_to_50m {
1075    solana_pubkey::declare_id!("5oMCU3JPaFLr8Zr4ct7yFA7jdk6Mw1RmB8K4u9ZbS42z");
1076}
1077
1078pub mod drop_unchained_merkle_shreds {
1079    solana_pubkey::declare_id!("5KLGJSASDVxKPjLCDWNtnABLpZjsQSrYZ8HKwcEdAMC8");
1080}
1081
1082pub mod relax_intrabatch_account_locks {
1083    solana_pubkey::declare_id!("ENTRYnPAoT5Swwx73YDGzMp3XnNH1kxacyvLosRHza1i");
1084}
1085
1086pub mod create_slashing_program {
1087    solana_pubkey::declare_id!("sProgVaNWkYdP2eTRAy1CPrgb3b9p8yXCASrPEqo6VJ");
1088}
1089
1090pub mod disable_partitioned_rent_collection {
1091    solana_pubkey::declare_id!("2B2SBNbUcr438LtGXNcJNBP2GBSxjx81F945SdSkUSfC");
1092}
1093
1094pub mod enable_vote_address_leader_schedule {
1095    solana_pubkey::declare_id!("5JsG4NWH8Jbrqdd8uL6BNwnyZK3dQSoieRXG5vmofj9y");
1096}
1097
1098pub mod require_static_nonce_account {
1099    solana_pubkey::declare_id!("7VVhpg5oAjAmnmz1zCcSHb2Z9ecZB2FQqpnEwReka9Zm");
1100}
1101
1102pub mod raise_block_limits_to_60m {
1103    solana_pubkey::declare_id!("6oMCUgfY6BzZ6jwB681J6ju5Bh6CjVXbd7NeWYqiXBSu");
1104}
1105
1106pub mod mask_out_rent_epoch_in_vm_serialization {
1107    solana_pubkey::declare_id!("RENtePQcDLrAbxAsP3k8dwVcnNYQ466hi2uKvALjnXx");
1108}
1109
1110pub mod enshrine_slashing_program {
1111    solana_pubkey::declare_id!("sProgVaNWkYdP2eTRAy1CPrgb3b9p8yXCASrPEqo6VJ");
1112}
1113
1114pub mod enable_extend_program_checked {
1115    solana_pubkey::declare_id!("2oMRZEDWT2tqtYMofhmmfQ8SsjqUFzT6sYXppQDavxwz");
1116}
1117
1118pub mod formalize_loaded_transaction_data_size {
1119    solana_pubkey::declare_id!("DeS7sR48ZcFTUmt5FFEVDr1v1bh73aAbZiZq3SYr8Eh8");
1120}
1121
1122pub mod alpenglow {
1123    solana_pubkey::declare_id!("mustRekeyVm2QHYB3JPefBiU4BY3Z6JkW2k3Scw5GWP");
1124}
1125
1126pub mod disable_zk_elgamal_proof_program {
1127    solana_pubkey::declare_id!("zkdoVwnSFnSLtGJG7irJPEYUpmb4i7sGMGcnN6T9rnC");
1128}
1129
1130pub mod reenable_zk_elgamal_proof_program {
1131    solana_pubkey::declare_id!("zkesAyFB19sTkX8i9ReoKaMNDA4YNTPYJpZKPDt7FMW");
1132}
1133
1134pub mod raise_block_limits_to_100m {
1135    solana_pubkey::declare_id!("P1BCUMpAC7V2GRBRiJCNUgpMyWZhoqt3LKo712ePqsz");
1136}
1137
1138pub mod raise_account_cu_limit {
1139    solana_pubkey::declare_id!("htsptAwi2yRoZH83SKaUXykeZGtZHgxkS2QwW1pssR8");
1140}
1141
1142pub mod raise_cpi_nesting_limit_to_8 {
1143    solana_pubkey::declare_id!("6TkHkRmP7JZy1fdM6fg5uXn76wChQBWGokHBJzrLB3mj");
1144}
1145
1146pub mod enforce_fixed_fec_set {
1147    solana_pubkey::declare_id!("fixfecLZYMfkGzwq6NJA11Yw6KYztzXiK9QcL3K78in");
1148}
1149
1150pub mod provide_instruction_data_offset_in_vm_r2 {
1151    solana_pubkey::declare_id!("5xXZc66h4UdB6Yq7FzdBxBiRAFMMScMLwHxk2QZDaNZL");
1152}
1153
1154pub mod static_instruction_limit {
1155    solana_pubkey::declare_id!("64ixypL1HPu8WtJhNSMb9mSgfFaJvsANuRkTbHyuLfnx");
1156}
1157
1158pub mod discard_unexpected_data_complete_shreds {
1159    solana_pubkey::declare_id!("8MhfKhoZEoiySpVe248bDkisyEcBA7JQLyUS94xoTSqN");
1160}
1161
1162pub mod vote_state_v4 {
1163    solana_pubkey::declare_id!("Gx4XFcrVMt4HUvPzTpTSVkdDVgcDSjKhDN1RqRS6KDuZ");
1164
1165    pub mod stake_program_buffer {
1166        solana_pubkey::declare_id!("BM11F4hqrpinQs28sEZfzQ2fYddivYs4NEAHF6QMjkJF");
1167    }
1168}
1169
1170pub mod switch_to_chacha8_turbine {
1171    solana_pubkey::declare_id!("CHaChatUnR3s6cPyPMMGNJa3VdQQ8PNH2JqdD4LpCKnB");
1172}
1173
1174pub mod increase_cpi_account_info_limit {
1175    solana_pubkey::declare_id!("H6iVbVaDZgDphcPbcZwc5LoznMPWQfnJ1AM7L1xzqvt5");
1176}
1177
1178pub mod deprecate_rent_exemption_threshold {
1179    solana_pubkey::declare_id!("rent6iVy6PDoViPBeJ6k5EJQrkj62h7DPyLbWGHwjrC");
1180}
1181
1182pub mod poseidon_enforce_padding {
1183    solana_pubkey::declare_id!("poUdAqRXXsNmfqAZ6UqpjbeYgwBygbfQLEvWSqVhSnb");
1184}
1185
1186pub mod fix_alt_bn128_pairing_length_check {
1187    solana_pubkey::declare_id!("bnYzodLwmybj7e1HAe98yZrdJTd7we69eMMLgCXqKZm");
1188}
1189
1190pub mod replace_spl_token_with_p_token {
1191    use super::Pubkey;
1192
1193    solana_pubkey::declare_id!("ptokSWRqZz5u2xdqMdstkMKpFurauUpVen7TZXgDpkQ");
1194
1195    pub const SPL_TOKEN_PROGRAM_ID: Pubkey =
1196        Pubkey::from_str_const("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
1197
1198    pub const PTOKEN_PROGRAM_BUFFER: Pubkey =
1199        Pubkey::from_str_const("ptokNfvuU7terQ2r2452RzVXB3o4GT33yPWo1fUkkZ2");
1200}
1201
1202pub static FEATURE_NAMES: LazyLock<AHashMap<Pubkey, &'static str>> = LazyLock::new(|| {
1203    [
1204        (secp256k1_program_enabled::id(), "secp256k1 program"),
1205        (
1206            deprecate_rewards_sysvar::id(),
1207            "deprecate unused rewards sysvar",
1208        ),
1209        (pico_inflation::id(), "pico inflation"),
1210        (
1211            full_inflation::devnet_and_testnet::id(),
1212            "full inflation on devnet and testnet",
1213        ),
1214        (spl_token_v2_multisig_fix::id(), "spl-token multisig fix"),
1215        (
1216            no_overflow_rent_distribution::id(),
1217            "no overflow rent distribution",
1218        ),
1219        (
1220            filter_stake_delegation_accounts::id(),
1221            "filter stake_delegation_accounts #14062",
1222        ),
1223        (
1224            require_custodian_for_locked_stake_authorize::id(),
1225            "require custodian to authorize withdrawer change for locked stake",
1226        ),
1227        (
1228            spl_token_v2_self_transfer_fix::id(),
1229            "spl-token self-transfer fix",
1230        ),
1231        (
1232            full_inflation::mainnet::certusone::enable::id(),
1233            "full inflation enabled by Certus One",
1234        ),
1235        (
1236            full_inflation::mainnet::certusone::vote::id(),
1237            "community vote allowing Certus One to enable full inflation",
1238        ),
1239        (
1240            warp_timestamp_again::id(),
1241            "warp timestamp again, adjust bounding to 25% fast 80% slow #15204",
1242        ),
1243        (check_init_vote_data::id(), "check initialized Vote data"),
1244        (
1245            secp256k1_recover_syscall_enabled::id(),
1246            "secp256k1_recover syscall",
1247        ),
1248        (
1249            system_transfer_zero_check::id(),
1250            "perform all checks for transfers of 0 lamports",
1251        ),
1252        (blake3_syscall_enabled::id(), "blake3 syscall"),
1253        (
1254            dedupe_config_program_signers::id(),
1255            "dedupe config program signers",
1256        ),
1257        (
1258            verify_tx_signatures_len::id(),
1259            "prohibit extra transaction signatures",
1260        ),
1261        (
1262            vote_stake_checked_instructions::id(),
1263            "vote/state program checked instructions #18345",
1264        ),
1265        (
1266            rent_for_sysvars::id(),
1267            "collect rent from accounts owned by sysvars",
1268        ),
1269        (
1270            libsecp256k1_0_5_upgrade_enabled::id(),
1271            "upgrade libsecp256k1 to v0.5.0",
1272        ),
1273        (tx_wide_compute_cap::id(), "transaction wide compute cap"),
1274        (
1275            spl_token_v2_set_authority_fix::id(),
1276            "spl-token set_authority fix",
1277        ),
1278        (
1279            merge_nonce_error_into_system_error::id(),
1280            "merge NonceError into SystemError",
1281        ),
1282        (disable_fees_sysvar::id(), "disable fees sysvar"),
1283        (
1284            stake_merge_with_unmatched_credits_observed::id(),
1285            "allow merging active stakes with unmatched credits_observed #18985",
1286        ),
1287        (
1288            zk_token_sdk_enabled::id(),
1289            "enable Zk Token proof program and syscalls",
1290        ),
1291        (
1292            curve25519_syscall_enabled::id(),
1293            "enable curve25519 syscalls",
1294        ),
1295        (
1296            versioned_tx_message_enabled::id(),
1297            "enable versioned transaction message processing",
1298        ),
1299        (
1300            libsecp256k1_fail_on_bad_count::id(),
1301            "fail libsecp256k1_verify if count appears wrong",
1302        ),
1303        (
1304            libsecp256k1_fail_on_bad_count2::id(),
1305            "fail libsecp256k1_verify if count appears wrong",
1306        ),
1307        (
1308            instructions_sysvar_owned_by_sysvar::id(),
1309            "fix owner for instructions sysvar",
1310        ),
1311        (
1312            stake_program_advance_activating_credits_observed::id(),
1313            "Enable advancing credits observed for activation epoch #19309",
1314        ),
1315        (
1316            credits_auto_rewind::id(),
1317            "Auto rewind stake's credits_observed if (accidental) vote recreation is detected \
1318             #22546",
1319        ),
1320        (
1321            demote_program_write_locks::id(),
1322            "demote program write locks to readonly, except when upgradeable loader present \
1323             #19593 #20265",
1324        ),
1325        (
1326            ed25519_program_enabled::id(),
1327            "enable builtin ed25519 signature verify program",
1328        ),
1329        (
1330            return_data_syscall_enabled::id(),
1331            "enable sol_{set,get}_return_data syscall",
1332        ),
1333        (
1334            reduce_required_deploy_balance::id(),
1335            "reduce required payer balance for program deploys",
1336        ),
1337        (
1338            sol_log_data_syscall_enabled::id(),
1339            "enable sol_log_data syscall",
1340        ),
1341        (
1342            stakes_remove_delegation_if_inactive::id(),
1343            "remove delegations from stakes cache when inactive",
1344        ),
1345        (
1346            do_support_realloc::id(),
1347            "support account data reallocation",
1348        ),
1349        (
1350            prevent_calling_precompiles_as_programs::id(),
1351            "prevent calling precompiles as programs",
1352        ),
1353        (
1354            optimize_epoch_boundary_updates::id(),
1355            "optimize epoch boundary updates",
1356        ),
1357        (
1358            remove_native_loader::id(),
1359            "remove support for the native loader",
1360        ),
1361        (
1362            send_to_tpu_vote_port::id(),
1363            "send votes to the tpu vote port",
1364        ),
1365        (requestable_heap_size::id(), "Requestable heap frame size"),
1366        (disable_fee_calculator::id(), "deprecate fee calculator"),
1367        (
1368            add_compute_budget_program::id(),
1369            "Add compute_budget_program",
1370        ),
1371        (nonce_must_be_writable::id(), "nonce must be writable"),
1372        (spl_token_v3_3_0_release::id(), "spl-token v3.3.0 release"),
1373        (leave_nonce_on_success::id(), "leave nonce as is on success"),
1374        (
1375            reject_empty_instruction_without_program::id(),
1376            "fail instructions which have native_loader as program_id directly",
1377        ),
1378        (
1379            fixed_memcpy_nonoverlapping_check::id(),
1380            "use correct check for nonoverlapping regions in memcpy syscall",
1381        ),
1382        (
1383            reject_non_rent_exempt_vote_withdraws::id(),
1384            "fail vote withdraw instructions which leave the account non-rent-exempt",
1385        ),
1386        (
1387            evict_invalid_stakes_cache_entries::id(),
1388            "evict invalid stakes cache entries on epoch boundaries",
1389        ),
1390        (
1391            allow_votes_to_directly_update_vote_state::id(),
1392            "enable direct vote state update",
1393        ),
1394        (
1395            max_tx_account_locks::id(),
1396            "enforce max number of locked accounts per transaction",
1397        ),
1398        (
1399            require_rent_exempt_accounts::id(),
1400            "require all new transaction accounts with data to be rent-exempt",
1401        ),
1402        (
1403            filter_votes_outside_slot_hashes::id(),
1404            "filter vote slots older than the slot hashes history",
1405        ),
1406        (update_syscall_base_costs::id(), "update syscall base costs"),
1407        (
1408            stake_deactivate_delinquent_instruction::id(),
1409            "enable the deactivate delinquent stake instruction #23932",
1410        ),
1411        (
1412            vote_withdraw_authority_may_change_authorized_voter::id(),
1413            "vote account withdraw authority may change the authorized voter #22521",
1414        ),
1415        (
1416            spl_associated_token_account_v1_0_4::id(),
1417            "SPL Associated Token Account Program release version 1.0.4, tied to token 3.3.0 \
1418             #22648",
1419        ),
1420        (
1421            reject_vote_account_close_unless_zero_credit_epoch::id(),
1422            "fail vote account withdraw to 0 unless account earned 0 credits in last completed \
1423             epoch",
1424        ),
1425        (
1426            add_get_processed_sibling_instruction_syscall::id(),
1427            "add add_get_processed_sibling_instruction_syscall",
1428        ),
1429        (
1430            bank_transaction_count_fix::id(),
1431            "fixes Bank::transaction_count to include all committed transactions, not just \
1432             successful ones",
1433        ),
1434        (
1435            disable_bpf_deprecated_load_instructions::id(),
1436            "disable ldabs* and ldind* SBF instructions",
1437        ),
1438        (
1439            disable_bpf_unresolved_symbols_at_runtime::id(),
1440            "disable reporting of unresolved SBF symbols at runtime",
1441        ),
1442        (
1443            record_instruction_in_transaction_context_push::id(),
1444            "move the CPI stack overflow check to the end of push",
1445        ),
1446        (syscall_saturated_math::id(), "syscalls use saturated math"),
1447        (
1448            check_physical_overlapping::id(),
1449            "check physical overlapping regions",
1450        ),
1451        (
1452            limit_secp256k1_recovery_id::id(),
1453            "limit secp256k1 recovery id",
1454        ),
1455        (
1456            disable_deprecated_loader::id(),
1457            "disable the deprecated BPF loader",
1458        ),
1459        (
1460            check_slice_translation_size::id(),
1461            "check size when translating slices",
1462        ),
1463        (
1464            stake_split_uses_rent_sysvar::id(),
1465            "stake split instruction uses rent sysvar",
1466        ),
1467        (
1468            add_get_minimum_delegation_instruction_to_stake_program::id(),
1469            "add GetMinimumDelegation instruction to stake program",
1470        ),
1471        (
1472            error_on_syscall_bpf_function_hash_collisions::id(),
1473            "error on bpf function hash collisions",
1474        ),
1475        (reject_callx_r10::id(), "Reject bpf callx r10 instructions"),
1476        (
1477            drop_redundant_turbine_path::id(),
1478            "drop redundant turbine path",
1479        ),
1480        (
1481            executables_incur_cpi_data_cost::id(),
1482            "Executables incur CPI data costs",
1483        ),
1484        (
1485            fix_recent_blockhashes::id(),
1486            "stop adding hashes for skipped slots to recent blockhashes",
1487        ),
1488        (
1489            update_rewards_from_cached_accounts::id(),
1490            "update rewards from cached accounts",
1491        ),
1492        (
1493            spl_token_v3_4_0::id(),
1494            "SPL Token Program version 3.4.0 release #24740",
1495        ),
1496        (
1497            spl_associated_token_account_v1_1_0::id(),
1498            "SPL Associated Token Account Program version 1.1.0 release #24741",
1499        ),
1500        (
1501            default_units_per_instruction::id(),
1502            "Default max tx-wide compute units calculated per instruction",
1503        ),
1504        (
1505            stake_allow_zero_undelegated_amount::id(),
1506            "Allow zero-lamport undelegated amount for initialized stakes #24670",
1507        ),
1508        (
1509            require_static_program_ids_in_transaction::id(),
1510            "require static program ids in versioned transactions",
1511        ),
1512        (
1513            stake_raise_minimum_delegation_to_1_sol::id(),
1514            "Raise minimum stake delegation to 1.0 SOL #24357",
1515        ),
1516        (
1517            stake_minimum_delegation_for_rewards::id(),
1518            "stakes must be at least the minimum delegation to earn rewards",
1519        ),
1520        (
1521            add_set_compute_unit_price_ix::id(),
1522            "add compute budget ix for setting a compute unit price",
1523        ),
1524        (
1525            disable_deploy_of_alloc_free_syscall::id(),
1526            "disable new deployments of deprecated sol_alloc_free_ syscall",
1527        ),
1528        (
1529            include_account_index_in_rent_error::id(),
1530            "include account index in rent tx error #25190",
1531        ),
1532        (
1533            add_shred_type_to_shred_seed::id(),
1534            "add shred-type to shred seed #25556",
1535        ),
1536        (
1537            warp_timestamp_with_a_vengeance::id(),
1538            "warp timestamp again, adjust bounding to 150% slow #25666",
1539        ),
1540        (
1541            separate_nonce_from_blockhash::id(),
1542            "separate durable nonce and blockhash domains #25744",
1543        ),
1544        (enable_durable_nonce::id(), "enable durable nonce #25744"),
1545        (
1546            vote_state_update_credit_per_dequeue::id(),
1547            "Calculate vote credits for VoteStateUpdate per vote dequeue to match credit awards \
1548             for Vote instruction",
1549        ),
1550        (quick_bail_on_panic::id(), "quick bail on panic"),
1551        (nonce_must_be_authorized::id(), "nonce must be authorized"),
1552        (
1553            nonce_must_be_advanceable::id(),
1554            "durable nonces must be advanceable",
1555        ),
1556        (
1557            vote_authorize_with_seed::id(),
1558            "An instruction you can use to change a vote accounts authority when the current \
1559             authority is a derived key #25860",
1560        ),
1561        (
1562            preserve_rent_epoch_for_rent_exempt_accounts::id(),
1563            "preserve rent epoch for rent exempt accounts #26479",
1564        ),
1565        (
1566            enable_bpf_loader_extend_program_ix::id(),
1567            "enable bpf upgradeable loader ExtendProgram instruction #25234",
1568        ),
1569        (
1570            skip_rent_rewrites::id(),
1571            "skip rewriting rent exempt accounts during rent collection #26491",
1572        ),
1573        (
1574            enable_early_verification_of_account_modifications::id(),
1575            "enable early verification of account modifications #25899",
1576        ),
1577        (
1578            disable_rehash_for_rent_epoch::id(),
1579            "on accounts hash calculation, do not try to rehash accounts #28934",
1580        ),
1581        (
1582            account_hash_ignore_slot::id(),
1583            "ignore slot when calculating an account hash #28420",
1584        ),
1585        (
1586            set_exempt_rent_epoch_max::id(),
1587            "set rent epoch to Epoch::MAX for rent-exempt accounts #28683",
1588        ),
1589        (
1590            on_load_preserve_rent_epoch_for_rent_exempt_accounts::id(),
1591            "on bank load account, do not try to fix up rent_epoch #28541",
1592        ),
1593        (
1594            prevent_crediting_accounts_that_end_rent_paying::id(),
1595            "prevent crediting rent paying accounts #26606",
1596        ),
1597        (
1598            cap_bpf_program_instruction_accounts::id(),
1599            "enforce max number of accounts per bpf program instruction #26628",
1600        ),
1601        (
1602            loosen_cpi_size_restriction::id(),
1603            "loosen cpi size restrictions #26641",
1604        ),
1605        (
1606            use_default_units_in_fee_calculation::id(),
1607            "use default units per instruction in fee calculation #26785",
1608        ),
1609        (
1610            compact_vote_state_updates::id(),
1611            "Compact vote state updates to lower block size",
1612        ),
1613        (
1614            incremental_snapshot_only_incremental_hash_calculation::id(),
1615            "only hash accounts in incremental snapshot during incremental snapshot creation \
1616             #26799",
1617        ),
1618        (
1619            disable_cpi_setting_executable_and_rent_epoch::id(),
1620            "disable setting is_executable and_rent_epoch in CPI #26987",
1621        ),
1622        (
1623            relax_authority_signer_check_for_lookup_table_creation::id(),
1624            "relax authority signer check for lookup table creation #27205",
1625        ),
1626        (
1627            stop_sibling_instruction_search_at_parent::id(),
1628            "stop the search in get_processed_sibling_instruction when the parent instruction is \
1629             reached #27289",
1630        ),
1631        (
1632            vote_state_update_root_fix::id(),
1633            "fix root in vote state updates #27361",
1634        ),
1635        (
1636            cap_accounts_data_allocations_per_transaction::id(),
1637            "cap accounts data allocations per transaction #27375",
1638        ),
1639        (
1640            epoch_accounts_hash::id(),
1641            "enable epoch accounts hash calculation #27539",
1642        ),
1643        (
1644            remove_deprecated_request_unit_ix::id(),
1645            "remove support for RequestUnitsDeprecated instruction #27500",
1646        ),
1647        (
1648            increase_tx_account_lock_limit::id(),
1649            "increase tx account lock limit to 128 #27241",
1650        ),
1651        (
1652            limit_max_instruction_trace_length::id(),
1653            "limit max instruction trace length #27939",
1654        ),
1655        (
1656            check_syscall_outputs_do_not_overlap::id(),
1657            "check syscall outputs do_not overlap #28600",
1658        ),
1659        (
1660            enable_bpf_loader_set_authority_checked_ix::id(),
1661            "enable bpf upgradeable loader SetAuthorityChecked instruction #28424",
1662        ),
1663        (
1664            enable_alt_bn128_syscall::id(),
1665            "add alt_bn128 syscalls #27961",
1666        ),
1667        (
1668            simplify_alt_bn128_syscall_error_codes::id(),
1669            "SIMD-0129: simplify alt_bn128 syscall error codes",
1670        ),
1671        (
1672            enable_program_redeployment_cooldown::id(),
1673            "enable program redeployment cooldown #29135",
1674        ),
1675        (
1676            commission_updates_only_allowed_in_first_half_of_epoch::id(),
1677            "validator commission updates are only allowed in the first half of an epoch #29362",
1678        ),
1679        (
1680            enable_turbine_fanout_experiments::id(),
1681            "enable turbine fanout experiments #29393",
1682        ),
1683        (
1684            disable_turbine_fanout_experiments::id(),
1685            "disable turbine fanout experiments #29393",
1686        ),
1687        (
1688            move_serialized_len_ptr_in_cpi::id(),
1689            "cpi ignore serialized_len_ptr #29592",
1690        ),
1691        (
1692            update_hashes_per_tick::id(),
1693            "Update desired hashes per tick on epoch boundary",
1694        ),
1695        (
1696            enable_big_mod_exp_syscall::id(),
1697            "add big_mod_exp syscall #28503",
1698        ),
1699        (
1700            disable_builtin_loader_ownership_chains::id(),
1701            "disable builtin loader ownership chains #29956",
1702        ),
1703        (
1704            cap_transaction_accounts_data_size::id(),
1705            "cap transaction accounts data size up to a limit #27839",
1706        ),
1707        (
1708            remove_congestion_multiplier_from_fee_calculation::id(),
1709            "Remove congestion multiplier from transaction fee calculation #29881",
1710        ),
1711        (
1712            enable_request_heap_frame_ix::id(),
1713            "Enable transaction to request heap frame using compute budget instruction #30076",
1714        ),
1715        (
1716            prevent_rent_paying_rent_recipients::id(),
1717            "prevent recipients of rent rewards from ending in rent-paying state #30151",
1718        ),
1719        (
1720            delay_visibility_of_program_deployment::id(),
1721            "delay visibility of program upgrades #30085",
1722        ),
1723        (
1724            apply_cost_tracker_during_replay::id(),
1725            "apply cost tracker to blocks during replay #29595",
1726        ),
1727        (
1728            add_set_tx_loaded_accounts_data_size_instruction::id(),
1729            "add compute budget instruction for setting account data size per transaction #30366",
1730        ),
1731        (
1732            switch_to_new_elf_parser::id(),
1733            "switch to new ELF parser #30497",
1734        ),
1735        (
1736            round_up_heap_size::id(),
1737            "round up heap size when calculating heap cost #30679",
1738        ),
1739        (
1740            remove_bpf_loader_incorrect_program_id::id(),
1741            "stop incorrectly throwing IncorrectProgramId in bpf_loader #30747",
1742        ),
1743        (
1744            include_loaded_accounts_data_size_in_fee_calculation::id(),
1745            "include transaction loaded accounts data size in base fee calculation #30657",
1746        ),
1747        (
1748            native_programs_consume_cu::id(),
1749            "Native program should consume compute units #30620",
1750        ),
1751        (
1752            simplify_writable_program_account_check::id(),
1753            "Simplify checks performed for writable upgradeable program accounts #30559",
1754        ),
1755        (
1756            stop_truncating_strings_in_syscalls::id(),
1757            "Stop truncating strings in syscalls #31029",
1758        ),
1759        (
1760            clean_up_delegation_errors::id(),
1761            "Return InsufficientDelegation instead of InsufficientFunds or InsufficientStake \
1762             where applicable #31206",
1763        ),
1764        (
1765            vote_state_add_vote_latency::id(),
1766            "replace Lockout with LandedVote (including vote latency) in vote state #31264",
1767        ),
1768        (
1769            checked_arithmetic_in_fee_validation::id(),
1770            "checked arithmetic in fee validation #31273",
1771        ),
1772        (
1773            stricter_abi_and_runtime_constraints::id(),
1774            "SIMD-0219: Stricter ABI and Runtime Constraints",
1775        ),
1776        (
1777            account_data_direct_mapping::id(),
1778            "enable account data direct mapping",
1779        ),
1780        (
1781            last_restart_slot_sysvar::id(),
1782            "enable new sysvar last_restart_slot",
1783        ),
1784        (
1785            reduce_stake_warmup_cooldown::id(),
1786            "reduce stake warmup cooldown from 25% to 9%",
1787        ),
1788        (
1789            revise_turbine_epoch_stakes::id(),
1790            "revise turbine epoch stakes",
1791        ),
1792        (enable_poseidon_syscall::id(), "Enable Poseidon syscall"),
1793        (
1794            timely_vote_credits::id(),
1795            "use timeliness of votes in determining credits to award",
1796        ),
1797        (
1798            remaining_compute_units_syscall_enabled::id(),
1799            "enable the remaining_compute_units syscall",
1800        ),
1801        (enable_loader_v4::id(), "SIMD-0167: Enable Loader-v4"),
1802        (
1803            require_rent_exempt_split_destination::id(),
1804            "Require stake split destination account to be rent exempt",
1805        ),
1806        (
1807            better_error_codes_for_tx_lamport_check::id(),
1808            "better error codes for tx lamport check #33353",
1809        ),
1810        (
1811            enable_alt_bn128_compression_syscall::id(),
1812            "add alt_bn128 compression syscalls",
1813        ),
1814        (
1815            update_hashes_per_tick2::id(),
1816            "Update desired hashes per tick to 2.8M",
1817        ),
1818        (
1819            update_hashes_per_tick3::id(),
1820            "Update desired hashes per tick to 4.4M",
1821        ),
1822        (
1823            update_hashes_per_tick4::id(),
1824            "Update desired hashes per tick to 7.6M",
1825        ),
1826        (
1827            update_hashes_per_tick5::id(),
1828            "Update desired hashes per tick to 9.2M",
1829        ),
1830        (
1831            update_hashes_per_tick6::id(),
1832            "Update desired hashes per tick to 10M",
1833        ),
1834        (
1835            validate_fee_collector_account::id(),
1836            "validate fee collector account #33888",
1837        ),
1838        (
1839            disable_rent_fees_collection::id(),
1840            "Disable rent fees collection #33945",
1841        ),
1842        (
1843            enable_zk_transfer_with_fee::id(),
1844            "enable Zk Token proof program transfer with fee",
1845        ),
1846        (drop_legacy_shreds::id(), "drops legacy shreds #34328"),
1847        (
1848            allow_commission_decrease_at_any_time::id(),
1849            "Allow commission decrease at any time in epoch #33843",
1850        ),
1851        (
1852            consume_blockstore_duplicate_proofs::id(),
1853            "consume duplicate proofs from blockstore in consensus #34372",
1854        ),
1855        (
1856            add_new_reserved_account_keys::id(),
1857            "add new unwritable reserved accounts #34899",
1858        ),
1859        (
1860            index_erasure_conflict_duplicate_proofs::id(),
1861            "generate duplicate proofs for index and erasure conflicts #34360",
1862        ),
1863        (
1864            merkle_conflict_duplicate_proofs::id(),
1865            "generate duplicate proofs for merkle root conflicts #34270",
1866        ),
1867        (
1868            disable_bpf_loader_instructions::id(),
1869            "disable bpf loader management instructions #34194",
1870        ),
1871        (
1872            enable_zk_proof_from_account::id(),
1873            "Enable zk token proof program to read proof from accounts instead of instruction \
1874             data #34750",
1875        ),
1876        (
1877            curve25519_restrict_msm_length::id(),
1878            "restrict curve25519 multiscalar multiplication vector lengths #34763",
1879        ),
1880        (
1881            cost_model_requested_write_lock_cost::id(),
1882            "cost model uses number of requested write locks #34819",
1883        ),
1884        (
1885            enable_gossip_duplicate_proof_ingestion::id(),
1886            "enable gossip duplicate proof ingestion #32963",
1887        ),
1888        (
1889            enable_chained_merkle_shreds::id(),
1890            "Enable chained Merkle shreds #34916",
1891        ),
1892        (
1893            remove_rounding_in_fee_calculation::id(),
1894            "Removing unwanted rounding in fee calculation #34982",
1895        ),
1896        (
1897            deprecate_unused_legacy_vote_plumbing::id(),
1898            "Deprecate unused legacy vote tx plumbing",
1899        ),
1900        (
1901            enable_tower_sync_ix::id(),
1902            "Enable tower sync vote instruction",
1903        ),
1904        (
1905            chained_merkle_conflict_duplicate_proofs::id(),
1906            "generate duplicate proofs for chained merkle root conflicts",
1907        ),
1908        (
1909            reward_full_priority_fee::id(),
1910            "Reward full priority fee to validators #34731",
1911        ),
1912        (
1913            abort_on_invalid_curve::id(),
1914            "SIMD-0137: Abort when elliptic curve syscalls invoked on invalid curve id",
1915        ),
1916        (
1917            get_sysvar_syscall_enabled::id(),
1918            "Enable syscall for fetching Sysvar bytes #615",
1919        ),
1920        (
1921            migrate_feature_gate_program_to_core_bpf::id(),
1922            "Migrate Feature Gate program to Core BPF (programify) #1003",
1923        ),
1924        (vote_only_full_fec_sets::id(), "vote only full fec sets"),
1925        (
1926            migrate_config_program_to_core_bpf::id(),
1927            "Migrate Config program to Core BPF #1378",
1928        ),
1929        (
1930            enable_get_epoch_stake_syscall::id(),
1931            "Enable syscall: sol_get_epoch_stake #884",
1932        ),
1933        (
1934            migrate_address_lookup_table_program_to_core_bpf::id(),
1935            "Migrate Address Lookup Table program to Core BPF #1651",
1936        ),
1937        (
1938            zk_elgamal_proof_program_enabled::id(),
1939            "SIMD-0153: Enable ZkElGamalProof program",
1940        ),
1941        (
1942            verify_retransmitter_signature::id(),
1943            "Verify retransmitter signature #1840",
1944        ),
1945        (
1946            move_stake_and_move_lamports_ixs::id(),
1947            "Enable MoveStake and MoveLamports stake program instructions #1610",
1948        ),
1949        (
1950            ed25519_precompile_verify_strict::id(),
1951            "SIMD-0152: Use strict verification in ed25519 precompile",
1952        ),
1953        (
1954            vote_only_retransmitter_signed_fec_sets::id(),
1955            "vote only on retransmitter signed fec sets",
1956        ),
1957        (
1958            move_precompile_verification_to_svm::id(),
1959            "SIMD-0159: Move precompile verification into SVM",
1960        ),
1961        (
1962            enable_transaction_loading_failure_fees::id(),
1963            "SIMD-0082: Enable fees for some additional transaction failures",
1964        ),
1965        (
1966            enable_turbine_extended_fanout_experiments::id(),
1967            "enable turbine extended fanout experiments #",
1968        ),
1969        (
1970            deprecate_legacy_vote_ixs::id(),
1971            "Deprecate legacy vote instructions",
1972        ),
1973        (
1974            partitioned_epoch_rewards_superfeature::id(),
1975            "SIMD-0118: replaces enable_partitioned_epoch_reward to enable partitioned rewards at \
1976             epoch boundary",
1977        ),
1978        (
1979            disable_sbpf_v0_execution::id(),
1980            "SIMD-0161: Disables execution of SBPFv0 programs",
1981        ),
1982        (
1983            reenable_sbpf_v0_execution::id(),
1984            "Re-enables execution of SBPFv0 programs",
1985        ),
1986        (
1987            enable_sbpf_v1_deployment_and_execution::id(),
1988            "SIMD-0166: Enable deployment and execution of SBPFv1 programs",
1989        ),
1990        (
1991            enable_sbpf_v2_deployment_and_execution::id(),
1992            "SIMD-0173 and SIMD-0174: Enable deployment and execution of SBPFv2 programs",
1993        ),
1994        (
1995            enable_sbpf_v3_deployment_and_execution::id(),
1996            "SIMD-0178, SIMD-0179 and SIMD-0189: Enable deployment and execution of SBPFv3 \
1997             programs",
1998        ),
1999        (
2000            remove_accounts_executable_flag_checks::id(),
2001            "SIMD-0162: Remove checks of accounts is_executable flag",
2002        ),
2003        (
2004            disable_account_loader_special_case::id(),
2005            "Disable account loader special case #3513",
2006        ),
2007        (
2008            accounts_lt_hash::id(),
2009            "SIMD-0215: enables lattice-based accounts hash",
2010        ),
2011        (
2012            snapshots_lt_hash::id(),
2013            "SIMD-0220: snapshots use lattice-based accounts hash",
2014        ),
2015        (
2016            remove_accounts_delta_hash::id(),
2017            "SIMD-0223: removes accounts delta hash",
2018        ),
2019        (
2020            enable_secp256r1_precompile::id(),
2021            "SIMD-0075: Enable secp256r1 precompile",
2022        ),
2023        (
2024            migrate_stake_program_to_core_bpf::id(),
2025            "SIMD-0196: Migrate Stake program to Core BPF #3655",
2026        ),
2027        (
2028            deplete_cu_meter_on_vm_failure::id(),
2029            "SIMD-0182: Deplete compute meter for vm errors #3993",
2030        ),
2031        (
2032            reserve_minimal_cus_for_builtin_instructions::id(),
2033            "SIMD-0170: Reserve minimal CUs for builtin instructions #2562",
2034        ),
2035        (
2036            raise_block_limits_to_50m::id(),
2037            "SIMD-0207: Raise block limit to 50M",
2038        ),
2039        (
2040            fix_alt_bn128_multiplication_input_length::id(),
2041            "SIMD-0222: fix alt_bn128 multiplication input length #3686",
2042        ),
2043        (
2044            drop_unchained_merkle_shreds::id(),
2045            "drops unchained Merkle shreds #2149",
2046        ),
2047        (
2048            relax_intrabatch_account_locks::id(),
2049            "SIMD-0083: Allow batched transactions to read/write and write/write the same accounts",
2050        ),
2051        (
2052            create_slashing_program::id(),
2053            "SIMD-0204: creates an enshrined slashing program",
2054        ),
2055        (
2056            disable_partitioned_rent_collection::id(),
2057            "SIMD-0175: Disable partitioned rent collection #4562",
2058        ),
2059        (
2060            enable_vote_address_leader_schedule::id(),
2061            "SIMD-0180: Enable vote address leader schedule #4573",
2062        ),
2063        (
2064            require_static_nonce_account::id(),
2065            "SIMD-0242: Static Nonce Account Only",
2066        ),
2067        (
2068            raise_block_limits_to_60m::id(),
2069            "SIMD-0256: Raise block limit to 60M",
2070        ),
2071        (
2072            mask_out_rent_epoch_in_vm_serialization::id(),
2073            "SIMD-0267: Sets rent_epoch to a constant in the VM",
2074        ),
2075        (
2076            enshrine_slashing_program::id(),
2077            "SIMD-0204: Slashable event verification",
2078        ),
2079        (
2080            enable_extend_program_checked::id(),
2081            "Enable ExtendProgramChecked instruction",
2082        ),
2083        (
2084            formalize_loaded_transaction_data_size::id(),
2085            "SIMD-0186: Loaded transaction data size specification",
2086        ),
2087        (
2088            alpenglow::id(),
2089            "SIMD-0326: Alpenglow: new consensus algorithm",
2090        ),
2091        (
2092            disable_zk_elgamal_proof_program::id(),
2093            "Disables zk-elgamal-proof program",
2094        ),
2095        (
2096            reenable_zk_elgamal_proof_program::id(),
2097            "Re-enables zk-elgamal-proof program",
2098        ),
2099        (
2100            raise_block_limits_to_100m::id(),
2101            "SIMD-0286: Raise block limit to 100M",
2102        ),
2103        (
2104            raise_account_cu_limit::id(),
2105            "SIMD-0306: Raise account CU limit to 40% max",
2106        ),
2107        (
2108            raise_cpi_nesting_limit_to_8::id(),
2109            "SIMD-0268: Raise CPI nesting limit from 4 to 8",
2110        ),
2111        (
2112            enforce_fixed_fec_set::id(),
2113            "SIMD-0317: Enforce 32 data + 32 coding shreds",
2114        ),
2115        (
2116            provide_instruction_data_offset_in_vm_r2::id(),
2117            "SIMD-0321: Provide instruction data offset in VM r2",
2118        ),
2119        (
2120            static_instruction_limit::id(),
2121            "SIMD-0160: static instruction limit",
2122        ),
2123        (
2124            discard_unexpected_data_complete_shreds::id(),
2125            "SIMD-0337: Markers for Alpenglow Fast Leader Handover, DATA_COMPLETE_SHRED placement \
2126             rules",
2127        ),
2128        (vote_state_v4::id(), "SIMD-0185: Vote State v4"),
2129        (
2130            switch_to_chacha8_turbine::id(),
2131            "SIMD-0332: Reduce ChaCha rounds for Turbine from 20 to 8",
2132        ),
2133        (
2134            increase_cpi_account_info_limit::id(),
2135            "SIMD-0339: Increase CPI Account Infos Limit",
2136        ),
2137        (
2138            deprecate_rent_exemption_threshold::id(),
2139            "SIMD-0194: Deprecate rent exemption threshold",
2140        ),
2141        (
2142            poseidon_enforce_padding::id(),
2143            "SIMD-0359: Enforce padding in Poseidon hash inputs",
2144        ),
2145        (
2146            fix_alt_bn128_pairing_length_check::id(),
2147            "SIMD-0334: Fix alt_bn128_pairing length check",
2148        ),
2149        (
2150            replace_spl_token_with_p_token::id(),
2151            "SIMD-0266: Efficient Token program",
2152        ),
2153        /*************** ADD NEW FEATURES HERE ***************/
2154    ]
2155    .iter()
2156    .cloned()
2157    .collect()
2158});
2159
2160/// Unique identifier of the current software's feature set
2161pub static ID: LazyLock<Hash> = LazyLock::new(|| {
2162    let mut hasher = Hasher::default();
2163    let mut feature_ids = FEATURE_NAMES.keys().collect::<Vec<_>>();
2164    feature_ids.sort();
2165    for feature in feature_ids {
2166        hasher.hash(feature.as_ref());
2167    }
2168    hasher.result()
2169});
2170
2171#[derive(Clone, PartialEq, Eq, Hash)]
2172pub struct FullInflationFeaturePair {
2173    pub vote_id: Pubkey, // Feature that grants the candidate the ability to enable full inflation
2174    pub enable_id: Pubkey, // Feature to enable full inflation by the candidate
2175}
2176
2177/// Set of feature pairs that once enabled will trigger full inflationi
2178pub static FULL_INFLATION_FEATURE_PAIRS: LazyLock<AHashSet<FullInflationFeaturePair>> =
2179    LazyLock::new(|| {
2180        [FullInflationFeaturePair {
2181            vote_id: full_inflation::mainnet::certusone::vote::id(),
2182            enable_id: full_inflation::mainnet::certusone::enable::id(),
2183        }]
2184        .iter()
2185        .cloned()
2186        .collect()
2187    });
2188
2189#[cfg(test)]
2190mod test {
2191    use super::*;
2192
2193    #[test]
2194    fn test_full_inflation_features_enabled_devnet_and_testnet() {
2195        let mut feature_set = FeatureSet::default();
2196        assert!(feature_set.full_inflation_features_enabled().is_empty());
2197        feature_set
2198            .active
2199            .insert(full_inflation::devnet_and_testnet::id(), 42);
2200        assert_eq!(
2201            feature_set.full_inflation_features_enabled(),
2202            [full_inflation::devnet_and_testnet::id()]
2203                .iter()
2204                .cloned()
2205                .collect()
2206        );
2207    }
2208
2209    #[test]
2210    fn test_full_inflation_features_enabled() {
2211        // Normal sequence: vote_id then enable_id
2212        let mut feature_set = FeatureSet::default();
2213        assert!(feature_set.full_inflation_features_enabled().is_empty());
2214        feature_set
2215            .active
2216            .insert(full_inflation::mainnet::certusone::vote::id(), 42);
2217        assert!(feature_set.full_inflation_features_enabled().is_empty());
2218        feature_set
2219            .active
2220            .insert(full_inflation::mainnet::certusone::enable::id(), 42);
2221        assert_eq!(
2222            feature_set.full_inflation_features_enabled(),
2223            [full_inflation::mainnet::certusone::enable::id()]
2224                .iter()
2225                .cloned()
2226                .collect()
2227        );
2228
2229        // Backwards sequence: enable_id and then vote_id
2230        let mut feature_set = FeatureSet::default();
2231        assert!(feature_set.full_inflation_features_enabled().is_empty());
2232        feature_set
2233            .active
2234            .insert(full_inflation::mainnet::certusone::enable::id(), 42);
2235        assert!(feature_set.full_inflation_features_enabled().is_empty());
2236        feature_set
2237            .active
2238            .insert(full_inflation::mainnet::certusone::vote::id(), 42);
2239        assert_eq!(
2240            feature_set.full_inflation_features_enabled(),
2241            [full_inflation::mainnet::certusone::enable::id()]
2242                .iter()
2243                .cloned()
2244                .collect()
2245        );
2246    }
2247}