diff --git a/components/trade/OpenOrders.tsx b/components/trade/OpenOrders.tsx index 473b35e7..203418a7 100644 --- a/components/trade/OpenOrders.tsx +++ b/components/trade/OpenOrders.tsx @@ -252,10 +252,12 @@ const OpenOrders = () => { let market: PerpMarket | Serum3Market let tickSize: number let minOrderSize: number + let expiryTimestamp: number | undefined if (o instanceof PerpOrder) { market = group.getPerpMarketByMarketIndex(o.perpMarketIndex) tickSize = market.tickSize minOrderSize = market.minOrderSize + expiryTimestamp = o.expiryTimestamp.toNumber() } else { market = group.getSerum3MarketByExternalMarket( new PublicKey(marketPk) @@ -319,6 +321,11 @@ const OpenOrders = () => { )} + {expiryTimestamp ? ( +
{`Expires ${new Date( + expiryTimestamp * 1000 + ).toLocaleTimeString()}`}
+ ) : null} {!isUnownedAccount ? ( diff --git a/components/trade/Orderbook.tsx b/components/trade/Orderbook.tsx index cdd3fab7..741d62a2 100644 --- a/components/trade/Orderbook.tsx +++ b/components/trade/Orderbook.tsx @@ -309,8 +309,6 @@ const Orderbook = () => { if (!market || !group) return - let previousBidInfo: AccountInfo | undefined = undefined - let previousAskInfo: AccountInfo | undefined = undefined let bidSubscriptionId: number | undefined = undefined let askSubscriptionId: number | undefined = undefined @@ -318,30 +316,32 @@ const Orderbook = () => { market instanceof Market ? market['_decoded'].bids : market.bids console.log('bidsPk', bidsPk?.toString()) if (bidsPk) { - connection.getAccountInfo(bidsPk).then((info) => { - if (!info) return - const decodedBook = decodeBook(client, market, info, 'bids') - set((state) => { - state.selectedMarket.bidsAccount = decodedBook - state.selectedMarket.orderbook.bids = decodeBookL2(decodedBook) + connection + .getAccountInfoAndContext(bidsPk) + .then(({ context, value: info }) => { + if (!info) 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) + }) }) - }) bidSubscriptionId = connection.onAccountChange( bidsPk, - (info, _context) => { - if ( - !previousBidInfo || - !previousBidInfo.data.equals(info.data) || - previousBidInfo.lamports !== info.lamports - ) { - previousBidInfo = info + (info, context) => { + const lastSeenSlot = + mangoStore.getState().selectedMarket.lastSeenSlot.bids + if (context.slot > lastSeenSlot) { const decodedBook = decodeBook(client, market, info, 'bids') set((state) => { state.selectedMarket.bidsAccount = decodedBook state.selectedMarket.orderbook.bids = decodeBookL2(decodedBook) + state.selectedMarket.lastSeenSlot.bids = context.slot }) } - } + }, + 'processed' ) } @@ -349,30 +349,32 @@ const Orderbook = () => { market instanceof Market ? market['_decoded'].asks : market.asks console.log('asksPk', asksPk?.toString()) if (asksPk) { - connection.getAccountInfo(asksPk).then((info) => { - if (!info) return - const decodedBook = decodeBook(client, market, info, 'asks') - set((state) => { - state.selectedMarket.asksAccount = decodedBook - state.selectedMarket.orderbook.asks = decodeBookL2(decodedBook) + connection + .getAccountInfoAndContext(asksPk) + .then(({ context, value: info }) => { + if (!info) 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 + }) }) - }) askSubscriptionId = connection.onAccountChange( asksPk, - (info, _context) => { - if ( - !previousAskInfo || - !previousAskInfo.data.equals(info.data) || - previousAskInfo.lamports !== info.lamports - ) { - previousAskInfo = info + (info, context) => { + const lastSeenSlot = + mangoStore.getState().selectedMarket.lastSeenSlot.bids + if (context.slot > lastSeenSlot) { 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 }) } - } + }, + 'processed' ) } return () => { diff --git a/store/mangoStore.ts b/store/mangoStore.ts index 7265c022..62e57fab 100644 --- a/store/mangoStore.ts +++ b/store/mangoStore.ts @@ -305,6 +305,10 @@ export type MangoStore = { asksAccount: BookSide | Orderbook | undefined orderbook: OrderbookL2 markPrice: number + lastSeenSlot: { + bids: number + asks: number + } } serumMarkets: Serum3Market[] serumOrders: Order[] | undefined @@ -443,6 +447,10 @@ const mangoStore = create()( fills: [], bidsAccount: undefined, asksAccount: undefined, + lastSeenSlot: { + bids: 0, + asks: 0, + }, orderbook: { bids: [], asks: [], diff --git a/yarn.lock b/yarn.lock index 749021a4..192e9bcf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,16 +15,23 @@ core-js-pure "^3.20.2" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.17.2", "@babel/runtime@^7.17.9", "@babel/runtime@^7.18.6", "@babel/runtime@^7.18.9", "@babel/runtime@^7.6.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.14.5", "@babel/runtime@^7.17.9", "@babel/runtime@^7.18.6", "@babel/runtime@^7.18.9", "@babel/runtime@^7.6.2": version "7.20.13" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== dependencies: regenerator-runtime "^0.13.11" +"@babel/runtime@^7.10.5", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.2": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" + integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== + dependencies: + regenerator-runtime "^0.13.11" + "@blockworks-foundation/mango-v4@https://github.com/blockworks-foundation/mango-v4.git#ts-client": version "0.4.3" - resolved "https://github.com/blockworks-foundation/mango-v4.git#c0b9ff2a94faff918ba8dfb5708959fd977fda6d" + resolved "https://github.com/blockworks-foundation/mango-v4.git#dbf7fce21ac31ef789dd3d3197f090aa87d18b10" dependencies: "@project-serum/anchor" "^0.25.0" "@project-serum/serum" "^0.13.65"