light_system_program/instructions/
invoke_cpi.rs

1use account_compression::program::AccountCompression;
2use anchor_lang::{prelude::*, solana_program::pubkey::Pubkey, system_program::System};
3
4use crate::{
5    account_traits::{InvokeAccounts, SignerAccounts},
6    constants::SOL_POOL_PDA_SEED,
7    cpi_context_account::CpiContextAccount,
8};
9
10#[derive(Accounts)]
11pub struct InvokeCpiInstruction<'info> {
12    /// Fee payer needs to be mutable to pay rollover and protocol fees.
13    #[account(mut)]
14    pub fee_payer: Signer<'info>,
15    pub authority: Signer<'info>,
16    /// CHECK: in account compression program
17    pub registered_program_pda: AccountInfo<'info>,
18    /// CHECK: checked in emit_event.rs.
19    pub noop_program: UncheckedAccount<'info>,
20    /// CHECK: used to invoke account compression program cpi sign will fail if invalid account is provided seeds = [CPI_AUTHORITY_PDA_SEED].
21    pub account_compression_authority: UncheckedAccount<'info>,
22    /// CHECK:
23    pub account_compression_program: Program<'info, AccountCompression>,
24    /// CHECK: checked in cpi_signer_check.
25    pub invoking_program: UncheckedAccount<'info>,
26    #[account(
27        mut,
28        seeds = [SOL_POOL_PDA_SEED], bump
29    )]
30    pub sol_pool_pda: Option<AccountInfo<'info>>,
31    #[account(mut)]
32    pub decompression_recipient: Option<AccountInfo<'info>>,
33    pub system_program: Program<'info, System>,
34    #[account(mut)]
35    pub cpi_context_account: Option<Account<'info, CpiContextAccount>>,
36}
37
38impl<'info> SignerAccounts<'info> for InvokeCpiInstruction<'info> {
39    fn get_fee_payer(&self) -> &Signer<'info> {
40        &self.fee_payer
41    }
42
43    fn get_authority(&self) -> &Signer<'info> {
44        &self.authority
45    }
46}
47
48impl<'info> InvokeAccounts<'info> for InvokeCpiInstruction<'info> {
49    fn get_registered_program_pda(&self) -> &AccountInfo<'info> {
50        &self.registered_program_pda
51    }
52
53    fn get_noop_program(&self) -> &UncheckedAccount<'info> {
54        &self.noop_program
55    }
56
57    fn get_account_compression_authority(&self) -> &UncheckedAccount<'info> {
58        &self.account_compression_authority
59    }
60
61    fn get_account_compression_program(&self) -> &Program<'info, AccountCompression> {
62        &self.account_compression_program
63    }
64
65    fn get_system_program(&self) -> &Program<'info, System> {
66        &self.system_program
67    }
68
69    fn get_sol_pool_pda(&self) -> Option<&AccountInfo<'info>> {
70        self.sol_pool_pda.as_ref()
71    }
72
73    fn get_decompression_recipient(&self) -> Option<&AccountInfo<'info>> {
74        self.decompression_recipient.as_ref()
75    }
76}