light_compressed_account/instruction_data/
data.rs1use light_zero_copy::ZeroCopyMut;
2
3use crate::{
4 compressed_account::{CompressedAccount, PackedCompressedAccountWithMerkleContext},
5 discriminators::DISCRIMINATOR_INVOKE,
6 instruction_data::{compressed_proof::CompressedProof, traits::LightInstructionData},
7 InstructionDiscriminator, Pubkey, Vec,
8};
9
10#[cfg_attr(
11 all(feature = "std", feature = "anchor"),
12 derive(anchor_lang::AnchorDeserialize, anchor_lang::AnchorSerialize)
13)]
14#[cfg_attr(
15 not(feature = "anchor"),
16 derive(borsh::BorshDeserialize, borsh::BorshSerialize)
17)]
18#[derive(Debug, PartialEq, Default, Clone)]
19pub struct InstructionDataInvoke {
20 pub proof: Option<CompressedProof>,
21 pub input_compressed_accounts_with_merkle_context:
22 Vec<PackedCompressedAccountWithMerkleContext>,
23 pub output_compressed_accounts: Vec<OutputCompressedAccountWithPackedContext>,
24 pub relay_fee: Option<u64>,
25 pub new_address_params: Vec<NewAddressParamsPacked>,
26 pub compress_or_decompress_lamports: Option<u64>,
27 pub is_compress: bool,
28}
29
30impl InstructionDataInvoke {
31 pub fn new(proof: Option<CompressedProof>) -> Self {
32 Self {
33 proof,
34 ..Default::default()
35 }
36 }
37
38 pub fn with_input_compressed_accounts_with_merkle_context(
39 mut self,
40 input_compressed_accounts_with_merkle_context: &[PackedCompressedAccountWithMerkleContext],
41 ) -> Self {
42 if !input_compressed_accounts_with_merkle_context.is_empty() {
43 self.input_compressed_accounts_with_merkle_context
44 .extend_from_slice(input_compressed_accounts_with_merkle_context);
45 }
46 self
47 }
48
49 pub fn with_output_compressed_accounts(
50 mut self,
51 output_compressed_accounts: &[OutputCompressedAccountWithPackedContext],
52 ) -> Self {
53 if !output_compressed_accounts.is_empty() {
54 self.output_compressed_accounts
55 .extend_from_slice(output_compressed_accounts);
56 }
57 self
58 }
59
60 pub fn with_new_addresses(mut self, new_address_params: &[NewAddressParamsPacked]) -> Self {
61 if !new_address_params.is_empty() {
62 self.new_address_params
63 .extend_from_slice(new_address_params);
64 }
65 self
66 }
67
68 pub fn compress_lamports(mut self, lamports: u64) -> Self {
69 self.compress_or_decompress_lamports = Some(lamports);
70 self.is_compress = true;
71 self
72 }
73
74 pub fn decompress_lamports(mut self, lamports: u64) -> Self {
75 self.compress_or_decompress_lamports = Some(lamports);
76 self.is_compress = false;
77 self
78 }
79}
80
81impl InstructionDiscriminator for InstructionDataInvoke {
82 fn discriminator(&self) -> &'static [u8] {
83 &DISCRIMINATOR_INVOKE
84 }
85}
86
87impl LightInstructionData for InstructionDataInvoke {}
88
89#[cfg_attr(
90 all(feature = "std", feature = "anchor"),
91 derive(anchor_lang::AnchorDeserialize, anchor_lang::AnchorSerialize)
92)]
93#[cfg_attr(
94 not(feature = "anchor"),
95 derive(borsh::BorshDeserialize, borsh::BorshSerialize)
96)]
97#[derive(Debug, PartialEq, Default, Clone)]
98pub struct OutputCompressedAccountWithContext {
99 pub compressed_account: CompressedAccount,
100 pub merkle_tree: Pubkey,
101}
102
103#[repr(C)]
104#[cfg_attr(
105 all(feature = "std", feature = "anchor"),
106 derive(anchor_lang::AnchorDeserialize, anchor_lang::AnchorSerialize)
107)]
108#[cfg_attr(
109 not(feature = "anchor"),
110 derive(borsh::BorshDeserialize, borsh::BorshSerialize)
111)]
112#[derive(Debug, PartialEq, Default, Clone, ZeroCopyMut)]
113pub struct OutputCompressedAccountWithPackedContext {
114 pub compressed_account: CompressedAccount,
115 pub merkle_tree_index: u8,
116}
117
118#[repr(C)]
119#[cfg_attr(
120 all(feature = "std", feature = "anchor"),
121 derive(anchor_lang::AnchorDeserialize, anchor_lang::AnchorSerialize)
122)]
123#[cfg_attr(
124 not(feature = "anchor"),
125 derive(borsh::BorshDeserialize, borsh::BorshSerialize)
126)]
127#[derive(Debug, PartialEq, Default, Clone, Copy, ZeroCopyMut)]
128pub struct NewAddressParamsPacked {
129 pub seed: [u8; 32],
130 pub address_queue_account_index: u8,
131 pub address_merkle_tree_account_index: u8,
132 pub address_merkle_tree_root_index: u16,
133}
134
135#[repr(C)]
136#[cfg_attr(
137 all(feature = "std", feature = "anchor"),
138 derive(anchor_lang::AnchorDeserialize, anchor_lang::AnchorSerialize)
139)]
140#[cfg_attr(
141 not(feature = "anchor"),
142 derive(borsh::BorshDeserialize, borsh::BorshSerialize)
143)]
144#[derive(Debug, PartialEq, Default, Clone, Copy, ZeroCopyMut)]
145pub struct NewAddressParamsAssignedPacked {
146 pub seed: [u8; 32],
147 pub address_queue_account_index: u8,
148 pub address_merkle_tree_account_index: u8,
149 pub address_merkle_tree_root_index: u16,
150 pub assigned_to_account: bool,
151 pub assigned_account_index: u8,
152}
153
154impl NewAddressParamsAssignedPacked {
155 pub fn new(address_params: NewAddressParamsPacked, index: Option<u8>) -> Self {
156 Self {
157 seed: address_params.seed,
158 address_queue_account_index: address_params.address_queue_account_index,
159 address_merkle_tree_account_index: address_params.address_merkle_tree_account_index,
160 address_merkle_tree_root_index: address_params.address_merkle_tree_root_index,
161 assigned_to_account: index.is_some(),
162 assigned_account_index: index.unwrap_or_default(),
163 }
164 }
165
166 pub fn assigned_account_index(&self) -> Option<u8> {
167 if self.assigned_to_account {
168 Some(self.assigned_account_index)
169 } else {
170 None
171 }
172 }
173}
174
175#[cfg_attr(
176 all(feature = "std", feature = "anchor"),
177 derive(anchor_lang::AnchorDeserialize, anchor_lang::AnchorSerialize)
178)]
179#[cfg_attr(
180 not(feature = "anchor"),
181 derive(borsh::BorshDeserialize, borsh::BorshSerialize)
182)]
183#[derive(Debug, PartialEq, Default, Clone)]
184pub struct NewAddressParams {
185 pub seed: [u8; 32],
186 pub address_queue_pubkey: Pubkey,
187 pub address_merkle_tree_pubkey: Pubkey,
188 pub address_merkle_tree_root_index: u16,
189}
190
191#[cfg_attr(
192 all(feature = "std", feature = "anchor"),
193 derive(anchor_lang::AnchorDeserialize, anchor_lang::AnchorSerialize)
194)]
195#[cfg_attr(
196 not(feature = "anchor"),
197 derive(borsh::BorshDeserialize, borsh::BorshSerialize)
198)]
199#[derive(Debug, PartialEq, Default, Clone)]
200pub struct NewAddressParamsAssigned {
201 pub seed: [u8; 32],
202 pub address_queue_pubkey: Pubkey,
203 pub address_merkle_tree_pubkey: Pubkey,
204 pub address_merkle_tree_root_index: u16,
205 pub assigned_account_index: Option<u8>,
206}
207
208#[repr(C)]
209#[cfg_attr(
210 all(feature = "std", feature = "anchor"),
211 derive(anchor_lang::AnchorDeserialize, anchor_lang::AnchorSerialize)
212)]
213#[cfg_attr(
214 not(feature = "anchor"),
215 derive(borsh::BorshDeserialize, borsh::BorshSerialize)
216)]
217#[derive(Debug, PartialEq, Default, Clone, Copy, ZeroCopyMut)]
218pub struct PackedReadOnlyAddress {
219 pub address: [u8; 32],
220 pub address_merkle_tree_root_index: u16,
221 pub address_merkle_tree_account_index: u8,
222}
223
224#[cfg_attr(
225 all(feature = "std", feature = "anchor"),
226 derive(anchor_lang::AnchorDeserialize, anchor_lang::AnchorSerialize)
227)]
228#[cfg_attr(
229 not(feature = "anchor"),
230 derive(borsh::BorshDeserialize, borsh::BorshSerialize)
231)]
232#[derive(Debug, PartialEq, Default, Clone)]
233pub struct ReadOnlyAddress {
234 pub address: [u8; 32],
235 pub address_merkle_tree_pubkey: Pubkey,
236 pub address_merkle_tree_root_index: u16,
237}