1use crate::math::decimal::Decimal;
2use cosmwasm_std::{Coin, Deps, StdResult, Uint128};
3use terra_cosmwasm::TerraQuerier;
4
5pub fn deduct_tax(deps: Deps, coin: Coin) -> StdResult<Coin> {
6 let tax_amount = compute_tax(deps, &coin)?;
7 Ok(Coin {
8 denom: coin.denom,
9 amount: coin.amount - tax_amount,
10 })
11}
12
13pub fn compute_tax(deps: Deps, coin: &Coin) -> StdResult<Uint128> {
14 let terra_querier = TerraQuerier::new(&deps.querier);
15 let tax_rate: Decimal = (terra_querier.query_tax_rate()?).rate.into();
16 let tax_cap = (terra_querier.query_tax_cap(coin.denom.to_string())?).cap;
17 let amount = coin.amount;
18 Ok(std::cmp::min(
19 amount - Decimal::divide_uint128_by_decimal(amount, Decimal::one() + tax_rate)?,
20 tax_cap,
21 ))
22}