light_compressed_token/instructions/
generic.rs

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