pandora_os/memory/
queries.rs1use 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
9pub 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 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
30pub 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 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
49pub 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 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 &to_length_prefixed(b"contracts"),
66 contract.as_bytes(),
67 )),
68 }))?;
69
70 contracts.insert(contract.clone(), result);
71 }
72 Ok(contracts)
73}
74
75pub 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 key: Binary::from(concat(
87 &to_length_prefixed(b"contracts"),
88 contract_name.as_bytes(),
89 )),
90 }))?;
91 Ok(Addr::unchecked(result))
93}
94
95#[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}