account_compression/state/
address.rs1use 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}