defituna_core/utils/
fees.rs

1use crate::HUNDRED_PERCENT;
2use fusionamm_core::{try_mul_div, CoreError};
3
4#[cfg(feature = "wasm")]
5use fusionamm_macros::wasm_expose;
6
7#[cfg_attr(feature = "wasm", wasm_expose)]
8pub fn apply_tuna_protocol_fee(amount: u64, protocol_fee_rate: u16, round_up: bool) -> Result<u64, CoreError> {
9    try_mul_div(amount, HUNDRED_PERCENT as u128 - protocol_fee_rate as u128, HUNDRED_PERCENT as u128, round_up)
10}
11
12#[cfg_attr(feature = "wasm", wasm_expose)]
13pub fn reverse_apply_tuna_protocol_fee(amount: u64, protocol_fee_rate: u16, round_up: bool) -> Result<u64, CoreError> {
14    try_mul_div(amount, HUNDRED_PERCENT as u128, HUNDRED_PERCENT as u128 - protocol_fee_rate as u128, round_up)
15}
16
17#[cfg_attr(feature = "wasm", wasm_expose)]
18pub fn calculate_tuna_protocol_fee(collateral: u64, borrow: u64, protocol_fee_rate_on_collateral: u16, protocol_fee_rate: u16) -> u64 {
19    ((collateral as u128 * protocol_fee_rate_on_collateral as u128 + borrow as u128 * protocol_fee_rate as u128) / HUNDRED_PERCENT as u128) as u64
20}
21
22/// Similar to the function implemented in FusionAMM, but supports various rounding modes.
23pub fn apply_swap_fee(amount: u64, fee_rate: u16, round_up: bool) -> Result<u64, CoreError> {
24    try_mul_div(amount, 1_000_000 - fee_rate as u128, 1_000_000, round_up)
25}
26
27/// Similar to the function implemented in FusionAMM, but supports various rounding modes.
28pub fn reverse_apply_swap_fee(amount: u64, fee_rate: u16, round_up: bool) -> Result<u64, CoreError> {
29    try_mul_div(amount, 1_000_000, 1_000_000 - fee_rate as u128, round_up)
30}