tensor_amm/hooked/
fees.rs1use borsh::{BorshDeserialize, BorshSerialize};
2
3use crate::errors::TensorAmmError;
4
5use super::{BROKER_FEE_PCT, HUNDRED_PCT_BPS, MAKER_BROKER_PCT, TAKER_FEE_BPS};
6
7#[derive(BorshSerialize, BorshDeserialize, Clone, Copy, Debug, Default, Eq, PartialEq)]
8pub struct Fees {
9 pub taker_fee: u64,
10 pub protocol_fee: u64,
11 pub maker_broker_fee: u64,
12 pub taker_broker_fee: u64,
13}
14
15pub fn calc_fees(amount: u64) -> Result<Fees, TensorAmmError> {
16 let taker_fee = TAKER_FEE_BPS
18 .checked_mul(amount)
19 .ok_or(TensorAmmError::ArithmeticError)?
20 .checked_div(HUNDRED_PCT_BPS)
21 .ok_or(TensorAmmError::ArithmeticError)?;
22
23 let broker_fees = BROKER_FEE_PCT
25 .checked_mul(taker_fee)
26 .ok_or(TensorAmmError::ArithmeticError)?
27 .checked_div(100u64)
28 .ok_or(TensorAmmError::ArithmeticError)?;
29
30 let protocol_fee = taker_fee
32 .checked_sub(broker_fees)
33 .ok_or(TensorAmmError::ArithmeticError)?;
34
35 let maker_broker_fee = (MAKER_BROKER_PCT as u64)
37 .checked_mul(broker_fees)
38 .ok_or(TensorAmmError::ArithmeticError)?
39 .checked_div(100u64)
40 .ok_or(TensorAmmError::ArithmeticError)?;
41
42 let taker_broker_fee = broker_fees
44 .checked_sub(maker_broker_fee)
45 .ok_or(TensorAmmError::ArithmeticError)?;
46
47 Ok(Fees {
48 taker_fee,
49 protocol_fee,
50 maker_broker_fee,
51 taker_broker_fee,
52 })
53}