abstract_os/objects/
deposit_info.rs

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