ic_query/icrc/model/
token_metadata.rs1use serde::{Deserialize, Serialize};
4use serde_json::Value as JsonValue;
5
6#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
13pub struct IcrcTokenData {
14 pub token_name: String,
16 pub token_symbol: String,
18 pub decimals: u8,
20 pub transfer_fee: String,
22 pub total_supply: String,
24 pub minting_account_owner: Option<String>,
26 pub minting_account_subaccount_hex: Option<String>,
28 pub supported_standards: Vec<IcrcTokenStandardRow>,
30 pub metadata: Vec<IcrcTokenMetadataRow>,
32}
33
34#[cfg_attr(
41 any(feature = "icrc-host", feature = "sns-host"),
42 derive(ic_platform::candid::contract::CandidType)
43)]
44#[cfg_attr(
45 any(feature = "icrc-host", feature = "sns-host"),
46 candid_path("ic_platform::candid::contract")
47)]
48#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
49pub struct IcrcTokenStandardRow {
50 pub name: String,
52 pub url: String,
54}
55
56#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
63pub struct IcrcTokenMetadataRow {
64 pub key: String,
66 pub value_type: IcrcMetadataValueKind,
68 pub value: JsonValue,
70}
71
72#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
79#[serde(rename_all = "snake_case")]
80pub enum IcrcMetadataValueKind {
81 Nat,
83 Int,
85 Text,
87 Blob,
89}
90
91impl IcrcMetadataValueKind {
92 #[must_use]
94 pub const fn as_str(self) -> &'static str {
95 match self {
96 Self::Nat => "nat",
97 Self::Int => "int",
98 Self::Text => "text",
99 Self::Blob => "blob",
100 }
101 }
102}
103
104#[cfg(test)]
105mod tests {
106 use super::*;
107
108 #[test]
109 fn metadata_value_kind_labels_round_trip() {
110 for (kind, label) in [
111 (IcrcMetadataValueKind::Nat, "nat"),
112 (IcrcMetadataValueKind::Int, "int"),
113 (IcrcMetadataValueKind::Text, "text"),
114 (IcrcMetadataValueKind::Blob, "blob"),
115 ] {
116 assert_eq!(
117 serde_json::to_string(&kind).unwrap(),
118 format!("\"{label}\"")
119 );
120 assert_eq!(
121 serde_json::from_str::<IcrcMetadataValueKind>(&format!("\"{label}\"")).unwrap(),
122 kind
123 );
124 assert_eq!(kind.as_str(), label);
125 }
126 }
127}
128
129#[derive(Clone, Debug, Eq, PartialEq)]
136pub enum IcrcIndexData {
137 Found(String),
139 Unavailable(String),
141}