light_compressed_account/instruction_data/
data.rs

1use 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}
102// TODO: move
103pub 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}