light_system_program/invoke/
instruction.rs1use 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#[derive(Accounts)]
17pub struct InvokeInstruction<'info> {
18 #[account(mut)]
20 pub fee_payer: Signer<'info>,
21 pub authority: Signer<'info>,
22 #[account(
24 seeds = [&crate::ID.to_bytes()], bump, seeds::program = &account_compression::ID,
25 )]
26 pub registered_program_pda: AccountInfo<'info>,
27 pub noop_program: UncheckedAccount<'info>,
29 #[account(seeds = [CPI_AUTHORITY_PDA_SEED], bump)]
32 pub account_compression_authority: UncheckedAccount<'info>,
33 pub account_compression_program: Program<'info, AccountCompression>,
36 #[account(
39 mut,
40 seeds = [SOL_POOL_PDA_SEED], bump
41 )]
42 pub sol_pool_pda: Option<AccountInfo<'info>>,
43 #[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}