terra_asset/testing/
cw20_querier.rs1use cosmwasm_std::{to_binary, Addr, QuerierResult, SystemError, Uint128};
2use cw20::{BalanceResponse, Cw20QueryMsg};
3use std::collections::HashMap;
4
5#[derive(Default)]
6pub struct Cw20Querier {
7 balances: HashMap<Addr, HashMap<Addr, Uint128>>,
8}
9
10impl Cw20Querier {
11 pub fn handle_query(&self, contract_addr: &Addr, query: Cw20QueryMsg) -> QuerierResult {
12 match query {
13 Cw20QueryMsg::Balance {
14 address,
15 } => {
16 let contract_balances = match self.balances.get(contract_addr) {
17 Some(balances) => balances,
18 None => {
19 return Err(SystemError::InvalidRequest {
20 error: format!(
21 "[mock]: cw20 balances not set for token {:?}",
22 contract_addr
23 ),
24 request: Default::default(),
25 })
26 .into()
27 }
28 };
29
30 let balance = match contract_balances.get(&Addr::unchecked(&address)) {
31 Some(balance) => balance,
32 None => {
33 return Err(SystemError::InvalidRequest {
34 error: format!("[mock]: cw20 balance not set for user {:?}", address),
35 request: Default::default(),
36 })
37 .into()
38 }
39 };
40
41 Ok(to_binary(&BalanceResponse {
42 balance: *balance,
43 })
44 .into())
45 .into()
46 }
47
48 query => Err(SystemError::InvalidRequest {
49 error: format!("[mock]: unsupported cw20 query {:?}", query),
50 request: Default::default(),
51 })
52 .into(),
53 }
54 }
55
56 pub fn set_balance(&mut self, contract: &str, user: &str, balance: u128) {
57 let contract_addr = Addr::unchecked(contract);
58 let user_addr = Addr::unchecked(user);
59
60 let contract_balances = self.balances.entry(contract_addr).or_insert_with(HashMap::new);
61 contract_balances.insert(user_addr, Uint128::new(balance));
62 }
63}