cw20_legacy/
state.rs

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    /// cap is how many more tokens can be issued by the minter
23    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}