light_compressed_token/instructions/
freeze.rs

1use account_compression::{program::AccountCompression, utils::constants::CPI_AUTHORITY_PDA_SEED};
2use anchor_lang::prelude::*;
3use anchor_spl::token_interface::Mint;
4use light_system_program::{
5    account_traits::{InvokeAccounts, SignerAccounts},
6    program::LightSystemProgram,
7};
8
9use crate::program::LightCompressedToken;
10
11#[derive(Accounts)]
12pub struct FreezeInstruction<'info> {
13    /// UNCHECKED: only pays fees.
14    #[account(mut)]
15    pub fee_payer: Signer<'info>,
16    #[account(constraint= authority.key() == mint.freeze_authority.ok_or(crate::ErrorCode::MintHasNoFreezeAuthority)?
17        @ crate::ErrorCode::InvalidFreezeAuthority)]
18    pub authority: Signer<'info>,
19    /// CHECK: (seed constraint).
20    #[account(seeds = [CPI_AUTHORITY_PDA_SEED], bump,)]
21    pub cpi_authority_pda: UncheckedAccount<'info>,
22    pub light_system_program: Program<'info, LightSystemProgram>,
23    /// CHECK: (account compression program).
24    pub registered_program_pda: AccountInfo<'info>,
25    /// CHECK: (account compression program) when emitting event.
26    pub noop_program: UncheckedAccount<'info>,
27    /// CHECK: (different program) is used to cpi account compression program from light system program.
28    #[account(seeds = [CPI_AUTHORITY_PDA_SEED], bump, seeds::program = light_system_program::ID,)]
29    pub account_compression_authority: UncheckedAccount<'info>,
30    pub account_compression_program: Program<'info, AccountCompression>,
31    /// CHECK: (different system program) to derive cpi_authority_pda and check
32    /// that this program is the signer of the cpi.
33    pub self_program: Program<'info, LightCompressedToken>,
34    pub system_program: Program<'info, System>,
35    pub mint: InterfaceAccount<'info, Mint>,
36}
37
38impl<'info> InvokeAccounts<'info> for FreezeInstruction<'info> {
39    fn get_registered_program_pda(&self) -> &AccountInfo<'info> {
40        &self.registered_program_pda
41    }
42
43    fn get_noop_program(&self) -> &UncheckedAccount<'info> {
44        &self.noop_program
45    }
46
47    fn get_account_compression_authority(&self) -> &UncheckedAccount<'info> {
48        &self.account_compression_authority
49    }
50
51    fn get_account_compression_program(&self) -> &Program<'info, AccountCompression> {
52        &self.account_compression_program
53    }
54
55    fn get_system_program(&self) -> &Program<'info, System> {
56        &self.system_program
57    }
58
59    fn get_sol_pool_pda(&self) -> Option<&AccountInfo<'info>> {
60        None
61    }
62
63    fn get_decompression_recipient(&self) -> Option<&AccountInfo<'info>> {
64        None
65    }
66}
67
68impl<'info> SignerAccounts<'info> for FreezeInstruction<'info> {
69    fn get_fee_payer(&self) -> &Signer<'info> {
70        &self.fee_payer
71    }
72
73    fn get_authority(&self) -> &Signer<'info> {
74        &self.authority
75    }
76}