2021-06-18 21:26:47 -07:00
|
|
|
import { PerpOrder, BookSide, BookSideLayout, getMarketByPublicKey, MarketConfig, PerpMarket, MerpsAccount as MarginAccount } from '@blockworks-foundation/mango-client'
|
|
|
|
import { Market, Orderbook } from '@project-serum/serum'
|
2021-06-18 20:07:57 -07:00
|
|
|
import { Order } from '@project-serum/serum/lib/market'
|
2021-04-07 14:49:37 -07:00
|
|
|
import useMangoStore from '../stores/useMangoStore'
|
|
|
|
|
2021-06-18 20:07:57 -07:00
|
|
|
type OrderInfo = {
|
|
|
|
order: Order | PerpOrder,
|
|
|
|
market: { account: Market | PerpMarket, config: MarketConfig }}
|
2021-04-07 14:49:37 -07:00
|
|
|
|
2021-06-18 20:07:57 -07:00
|
|
|
function parseSpotOrders(market: Market, config: MarketConfig, marginAccount: MarginAccount, accountInfos) {
|
|
|
|
const openOrders = marginAccount.spotOpenOrdersAccounts[config.marketIndex];
|
2021-06-18 21:26:47 -07:00
|
|
|
if (!openOrders)
|
|
|
|
return [];
|
|
|
|
|
2021-06-18 20:07:57 -07:00
|
|
|
const bidData = accountInfos[market['_decoded'].bids.toBase58()]?.data
|
|
|
|
const askData = accountInfos[market['_decoded'].asks.toBase58()]?.data
|
|
|
|
|
|
|
|
const bidOrderBook = market && bidData ? Orderbook.decode(market, bidData) : []
|
|
|
|
const askOrderBook = market && askData ? Orderbook.decode(market, askData) : []
|
|
|
|
|
|
|
|
const openOrdersForMarket = [...bidOrderBook, ...askOrderBook].filter((o) =>
|
|
|
|
o.openOrdersAddress.equals(openOrders.address)
|
|
|
|
)
|
|
|
|
|
|
|
|
return openOrdersForMarket.map<OrderInfo>((order) => ({
|
|
|
|
order,
|
|
|
|
market: { account: market, config: config },
|
|
|
|
}))
|
|
|
|
}
|
|
|
|
|
|
|
|
function parsePerpOpenOrders(market: PerpMarket, config: MarketConfig, marginAccount: MarginAccount, accountInfos) {
|
|
|
|
const bidData = accountInfos[market.bids.toBase58()]?.data
|
|
|
|
const askData = accountInfos[market.asks.toBase58()]?.data
|
|
|
|
|
|
|
|
const bidOrderBook = market && bidData ? new BookSide(market.bids, market, BookSideLayout.decode(bidData)) : []
|
|
|
|
const askOrderBook = market && askData ? new BookSide(market.asks, market, BookSideLayout.decode(askData)) : []
|
|
|
|
|
|
|
|
const openOrdersForMarket = [...bidOrderBook, ...askOrderBook].filter((o) =>
|
|
|
|
o.owner.equals(marginAccount.publicKey)
|
|
|
|
)
|
|
|
|
|
|
|
|
return openOrdersForMarket.map<OrderInfo>((order) => ({
|
|
|
|
order,
|
|
|
|
market: { account: market, config: config },
|
|
|
|
}));
|
2021-04-07 14:49:37 -07:00
|
|
|
}
|
2021-04-07 08:44:22 -07:00
|
|
|
|
|
|
|
export function useOpenOrders() {
|
2021-04-07 14:49:37 -07:00
|
|
|
const markets = useMangoStore((s) => s.selectedMangoGroup.markets)
|
|
|
|
const marginAccount = useMangoStore((s) => s.selectedMarginAccount.current)
|
|
|
|
const mangoGroup = useMangoStore((s) => s.selectedMangoGroup.current)
|
2021-06-18 20:07:57 -07:00
|
|
|
const groupConfig = useMangoStore((s) => s.selectedMangoGroup.config)
|
2021-04-12 20:39:08 -07:00
|
|
|
const accountInfos = useMangoStore((s) => s.accountInfos)
|
2021-04-07 08:44:22 -07:00
|
|
|
|
2021-04-12 20:39:08 -07:00
|
|
|
if (!mangoGroup || !marginAccount || !accountInfos) return null
|
2021-04-07 08:44:22 -07:00
|
|
|
|
2021-06-18 20:07:57 -07:00
|
|
|
const openOrders = Object.entries(markets).map(([address, market]) => {
|
|
|
|
const marketConfig = getMarketByPublicKey(groupConfig, address)
|
|
|
|
if (market instanceof Market) {
|
|
|
|
return parseSpotOrders(market, marketConfig, marginAccount, accountInfos);
|
|
|
|
} else if (market instanceof PerpMarket) {
|
|
|
|
return parsePerpOpenOrders(market, marketConfig, marginAccount, accountInfos);
|
|
|
|
}
|
2021-04-07 14:49:37 -07:00
|
|
|
})
|
2021-04-07 08:44:22 -07:00
|
|
|
|
2021-04-07 14:49:37 -07:00
|
|
|
return openOrders.flat()
|
2021-04-07 08:44:22 -07:00
|
|
|
}
|