54 lines
1.7 KiB
TypeScript
54 lines
1.7 KiB
TypeScript
// import { useEffect, useRef } from 'react'
|
|
import { Orderbook } from '@project-serum/serum'
|
|
import useMangoStore from '../stores/useMangoStore'
|
|
import useMarketList from './useMarketList'
|
|
|
|
const getOrderBookAccounts = (market, accountInfos) => {
|
|
const bidData = accountInfos[market._decoded.bids.toString()]?.data
|
|
const askData = accountInfos[market._decoded.asks.toString()]?.data
|
|
|
|
return {
|
|
bidOrderBook:
|
|
market && bidData ? Orderbook.decode(market, Buffer.from(bidData)) : [],
|
|
askOrderBook:
|
|
market && askData ? Orderbook.decode(market, Buffer.from(askData)) : [],
|
|
}
|
|
}
|
|
|
|
export function useOpenOrders() {
|
|
const markets = useMangoStore((s) => s.selectedMangoGroup.markets)
|
|
const marginAccount = useMangoStore((s) => s.selectedMarginAccount.current)
|
|
const mangoGroup = useMangoStore((s) => s.selectedMangoGroup.current)
|
|
const accountInfos = useMangoStore((s) => s.accountInfos)
|
|
const { marketList } = useMarketList()
|
|
|
|
if (!mangoGroup || !marginAccount || !accountInfos) return null
|
|
|
|
const openOrders = Object.entries(markets).map(([address, market]) => {
|
|
const marketIndex = mangoGroup.getMarketIndex(market)
|
|
const openOrdersAccount = marginAccount.openOrdersAccounts[marketIndex]
|
|
const marketName = marketList.find(
|
|
(mkt) => mkt.address.toString() === address
|
|
).name
|
|
|
|
if (!openOrdersAccount) return []
|
|
|
|
const { bidOrderBook, askOrderBook } = getOrderBookAccounts(
|
|
market,
|
|
accountInfos
|
|
)
|
|
|
|
const openOrdersForMarket = [...bidOrderBook, ...askOrderBook].filter((o) =>
|
|
o.openOrdersAddress.equals(openOrdersAccount.address)
|
|
)
|
|
|
|
return openOrdersForMarket.map((order) => ({
|
|
...order,
|
|
marketName,
|
|
market,
|
|
}))
|
|
})
|
|
|
|
return openOrders.flat()
|
|
}
|