abstract_core/native/
ans_host.rs

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