abstract_std/native/
ans_host.rs

1//! # AnsHost
2//!
3//! `abstract_std::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, storage_namespaces,
44            AssetEntry, ChannelEntry, 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(storage_namespaces::CONFIG_STORAGE_KEY);
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> =
59        Map::new(storage_namespaces::ans_host::ASSET_ADDRESSES);
60    pub const REV_ASSET_ADDRESSES: Map<&AssetInfo, AssetEntry> =
61        Map::new(storage_namespaces::ans_host::REV_ASSET_ADDRESSES);
62
63    /// Stores contract addresses
64    pub const CONTRACT_ADDRESSES: Map<&ContractEntry, Addr> =
65        Map::new(storage_namespaces::ans_host::CONTRACT_ADDRESSES);
66
67    /// stores channel-ids
68    pub const CHANNELS: Map<&ChannelEntry, String> =
69        Map::new(storage_namespaces::ans_host::CHANNELS);
70
71    /// Stores the registered dex names
72    pub const REGISTERED_DEXES: Item<Vec<DexName>> =
73        Item::new(storage_namespaces::ans_host::REGISTERED_DEXES);
74
75    /// Stores the asset pairing entries to their pool ids
76    /// (asset1, asset2, dex_name) -> {id: uniqueId, pool_id: poolId}
77    pub const ASSET_PAIRINGS: Map<&DexAssetPairing, Vec<PoolReference>> =
78        Map::new(storage_namespaces::ans_host::ASSET_PAIRINGS);
79
80    /// Stores the metadata for the pools using the unique pool id as the key
81    pub const POOL_METADATA: Map<UniquePoolId, PoolMetadata> =
82        Map::new(storage_namespaces::ans_host::POOL_METADATA);
83    // ANCHOR_END: ans_state
84}
85
86/// AnsHost Instantiate msg
87#[cosmwasm_schema::cw_serde]
88pub struct InstantiateMsg {
89    pub admin: String,
90}
91
92/// AnsHost Execute msg
93#[cw_ownable::cw_ownable_execute]
94#[cosmwasm_schema::cw_serde]
95#[derive(cw_orch::ExecuteFns)]
96pub enum ExecuteMsg {
97    /// Updates the contract addressbook
98    UpdateContractAddresses {
99        // Contracts to update or add
100        to_add: Vec<(UncheckedContractEntry, String)>,
101        // Contracts to remove
102        to_remove: Vec<UncheckedContractEntry>,
103    },
104    /// Updates the Asset addressbook
105    UpdateAssetAddresses {
106        // Assets to update or add
107        to_add: Vec<(String, AssetInfoUnchecked)>,
108        // Assets to remove
109        to_remove: Vec<String>,
110    },
111    /// Updates the Asset addressbook
112    UpdateChannels {
113        // Assets to update or add
114        to_add: Vec<(UncheckedChannelEntry, String)>,
115        // Assets to remove
116        to_remove: Vec<UncheckedChannelEntry>,
117    },
118    /// Registers a dex
119    UpdateDexes {
120        // Dexes to add
121        to_add: Vec<String>,
122        // Dexes to remove
123        to_remove: Vec<String>,
124    },
125    /// Update the pools
126    UpdatePools {
127        // Pools to update or add
128        to_add: Vec<(UncheckedPoolAddress, PoolMetadata)>,
129        // Pools to remove
130        to_remove: Vec<UniquePoolId>,
131    },
132}
133
134#[cosmwasm_schema::cw_serde]
135pub struct AssetPairingFilter {
136    /// Filter by asset pair
137    pub asset_pair: Option<AssetPair>,
138    /// Filter by dex
139    pub dex: Option<String>,
140}
141
142/// UNUSED - stub for future use
143#[cosmwasm_schema::cw_serde]
144pub struct ContractFilter {}
145
146/// UNUSED - stub for future use
147#[cosmwasm_schema::cw_serde]
148pub struct ChannelFilter {}
149
150/// UNUSED - stub for future use
151#[cosmwasm_schema::cw_serde]
152pub struct AssetFilter {}
153
154/// UNUSED - stub for future use
155#[cosmwasm_schema::cw_serde]
156pub struct AssetInfoFilter {}
157
158/// Filter on the pool metadatas
159#[cosmwasm_schema::cw_serde]
160#[derive(Default)]
161pub struct PoolMetadataFilter {
162    /// Filter by pool type
163    pub pool_type: Option<PoolType>,
164    // /// Filter by pool status
165    // pub pool_status: Option<PoolStatus>,
166}
167
168/// AnsHost smart-query
169#[cw_ownable::cw_ownable_query]
170#[cosmwasm_schema::cw_serde]
171#[derive(QueryResponses, cw_orch::QueryFns)]
172pub enum QueryMsg {
173    /// Query the config
174    /// Returns [`ConfigResponse`]
175    #[returns(ConfigResponse)]
176    Config {},
177    /// Queries assets based on name
178    /// returns [`AssetsResponse`]
179    #[returns(AssetsResponse)]
180    Assets {
181        // Names of assets to query
182        names: Vec<String>,
183    },
184    /// Page over assets
185    /// returns [`AssetListResponse`]
186    #[returns(AssetListResponse)]
187    AssetList {
188        filter: Option<AssetFilter>,
189        start_after: Option<String>,
190        limit: Option<u8>,
191    },
192    /// Queries assets based on address
193    /// returns [`AssetInfosResponse`]
194    #[returns(AssetInfosResponse)]
195    AssetInfos {
196        // Addresses of assets to query
197        infos: Vec<AssetInfoUnchecked>,
198    },
199    /// Page over asset infos
200    /// returns [`AssetInfoListResponse`]
201    #[returns(AssetInfoListResponse)]
202    AssetInfoList {
203        filter: Option<AssetInfoFilter>,
204        start_after: Option<AssetInfoUnchecked>,
205        limit: Option<u8>,
206    },
207    /// Queries contracts based on name
208    /// returns [`ContractsResponse`]
209    #[returns(ContractsResponse)]
210    Contracts {
211        // Project and contract names of contracts to query
212        entries: Vec<ContractEntry>,
213    },
214    /// Page over contracts
215    /// returns [`ContractListResponse`]
216    #[returns(ContractListResponse)]
217    ContractList {
218        filter: Option<ContractFilter>,
219        start_after: Option<ContractEntry>,
220        limit: Option<u8>,
221    },
222    /// Queries contracts based on name
223    /// returns [`ChannelsResponse`]
224    #[returns(ChannelsResponse)]
225    Channels {
226        // Project and contract names of contracts to query
227        entries: Vec<ChannelEntry>,
228    },
229    /// Page over contracts
230    /// returns [`ChannelListResponse`]
231    #[returns(ChannelListResponse)]
232    ChannelList {
233        filter: Option<ChannelFilter>,
234        start_after: Option<ChannelEntry>,
235        limit: Option<u8>,
236    },
237    /// Retrieve the registered dexes
238    /// returns [`RegisteredDexesResponse`]
239    #[returns(RegisteredDexesResponse)]
240    RegisteredDexes {},
241    /// Retrieve the pools with the specified keys
242    /// returns [`PoolsResponse`]
243    #[returns(PoolsResponse)]
244    Pools { pairings: Vec<DexAssetPairing> },
245    /// Retrieve the (optionally-filtered) list of pools.
246    /// returns [`PoolAddressListResponse`]
247    #[returns(PoolAddressListResponse)]
248    PoolList {
249        filter: Option<AssetPairingFilter>,
250        start_after: Option<DexAssetPairing>,
251        limit: Option<u8>,
252    },
253    /// Get the pool metadatas for given pool ids
254    /// returns [`PoolMetadatasResponse`]
255    #[returns(PoolMetadatasResponse)]
256    PoolMetadatas { ids: Vec<UniquePoolId> },
257    /// Retrieve the (optionally-filtered) list of pool metadatas
258    /// returns [`PoolMetadataListResponse`]
259    #[returns(PoolMetadataListResponse)]
260    PoolMetadataList {
261        filter: Option<PoolMetadataFilter>,
262        start_after: Option<UniquePoolId>,
263        limit: Option<u8>,
264    },
265}
266
267#[cosmwasm_schema::cw_serde]
268pub enum MigrateMsg {
269    /// Migrating from blob contract
270    Instantiate(InstantiateMsg),
271    /// Migrating from previous version
272    Migrate {},
273}
274
275#[cosmwasm_schema::cw_serde]
276pub struct ConfigResponse {
277    pub next_unique_pool_id: UniquePoolId,
278}
279/// Query response
280#[cosmwasm_schema::cw_serde]
281pub struct AssetsResponse {
282    /// Assets (name, assetinfo)
283    pub assets: Vec<AssetMapEntry>,
284}
285
286/// Query response
287pub type AssetListResponse = AssetsResponse;
288
289#[cosmwasm_schema::cw_serde]
290pub struct AssetInfosResponse {
291    /// Assets (assetinfo, name)
292    pub infos: Vec<AssetInfoMapEntry>,
293}
294
295pub type AssetInfoListResponse = AssetInfosResponse;
296
297#[cosmwasm_schema::cw_serde]
298pub struct ContractsResponse {
299    /// Contracts (name, address)
300    pub contracts: Vec<ContractMapEntry>,
301}
302
303#[cosmwasm_schema::cw_serde]
304pub struct ContractListResponse {
305    /// Contracts (name, address)
306    pub contracts: Vec<ContractMapEntry>,
307}
308
309#[cosmwasm_schema::cw_serde]
310pub struct ChannelsResponse {
311    pub channels: Vec<ChannelMapEntry>,
312}
313
314#[cosmwasm_schema::cw_serde]
315pub struct ChannelListResponse {
316    pub channels: Vec<ChannelMapEntry>,
317}
318
319#[cosmwasm_schema::cw_serde]
320pub struct RegisteredDexesResponse {
321    pub dexes: Vec<String>,
322}
323
324#[cosmwasm_schema::cw_serde]
325pub struct PoolAddressListResponse {
326    pub pools: Vec<AssetPairingMapEntry>,
327}
328
329#[cosmwasm_schema::cw_serde]
330pub struct PoolsResponse {
331    pub pools: Vec<AssetPairingMapEntry>,
332}
333
334#[cosmwasm_schema::cw_serde]
335pub struct PoolMetadatasResponse {
336    pub metadatas: Vec<PoolMetadataMapEntry>,
337}
338
339#[cosmwasm_schema::cw_serde]
340pub struct PoolMetadataListResponse {
341    pub metadatas: Vec<PoolMetadataMapEntry>,
342}