mango-ui-v3/hooks/useFees.tsx

113 lines
3.5 KiB
TypeScript

import {
CENTIBPS_PER_UNIT,
getMarketIndexBySymbol,
getSpotMarketByBaseSymbol,
PerpMarket,
} from '@blockworks-foundation/mango-client'
import useSrmAccount from '../hooks/useSrmAccount'
import { mangoGroupConfigSelector } from '../stores/selectors'
import useMangoStore from '../stores/useMangoStore'
export default function useFees(): {
makerFee: number
takerFee: number
takerFeeBeforeDiscount: number
takerFeeWithTier1Discount: number
takerFeeWithTier2Discount: number
} {
const { rates } = useSrmAccount()
const mangoGroup = useMangoStore((s) => s.selectedMangoGroup.current)
const mangoGroupConfig = useMangoStore((s) => s.selectedMangoGroup.config)
const marketConfig = useMangoStore((s) => s.selectedMarket.config)
const market = useMangoStore((s) => s.selectedMarket.current)
const mangoAccount = useMangoStore((s) => s.selectedMangoAccount.current)
const mangoCache = useMangoStore((s) => s.selectedMangoGroup.cache)
const groupConfig = useMangoStore(mangoGroupConfigSelector)
const marketIndex = getMarketIndexBySymbol(
mangoGroupConfig,
marketConfig.baseSymbol
)
if (!mangoGroup || !market)
return {
makerFee: 0,
takerFee: 0,
takerFeeBeforeDiscount: 0,
takerFeeWithTier1Discount: 0,
takerFeeWithTier2Discount: 0,
}
let takerFee: number, makerFee: number
let discount = 0
let refSurchargeTier1 = 0
let refSurchargeTier2 = 0
if (market instanceof PerpMarket) {
takerFee = parseFloat(
mangoGroup.perpMarkets[marketIndex].takerFee.toFixed()
)
makerFee = parseFloat(
mangoGroup.perpMarkets[marketIndex].makerFee.toFixed()
)
// @ts-ignore
refSurchargeTier1 = mangoGroup.refSurchargeCentibpsTier1 / CENTIBPS_PER_UNIT
// @ts-ignore
refSurchargeTier2 = mangoGroup.refSurchargeCentibpsTier2 / CENTIBPS_PER_UNIT
// @ts-ignore
const refShare = mangoGroup.refShareCentibpsTier1 / CENTIBPS_PER_UNIT
const mngoConfig = getSpotMarketByBaseSymbol(groupConfig, 'MNGO')
const mngoRequiredTier1 = mngoConfig
? mangoGroup.refMngoRequired.toNumber() /
Math.pow(10, mngoConfig.baseDecimals)
: null
const refMngoTier2Factor =
// @ts-ignore
mangoGroup.refMngoTier2Factor == 0 ? 1 : mangoGroup.refMngoTier2Factor
const mngoRequiredTier2 = mngoConfig
? (mangoGroup.refMngoRequired.toNumber() * refMngoTier2Factor) /
Math.pow(10, mngoConfig.baseDecimals)
: null
if (mangoAccount && mangoCache && mngoConfig) {
const mngoBalance = mangoAccount
.getUiDeposit(
mangoCache.rootBankCache[mngoConfig.marketIndex],
mangoGroup,
mngoConfig.marketIndex
)
.toNumber()
const hasReferrer = useMangoStore.getState().referrerPk
if (
typeof mngoRequiredTier1 === 'number' &&
mngoBalance >= mngoRequiredTier1
) {
if (
typeof mngoRequiredTier2 === 'number' &&
mngoBalance >= mngoRequiredTier2
) {
discount = refSurchargeTier2
} else {
discount = refSurchargeTier1
}
} else {
discount = hasReferrer ? refSurchargeTier2 - refShare : 0
}
}
} else {
takerFee = rates.takerWithRebate
makerFee = rates.maker
}
return {
makerFee: makerFee,
takerFee: takerFee + refSurchargeTier2 - discount,
takerFeeBeforeDiscount: takerFee + refSurchargeTier2,
takerFeeWithTier1Discount: takerFee + refSurchargeTier1,
takerFeeWithTier2Discount: takerFee,
}
}