light_system_program/invoke/
instruction.rs

1use account_compression::{program::AccountCompression, utils::constants::CPI_AUTHORITY_PDA_SEED};
2use anchor_lang::prelude::*;
3
4use super::processor::CompressedProof;
5use crate::{
6    invoke::sol_compression::SOL_POOL_PDA_SEED,
7    sdk::{
8        accounts::{InvokeAccounts, SignerAccounts},
9        compressed_account::{CompressedAccount, PackedCompressedAccountWithMerkleContext},
10    },
11};
12
13/// These are the base accounts additionally Merkle tree and queue accounts are required.
14/// These additional accounts are passed as remaining accounts.
15/// 1 Merkle tree for each input compressed account one queue and Merkle tree account each for each output compressed account.
16#[derive(Accounts)]
17pub struct InvokeInstruction<'info> {
18    /// Fee payer needs to be mutable to pay rollover and protocol fees.
19    #[account(mut)]
20    pub fee_payer: Signer<'info>,
21    pub authority: Signer<'info>,
22    /// CHECK: this account
23    #[account(
24    seeds = [&crate::ID.to_bytes()], bump, seeds::program = &account_compression::ID,
25    )]
26    pub registered_program_pda: AccountInfo<'info>,
27    /// CHECK: is checked when emitting the event.
28    pub noop_program: UncheckedAccount<'info>,
29    /// CHECK: this account in account compression program.
30    /// This pda is used to invoke the account compression program.
31    #[account(seeds = [CPI_AUTHORITY_PDA_SEED], bump)]
32    pub account_compression_authority: UncheckedAccount<'info>,
33    /// CHECK: Account compression program is used to update state and address
34    /// Merkle trees.
35    pub account_compression_program: Program<'info, AccountCompression>,
36    /// Sol pool pda is used to store the native sol that has been compressed.
37    /// It's only required when compressing or decompressing sol.
38    #[account(
39        mut,
40        seeds = [SOL_POOL_PDA_SEED], bump
41    )]
42    pub sol_pool_pda: Option<AccountInfo<'info>>,
43    /// Only needs to be provided for decompression as a recipient for the
44    /// decompressed sol.
45    /// Compressed sol originate from authority.
46    #[account(mut)]
47    pub decompression_recipient: Option<AccountInfo<'info>>,
48    pub system_program: Program<'info, System>,
49}
50
51impl<'info> SignerAccounts<'info> for InvokeInstruction<'info> {
52    fn get_fee_payer(&self) -> &Signer<'info> {
53        &self.fee_payer
54    }
55
56    fn get_authority(&self) -> &Signer<'info> {
57        &self.authority
58    }
59}
60
61impl<'info> InvokeAccounts<'info> for InvokeInstruction<'info> {
62    fn get_registered_program_pda(&self) -> &AccountInfo<'info> {
63        &self.registered_program_pda
64    }
65
66    fn get_noop_program(&self) -> &UncheckedAccount<'info> {
67        &self.noop_program
68    }
69
70    fn get_account_compression_authority(&self) -> &UncheckedAccount<'info> {
71        &self.account_compression_authority
72    }
73
74    fn get_account_compression_program(&self) -> &Program<'info, AccountCompression> {
75        &self.account_compression_program
76    }
77
78    fn get_system_program(&self) -> &Program<'info, System> {
79        &self.system_program
80    }
81
82    fn get_sol_pool_pda(&self) -> Option<&AccountInfo<'info>> {
83        self.sol_pool_pda.as_ref()
84    }
85
86    fn get_decompression_recipient(&self) -> Option<&AccountInfo<'info>> {
87        self.decompression_recipient.as_ref()
88    }
89}
90
91#[derive(Debug, PartialEq, Default, Clone, AnchorSerialize, AnchorDeserialize)]
92pub struct InstructionDataInvoke {
93    pub proof: Option<CompressedProof>,
94    pub input_compressed_accounts_with_merkle_context:
95        Vec<PackedCompressedAccountWithMerkleContext>,
96    pub output_compressed_accounts: Vec<OutputCompressedAccountWithPackedContext>,
97    pub relay_fee: Option<u64>,
98    pub new_address_params: Vec<NewAddressParamsPacked>,
99    pub compress_or_decompress_lamports: Option<u64>,
100    pub is_compress: bool,
101}
102
103#[derive(Debug, PartialEq, Default, Clone, AnchorSerialize, AnchorDeserialize)]
104pub struct OutputCompressedAccountWithContext {
105    pub compressed_account: CompressedAccount,
106    pub merkle_tree: Pubkey,
107}
108
109#[derive(Debug, PartialEq, Default, Clone, AnchorSerialize, AnchorDeserialize)]
110pub struct OutputCompressedAccountWithPackedContext {
111    pub compressed_account: CompressedAccount,
112    pub merkle_tree_index: u8,
113}
114
115#[derive(Debug, PartialEq, Default, Clone, Copy, AnchorSerialize, AnchorDeserialize)]
116pub struct NewAddressParamsPacked {
117    pub seed: [u8; 32],
118    pub address_queue_account_index: u8,
119    pub address_merkle_tree_account_index: u8,
120    pub address_merkle_tree_root_index: u16,
121}
122
123#[derive(Debug, PartialEq, Default, Clone, AnchorSerialize, AnchorDeserialize)]
124pub struct NewAddressParams {
125    pub seed: [u8; 32],
126    pub address_queue_pubkey: Pubkey,
127    pub address_merkle_tree_pubkey: Pubkey,
128    pub address_merkle_tree_root_index: u16,
129}