iota_types/
coin_manager.rs1use move_core_types::{ident_str, identifier::IdentStr, language_storage::TypeTag};
5use schemars::JsonSchema;
6use serde::{Deserialize, Serialize};
7
8use crate::{
9 IOTA_FRAMEWORK_ADDRESS, StructTag,
10 coin::{CoinMetadata, TreasuryCap},
11 error::IotaError,
12 id::UID,
13 object::{Data, Object},
14};
15
16pub const COIN_MANAGER_MODULE_NAME: &IdentStr = ident_str!("coin_manager");
17pub const COIN_MANAGER_STRUCT_NAME: &IdentStr = ident_str!("CoinManager");
18pub const COIN_MANAGER_TREASURY_CAP_STRUCT_NAME: &IdentStr = ident_str!("CoinManagerTreasuryCap");
19
20#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq, JsonSchema)]
27pub struct CoinManager {
28 pub id: UID,
30 pub treasury_cap: TreasuryCap,
32 pub metadata: Option<CoinMetadata>,
34 pub immutable_metadata: Option<ImmutableCoinMetadata>,
37 pub maximum_supply: Option<u64>,
40 pub supply_immutable: bool,
43 pub metadata_immutable: bool,
46}
47
48impl CoinManager {
49 pub fn is_coin_manager(object_type: &StructTag) -> bool {
50 object_type.address == IOTA_FRAMEWORK_ADDRESS
51 && object_type.module.as_ident_str() == COIN_MANAGER_MODULE_NAME
52 && object_type.name.as_ident_str() == COIN_MANAGER_STRUCT_NAME
53 }
54
55 pub fn from_bcs_bytes(content: &[u8]) -> Result<Self, IotaError> {
56 bcs::from_bytes(content).map_err(|err| IotaError::ObjectDeserialization {
57 error: format!("Unable to deserialize CoinManager object: {err}"),
58 })
59 }
60
61 pub fn type_(type_param: StructTag) -> StructTag {
62 StructTag {
63 address: IOTA_FRAMEWORK_ADDRESS,
64 name: COIN_MANAGER_STRUCT_NAME.to_owned(),
65 module: COIN_MANAGER_MODULE_NAME.to_owned(),
66 type_params: vec![TypeTag::Struct(Box::new(type_param))],
67 }
68 }
69}
70
71#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq, JsonSchema)]
74pub struct ImmutableCoinMetadata {
75 pub decimals: u8,
77 pub name: String,
79 pub symbol: String,
81 pub description: String,
83 pub icon_url: Option<String>,
85}
86
87#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq, JsonSchema)]
90pub struct CoinManagerTreasuryCap {
91 pub id: UID,
93}
94
95impl CoinManagerTreasuryCap {
96 pub fn is_coin_manager_treasury_cap(object_type: &StructTag) -> bool {
97 object_type.address == IOTA_FRAMEWORK_ADDRESS
98 && object_type.module.as_ident_str() == COIN_MANAGER_MODULE_NAME
99 && object_type.name.as_ident_str() == COIN_MANAGER_TREASURY_CAP_STRUCT_NAME
100 }
101}
102
103impl TryFrom<Object> for CoinManager {
104 type Error = IotaError;
105 fn try_from(object: Object) -> Result<Self, Self::Error> {
106 TryFrom::try_from(&object)
107 }
108}
109
110impl TryFrom<&Object> for CoinManager {
111 type Error = IotaError;
112 fn try_from(object: &Object) -> Result<Self, Self::Error> {
113 if let Data::Move(o) = &object.data {
114 if o.type_().is_coin_manager() {
115 return CoinManager::from_bcs_bytes(o.contents());
116 }
117 }
118
119 Err(IotaError::Type {
120 error: format!("Object type is not a CoinManager: {object:?}"),
121 })
122 }
123}