abstract_cw20/
denom.rs

1use cosmwasm_schema::cw_serde;
2use cosmwasm_std::{Addr, Deps, StdResult, Uint128};
3
4use crate::{Cw20QueryMsg, TokenInfoResponse};
5
6#[cw_serde]
7pub enum Denom {
8    Native(String),
9    Cw20(Addr),
10}
11
12#[cw_serde]
13pub enum UncheckedDenom {
14    Native(String),
15    Cw20(String),
16}
17
18#[cw_serde]
19pub struct DepositInfo {
20    amount: Uint128,
21    denom: UncheckedDenom,
22}
23
24impl UncheckedDenom {
25    pub fn into_checked(self, deps: Deps) -> StdResult<Denom> {
26        match self {
27            Self::Native(denom) => Ok(Denom::Native(denom)),
28            Self::Cw20(addr) => {
29                let addr = deps.api.addr_validate(&addr)?;
30                let _info: TokenInfoResponse = deps
31                    .querier
32                    .query_wasm_smart(addr.clone(), &Cw20QueryMsg::TokenInfo {})?;
33                Ok(Denom::Cw20(addr))
34            }
35        }
36    }
37}
38
39// TODO: remove or figure out where needed
40impl Default for Denom {
41    fn default() -> Denom {
42        Denom::Native(String::default())
43    }
44}
45
46impl Denom {
47    pub fn is_empty(&self) -> bool {
48        match self {
49            Denom::Native(string) => string.is_empty(),
50            Denom::Cw20(addr) => addr.as_ref().is_empty(),
51        }
52    }
53}