1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
use std::collections::HashMap;

use {
    super::{Indexing, Service},
    anchor_lang::prelude::*,
    hpl_utils::Default,
};

/// Project State Account
/// This account represents the cenntralized state and confnigurations of an NFT project on the Honeycomb Protocol.
/// PDA: ['project', key]
/// Category: project_state
#[account]
#[derive(PartialEq, Eq, Debug)]
pub struct Project {
    /// Bump value used for PDA.
    pub bump: u8,

    /// Public key of the authority controlling this project.
    pub authority: Pubkey,

    /// Unique public key identifier for this project account.
    pub key: Pubkey,

    /// Public key of the driver wallet having partial authority of this project.
    pub driver: Pubkey,

    /// Name of the project.
    pub name: String,

    /// Indexing information for the associated mints of the NFT Collection.
    pub mint_indexing: Indexing,

    /// List of honeycomb services associated with this project.
    pub services: Vec<Service>,

    /// List of nft collections (public keys) associated with this project.
    pub collections: Vec<Pubkey>,

    /// List of public keys representing the nft creators involved in this project.
    pub creators: Vec<Pubkey>,

    /// List of allowed programs that can interact (CPI) with this project.
    /// If it's emmpty only honeycomb programs will be able to perform CPI with this project.
    pub allowed_programs: Vec<Pubkey>,

    /// Configuration for profile data stored as key-value pairs in a HashMap.
    pub profile_data_config: HashMap<String, ProfileDataType>,

    /// List of public keys representing the nft creators involved in this project.
    pub merkle_trees: Vec<Pubkey>,
}

/// Default implementation for the `Project` struct.
/// It sets default values for each field when creating a new `Project` instance.
impl Default for Project {
    const LEN: usize = 256 + 8; // base size + 8 align

    /// Sets default values for each field of the `Project` struct.
    fn set_defaults(&mut self) {
        self.bump = 0;
        self.key = Pubkey::default();
        self.driver = Pubkey::default();
        self.name = "".to_string();
        self.mint_indexing = Indexing::default();
        self.services = vec![];
        self.collections = vec![];
        self.creators = vec![];
        self.allowed_programs = vec![];
        self.profile_data_config = HashMap::new();
        self.merkle_trees = vec![];
    }
}

/// Enum representing the different types of profile data for the `ProfileDataType` field
/// in the `Project` struct.
#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug, Eq, PartialEq)]
pub enum ProfileDataType {
    /// Single value profile data.
    SingleValue,

    /// Multi-value profile data.
    MultiValue,

    /// Profile data stored as an entity with merkle tree characteristics.
    Entity {
        /// Maximum depth of the merkle tree.
        merkle_tree_max_depth: u32,

        /// Maximum buffer size for the merkle tree.
        merkle_tree_max_buffer_size: u32,
    },
}

/// Implementation for the `ProfileDataType` enum.
impl ProfileDataType {
    /// Length of the `ProfileDataType` enum in bytes.
    pub const LEN: usize = 12 + 4;
}