use crate::pool;
use crate::{asset::AssetInfo, vault};
use cosmwasm_std::{
to_json_binary, Addr, BalanceResponse, BankQuery, QuerierWrapper, QueryRequest, StdResult, Uint128,
WasmQuery,
};
use cw20::{BalanceResponse as Cw20BalanceResponse, Cw20QueryMsg, TokenInfoResponse};
const NATIVE_TOKEN_PRECISION: u8 = 6;
pub fn query_balance(
querier: &QuerierWrapper,
account_addr: Addr,
denom: String,
) -> StdResult<Uint128> {
let balance: BalanceResponse = querier.query(&QueryRequest::Bank(BankQuery::Balance {
address: String::from(account_addr),
denom,
}))?;
Ok(balance.amount.amount)
}
pub fn query_token_balance(
querier: &QuerierWrapper,
contract_addr: Addr,
account_addr: Addr,
) -> StdResult<Uint128> {
querier
.query(&QueryRequest::Wasm(WasmQuery::Smart {
contract_addr: String::from(contract_addr),
msg: to_json_binary(&Cw20QueryMsg::Balance {
address: String::from(account_addr),
})?,
}))
.map(|res: Cw20BalanceResponse| Ok(res.balance))
.unwrap_or(Ok(Uint128::zero()))
}
pub fn query_supply(querier: &QuerierWrapper, contract_addr: Addr) -> StdResult<Uint128> {
let res: TokenInfoResponse = querier.query(&QueryRequest::Wasm(WasmQuery::Smart {
contract_addr: String::from(contract_addr),
msg: to_json_binary(&Cw20QueryMsg::TokenInfo {})?,
}))?;
Ok(res.total_supply)
}
pub fn query_token_precision(querier: &QuerierWrapper, asset_info: AssetInfo) -> StdResult<u8> {
Ok(match asset_info {
AssetInfo::NativeToken { denom: _ } => NATIVE_TOKEN_PRECISION,
AssetInfo::Token { contract_addr } => {
let res: TokenInfoResponse =
querier.query_wasm_smart(contract_addr, &Cw20QueryMsg::TokenInfo {})?;
res.decimals
}
})
}
pub fn query_vault_config(
querier: &QuerierWrapper,
vault_contract: String,
) -> StdResult<vault::ConfigResponse> {
querier.query_wasm_smart(vault_contract, &vault::QueryMsg::Config {})
}
pub fn config_info_by_pool(
querier: &QuerierWrapper,
pool_contract: String,
) -> StdResult<pool::ConfigResponse> {
let config: pool::ConfigResponse =
querier.query_wasm_smart(pool_contract, &pool::QueryMsg::Config {})?;
Ok(config)
}