light_compressed_account/instruction_data/
data.rs1use std::collections::HashMap;
2
3use crate::{
4 compressed_account::{CompressedAccount, PackedCompressedAccountWithMerkleContext},
5 instruction_data::compressed_proof::CompressedProof,
6 AnchorDeserialize, AnchorSerialize, Pubkey,
7};
8
9#[derive(Debug, PartialEq, Default, Clone, AnchorDeserialize, AnchorSerialize)]
10pub struct InstructionDataInvoke {
11 pub proof: Option<CompressedProof>,
12 pub input_compressed_accounts_with_merkle_context:
13 Vec<PackedCompressedAccountWithMerkleContext>,
14 pub output_compressed_accounts: Vec<OutputCompressedAccountWithPackedContext>,
15 pub relay_fee: Option<u64>,
16 pub new_address_params: Vec<NewAddressParamsPacked>,
17 pub compress_or_decompress_lamports: Option<u64>,
18 pub is_compress: bool,
19}
20
21#[derive(Debug, PartialEq, Default, Clone, AnchorDeserialize, AnchorSerialize)]
22pub struct OutputCompressedAccountWithContext {
23 pub compressed_account: CompressedAccount,
24 pub merkle_tree: Pubkey,
25}
26
27#[derive(Debug, PartialEq, Default, Clone, AnchorDeserialize, AnchorSerialize)]
28pub struct OutputCompressedAccountWithPackedContext {
29 pub compressed_account: CompressedAccount,
30 pub merkle_tree_index: u8,
31}
32
33#[derive(Debug, PartialEq, Default, Clone, Copy, AnchorDeserialize, AnchorSerialize)]
34pub struct NewAddressParamsPacked {
35 pub seed: [u8; 32],
36 pub address_queue_account_index: u8,
37 pub address_merkle_tree_account_index: u8,
38 pub address_merkle_tree_root_index: u16,
39}
40
41#[derive(Debug, PartialEq, Default, Clone, Copy, AnchorDeserialize, AnchorSerialize)]
42pub struct NewAddressParamsAssignedPacked {
43 pub seed: [u8; 32],
44 pub address_queue_account_index: u8,
45 pub address_merkle_tree_account_index: u8,
46 pub address_merkle_tree_root_index: u16,
47 pub assigned_to_account: bool,
48 pub assigned_account_index: u8,
49}
50
51impl NewAddressParamsAssignedPacked {
52 pub fn new(address_params: NewAddressParamsPacked, index: Option<u8>) -> Self {
53 Self {
54 seed: address_params.seed,
55 address_queue_account_index: address_params.address_queue_account_index,
56 address_merkle_tree_account_index: address_params.address_merkle_tree_account_index,
57 address_merkle_tree_root_index: address_params.address_merkle_tree_root_index,
58 assigned_to_account: index.is_some(),
59 assigned_account_index: index.unwrap_or_default(),
60 }
61 }
62
63 pub fn assigned_account_index(&self) -> Option<u8> {
64 if self.assigned_to_account {
65 Some(self.assigned_account_index)
66 } else {
67 None
68 }
69 }
70}
71
72#[derive(Debug, PartialEq, Default, Clone, AnchorDeserialize, AnchorSerialize)]
73pub struct NewAddressParams {
74 pub seed: [u8; 32],
75 pub address_queue_pubkey: Pubkey,
76 pub address_merkle_tree_pubkey: Pubkey,
77 pub address_merkle_tree_root_index: u16,
78}
79
80#[derive(Debug, PartialEq, Default, Clone, AnchorDeserialize, AnchorSerialize)]
81pub struct NewAddressParamsAssigned {
82 pub seed: [u8; 32],
83 pub address_queue_pubkey: Pubkey,
84 pub address_merkle_tree_pubkey: Pubkey,
85 pub address_merkle_tree_root_index: u16,
86 pub assigned_account_index: Option<u8>,
87}
88
89#[derive(Debug, PartialEq, Default, Clone, Copy, AnchorDeserialize, AnchorSerialize)]
90pub struct PackedReadOnlyAddress {
91 pub address: [u8; 32],
92 pub address_merkle_tree_root_index: u16,
93 pub address_merkle_tree_account_index: u8,
94}
95
96#[derive(Debug, PartialEq, Default, Clone, AnchorDeserialize, AnchorSerialize)]
97pub struct ReadOnlyAddress {
98 pub address: [u8; 32],
99 pub address_merkle_tree_pubkey: Pubkey,
100 pub address_merkle_tree_root_index: u16,
101}
102pub fn pack_pubkey(pubkey: &Pubkey, hash_set: &mut HashMap<Pubkey, u8>) -> u8 {
104 match hash_set.get(pubkey) {
105 Some(index) => *index,
106 None => {
107 let index = hash_set.len() as u8;
108 hash_set.insert(*pubkey, index);
109 index
110 }
111 }
112}
113
114pub fn pack_pubkey_usize(pubkey: &Pubkey, hash_set: &mut HashMap<Pubkey, usize>) -> u8 {
115 match hash_set.get(pubkey) {
116 Some(index) => (*index) as u8,
117 None => {
118 let index = hash_set.len();
119 hash_set.insert(*pubkey, index);
120 index as u8
121 }
122 }
123}