mango-ui-v3/hooks/useSrmAccount.tsx

105 lines
2.8 KiB
TypeScript

import { useState } from 'react'
import useMangoStore from '../stores/useMangoStore'
import {
getMultipleAccounts,
nativeToUi,
zeroKey,
} from '@blockworks-foundation/mango-client'
import {
MSRM_DECIMALS,
SRM_DECIMALS,
} from '@project-serum/serum/lib/token-instructions'
import { parseTokenAccountData } from '../utils/tokens'
import { useEffect } from 'react'
export function getFeeRates(feeTier: number): { taker: number; maker: number } {
if (feeTier === 1) {
return { taker: 0.00039, maker: 0 }
} else if (feeTier === 2) {
return { taker: 0.00038, maker: 0 }
} else if (feeTier === 3) {
return { taker: 0.00036, maker: 0 }
} else if (feeTier === 4) {
return { taker: 0.00034, maker: 0 }
} else if (feeTier === 5) {
return { taker: 0.00032, maker: 0 }
} else if (feeTier === 6) {
// MSRM
return { taker: 0.0003, maker: 0 }
}
// Base
return { taker: 0.0004, maker: 0 }
}
export function getFeeTier(msrmBalance: number, srmBalance: number): number {
if (msrmBalance >= 1) {
return 6
} else if (srmBalance >= 1_000_000) {
return 5
} else if (srmBalance >= 100_000) {
return 4
} else if (srmBalance >= 10_000) {
return 3
} else if (srmBalance >= 1_000) {
return 2
} else if (srmBalance >= 100) {
return 1
} else {
return 0
}
}
const useSrmAccount = () => {
const mangoGroup = useMangoStore((s) => s.selectedMangoGroup.current)
const connection = useMangoStore((s) => s.connection.current)
const [srmAccount, setSrmAccount] = useState<any>(null)
const [msrmAccount, setMsrmAccount] = useState<any>(null)
useEffect(() => {
if (mangoGroup) {
const srmPk = mangoGroup.srmVault
const msrmPk = mangoGroup.msrmVault
const fetchAccounts = async () => {
const [srmAccountInfo, msrmAccountInfo] = await getMultipleAccounts(
connection,
[srmPk, msrmPk]
)
setSrmAccount(srmAccountInfo.accountInfo)
if (!msrmPk.equals(zeroKey)) {
setMsrmAccount(msrmAccountInfo.accountInfo)
}
}
fetchAccounts()
}
}, [mangoGroup])
const srmAccountData = srmAccount
? parseTokenAccountData(srmAccount?.data)
: null
const totalSrm = srmAccountData
? nativeToUi(srmAccountData.amount, SRM_DECIMALS)
: 0
const msrmAccountData = msrmAccount
? parseTokenAccountData(msrmAccount?.data)
: null
const totalMsrm = msrmAccountData
? nativeToUi(msrmAccountData.amount, MSRM_DECIMALS)
: 0
const feeTier = getFeeTier(totalMsrm, totalSrm)
const { maker, taker } = getFeeRates(feeTier)
// account for GUI rebate in taker fees
return {
totalSrm,
totalMsrm,
feeTier,
rates: { maker, taker, takerWithRebate: taker - (taker + maker) * 0.2 },
}
}
export default useSrmAccount