abstract_os/native/
ans_host.rs

1//! # AnsHost
2//!
3//! `abstract_os::ans_host` stores chain-specific contract addresses.
4//!
5//! ## Description
6//! Contract and asset addresses are stored on the ans_host contract and are retrievable trough smart or raw queries.
7
8use crate::objects::{
9    asset_entry::AssetEntry,
10    contract_entry::{ContractEntry, UncheckedContractEntry},
11    dex_asset_pairing::DexAssetPairing,
12    pool_id::UncheckedPoolAddress,
13    pool_reference::PoolReference,
14    ChannelEntry, PoolMetadata, PoolType, UncheckedChannelEntry, UniquePoolId,
15};
16use cosmwasm_schema::QueryResponses;
17use cosmwasm_std::Addr;
18use cw_asset::{AssetInfo, AssetInfoUnchecked};
19
20pub type AssetPair = (AssetEntry, AssetEntry);
21type DexName = String;
22
23/// A map entry of ((asset_x, asset_y, dex) -> compound_pool_id)
24pub type AssetPairingMapEntry = (DexAssetPairing, Vec<PoolReference>);
25/// Map entry for assets (asset_name -> info)
26pub type AssetMapEntry = (AssetEntry, AssetInfo);
27/// Map entry for assets (info -> asset_name)
28pub type AssetInfoMapEntry = (AssetInfo, AssetEntry);
29/// Map entry for channels
30pub type ChannelMapEntry = (ChannelEntry, String);
31/// Map entry for contracts (contract -> address)
32pub type ContractMapEntry = (ContractEntry, Addr);
33/// A map entry of (unique_pool_id -> pool_metadata)
34pub type PoolMetadataMapEntry = (UniquePoolId, PoolMetadata);
35
36/// AnsHost state details
37pub mod state {
38    use crate::ans_host::{DexAssetPairing, DexName, UniquePoolId};
39    use cosmwasm_std::Addr;
40    use cw_asset::AssetInfo;
41    use cw_controllers::Admin;
42    use cw_storage_plus::{Item, Map};
43
44    use crate::objects::{
45        asset_entry::AssetEntry, common_namespace::ADMIN_NAMESPACE, contract_entry::ContractEntry,
46        pool_metadata::PoolMetadata, pool_reference::PoolReference, ChannelEntry,
47    };
48
49    /// Ans host configuration
50    #[cosmwasm_schema::cw_serde]
51    pub struct Config {
52        pub next_unique_pool_id: UniquePoolId,
53    }
54
55    pub const CONFIG: Item<Config> = Item::new("config");
56
57    /// Admin address store
58    pub const ADMIN: Admin = Admin::new(ADMIN_NAMESPACE);
59
60    /// Stores name and address of tokens and pairs
61    /// LP token pairs are stored alphabetically
62    pub const ASSET_ADDRESSES: Map<&AssetEntry, AssetInfo> = Map::new("assets");
63    pub const REV_ASSET_ADDRESSES: Map<&AssetInfo, AssetEntry> = Map::new("rev_assets");
64
65    /// Stores contract addresses
66    pub const CONTRACT_ADDRESSES: Map<&ContractEntry, Addr> = Map::new("contracts");
67
68    /// stores channel-ids
69    pub const CHANNELS: Map<&ChannelEntry, String> = Map::new("channels");
70
71    /// Stores the registered dex names
72    pub const REGISTERED_DEXES: Item<Vec<DexName>> = Item::new("registered_dexes");
73
74    /// Stores the asset pairing entries to their pool ids
75    /// (asset1, asset2, dex_name) -> {id: uniqueId, pool_id: poolId}
76    pub const ASSET_PAIRINGS: Map<&DexAssetPairing, Vec<PoolReference>> = Map::new("pool_ids");
77
78    /// Stores the metadata for the pools using the unique pool id as the key
79    pub const POOL_METADATA: Map<UniquePoolId, PoolMetadata> = Map::new("pools");
80}
81
82/// AnsHost Instantiate msg
83#[cosmwasm_schema::cw_serde]
84pub struct InstantiateMsg {}
85
86/// AnsHost Execute msg
87#[cosmwasm_schema::cw_serde]
88#[cfg_attr(feature = "boot", derive(boot_core::ExecuteFns))]
89pub enum ExecuteMsg {
90    /// Updates the contract addressbook
91    UpdateContractAddresses {
92        // Contracts to update or add
93        to_add: Vec<(UncheckedContractEntry, String)>,
94        // Contracts to remove
95        to_remove: Vec<UncheckedContractEntry>,
96    },
97    /// Updates the Asset addressbook
98    UpdateAssetAddresses {
99        // Assets to update or add
100        to_add: Vec<(String, AssetInfoUnchecked)>,
101        // Assets to remove
102        to_remove: Vec<String>,
103    },
104    /// Updates the Asset addressbook
105    UpdateChannels {
106        // Assets to update or add
107        to_add: Vec<(UncheckedChannelEntry, String)>,
108        // Assets to remove
109        to_remove: Vec<UncheckedChannelEntry>,
110    },
111    /// Registers a dex
112    UpdateDexes {
113        // Dexes to add
114        to_add: Vec<String>,
115        // Dexes to remove
116        to_remove: Vec<String>,
117    },
118    /// Update the pools
119    UpdatePools {
120        // Pools to update or add
121        to_add: Vec<(UncheckedPoolAddress, PoolMetadata)>,
122        // Pools to remove
123        to_remove: Vec<UniquePoolId>,
124    },
125    /// Sets a new Admin
126    SetAdmin { admin: String },
127}
128
129#[cosmwasm_schema::cw_serde]
130pub struct AssetPairingFilter {
131    /// Filter by asset pair
132    pub asset_pair: Option<AssetPair>,
133    /// Filter by dex
134    pub dex: Option<String>,
135}
136
137/// UNUSED - stub for future use
138#[cosmwasm_schema::cw_serde]
139pub struct ContractFilter {}
140
141/// UNUSED - stub for future use
142#[cosmwasm_schema::cw_serde]
143pub struct ChannelFilter {}
144
145/// UNUSED - stub for future use
146#[cosmwasm_schema::cw_serde]
147pub struct AssetFilter {}
148
149/// UNUSED - stub for future use
150#[cosmwasm_schema::cw_serde]
151pub struct AssetInfoFilter {}
152
153/// Filter on the pool metadatas
154#[cosmwasm_schema::cw_serde]
155pub struct PoolMetadataFilter {
156    /// Filter by pool type
157    pub pool_type: Option<PoolType>,
158    // /// Filter by pool status
159    // pub pool_status: Option<PoolStatus>,
160}
161
162/// AnsHost smart-query
163#[cosmwasm_schema::cw_serde]
164#[derive(QueryResponses)]
165#[cfg_attr(feature = "boot", derive(boot_core::QueryFns))]
166pub enum QueryMsg {
167    /// Query the config
168    /// Returns [`ConfigResponse`]
169    #[returns(ConfigResponse)]
170    Config {},
171    /// Queries assets based on name
172    /// returns [`AssetsResponse`]
173    #[returns(AssetsResponse)]
174    Assets {
175        // Names of assets to query
176        names: Vec<String>,
177    },
178    /// Page over assets
179    /// returns [`AssetListResponse`]
180    #[returns(AssetListResponse)]
181    AssetList {
182        filter: Option<AssetFilter>,
183        start_after: Option<String>,
184        limit: Option<u8>,
185    },
186    /// Queries assets based on address
187    /// returns [`AssetsResponse`]
188    #[returns(AssetsResponse)]
189    AssetInfos {
190        // Addresses of assets to query
191        infos: Vec<AssetInfoUnchecked>,
192    },
193    /// Page over asset infos
194    /// returns [`AssetInfoListResponse`]
195    #[returns(AssetInfoListResponse)]
196    AssetInfoList {
197        filter: Option<AssetInfoFilter>,
198        start_after: Option<AssetInfoUnchecked>,
199        limit: Option<u8>,
200    },
201    /// Queries contracts based on name
202    /// returns [`ContractsResponse`]
203    #[returns(ContractsResponse)]
204    Contracts {
205        // Project and contract names of contracts to query
206        entries: Vec<ContractEntry>,
207    },
208    /// Page over contracts
209    /// returns [`ContractListResponse`]
210    #[returns(ContractListResponse)]
211    ContractList {
212        filter: Option<ContractFilter>,
213        start_after: Option<ContractEntry>,
214        limit: Option<u8>,
215    },
216    /// Queries contracts based on name
217    /// returns [`ChannelsResponse`]
218    #[returns(ChannelsResponse)]
219    Channels {
220        // Project and contract names of contracts to query
221        entries: Vec<ChannelEntry>,
222    },
223    /// Page over contracts
224    /// returns [`ChannelListResponse`]
225    #[returns(ChannelListResponse)]
226    ChannelList {
227        filter: Option<ChannelFilter>,
228        start_after: Option<ChannelEntry>,
229        limit: Option<u8>,
230    },
231    /// Retrieve the registered dexes
232    /// returns [`RegisteredDexesResponse`]
233    #[returns(RegisteredDexesResponse)]
234    RegisteredDexes {},
235    /// Retrieve the pools with the specified keys
236    /// returns [`PoolsResponse`]
237    /// TODO: this may need to take a start_after and limit for the return
238    #[returns(PoolsResponse)]
239    Pools { pairings: Vec<DexAssetPairing> },
240    /// Retrieve the (optionally-filtered) list of pools.
241    /// returns [`PoolAddressListResponse`]
242    #[returns(PoolAddressListResponse)]
243    PoolList {
244        filter: Option<AssetPairingFilter>,
245        start_after: Option<DexAssetPairing>,
246        limit: Option<u8>,
247    },
248    /// Get the pool metadatas for given pool ids
249    /// returns [`PoolMetadatasResponse`]
250    #[returns(PoolMetadatasResponse)]
251    PoolMetadatas { ids: Vec<UniquePoolId> },
252    /// Retrieve the (optionally-filtered) list of pool metadatas
253    /// returns [`PoolMetadataListResponse`]
254    #[returns(PoolMetadataListResponse)]
255    PoolMetadataList {
256        filter: Option<PoolMetadataFilter>,
257        start_after: Option<UniquePoolId>,
258        limit: Option<u8>,
259    },
260}
261
262#[cosmwasm_schema::cw_serde]
263pub struct MigrateMsg {}
264
265#[cosmwasm_schema::cw_serde]
266pub struct ConfigResponse {
267    pub next_unique_pool_id: UniquePoolId,
268    pub admin: Addr,
269}
270/// Query response
271#[cosmwasm_schema::cw_serde]
272pub struct AssetsResponse {
273    /// Assets (name, assetinfo)
274    pub assets: Vec<AssetMapEntry>,
275}
276
277/// Query response
278#[cosmwasm_schema::cw_serde]
279pub struct AssetListResponse {
280    /// Assets (name, assetinfo)
281    pub assets: Vec<AssetMapEntry>,
282}
283
284#[cosmwasm_schema::cw_serde]
285pub struct AssetInfosResponse {
286    /// Assets (assetinfo, name)
287    pub infos: Vec<AssetInfoMapEntry>,
288}
289
290#[cosmwasm_schema::cw_serde]
291pub struct AssetInfoListResponse {
292    /// Assets (assetinfo, name)
293    pub infos: Vec<AssetInfoMapEntry>,
294}
295
296#[cosmwasm_schema::cw_serde]
297pub struct ContractsResponse {
298    /// Contracts (name, address)
299    pub contracts: Vec<(ContractEntry, String)>,
300}
301
302#[cosmwasm_schema::cw_serde]
303pub struct ContractListResponse {
304    /// Contracts (name, address)
305    pub contracts: Vec<(ContractEntry, String)>,
306}
307
308#[cosmwasm_schema::cw_serde]
309pub struct ChannelsResponse {
310    pub channels: Vec<ChannelMapEntry>,
311}
312
313#[cosmwasm_schema::cw_serde]
314pub struct ChannelListResponse {
315    pub channels: Vec<ChannelMapEntry>,
316}
317
318#[cosmwasm_schema::cw_serde]
319pub struct RegisteredDexesResponse {
320    pub dexes: Vec<String>,
321}
322
323#[cosmwasm_schema::cw_serde]
324pub struct PoolAddressListResponse {
325    pub pools: Vec<AssetPairingMapEntry>,
326}
327
328#[cosmwasm_schema::cw_serde]
329pub struct PoolsResponse {
330    pub pools: Vec<AssetPairingMapEntry>,
331}
332
333#[cosmwasm_schema::cw_serde]
334pub struct PoolMetadatasResponse {
335    pub metadatas: Vec<PoolMetadataMapEntry>,
336}
337
338#[cosmwasm_schema::cw_serde]
339pub struct PoolMetadataListResponse {
340    pub metadatas: Vec<PoolMetadataMapEntry>,
341}