dpp/data_contract/associated_token/token_configuration/
mod.rs

1use crate::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0;
2#[cfg(feature = "json-conversion")]
3use crate::serialization::JsonConvertible;
4#[cfg(feature = "value-conversion")]
5use crate::serialization::ValueConvertible;
6use bincode::{Decode, Encode};
7use derive_more::From;
8use serde::{Deserialize, Serialize};
9use std::borrow::Cow;
10use std::fmt;
11
12pub mod accessors;
13mod methods;
14pub mod v0;
15
16#[cfg_attr(feature = "json-conversion", derive(JsonConvertible))]
17#[cfg_attr(feature = "value-conversion", derive(ValueConvertible))]
18#[derive(Serialize, Deserialize, Encode, Decode, Debug, Clone, PartialEq, Eq, From)]
19#[serde(tag = "$formatVersion")]
20pub enum TokenConfiguration {
21    #[serde(rename = "0")]
22    V0(TokenConfigurationV0),
23}
24impl TokenConfiguration {
25    pub fn as_cow_v0(&self) -> Cow<'_, TokenConfigurationV0> {
26        match self {
27            TokenConfiguration::V0(v0) => Cow::Borrowed(v0),
28        }
29    }
30}
31
32impl fmt::Display for TokenConfiguration {
33    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
34        match self {
35            TokenConfiguration::V0(v0) => write!(f, "{}", v0),
36        }
37    }
38}
39
40#[cfg(all(test, feature = "json-conversion"))]
41mod tests {
42    use super::*;
43    use crate::serialization::JsonConvertible;
44
45    #[test]
46    fn token_configuration_large_supply_json_round_trip() {
47        let mut config = TokenConfigurationV0::default_most_restrictive();
48        config.base_supply = u64::MAX;
49        let config = TokenConfiguration::V0(config);
50
51        let json = config.to_json().expect("to_json should succeed");
52
53        // u64::MAX > JS MAX_SAFE_INTEGER, so it should be serialized as a string
54        assert!(
55            json["baseSupply"].is_string(),
56            "baseSupply should be a string for large values, got: {:?}",
57            json["baseSupply"]
58        );
59        assert_eq!(json["baseSupply"].as_str().unwrap(), u64::MAX.to_string());
60
61        let restored = TokenConfiguration::from_json(json).expect("from_json should succeed");
62        assert_eq!(config, restored);
63    }
64}