more resilent openbook decode

This commit is contained in:
Adrian Brzeziński 2023-12-28 22:47:02 +01:00
parent 562395dfee
commit 61dc94011a
2 changed files with 55 additions and 53 deletions

View File

@ -31,7 +31,6 @@ import {
decodeBookL2,
formatOrderbookData,
getMarket,
isMarketReadyForDecode,
updatePerpMarketOnGroup,
} from 'utils/orderbook'
import { OrderbookData, OrderbookL2 } from 'types'
@ -305,13 +304,18 @@ const Orderbook = () => {
connection
.getAccountInfoAndContext(bidsPk)
.then(({ context, value: info }) => {
if (!info || !isMarketReadyForDecode(market)) return
try {
if (!info || !market) return
const decodedBook = decodeBook(client, market, info, 'bids')
set((state) => {
state.selectedMarket.lastSeenSlot.bids = context.slot
state.selectedMarket.bidsAccount = decodedBook
state.selectedMarket.orderbook.bids = decodeBookL2(decodedBook)
})
} catch (e) {
console.log(e)
return
}
})
bidSubscriptionId = connection.onAccountChange(
bidsPk,
@ -319,16 +323,22 @@ const Orderbook = () => {
const lastSeenSlot =
mangoStore.getState().selectedMarket.lastSeenSlot.bids
if (context.slot > lastSeenSlot) {
if (!isMarketReadyForDecode(market)) return
try {
if (!market) return
const decodedBook = decodeBook(client, market!, info, 'bids')
if (decodedBook instanceof BookSide) {
updatePerpMarketOnGroup(decodedBook, 'bids')
}
set((state) => {
state.selectedMarket.bidsAccount = decodedBook
state.selectedMarket.orderbook.bids = decodeBookL2(decodedBook)
state.selectedMarket.orderbook.bids =
decodeBookL2(decodedBook)
state.selectedMarket.lastSeenSlot.bids = context.slot
})
} catch (e) {
console.log(e)
return
}
}
},
'processed',
@ -340,13 +350,18 @@ const Orderbook = () => {
connection
.getAccountInfoAndContext(asksPk)
.then(({ context, value: info }) => {
if (!info || !isMarketReadyForDecode(market)) return
try {
if (!info || !market) return
const decodedBook = decodeBook(client, market, info, 'asks')
set((state) => {
state.selectedMarket.asksAccount = decodedBook
state.selectedMarket.orderbook.asks = decodeBookL2(decodedBook)
state.selectedMarket.lastSeenSlot.asks = context.slot
})
} catch (e) {
console.log(e)
return
}
})
askSubscriptionId = connection.onAccountChange(
asksPk,
@ -354,16 +369,22 @@ const Orderbook = () => {
const lastSeenSlot =
mangoStore.getState().selectedMarket.lastSeenSlot.asks
if (context.slot > lastSeenSlot) {
if (!isMarketReadyForDecode(market)) return
try {
if (!market) return
const decodedBook = decodeBook(client, market!, info, 'asks')
if (decodedBook instanceof BookSide) {
updatePerpMarketOnGroup(decodedBook, 'asks')
}
set((state) => {
state.selectedMarket.asksAccount = decodedBook
state.selectedMarket.orderbook.asks = decodeBookL2(decodedBook)
state.selectedMarket.orderbook.asks =
decodeBookL2(decodedBook)
state.selectedMarket.lastSeenSlot.asks = context.slot
})
} catch (e) {
console.log(e)
return
}
}
},
'processed',
@ -379,13 +400,7 @@ const Orderbook = () => {
}
}
}
}, [
bidAccountAddress,
askAccountAddress,
connection,
useOrderbookFeed,
market,
])
}, [bidAccountAddress, askAccountAddress, connection, useOrderbookFeed])
useEffect(() => {
const market = getMarket()

View File

@ -54,19 +54,6 @@ export function decodeBook(
}
}
export const isMarketReadyForDecode = (
market: PerpMarket | Market | undefined,
) => {
if (
!market ||
(market instanceof Market && !market.decoded.accountFlags.initialized)
) {
return false
} else {
return true
}
}
export const updatePerpMarketOnGroup = (
book: BookSide,
side: 'bids' | 'asks',