pandora_os/memory/
queries.rs

1use std::collections::BTreeMap;
2
3use cosmwasm_std::{Addr, Binary, Deps, QueryRequest, StdResult, WasmQuery};
4
5use crate::denom::is_denom;
6use cosmwasm_storage::to_length_prefixed;
7use terraswap::asset::AssetInfo;
8
9/// Query asset infos from Memory Module asset addresses map.
10pub fn query_assets_from_mem(
11    deps: Deps,
12    memory_addr: &Addr,
13    asset_names: &[String],
14) -> StdResult<BTreeMap<String, AssetInfo>> {
15    let mut assets: BTreeMap<String, AssetInfo> = BTreeMap::new();
16
17    for asset in asset_names.iter() {
18        let result = deps
19            .querier
20            .query::<String>(&QueryRequest::Wasm(WasmQuery::Raw {
21                contract_addr: memory_addr.to_string(),
22                // query assets map
23                key: Binary::from(concat(&to_length_prefixed(b"assets"), asset.as_bytes())),
24            }))?;
25        assets.insert(asset.clone(), to_asset_info(deps, result)?);
26    }
27    Ok(assets)
28}
29
30/// Query single asset info from mem
31pub fn query_asset_from_mem(
32    deps: Deps,
33    memory_addr: &Addr,
34    asset_name: &str,
35) -> StdResult<AssetInfo> {
36    let result = deps
37        .querier
38        .query::<String>(&QueryRequest::Wasm(WasmQuery::Raw {
39            contract_addr: memory_addr.to_string(),
40            // query assets map
41            key: Binary::from(concat(
42                &to_length_prefixed(b"assets"),
43                asset_name.as_bytes(),
44            )),
45        }))?;
46    to_asset_info(deps, result)
47}
48
49/// Query contract addresses from Memory Module contract addresses map.
50pub fn query_contracts_from_mem(
51    deps: Deps,
52    memory_addr: &Addr,
53    contract_names: &[String],
54) -> StdResult<BTreeMap<String, Addr>> {
55    let mut contracts: BTreeMap<String, Addr> = BTreeMap::new();
56
57    // Query over
58    for contract in contract_names.iter() {
59        let result: Addr = deps
60            .querier
61            .query::<Addr>(&QueryRequest::Wasm(WasmQuery::Raw {
62                contract_addr: memory_addr.to_string(),
63                key: Binary::from(concat(
64                    // Query contracts map
65                    &to_length_prefixed(b"contracts"),
66                    contract.as_bytes(),
67                )),
68            }))?;
69
70        contracts.insert(contract.clone(), result);
71    }
72    Ok(contracts)
73}
74
75/// Query single contract address from mem
76pub fn query_contract_from_mem(
77    deps: Deps,
78    memory_addr: &Addr,
79    contract_name: &str,
80) -> StdResult<Addr> {
81    let result = deps
82        .querier
83        .query::<String>(&QueryRequest::Wasm(WasmQuery::Raw {
84            contract_addr: memory_addr.to_string(),
85            // query assets map
86            key: Binary::from(concat(
87                &to_length_prefixed(b"contracts"),
88                contract_name.as_bytes(),
89            )),
90        }))?;
91    // Addresses are checked when stored.
92    Ok(Addr::unchecked(result))
93}
94
95/// Returns the asset info for a given string (either denom or contract addr)
96#[inline]
97pub fn to_asset_info(deps: Deps, address_or_denom: String) -> StdResult<AssetInfo> {
98    return if is_denom(address_or_denom.as_str()) {
99        Ok(AssetInfo::NativeToken {
100            denom: address_or_denom,
101        })
102    } else {
103        deps.api.addr_validate(address_or_denom.as_str())?;
104        Ok(AssetInfo::Token {
105            contract_addr: address_or_denom,
106        })
107    };
108}
109
110#[inline]
111fn concat(namespace: &[u8], key: &[u8]) -> Vec<u8> {
112    let mut k = namespace.to_vec();
113    k.extend_from_slice(key);
114    k
115}