solana_feature_gate_program/
processor.rs

1//! Program state processor
2
3use {
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
17/// Processes a [RevokePendingActivation](enum.FeatureGateInstruction.html)
18/// instruction.
19pub 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    // This will also check the program ID
34    if Feature::from_account_info(feature_info)?
35        .activated_at
36        .is_some()
37    {
38        return Err(FeatureGateError::FeatureAlreadyActivated.into());
39    }
40
41    // Clear data and reassign.
42    feature_info.realloc(0, true)?;
43    feature_info.assign(&system_program::id());
44
45    // Burn the lamports.
46    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
55/// Processes an [Instruction](enum.Instruction.html).
56pub 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}