From 7c34ed0bcbc1045cd3cd30bf3f7c007278090097 Mon Sep 17 00:00:00 2001 From: tjs Date: Sat, 29 Oct 2022 20:30:37 -0400 Subject: [PATCH] use last slot when updating mango account --- components/MangoProvider.tsx | 48 ++++++++++++++---------------- components/modals/DepositModal.tsx | 2 +- store/mangoStore.ts | 17 +++++++---- 3 files changed, 36 insertions(+), 31 deletions(-) diff --git a/components/MangoProvider.tsx b/components/MangoProvider.tsx index c2a8f77c..e3acdd82 100644 --- a/components/MangoProvider.tsx +++ b/components/MangoProvider.tsx @@ -42,8 +42,7 @@ const HydrateStore = () => { async (info, context) => { if (info?.lamports === 0) return - // const lastSeenSlot = - // mangoStore.getState().mangoAccount.lastSlot + const lastSeenSlot = mangoStore.getState().mangoAccount.lastSlot // const mangoAccountLastUpdated = new Date( // mangoStore.getState().mangoAccount.lastUpdatedAt // ) @@ -55,30 +54,29 @@ const HydrateStore = () => { // only updated mango account if it's been more than 1 second since last update // if (Math.abs(timeDiff) >= 500 && context.slot > lastSeenSlot) { - const decodedMangoAccount = client.program.coder.accounts.decode( - 'mangoAccount', - info?.data - ) - const newMangoAccount = MangoAccount.from( - mangoAccount.publicKey, - decodedMangoAccount - ) - await newMangoAccount.reloadAccountData(client) - console.log('WEBSOCKET ma:', newMangoAccount) + if (context.slot > lastSeenSlot) { + const decodedMangoAccount = client.program.coder.accounts.decode( + 'mangoAccount', + info?.data + ) + const newMangoAccount = MangoAccount.from( + mangoAccount.publicKey, + decodedMangoAccount + ) + await newMangoAccount.reloadAccountData(client) + console.log('WEBSOCKET ma:', newMangoAccount) - // newMangoAccount.spotOpenOrdersAccounts = - // mangoAccount.spotOpenOrdersAccounts - // newMangoAccount.advancedOrders = mangoAccount.advancedOrders - mangoStore.setState({ - // state.mangoAccount.lastSlot = context.slot - mangoAccount: { - ...mangoStore.getState().mangoAccount, - current: newMangoAccount, - }, - // state.mangoAccount.lastUpdatedAt = - // newUpdatedAt.toISOString() - }) - // } + // newMangoAccount.spotOpenOrdersAccounts = + // mangoAccount.spotOpenOrdersAccounts + // newMangoAccount.advancedOrders = mangoAccount.advancedOrders + mangoStore.setState({ + mangoAccount: { + ...mangoStore.getState().mangoAccount, + current: newMangoAccount, + lastSlot: context.slot, + }, + }) + } } ) diff --git a/components/modals/DepositModal.tsx b/components/modals/DepositModal.tsx index a0de78d1..d68d26cc 100644 --- a/components/modals/DepositModal.tsx +++ b/components/modals/DepositModal.tsx @@ -151,7 +151,7 @@ function DepositModal({ isOpen, onClose, token }: ModalCombinedProps) { txid: tx, }) - // await actions.reloadMangoAccount() + await actions.reloadMangoAccount() actions.fetchWalletTokens(wallet!.adapter as unknown as Wallet) setSubmitting(false) } catch (e: any) { diff --git a/store/mangoStore.ts b/store/mangoStore.ts index d3507971..593f28f8 100644 --- a/store/mangoStore.ts +++ b/store/mangoStore.ts @@ -176,6 +176,7 @@ export type MangoStore = { current: MangoAccount | undefined initialLoad: boolean lastUpdatedAt: string + lastSlot: number openOrderAccounts: OpenOrders[] openOrders: Record spotBalances: SpotBalances @@ -279,6 +280,7 @@ const mangoStore = create()( mangoAccount: { current: undefined, initialLoad: true, + lastSlot: 0, lastUpdatedAt: '', openOrderAccounts: [], openOrders: {}, @@ -547,15 +549,20 @@ const mangoStore = create()( const group = get().group const client = get().client const mangoAccount = get().mangoAccount.current + const lastSlot = get().mangoAccount.lastSlot if (!group) throw new Error('Group not loaded') if (!mangoAccount) throw new Error('No mango account exists for reload') - const reloadedMangoAccount = await mangoAccount.reload(client) - set((state) => { - state.mangoAccount.current = reloadedMangoAccount - state.mangoAccount.lastUpdatedAt = new Date().toISOString() - }) + const { value: reloadedMangoAccount, slot } = + await mangoAccount.reloadWithSlot(client) + if (slot > lastSlot) { + set((state) => { + state.mangoAccount.current = reloadedMangoAccount + state.mangoAccount.lastUpdatedAt = new Date().toISOString() + state.mangoAccount.lastSlot = slot + }) + } } catch (e) { console.error('Error reloading mango acct', e) actions.reloadMangoAccount()