abstract_adapter/endpoints/
query.rs1use 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
15impl<
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}