185 lines
5.5 KiB
TypeScript
185 lines
5.5 KiB
TypeScript
import { Balances } from '../@types/types'
|
|
import {
|
|
getTokenBySymbol,
|
|
nativeI80F48ToUi,
|
|
nativeToUi,
|
|
QUOTE_INDEX,
|
|
} from '@blockworks-foundation/mango-client'
|
|
import useMangoStore from '../stores/useMangoStore'
|
|
import { i80f48ToPercent } from '../utils/index'
|
|
import sumBy from 'lodash/sumBy'
|
|
import { I80F48 } from '@blockworks-foundation/mango-client'
|
|
import useMangoAccount from './useMangoAccount'
|
|
|
|
export function useBalances(): Balances[] {
|
|
const balances: any[] = []
|
|
const { mangoAccount } = useMangoAccount()
|
|
const mangoGroup = useMangoStore((s) => s.selectedMangoGroup.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 || !mangoCache) {
|
|
return []
|
|
}
|
|
|
|
const openOrders: any = mangoAccount.spotOpenOrdersAccounts[marketIndex]
|
|
const quoteCurrencyIndex = QUOTE_INDEX
|
|
|
|
let nativeBaseFree = 0
|
|
let nativeQuoteFree = 0
|
|
let nativeBaseLocked = 0
|
|
let nativeQuoteLocked = 0
|
|
if (openOrders) {
|
|
nativeBaseFree = openOrders.baseTokenFree.toNumber()
|
|
nativeQuoteFree = openOrders.quoteTokenFree
|
|
.add(openOrders['referrerRebatesAccrued'])
|
|
.toNumber()
|
|
nativeBaseLocked = openOrders.baseTokenTotal
|
|
.sub(openOrders.baseTokenFree)
|
|
.toNumber()
|
|
nativeQuoteLocked = openOrders.quoteTokenTotal
|
|
.sub(openOrders.quoteTokenFree)
|
|
.toNumber()
|
|
}
|
|
|
|
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 value = (nativeBaseLocked, tokenIndex) => {
|
|
const amount = mangoGroup
|
|
.getPrice(tokenIndex, mangoCache)
|
|
.mul(net(nativeBaseLocked, tokenIndex))
|
|
|
|
return amount
|
|
}
|
|
|
|
const marketPair = [
|
|
{
|
|
market: null,
|
|
key: `${baseSymbol}${name}`,
|
|
symbol: baseSymbol,
|
|
deposits: 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),
|
|
value: value(nativeBaseLocked, tokenIndex),
|
|
depositRate: i80f48ToPercent(mangoGroup.getDepositRate(tokenIndex)),
|
|
borrowRate: i80f48ToPercent(mangoGroup.getBorrowRate(tokenIndex)),
|
|
decimals: mangoGroup.tokens[tokenIndex].decimals,
|
|
},
|
|
{
|
|
market: null,
|
|
key: `${name}`,
|
|
symbol: mangoGroupConfig.quoteSymbol,
|
|
deposits: mangoAccount.getUiDeposit(
|
|
mangoCache.rootBankCache[quoteCurrencyIndex],
|
|
mangoGroup,
|
|
quoteCurrencyIndex
|
|
),
|
|
borrows: mangoAccount.getUiBorrow(
|
|
mangoCache.rootBankCache[quoteCurrencyIndex],
|
|
mangoGroup,
|
|
quoteCurrencyIndex
|
|
),
|
|
orders: nativeToUi(
|
|
nativeQuoteLocked,
|
|
mangoGroup.tokens[quoteCurrencyIndex].decimals
|
|
),
|
|
unsettled: nativeToUi(
|
|
nativeQuoteFree,
|
|
mangoGroup.tokens[quoteCurrencyIndex].decimals
|
|
),
|
|
net: net(nativeQuoteLocked, quoteCurrencyIndex),
|
|
value: value(nativeQuoteLocked, quoteCurrencyIndex),
|
|
depositRate: i80f48ToPercent(mangoGroup.getDepositRate(tokenIndex)),
|
|
borrowRate: i80f48ToPercent(mangoGroup.getBorrowRate(tokenIndex)),
|
|
decimals: mangoGroup.tokens[quoteCurrencyIndex].decimals,
|
|
},
|
|
]
|
|
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')
|
|
|
|
if (!mangoGroup || !mangoCache) {
|
|
return []
|
|
}
|
|
|
|
const net: I80F48 = quoteMeta.deposits
|
|
.add(I80F48.fromNumber(unsettled))
|
|
.sub(quoteMeta.borrows)
|
|
.add(I80F48.fromNumber(quoteInOrders))
|
|
|
|
const token = getTokenBySymbol(mangoGroupConfig, quoteMeta.symbol)
|
|
const tokenIndex = mangoGroup.getTokenIndex(token.mintKey)
|
|
|
|
const value = net.mul(mangoGroup.getPrice(tokenIndex, mangoCache))
|
|
|
|
const depositRate = i80f48ToPercent(mangoGroup.getDepositRate(tokenIndex))
|
|
|
|
const borrowRate = i80f48ToPercent(mangoGroup.getBorrowRate(tokenIndex))
|
|
|
|
return [
|
|
{
|
|
market: null,
|
|
key: `${quoteMeta.symbol}${quoteMeta.symbol}`,
|
|
symbol: quoteMeta.symbol,
|
|
deposits: quoteMeta.deposits,
|
|
borrows: quoteMeta.borrows,
|
|
orders: quoteInOrders,
|
|
unsettled,
|
|
net,
|
|
value,
|
|
depositRate,
|
|
borrowRate,
|
|
decimals: mangoGroup.tokens[QUOTE_INDEX].decimals,
|
|
},
|
|
].concat(baseBalances)
|
|
}
|