mango-ui-v3/hooks/useBalances.tsx

144 lines
4.1 KiB
TypeScript

import { Balances } from '../@types/types'
import {
nativeI80F48ToUi,
nativeToUi,
QUOTE_INDEX,
} from '@blockworks-foundation/mango-client'
import useMangoStore from '../stores/useMangoStore'
import { sumBy } from 'lodash'
import { I80F48 } from '@blockworks-foundation/mango-client/lib/src/fixednum'
export function useBalances(): Balances[] {
const balances = []
const mangoGroup = useMangoStore((s) => s.selectedMangoGroup.current)
const mangoAccount = useMangoStore((s) => s.selectedMangoAccount.current)
const mangoGroupConfig = useMangoStore((s) => s.selectedMangoGroup.config)
const mangoCache = useMangoStore((s) => s.selectedMangoGroup.cache)
for (const {
marketIndex,
baseSymbol,
name,
} of mangoGroupConfig.spotMarkets) {
if (!mangoAccount || !mangoGroup) {
return []
}
const openOrders: any = mangoAccount.spotOpenOrdersAccounts[marketIndex]
const quoteCurrencyIndex = QUOTE_INDEX
const nativeBaseFree = openOrders?.baseTokenFree || 0
const nativeQuoteFree =
(openOrders?.quoteTokenFree || 0) +
(openOrders?.['referrerRebatesAccrued'].toNumber() || 0)
const nativeBaseLocked = openOrders
? openOrders.baseTokenTotal - openOrders?.baseTokenFree
: 0
const nativeQuoteLocked = openOrders
? openOrders?.quoteTokenTotal - (openOrders?.quoteTokenFree || 0)
: 0
const tokenIndex = marketIndex
const net = (nativeBaseLocked, tokenIndex) => {
const amount = mangoAccount
.getUiDeposit(
mangoCache.rootBankCache[tokenIndex],
mangoGroup,
tokenIndex
)
.add(
nativeI80F48ToUi(
I80F48.fromNumber(nativeBaseLocked),
mangoGroup.tokens[tokenIndex].decimals
).sub(
mangoAccount.getUiBorrow(
mangoCache.rootBankCache[tokenIndex],
mangoGroup,
tokenIndex
)
)
)
return amount
}
const marketPair = [
{
market: null,
key: `${baseSymbol}${name}`,
symbol: baseSymbol,
marginDeposits: mangoAccount.getUiDeposit(
mangoCache.rootBankCache[tokenIndex],
mangoGroup,
tokenIndex
),
borrows: mangoAccount.getUiBorrow(
mangoCache.rootBankCache[tokenIndex],
mangoGroup,
tokenIndex
),
orders: nativeToUi(
nativeBaseLocked,
mangoGroup.tokens[tokenIndex].decimals
),
unsettled: nativeToUi(
nativeBaseFree,
mangoGroup.tokens[tokenIndex].decimals
),
net: net(nativeBaseLocked, tokenIndex),
},
{
market: null,
key: `${name}`,
symbol: mangoGroupConfig.quoteSymbol,
marginDeposits: mangoAccount.getUiDeposit(
mangoCache.rootBankCache[quoteCurrencyIndex],
mangoGroup,
quoteCurrencyIndex
),
borrows: mangoAccount.getUiBorrow(
mangoCache.rootBankCache[tokenIndex],
mangoGroup,
quoteCurrencyIndex
),
orders: nativeToUi(
nativeQuoteLocked,
mangoGroup.tokens[quoteCurrencyIndex].decimals
),
unsettled: nativeToUi(
nativeQuoteFree,
mangoGroup.tokens[quoteCurrencyIndex].decimals
),
net: net(nativeQuoteLocked, quoteCurrencyIndex),
},
]
balances.push(marketPair)
}
const baseBalances = balances.map((b) => b[0])
const quoteBalances = balances.map((b) => b[1])
const quoteMeta = quoteBalances[0]
const quoteInOrders = sumBy(quoteBalances, 'orders')
const unsettled = sumBy(quoteBalances, 'unsettled')
const net: I80F48 = quoteMeta.marginDeposits
.add(I80F48.fromNumber(unsettled))
.sub(quoteMeta.borrows)
.add(I80F48.fromNumber(quoteInOrders))
return [
{
market: null,
key: `${quoteMeta.symbol}${quoteMeta.symbol}`,
symbol: quoteMeta.symbol,
marginDeposits: quoteMeta.marginDeposits,
borrows: quoteMeta.borrows,
orders: quoteInOrders,
unsettled,
net,
},
].concat(baseBalances)
}