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
22pub 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 for (i, asset_x) in pool_meta.assets.iter().enumerate() {
86 for (j, asset_y) in pool_meta.assets.iter().enumerate() {
87 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 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}