light_merkle_tree_metadata/
access.rs

1use bytemuck::{Pod, Zeroable};
2use light_compressed_account::pubkey::Pubkey;
3use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout};
4
5use crate::{AnchorDeserialize, AnchorSerialize};
6
7#[repr(C)]
8#[derive(
9    AnchorDeserialize,
10    AnchorSerialize,
11    Debug,
12    PartialEq,
13    Default,
14    Pod,
15    Zeroable,
16    Clone,
17    Copy,
18    FromBytes,
19    IntoBytes,
20    KnownLayout,
21    Immutable,
22)]
23pub struct AccessMetadata {
24    /// Owner of the Merkle tree.
25    pub owner: Pubkey,
26    /// Program owner of the Merkle tree. This will be used for program owned Merkle trees.
27    pub program_owner: Pubkey,
28    /// Optional privileged forester pubkey, can be set for custom Merkle trees
29    /// without a network fee. Merkle trees without network fees are not
30    /// forested by light foresters. The variable is not used in the account
31    /// compression program but the registry program. The registry program
32    /// implements access control to prevent contention during forester. The
33    /// forester pubkey specified in this struct can bypass contention checks.
34    pub forester: Pubkey,
35}
36
37impl AccessMetadata {
38    pub fn new(owner: Pubkey, program_owner: Option<Pubkey>, forester: Option<Pubkey>) -> Self {
39        Self {
40            owner,
41            program_owner: program_owner.unwrap_or_default(),
42            forester: forester.unwrap_or_default(),
43        }
44    }
45}
46
47#[test]
48fn test_new() {
49    let owner = Pubkey::new_unique();
50    let program_owner = Pubkey::new_unique();
51    let forester = Pubkey::new_unique();
52    let access_metadata = AccessMetadata::new(owner, Some(program_owner), Some(forester));
53    assert_eq!(access_metadata.owner, owner);
54    assert_eq!(access_metadata.program_owner, program_owner);
55    assert_eq!(access_metadata.forester, forester);
56
57    // With no program owner and forester
58    let access_metadata = AccessMetadata::new(owner, None, None);
59    assert_eq!(access_metadata.owner, owner);
60    assert_eq!(access_metadata.program_owner, Pubkey::default());
61    assert_eq!(access_metadata.forester, Pubkey::default());
62}