abstract_adapter/endpoints/
query.rs

1use abstract_sdk::{
2    base::{Handler, QueryEndpoint},
3    feature_objects::{AnsHost, RegistryContract},
4};
5use abstract_std::{
6    adapter::{
7        AdapterConfigResponse, AdapterQueryMsg, AuthorizedAddressesResponse, BaseQueryMsg, QueryMsg,
8    },
9    objects::module_version::{ModuleDataResponse, MODULE},
10};
11use cosmwasm_std::{to_json_binary, Addr, Binary, Deps, Env, StdError, StdResult};
12
13use crate::state::{AdapterContract, ContractError};
14
15/// Where we dispatch the queries for the AdapterContract
16/// These AdapterQueryMsg declarations can be found in `abstract_sdk::std::common_module::app_msg`
17impl<
18        Error: ContractError,
19        CustomInitMsg,
20        CustomExecMsg,
21        CustomQueryMsg: AdapterQueryMsg,
22        SudoMsg,
23    > QueryEndpoint
24    for AdapterContract<Error, CustomInitMsg, CustomExecMsg, CustomQueryMsg, SudoMsg>
25{
26    type QueryMsg = QueryMsg<CustomQueryMsg>;
27    fn query(&self, deps: Deps, env: Env, msg: Self::QueryMsg) -> Result<Binary, Error> {
28        match msg {
29            QueryMsg::Module(msg) => self.query_handler()?(deps, env, self, msg),
30            QueryMsg::Base(msg) => self.base_query(deps, env, msg),
31        }
32    }
33}
34
35impl<Error: ContractError, CustomInitMsg, CustomExecMsg, CustomQueryMsg, SudoMsg>
36    AdapterContract<Error, CustomInitMsg, CustomExecMsg, CustomQueryMsg, SudoMsg>
37{
38    fn base_query(&self, deps: Deps, _env: Env, query: BaseQueryMsg) -> Result<Binary, Error> {
39        match query {
40            BaseQueryMsg::BaseConfig {} => {
41                to_json_binary(&self.dapp_config(deps).map_err(Error::from)?).map_err(Into::into)
42            }
43            BaseQueryMsg::AuthorizedAddresses { account_address } => {
44                let account_address = deps.api.addr_validate(&account_address)?;
45                let authorized_addrs: Vec<Addr> = self
46                    .authorized_addresses
47                    .may_load(deps.storage, account_address)?
48                    .unwrap_or_default();
49
50                to_json_binary(&AuthorizedAddressesResponse {
51                    addresses: authorized_addrs,
52                })
53                .map_err(Into::into)
54            }
55            BaseQueryMsg::ModuleData {} => {
56                to_json_binary(&self.module_data(deps).map_err(Error::from)?).map_err(Into::into)
57            }
58        }
59    }
60
61    fn dapp_config(&self, deps: Deps) -> StdResult<AdapterConfigResponse> {
62        let abstract_code_id = self.state(deps.storage)?.code_id;
63        Ok(AdapterConfigResponse {
64            registry_address: RegistryContract::new(deps, abstract_code_id)
65                .map_err(|e| StdError::generic_err(e.to_string()))?
66                .address,
67            ans_host_address: AnsHost::new(deps, abstract_code_id)
68                .map_err(|e| StdError::generic_err(e.to_string()))?
69                .address,
70            dependencies: self
71                .dependencies()
72                .iter()
73                .map(|dep| dep.id.to_string())
74                .collect(),
75        })
76    }
77
78    fn module_data(&self, deps: Deps) -> StdResult<ModuleDataResponse> {
79        let module_data = MODULE.load(deps.storage)?;
80        Ok(ModuleDataResponse {
81            module_id: module_data.module,
82            version: module_data.version,
83            dependencies: module_data
84                .dependencies
85                .into_iter()
86                .map(Into::into)
87                .collect(),
88            metadata: module_data.metadata,
89        })
90    }
91}