1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4use cosmwasm_std::{CanonicalAddr, Uint128};
5use cw_storage_plus::{Item, Map};
6
7use cw20::AllowanceResponse;
8
9#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)]
10#[serde(rename_all = "snake_case")]
11pub struct TokenInfo {
12 pub name: String,
13 pub symbol: String,
14 pub decimals: u8,
15 pub total_supply: Uint128,
16 pub mint: Option<MinterData>,
17}
18
19#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)]
20pub struct MinterData {
21 pub minter: CanonicalAddr,
22 pub cap: Option<Uint128>,
24}
25
26impl TokenInfo {
27 pub fn get_cap(&self) -> Option<Uint128> {
28 self.mint.as_ref().and_then(|v| v.cap)
29 }
30}
31
32pub const TOKEN_INFO: Item<TokenInfo> = Item::new("\u{0}\ntoken_info");
33pub const BALANCES: Map<&[u8], Uint128> = Map::new("balance");
34pub const ALLOWANCES: Map<(&[u8], &[u8]), AllowanceResponse> = Map::new("allowance");
35
36#[cfg(test)]
37mod test {
38 use super::*;
39
40 use cosmwasm_std::testing::mock_dependencies;
41 use cosmwasm_std::{StdResult, Storage};
42 use cosmwasm_storage::{singleton, singleton_read};
43
44 pub static TOKEN_INFO_KEY: &[u8] = b"token_info";
45
46 pub fn store_token_info(storage: &mut dyn Storage, token_info: &TokenInfo) -> StdResult<()> {
47 singleton(storage, TOKEN_INFO_KEY).save(token_info)
48 }
49 pub fn read_token_info(storage: &dyn Storage) -> StdResult<TokenInfo> {
50 singleton_read(storage, TOKEN_INFO_KEY).load()
51 }
52
53 #[test]
54 fn token_info_legacy_compatibility() {
55 let mut deps = mock_dependencies(&[]);
56 store_token_info(
57 &mut deps.storage,
58 &TokenInfo {
59 name: "test".to_string(),
60 symbol: "TEST".to_string(),
61 decimals: 6,
62 total_supply: Default::default(),
63 mint: None,
64 },
65 )
66 .unwrap();
67
68 assert_eq!(
69 TOKEN_INFO.load(&deps.storage).unwrap(),
70 read_token_info(&deps.storage).unwrap()
71 );
72 }
73}