dpp/tokens/
token_amount_on_contract_token.rs

1use crate::balances::credits::TokenAmount;
2use crate::consensus::basic::data_contract::UnknownDocumentActionTokenEffectError;
3use crate::consensus::basic::BasicError;
4use crate::consensus::ConsensusError;
5use crate::data_contract::TokenContractPosition;
6use crate::tokens::gas_fees_paid_by::GasFeesPaidBy;
7use crate::ProtocolError;
8use platform_value::Identifier;
9
10#[derive(Debug, PartialEq, Clone, Copy, Default)]
11pub enum DocumentActionTokenEffect {
12    /// When the document action occurs the token is transferred to the balance of the contract owner
13    #[default]
14    TransferTokenToContractOwner,
15    /// When the document action occurs the token is burned
16    /// This option is not available for external tokens.
17    BurnToken,
18}
19
20impl From<DocumentActionTokenEffect> for u8 {
21    fn from(value: DocumentActionTokenEffect) -> Self {
22        match value {
23            DocumentActionTokenEffect::TransferTokenToContractOwner => 0,
24            DocumentActionTokenEffect::BurnToken => 1,
25        }
26    }
27}
28
29impl TryFrom<u8> for DocumentActionTokenEffect {
30    type Error = ProtocolError;
31
32    fn try_from(value: u8) -> Result<Self, Self::Error> {
33        match value {
34            0 => Ok(DocumentActionTokenEffect::TransferTokenToContractOwner),
35            1 => Ok(DocumentActionTokenEffect::BurnToken),
36            other => Err(ProtocolError::ConsensusError(
37                ConsensusError::BasicError(BasicError::UnknownDocumentActionTokenEffectError(
38                    UnknownDocumentActionTokenEffectError::new(vec![0, 1], other as u64),
39                ))
40                .into(),
41            )),
42        }
43    }
44}
45
46impl TryFrom<u64> for DocumentActionTokenEffect {
47    type Error = ProtocolError;
48
49    fn try_from(value: u64) -> Result<Self, Self::Error> {
50        u8::try_from(value)
51            .map_err(|_| {
52                ProtocolError::ConsensusError(
53                    ConsensusError::BasicError(BasicError::UnknownDocumentActionTokenEffectError(
54                        UnknownDocumentActionTokenEffectError::new(vec![0, 1], value),
55                    ))
56                    .into(),
57                )
58            })?
59            .try_into()
60    }
61}
62
63#[derive(Debug, PartialEq, Clone, Copy, Default)]
64pub struct DocumentActionTokenCost {
65    /// If this is not set, it means that we are using our own contract id
66    pub contract_id: Option<Identifier>,
67    /// Token contract position
68    pub token_contract_position: TokenContractPosition,
69    /// The amount
70    pub token_amount: TokenAmount,
71    /// The amount
72    pub effect: DocumentActionTokenEffect,
73    /// Who is paying for gas fees for this action
74    pub gas_fees_paid_by: GasFeesPaidBy,
75}