diff --git a/components/MangoProvider.tsx b/components/MangoProvider.tsx index 54e6f879..a00941ed 100644 --- a/components/MangoProvider.tsx +++ b/components/MangoProvider.tsx @@ -126,6 +126,7 @@ const ReadOnlyMangoAccount = () => { state.mangoAccount.current = readOnlyMangoAccount state.mangoAccount.initialLoad = false }) + actions.fetchTradeHistory() } catch (error) { console.error('error', error) } diff --git a/components/modals/MangoAccountsListModal.tsx b/components/modals/MangoAccountsListModal.tsx index 5e11e501..859ab02c 100644 --- a/components/modals/MangoAccountsListModal.tsx +++ b/components/modals/MangoAccountsListModal.tsx @@ -60,6 +60,7 @@ const MangoAccountsListModal = ({ try { const reloadedMangoAccount = await retryFn(() => acc.reload(client)) actions.fetchOpenOrders(reloadedMangoAccount) + actions.fetchTradeHistory() set((s) => { s.mangoAccount.current = reloadedMangoAccount diff --git a/components/shared/TableElements.tsx b/components/shared/TableElements.tsx index a8b7c01f..f4856774 100644 --- a/components/shared/TableElements.tsx +++ b/components/shared/TableElements.tsx @@ -65,7 +65,9 @@ export const TableDateDisplay = ({ showSeconds?: boolean }) => ( <> -
{dayjs(date).format('DD MMM YYYY')}
++ {dayjs(date).format('DD MMM YYYY')} +
{dayjs(date).format(showSeconds ? 'h:mm:ssa' : 'h:mma')}
diff --git a/components/trade/TradeHistory.tsx b/components/trade/TradeHistory.tsx index 2f9eee42..c184afff 100644 --- a/components/trade/TradeHistory.tsx +++ b/components/trade/TradeHistory.tsx @@ -1,5 +1,4 @@ import { I80F48, PerpMarket } from '@blockworks-foundation/mango-v4' -import InlineNotification from '@components/shared/InlineNotification' import SideBadge from '@components/shared/SideBadge' import { Table, @@ -10,6 +9,7 @@ import { TrHead, } from '@components/shared/TableElements' import { NoSymbolIcon } from '@heroicons/react/20/solid' +import { PublicKey } from '@solana/web3.js' import mangoStore from '@store/mangoStore' import useMangoAccount from 'hooks/useMangoAccount' import useSelectedMarket from 'hooks/useSelectedMarket' @@ -86,27 +86,32 @@ const formatTradeHistory = ( } const TradeHistory = () => { + const group = mangoStore.getState().group const { selectedMarket } = useSelectedMarket() const { mangoAccount, mangoAccountAddress } = useMangoAccount() const fills = mangoStore((s) => s.selectedMarket.fills) + const tradeHistory = mangoStore((s) => s.mangoAccount.tradeHistory) const { width } = useViewport() const showTableView = width ? width > breakpoints.md : false const openOrderOwner = useMemo(() => { if (!mangoAccount || !selectedMarket) return - try { - if (selectedMarket instanceof PerpMarket) { - return mangoAccount.publicKey - } else { + if (selectedMarket instanceof PerpMarket) { + return mangoAccount.publicKey + } else { + try { return mangoAccount.getSerum3OoAccount(selectedMarket.marketIndex) .address + } catch { + console.warn( + 'Unable to find OO account for mkt index', + selectedMarket.marketIndex + ) } - } catch (e) { - console.error('Error loading open order account for trade history: ', e) } }, [mangoAccount, selectedMarket]) - const tradeHistoryFromEventQueue = useMemo(() => { + const eventQueueFillsForAccount = useMemo(() => { if (!mangoAccountAddress || !selectedMarket) return [] const mangoAccountFills = fills @@ -127,9 +132,30 @@ const TradeHistory = () => { return formatTradeHistory(mangoAccountAddress, mangoAccountFills) }, [selectedMarket, mangoAccountAddress, openOrderOwner, fills]) - if (!selectedMarket) return null + const combinedTradeHistory = useMemo(() => { + let newFills = [] + if (eventQueueFillsForAccount?.length) { + console.log('eventQueueFillsForAccount', eventQueueFillsForAccount) - return mangoAccount && tradeHistoryFromEventQueue.length ? ( + newFills = eventQueueFillsForAccount.filter((fill) => { + return !tradeHistory.find((t) => { + if (t.order_id) { + return t.order_id === fill.orderId?.toString() + } + // else { + // return t.seq_num === fill.seqNum?.toString() + // } + }) + }) + } + return [...newFills, ...tradeHistory] + }, [eventQueueFillsForAccount, tradeHistory]) + + console.log('trade history', tradeHistory) + + if (!selectedMarket || !group) return null + + return mangoAccount && combinedTradeHistory.length ? ( showTableView ? (Price | Value | Fee | - {selectedMarket instanceof PerpMarket ? ( -Time | - ) : null} +Time | - {tradeHistoryFromEventQueue.map((trade: any) => { + {combinedTradeHistory.map((trade: any) => { + let market + if ('market' in trade) { + market = group.getSerum3MarketByExternalMarket( + new PublicKey(trade.market) + ) + } else { + market = selectedMarket + } + let makerTaker = trade.liquidity + if ('maker' in trade) { + makerTaker = trade.maker ? 'Maker' : 'Taker' + } + return ( -
- |
|
- ${trade.value.toFixed(2)} + {trade.price * trade.size} |
- {trade.feeCost}
- {`${ - trade.liquidity ? trade.liquidity : '' - }`} + + {trade.fee_cost || trade.feeCost} + ++ {makerTaker} + |
- {selectedMarket instanceof PerpMarket ? (
- + + |
+ {trade.block_datetime ? (
|
- ) : null}
+ ) : (
+ 'Recent'
+ )}
+
---|
No trade history for {selectedMarket?.name}
+No trade history