mars_core/
tax.rs

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}