lev-stake-sol/hooks/usePositions.ts

69 lines
2.2 KiB
TypeScript
Raw Permalink Normal View History

2023-10-10 20:59:23 -07:00
import { useMemo } from 'react'
2024-03-20 03:26:49 -07:00
import {
JLP_BORROW_TOKEN,
LST_BORROW_TOKEN,
STAKEABLE_TOKENS,
} from 'utils/constants'
2023-10-10 20:59:23 -07:00
import useStakeAccounts from './useStakeAccounts'
import useMangoGroup from './useMangoGroup'
2024-03-20 03:26:49 -07:00
import { toUiDecimalsForQuote } from '@blockworks-foundation/mango-v4'
2023-10-10 20:59:23 -07:00
export default function usePositions(showInactive = false) {
const { stakeAccounts } = useStakeAccounts()
2024-03-20 03:26:49 -07:00
const { jlpGroup, lstGroup } = useMangoGroup()
const jlpBorrowBank = useMemo(() => {
return jlpGroup?.banksMapByName.get(JLP_BORROW_TOKEN)?.[0]
}, [jlpGroup])
2023-10-10 20:59:23 -07:00
2024-03-20 03:26:49 -07:00
const lstBorrowBank = useMemo(() => {
return lstGroup?.banksMapByName.get(LST_BORROW_TOKEN)?.[0]
}, [lstGroup])
2023-10-10 20:59:23 -07:00
const banks = useMemo(() => {
2024-03-20 03:26:49 -07:00
if (!jlpGroup || !lstGroup) return []
2023-10-10 20:59:23 -07:00
const positionBanks = []
for (const token of STAKEABLE_TOKENS) {
2024-03-20 03:26:49 -07:00
const isJlpGroup = token === 'JLP' || token === 'USDC'
const bank = isJlpGroup
? jlpGroup.banksMapByName.get(token)?.[0]
: lstGroup.banksMapByName.get(token)?.[0]
2023-10-10 20:59:23 -07:00
positionBanks.push(bank)
}
return positionBanks
2024-03-20 03:26:49 -07:00
}, [jlpGroup, lstGroup])
2023-10-10 20:59:23 -07:00
const positions = useMemo(() => {
const positions = []
for (const bank of banks) {
2024-03-20 03:26:49 -07:00
if (!bank || !jlpGroup || !lstGroup) continue
const isJlpGroup = bank.name === 'JLP' || bank.name === 'USDC'
const group = isJlpGroup ? jlpGroup : lstGroup
const borrowBank = isJlpGroup ? jlpBorrowBank : lstBorrowBank
2023-10-10 20:59:23 -07:00
const acct = stakeAccounts?.find((acc) => acc.getTokenBalanceUi(bank) > 0)
const stakeBalance = acct ? acct.getTokenBalanceUi(bank) : 0
2024-02-23 01:31:24 -08:00
const pnl = acct ? toUiDecimalsForQuote(acct.getPnl(group).toNumber()) : 0
2024-03-20 03:26:49 -07:00
const borrowBalance =
acct && borrowBank ? acct.getTokenBalanceUi(borrowBank) : 0
2024-02-23 02:30:19 -08:00
positions.push({ borrowBalance, stakeBalance, bank, pnl, acct })
2023-10-10 20:59:23 -07:00
}
const sortedPositions = positions.sort(
(a, b) => b.stakeBalance - a.stakeBalance,
)
return showInactive
? sortedPositions
: sortedPositions.filter((pos) => pos.stakeBalance > 0)
2024-03-20 03:26:49 -07:00
}, [
banks,
showInactive,
stakeAccounts,
jlpGroup,
lstGroup,
jlpBorrowBank,
lstBorrowBank,
])
2023-10-10 20:59:23 -07:00
2024-03-20 03:26:49 -07:00
return { jlpBorrowBank, lstBorrowBank, positions }
2023-10-10 20:59:23 -07:00
}