From 7d70f119c2ccc35c3c222ac562cbdbfe8d39bfa9 Mon Sep 17 00:00:00 2001 From: isstuev Date: Thu, 1 Aug 2024 16:10:51 +0200 Subject: [PATCH] arbitrum latest batches and deposits --- lib/api/resources.ts | 22 ++- lib/socket/types.ts | 9 +- types/api/arbitrumL2.ts | 2 + ui/home/Stats.tsx | 31 ++-- ui/home/Transactions.tsx | 12 +- ...mobile_default-view-mobile-dark-mode-1.png | Bin 21650 -> 0 bytes .../LatestArbitrumL2Batches.pw.tsx | 15 ++ .../latestBatches/LatestArbitrumL2Batches.tsx | 92 ++++++++++ .../LatestBatchItem.tsx} | 24 +-- .../LatestZkEvmL2Batches.pw.tsx | 0 .../LatestZkEvmL2Batches.tsx | 23 ++- ...r-mode_default-view-mobile-dark-mode-1.png | Bin 0 -> 15594 bytes ...efault_default-view-mobile-dark-mode-1.png | Bin 0 -> 15287 bytes ...mobile_default-view-mobile-dark-mode-1.png | Bin 0 -> 12724 bytes ...r-mode_default-view-mobile-dark-mode-1.png | Bin ...efault_default-view-mobile-dark-mode-1.png | Bin ...mobile_default-view-mobile-dark-mode-1.png | Bin .../latestDeposits/LatestArbitrumDeposits.tsx | 77 +++++++++ ui/home/latestDeposits/LatestDeposits.tsx | 157 ++++++++++++++++++ .../LatestDepositsItem.tsx | 30 ++-- .../LatestOptimisticDeposits.pw.tsx} | 6 +- .../LatestOptimisticDeposits.tsx} | 40 ++--- ...-mode_default-view-mobile-dark-mode-1.png} | Bin ...fault_default-view-mobile-dark-mode-1.png} | Bin ...mobile_default-view-mobile-dark-mode-1.png | Bin 0 -> 21575 bytes ui/pages/Home.tsx | 7 +- 26 files changed, 457 insertions(+), 90 deletions(-) delete mode 100644 ui/home/__screenshots__/LatestDeposits.pw.tsx_mobile_default-view-mobile-dark-mode-1.png create mode 100644 ui/home/latestBatches/LatestArbitrumL2Batches.pw.tsx create mode 100644 ui/home/latestBatches/LatestArbitrumL2Batches.tsx rename ui/home/{LatestZkevmL2BatchItem.tsx => latestBatches/LatestBatchItem.tsx} (75%) rename ui/home/{ => latestBatches}/LatestZkEvmL2Batches.pw.tsx (100%) rename ui/home/{ => latestBatches}/LatestZkEvmL2Batches.tsx (79%) create mode 100644 ui/home/latestBatches/__screenshots__/LatestArbitrumL2Batches.pw.tsx_dark-color-mode_default-view-mobile-dark-mode-1.png create mode 100644 ui/home/latestBatches/__screenshots__/LatestArbitrumL2Batches.pw.tsx_default_default-view-mobile-dark-mode-1.png create mode 100644 ui/home/latestBatches/__screenshots__/LatestArbitrumL2Batches.pw.tsx_mobile_default-view-mobile-dark-mode-1.png rename ui/home/{ => latestBatches}/__screenshots__/LatestZkEvmL2Batches.pw.tsx_dark-color-mode_default-view-mobile-dark-mode-1.png (100%) rename ui/home/{ => latestBatches}/__screenshots__/LatestZkEvmL2Batches.pw.tsx_default_default-view-mobile-dark-mode-1.png (100%) rename ui/home/{ => latestBatches}/__screenshots__/LatestZkEvmL2Batches.pw.tsx_mobile_default-view-mobile-dark-mode-1.png (100%) create mode 100644 ui/home/latestDeposits/LatestArbitrumDeposits.tsx create mode 100644 ui/home/latestDeposits/LatestDeposits.tsx rename ui/home/{ => latestDeposits}/LatestDepositsItem.tsx (82%) rename ui/home/{LatestDeposits.pw.tsx => latestDeposits/LatestOptimisticDeposits.pw.tsx} (64%) rename ui/home/{LatestDeposits.tsx => latestDeposits/LatestOptimisticDeposits.tsx} (56%) rename ui/home/{__screenshots__/LatestDeposits.pw.tsx_dark-color-mode_default-view-mobile-dark-mode-1.png => latestDeposits/__screenshots__/LatestOptimisticDeposits.pw.tsx_dark-color-mode_default-view-mobile-dark-mode-1.png} (100%) rename ui/home/{__screenshots__/LatestDeposits.pw.tsx_default_default-view-mobile-dark-mode-1.png => latestDeposits/__screenshots__/LatestOptimisticDeposits.pw.tsx_default_default-view-mobile-dark-mode-1.png} (100%) create mode 100644 ui/home/latestDeposits/__screenshots__/LatestOptimisticDeposits.pw.tsx_mobile_default-view-mobile-dark-mode-1.png diff --git a/lib/api/resources.ts b/lib/api/resources.ts index 3f1d6cf6f1..04644efcb6 100644 --- a/lib/api/resources.ts +++ b/lib/api/resources.ts @@ -43,10 +43,12 @@ import type { AddressesResponse } from 'types/api/addresses'; import type { AddressMetadataInfo, PublicTagTypesResponse } from 'types/api/addressMetadata'; import type { ArbitrumL2MessagesResponse, + ArbitrumL2MessagesItem, ArbitrumL2TxnBatch, ArbitrumL2TxnBatchesResponse, ArbitrumL2BatchTxs, ArbitrumL2BatchBlocks, + ArbitrumL2TxnBatchesItem, } from 'types/api/arbitrumL2'; import type { TxBlobs, Blob } from 'types/api/blobs'; import type { BlocksResponse, BlockTransactionsResponse, Block, BlockFilters, BlockWithdrawalsResponse, BlockCountdownResponse } from 'types/api/block'; @@ -580,15 +582,21 @@ export const RESOURCES = { homepage_blocks: { path: '/api/v2/main-page/blocks', }, - homepage_deposits: { + homepage_optimistic_deposits: { path: '/api/v2/main-page/optimism-deposits', }, + homepage_arbitrum_deposits: { + path: '/api/v2/main-page/arbitrum/messages/to-rollup', + }, homepage_txs: { path: '/api/v2/main-page/transactions', }, homepage_zkevm_l2_batches: { path: '/api/v2/main-page/zkevm/batches/confirmed', }, + homepage_arbitrum_l2_batches: { + path: '/api/v2/main-page/arbitrum/batches/committed', + }, homepage_txs_watchlist: { path: '/api/v2/main-page/transactions/watchlist', }, @@ -601,6 +609,9 @@ export const RESOURCES = { homepage_zksync_latest_batch: { path: '/api/v2/main-page/zksync/batches/latest-number', }, + homepage_arbitrum_latest_batch: { + path: '/api/v2/main-page/arbitrum/batches/latest-number', + }, // SEARCH quick_search: { @@ -966,11 +977,14 @@ Q extends 'stats_charts_secondary_coin_price' ? ChartSecondaryCoinPriceResponse Q extends 'homepage_blocks' ? Array : Q extends 'homepage_txs' ? Array : Q extends 'homepage_txs_watchlist' ? Array : -Q extends 'homepage_deposits' ? Array : +Q extends 'homepage_optimistic_deposits' ? Array : +Q extends 'homepage_arbitrum_deposits' ? { items: Array } : Q extends 'homepage_zkevm_l2_batches' ? { items: Array } : +Q extends 'homepage_arbitrum_l2_batches' ? { items: Array} : Q extends 'homepage_indexing_status' ? IndexingStatus : Q extends 'homepage_zkevm_latest_batch' ? number : Q extends 'homepage_zksync_latest_batch' ? number : +Q extends 'homepage_arbitrum_latest_batch' ? number : Q extends 'stats_counters' ? stats.Counters : Q extends 'stats_lines' ? stats.LineCharts : Q extends 'stats_line' ? stats.LineChart : @@ -1029,8 +1043,6 @@ Q extends 'verified_contracts' ? VerifiedContractsResponse : Q extends 'verified_contracts_counters' ? VerifiedContractsCounters : Q extends 'visualize_sol2uml' ? visualizer.VisualizeResponse : Q extends 'contract_verification_config' ? SmartContractVerificationConfigRaw : -Q extends 'withdrawals' ? WithdrawalsResponse : -Q extends 'withdrawals_counters' ? WithdrawalsCounters : Q extends 'optimistic_l2_output_roots' ? OptimisticL2OutputRootsResponse : Q extends 'optimistic_l2_withdrawals' ? OptimisticL2WithdrawalsResponse : Q extends 'optimistic_l2_deposits' ? OptimisticL2DepositsResponse : @@ -1097,6 +1109,8 @@ Q extends 'address_mud_tables' ? AddressMudTables : Q extends 'address_mud_tables_count' ? number : Q extends 'address_mud_records' ? AddressMudRecords : Q extends 'address_mud_record' ? AddressMudRecord : +Q extends 'withdrawals' ? WithdrawalsResponse : +Q extends 'withdrawals_counters' ? WithdrawalsCounters : never; /* eslint-enable @typescript-eslint/indent */ diff --git a/lib/socket/types.ts b/lib/socket/types.ts index 96ec44ca7e..927b7ec7ea 100644 --- a/lib/socket/types.ts +++ b/lib/socket/types.ts @@ -1,6 +1,7 @@ import type { Channel } from 'phoenix'; import type { AddressCoinBalanceHistoryItem, AddressTokensBalancesSocketMessage } from 'types/api/address'; +import type { NewArbitrumBatchSocketResponse } from 'types/api/arbitrumL2'; import type { NewBlockSocketResponse } from 'types/api/block'; import type { SmartContractVerificationResponse } from 'types/api/contract'; import type { RawTracesResponse } from 'types/api/rawTrace'; @@ -16,7 +17,8 @@ SocketMessage.TxStatusUpdate | SocketMessage.TxRawTrace | SocketMessage.NewTx | SocketMessage.NewPendingTx | -SocketMessage.NewDeposits | +SocketMessage.NewOptimisticDeposits | +SocketMessage.NewArbitrumDeposits | SocketMessage.AddressBalance | SocketMessage.AddressCurrentCoinBalance | SocketMessage.AddressTokenBalance | @@ -36,6 +38,7 @@ SocketMessage.TokenTotalSupply | SocketMessage.TokenInstanceMetadataFetched | SocketMessage.ContractVerification | SocketMessage.NewZkEvmL2Batch | +SocketMessage.NewArbitrumL2Batch | SocketMessage.Unknown; interface SocketMessageParamsGeneric { @@ -53,7 +56,8 @@ export namespace SocketMessage { export type TxRawTrace = SocketMessageParamsGeneric<'raw_trace', RawTracesResponse>; export type NewTx = SocketMessageParamsGeneric<'transaction', { transaction: number }>; export type NewPendingTx = SocketMessageParamsGeneric<'pending_transaction', { pending_transaction: number }>; - export type NewDeposits = SocketMessageParamsGeneric<'deposits', { deposits: number }>; + export type NewOptimisticDeposits = SocketMessageParamsGeneric<'deposits', { deposits: number }>; + export type NewArbitrumDeposits = SocketMessageParamsGeneric<'new_messages_to_rollup_amount', { new_messages_to_rollup_amount: number }>; export type AddressBalance = SocketMessageParamsGeneric<'balance', { balance: string; block_number: number; exchange_rate: string }>; export type AddressCurrentCoinBalance = SocketMessageParamsGeneric<'current_coin_balance', { coin_balance: string; block_number: number; exchange_rate: string }>; @@ -74,5 +78,6 @@ export namespace SocketMessage { export type TokenInstanceMetadataFetched = SocketMessageParamsGeneric<'fetched_token_instance_metadata', TokenInstanceMetadataSocketMessage>; export type ContractVerification = SocketMessageParamsGeneric<'verification_result', SmartContractVerificationResponse>; export type NewZkEvmL2Batch = SocketMessageParamsGeneric<'new_zkevm_confirmed_batch', NewZkEvmBatchSocketResponse>; + export type NewArbitrumL2Batch = SocketMessageParamsGeneric<'new_arbitrum_batch', NewArbitrumBatchSocketResponse>; export type Unknown = SocketMessageParamsGeneric; } diff --git a/types/api/arbitrumL2.ts b/types/api/arbitrumL2.ts index 7e6fd25442..b4f6aabc8a 100644 --- a/types/api/arbitrumL2.ts +++ b/types/api/arbitrumL2.ts @@ -84,3 +84,5 @@ export const ARBITRUM_L2_TX_BATCH_STATUSES = [ ]; export type ArbitrumBatchStatus = typeof ARBITRUM_L2_TX_BATCH_STATUSES[number]; + +export type NewArbitrumBatchSocketResponse = { batch: ArbitrumL2TxnBatchesItem } diff --git a/ui/home/Stats.tsx b/ui/home/Stats.tsx index 685ee00c2f..09e73f081e 100644 --- a/ui/home/Stats.tsx +++ b/ui/home/Stats.tsx @@ -46,13 +46,21 @@ const Stats = () => { }, }); - if (isError || zkEvmLatestBatchQuery.isError || zkSyncLatestBatchQuery.isError) { + const arbitrumLatestBatchQuery = useApiQuery('homepage_arbitrum_latest_batch', { + queryOptions: { + placeholderData: 12345, + enabled: rollupFeature.isEnabled && rollupFeature.type === 'arbitrum', + }, + }); + + if (isError || zkEvmLatestBatchQuery.isError || zkSyncLatestBatchQuery.isError || arbitrumLatestBatchQuery.isError) { return null; } const isLoading = isPlaceholderData || (rollupFeature.isEnabled && rollupFeature.type === 'zkEvm' && zkEvmLatestBatchQuery.isPlaceholderData) || - (rollupFeature.isEnabled && rollupFeature.type === 'zkSync' && zkSyncLatestBatchQuery.isPlaceholderData); + (rollupFeature.isEnabled && rollupFeature.type === 'zkSync' && zkSyncLatestBatchQuery.isPlaceholderData) || + (rollupFeature.isEnabled && rollupFeature.type === 'arbitrum' && arbitrumLatestBatchQuery.isPlaceholderData); const content = (() => { if (!data) { @@ -72,22 +80,21 @@ const Stats = () => { ) : null; + const hasBatches = rollupFeature.isEnabled && (rollupFeature.type === 'zkEvm' || rollupFeature.type === 'zkSync' || rollupFeature.type === 'arbitrum'); + const latestBatch = + (hasBatches && rollupFeature.type === 'zkEvm' ? zkEvmLatestBatchQuery.data : null) || + (hasBatches && rollupFeature.type === 'zkSync' ? zkSyncLatestBatchQuery.data : null) || + (hasBatches && rollupFeature.type === 'arbitrum' ? arbitrumLatestBatchQuery.data : null) || 0; + const items: Array = [ - rollupFeature.isEnabled && rollupFeature.type === 'zkEvm' && { - icon: 'txn_batches_slim' as const, - label: 'Latest batch', - value: (zkEvmLatestBatchQuery.data || 0).toLocaleString(), - href: { pathname: '/batches' as const }, - isLoading, - }, - rollupFeature.isEnabled && rollupFeature.type === 'zkSync' && { + hasBatches && { icon: 'txn_batches_slim' as const, label: 'Latest batch', - value: (zkSyncLatestBatchQuery.data || 0).toLocaleString(), + value: latestBatch.toLocaleString(), href: { pathname: '/batches' as const }, isLoading, }, - !(rollupFeature.isEnabled && (rollupFeature.type === 'zkEvm' || rollupFeature.type === 'zkSync')) && { + !hasBatches && { icon: 'block_slim' as const, label: 'Total blocks', value: Number(data.total_blocks).toLocaleString(), diff --git a/ui/home/Transactions.tsx b/ui/home/Transactions.tsx index 8000dc28f7..843c81a575 100644 --- a/ui/home/Transactions.tsx +++ b/ui/home/Transactions.tsx @@ -3,10 +3,13 @@ import React from 'react'; import config from 'configs/app'; import useHasAccount from 'lib/hooks/useHasAccount'; -import LatestDeposits from 'ui/home/LatestDeposits'; +import LatestOptimisticDeposits from 'ui/home/latestDeposits/LatestOptimisticDeposits'; import LatestTxs from 'ui/home/LatestTxs'; import LatestWatchlistTxs from 'ui/home/LatestWatchlistTxs'; import TabsWithScroll from 'ui/shared/Tabs/TabsWithScroll'; + +import LatestArbitrumDeposits from './latestDeposits/LatestArbitrumDeposits'; + const rollupFeature = config.features.rollup; const TAB_LIST_PROPS = { @@ -15,10 +18,13 @@ const TAB_LIST_PROPS = { const TransactionsHome = () => { const hasAccount = useHasAccount(); - if ((rollupFeature.isEnabled && rollupFeature.type === 'optimistic') || hasAccount) { + if ((rollupFeature.isEnabled && (rollupFeature.type === 'optimistic' || rollupFeature.type === 'arbitrum')) || hasAccount) { const tabs = [ { id: 'txn', title: 'Latest txn', component: }, - rollupFeature.isEnabled && rollupFeature.type === 'optimistic' && { id: 'deposits', title: 'Deposits (L1→L2 txn)', component: }, + rollupFeature.isEnabled && rollupFeature.type === 'optimistic' && + { id: 'deposits', title: 'Deposits (L1→L2 txn)', component: }, + rollupFeature.isEnabled && rollupFeature.type === 'arbitrum' && + { id: 'deposits', title: 'Deposits (L1→L2 txn)', component: }, hasAccount && { id: 'watchlist', title: 'Watch list', component: }, ].filter(Boolean); return ( diff --git a/ui/home/__screenshots__/LatestDeposits.pw.tsx_mobile_default-view-mobile-dark-mode-1.png b/ui/home/__screenshots__/LatestDeposits.pw.tsx_mobile_default-view-mobile-dark-mode-1.png deleted file mode 100644 index 5e634c846f0d244ecc78244057500b59be8e91c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21650 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 diff --git a/ui/home/latestBatches/LatestArbitrumL2Batches.pw.tsx b/ui/home/latestBatches/LatestArbitrumL2Batches.pw.tsx new file mode 100644 index 0000000000..373541d1b7 --- /dev/null +++ b/ui/home/latestBatches/LatestArbitrumL2Batches.pw.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { finalized, unfinalized } from 'mocks/arbitrum/txnBatches'; +import { ENVS_MAP } from 'playwright/fixtures/mockEnvs'; +import { test, expect } from 'playwright/lib'; + +import LatestArbitrumL2Batches from './LatestArbitrumL2Batches'; + +test('default view +@mobile +@dark-mode', async({ render, mockEnvs, mockApiResponse }) => { + await mockEnvs(ENVS_MAP.arbitrumRollup); + await mockApiResponse('homepage_arbitrum_l2_batches', { items: [ finalized, unfinalized ] }); + + const component = await render(); + await expect(component).toHaveScreenshot(); +}); diff --git a/ui/home/latestBatches/LatestArbitrumL2Batches.tsx b/ui/home/latestBatches/LatestArbitrumL2Batches.tsx new file mode 100644 index 0000000000..d13a9398f6 --- /dev/null +++ b/ui/home/latestBatches/LatestArbitrumL2Batches.tsx @@ -0,0 +1,92 @@ +import { Box, Heading, Flex, Text, VStack } from '@chakra-ui/react'; +import { useQueryClient } from '@tanstack/react-query'; +import { AnimatePresence } from 'framer-motion'; +import React from 'react'; + +import type { SocketMessage } from 'lib/socket/types'; +import type { ArbitrumL2TxnBatchesItem } from 'types/api/arbitrumL2'; + +import { route } from 'nextjs-routes'; + +import useApiQuery, { getResourceKey } from 'lib/api/useApiQuery'; +import useIsMobile from 'lib/hooks/useIsMobile'; +import useSocketChannel from 'lib/socket/useSocketChannel'; +import useSocketMessage from 'lib/socket/useSocketMessage'; +import { ARBITRUM_L2_TXN_BATCHES_ITEM } from 'stubs/arbitrumL2'; +import LinkInternal from 'ui/shared/links/LinkInternal'; + +import LatestBatchItem from './LatestBatchItem'; + +const LatestArbitrumL2Batches = () => { + const isMobile = useIsMobile(); + const batchesMaxCount = isMobile ? 2 : 5; + const queryClient = useQueryClient(); + + const { data, isPlaceholderData, isError } = useApiQuery('homepage_arbitrum_l2_batches', { + queryOptions: { + placeholderData: { items: Array(batchesMaxCount).fill(ARBITRUM_L2_TXN_BATCHES_ITEM) }, + }, + }); + + const handleNewBatchMessage: SocketMessage.NewArbitrumL2Batch['handler'] = React.useCallback((payload) => { + queryClient.setQueryData(getResourceKey('homepage_arbitrum_l2_batches'), (prevData: { items: Array } | undefined) => { + const newItems = prevData?.items ? [ ...prevData.items ] : []; + + if (newItems.some((batch => batch.number === payload.batch.number))) { + return { items: newItems }; + } + + return { items: [ payload.batch, ...newItems ].sort((b1, b2) => b2.number - b1.number).slice(0, batchesMaxCount) }; + }); + }, [ queryClient, batchesMaxCount ]); + + const channel = useSocketChannel({ + topic: 'arbitrum:new_batch', + isDisabled: isPlaceholderData || isError, + }); + useSocketMessage({ + channel, + event: 'new_arbitrum_batch', + handler: handleNewBatchMessage, + }); + + let content; + + if (isError) { + content = No data. Please reload page.; + } + + if (data) { + const dataToShow = data.items.slice(0, batchesMaxCount); + + content = ( + <> + + + { dataToShow.map(((batch, index) => ( + + ))) } + + + + View all batches + + + ); + } + + return ( + + Latest batches + { content } + + ); +}; + +export default LatestArbitrumL2Batches; diff --git a/ui/home/LatestZkevmL2BatchItem.tsx b/ui/home/latestBatches/LatestBatchItem.tsx similarity index 75% rename from ui/home/LatestZkevmL2BatchItem.tsx rename to ui/home/latestBatches/LatestBatchItem.tsx index 3c6bdfac42..d148d63779 100644 --- a/ui/home/LatestZkevmL2BatchItem.tsx +++ b/ui/home/latestBatches/LatestBatchItem.tsx @@ -6,21 +6,21 @@ import { import { motion } from 'framer-motion'; import React from 'react'; -import type { ZkEvmL2TxnBatchesItem } from 'types/api/zkEvmL2'; - import { route } from 'nextjs-routes'; import BatchEntityL2 from 'ui/shared/entities/block/BatchEntityL2'; import LinkInternal from 'ui/shared/links/LinkInternal'; -import ZkEvmL2TxnBatchStatus from 'ui/shared/statusTag/ZkEvmL2TxnBatchStatus'; import TimeAgoWithTooltip from 'ui/shared/TimeAgoWithTooltip'; type Props = { - batch: ZkEvmL2TxnBatchesItem; - isLoading?: boolean; + number: number; + timestamp: string | null; + txCount: number; + status?: React.ReactNode; + isLoading: boolean; } -const LatestZkevmL2BatchItem = ({ batch, isLoading }: Props) => { +const LatestBatchItem = ({ number, timestamp, txCount, status, isLoading }: Props) => { return ( { { mr="auto" /> { Txn - { batch.tx_count } + { txCount } - + { status } ); }; -export default LatestZkevmL2BatchItem; +export default LatestBatchItem; diff --git a/ui/home/LatestZkEvmL2Batches.pw.tsx b/ui/home/latestBatches/LatestZkEvmL2Batches.pw.tsx similarity index 100% rename from ui/home/LatestZkEvmL2Batches.pw.tsx rename to ui/home/latestBatches/LatestZkEvmL2Batches.pw.tsx diff --git a/ui/home/LatestZkEvmL2Batches.tsx b/ui/home/latestBatches/LatestZkEvmL2Batches.tsx similarity index 79% rename from ui/home/LatestZkEvmL2Batches.tsx rename to ui/home/latestBatches/LatestZkEvmL2Batches.tsx index a9fe76c8a8..21f0910828 100644 --- a/ui/home/LatestZkEvmL2Batches.tsx +++ b/ui/home/latestBatches/LatestZkEvmL2Batches.tsx @@ -14,8 +14,9 @@ import useSocketChannel from 'lib/socket/useSocketChannel'; import useSocketMessage from 'lib/socket/useSocketMessage'; import { ZKEVM_L2_TXN_BATCHES_ITEM } from 'stubs/zkEvmL2'; import LinkInternal from 'ui/shared/links/LinkInternal'; +import ZkEvmL2TxnBatchStatus from 'ui/shared/statusTag/ZkEvmL2TxnBatchStatus'; -import LatestZkevmL2BatchItem from './LatestZkevmL2BatchItem'; +import LatestBatchItem from './LatestBatchItem'; const LatestZkEvmL2Batches = () => { const isMobile = useIsMobile(); @@ -63,13 +64,19 @@ const LatestZkEvmL2Batches = () => { <> - { dataToShow.map(((batch, index) => ( - - ))) } + { dataToShow.map(((batch, index) => { + const status = ; + return ( + + ); + })) } diff --git a/ui/home/latestBatches/__screenshots__/LatestArbitrumL2Batches.pw.tsx_dark-color-mode_default-view-mobile-dark-mode-1.png b/ui/home/latestBatches/__screenshots__/LatestArbitrumL2Batches.pw.tsx_dark-color-mode_default-view-mobile-dark-mode-1.png new file mode 100644 index 0000000000000000000000000000000000000000..2d55f063203f6855c1cbf58353a35e480cb029e5 GIT binary patch literal 15594 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 literal 0 HcmV?d00001 diff --git a/ui/home/latestBatches/__screenshots__/LatestArbitrumL2Batches.pw.tsx_default_default-view-mobile-dark-mode-1.png b/ui/home/latestBatches/__screenshots__/LatestArbitrumL2Batches.pw.tsx_default_default-view-mobile-dark-mode-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d3ce207ef78afe8157b4c4378fb4abed9ef8d413 GIT binary patch literal 15287 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 hMf{&En=5x{LFSif4@*O^z< { + const isMobile = useIsMobile(); + const itemsCount = isMobile ? 2 : 6; + const { data, isPlaceholderData, isError } = useApiQuery('homepage_arbitrum_deposits', { + queryOptions: { + placeholderData: { items: Array(itemsCount).fill(ARBITRUM_MESSAGES_ITEM) }, + }, + }); + + const [ num, setNum ] = useGradualIncrement(0); + const [ socketAlert, setSocketAlert ] = React.useState(''); + + const handleSocketClose = React.useCallback(() => { + setSocketAlert('Connection is lost. Please reload page.'); + }, []); + + const handleSocketError = React.useCallback(() => { + setSocketAlert('An error has occurred while fetching new transactions. Please reload page.'); + }, []); + + const handleNewDepositMessage: SocketMessage.NewArbitrumDeposits['handler'] = React.useCallback((payload) => { + setNum(payload.new_messages_to_rollup_amount); + }, [ setNum ]); + + const channel = useSocketChannel({ + topic: 'arbitrum:new_messages_to_rollup_amount', + onSocketClose: handleSocketClose, + onSocketError: handleSocketError, + isDisabled: false, + }); + + useSocketMessage({ + channel, + event: 'new_messages_to_rollup_amount', + handler: handleNewDepositMessage, + }); + + if (isError) { + return No data. Please reload page.; + } + + if (data) { + return ( + ( + { + l1BlockNumber: item.origination_transaction_block_number, + l1TxHash: item.origination_transaction_hash, + l2TxHash: item.completion_transaction_hash, + timestamp: item.origination_timestamp, + } + )) } + isLoading={ isPlaceholderData } + socketItemsNum={ num } + socketAlert={ socketAlert } + /> + ); + } + + return null; +}; + +export default LatestArbitrumDeposits; diff --git a/ui/home/latestDeposits/LatestDeposits.tsx b/ui/home/latestDeposits/LatestDeposits.tsx new file mode 100644 index 0000000000..0ed6f84a23 --- /dev/null +++ b/ui/home/latestDeposits/LatestDeposits.tsx @@ -0,0 +1,157 @@ +import { + Box, + Flex, + Grid, + Skeleton, +} from '@chakra-ui/react'; +import React from 'react'; + +import { route } from 'nextjs-routes'; + +import useIsMobile from 'lib/hooks/useIsMobile'; +import BlockEntityL1 from 'ui/shared/entities/block/BlockEntityL1'; +import TxEntity from 'ui/shared/entities/tx/TxEntity'; +import TxEntityL1 from 'ui/shared/entities/tx/TxEntityL1'; +import LinkInternal from 'ui/shared/links/LinkInternal'; +import SocketNewItemsNotice from 'ui/shared/SocketNewItemsNotice'; +import TimeAgoWithTooltip from 'ui/shared/TimeAgoWithTooltip'; + +type DepositsItem = { + l1BlockNumber: number; + l1TxHash: string; + l2TxHash: string | null; + timestamp: string | null; +} + +type Props = { + isLoading?: boolean; + items: Array; + socketItemsNum: number; + socketAlert?: string; +} + +type ItemProps = { + item: DepositsItem; + isLoading?: boolean; +} + +const LatestDepositsItem = ({ item, isLoading }: ItemProps) => { + const isMobile = useIsMobile(); + + const l1BlockLink = ( + + ); + + const l1TxLink = ( + + ); + + const l2TxLink = item.l2TxHash ? ( + + ) : null; + + const content = (() => { + if (isMobile) { + return ( + <> + + { l1BlockLink } + + + + + L1 txn + + { l1TxLink } + + L2 txn + + { l2TxLink } + + + ); + } + + return ( + + { l1BlockLink } + + L1 txn + + { l1TxLink } + + + L2 txn + + { l2TxLink } + + ); + })(); + + return ( + + { content } + + ); +}; + +const LatestDeposits = ({ isLoading, items, socketAlert, socketItemsNum }: Props) => { + const depositsUrl = route({ pathname: '/deposits' }); + return ( + <> + + + { items.map(((item, index) => ( + + ))) } + + + View all deposits + + + ); +}; + +export default LatestDeposits; diff --git a/ui/home/LatestDepositsItem.tsx b/ui/home/latestDeposits/LatestDepositsItem.tsx similarity index 82% rename from ui/home/LatestDepositsItem.tsx rename to ui/home/latestDeposits/LatestDepositsItem.tsx index a3b9277235..c6b01abcf1 100644 --- a/ui/home/LatestDepositsItem.tsx +++ b/ui/home/latestDeposits/LatestDepositsItem.tsx @@ -6,32 +6,26 @@ import { } from '@chakra-ui/react'; import React from 'react'; -import type { OptimisticL2DepositsItem } from 'types/api/optimisticL2'; - -import config from 'configs/app'; import useIsMobile from 'lib/hooks/useIsMobile'; import BlockEntityL1 from 'ui/shared/entities/block/BlockEntityL1'; import TxEntity from 'ui/shared/entities/tx/TxEntity'; import TxEntityL1 from 'ui/shared/entities/tx/TxEntityL1'; import TimeAgoWithTooltip from 'ui/shared/TimeAgoWithTooltip'; -const feature = config.features.rollup; - type Props = { - item: OptimisticL2DepositsItem; + l1BlockNumber: number; + l1TxHash: string; + l2TxHash: string | null; + timestamp: string | null; isLoading?: boolean; } -const LatestDepositsItem = ({ item, isLoading }: Props) => { +const LatestDepositsItem = ({ l1BlockNumber, l1TxHash, l2TxHash, timestamp, isLoading }: Props) => { const isMobile = useIsMobile(); - if (!feature.isEnabled || feature.type !== 'optimistic') { - return null; - } - const l1BlockLink = ( { const l1TxLink = ( ); - const l2TxLink = ( + const l2TxLink = l2TxHash ? ( - ); + ) : null; const content = (() => { if (isMobile) { @@ -66,7 +60,7 @@ const LatestDepositsItem = ({ item, isLoading }: Props) => { { l1BlockLink } @@ -93,7 +87,7 @@ const LatestDepositsItem = ({ item, isLoading }: Props) => { { l1TxLink } { await mockEnvs(ENVS_MAP.optimisticRollup); - mockApiResponse('homepage_deposits', depositMock.data.items); - const component = await render(); + mockApiResponse('homepage_optimistic_deposits', depositMock.data.items); + const component = await render(); await expect(component).toHaveScreenshot(); }); diff --git a/ui/home/LatestDeposits.tsx b/ui/home/latestDeposits/LatestOptimisticDeposits.tsx similarity index 56% rename from ui/home/LatestDeposits.tsx rename to ui/home/latestDeposits/LatestOptimisticDeposits.tsx index 89558bad0f..5483700146 100644 --- a/ui/home/LatestDeposits.tsx +++ b/ui/home/latestDeposits/LatestOptimisticDeposits.tsx @@ -1,25 +1,21 @@ -import { Box, Flex, Text } from '@chakra-ui/react'; +import { Text } from '@chakra-ui/react'; import React from 'react'; import type { SocketMessage } from 'lib/socket/types'; -import { route } from 'nextjs-routes'; - import useApiQuery from 'lib/api/useApiQuery'; import useGradualIncrement from 'lib/hooks/useGradualIncrement'; import useIsMobile from 'lib/hooks/useIsMobile'; import useSocketChannel from 'lib/socket/useSocketChannel'; import useSocketMessage from 'lib/socket/useSocketMessage'; import { L2_DEPOSIT_ITEM } from 'stubs/L2'; -import LinkInternal from 'ui/shared/links/LinkInternal'; -import SocketNewItemsNotice from 'ui/shared/SocketNewItemsNotice'; -import LatestDepositsItem from './LatestDepositsItem'; +import LatestDeposits from './LatestDeposits'; -const LatestDeposits = () => { +const LatestOptimisticDeposits = () => { const isMobile = useIsMobile(); const itemsCount = isMobile ? 2 : 6; - const { data, isPlaceholderData, isError } = useApiQuery('homepage_deposits', { + const { data, isPlaceholderData, isError } = useApiQuery('homepage_optimistic_deposits', { queryOptions: { placeholderData: Array(itemsCount).fill(L2_DEPOSIT_ITEM), }, @@ -36,7 +32,7 @@ const LatestDeposits = () => { setSocketAlert('An error has occurred while fetching new transactions. Please reload page.'); }, []); - const handleNewDepositMessage: SocketMessage.NewDeposits['handler'] = React.useCallback((payload) => { + const handleNewDepositMessage: SocketMessage.NewOptimisticDeposits['handler'] = React.useCallback((payload) => { setNum(payload.deposits); }, [ setNum ]); @@ -58,27 +54,19 @@ const LatestDeposits = () => { } if (data) { - const depositsUrl = route({ pathname: '/deposits' }); return ( - <> - - - { data.slice(0, itemsCount).map(((item, index) => ( - - ))) } - - - View all deposits - - + ( + { l1BlockNumber: item.l1_block_number, l1TxHash: item.l1_tx_hash, l2TxHash: item.l2_tx_hash, timestamp: item.l1_block_timestamp } + )) } + isLoading={ isPlaceholderData } + socketItemsNum={ num } + socketAlert={ socketAlert } + /> ); } return null; }; -export default LatestDeposits; +export default LatestOptimisticDeposits; diff --git a/ui/home/__screenshots__/LatestDeposits.pw.tsx_dark-color-mode_default-view-mobile-dark-mode-1.png b/ui/home/latestDeposits/__screenshots__/LatestOptimisticDeposits.pw.tsx_dark-color-mode_default-view-mobile-dark-mode-1.png similarity index 100% rename from ui/home/__screenshots__/LatestDeposits.pw.tsx_dark-color-mode_default-view-mobile-dark-mode-1.png rename to ui/home/latestDeposits/__screenshots__/LatestOptimisticDeposits.pw.tsx_dark-color-mode_default-view-mobile-dark-mode-1.png diff --git a/ui/home/__screenshots__/LatestDeposits.pw.tsx_default_default-view-mobile-dark-mode-1.png b/ui/home/latestDeposits/__screenshots__/LatestOptimisticDeposits.pw.tsx_default_default-view-mobile-dark-mode-1.png similarity index 100% rename from ui/home/__screenshots__/LatestDeposits.pw.tsx_default_default-view-mobile-dark-mode-1.png rename to ui/home/latestDeposits/__screenshots__/LatestOptimisticDeposits.pw.tsx_default_default-view-mobile-dark-mode-1.png diff --git a/ui/home/latestDeposits/__screenshots__/LatestOptimisticDeposits.pw.tsx_mobile_default-view-mobile-dark-mode-1.png b/ui/home/latestDeposits/__screenshots__/LatestOptimisticDeposits.pw.tsx_mobile_default-view-mobile-dark-mode-1.png new file mode 100644 index 0000000000000000000000000000000000000000..588dc52cbb19df281bfb5e2eb3fab61937ff5b88 GIT binary patch literal 21575 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 { { isMobile && } - { rollupFeature.isEnabled && rollupFeature.type === 'zkEvm' ? : } + { rollupFeature.isEnabled && rollupFeature.type === 'zkEvm' && } + { rollupFeature.isEnabled && rollupFeature.type === 'arbitrum' && } + { !(rollupFeature.isEnabled && (rollupFeature.type === 'arbitrum' || rollupFeature.type === 'zkEvm')) && }