abstract_std/objects/
deposit_info.rs

1use cw_asset::AssetInfo;
2use schemars::JsonSchema;
3use serde::{Deserialize, Serialize};
4
5use crate::{error::AbstractError, AbstractResult};
6
7/// Helper for handling deposit assets.
8#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, JsonSchema)]
9pub struct DepositInfo {
10    pub asset_info: AssetInfo,
11}
12
13impl DepositInfo {
14    pub fn assert(&self, asset_info: &AssetInfo) -> AbstractResult<()> {
15        if asset_info == &self.asset_info {
16            return Ok(());
17        }
18
19        Err(AbstractError::Assert(format!(
20            "Invalid deposit asset. Expected {}, got {}.",
21            self.asset_info, asset_info
22        )))
23    }
24
25    pub fn get_denom(self) -> AbstractResult<String> {
26        match self.asset_info {
27            AssetInfo::Native(denom) => Ok(denom),
28            AssetInfo::Cw20(..) => Err(AbstractError::Assert(
29                "'denom' only exists for native tokens.".into(),
30            )),
31            _ => panic!("asset not supported"),
32        }
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use cosmwasm_std::Addr;
39
40    use super::*;
41
42    pub const TEST_DENOM1: &str = "uusd";
43    pub const TEST_DENOM2: &str = "uluna";
44    pub const TEST_ADDR1: &str = "1234";
45    pub const TEST_ADDR2: &str = "4321";
46
47    #[coverage_helper::test]
48    fn test_failing_assert_for_native_tokens() {
49        let deposit_info = DepositInfo {
50            asset_info: AssetInfo::Native(TEST_DENOM1.to_string()),
51        };
52        let other_native_token = AssetInfo::Native(TEST_DENOM2.to_string());
53        assert!(deposit_info.assert(&other_native_token).is_err());
54    }
55
56    #[coverage_helper::test]
57    fn test_passing_assert_for_native_tokens() {
58        let deposit_info = DepositInfo {
59            asset_info: AssetInfo::Native(TEST_DENOM1.to_string()),
60        };
61        let other_native_token = AssetInfo::Native(TEST_DENOM1.to_string());
62        assert!(deposit_info.assert(&other_native_token).is_ok());
63    }
64
65    #[coverage_helper::test]
66    fn test_failing_assert_for_nonnative_tokens() {
67        let deposit_info = DepositInfo {
68            asset_info: AssetInfo::Cw20(Addr::unchecked(TEST_ADDR1.to_string())),
69        };
70        let other_native_token = AssetInfo::Cw20(Addr::unchecked(TEST_ADDR2.to_string()));
71        assert!(deposit_info.assert(&other_native_token).is_err());
72    }
73
74    #[coverage_helper::test]
75    fn test_passing_assert_for_nonnative_tokens() {
76        let deposit_info = DepositInfo {
77            asset_info: AssetInfo::Cw20(Addr::unchecked(TEST_ADDR1.to_string())),
78        };
79        let other_native_token = AssetInfo::Cw20(Addr::unchecked(TEST_ADDR1.to_string()));
80        assert!(deposit_info.assert(&other_native_token).is_ok());
81    }
82
83    #[coverage_helper::test]
84    fn test_failing_assert_for_mixed_tokens() {
85        let deposit_info = DepositInfo {
86            asset_info: AssetInfo::Native(TEST_DENOM1.to_string()),
87        };
88        let other_native_token = AssetInfo::Cw20(Addr::unchecked(TEST_DENOM1.to_string()));
89        assert!(deposit_info.assert(&other_native_token).is_err());
90    }
91}