account_compression/state/
address.rs

1use std::mem;
2
3use aligned_sized::aligned_sized;
4use anchor_lang::prelude::*;
5use light_hasher::Poseidon;
6use light_indexed_merkle_tree::{
7    zero_copy::{IndexedMerkleTreeZeroCopy, IndexedMerkleTreeZeroCopyMut},
8    IndexedMerkleTree,
9};
10use light_merkle_tree_metadata::{
11    access::AccessMetadata, merkle_tree::MerkleTreeMetadata, rollover::RolloverMetadata,
12};
13
14use crate::utils::check_signer_is_registered_or_authority::GroupAccess;
15
16#[account(zero_copy)]
17#[aligned_sized(anchor)]
18#[derive(AnchorDeserialize, Debug)]
19pub struct AddressMerkleTreeAccount {
20    pub metadata: MerkleTreeMetadata,
21}
22
23impl GroupAccess for AddressMerkleTreeAccount {
24    fn get_owner(&self) -> Pubkey {
25        self.metadata.access_metadata.owner.into()
26    }
27    fn get_program_owner(&self) -> Pubkey {
28        self.metadata
29            .access_metadata
30            .program_owner
31            .to_bytes()
32            .into()
33    }
34}
35
36impl AddressMerkleTreeAccount {
37    pub fn size(
38        height: usize,
39        changelog_size: usize,
40        roots_size: usize,
41        canopy_depth: usize,
42        indexed_changelog_size: usize,
43    ) -> usize {
44        8 + mem::size_of::<Self>()
45            + IndexedMerkleTree::<Poseidon, usize, 26, 16>::size_in_account(
46                height,
47                changelog_size,
48                roots_size,
49                canopy_depth,
50                indexed_changelog_size,
51            )
52    }
53
54    pub fn init(
55        &mut self,
56        access_metadata: AccessMetadata,
57        rollover_metadata: RolloverMetadata,
58        associated_queue: Pubkey,
59    ) {
60        self.metadata
61            .init(access_metadata, rollover_metadata, associated_queue.into())
62    }
63}
64
65pub fn address_merkle_tree_from_bytes_zero_copy(
66    data: &[u8],
67) -> Result<IndexedMerkleTreeZeroCopy<Poseidon, usize, 26, 16>> {
68    let data = &data[8 + mem::size_of::<AddressMerkleTreeAccount>()..];
69    let merkle_tree =
70        IndexedMerkleTreeZeroCopy::from_bytes_zero_copy(data).map_err(ProgramError::from)?;
71    Ok(merkle_tree)
72}
73
74pub fn address_merkle_tree_from_bytes_zero_copy_init(
75    data: &mut [u8],
76    height: usize,
77    canopy_depth: usize,
78    changelog_capacity: usize,
79    roots_capacity: usize,
80    indexed_changelog_capacity: usize,
81) -> Result<IndexedMerkleTreeZeroCopyMut<Poseidon, usize, 26, 16>> {
82    let data = &mut data[8 + mem::size_of::<AddressMerkleTreeAccount>()..];
83    let merkle_tree = IndexedMerkleTreeZeroCopyMut::from_bytes_zero_copy_init(
84        data,
85        height,
86        canopy_depth,
87        changelog_capacity,
88        roots_capacity,
89        indexed_changelog_capacity,
90    )
91    .map_err(ProgramError::from)?;
92    Ok(merkle_tree)
93}
94
95pub fn address_merkle_tree_from_bytes_zero_copy_mut(
96    data: &mut [u8],
97) -> Result<IndexedMerkleTreeZeroCopyMut<Poseidon, usize, 26, 16>> {
98    let data = &mut data[8 + mem::size_of::<AddressMerkleTreeAccount>()..];
99    let merkle_tree =
100        IndexedMerkleTreeZeroCopyMut::from_bytes_zero_copy_mut(data).map_err(ProgramError::from)?;
101    Ok(merkle_tree)
102}