solana_feature_gate_program/
processor.rs1use {
4 crate::{error::FeatureGateError, instruction::FeatureGateInstruction},
5 solana_program::{
6 account_info::{next_account_info, AccountInfo},
7 entrypoint::ProgramResult,
8 feature::Feature,
9 incinerator, msg,
10 program::invoke,
11 program_error::ProgramError,
12 pubkey::Pubkey,
13 system_instruction, system_program,
14 },
15};
16
17pub fn process_revoke_pending_activation(
20 _program_id: &Pubkey,
21 accounts: &[AccountInfo],
22) -> ProgramResult {
23 let account_info_iter = &mut accounts.iter();
24
25 let feature_info = next_account_info(account_info_iter)?;
26 let incinerator_info = next_account_info(account_info_iter)?;
27 let _system_program_info = next_account_info(account_info_iter)?;
28
29 if !feature_info.is_signer {
30 return Err(ProgramError::MissingRequiredSignature);
31 }
32
33 if Feature::from_account_info(feature_info)?
35 .activated_at
36 .is_some()
37 {
38 return Err(FeatureGateError::FeatureAlreadyActivated.into());
39 }
40
41 feature_info.realloc(0, true)?;
43 feature_info.assign(&system_program::id());
44
45 let lamports = feature_info.lamports();
47 invoke(
48 &system_instruction::transfer(feature_info.key, &incinerator::id(), lamports),
49 &[feature_info.clone(), incinerator_info.clone()],
50 )?;
51
52 Ok(())
53}
54
55pub fn process(program_id: &Pubkey, accounts: &[AccountInfo], input: &[u8]) -> ProgramResult {
57 let instruction = FeatureGateInstruction::unpack(input)?;
58 match instruction {
59 FeatureGateInstruction::RevokePendingActivation => {
60 msg!("Instruction: RevokePendingActivation");
61 process_revoke_pending_activation(program_id, accounts)
62 }
63 }
64}