dpp/data_contract/associated_token/
token_distribution_key.rs

1use crate::data_contract::associated_token::token_perpetual_distribution::distribution_recipient::{TokenDistributionRecipient, TokenDistributionResolvedRecipient};
2use crate::errors::ProtocolError;
3use bincode::{Decode, Encode};
4use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize};
5use platform_value::Identifier;
6use serde::{Deserialize, Serialize};
7use std::fmt;
8use crate::data_contract::associated_token::token_perpetual_distribution::reward_distribution_moment::RewardDistributionMoment;
9use crate::prelude::TimestampMillis;
10
11/// Represents the type of token distribution.
12///
13/// - `PreProgrammed`: A scheduled distribution with predefined rules.
14/// - `Perpetual`: A continuous or recurring distribution.
15#[derive(
16    Serialize, Deserialize, Decode, Encode, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Default,
17)]
18pub enum TokenDistributionType {
19    /// A pre-programmed distribution scheduled for a specific time.
20    #[default]
21    PreProgrammed = 0,
22
23    /// A perpetual distribution that occurs at regular intervals.
24    Perpetual = 1,
25}
26
27/// Represents a token distribution with a resolved recipient.
28///
29/// - `PreProgrammed(Identifier)`: A predefined recipient for a scheduled distribution.
30/// - `Perpetual(TokenDistributionResolvedRecipient)`: A resolved recipient for an ongoing distribution.
31#[derive(Serialize, Deserialize, Decode, Encode, Debug, Clone, PartialEq, Eq, PartialOrd)]
32pub enum TokenDistributionTypeWithResolvedRecipient {
33    /// A scheduled distribution with a known recipient.
34    PreProgrammed(Identifier),
35
36    /// A perpetual distribution with a resolved recipient.
37    Perpetual(TokenDistributionResolvedRecipient),
38}
39
40/// Contains information about a specific token distribution instance.
41///
42/// - `PreProgrammed(TimestampMillis, Identifier)`: A scheduled distribution with a timestamp and recipient.
43/// - `Perpetual(RewardDistributionMoment, RewardDistributionMoment, TokenDistributionResolvedRecipient)`:
44///   A perpetual distribution with previous and next distribution moments, along with the resolved recipient.
45#[derive(Serialize, Deserialize, Decode, Encode, Debug, Clone, PartialEq, Eq, PartialOrd)]
46pub enum TokenDistributionInfo {
47    /// A pre-programmed token distribution set for a specific time.
48    /// Contains the scheduled timestamp and the recipient’s identifier.
49    PreProgrammed(TimestampMillis, Identifier),
50
51    /// A perpetual token distribution with moment for distribution.
52    /// The moment is the beginning of the perpetual distribution cycle
53    /// Includes the last and next distribution times and the resolved recipient.
54    Perpetual(RewardDistributionMoment, TokenDistributionResolvedRecipient),
55}
56
57impl From<TokenDistributionInfo> for TokenDistributionTypeWithResolvedRecipient {
58    fn from(info: TokenDistributionInfo) -> Self {
59        match info {
60            TokenDistributionInfo::PreProgrammed(_, recipient) => {
61                TokenDistributionTypeWithResolvedRecipient::PreProgrammed(recipient)
62            }
63            TokenDistributionInfo::Perpetual(_, recipient) => {
64                TokenDistributionTypeWithResolvedRecipient::Perpetual(recipient)
65            }
66        }
67    }
68}
69
70impl From<&TokenDistributionInfo> for TokenDistributionTypeWithResolvedRecipient {
71    fn from(info: &TokenDistributionInfo) -> Self {
72        match info {
73            TokenDistributionInfo::PreProgrammed(_, recipient) => {
74                TokenDistributionTypeWithResolvedRecipient::PreProgrammed(*recipient)
75            }
76            TokenDistributionInfo::Perpetual(_, recipient) => {
77                TokenDistributionTypeWithResolvedRecipient::Perpetual(recipient.clone())
78            }
79        }
80    }
81}
82
83impl fmt::Display for TokenDistributionType {
84    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
85        match self {
86            TokenDistributionType::PreProgrammed => write!(f, "PreProgrammed"),
87            TokenDistributionType::Perpetual => write!(f, "Perpetual"),
88        }
89    }
90}
91
92#[derive(
93    Serialize,
94    Deserialize,
95    Decode,
96    Encode,
97    PlatformSerialize,
98    PlatformDeserialize,
99    Debug,
100    Clone,
101    PartialEq,
102    Eq,
103)]
104#[platform_serialize(unversioned)]
105pub struct TokenDistributionKey {
106    pub token_id: Identifier,
107    pub recipient: TokenDistributionRecipient,
108    pub distribution_type: TokenDistributionType,
109}