tensor_amm/hooked/
fees.rs

1use 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    // Taker fee: protocol and broker fees.
17    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    // Broker fees are a percentage of the taker fee.
24    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    // The protocol is the remainder of the taker fee.
31    let protocol_fee = taker_fee
32        .checked_sub(broker_fees)
33        .ok_or(TensorAmmError::ArithmeticError)?;
34
35    // Maker broker fee calculated as a percentage of the total brokers fee.
36    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    // Remaining broker fee is the taker broker fee.
43    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}