abstract_testing/
mock_ans.rs

1use abstract_std::{
2    ans_host::{
3        state::{
4            ASSET_ADDRESSES, ASSET_PAIRINGS, CHANNELS, CONTRACT_ADDRESSES, POOL_METADATA,
5            REGISTERED_DEXES,
6        },
7        AssetPair,
8    },
9    objects::{
10        pool_id::UncheckedPoolAddress, AssetEntry, ChannelEntry, ContractEntry, DexAssetPairing,
11        PoolMetadata, PoolReference, PoolType, UniquePoolId,
12    },
13};
14use cosmwasm_std::{
15    testing::{MockApi, MockQuerier},
16    Addr,
17};
18use cw_asset::AssetInfo;
19
20use crate::{addresses::*, ans::*, MockQuerierBuilder};
21
22/// mirror ANS state
23/// ```rust,ignore
24/// use abstract_std::ans_host::state::{
25///     ASSET_ADDRESSES, ASSET_PAIRINGS, CHANNELS, CONTRACT_ADDRESSES, POOL_METADATA,
26///     REGISTERED_DEXES,
27/// };
28/// ```
29pub struct MockAnsHost {
30    pub contracts: Vec<(ContractEntry, Addr)>,
31    pub assets: Vec<(AssetEntry, AssetInfo)>,
32    pub channels: Vec<(ChannelEntry, String)>,
33    pub pools: Vec<(UncheckedPoolAddress, PoolMetadata)>,
34    pub mock_api: MockApi,
35}
36
37impl MockAnsHost {
38    pub fn new(mock_api: MockApi) -> Self {
39        Self {
40            contracts: vec![],
41            assets: vec![],
42            channels: vec![],
43            pools: vec![],
44            mock_api,
45        }
46    }
47
48    pub fn to_querier(self) -> MockQuerier {
49        self.insert_into(MockQuerierBuilder::default()).build()
50    }
51
52    pub fn insert_into(self, querier_builder: MockQuerierBuilder) -> MockQuerierBuilder {
53        let abstract_addrs = AbstractMockAddrs::new(self.mock_api);
54        let mut querier_builder = querier_builder
55            .with_contract_map_entries(
56                &abstract_addrs.ans_host,
57                ASSET_ADDRESSES,
58                self.assets.iter().map(|(a, b)| (a, b.clone())).collect(),
59            )
60            .with_contract_map_entries(
61                &abstract_addrs.ans_host,
62                CONTRACT_ADDRESSES,
63                self.contracts.iter().map(|(a, b)| (a, b.clone())).collect(),
64            )
65            .with_contract_map_entries(
66                &abstract_addrs.ans_host,
67                CHANNELS,
68                self.channels.iter().map(|(a, b)| (a, b.clone())).collect(),
69            );
70
71        let mut unique_id = UniquePoolId::new(0);
72        let mut dexes = vec![];
73        for (pool_addr, pool_meta) in self.pools {
74            let dex = pool_meta.dex.clone();
75            if !dexes.contains(&dex) {
76                dexes.push(dex);
77            }
78            let pool_addr = pool_addr.check(&MockApi::default()).unwrap();
79            querier_builder = querier_builder.with_contract_map_entries(
80                &abstract_addrs.ans_host,
81                POOL_METADATA,
82                vec![(unique_id, pool_meta.clone())],
83            );
84            // add pairs for this pool
85            for (i, asset_x) in pool_meta.assets.iter().enumerate() {
86                for (j, asset_y) in pool_meta.assets.iter().enumerate() {
87                    // Skip self-pairings
88                    if i == j || asset_x == asset_y {
89                        continue;
90                    }
91                    let pair: AssetPair = (asset_x.clone(), asset_y.clone());
92                    let pair: DexAssetPairing =
93                        DexAssetPairing::new(pair.0.clone(), pair.1.clone(), &pool_meta.dex);
94                    querier_builder = querier_builder.with_contract_map_entries(
95                        &abstract_addrs.ans_host,
96                        ASSET_PAIRINGS,
97                        vec![(
98                            &pair,
99                            vec![PoolReference {
100                                unique_id,
101                                pool_address: pool_addr.clone(),
102                            }],
103                        )],
104                    );
105                }
106            }
107
108            // .iter().for_each(|pair: Vec<AssetEntry>| {
109            //     if pair[0] == pair[1] {
110            //         return;
111            //     }
112            //     let pair: DexAssetPairing = DexAssetPairing::new(pair[0].clone(), pair[1].clone(), &pool_meta.dex);
113            //     querier_builder.with_contract_map_entries(TEST_ANS_HOST, ASSET_PAIRINGS, vec![(&pair, vec![PoolReference{ unique_id, pool_address: pool_addr.clone() }])]);
114            // });
115
116            unique_id.increment();
117        }
118        querier_builder.with_contract_item(&abstract_addrs.ans_host, REGISTERED_DEXES, &dexes)
119    }
120
121    pub fn with_defaults(mut self) -> Self {
122        self.assets.extend([
123            (AssetEntry::from(EUR), AssetInfo::native(EUR)),
124            (AssetEntry::from(USD), AssetInfo::native(USD)),
125            (
126                AssetEntry::from(TTOKEN),
127                AssetInfo::Cw20(self.mock_api.addr_make(TTOKEN)),
128            ),
129            (
130                AssetEntry::from(EUR_USD_LP),
131                AssetInfo::Cw20(self.mock_api.addr_make(EUR_USD_LP)),
132            ),
133            (
134                AssetEntry::from(TTOKEN_EUR_LP),
135                AssetInfo::Cw20(self.mock_api.addr_make(TTOKEN_EUR_LP)),
136            ),
137        ]);
138        self.pools.extend([
139            (
140                UncheckedPoolAddress::contract(self.mock_api.addr_make(EUR_USD_PAIR).into_string()),
141                PoolMetadata::new(
142                    TEST_DEX,
143                    PoolType::ConstantProduct,
144                    vec![AssetEntry::from(EUR), AssetEntry::from(USD)],
145                ),
146            ),
147            (
148                UncheckedPoolAddress::contract(
149                    self.mock_api.addr_make(TTOKEN_EUR_PAIR).into_string(),
150                ),
151                PoolMetadata::new(
152                    TEST_DEX,
153                    PoolType::ConstantProduct,
154                    vec![AssetEntry::from(TTOKEN), AssetEntry::from(EUR)],
155                ),
156            ),
157        ]);
158        self
159    }
160}