From 555748cd59a81ec29e7b6e10ed405772018ddcaf Mon Sep 17 00:00:00 2001 From: isstuev Date: Mon, 27 May 2024 18:33:08 +0200 Subject: [PATCH 1/2] OP Fault Proofs support --- configs/app/features/faultProofSystem.ts | 22 +++++ configs/app/features/index.ts | 1 + configs/envs/.env.optimism_sepolia | 1 + deploy/tools/envs-validator/schema.ts | 10 ++ deploy/tools/envs-validator/test/.env.rollup | 3 +- docs/ENVS.md | 9 ++ icons/games.svg | 8 ++ lib/api/resources.ts | 19 +++- lib/hooks/useNavItems.tsx | 7 ++ lib/metadata/getPageOgType.ts | 1 + lib/metadata/templates/description.ts | 1 + lib/metadata/templates/title.ts | 1 + lib/mixpanel/getPageType.ts | 1 + mocks/l2disputeGames/disputeGames.ts | 26 ++++++ nextjs/getServerSideProps.ts | 10 ++ nextjs/nextjs-routes.d.ts | 1 + pages/dispute-games/index.tsx | 19 ++++ playwright/fixtures/mockEnvs.ts | 1 + public/icons/name.d.ts | 1 + stubs/L2.ts | 11 +++ types/api/optimisticL2.ts | 36 ++++++-- .../OptimisticL2DisputeGamesListItem.tsx | 76 ++++++++++++++++ .../OptimisticL2DisputeGamesTable.tsx | 43 +++++++++ .../OptimisticL2DisputeGamesTableItem.tsx | 61 +++++++++++++ ui/pages/OptimisticL2DisputeGames.pw.tsx | 19 ++++ ui/pages/OptimisticL2DisputeGames.tsx | 86 ++++++++++++++++++ ...ames.pw.tsx_default_base-view-mobile-1.png | Bin 0 -> 39575 bytes ...Games.pw.tsx_mobile_base-view-mobile-1.png | Bin 0 -> 46762 bytes ui/tx/details/TxDetailsWithdrawalStatus.tsx | 39 ++++++-- 29 files changed, 494 insertions(+), 19 deletions(-) create mode 100644 configs/app/features/faultProofSystem.ts create mode 100644 icons/games.svg create mode 100644 mocks/l2disputeGames/disputeGames.ts create mode 100644 pages/dispute-games/index.tsx create mode 100644 ui/disputeGames/optimisticL2/OptimisticL2DisputeGamesListItem.tsx create mode 100644 ui/disputeGames/optimisticL2/OptimisticL2DisputeGamesTable.tsx create mode 100644 ui/disputeGames/optimisticL2/OptimisticL2DisputeGamesTableItem.tsx create mode 100644 ui/pages/OptimisticL2DisputeGames.pw.tsx create mode 100644 ui/pages/OptimisticL2DisputeGames.tsx create mode 100644 ui/pages/__screenshots__/OptimisticL2DisputeGames.pw.tsx_default_base-view-mobile-1.png create mode 100644 ui/pages/__screenshots__/OptimisticL2DisputeGames.pw.tsx_mobile_base-view-mobile-1.png diff --git a/configs/app/features/faultProofSystem.ts b/configs/app/features/faultProofSystem.ts new file mode 100644 index 0000000000..38a8f021db --- /dev/null +++ b/configs/app/features/faultProofSystem.ts @@ -0,0 +1,22 @@ +import type { Feature } from './types'; + +import { getEnvValue } from '../utils'; +import rollup from './rollup'; + +const title = 'Fault proof system'; + +const config: Feature<{ isEnabled: true }> = (() => { + if (rollup.isEnabled && rollup.type === 'optimistic' && getEnvValue('NEXT_PUBLIC_FAULT_PROOF_ENABLED') === 'true') { + return Object.freeze({ + title, + isEnabled: true, + }); + } + + return Object.freeze({ + title, + isEnabled: false, + }); +})(); + +export default config; diff --git a/configs/app/features/index.ts b/configs/app/features/index.ts index 312c38daa0..79e0051141 100644 --- a/configs/app/features/index.ts +++ b/configs/app/features/index.ts @@ -8,6 +8,7 @@ export { default as bridgedTokens } from './bridgedTokens'; export { default as blockchainInteraction } from './blockchainInteraction'; export { default as csvExport } from './csvExport'; export { default as dataAvailability } from './dataAvailability'; +export { default as faultProofSystem } from './faultProofSystem'; export { default as gasTracker } from './gasTracker'; export { default as googleAnalytics } from './googleAnalytics'; export { default as graphqlApiDocs } from './graphqlApiDocs'; diff --git a/configs/envs/.env.optimism_sepolia b/configs/envs/.env.optimism_sepolia index 7bf13dc4a1..e60e578a36 100644 --- a/configs/envs/.env.optimism_sepolia +++ b/configs/envs/.env.optimism_sepolia @@ -61,3 +61,4 @@ NEXT_PUBLIC_VIEWS_CONTRACT_SOLIDITYSCAN_ENABLED=true NEXT_PUBLIC_ROLLUP_TYPE=optimistic NEXT_PUBLIC_ROLLUP_L2_WITHDRAWAL_URL=https://app.optimism.io/bridge/withdraw NEXT_PUBLIC_ROLLUP_L1_BASE_URL=https://eth-sepolia.blockscout.com/ +NEXT_PUBLIC_FAULT_PROOF_ENABLED=true diff --git a/deploy/tools/envs-validator/schema.ts b/deploy/tools/envs-validator/schema.ts index 9f3c7f27e1..8de1031fb7 100644 --- a/deploy/tools/envs-validator/schema.ts +++ b/deploy/tools/envs-validator/schema.ts @@ -629,6 +629,16 @@ const schema = yup NEXT_PUBLIC_GAS_TRACKER_ENABLED: yup.boolean(), NEXT_PUBLIC_GAS_TRACKER_UNITS: yup.array().transform(replaceQuotes).json().of(yup.string().oneOf(GAS_UNITS)), NEXT_PUBLIC_DATA_AVAILABILITY_ENABLED: yup.boolean(), + NEXT_PUBLIC_FAULT_PROOF_ENABLED: yup.boolean() + .when('NEXT_PUBLIC_ROLLUP_TYPE', { + is: 'optimistic', + then: (schema) => schema, + otherwise: (schema) => schema.test( + 'not-exist', + 'NEXT_PUBLIC_FAULT_PROOF_ENABLED can only be used with NEXT_PUBLIC_ROLLUP_TYPE=optimistic', + value => value === undefined, + ), + }), // 6. External services envs NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID: yup.string(), diff --git a/deploy/tools/envs-validator/test/.env.rollup b/deploy/tools/envs-validator/test/.env.rollup index 1cb3e1af88..e7cacfb086 100644 --- a/deploy/tools/envs-validator/test/.env.rollup +++ b/deploy/tools/envs-validator/test/.env.rollup @@ -1,3 +1,4 @@ NEXT_PUBLIC_ROLLUP_TYPE=optimistic NEXT_PUBLIC_ROLLUP_L1_BASE_URL=https://example.com -NEXT_PUBLIC_ROLLUP_L2_WITHDRAWAL_URL=https://example.com \ No newline at end of file +NEXT_PUBLIC_ROLLUP_L2_WITHDRAWAL_URL=https://example.com +NEXT_PUBLIC_FAULT_PROOF_ENABLED=true \ No newline at end of file diff --git a/docs/ENVS.md b/docs/ENVS.md index 7e2a8bd211..1f5eb1784d 100644 --- a/docs/ENVS.md +++ b/docs/ENVS.md @@ -36,6 +36,7 @@ Please be aware that all environment variables prefixed with `NEXT_PUBLIC_` will - [Beacon chain](ENVS.md#beacon-chain) - [User operations](ENVS.md#user-operations-feature-erc-4337) - [Rollup chain](ENVS.md#rollup-chain) + - [Fault proof system](ENVS.md#fault-proof-system) - [Export data to CSV file](ENVS.md#export-data-to-csv-file) - [Google analytics](ENVS.md#google-analytics) - [Mixpanel analytics](ENVS.md#mixpanel-analytics) @@ -401,6 +402,14 @@ This feature is **enabled by default** with the `coinzilla` ads provider. To swi   +### Fault proof system + +| Variable | Type| Description | Compulsoriness | Default value | Example value | +| --- | --- | --- | --- | --- | --- | +| NEXT_PUBLIC_FAULT_PROOF_ENABLED | `boolean` | Set to `true` for chains with fault proof system enabled (OP stack only) | - | - | `true` | + +  + ### Export data to CSV file | Variable | Type| Description | Compulsoriness | Default value | Example value | diff --git a/icons/games.svg b/icons/games.svg new file mode 100644 index 0000000000..39c01ca56d --- /dev/null +++ b/icons/games.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/lib/api/resources.ts b/lib/api/resources.ts index 53f864238d..26686f287c 100644 --- a/lib/api/resources.ts +++ b/lib/api/resources.ts @@ -64,6 +64,7 @@ import type { OptimisticL2OutputRootsResponse, OptimisticL2TxnBatchesResponse, OptimisticL2WithdrawalsResponse, + OptimisticL2DisputeGamesResponse, } from 'types/api/optimisticL2'; import type { RawTracesResponse } from 'types/api/rawTrace'; import type { SearchRedirectResult, SearchResult, SearchResultFilters, SearchResultItem } from 'types/api/search'; @@ -650,6 +651,15 @@ export const RESOURCES = { path: '/api/v2/optimism/txn-batches/count', }, + optimistic_l2_dispute_games: { + path: '/api/v2/optimism/games', + filterFields: [], + }, + + optimistic_l2_dispute_games_count: { + path: '/api/v2/optimism/games/count', + }, + // zkEvm L2 zkevm_l2_deposits: { path: '/api/v2/zkevm/deposits', @@ -853,6 +863,7 @@ export type PaginatedResources = 'blocks' | 'block_txs' | 'token_instance_transfers' | 'token_instance_holders' | 'verified_contracts' | 'optimistic_l2_output_roots' | 'optimistic_l2_withdrawals' | 'optimistic_l2_txn_batches' | 'optimistic_l2_deposits' | +'optimistic_l2_dispute_games' | 'shibarium_deposits' | 'shibarium_withdrawals' | 'zkevm_l2_deposits' | 'zkevm_l2_withdrawals' | 'zkevm_l2_txn_batches' | 'zkevm_l2_txn_batch_txs' | 'zksync_l2_txn_batches' | 'zksync_l2_txn_batch_txs' | @@ -955,13 +966,12 @@ Q extends 'optimistic_l2_output_roots' ? OptimisticL2OutputRootsResponse : Q extends 'optimistic_l2_withdrawals' ? OptimisticL2WithdrawalsResponse : Q extends 'optimistic_l2_deposits' ? OptimisticL2DepositsResponse : Q extends 'optimistic_l2_txn_batches' ? OptimisticL2TxnBatchesResponse : +Q extends 'optimistic_l2_dispute_games' ? OptimisticL2DisputeGamesResponse : Q extends 'optimistic_l2_output_roots_count' ? number : Q extends 'optimistic_l2_withdrawals_count' ? number : Q extends 'optimistic_l2_deposits_count' ? number : Q extends 'optimistic_l2_txn_batches_count' ? number : -Q extends 'config_backend_version' ? BackendVersionConfig : -Q extends 'address_metadata_info' ? AddressMetadataInfo : -Q extends 'address_metadata_tag_types' ? PublicTagTypesResponse : +Q extends 'optimistic_l2_dispute_games_count' ? number : never; // !!! IMPORTANT !!! // See comment above @@ -969,6 +979,9 @@ never; /* eslint-disable @typescript-eslint/indent */ export type ResourcePayloadB = +Q extends 'config_backend_version' ? BackendVersionConfig : +Q extends 'address_metadata_info' ? AddressMetadataInfo : +Q extends 'address_metadata_tag_types' ? PublicTagTypesResponse : Q extends 'blob' ? Blob : Q extends 'marketplace_dapps' ? Array : Q extends 'marketplace_dapp' ? MarketplaceAppOverview : diff --git a/lib/hooks/useNavItems.tsx b/lib/hooks/useNavItems.tsx index 976b19f361..5cfe16094a 100644 --- a/lib/hooks/useNavItems.tsx +++ b/lib/hooks/useNavItems.tsx @@ -96,6 +96,12 @@ export default function useNavItems(): ReturnType { icon: 'output_roots', isActive: pathname === '/output-roots', }; + const rollupDisputeGames = config.features.faultProofSystem.isEnabled ? { + text: 'Dispute games', + nextRoute: { pathname: '/dispute-games' as const }, + icon: 'games', + isActive: pathname === '/dispute-games', + } : null; const rollupFeature = config.features.rollup; @@ -109,6 +115,7 @@ export default function useNavItems(): ReturnType { [ blocks, rollupTxnBatches, + rollupDisputeGames, rollupFeature.type === 'optimistic' ? rollupOutputRoots : undefined, ].filter(Boolean), [ diff --git a/lib/metadata/getPageOgType.ts b/lib/metadata/getPageOgType.ts index d26f4a5814..66319f429e 100644 --- a/lib/metadata/getPageOgType.ts +++ b/lib/metadata/getPageOgType.ts @@ -35,6 +35,7 @@ const OG_TYPE_DICT: Record = { '/csv-export': 'Regular page', '/deposits': 'Root page', '/output-roots': 'Root page', + '/dispute-games': 'Root page', '/batches': 'Root page', '/batches/[number]': 'Regular page', '/blobs/[hash]': 'Regular page', diff --git a/lib/metadata/templates/description.ts b/lib/metadata/templates/description.ts index 80a996eba7..08acaaf1c8 100644 --- a/lib/metadata/templates/description.ts +++ b/lib/metadata/templates/description.ts @@ -39,6 +39,7 @@ const TEMPLATE_MAP: Record = { '/csv-export': DEFAULT_TEMPLATE, '/deposits': DEFAULT_TEMPLATE, '/output-roots': DEFAULT_TEMPLATE, + '/dispute-games': DEFAULT_TEMPLATE, '/batches': DEFAULT_TEMPLATE, '/batches/[number]': DEFAULT_TEMPLATE, '/blobs/[hash]': DEFAULT_TEMPLATE, diff --git a/lib/metadata/templates/title.ts b/lib/metadata/templates/title.ts index 2c02f03d0f..a28c559686 100644 --- a/lib/metadata/templates/title.ts +++ b/lib/metadata/templates/title.ts @@ -33,6 +33,7 @@ const TEMPLATE_MAP: Record = { '/csv-export': 'export data to CSV', '/deposits': 'deposits (L1 > L2)', '/output-roots': 'output roots', + '/dispute-games': 'dispute games', '/batches': 'tx batches (L2 blocks)', '/batches/[number]': 'L2 tx batch %number%', '/blobs/[hash]': 'blob %hash% details', diff --git a/lib/mixpanel/getPageType.ts b/lib/mixpanel/getPageType.ts index e47872ab43..e53554756b 100644 --- a/lib/mixpanel/getPageType.ts +++ b/lib/mixpanel/getPageType.ts @@ -33,6 +33,7 @@ export const PAGE_TYPE_DICT: Record = { '/csv-export': 'Export data to CSV file', '/deposits': 'Deposits (L1 > L2)', '/output-roots': 'Output roots', + '/dispute-games': 'Dispute games', '/batches': 'Tx batches (L2 blocks)', '/batches/[number]': 'L2 tx batch details', '/blobs/[hash]': 'Blob details', diff --git a/mocks/l2disputeGames/disputeGames.ts b/mocks/l2disputeGames/disputeGames.ts new file mode 100644 index 0000000000..f522775cac --- /dev/null +++ b/mocks/l2disputeGames/disputeGames.ts @@ -0,0 +1,26 @@ +export const data = { + items: [ + { + contract_address: '0x5cbe1b88b6357e6a8f0821bea72cc0b88c231f1c', + created_at: '2022-05-27T01:13:48.000000Z', + game_type: 0, + index: 6662, + l2_block_number: 12542890, + resolved_at: null, + status: 'In progress', + }, + { + contract_address: '0x5cbe1b88b6357e6a8f0821bea72cc0b88c231f1c', + created_at: '2022-05-27T01:13:48.000000Z', + game_type: 0, + index: 6662, + l2_block_number: 12542890, + resolved_at: '2022-05-27T01:13:48.000000Z', + status: 'Defender wins', + }, + ], + next_page_params: { + items_count: 50, + index: 8382363, + }, +}; diff --git a/nextjs/getServerSideProps.ts b/nextjs/getServerSideProps.ts index 7a00e59340..844c7ddd35 100644 --- a/nextjs/getServerSideProps.ts +++ b/nextjs/getServerSideProps.ts @@ -251,3 +251,13 @@ export const publicTagsSubmit: GetServerSideProps = async(context) => { return base(context); }; + +export const disputeGames: GetServerSideProps = async(context) => { + if (!config.features.faultProofSystem.isEnabled) { + return { + notFound: true, + }; + } + + return base(context); +}; diff --git a/nextjs/nextjs-routes.d.ts b/nextjs/nextjs-routes.d.ts index 07337c1b06..c8a72eeae1 100644 --- a/nextjs/nextjs-routes.d.ts +++ b/nextjs/nextjs-routes.d.ts @@ -35,6 +35,7 @@ declare module "nextjs-routes" { | StaticRoute<"/contract-verification"> | StaticRoute<"/csv-export"> | StaticRoute<"/deposits"> + | StaticRoute<"/dispute-games"> | StaticRoute<"/gas-tracker"> | StaticRoute<"/graphiql"> | StaticRoute<"/"> diff --git a/pages/dispute-games/index.tsx b/pages/dispute-games/index.tsx new file mode 100644 index 0000000000..fd4c983cc3 --- /dev/null +++ b/pages/dispute-games/index.tsx @@ -0,0 +1,19 @@ +import type { NextPage } from 'next'; +import dynamic from 'next/dynamic'; +import React from 'react'; + +import PageNextJs from 'nextjs/PageNextJs'; + +const DisputeGames = dynamic(() => import('ui/pages/OptimisticL2DisputeGames'), { ssr: false }); + +const Page: NextPage = () => { + return ( + + + + ); +}; + +export default Page; + +export { disputeGames as getServerSideProps } from 'nextjs/getServerSideProps'; diff --git a/playwright/fixtures/mockEnvs.ts b/playwright/fixtures/mockEnvs.ts index cf4763daf0..507581f3d9 100644 --- a/playwright/fixtures/mockEnvs.ts +++ b/playwright/fixtures/mockEnvs.ts @@ -20,6 +20,7 @@ export const ENVS_MAP: Record> = { [ 'NEXT_PUBLIC_ROLLUP_TYPE', 'optimistic' ], [ 'NEXT_PUBLIC_ROLLUP_L1_BASE_URL', 'https://localhost:3101' ], [ 'NEXT_PUBLIC_ROLLUP_L2_WITHDRAWAL_URL', 'https://localhost:3102' ], + [ 'NEXT_PUBLIC_FAULT_PROOF_ENABLED', 'true' ], ], shibariumRollup: [ [ 'NEXT_PUBLIC_ROLLUP_TYPE', 'shibarium' ], diff --git a/public/icons/name.d.ts b/public/icons/name.d.ts index c2ee9b1ff1..0223de9f1d 100644 --- a/public/icons/name.d.ts +++ b/public/icons/name.d.ts @@ -61,6 +61,7 @@ | "filter" | "finalized" | "flame" + | "games" | "gas_xl" | "gas" | "gear_slim" diff --git a/stubs/L2.ts b/stubs/L2.ts index 21346e0ef5..20bb128d90 100644 --- a/stubs/L2.ts +++ b/stubs/L2.ts @@ -1,5 +1,6 @@ import type { OptimisticL2DepositsItem, + OptimisticL2DisputeGamesItem, OptimisticL2OutputRootsItem, OptimisticL2TxnBatchesItem, OptimisticL2WithdrawalsItem, @@ -45,3 +46,13 @@ export const L2_OUTPUT_ROOTS_ITEM: OptimisticL2OutputRootsItem = { l2_output_index: 50655, output_root: TX_HASH, }; + +export const L2_DISPUTE_GAMES_ITEM: OptimisticL2DisputeGamesItem = { + contract_address: ADDRESS_HASH, + created_at: '2023-06-01T15:26:12.000000Z', + game_type: 0, + index: 6594, + l2_block_number: 50655, + resolved_at: null, + status: 'In progress', +}; diff --git a/types/api/optimisticL2.ts b/types/api/optimisticL2.ts index 0d9496d69c..3940715533 100644 --- a/types/api/optimisticL2.ts +++ b/types/api/optimisticL2.ts @@ -61,15 +61,15 @@ export type OptimisticL2WithdrawalsItem = { 'status': string; } -export const WITHDRAWAL_STATUSES = [ - 'Waiting for state root', - 'Ready to prove', - 'In challenge period', - 'Ready for relay', - 'Relayed', -] as const; - -export type OptimisticL2WithdrawalStatus = typeof WITHDRAWAL_STATUSES[number]; +export type OptimisticL2WithdrawalStatus = + 'Waiting for state root' | + 'Ready to prove' | + 'In challenge period' | + 'Waiting a game to resolve' | + 'Ready to prove' | + 'Proven' | + 'Ready for relay' | + 'Relayed'; export type OptimisticL2WithdrawalsResponse = { items: Array; @@ -78,3 +78,21 @@ export type OptimisticL2WithdrawalsResponse = { 'nonce': string; }; } + +export type OptimisticL2DisputeGamesResponse = { + items: Array; + 'next_page_params': { + 'items_count': number; + 'index': number; + }; +} + +export type OptimisticL2DisputeGamesItem = { + contract_address: string; + created_at: string; + game_type: number; + index: number; + l2_block_number: number; + resolved_at: string | null; + status: string; +} diff --git a/ui/disputeGames/optimisticL2/OptimisticL2DisputeGamesListItem.tsx b/ui/disputeGames/optimisticL2/OptimisticL2DisputeGamesListItem.tsx new file mode 100644 index 0000000000..3c6546de3b --- /dev/null +++ b/ui/disputeGames/optimisticL2/OptimisticL2DisputeGamesListItem.tsx @@ -0,0 +1,76 @@ +import { Skeleton } from '@chakra-ui/react'; +import React from 'react'; + +import type { OptimisticL2DisputeGamesItem } from 'types/api/optimisticL2'; + +import config from 'configs/app'; +import dayjs from 'lib/date/dayjs'; +import CopyToClipboard from 'ui/shared/CopyToClipboard'; +import BlockEntityL2 from 'ui/shared/entities/block/BlockEntityL2'; +import HashStringShorten from 'ui/shared/HashStringShorten'; +import ListItemMobileGrid from 'ui/shared/ListItemMobile/ListItemMobileGrid'; + +const rollupFeature = config.features.rollup; + +type Props = { item: OptimisticL2DisputeGamesItem; isLoading?: boolean }; + +const OptimisticL2DisputeGamesListItem = ({ item, isLoading }: Props) => { + if (!rollupFeature.isEnabled || rollupFeature.type !== 'optimistic') { + return null; + } + + return ( + + + Index + + { item.index } + + + Game type + + { item.game_type } + + + Address + + + + + + + + L2 block # + + + + + Age + + { dayjs(item.created_at).fromNow() } + + + Status + + { item.status } + + + { item.resolved_at && ( + <> + Resolution age + { dayjs(item.resolved_at).fromNow() } + + + ) } + + + ); +}; + +export default OptimisticL2DisputeGamesListItem; diff --git a/ui/disputeGames/optimisticL2/OptimisticL2DisputeGamesTable.tsx b/ui/disputeGames/optimisticL2/OptimisticL2DisputeGamesTable.tsx new file mode 100644 index 0000000000..79179c6109 --- /dev/null +++ b/ui/disputeGames/optimisticL2/OptimisticL2DisputeGamesTable.tsx @@ -0,0 +1,43 @@ +import { Table, Tbody, Th, Tr } from '@chakra-ui/react'; +import React from 'react'; + +import type { OptimisticL2DisputeGamesItem } from 'types/api/optimisticL2'; + +import { default as Thead } from 'ui/shared/TheadSticky'; + +import OptimisticL2DisputeGamesTableItem from './OptimisticL2DisputeGamesTableItem'; + +type Props = { + items: Array; + top: number; + isLoading?: boolean; +} + +const OptimisticL2DisputeGamesTable = ({ items, top, isLoading }: Props) => { + return ( + + + + + + + + + + + + + + { items.map((item, index) => ( + + )) } + +
IndexGame typeAddressL2 block #AgeStatusResolution age
+ ); +}; + +export default OptimisticL2DisputeGamesTable; diff --git a/ui/disputeGames/optimisticL2/OptimisticL2DisputeGamesTableItem.tsx b/ui/disputeGames/optimisticL2/OptimisticL2DisputeGamesTableItem.tsx new file mode 100644 index 0000000000..0de2ced695 --- /dev/null +++ b/ui/disputeGames/optimisticL2/OptimisticL2DisputeGamesTableItem.tsx @@ -0,0 +1,61 @@ +import { Flex, Td, Tr, Skeleton } from '@chakra-ui/react'; +import React from 'react'; + +import type { OptimisticL2DisputeGamesItem } from 'types/api/optimisticL2'; + +import config from 'configs/app'; +import dayjs from 'lib/date/dayjs'; +import CopyToClipboard from 'ui/shared/CopyToClipboard'; +import BlockEntityL2 from 'ui/shared/entities/block/BlockEntityL2'; +import HashStringShorten from 'ui/shared/HashStringShorten'; + +const faultProofSystemFeature = config.features.faultProofSystem; + +type Props = { item: OptimisticL2DisputeGamesItem; isLoading?: boolean }; + +const OptimisticL2DisputeGamesTableItem = ({ item, isLoading }: Props) => { + if (!faultProofSystemFeature.isEnabled) { + return null; + } + + return ( + + + { item.index } + + + { item.game_type } + + + + + + + + + + + + + + { dayjs(item.created_at).fromNow() } + + + { item.status } + + + + { item.resolved_at ? dayjs(item.resolved_at).fromNow() : 'N/A' } + + + + ); +}; + +export default OptimisticL2DisputeGamesTableItem; diff --git a/ui/pages/OptimisticL2DisputeGames.pw.tsx b/ui/pages/OptimisticL2DisputeGames.pw.tsx new file mode 100644 index 0000000000..e6f30cb1f6 --- /dev/null +++ b/ui/pages/OptimisticL2DisputeGames.pw.tsx @@ -0,0 +1,19 @@ +import React from 'react'; + +import { data as disputeGamesData } from 'mocks/l2disputeGames/disputeGames'; +import { ENVS_MAP } from 'playwright/fixtures/mockEnvs'; +import { test, expect } from 'playwright/lib'; + +import OptimisticL2DisputeGames from './OptimisticL2DisputeGames'; + +test('base view +@mobile', async({ render, mockEnvs, mockTextAd, mockApiResponse }) => { + test.slow(); + await mockEnvs(ENVS_MAP.optimisticRollup); + await mockTextAd(); + await mockApiResponse('optimistic_l2_dispute_games', disputeGamesData); + await mockApiResponse('optimistic_l2_dispute_games_count', 3971111); + + const component = await render(); + + await expect(component).toHaveScreenshot(); +}); diff --git a/ui/pages/OptimisticL2DisputeGames.tsx b/ui/pages/OptimisticL2DisputeGames.tsx new file mode 100644 index 0000000000..a21f5061e4 --- /dev/null +++ b/ui/pages/OptimisticL2DisputeGames.tsx @@ -0,0 +1,86 @@ +import { Hide, Show, Skeleton, Text } from '@chakra-ui/react'; +import React from 'react'; + +import useApiQuery from 'lib/api/useApiQuery'; +import { L2_DISPUTE_GAMES_ITEM } from 'stubs/L2'; +import { generateListStub } from 'stubs/utils'; +import OptimisticL2DisputeGamesListItem from 'ui/disputeGames/optimisticL2/OptimisticL2DisputeGamesListItem'; +import OptimisticL2DisputeGamesTable from 'ui/disputeGames/optimisticL2/OptimisticL2DisputeGamesTable'; +import { ACTION_BAR_HEIGHT_DESKTOP } from 'ui/shared/ActionBar'; +import DataListDisplay from 'ui/shared/DataListDisplay'; +import PageTitle from 'ui/shared/Page/PageTitle'; +import useQueryWithPages from 'ui/shared/pagination/useQueryWithPages'; +import StickyPaginationWithText from 'ui/shared/StickyPaginationWithText'; + +const OptimisticL2DisputeGames = () => { + const { data, isError, isPlaceholderData, pagination } = useQueryWithPages({ + resourceName: 'optimistic_l2_dispute_games', + options: { + placeholderData: generateListStub<'optimistic_l2_dispute_games'>( + L2_DISPUTE_GAMES_ITEM, + 50, + { + next_page_params: { + items_count: 50, + index: 9045200, + }, + }, + ), + }, + }); + + const countersQuery = useApiQuery('optimistic_l2_dispute_games_count', { + queryOptions: { + placeholderData: 50617, + }, + }); + + const content = data?.items ? ( + <> + + { data.items.map(((item, index) => ( + + ))) } + + + + + + ) : null; + + const text = (() => { + if (countersQuery.isError || isError || !data?.items.length) { + return null; + } + + return ( + + Dispute game index + #{ data.items[0].index } to + #{ data.items[data.items.length - 1].index } + (total of { countersQuery.data?.toLocaleString() } games) + + ); + })(); + + const actionBar = ; + + return ( + <> + + + + ); +}; + +export default OptimisticL2DisputeGames; diff --git a/ui/pages/__screenshots__/OptimisticL2DisputeGames.pw.tsx_default_base-view-mobile-1.png b/ui/pages/__screenshots__/OptimisticL2DisputeGames.pw.tsx_default_base-view-mobile-1.png new file mode 100644 index 0000000000000000000000000000000000000000..474dec34eb9c2bf50030b2a17b4b1cd595a67d79 GIT binary patch literal 39575 zcmd?QWmr{R7dDC_ASEgw4Jy*z4ISvmwctJA9sPFZ=5TI$vU`6IACCU zI9Kapa&R!fa~GNn0|SLcL|$QIcg)wja5-+hM8%;?6A6BEx-*T*!&5Ik zNyKLVq1|sBk>VgibB;C!!d8VS#B1TW%*jQxf?z6*aQSKdZ!o zn^$`7z$~C7F8&-9hkorc5VOuWIy$;Qv-X!_rsQ@e5tjv)mls3bFbTISV;k@4$_nR~ zCAcoR#HI87Szh;Zv?$3RP$-{`jZKBs^lOH}zWNJORWAVnf%E;v!SQ@GWOQ_qOhttv zZ7yCuKDTO5cgYy~r1V>67K>A}fn>e}1HSTjJ=)5?^Zqy%Q%={Tw`#?@WSk$qfB*i> z%E~H7IrlX>K5MEx($O5jR{~<8r90*l0Rk&z4b1p?p-d1?=Rm!d}jN8 zq!7^hw{)4a$soj??&GjMtdXfJOpM7U7QV63B1E|x9u?b2o{IUq{G(sJPg&og`YtOg zD;>xDgWY;&D_TTM4AvGdu#xvNrdWHqd{Dr2VsAQ;)6QpUNuL!Ty|lFS86x7zW{Nkn z#TaE{GUKN}G*nchzF4LZLbf1yq!&j=%R)NI)i(2nz0q`zy9-H$P51Hn%uQ%= z$-D-ChyH{Rv-o-5T&$A3{3@C*m_L4Ux~(*j#M8CX5xhN8Ns}#`GB8?IWj))OJzrPq z1~ai)XpoSWMzgcC1JAZ!`}?XhoMflWqgSNQk&(L_D-R;>*p3m!GiM^yFecj+*qF%@p7nb%t~g*HP`> z-NFVDR2%oGKEB@^AXr{C>Z-=1+a79pV{5DChf!wKLa1gk;5|@V&Nh9Oz{gaYMOlYe zHp1g_Kq!;IM#{^}+jenxdt2rqkblah!_kC*h&YmIsaBy`*s_bI90xNJ*v#Tbh!7Jk z%hyvFTztvJ#qolWvpKcJ*L=2!h)%0A?Ey!x#CEaKWATv7;BTq-^i6H*Oio30T2j-y z3@Em2+(=Ki-IQ}rO1LRWi{+(Fe8@u*Lrn5YYZBx94Mnj))DKTw z1O(%R^ULE^>3CMES;tqeUZD}Ohm4vIe2$X^2it}rz?l7fVA$z!f$#csKmX!cSD&!3 zFr)LHy4Q3ao7${q$(MH^rj4MZ_V;xJ-{as;~p)OW%Pm_$T{lkhil zS1@5w(Ki-xWmz9Wv6Vk6V9D!x3~FEU5Zf})QLFH(-7755?@=P%hjeyx$Hz8r-tszQ zD2XL+-YzOoK72d&#k>2<&cc#z6~~-2UVCq@VTO{&e-$BSfJBa}sk_VJupw>ImnacM ztrE*<@HDdN?hT0LZ|F4JFN>Q7&Rxs|CEWM)&h2P>td(c9mLtwp8FfwEm9TK32ZWnppJc4QAv zPnLez_1SLSLvIX&+|BvEU9KX6h(e9i4ST)I;RI^M{sJ^1p3P#Y%($0ud{MqPh7LZ} zw#kcOC(b0fbPV`?WVZD3_GosUF*dbws!qMLvXfoQRQvZ-v2aeelMmj+yg9QRQZe+I zn&Ww6MLM%fWp{Q7{o`j z$$Z)kt_m^tOMiq|Eye=KW#ThtZM=vheKbtq>#m$ zagc>GG?T3b%_02ba#iWDEHv5kS z8>+II!)(i4)W*`%&;8I;H3_e=O{ZB3k^W>p_o;_25)T0f^0S@sQM!xs^G*=8-wFAZ zK+Y_#&-ZUedR4K)Jr!t`P|R&bQYxwwsdAX_ASe7c^t_+jhD68gt48T;RqL^^6N8ux zRuOho?T56wh9?rS^`QKd5pF2@PwKcrer1oWoMcLIX$m+&C@3g42I71HB(RAK563X> z`E4+LvR-FQA(za$W!MM~1&x^XxzQ@l`03Hn5-7=i17zy6Gk z{kzBIpk8khDmc9G_pkUHTJ_ZG0wMnw9&Gww7x*1qT(XV)U(jk-1OS}UbjmxLr(MhJ zu-Vtr*(q9G@R+TvhJF6D`PuDG(1{-)V843xEiMiZw%Ok{KCTk8&_5ov(VxI#d+*_V zFqf;<=&(6}2CshQCXI5Ei1R5RZRIF}6mG0g3&+UFD2zm4AR=9i1x-JR&pjHOM(y>> zmmf2Ou<>|ZztlZOhytDZ=r*yiqqT0#z5RXjsgiem{11e?YljDiru{1*^7ke1#MrO* ztk?7f=F}WjBlF$N8J>K`*_jM&DOG-Y#v3wS%7f2U5t~5XS7lZ2cN^nYN&2=FvaxF4;|PsJg`5D$s(DQ z1?U-MFx%;1j!QIzu>0J479c^HYODR3N-MehyRl>FMM+ti;YE?o<<%9F{TSsu8c@jj*v&n?73v#W%987h{#CGNv^rHG-uG8X065^Ynl(3n zgD)SJx`7N7+t6kx7 zjCSuQi*(YpYwZE9jPye%*vafZxb4dum>y@~(W`<1$zwX?2M4G$lqQ7t32K34M-T@=IV#@#sx*0;h;s(ok=Ohrpg zI)vpO9kwLFI=@MjE>Wl`y`}9R!tIc0W!f819eWECvEd8K$SNmd5y;1G$nf6HCwjRA!_qVO%^v!R42& zW28)lg@tGIYf2T?v(cTQ1iSal39fvVkh2{ot1WqGssswKSVRo`?=dkkHX4qOtTz|? zy$aK)KC1b~YI$FS9$oRHgvI#$94*BS2CQfo&rs2a92yAO>N z<^Mr1*dR?LN)UH0Hh1~^bw6pXvhiS^v9W9VsY7!K#Y>CI8MKFy0ohX92QQG& zWXrQ;;`puc&vqv_XS*XoN}{2VP5!)=qwt$bC%${pt9MHwJs>b}x%UY?fYpLU=NKP1 z2a>jj(~;mt8*jp<%S}yVZLUM`tY#YGT;e%QuPe+?4=2M%v*lP|H-`?;eV?PU9ZXO{ z0f5NJ#BS2F){TbG8Xy(J00Pdfc8v9TB9|)!!t6Q2%73%R5_Wfn^N2{GO}2~tkLw!+ z>pP!!admg6ND{~;j*pBoAI%=kQ6M#uP627lDHga74!yQ(gg5)9sk0NiKqMDsuy>3H>+eGW0;bX((ORfD4o>RgLa<5h?kdFY<#?8wT%w+3(*t!%Th05T`b9f+Z4a#`T@-HE|Aw~cd;+o#(yM|1H_ckO~o`yD1E z;Fg}yEK0)*P@U^M|9sRlI##&W9DYY|WK5t|m0Z)6L5J7%(kG>3#B$h9)AhH(iWnYJ zv0}n?@8YT1LF+||`w1tnA3%nN-3z;D`|`f#^E)SuwDHISNt2n2cI0162?mDibTz#8 z4u#Tp$nY9>(7K9Ec;%dv-SwYL&CI-h`IB{lIUA;>T&StSA=bG+TOG&Y?Nuk9QCZ2h zxbcNJRTm2R(_?s;r%Vkw-THH}Ru4{RG*>B`(3+x2r`{{+NEyafX){he`cVR95fS}V zH$}jEAvJYqn>8}zVsDtV*E35se|x%|0#p|sxo%k?AAba;C$ndh=-Cb@C+B0ZpD!b~ zg+`e}!2W`2bE@8@*k&3;H!9VF*aIgol1Lx!f3Sf#9{=;9R6+Q8nUKp%SJ`Cl4xavm z-I4nWb4<;`H(CS)Ubn|$l2Ozhts=pv5DEB1ajz4**(z&1c1Oy`I-+MRmltvxFf=4D z`I}M@xKOR@@~67`2|s!HS1J0P3($w7^(y=tm7w){orK-~c_W;Ppo+w)tZ?lK1i|LCTKavH5{ z*(68n?)mwo%Nov!0-fF|CL{S=po97PQNFV)*eR93-6`go(tLY=-)w*UvB62L zCNN)O|L-LRtD+!Cp>Ye8=a>Jv;U}fSfRl9hWnf}@C8FR+DkR=$mlVSe-s@X^J&%{^ z;10w)QNTMHV0XKN+u-1maxbr%`g$W9o1$tj-7q7YjX}3K>x!J{LirgjdVyl4wMrFF_-f`T|k^V z*k%0nZ(5rHKcVVCsi73pYl#d$-QX}-m^+@RW8W=4Z{>Yq-f)Hq72L{7Wr(IrSZEvm zvMy7un2uFLG_rus+jj~r;+cjm1Kw9@l{9x+D)6aZnsX6-|Gg)0Ag3MNuj|t(Jz&Wo&Hh1f{2w zhLZ^Rtzp!+I&Yp^LnlG(>9JG3TyFFCv)&ybntuoj3#%dHXe<~jP$1R$nv)8XF0`61 zo6e$A$_mldrP9;Z$dsd_r40$frU5bLf{7}?LHGH)pkKe2eO2<5Te_*XyZjUKY1E2! zR=0-JAx{cu)QaGaOwvW`23Ic@y#;jO@*THF01Au&u&dPi#(8dT?h)xNgg467JFkxx z={TsFAtZNwbX4Xwmduk-&ZSaeP7deEb$hK!sKioI6@>K5doxEFz-dOS5=;^=ND@nz zc4^fJZbj~Nxru?Xag@zf{Ow*hrff2AU>YT__x)UIaP~$w4nrK5 zB z(tk>>dS0L==W_qqrF0{i{DFgj&G3A0nli|6=t|?Ilk6W!diNbv)2{$yg1YDp)Ofbq z`mt)4vu^F0O+Y8$NTWn~fEl#JA#)F(4y3KkZSf#PGYN)MZO>R7IXHi%W-~Qx zrhD74=IQgSq{X!Qt*qNnj*BN$-bd2*H;o; zi;Ito)2K2Z5nUf-IcK{h|Q-1yh>f~Ka_=YRTXRoe{L$q>xje`PTpcnQk!1pg1~ zVKtHI>Ga`a581dZ5Y|P{3!?icPiS=;aDRC_I9@No^Y^y288N3TQsspOb@!&M74JH{<1ORB509di}A8sF-ktcC+7 zC$Y!U^U;I^Y>D$H3zm10G3BukY;A3?&-N{c`fEcnphhY7LK+HK^ISuG!7z$)Em;KFlHncn7j~tKkZ=7{=j`cybQQ?lPMVn-J^+!Ho+4qCM z8AJBYL}70yI>A(vw*V3b(aOnsFJyS#a|I8b=nD-j!Hj*o!X+nrFHJ}MF`nC8UB$_RkGJ%jUj$I@93J0gFTPfSM zUV}ya#it+s{+L*V1yYgMfn`*As)apuPP;WuyKeyJx?a561!#CQ%gMrY;MSLGEB;oR zs&4|v@)UkGF<83Z^kd)sAsywdT`O}xR^_kJ`0WH7)rL~q;v_PEn5&fa^XJdzO3O+0Di1EBu27@9Iw!QY_V9Y6oRpN9_{G_IV`#Yz;;_WY&Ak%qG3;?$+ypGPtF`sLoVCvyaq7Up04Nyk zu6nTNUrNi#$pPMZsJ&D1&nE=n2~pV)yfn&6g$$@5@nhyxb5CG)V@5_s)`mi&KtyA< znd6)&)Je#`mT;%R-!J@~gaDWbyCuW7x+;VtP!h~+FIZG+x};_Gtwuz}#^U-`#U+gy!);9#lbnr6%f=81rPn$;JJ&Jw zhx_=*V|AqJ%c$N|zdfO~LU58kf&IfFyf?l~1}m*;(eOKgp+)@Xudm z64>oPC;?P-O8%cI3nxM$znJB@D+*TkQCuv9bYUc{PbG{}A7s-z4{b@`(4iT(af^kF zADb!I-B~=tM&g9W_a(RE_+DPl0#^PE31J((w!sZXj;v`N4Kx1DpqKoMOsdTC!Up>G zCny#V51V%R+Q|!l2lpXi5N|a;+}~a3L0PG~Sj)Nce0+RByCoIoPqIVg-!#gbTW2$0 zcU$W1-8fje3h1})Uu0KjlX`e;7QYwVAE|}eMj~J@^P#=Bd2*@;3(#Ib?Ok22hJ$i1 z3xF|?sa(uO>GD?98uFl52AqTg}FD7`rZRTns_OBvWru4iOYVD2ZchkkfVXA7ukXrFJwh$<{+-<(X5D_*jjH3vpg z)H-a2+2oX|-Cf__Ha)z;!;3Sv{W(Y66@pdCPQ6cOn=(mtGP7_nSKIcuxV1<*MzA;# zxIK>UZ=|o!wG54nm^e6M&ZAL93ZYJxnsM7&48s%Ugq1W~dg(>{Um{`EDU6xZ41hF)^!W6Wht^3cac z({WHom36kvgfy3!&A36I59oTnl=WeMwYqlfyP!f;TeGASGM?9fP*R~uCty93QC%SM zMvj6}`H`#{$v~EgXBA8zE&QvWXz}+uc>OPs0Do;5#4V9e_SY$8`g9*>o z4M-ZusHpC_Zf~k$?4(a1|FGVv!)A^cu%qK+2^aYEZ{ZlTE_+L-+oSF6?fM1=f-&?u zoPZex9NFpCG^T@t11%jL6B`>DJ${T#m;)WUwQrACE@qBnNS zam|(3k%G$z1-uf0^KO=$Qjg&tXT?OT(6HW?72=XKm_EzP#*I^FHlAQx)CVG1z8-UNya* zuQ~|1A%skiJ<3s5L+sm`BN+Oj~ud)x?vFdEIVSvDb9@bKaDMu~18= zhg;nQzgaO?U$_e&)I~3xb5}_Is|Bc(6p7T#Jn|;&xJ`N(sS%};4jl~_&)2JbrdR1? z)KcV~t24~swxCy=soJu1J|5Sw{vJ6HC0T{=`E$h>?mKYe}gh_9^!ibC}59aG8o%nb!L5MmViH(aJ25jqNL$qJ3`t4P> z^|S^Q!dBk+z&~p64Rl>q@>RF#q=>rdw%0OH^^I{}_71{HS6YmplCv(>yD+49oJd4R z_JBP<5Rqe!3Szjv;K;$50DyicdFNS){kr5EdhOV4CC}HGm>Ph}lNu~9S>I%$`ukW` zp=e3!qof+x%TrY%Ha1!qrB)GX?;pULIOG4%Oyw~D$rm7oo1vMt*UXo0fmxR&2aG z*8-vA_~djg{|S67uW=B4l1iyzj&k19xYj>_>!H;t`<}vXZ3y}fpnI?c$QoZn^jLoD z_ywJ#$CRV3qjTjv@?pYusu?s=N=iyn4ch!pcV{_z&&p`DRKZ62=EmVAaM(^H2^==w z6t!S*Uz)54gHBs_o=QF?AUq-)ulyjnGphe_q8u-Ba&p8Jf^^Za_Htc5=YyFJP(Kfw zvHqq~@&nZv%phAfHog&eB4L(2A`N6XbuBF=1{K@)m6|fpIw!8(O|ekg zd4-?(+ZdUfNQZI+l^d9m@=_Zw-ZX@oa!E^vsNdf>dEM{QvqzIVp1S!8?lT|Wj%JIf z&@Z4HweOT$5zT*?UH0cX_VVRmWKk&J2~Q}P^7dU(&GHz_dGD#EJf2xv#V8oX+Y~J+ zk?fIUZm;GA_aDUw%V_BLA3sVj{Yf|-w|?5h1qLGbM$?bGLkODxDx@F5V53mkyY^U2 z3OQ!4+e;jT@~Vw467LM{`0lg!q@>#u(0UtYYrx%m$*?rMb-Mb8#cuIMG%!pPKvYg2 zW;7ijya)aA>b`-2Fd2cnj9_`&nTkN{Za#fDZEfvX9#h#miJdmm_qg1Sl%OFzu9Z9- zX{T9XCE?-GK;N|98=WZy|7e!c40=WGI{B(}S+a4z44OX!Fb$Dw&sRuC3`Y0(lq{P5 zM{2SN(o+4{1Twrla&)0sSzUcBfQ(^gYNee(NN-k0KZxKXh=bIx$duw z*)b5y1b@gHUf*AA^eg4D!U(v<#5ssNl{-lcS!SB(i-&y;jxo$#wh$}C&x(x|`ICb= z#9O_wmg}09EH+Z@&u7cdC}^D_5R;x;s3)56>K{E(?Qa8&g4iuHXtD~3CxC7u=7Y3% zG(BtptxVlV>7WQwu`EJ2ZPQ&R&>NU7HuBM{!A3_)|zxLs_(_sVb#V&`{P`|em z2!Pk;yJCQg`(kG&h@cI14t;Ej`t=!ib$3ft&jZ&evjbe)&O`?*S93HoZ6N@E_A8fm zMIak|xH#GwE~hxGvP~H~8=p%AP1;M?puicq7Yj49Ve{7~h*3Y*lKFum$xu4aCK2fc z;nL1{{v$BAP>DP^m&9&rG8>|3;94hK^O^x(3$TBoo!vV+<75&4oj->=h>u zrIFn-B0adFI9e(V%6ZPCOgS}0K2jVLZ=oW?#KH0@le!M${XaYEs`GgYo`!;!miDpi z4<+CjIJzr<=tmGf$7O>!)@5TEclL|`z#E;h3yH0}1rb~%efZ16y{GTVEr5Q^gkqpi zt=lL^?4C%(!omXWUSQcdD>oZ{e{VZmB@GjY$^wm$kUu($s|{V0WJka&QnS&zO2KU< zt#W6&-N|AO%EJ77nod#Cx{tCm_Suh(a{_iNM#@1zni<;I41n^4rLUawwD~HUye%t8;6a)Kc9Y}OlQ&Q9T9}xKc5~P?xpI682N-HmG?L`)4`0Bc znr!`i2U&F+Wd^qaS`N@X=b1fm*`J95+hLLrwzi-t6+`<6#K-BZ%JOofp5IipD7sHh zFK-=0!wBPy`6QB4y#b@6uC8g4U^+<5hs$LsT(_KH&USQcFt9hh?Pu~vMRUe2#&Q($$8uEiGP)^G>{gurQL;sFfx1Ku$k)`><T65wJ5a(1xmrt`?pHv|3j`ogAOXHJ8*pr_N5_AFJZ&0LLvd<) zn#p>G6%?hHo{RiNx==|oGfIofcp#E@Wd%HUs>dxhP&Dzq^ z0@#n`wXJ~c7@R|=J@KoP_1Z7XpQ?<@s;f<}%8UW``2z&BlSgs|*)>NHfBN(ZR71_3oqnJUUf$i6>U~28`m4-lO`o#>v*_vuDRY>lmrdc9`S=kI zbkjk3tvKHw3R36N!9j94?`%cO=xF3VkMoy}K0IPxSGcdfzVN_6vVqVG5{cP}aLR1-_djC0;VgnrmwCP0j4ToEphYo;{;r~=M1Rn>3EMg1f090YmK>yLS5Naw z&G`q5O8hA5-9Imb(w0&zR?dK)4cqMM-><&=@b!%34JM{g{rNtSK0Rv&eEg&J)DD2A zYhXaY5VXjsc~0+t;zzfLU5UAl{6UbW07J5^tJmNf0o-ZpsiyfOV_pl}*rv0b&Qtjo zqx7$y^1*rpepjGqHaq16@W8ve4~H>&k7^EJlv#$El2bENN3^_&<)(vWz^+*FL+P#S ztE}w`RSSPg(*Jj*0S_q1`gdJmd%|`3+{-M^EauBV=S#iOP$YV{wzl?oTul%9{q?^h z%atZszn3Wdcc)6^vaw)eeFe7x38=F%nBWg6#cwe(|E}&6L?0Or$Pj{xix~h2Ty5`; zoU3z-q%bgO@9Z=L)l3|-agI_wJDpZl1~}*+I@n2IutXG4>i^Yjg4KQ&1<(EW z8~^X5qpbhmRj2>Ix^%Ub{_B7D{8$gWP-00#nK1qtUForAMWCbsPPe|O1@;EHXlxv= z!dwrQRJjj26V_=X_0}~dim>H7{#O+!YZno!PeiF16~1LMSP85TCM{9g z2n4<5<>uFeRadh9u{S56jw##VOX0}TX^}njj7p;{mfijD!{6z`2L^rmTdtlg+_~ZY zHk~o&>udH6&YAf1fz7`X27CFpMREmi(q5lrnjzAdplyh{4N~yGi}+DrTz0-hr>pu* zqR=O~Uk7)n6B~0iqs8}i^Xvb*nr_*wU_^U6nFwo;R=lB+xzCR{CUVi@0cnBb8DT?K zWMSbh7%le;I8-Ggu)u-I{e}Wh75OtaVhpChE9Jk0Wvr4rp;0&_gWRpy52kPxFlsRv zxAB)^GdW~}@>{CUWkb)=aSr{CyE;C4!QA0K%51J!;T^vbhm-oRXSmjaPVN!s`!_}) zn3B;_nb;^!iS(4`#JUpm29m#HdPPCtkQk)3Ce`?(viKyQzZCgpX8*;?x;PUlPab7-6xlI+|00Y2psL*9rq-OpVa^HMjEYYEAnveH04iIPH&BAOl*9TqVP~& zzRB!%@cIEQKHbHPSv^bFJ4sa2=$6r7C#erk`$(Z@%1g}!#4%-SO8pUG{I;o-CF@gs z|A(tG1e5dUN`-~4?+(ML3x7j0$5H zV1)D!sGn1J)`Q`{aH#)JmfkKE8Ow_o5uvFvB|`O*yi>x!?|XX#Qi<+fek-cZS|+~; zrB_sbS^I}UBNJ-{SH7i0tNwRx&$FKafWa`|!$xpbqqW#d@AuLTWCP!rL!LzLeYGi( ze?S%RhOo_25wjJtcP9}{&81DUJ37*!#hyqgwRE5xtefJJY2bTZcX10(e55eRf9qt% zAu9S~GW4+NL({oik6ok30pvK z`+N1+gw=y(!SF$WuIXtmon(ZF^V=(!)l^Lc0f!9$v-I@zj#q1#fbWBOrhMLXS~ML@ z5o7UQR*Ytdi|OV2?R`=&V>Ne*Dy3GiKAf%(KJA^AAux@lCnxtq2v#fc+$8q#@wKzJ z&wwEj;j*SOWMyeA&R@FiI;$4Xw-;);l$2B~B~>pP_Wf=7?Px!iNu^b)nzbv?;I47; zklFjd=(zT*NT(@ooBuDhjLo8Z5`Zs5*=ihF1F^ja)(I%}oR1Fd+OKo$9lvb<9}jtn z|EHx-I5g^Nmy7qfY3sOLy>ZqfEVx>Ti??3L04H01`>gred|uJ{eo^%PaI;dHP~a&x zHMh%lN4S*Q?jsMeyr)fkCbieHUG% zy6c6noZIzj9R2*j!))xq;a%81r5e5YNk>hMt4W`xc>P74p@~WSa#fjR7X~8C2^#(_`Dt=sBC z1z5aRTmWiYTHh9wpb)FFQct!;cscE^a^WT~{}QM>Piz~Wd<5F6N1n@aMmc5!R5Mmr zSEhtSL{|pKhJ-|skO*4!nx86tjhYeA*DK?Fwb!S)$VfL^QrlBo?Y zXH!AUR!2sgQ0#%byP3fq{>ya;Nz-keFB{DpLkq)S%U=cxM%K=ulPcSaWVzb4?|Gc} zGfkW(Tj|3dvz)F&rzrJ&!$+=6%A@!@w83b0g=H^stYJH3^@Ju(IWJxa)z9UmIV!c* zpwUSm)Ot>?6Tft9pe`P|@W(8`-wHP7=dE}8qpOS@Z;T)=wfaEn|lni*<(y<)qE+~1j$iXikRb->6pX&v$A8%rcoWZ z@w`dg$r<$1o(u0;m(dClG3t7^;k-Msy{o&gg4lZHUMy#eR)S=ckkbbX;W~SO@>y(` z72_L5zx5O)kDb|cP8DYZ!1<{-1m~ggQ~o)LLU$$cq0@bcKL*J$c$#beRlTw^Y^6;O zV!!wxnB0?CXGQg}*ys==C-C4yJ-(~d27O1`=^>;%<^VmLu$lVg+gX^qrWtO-*SNM_ zeuM@a%;PmMkjq_O_<6WVJ3<#6E|+Q$$&NzG9m8!@mEz0<(dNZ&Q>{l zJwuzpe>`r@N#J;QI5Mp|G}|p$@ix{sG^6S#2X}qcr~u>kwa;6AuFf;&^75Hxr7O?8 z`~FNr+k&UJiROJ_)4>ON`Y<`}CXA0@#E7%TTPsV5uv`lGYnkG2fynafWT|5l-|Ney z`q*@C)JG(|R$alDU34k1F8k$!pq$Yq#}Zz6n-N@qlz98Yu|p9e@9N@L(>c_@PngAI zf(bbUS-1qn>p>4nt?8>Mh5T+&vDB`{dVOeJ+KBfky+1E@hiX)}Tj@oMJcjG=53d?p z)^FstE4RMee7bC4G?Uf@P@NO9_qlHURYZj2!3Y7Uf>jyx{<=hVIqaNriH4^XNTpMv zKyNUzgl;CR)XSgQ7T2Bb@dQL7%DT=r9d3pYo@2vVs?l$3hSE44-kt2qBBB$B`JWeR zG+iUbv$;ij!TUK}ZXMIY=1R7`Jy_hxQ@l>z?W#Qlq#Gf3%8iiJvAAAxzG2YlKsu~6 zx{D`?W3=J)Cg$%PiqPB5BzWj|@fa>f5}>_IURrutcY)tLhaiP30HH+P@DOYE{pc4O z|8tW$o6YsoHNNqT9Nf3L`HAOLqXWZg)0OPSef(KMrp)pb+)tnW4DTfQ%)xNJ5^`43b46f zuIxuVcpqtHPylT{K-6jnrv<18nC`8|b3 z%wbX&77X+X-1D|l%wMl)HxlMY)9Wu3EHA^ zuYdVcncq3Bpt&4grH^MlD9U5~FwUPCEwnT(D4=~;tCn3DDidwo`^ncjd-4}F4w!od(t#5n zzC73|k9bT~y{U6bvZ7=3M({6=AZ)0+;G}XjHZ>N-bMI}XR}8}=fX>XXXE~k?A(UR< ze|ak7v5+inE>BX#(Gx|+`~JO7xX&(!4JPrcmNDC||%8{QPzYXEv3} z|1MleObVa^9n&VoOtSS z0{ZjtfTiqyt*a*M`X{c$M4>V#ZogK-;r)*oj5`6MzTFaA z`D^+I>Ep*suT2`(k}R>)PS8!Xj6IwySFv zvlwy!^qY3eE5_${c0Yl;`=n7mioQqO#@v{&dfow{qT&x6Oq&=->Th5+lbM-%(s&?1 zE)TiniN$1|thP4q@~eos1}FcLl5AF+3<0cs5m*+a7@aO$GSl#S40&&%Jf#udZx!U9 zaGs_ZYdrYdJ1V{Vjy2fD;bPaqf-X+LlYsDWq~@NUpcHnS&z+~+R_aa3i2VF!m6`xX zX)T#61qTG^k8KTq_wyUckiZ08ok(jwrFsDMfokq#n}TGAj)R?j1WohFO$>LD=GSiJStkRt zw#VzK3N;fpUoR5qY8@{4Bb)Hxzt(D8li*6J7G$p0TT`lxP{|q7QHtELOb;D$0sdIr zDeRvNh=qko%C;`0zI|uhF{WOK11eh^bIDJJ??FxX+~aj9yF$yv2v+6w_`xx0P}VJX zG1|^Ir$a9|XXlPl^uW@}(&fpNNk+>BjMFWamk2*hWblvArk0hz&=*UoRfXKg_P>5{ z4$dc#ccu~J_m^d~9~!|K*nGr@X~ zfvq0lFL$&I#?$VvL1}AseRxa~EPa0|YY8O{(~3+#)|Op6Ier-m@7c`Y9iPt|$tYz& zdO>VFpGQ)b`1R&-sJCyrT>FY*`_pZLL?j%i*KN(gnL82B%E3WcR1}!Ld3Aa)Pv8K{ z2(|??DxfDm2y|GEZ6o3@3b2G{uz(f^jetK9Q0^w6tWUg4p|*K5yd`4GnUHB9PSv?bBcld%a_5)?El1eg%*Fa8qD4n#Tny6qBPP zJHmS-F~4m(I=WaE2j<8|Vv(ivw~|rztrMMoY`YvvY2V?qvaTZ)b#HG_Ob3!pXV#8u zsTX^Xs6EIDPWW(M#bF6cadrJ?FgYkf^G9LkvYh+C)<|Imlx!lJT)3kh6OTY{$^pHj za0RxG>?a}uhUn(p2}N8T33n){w|}UJlixaiyTf^Uob!1wkvL8ucm5?JLW%QTRd_Z2 zmC0ptf~ATogVsk6kEZ~F_PMZZ4nrs5!icB9u=<;G>B9r>zpL_~p+}|KhoW-QA-c05 zX4lOpSY~J%`{*AJxB7z~1 z&It9#vt8NjDC>j=C5q#z;$dNZ0u>bW;wcG&fsIMDLCI=U*`VUn7vVxF^5dEI(dG{I z3`%QaJOh?^%&&=v+S;1MYLs(-A3&=USPfUR^uUztIKnF>VG%ylwk!mC3bp@g0rbo! zH;8&-Xr$P7abN*N0(S9r-9orZT4f&SwruAe{goDBJ(tW-l$35n&p|%qwwbzEG!iUO z#|TGc%P2n&4{H<8OasT5iS=U_gESx@%wPH9C5%x&Ph370tyGz^K! zM)HI>ub%JM1M+xhWPd*UK{#8dX}>MIk%Br(630q{ulDQ;HRhD#HzDP47K(kXa;|XT z>leJPmjT?BmRt8BA!8rN$xXOlfdVqBw2D6ZAW#SCMdNeaXU}*)@biE3^5mb~MbO`B zhsAY+6D=p=sbATSi;04&=e3yz9GU_k08)LUUB4Bm3SS4NkaMu?HrqOV| z+LFtz4Yl|dXe2o%qY-lc6hgw-*-(T4Wh7iQy-prM>l>hz1Znum(WwWMa#`w#pT9qg z;}jz}W8Z`X0+uYfuGW=~_8)OQOAQ6uxlchAW73xOuuV2@Q3)Q!9^Y`b;SEWNqR~RM z+%l)j1!|ZzoODEbqcQsj8kY|)x*ls=}s2+h{Om>g{rdMIsISN`^Q0rAKGTyeo z`;+*f4IQ|L_rE&2b2*E?LE_aPJVe@BynzwM92-;bq;&gv4eHd}1@G95pC}VQRu=&= zf`vX^%cZ=ouVt1Z&4~R(B7epP{MZgAu*(v)Sb1IXj4$*Z{kucCa2i^RN)*#<41mT+&8;&G57xR6>AufwOBk0K*ToB(iOLd^wrYh#DH`)^c@R1?Aj}N+KoneH1 zTgQDP@PU zuqh?wGy}246r;N^IVKjC^+8{;=~7GEWM^la-b5uJ#6ZKF3h!R*@9fONJ#ex(zPb0E zYa;oXe`0li^>BG}f_;DMNwD4(>lxE*^@0zSYCSlvD10 z%pK7D=^#OR@nz@KoPU2Jv?q$%?q+}pw8X&3VWvy5E<&>NR*AtJG=Wv40u0vzB$%nz zX&dPe%ZwU!%T>&cz3x|soRRoQW~O;2M1vBvV7?>{RIX)T4o=Zv*Ts7*QIaA$;WLSx zZqeZa9!%ky0K|y`{RGcI?{S~>I_P38R*?}2>O%;AThgE6`HBAD5_3c&u3rK zER?LPJt~WIPCzKk@g^s@=5x8~X<|L?zx)3CA6A|rSTeJ9x)c}Gu&!^2{836u88a*9 zg9%2A32Bib_(JL#h^R`W(xH0ux*MY1f(7pH6xz*U=UBW3HU0*}W3HSkTU(b6FAf$hY?`LiXo0)30<3f9qsWNnUbuj` zT;#cVe51(;Cj|0*&rAg&ird;fm)ln*gb7s#-;NC&qsgx?b_1zZDoQ?I;nQkfQ{(~Jm>i<#ccyfI9QPrkCc+m^PHY95Fpgvj^44N& z8V>=d_xuD*FJ1>egFx!0%IvVcl9_PyJh+gruOVjhBLo662|fx&|)Rzpg#D z-ahyF8kIjux*Sdh+U^J&eYdaX-7)AD+>!<4+KbD*x&j6Tz9kj1!Rep=9RyTwQ!Kv` z{hK?5OPtG_i$ft98FWyXoEXD_)_L?NZYL)vAdo|Su$uYa=8v&@`vVnp*gqk8d!rF? zV}Vgp?BsKmw}@~>fD^msqu+6uZqy;LnkjkRghbm`60w?^`zO#umw2jrm*mR*@=v2F z+z`}KtS`B~M0>HfwThv5x29sVoHO`7_J_cvRdbk*`>}g7vzdiOYh?r~`@icW(hySJ!O|9tajRxI=(If&xx9V2E*HvA8DwPW7guTyRd#<(S9CM7ZePT&3cA=zDQ0UZ};R>eA zy=+1W@J35;yTcy@^`0acf0a4!GYrQ66$%=N<{zmMh&t}m->aLcb^7kV*t(#`A9d3N zd{D?~q-|sf>CD~bcB`r;^(?Y=HayO&*yN@)D|#=E3GCTk9+(mYis!|f524uDX^+Xc zs)*R~+0b6OfBIg|gD49)gd?d>E9eLfcADn~o6B%#)1>0oF?~U))&ooljNkH4PH$eH@Qu?5$&i9w_BSggXWvd zx0;Q1*z3&%P)KL-fr0hDbuEmd;g(5?k0BUi4bn0)xR~8PI!TdY3mJ)fX)-V$BBY%JL8aa6QMb zP}tZu`oHu>^rz-&SLc-Hr6&S`Yc}g-zlVALiFVYc(;JB5re4@Dd2@x1RK(=0FJxq# zNZtOF2hB>-$<4iyF?H@HT z?LUVk8%ZK7IhFK(@$@=D_QqeDqv#xO#4to}o0a52Pkrx%gH0otxTHzfr z10(4oFIXBqSGAw78oaQxGNL|+2TK|0zau<#KT{8jbm%mub!M9bI?V?uc+vOA= z8uX4A_A$LRB>kp5dmOd)H?s5&1EPf;Uzx{hxI4W-K(L4L{X1XVY+w$yT%kVk%h0Y} z4H-ER1(c?yeI~DG@*a4dR~wt;c1(&BLQdY1Jv6=4&-%LYddry$(hA;FCon|&pt$9# zbmH`B>4hXY)Vb11obc_QvmrJ006{(8L>(VQx4&MJ;|#}FHOI2s;5M5U;>Db_-;rL= zu>Bw3fBvX5`!xkOE<{#I1?0YTxvEFO~Q@qII&ZDv* zd<4&*-&YElXFUI+Lt3+>+01Y2DIx#qD*Ird{z}9-MgPisFOyG;^b%qqWD$#JB2>h> z=pHPGf2`z8Die(*-bWvk9`rR8N|8E%M3=MfJ>8rqrkRlCx`oKk$v3UC{H|_)`q1MU zUC)^R89+se@rrK|k@2C0n$+)YGk^9kC6(;#nPM25U*Ws-*es0D4D4^^K<#IBlHFg8+lckp5%RI)4SZJ$$wcC!#ys2!W0 zktISyJlxK%5+O=a0d=7f1XSMteksm1u+&EX^An#qvhKeF8y!93lfi%bZv-z?|9!KC zg)_(hBdo~Dqq-qD|NKTCD_rS6M-tEakE;_FrU`|j`yYWwE^qQ*og!ZJ5jRtwy1b%- z?04U5@CQL~GxEnj2joKl8;+@|sjP}hKz26OGBN?5sR}0B|M{ZmP+sxz1a|iJY1!G)AK<47$bA2~IN|({ zRKNSg5c4IntDLJ{kh@sZHFBjl2+;p&BVZUh-9VD?`Rf2|H!K_fbeFqdY|HI0z7p^!vsQU%^0K zUiOz*F;6p>*pt)H8y=#7%^_7Npmg;(6c}PX?>>4adM|~9I^>TP%;SI24DlK0C+p6I zPpr;Y(}R&NGu&tY9^lt8J6pHVf06di4Y{E2M zO!-(tIB%)qLj46{DNy~h8q1QVAmbya;P7$SZqeZ|sDCdkEbM2{PV1J54fOT)jshs2 z_h_lCpJz~@qS|Ph5Qp76yrFpKG@WI>-oe4n^38#t@$u@jBDAtb{8DQ~q7g`iDpR7aetQ?2CULBF?u9Cl@r0koBs&49cV92BSP(yXC z--&=sc!^I$L{#dy%tyrQP*@&9sjfFY^)>}rz!&a2En zA^n+>XS`fY?C;5k%*-rfeQhmnh#Rr=0=QIxGTFDl%z(!kBjoz}x}O09U9N06krN3G z4bAT4Dj*;Lp6})h!ua^O4gL88f_!IJPe

^~E<$p3hQvtu)l&`)3>UgtZlzD4g#u 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 L`D6ItBsU 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 = [ + 'Waiting for state root', + 'Ready to prove', + 'In challenge period', + 'Ready for relay', + 'Relayed', +]; + +const WITHDRAWAL_STATUS_ORDER_PROVEN: Array = [ + 'Waiting for state root', + 'Ready to prove', + 'Proven', + 'Relayed', +]; + +const WITHDRAWAL_STATUS_ORDER_GAME: Array = [ + 'Waiting for state root', + 'Ready to prove', + 'Waiting a game to resolve', + 'In challenge period', + 'Ready for relay', + 'Relayed', +]; + const rollupFeature = config.features.rollup; const TxDetailsWithdrawalStatus = ({ status, l1TxHash }: Props) => { - if (!status || !WITHDRAWAL_STATUSES.includes(status) || !rollupFeature.isEnabled || rollupFeature.type !== 'optimistic') { + if (!status || !rollupFeature.isEnabled || rollupFeature.type !== 'optimistic') { return null; } @@ -25,10 +48,14 @@ const TxDetailsWithdrawalStatus = ({ status, l1TxHash }: Props) => { const steps = (() => { switch (status) { case 'Ready for relay': - return WITHDRAWAL_STATUSES.slice(0, -1); + return WITHDRAWAL_STATUS_STEPS.slice(0, -1); + case 'Proven': + return WITHDRAWAL_STATUS_ORDER_PROVEN; + case 'Waiting a game to resolve': + return WITHDRAWAL_STATUS_ORDER_GAME; case 'Relayed': { if (l1TxHash) { - return WITHDRAWAL_STATUSES.map((status) => { + return WITHDRAWAL_STATUS_STEPS.map((status) => { return status === 'Relayed' ? { content: , label: status, @@ -36,11 +63,11 @@ const TxDetailsWithdrawalStatus = ({ status, l1TxHash }: Props) => { }); } - return WITHDRAWAL_STATUSES; + return WITHDRAWAL_STATUS_STEPS; } default: - return WITHDRAWAL_STATUSES; + return WITHDRAWAL_STATUS_STEPS; } })(); From 3d40a9df73eb9de68aa17a75d21a808ce2557d9b Mon Sep 17 00:00:00 2001 From: isstuev Date: Tue, 28 May 2024 15:14:48 +0200 Subject: [PATCH 2/2] upd --- docs/ENVS.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docs/ENVS.md b/docs/ENVS.md index 1f5eb1784d..7c58652b6e 100644 --- a/docs/ENVS.md +++ b/docs/ENVS.md @@ -36,7 +36,6 @@ Please be aware that all environment variables prefixed with `NEXT_PUBLIC_` will - [Beacon chain](ENVS.md#beacon-chain) - [User operations](ENVS.md#user-operations-feature-erc-4337) - [Rollup chain](ENVS.md#rollup-chain) - - [Fault proof system](ENVS.md#fault-proof-system) - [Export data to CSV file](ENVS.md#export-data-to-csv-file) - [Google analytics](ENVS.md#google-analytics) - [Mixpanel analytics](ENVS.md#mixpanel-analytics) @@ -399,13 +398,6 @@ This feature is **enabled by default** with the `coinzilla` ads provider. To swi | NEXT_PUBLIC_ROLLUP_TYPE | `'optimistic' \| 'shibarium' \| 'zkEvm' \| 'zkSync' ` | Rollup chain type | Required | - | `'optimistic'` | | NEXT_PUBLIC_ROLLUP_L1_BASE_URL | `string` | Blockscout base URL for L1 network | Required | - | `'http://eth-goerli.blockscout.com'` | | NEXT_PUBLIC_ROLLUP_L2_WITHDRAWAL_URL | `string` | URL for L2 -> L1 withdrawals | Required only for `optimistic` rollups | - | `https://app.optimism.io/bridge/withdraw` | - -  - -### Fault proof system - -| Variable | Type| Description | Compulsoriness | Default value | Example value | -| --- | --- | --- | --- | --- | --- | | NEXT_PUBLIC_FAULT_PROOF_ENABLED | `boolean` | Set to `true` for chains with fault proof system enabled (OP stack only) | - | - | `true` |