113 lines
3.5 KiB
TypeScript
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,
|
|
}
|
|
}
|