dpp/tokens/
gas_fees_paid_by.rs

1use crate::consensus::basic::data_contract::UnknownGasFeesPaidByError;
2use crate::consensus::basic::BasicError;
3use crate::consensus::ConsensusError;
4use crate::ProtocolError;
5use bincode::{Decode, Encode};
6use derive_more::Display;
7#[cfg(any(
8    feature = "serde-conversion",
9    all(feature = "serde-conversion", feature = "serde-conversion"),
10))]
11use serde::{Deserialize, Serialize};
12
13#[derive(Debug, Clone, Copy, Encode, Decode, Default, PartialEq, Display)]
14#[cfg_attr(
15    any(
16        feature = "serde-conversion",
17        all(feature = "serde-conversion", feature = "serde-conversion"),
18    ),
19    derive(Serialize, Deserialize)
20)]
21pub enum GasFeesPaidBy {
22    /// The user pays the gas fees
23    #[default]
24    DocumentOwner = 0,
25    /// The contract owner pays the gas fees
26    ContractOwner = 1,
27    /// The user is stating his willingness to pay the gas fee if the Contract owner's balance is
28    /// insufficient.
29    PreferContractOwner = 2,
30}
31
32impl From<GasFeesPaidBy> for u8 {
33    fn from(value: GasFeesPaidBy) -> Self {
34        match value {
35            GasFeesPaidBy::DocumentOwner => 0,
36            GasFeesPaidBy::ContractOwner => 1,
37            GasFeesPaidBy::PreferContractOwner => 2,
38        }
39    }
40}
41
42impl TryFrom<u8> for GasFeesPaidBy {
43    type Error = ProtocolError;
44
45    fn try_from(value: u8) -> Result<Self, Self::Error> {
46        match value {
47            0 => Ok(GasFeesPaidBy::DocumentOwner),
48            1 => Ok(GasFeesPaidBy::ContractOwner),
49            2 => Ok(GasFeesPaidBy::PreferContractOwner),
50            value => Err(ProtocolError::ConsensusError(
51                ConsensusError::BasicError(BasicError::UnknownGasFeesPaidByError(
52                    UnknownGasFeesPaidByError::new(vec![0, 1, 2], value as u64),
53                ))
54                .into(),
55            )),
56        }
57    }
58}
59
60impl TryFrom<u64> for GasFeesPaidBy {
61    type Error = ProtocolError;
62
63    fn try_from(value: u64) -> Result<Self, Self::Error> {
64        u8::try_from(value)
65            .map_err(|_| {
66                ProtocolError::ConsensusError(
67                    ConsensusError::BasicError(BasicError::UnknownGasFeesPaidByError(
68                        UnknownGasFeesPaidByError::new(vec![0, 1, 2], value),
69                    ))
70                    .into(),
71                )
72            })?
73            .try_into()
74    }
75}