From 09045ce3a8120bc40dc6c21e7b4f4140f3da15d9 Mon Sep 17 00:00:00 2001
From: raghukapur9 <64493087+raghukapur9@users.noreply.github.com>
Date: Fri, 20 Sep 2024 14:09:34 -0400
Subject: [PATCH] added all-blocks UI
---
.../app-explorer/src/app/blocks/layout.tsx | 17 ++
packages/app-explorer/src/app/blocks/page.tsx | 23 +++
.../Block/components/BlockEfficiencyItem.tsx | 49 +++++
.../Block/components/BlockHashItem.tsx | 28 +++
.../systems/Block/components/BlockItem.tsx | 26 +++
.../Block/components/BlockTimeItem.tsx | 28 +++
.../Block/components/BlockValidatorItem.tsx | 16 ++
.../systems/Block/components/BlocksTable.tsx | 132 +++++++++++++
.../src/systems/Block/components/Hero.tsx | 21 +++
.../src/systems/Block/screens/BlockScreen.tsx | 130 +++++++++++++
packages/ui/package.json | 2 +
.../ui/src/components/GridTable/GridTable.tsx | 173 ++++++++++++++++++
.../ui/src/components/GridTable/index.tsx | 1 +
packages/ui/src/index.ts | 1 +
packages/ui/src/theme/theme.css | 2 +
pnpm-lock.yaml | 108 ++++++-----
16 files changed, 708 insertions(+), 49 deletions(-)
create mode 100644 packages/app-explorer/src/app/blocks/layout.tsx
create mode 100644 packages/app-explorer/src/app/blocks/page.tsx
create mode 100644 packages/app-explorer/src/systems/Block/components/BlockEfficiencyItem.tsx
create mode 100644 packages/app-explorer/src/systems/Block/components/BlockHashItem.tsx
create mode 100644 packages/app-explorer/src/systems/Block/components/BlockItem.tsx
create mode 100644 packages/app-explorer/src/systems/Block/components/BlockTimeItem.tsx
create mode 100644 packages/app-explorer/src/systems/Block/components/BlockValidatorItem.tsx
create mode 100644 packages/app-explorer/src/systems/Block/components/BlocksTable.tsx
create mode 100644 packages/app-explorer/src/systems/Block/components/Hero.tsx
create mode 100644 packages/app-explorer/src/systems/Block/screens/BlockScreen.tsx
create mode 100644 packages/ui/src/components/GridTable/GridTable.tsx
create mode 100644 packages/ui/src/components/GridTable/index.tsx
diff --git a/packages/app-explorer/src/app/blocks/layout.tsx b/packages/app-explorer/src/app/blocks/layout.tsx
new file mode 100644
index 000000000..1291bdbff
--- /dev/null
+++ b/packages/app-explorer/src/app/blocks/layout.tsx
@@ -0,0 +1,17 @@
+import { OverlayDialog, Providers } from 'app-portal';
+import type { Metadata } from 'next';
+
+export const metadata: Metadata = {
+ title: 'All Blocks',
+};
+
+export default function Layout({ children }: { children: React.ReactNode }) {
+ return (
+
+
+ {children}
+
+ );
+}
+
+export const dynamic = 'force-static';
diff --git a/packages/app-explorer/src/app/blocks/page.tsx b/packages/app-explorer/src/app/blocks/page.tsx
new file mode 100644
index 000000000..90838da61
--- /dev/null
+++ b/packages/app-explorer/src/app/blocks/page.tsx
@@ -0,0 +1,23 @@
+'use client';
+import { Box, Flex } from '@fuels/ui';
+import { tv } from 'tailwind-variants';
+import { BlocksScreen } from '~/systems/Block/screens/BlockScreen';
+
+const Blocks = () => {
+ const classes = styles();
+ return (
+
+
+
+
+
+ );
+};
+const styles = tv({
+ slots: {
+ content: 'w-full max-w-[100%]',
+ },
+});
+export default Blocks;
+
+export const dynamic = 'force-static';
diff --git a/packages/app-explorer/src/systems/Block/components/BlockEfficiencyItem.tsx b/packages/app-explorer/src/systems/Block/components/BlockEfficiencyItem.tsx
new file mode 100644
index 000000000..48a82374e
--- /dev/null
+++ b/packages/app-explorer/src/systems/Block/components/BlockEfficiencyItem.tsx
@@ -0,0 +1,49 @@
+import { Box, HStack, Text, VStack } from '@fuels/ui';
+
+type BlockEfficiencyItemProps = {
+ current: number;
+ total: number;
+};
+
+export default function BlockEfficiencyItem({
+ current,
+ total,
+}: BlockEfficiencyItemProps) {
+ // Convert current and total to millions
+ const currentInMillions = current / 1_000_000;
+ const totalInMillions = total / 1_000_000;
+
+ // Calculate progress percentage
+ const progress = (current / total) * 100;
+
+ return (
+
+
+
+ {/* Format current and total as M (millions) */}
+
+ {currentInMillions % 1 === 0
+ ? currentInMillions.toFixed(0)
+ : currentInMillions.toFixed(1)}
+ M /
+ {totalInMillions % 1 === 0
+ ? totalInMillions.toFixed(0)
+ : totalInMillions.toFixed(1)}
+ M
+
+
+ ({progress.toFixed(2)}%)
+
+
+
+
+
+ );
+}
diff --git a/packages/app-explorer/src/systems/Block/components/BlockHashItem.tsx b/packages/app-explorer/src/systems/Block/components/BlockHashItem.tsx
new file mode 100644
index 000000000..d36eeffd1
--- /dev/null
+++ b/packages/app-explorer/src/systems/Block/components/BlockHashItem.tsx
@@ -0,0 +1,28 @@
+import { Box, Copyable, HStack, VStack } from '@fuels/ui';
+
+type BlockHashItemProps = {
+ hashAddress: string;
+ width: string;
+};
+
+export default function BlockHashItem({
+ hashAddress,
+ width,
+}: BlockHashItemProps) {
+ return (
+
+
+
+
+
+ {hashAddress}
+
+
+
+
+
+ );
+}
diff --git a/packages/app-explorer/src/systems/Block/components/BlockItem.tsx b/packages/app-explorer/src/systems/Block/components/BlockItem.tsx
new file mode 100644
index 000000000..f566d2ac2
--- /dev/null
+++ b/packages/app-explorer/src/systems/Block/components/BlockItem.tsx
@@ -0,0 +1,26 @@
+import { Box, Copyable, HStack, Text, VStack } from '@fuels/ui';
+
+export interface BlockItemProps {
+ blockId: string;
+ ethValue: string;
+}
+
+export default function BlockItem({ blockId, ethValue }: BlockItemProps) {
+ return (
+
+
+
+
+ #{blockId}
+
+
+
+
+ {ethValue} ETH
+
+
+ );
+}
diff --git a/packages/app-explorer/src/systems/Block/components/BlockTimeItem.tsx b/packages/app-explorer/src/systems/Block/components/BlockTimeItem.tsx
new file mode 100644
index 000000000..741077768
--- /dev/null
+++ b/packages/app-explorer/src/systems/Block/components/BlockTimeItem.tsx
@@ -0,0 +1,28 @@
+import { Text, VStack } from '@fuels/ui';
+
+type BlockTimeItemProps = {
+ time: Date;
+ timeAgo: string;
+};
+
+export default function BlockTimeItem({ time, timeAgo }: BlockTimeItemProps) {
+ const timeDate = new Date(time);
+
+ const formattedTime = timeDate.toLocaleString('en-US', {
+ year: 'numeric',
+ month: 'short',
+ day: 'numeric',
+ hour: 'numeric',
+ minute: 'numeric',
+ hour12: true,
+ });
+
+ return (
+
+ {timeAgo}
+
+ {formattedTime}
+
+
+ );
+}
diff --git a/packages/app-explorer/src/systems/Block/components/BlockValidatorItem.tsx b/packages/app-explorer/src/systems/Block/components/BlockValidatorItem.tsx
new file mode 100644
index 000000000..29f616635
--- /dev/null
+++ b/packages/app-explorer/src/systems/Block/components/BlockValidatorItem.tsx
@@ -0,0 +1,16 @@
+import { HStack } from '@fuels/ui';
+import BlockHashItem from './BlockHashItem';
+
+type BlockValidatorItemProps = {
+ hashAddress: string;
+};
+
+export default function BlockValidatorItem({
+ hashAddress,
+}: BlockValidatorItemProps) {
+ return (
+
+
+
+ );
+}
diff --git a/packages/app-explorer/src/systems/Block/components/BlocksTable.tsx b/packages/app-explorer/src/systems/Block/components/BlocksTable.tsx
new file mode 100644
index 000000000..a146eb711
--- /dev/null
+++ b/packages/app-explorer/src/systems/Block/components/BlocksTable.tsx
@@ -0,0 +1,132 @@
+import { GQLBlocksQuery } from '@fuel-explorer/graphql';
+import { GridTable } from '@fuels/ui';
+import { Link } from '@fuels/ui';
+import NextLink from 'next/link';
+import BlockEfficiencyItem from './BlockEfficiencyItem';
+import BlockHashItem from './BlockHashItem';
+import BlockItem from './BlockItem';
+import BlockTimeItem from './BlockTimeItem';
+import BlockValidatorItem from './BlockValidatorItem';
+
+const columns = [
+ {
+ name: 'Block',
+ cell: (row: any) => {
+ const totalGasUsed = (
+ parseFloat(row.node.totalGasUsed) /
+ 10 ** 9
+ ).toString();
+ return (
+
+ );
+ },
+ sortable: false,
+ },
+ {
+ name: 'Blockhash',
+ cell: (row: any) => (
+
+ ),
+ sortable: false,
+ },
+ {
+ name: 'Transactions',
+ cell: (row: any) => (
+
+ {row.node.header.transactionsCount}
+
+ ),
+ sortable: false,
+ },
+ {
+ name: 'Rewards',
+ cell: (row: any) => {
+ const mintTransaction = row.node.transactions.find(
+ (trans: any) => trans.mintAmount != null,
+ );
+ return (
+
+ {mintTransaction ? mintTransaction.mintAmount : 'No mint amount'}{' '}
+
+ );
+ },
+ sortable: false,
+ },
+ {
+ name: 'Validator',
+ cell: (row: any) => (
+
+
+
+ ),
+ sortable: false,
+ },
+ {
+ name: 'Efficiency',
+ cell: (row: any) => (
+
+
+
+ ),
+ sortable: false,
+ },
+ {
+ name: 'Time',
+ cell: (row: any) => {
+ const unixTimestamp = row.node.time.rawUnix;
+ const date = new Date(unixTimestamp * 1000);
+
+ return ;
+ },
+ sortable: false,
+ },
+ {
+ name: '',
+ cell: (row: any) => (
+
+ View
+
+ ),
+ sortable: false,
+ },
+];
+
+type BlocksTableProps = {
+ blocks: GQLBlocksQuery['blocks'];
+ onPageChanged: (pageNumber: number) => void;
+ pageCount: number;
+ currentPage: number;
+ setCurrentPage: (currentPage: number) => void;
+};
+
+function BlocksTable({
+ blocks,
+ onPageChanged,
+ pageCount,
+ currentPage,
+ setCurrentPage,
+}: BlocksTableProps) {
+ const handlePageChanged = (pageNumber: number) => {
+ onPageChanged(pageNumber);
+ };
+
+ return (
+
+
+
+ );
+}
+
+export default BlocksTable;
diff --git a/packages/app-explorer/src/systems/Block/components/Hero.tsx b/packages/app-explorer/src/systems/Block/components/Hero.tsx
new file mode 100644
index 000000000..0ed3fa4b4
--- /dev/null
+++ b/packages/app-explorer/src/systems/Block/components/Hero.tsx
@@ -0,0 +1,21 @@
+import { HStack, Heading, Theme, VStack } from '@fuels/ui';
+import { IconChevronRight } from '@tabler/icons-react';
+
+export function Hero() {
+ return (
+
+
+
+ Blocks
+
+
+
+ Home
+
+
+ View All Blocks
+
+
+
+ );
+}
diff --git a/packages/app-explorer/src/systems/Block/screens/BlockScreen.tsx b/packages/app-explorer/src/systems/Block/screens/BlockScreen.tsx
new file mode 100644
index 000000000..b0a4a81dc
--- /dev/null
+++ b/packages/app-explorer/src/systems/Block/screens/BlockScreen.tsx
@@ -0,0 +1,130 @@
+import { VStack } from '@fuels/ui';
+import { useRouter, useSearchParams } from 'next/navigation';
+import { useEffect, useState } from 'react';
+
+import { GQLBlocksQuery } from '@fuel-explorer/graphql';
+import { getBlocks } from '../actions/get-blocks';
+import BlocksTable from '../components/BlocksTable';
+import { Hero } from '../components/Hero';
+
+export const BlocksScreen = () => {
+ const router = useRouter();
+ const searchParams = useSearchParams();
+
+ const [data, setData] = useState(
+ undefined,
+ );
+ const [dir, setDir] = useState<'after' | 'before'>('after');
+ const [totalPages, setTotalPages] = useState(1);
+ const [currentPage, setCurrentPage] = useState(1);
+ const [currentCursor, setCurrentCursor] = useState(null);
+ const [loading, setLoading] = useState(false);
+ const limit = 10;
+
+ const calculateTotalPages = () => {
+ if (data?.pageInfo.endCursor) {
+ const endCursor = Number(data.pageInfo.endCursor);
+ return Math.ceil(endCursor / limit);
+ }
+ return 1;
+ };
+
+ useEffect(() => {
+ if (data) {
+ const totalPageCount = calculateTotalPages();
+ setTotalPages(totalPageCount);
+ }
+ }, [data]);
+
+ const fetchBlockData = async (
+ cursor: string | null = null,
+ dir: 'after' | 'before' = 'after',
+ ) => {
+ setLoading(true);
+ try {
+ const result = await getBlocks({ cursor, dir });
+ const blockData = result.blocks;
+ setData(blockData);
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ const handlePageChanged = (newPageNumber: number) => {
+ if (data) {
+ const newDir = newPageNumber > currentPage ? 'before' : 'after';
+ let newCursor: string | null = null;
+ setDir(newDir);
+
+ if (
+ newPageNumber === currentPage + 1 ||
+ newPageNumber === currentPage - 1
+ ) {
+ if (newDir === 'before' && data.pageInfo.endCursor) {
+ newCursor = data.pageInfo.endCursor;
+ } else if (newDir === 'after' && data.pageInfo.startCursor) {
+ newCursor = data.pageInfo.startCursor;
+ }
+ } else {
+ if (newDir === 'before' && data.pageInfo.endCursor) {
+ newCursor = (
+ +data.pageInfo.endCursor -
+ (newPageNumber - currentPage) * limit
+ ).toString();
+ } else if (newDir === 'after' && data.pageInfo.startCursor) {
+ newCursor = (
+ +data.pageInfo.startCursor +
+ (currentPage - newPageNumber) * limit
+ ).toString();
+ }
+ }
+
+ setCurrentPage(newPageNumber);
+ setCurrentCursor(newCursor);
+ if (newPageNumber === 1) {
+ router.push('/blocks');
+ return;
+ }
+ router.push(`/blocks?page=${newPageNumber}&cursor=${newCursor}`);
+ }
+ };
+
+ useEffect(() => {
+ const page = parseInt(searchParams.get('page') || '1');
+ const cursor = searchParams.get('cursor') || null;
+
+ setCurrentPage(page);
+ setCurrentCursor(cursor);
+ setDir(page > currentPage ? 'after' : 'before');
+ }, [searchParams]);
+
+ useEffect(() => {
+ fetchBlockData(currentCursor, dir);
+ }, [currentCursor, dir]);
+
+ useEffect(() => {
+ if (data) {
+ const totalPageCount = calculateTotalPages();
+ setTotalPages(totalPageCount);
+ }
+ }, [data]);
+
+ return (
+
+
+ {loading ? (
+ Loading blocks...
+ ) : (
+ data && (
+
+ )
+ )}
+
+ );
+};
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 26f25362d..e8b2b99ce 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -67,6 +67,8 @@
"@react-aria/focus": "3.16.2",
"@tabler/icons-react": "2.47.0",
"@tailwindcss/typography": "0.5.10",
+ "react-paginate": "8.2.0",
+ "react-data-table-component": "7.6.2",
"clsx": "2.1.0",
"csstype": "3.1.3",
"framer-motion": "11.0.5",
diff --git a/packages/ui/src/components/GridTable/GridTable.tsx b/packages/ui/src/components/GridTable/GridTable.tsx
new file mode 100644
index 000000000..676ddace7
--- /dev/null
+++ b/packages/ui/src/components/GridTable/GridTable.tsx
@@ -0,0 +1,173 @@
+'use client';
+import React from 'react';
+import DataTable, { TableProps, TableColumn } from 'react-data-table-component';
+import ReactPaginate from 'react-paginate';
+
+export interface GridTableProps extends TableProps {
+ columns: TableColumn[];
+ data: T[];
+ pageCount: number;
+ onPageChanged: (selectedItem: number) => void;
+ currentPage: number;
+ setCurrentPage: (currentPage: number) => void;
+}
+export type GridTableColumn = TableColumn;
+
+export const GridTable = ({
+ columns,
+ data,
+ pageCount,
+ onPageChanged,
+ setCurrentPage,
+ currentPage,
+ ...props
+}: GridTableProps): React.JSX.Element => {
+ const customStyles = {
+ tableWrapper: {
+ style: {
+ borderRadius: '7px',
+ },
+ },
+ table: {
+ style: {
+ backgroundColor: 'transparent',
+ },
+ },
+ headRow: {
+ style: {
+ backgroundColor: 'transparent',
+ color: '#9f9f9f',
+ fontWeight: '600',
+ },
+ },
+ headCells: {
+ style: {
+ backgroundColor: 'transparent',
+ color: '#9f9f9f',
+ fontWeight: '600',
+ },
+ },
+ rows: {
+ style: {
+ cursor: 'pointer',
+ backgroundColor: 'transparent',
+ fontWeight: '400',
+ '&:hover': {
+ backgroundColor: 'var(--gray-2)', // Change background color on hover
+ },
+ },
+ },
+ cells: {
+ style: {
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+ paddingLeft: '0.5rem',
+ paddingRight: '0.5rem',
+ color: 'var(--gray-table-text)',
+ paddingTop: '0.9rem',
+ paddingBottom: '0.9rem',
+ backgroundColor: 'transparent',
+ fontWeight: '400',
+ },
+ },
+ pagination: {
+ style: {
+ backgroundColor: 'var(--gray-2)',
+ color: '#f0f0f0',
+ },
+ pageButtonsStyle: {
+ padding: '8px 16px',
+ margin: '0 4px',
+ color: '#f0f0f0',
+ borderRadius: '4px',
+ backgroundColor: 'var(--gray-2)',
+ '&.selected': {
+ backgroundColor: 'rgba(255, 255, 255, 0.1)',
+ fontWeight: 'bold',
+ },
+ '&:hover': {
+ backgroundColor: 'rgba(255, 255, 255, 0.2)',
+ },
+ },
+ },
+ };
+
+ const Pagination: React.FC = () => {
+ return (
+ ← Previous} // Left Arrow
+ nextLabel={Next →} // Right Arrow
+ breakLabel={'...'}
+ pageCount={pageCount}
+ marginPagesDisplayed={2}
+ pageRangeDisplayed={5}
+ onPageChange={(page) => handlePagination(page)}
+ containerClassName={'pagination'}
+ activeClassName={'selected'}
+ disabledClassName={'disabled'}
+ pageLinkClassName={'page-link'}
+ forcePage={currentPage !== 0 ? currentPage - 1 : 0}
+ />
+ );
+ };
+
+ const handlePagination = (page: any) => {
+ setCurrentPage(page.selected + 1);
+ onPageChanged(page.selected + 1);
+ };
+
+ return (
+
+
+
+
+ );
+};
diff --git a/packages/ui/src/components/GridTable/index.tsx b/packages/ui/src/components/GridTable/index.tsx
new file mode 100644
index 000000000..42edf4b31
--- /dev/null
+++ b/packages/ui/src/components/GridTable/index.tsx
@@ -0,0 +1 @@
+export { GridTable } from './GridTable';
diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts
index 85be5c025..9aa443a79 100644
--- a/packages/ui/src/index.ts
+++ b/packages/ui/src/index.ts
@@ -32,6 +32,7 @@ export * from './components/Dropdown';
export * from './components/EntityItem';
export * from './components/Focus';
export * from './components/FuelLogo';
+export * from './components/GridTable';
export * from './components/Heading';
export * from './components/HelperIcon';
export * from './components/HoverCard';
diff --git a/packages/ui/src/theme/theme.css b/packages/ui/src/theme/theme.css
index bfd4d716a..7a282c623 100644
--- a/packages/ui/src/theme/theme.css
+++ b/packages/ui/src/theme/theme.css
@@ -834,6 +834,7 @@
--gray-a12: #ffffffed;
--gray-contrast: #FFFFFF;
+ --gray-table-text: #FFFFFF;
--gray-surface: rgba(0, 0, 0, 0.05);
--gray-indicator: var(--gray-9);
}
@@ -871,6 +872,7 @@
--gray-a12: #000000df;
--gray-contrast: #FFFFFF;
+ --gray-table-text: #000000;
--gray-surface: #ffffffcc;
--gray-indicator: var(--gray-9);
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 75a7ae6e8..abed6c342 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -869,9 +869,15 @@ importers:
react-aria:
specifier: 3.32.1
version: 3.32.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ react-data-table-component:
+ specifier: 7.6.2
+ version: 7.6.2(react@18.2.0)(styled-components@5.3.11(@babel/core@7.23.9)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0))
react-dom:
specifier: 18.2.0
version: 18.2.0(react@18.2.0)
+ react-paginate:
+ specifier: 8.2.0
+ version: 8.2.0(react@18.2.0)
react-stately:
specifier: 3.29.1
version: 3.29.1(react@18.2.0)
@@ -3828,10 +3834,6 @@ packages:
resolution: {integrity: sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==}
engines: {node: '>=14.0.0'}
- '@metamask/utils@8.4.0':
- resolution: {integrity: sha512-dbIc3C7alOe0agCuBHM1h71UaEaEqOk2W8rAtEn8QGz4haH2Qq7MoK6i7v2guzvkJVVh79c+QCzIqphC3KvrJg==}
- engines: {node: '>=16.0.0'}
-
'@metamask/utils@8.5.0':
resolution: {integrity: sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==}
engines: {node: '>=16.0.0'}
@@ -13028,6 +13030,12 @@ packages:
react: '>=16.8.0'
react-dom: '>=16.8.0'
+ react-data-table-component@7.6.2:
+ resolution: {integrity: sha512-nHe7040fmtrJyQr/ieGrTfV0jBflYGK4sLokC6/AFOv3ThjmA9WzKz8Z8/2wMxzRqLU+Rn0CVFg+8+frKLepWQ==}
+ peerDependencies:
+ react: '>= 16.8.3'
+ styled-components: '>= 5.0.0'
+
react-docgen-typescript@2.2.2:
resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==}
peerDependencies:
@@ -13078,6 +13086,11 @@ packages:
react: '*'
react-native: '*'
+ react-paginate@8.2.0:
+ resolution: {integrity: sha512-sJCz1PW+9PNIjUSn919nlcRVuleN2YPoFBOvL+6TPgrH/3lwphqiSOgdrLafLdyLDxsgK+oSgviqacF4hxsDIw==}
+ peerDependencies:
+ react: ^16 || ^17 || ^18
+
react-refresh@0.14.0:
resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==}
engines: {node: '>=0.10.0'}
@@ -18299,7 +18312,7 @@ snapshots:
'@graphql-tools/utils': 10.5.4(graphql@16.8.1)
dataloader: 2.2.2
graphql: 16.8.1
- tslib: 2.6.3
+ tslib: 2.7.0
value-or-promise: 1.0.12
'@graphql-tools/batch-execute@9.0.4(graphql@16.8.1)':
@@ -18970,7 +18983,7 @@ snapshots:
dependencies:
'@types/istanbul-lib-coverage': 2.0.6
'@types/istanbul-reports': 3.0.4
- '@types/node': 18.19.14
+ '@types/node': 20.14.15
'@types/yargs': 15.0.19
chalk: 4.1.2
@@ -19039,8 +19052,8 @@ snapshots:
'@jridgewell/source-map@0.3.5':
dependencies:
- '@jridgewell/gen-mapping': 0.3.3
- '@jridgewell/trace-mapping': 0.3.22
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
'@jridgewell/source-map@0.3.6':
dependencies:
@@ -19122,7 +19135,7 @@ snapshots:
dependencies:
'@metamask/rpc-errors': 6.2.1
'@metamask/safe-event-emitter': 3.1.1
- '@metamask/utils': 8.4.0
+ '@metamask/utils': 8.5.0
transitivePeerDependencies:
- supports-color
@@ -19130,7 +19143,7 @@ snapshots:
dependencies:
'@metamask/json-rpc-engine': 8.0.2
'@metamask/safe-event-emitter': 3.1.1
- '@metamask/utils': 8.4.0
+ '@metamask/utils': 8.5.0
readable-stream: 3.6.2
transitivePeerDependencies:
- supports-color
@@ -19151,7 +19164,7 @@ snapshots:
'@metamask/object-multiplex': 2.0.0
'@metamask/rpc-errors': 6.2.1
'@metamask/safe-event-emitter': 3.1.1
- '@metamask/utils': 8.4.0
+ '@metamask/utils': 8.5.0
detect-browser: 5.3.0
extension-port-stream: 3.0.0
fast-deep-equal: 3.1.3
@@ -19163,7 +19176,7 @@ snapshots:
'@metamask/rpc-errors@6.2.1':
dependencies:
- '@metamask/utils': 8.4.0
+ '@metamask/utils': 8.5.0
fast-safe-stringify: 2.1.1
transitivePeerDependencies:
- supports-color
@@ -19249,29 +19262,15 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@metamask/utils@8.4.0':
- dependencies:
- '@ethereumjs/tx': 4.2.0
- '@noble/hashes': 1.4.0
- '@scure/base': 1.1.8
- '@types/debug': 4.1.12
- debug: 4.3.7(supports-color@8.1.1)
- pony-cause: 2.1.10
- semver: 7.6.3
- superstruct: 1.0.4
- uuid: 9.0.1
- transitivePeerDependencies:
- - supports-color
-
'@metamask/utils@8.5.0':
dependencies:
'@ethereumjs/tx': 4.2.0
'@metamask/superstruct': 3.1.0
- '@noble/hashes': 1.5.0
+ '@noble/hashes': 1.4.0
'@scure/base': 1.1.8
'@types/debug': 4.1.12
debug: 4.3.7(supports-color@8.1.1)
- pony-cause: 2.1.11
+ pony-cause: 2.1.10
semver: 7.6.3
uuid: 9.0.1
transitivePeerDependencies:
@@ -19296,7 +19295,7 @@ snapshots:
'@motionone/easing': 10.17.0
'@motionone/types': 10.17.0
'@motionone/utils': 10.17.0
- tslib: 2.6.3
+ tslib: 2.7.0
'@motionone/dom@10.12.0':
dependencies:
@@ -19325,7 +19324,7 @@ snapshots:
dependencies:
'@motionone/types': 10.17.0
'@motionone/utils': 10.17.0
- tslib: 2.6.3
+ tslib: 2.7.0
'@motionone/svelte@10.16.4':
dependencies:
@@ -19338,7 +19337,7 @@ snapshots:
dependencies:
'@motionone/types': 10.17.0
hey-listen: 1.0.8
- tslib: 2.6.3
+ tslib: 2.7.0
'@motionone/vue@10.16.4':
dependencies:
@@ -19576,11 +19575,11 @@ snapshots:
dependencies:
asn1js: 3.0.5
pvtsutils: 1.3.5
- tslib: 2.6.3
+ tslib: 2.7.0
'@peculiar/json-schema@1.1.12':
dependencies:
- tslib: 2.6.3
+ tslib: 2.7.0
'@peculiar/webcrypto@1.4.5':
dependencies:
@@ -23265,11 +23264,11 @@ snapshots:
'@swc/helpers@0.4.36':
dependencies:
legacy-swc-helpers: '@swc/helpers@0.4.14'
- tslib: 2.6.3
+ tslib: 2.7.0
'@swc/helpers@0.5.12':
dependencies:
- tslib: 2.6.3
+ tslib: 2.7.0
'@swc/helpers@0.5.5':
dependencies:
@@ -23646,7 +23645,7 @@ snapshots:
'@types/http-proxy@1.17.14':
dependencies:
- '@types/node': 18.19.14
+ '@types/node': 20.14.15
'@types/istanbul-lib-coverage@2.0.6': {}
@@ -23707,7 +23706,7 @@ snapshots:
'@types/node-forge@1.3.11':
dependencies:
- '@types/node': 18.19.14
+ '@types/node': 20.14.15
'@types/node@10.12.18': {}
@@ -23737,7 +23736,7 @@ snapshots:
'@types/pbkdf2@3.1.2':
dependencies:
- '@types/node': 18.19.14
+ '@types/node': 20.14.15
'@types/pg@8.11.6':
dependencies:
@@ -23777,7 +23776,7 @@ snapshots:
'@types/secp256k1@4.0.6':
dependencies:
- '@types/node': 18.19.14
+ '@types/node': 20.14.15
'@types/semver@7.5.6': {}
@@ -26241,7 +26240,7 @@ snapshots:
capital-case@1.0.4:
dependencies:
no-case: 3.0.4
- tslib: 2.6.3
+ tslib: 2.7.0
upper-case-first: 2.0.2
case-sensitive-paths-webpack-plugin@2.4.0: {}
@@ -26610,7 +26609,7 @@ snapshots:
constant-case@3.0.4:
dependencies:
no-case: 3.0.4
- tslib: 2.6.3
+ tslib: 2.7.0
upper-case: 2.0.2
constants-browserify@1.0.0: {}
@@ -29042,7 +29041,7 @@ snapshots:
header-case@2.0.4:
dependencies:
capital-case: 1.0.4
- tslib: 2.6.3
+ tslib: 2.7.0
help-me@5.0.0: {}
@@ -29365,7 +29364,7 @@ snapshots:
'@formatjs/ecma402-abstract': 1.18.2
'@formatjs/fast-memoize': 2.2.0
'@formatjs/icu-messageformat-parser': 2.7.6
- tslib: 2.6.3
+ tslib: 2.7.0
into-stream@3.1.0:
dependencies:
@@ -29672,7 +29671,7 @@ snapshots:
'@babel/core': 7.23.9
'@istanbuljs/schema': 0.1.3
istanbul-lib-coverage: 3.2.2
- semver: 7.6.0
+ semver: 7.6.3
transitivePeerDependencies:
- supports-color
@@ -29692,7 +29691,7 @@ snapshots:
'@babel/parser': 7.23.9
'@istanbuljs/schema': 0.1.3
istanbul-lib-coverage: 3.2.2
- semver: 7.6.0
+ semver: 7.6.3
transitivePeerDependencies:
- supports-color
@@ -30787,7 +30786,7 @@ snapshots:
make-dir@4.0.0:
dependencies:
- semver: 7.6.0
+ semver: 7.6.3
make-error@1.3.6: {}
@@ -31468,7 +31467,7 @@ snapshots:
path-case@3.0.4:
dependencies:
dot-case: 3.0.4
- tslib: 2.6.3
+ tslib: 2.7.0
path-exists@3.0.0: {}
@@ -32151,7 +32150,7 @@ snapshots:
pvtsutils@1.3.5:
dependencies:
- tslib: 2.6.3
+ tslib: 2.7.0
pvutils@1.1.3: {}
@@ -32308,6 +32307,12 @@ snapshots:
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
+ react-data-table-component@7.6.2(react@18.2.0)(styled-components@5.3.11(@babel/core@7.23.9)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0)):
+ dependencies:
+ deepmerge: 4.3.1
+ react: 18.2.0
+ styled-components: 5.3.11(@babel/core@7.23.9)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0)
+
react-docgen-typescript@2.2.2(typescript@5.4.5):
dependencies:
typescript: 5.4.5
@@ -32363,6 +32368,11 @@ snapshots:
invariant: 2.2.4
react: 18.2.0
+ react-paginate@8.2.0(react@18.2.0):
+ dependencies:
+ prop-types: 15.8.1
+ react: 18.2.0
+
react-refresh@0.14.0: {}
react-remove-scroll-bar@2.3.4(@types/react@18.2.54)(react@18.2.0):
@@ -35055,7 +35065,7 @@ snapshots:
'@peculiar/json-schema': 1.1.12
asn1js: 3.0.5
pvtsutils: 1.3.5
- tslib: 2.6.3
+ tslib: 2.7.0
webextension-polyfill@0.10.0: {}