From d10555e9b3a0317079bd9267bf0e698c2119fbfe Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Wed, 28 Aug 2024 21:37:37 +0700 Subject: [PATCH 01/51] chore(tangle-dapp): Enable restake pages --- apps/tangle-dapp/app/restake/_page.tsx | 10 --- .../deposit/{_layout.tsx => layout.tsx} | 0 .../restake/deposit/{_page.tsx => page.tsx} | 0 .../app/restake/{_layout.tsx => layout.tsx} | 0 apps/tangle-dapp/app/restake/page.tsx | 5 ++ .../restake/stake/{_layout.tsx => layout.tsx} | 0 .../app/restake/stake/{_page.tsx => page.tsx} | 0 .../restake/unstake/{_page.tsx => page.tsx} | 0 .../components/WalletModal/WalletModal.tsx | 79 +++++++++---------- 9 files changed, 42 insertions(+), 52 deletions(-) delete mode 100644 apps/tangle-dapp/app/restake/_page.tsx rename apps/tangle-dapp/app/restake/deposit/{_layout.tsx => layout.tsx} (100%) rename apps/tangle-dapp/app/restake/deposit/{_page.tsx => page.tsx} (100%) rename apps/tangle-dapp/app/restake/{_layout.tsx => layout.tsx} (100%) create mode 100644 apps/tangle-dapp/app/restake/page.tsx rename apps/tangle-dapp/app/restake/stake/{_layout.tsx => layout.tsx} (100%) rename apps/tangle-dapp/app/restake/stake/{_page.tsx => page.tsx} (100%) rename apps/tangle-dapp/app/restake/unstake/{_page.tsx => page.tsx} (100%) diff --git a/apps/tangle-dapp/app/restake/_page.tsx b/apps/tangle-dapp/app/restake/_page.tsx deleted file mode 100644 index cc6d183f3..000000000 --- a/apps/tangle-dapp/app/restake/_page.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { redirect } from 'next/navigation'; - -import { PagePath } from '../../types'; - -export const dynamic = 'force-static'; - -export default function RestakePage() { - // Default redirect to deposit page - return redirect(PagePath.RESTAKE_DEPOSIT); -} diff --git a/apps/tangle-dapp/app/restake/deposit/_layout.tsx b/apps/tangle-dapp/app/restake/deposit/layout.tsx similarity index 100% rename from apps/tangle-dapp/app/restake/deposit/_layout.tsx rename to apps/tangle-dapp/app/restake/deposit/layout.tsx diff --git a/apps/tangle-dapp/app/restake/deposit/_page.tsx b/apps/tangle-dapp/app/restake/deposit/page.tsx similarity index 100% rename from apps/tangle-dapp/app/restake/deposit/_page.tsx rename to apps/tangle-dapp/app/restake/deposit/page.tsx diff --git a/apps/tangle-dapp/app/restake/_layout.tsx b/apps/tangle-dapp/app/restake/layout.tsx similarity index 100% rename from apps/tangle-dapp/app/restake/_layout.tsx rename to apps/tangle-dapp/app/restake/layout.tsx diff --git a/apps/tangle-dapp/app/restake/page.tsx b/apps/tangle-dapp/app/restake/page.tsx new file mode 100644 index 000000000..3fe6ffbe9 --- /dev/null +++ b/apps/tangle-dapp/app/restake/page.tsx @@ -0,0 +1,5 @@ +export const dynamic = 'force-static'; + +export default function RestakePage() { + return
Restake
; +} diff --git a/apps/tangle-dapp/app/restake/stake/_layout.tsx b/apps/tangle-dapp/app/restake/stake/layout.tsx similarity index 100% rename from apps/tangle-dapp/app/restake/stake/_layout.tsx rename to apps/tangle-dapp/app/restake/stake/layout.tsx diff --git a/apps/tangle-dapp/app/restake/stake/_page.tsx b/apps/tangle-dapp/app/restake/stake/page.tsx similarity index 100% rename from apps/tangle-dapp/app/restake/stake/_page.tsx rename to apps/tangle-dapp/app/restake/stake/page.tsx diff --git a/apps/tangle-dapp/app/restake/unstake/_page.tsx b/apps/tangle-dapp/app/restake/unstake/page.tsx similarity index 100% rename from apps/tangle-dapp/app/restake/unstake/_page.tsx rename to apps/tangle-dapp/app/restake/unstake/page.tsx diff --git a/libs/webb-ui-components/src/components/WalletModal/WalletModal.tsx b/libs/webb-ui-components/src/components/WalletModal/WalletModal.tsx index 10d5aa6c1..ce18eaf16 100644 --- a/libs/webb-ui-components/src/components/WalletModal/WalletModal.tsx +++ b/libs/webb-ui-components/src/components/WalletModal/WalletModal.tsx @@ -1,12 +1,12 @@ 'use client'; -import { forwardRef, useCallback, useMemo } from 'react'; +import { FC, useCallback, useMemo } from 'react'; import { Modal, ModalContent } from '../Modal'; import { WalletConnectionCard } from '../WalletConnectionCard'; import { WalletModalProps } from './types'; import WalletNotInstalledError from '@webb-tools/dapp-types/errors/WalletNotInstalledError'; -export const WalletModal = forwardRef( +export const WalletModal: FC = ( { notificationApi, @@ -23,9 +23,7 @@ export const WalletModal = forwardRef( platformId, targetTypedChainIds, contentDefaultText, - ...props }, - ref, ) => { // Get the current failed or connecting wallet const getCurrentWallet = useCallback(() => { @@ -80,42 +78,39 @@ export const WalletModal = forwardRef( }, [connectWallet, notificationApi, selectedWallet, connectError]); return ( -
- - resetState()} - > - - connectWallet(nextWallet, targetTypedChainIds) - } - onClose={() => toggleModal(false)} - connectingWalletId={connectingWalletId} - errorMessage={errorMessage} - failedWalletId={failedWalletId} - onTryAgainBtnClick={handleTryAgainBtnClick} - errorBtnText={ - connectError instanceof WalletNotInstalledError - ? 'Download' - : 'Try Again' - } - tryAgainBtnProps={ - connectError instanceof WalletNotInstalledError - ? { - href: downloadURL?.toString(), - target: '_blank', - } - : {} - } - downloadWalletURL={downloadURL} - contentDefaultText={contentDefaultText} - /> - - -
+ + resetState()} + > + + connectWallet(nextWallet, targetTypedChainIds) + } + onClose={() => toggleModal(false)} + connectingWalletId={connectingWalletId} + errorMessage={errorMessage} + failedWalletId={failedWalletId} + onTryAgainBtnClick={handleTryAgainBtnClick} + errorBtnText={ + connectError instanceof WalletNotInstalledError + ? 'Download' + : 'Try Again' + } + tryAgainBtnProps={ + connectError instanceof WalletNotInstalledError + ? { + href: downloadURL?.toString(), + target: '_blank', + } + : {} + } + downloadWalletURL={downloadURL} + contentDefaultText={contentDefaultText} + /> + + ); - }, -); + }; From ab1c18a8da6d7f4e7abf0277fd2708175d893e46 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Wed, 28 Aug 2024 23:51:57 +0700 Subject: [PATCH 02/51] feat(tangle-dapp): Scaffold restake overview page --- apps/tangle-dapp/app/restake/page.tsx | 69 ++++++++++++++++++- .../components/GlassCard/GlassCard.tsx | 13 +++- .../tangle-dapp/components/GlassCard/types.ts | 4 +- 3 files changed, 82 insertions(+), 4 deletions(-) diff --git a/apps/tangle-dapp/app/restake/page.tsx b/apps/tangle-dapp/app/restake/page.tsx index 3fe6ffbe9..ff81892d9 100644 --- a/apps/tangle-dapp/app/restake/page.tsx +++ b/apps/tangle-dapp/app/restake/page.tsx @@ -1,5 +1,72 @@ +import Button from '@webb-tools/webb-ui-components/components/buttons/Button'; +import { Typography } from '@webb-tools/webb-ui-components/typography/Typography'; +import cx from 'classnames'; + +import GlassCard from '../../components/GlassCard/GlassCard'; +import StatItem from '../../components/LiquidStaking/StatItem'; + export const dynamic = 'force-static'; +const CONTENT = { + OVERVIEW: ( + <> + Operators on Tangle provide computation resources to power AVS Blueprints. +  Deposit and Delegate liquidity to earn yields. + + ), + HOW_IT_WORKS: + 'Tangle combines restaking with omnichain assets to provide a multi-asset crypto-economically secured compute infrastructure.', +} as const; + export default function RestakePage() { - return
Restake
; + return ( +
+
+ + + {CONTENT.OVERVIEW} + + +
+ + + +
+
+ + +
+ + How it works + + + {CONTENT.HOW_IT_WORKS} +
+ + {/** TODO: Determine read more link here */} + +
+
+
+ ); } diff --git a/apps/tangle-dapp/components/GlassCard/GlassCard.tsx b/apps/tangle-dapp/components/GlassCard/GlassCard.tsx index 476e661f5..3447bbb95 100644 --- a/apps/tangle-dapp/components/GlassCard/GlassCard.tsx +++ b/apps/tangle-dapp/components/GlassCard/GlassCard.tsx @@ -5,13 +5,22 @@ import { twMerge } from 'tailwind-merge'; import { GlassCardProps } from './types'; const GlassCard = forwardRef, GlassCardProps>( - ({ children, className, ...props }, ref) => { + ( + { + children, + className, + bgClassName = 'bg-glass dark:bg-glass_dark', + ...props + }, + ref, + ) => { return ( diff --git a/apps/tangle-dapp/components/GlassCard/types.ts b/apps/tangle-dapp/components/GlassCard/types.ts index fb296e46e..04328690c 100644 --- a/apps/tangle-dapp/components/GlassCard/types.ts +++ b/apps/tangle-dapp/components/GlassCard/types.ts @@ -1,3 +1,5 @@ import { ComponentProps } from 'react'; -export type GlassCardProps = ComponentProps<'div'>; +export type GlassCardProps = ComponentProps<'div'> & { + bgClassName?: string; +}; From b3f31ad0e14ceb90e45040fac437c102e08d15d4 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Thu, 29 Aug 2024 00:00:06 +0700 Subject: [PATCH 03/51] fix(tangle-dapp): Improve mobile view of restake overview --- apps/tangle-dapp/app/restake/page.tsx | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/apps/tangle-dapp/app/restake/page.tsx b/apps/tangle-dapp/app/restake/page.tsx index ff81892d9..eea121a9a 100644 --- a/apps/tangle-dapp/app/restake/page.tsx +++ b/apps/tangle-dapp/app/restake/page.tsx @@ -1,6 +1,6 @@ import Button from '@webb-tools/webb-ui-components/components/buttons/Button'; import { Typography } from '@webb-tools/webb-ui-components/typography/Typography'; -import cx from 'classnames'; +import { twMerge } from 'tailwind-merge'; import GlassCard from '../../components/GlassCard/GlassCard'; import StatItem from '../../components/LiquidStaking/StatItem'; @@ -18,20 +18,23 @@ const CONTENT = { 'Tangle combines restaking with omnichain assets to provide a multi-asset crypto-economically secured compute infrastructure.', } as const; +const minHeightClsx = 'min-h-[233px]'; + export default function RestakePage() { return (
-
+
{CONTENT.OVERVIEW} @@ -43,7 +46,9 @@ export default function RestakePage() {
- +
Date: Thu, 29 Aug 2024 00:10:30 +0700 Subject: [PATCH 04/51] feat(tangle-dapp): Scaffold restake overview tabs --- apps/tangle-dapp/app/restake/page.tsx | 33 ++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/apps/tangle-dapp/app/restake/page.tsx b/apps/tangle-dapp/app/restake/page.tsx index eea121a9a..725fc7006 100644 --- a/apps/tangle-dapp/app/restake/page.tsx +++ b/apps/tangle-dapp/app/restake/page.tsx @@ -1,4 +1,6 @@ import Button from '@webb-tools/webb-ui-components/components/buttons/Button'; +import { TableAndChartTabs } from '@webb-tools/webb-ui-components/components/TableAndChartTabs'; +import { TabContent } from '@webb-tools/webb-ui-components/components/Tabs/TabContent'; import { Typography } from '@webb-tools/webb-ui-components/typography/Typography'; import { twMerge } from 'tailwind-merge'; @@ -20,9 +22,13 @@ const CONTENT = { const minHeightClsx = 'min-h-[233px]'; +const RESTAKE_VAULTS_TAB = 'Restake Vaults'; + +const OPERATORS_TAB = 'Operators'; + export default function RestakePage() { return ( -
+
+ + } + placeholder="Search validators..." + value={searchValue} + onChange={(val) => setSearchValue(val)} + isControlled + className="w-2/5" + /> + } */ + > + + TODO: Implement Restake Vaults + + + + TODO: Implement Operators Table + +
); } From e35b18cba95948fef209584f604fa4bbd2be6e10 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Thu, 29 Aug 2024 01:14:04 +0700 Subject: [PATCH 05/51] feat(tangle-dapp): Implement operators table for reusable --- .../app/blueprints/[name]/OperatorsTable.tsx | 239 +---------------- .../app/blueprints/[name]/TvlTable.tsx | 8 +- apps/tangle-dapp/app/restake/page.tsx | 17 +- .../components/tables/Operators/index.tsx | 248 ++++++++++++++++++ .../components/tables/Operators/types.ts | 21 ++ .../tables}/TableCellWrapper.tsx | 0 6 files changed, 294 insertions(+), 239 deletions(-) create mode 100644 apps/tangle-dapp/components/tables/Operators/index.tsx create mode 100644 apps/tangle-dapp/components/tables/Operators/types.ts rename apps/tangle-dapp/{app/blueprints/[name] => components/tables}/TableCellWrapper.tsx (100%) diff --git a/apps/tangle-dapp/app/blueprints/[name]/OperatorsTable.tsx b/apps/tangle-dapp/app/blueprints/[name]/OperatorsTable.tsx index 5d2b2a692..a4b96481f 100644 --- a/apps/tangle-dapp/app/blueprints/[name]/OperatorsTable.tsx +++ b/apps/tangle-dapp/app/blueprints/[name]/OperatorsTable.tsx @@ -1,206 +1,14 @@ 'use client'; -import { - createColumnHelper, - getCoreRowModel, - getPaginationRowModel, - getSortedRowModel, - SortingState, - useReactTable, -} from '@tanstack/react-table'; -import { getExplorerURI } from '@webb-tools/api-provider-environment/transaction/utils'; -import { - Avatar, - Button, - ExternalLinkIcon, - getRoundedAmountString, - shortenString, - Table, - Typography, -} from '@webb-tools/webb-ui-components'; -import Link from 'next/link'; -import { FC, useMemo, useState } from 'react'; -import { twMerge } from 'tailwind-merge'; +import { Typography } from '@webb-tools/webb-ui-components/typography/Typography'; +import type { FC } from 'react'; -import LsTokenIcon from '../../../components/LsTokenIcon'; -import { TableStatus } from '../../../components/TableStatus'; -import useNetworkStore from '../../../context/useNetworkStore'; -import { ExplorerType } from '../../../types'; -import { Operator } from '../../../types/blueprint'; -import { getSortAddressOrIdentityFnc } from '../../../utils/table'; -import TableCellWrapper from './TableCellWrapper'; +import OperatorsTableUI from '../../../components/tables/Operators'; import useOperators from './useOperators'; -const columnHelper = createColumnHelper(); - -const staticColumns = [ - columnHelper.accessor('restakersCount', { - header: () => 'Restakers', - cell: (props) => ( - - - {props.getValue()} - - - ), - }), - columnHelper.accessor('concentration', { - header: () => 'Concentration', - cell: (props) => ( - - - {props.getValue().toFixed(2)}% - - - ), - }), - columnHelper.accessor('liquidity', { - header: () => 'Liquidity', - cell: (props) => ( - -
- - {getRoundedAmountString(props.getValue().amount)} - - - ${getRoundedAmountString(props.getValue().usdValue)} - -
-
- ), - sortingFn: (rowA, rowB) => { - return rowA.original.liquidity.amount - rowB.original.liquidity.amount; - }, - }), - columnHelper.accessor('vaults', { - header: () => 'Vaults', - cell: (props) => ( - -
- {props - .getValue() - .sort() // sort alphabetically - .map((vault, index) => ( - - ))} -
-
- ), - enableSorting: false, - }), - columnHelper.accessor('address', { - header: () => null, - cell: () => ( - -
- {/* TODO: add proper href */} - - - - - {/* TODO: add proper href */} - - - -
-
- ), - }), -]; - const OperatorsTable: FC = () => { - const { network } = useNetworkStore(); const operators = useOperators(); - const [sorting, setSorting] = useState([ - { id: 'restakersCount', desc: true }, - ]); - - const columns = useMemo( - () => [ - columnHelper.accessor('address', { - header: () => 'Identity', - cell: (props) => { - const { address, identityName: identity } = props.row.original; - const accountExplorerLink = getExplorerURI( - network.nativeExplorerUrl ?? network.polkadotJsDashboardUrl, - address, - 'address', - ExplorerType.Substrate, - ).toString(); - - return ( - -
- - -
- - {identity === address ? shortenString(address) : identity} - -
- - {shortenString(address)} - - -
-
-
-
- ); - }, - sortingFn: getSortAddressOrIdentityFnc(), - }), - ...staticColumns, - ], - [network.nativeExplorerUrl, network.polkadotJsDashboardUrl], - ); - - const table = useReactTable({ - data: operators, - columns, - getCoreRowModel: getCoreRowModel(), - getSortedRowModel: getSortedRowModel(), - getPaginationRowModel: getPaginationRowModel(), - onSortingChange: setSorting, - state: { - sorting, - }, - getRowId: (row) => row.address, - autoResetPageIndex: false, - enableSortingRemoval: false, - }); - return (
{/* TODO: add name here */} @@ -208,37 +16,16 @@ const OperatorsTable: FC = () => { Operators - {operators.length === 0 ? ( - - ) : ( - - )} + ({ + address: o.address, + identityName: o.identityName, + restakersCount: o.restakersCount, + concentrationPercentage: o.concentration, + tvlInUsd: o.liquidity.usdValue, + vaultTokens: o.vaults, + }))} + /> ); }; diff --git a/apps/tangle-dapp/app/blueprints/[name]/TvlTable.tsx b/apps/tangle-dapp/app/blueprints/[name]/TvlTable.tsx index c6da65e0c..b03f09518 100644 --- a/apps/tangle-dapp/app/blueprints/[name]/TvlTable.tsx +++ b/apps/tangle-dapp/app/blueprints/[name]/TvlTable.tsx @@ -22,8 +22,8 @@ import { FC, useCallback, useState } from 'react'; import { twMerge } from 'tailwind-merge'; import LsTokenIcon from '../../../components/LsTokenIcon'; +import TableCellWrapper from '../../../components/tables/TableCellWrapper'; import { Vault } from '../../../types/blueprint'; -import TableCellWrapper from './TableCellWrapper'; import useVaults from './useVaults'; import VaultAssetsTable from './VaultAssetsTable'; @@ -102,12 +102,12 @@ const columns = [ header: () => null, cell: ({ row }) => ( -
+
{/* TODO: add proper href */} + + + {/* TODO: add proper href */} + + + +
+ + ), + enableSorting: false, + }), +]; + +const OperatorsTable: FC = ({ + operators = [], + isLoading, + loadingTableProps, + emptyTableProps, + tableProps, +}) => { + const table = useReactTable({ + data: operators, + columns, + getCoreRowModel: getCoreRowModel(), + getSortedRowModel: getSortedRowModel(), + getPaginationRowModel: getPaginationRowModel(), + initialState: { + sorting: [ + { + id: 'restakersCount', + desc: true, + }, + ], + }, + getRowId: (row) => row.address, + autoResetPageIndex: false, + enableSortingRemoval: false, + }); + + if (isLoading) { + return ( + + ); + } + + if (operators.length === 0) { + return ( + + ); + } + + return ( +
+ ); +}; + +export default OperatorsTable; diff --git a/apps/tangle-dapp/components/tables/Operators/types.ts b/apps/tangle-dapp/components/tables/Operators/types.ts new file mode 100644 index 000000000..c29de4db5 --- /dev/null +++ b/apps/tangle-dapp/components/tables/Operators/types.ts @@ -0,0 +1,21 @@ +import type { Table } from '@webb-tools/webb-ui-components/components/Table'; +import type { ComponentProps } from 'react'; + +import type { TableStatus } from '../../TableStatus'; + +export type OperatorData = { + address: string; + identityName: string; + restakersCount: number; + concentrationPercentage: number; + tvlInUsd: number; + vaultTokens: string[]; +}; + +export type Props = { + isLoading?: boolean; + operators?: OperatorData[]; + loadingTableProps?: ComponentProps; + emptyTableProps?: ComponentProps; + tableProps?: ComponentProps; +}; diff --git a/apps/tangle-dapp/app/blueprints/[name]/TableCellWrapper.tsx b/apps/tangle-dapp/components/tables/TableCellWrapper.tsx similarity index 100% rename from apps/tangle-dapp/app/blueprints/[name]/TableCellWrapper.tsx rename to apps/tangle-dapp/components/tables/TableCellWrapper.tsx From 1e000707215051e0578a525c808cd523358f4ede Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Thu, 29 Aug 2024 16:53:00 +0700 Subject: [PATCH 06/51] feat(tangle-dapp): Adding vaults table --- .../app/blueprints/[name]/OperatorsTable.tsx | 2 +- .../app/blueprints/[name]/TvlTable.tsx | 215 +++--------------- .../blueprints/[name]/VaultAssetsTable.tsx | 73 +----- .../app/blueprints/[name]/useVaultAssets.tsx | 3 +- apps/tangle-dapp/app/restake/page.tsx | 3 +- .../components/Sidebar/sidebarProps.ts | 3 +- .../components/tables/Operators/index.tsx | 25 +- .../components/tables/Operators/types.ts | 8 +- .../components/tables/VaultAssets/index.tsx | 71 ++++++ .../components/tables/VaultAssets/types.ts | 11 + .../components/tables/Vaults/index.tsx | 215 ++++++++++++++++++ .../components/tables/Vaults/types.ts | 20 ++ apps/tangle-dapp/components/tables/shared.ts | 9 + 13 files changed, 379 insertions(+), 279 deletions(-) create mode 100644 apps/tangle-dapp/components/tables/VaultAssets/index.tsx create mode 100644 apps/tangle-dapp/components/tables/VaultAssets/types.ts create mode 100644 apps/tangle-dapp/components/tables/Vaults/index.tsx create mode 100644 apps/tangle-dapp/components/tables/Vaults/types.ts create mode 100644 apps/tangle-dapp/components/tables/shared.ts diff --git a/apps/tangle-dapp/app/blueprints/[name]/OperatorsTable.tsx b/apps/tangle-dapp/app/blueprints/[name]/OperatorsTable.tsx index a4b96481f..ffbd8dbdd 100644 --- a/apps/tangle-dapp/app/blueprints/[name]/OperatorsTable.tsx +++ b/apps/tangle-dapp/app/blueprints/[name]/OperatorsTable.tsx @@ -17,7 +17,7 @@ const OperatorsTable: FC = () => { ({ + data={operators.map((o) => ({ address: o.address, identityName: o.identityName, restakersCount: o.restakersCount, diff --git a/apps/tangle-dapp/app/blueprints/[name]/TvlTable.tsx b/apps/tangle-dapp/app/blueprints/[name]/TvlTable.tsx index b03f09518..7ca77588f 100644 --- a/apps/tangle-dapp/app/blueprints/[name]/TvlTable.tsx +++ b/apps/tangle-dapp/app/blueprints/[name]/TvlTable.tsx @@ -1,206 +1,45 @@ 'use client'; -import { - createColumnHelper, - getCoreRowModel, - getExpandedRowModel, - getPaginationRowModel, - getSortedRowModel, - Row, - SortingState, - useReactTable, -} from '@tanstack/react-table'; -import { ChevronUp } from '@webb-tools/icons'; -import { - Button, - getRoundedAmountString, - Table, - Typography, -} from '@webb-tools/webb-ui-components'; -import Link from 'next/link'; -import { FC, useCallback, useState } from 'react'; -import { twMerge } from 'tailwind-merge'; +import { Typography } from '@webb-tools/webb-ui-components'; +import { FC } from 'react'; -import LsTokenIcon from '../../../components/LsTokenIcon'; -import TableCellWrapper from '../../../components/tables/TableCellWrapper'; -import { Vault } from '../../../types/blueprint'; +import VaultsTable from '../../../components/tables/Vaults'; import useVaults from './useVaults'; import VaultAssetsTable from './VaultAssetsTable'; -const columnHelper = createColumnHelper(); - -const columns = [ - columnHelper.accessor('name', { - header: () => 'Vault', - cell: (props) => ( - -
- - - {props.getValue()} - -
-
- ), - sortingFn: (rowA, rowB) => { - // NOTE: the sorting is reversed by default - return rowB.original.name.localeCompare(rowA.original.name); - }, - sortDescFirst: true, - }), - columnHelper.accessor('apy', { - header: () => 'APY', - cell: (props) => ( - - - {props.getValue().toFixed(2)}% - - - ), - }), - columnHelper.accessor('tokensCount', { - header: () => 'Tokens', - cell: (props) => ( - - - {props.getValue()} - - - ), - }), - columnHelper.accessor('liquidity', { - header: () => 'Liquidity', - cell: (props) => ( - -
- - {getRoundedAmountString(props.getValue().amount)} - - - ${getRoundedAmountString(props.getValue().usdValue)} - -
-
- ), - }), - columnHelper.accessor('lstToken', { - header: () => null, - cell: ({ row }) => ( - -
- {/* TODO: add proper href */} - - - - - -
-
- ), - enableSorting: false, - }), -]; - const TvlTable: FC = () => { const vaults = useVaults(); - const [sorting, setSorting] = useState([ - { id: 'apy', desc: true }, - ]); - - const getExpandedRowContent = (row: Row) => { - return ( -
- -
- ); - }; - - const table = useReactTable({ - data: vaults, - columns, - getCoreRowModel: getCoreRowModel(), - getExpandedRowModel: getExpandedRowModel(), - getSortedRowModel: getSortedRowModel(), - getPaginationRowModel: getPaginationRowModel(), - onSortingChange: setSorting, - state: { - sorting, - }, - autoResetPageIndex: false, - enableSortingRemoval: false, - }); - - const onRowClick = useCallback( - (row: Row) => { - if (row.original.tokensCount === 0) return; - table.setExpanded({ [row.id]: !row.getIsExpanded() }); - }, - [table], - ); - return (
Total Value Locked -
({ + apyPercentage: v.apy, + name: v.name, + representToken: v.lstToken, + tokensCount: v.tokensCount, + tvlInUsd: v.liquidity.usdValue, + }))} + tableProps={{ + onRowClick(row) { + if (!row.getCanExpand()) return; + return row.toggleExpanded(); + }, + getExpandedRowContent(row) { + return ( +
+ +
+ ); + }, + }} /> ); diff --git a/apps/tangle-dapp/app/blueprints/[name]/VaultAssetsTable.tsx b/apps/tangle-dapp/app/blueprints/[name]/VaultAssetsTable.tsx index 3df6f57f5..257bfa4ff 100644 --- a/apps/tangle-dapp/app/blueprints/[name]/VaultAssetsTable.tsx +++ b/apps/tangle-dapp/app/blueprints/[name]/VaultAssetsTable.tsx @@ -1,81 +1,30 @@ 'use client'; -import { - createColumnHelper, - getCoreRowModel, - getSortedRowModel, - SortingState, - useReactTable, -} from '@tanstack/react-table'; -import { getRoundedAmountString, Table } from '@webb-tools/webb-ui-components'; -import { FC, useState } from 'react'; -import { twMerge } from 'tailwind-merge'; +import { FC } from 'react'; -import { VaultAsset } from '../../../types/blueprint'; -import { LiquidStakingToken } from '../../../types/liquidStaking'; +import VaultAssetsTableUI from '../../../components/tables/VaultAssets'; import useVaultAssets from './useVaultAssets'; interface VaultAssetsTableProps { - LSTTokenIcon: LiquidStakingToken; + LSTTokenIcon: string; isShown: boolean; } -const columnHelper = createColumnHelper(); - -const columns = [ - columnHelper.accessor('id', { - header: () => 'Asset ID', - cell: (props) => props.getValue(), - }), - columnHelper.accessor('symbol', { - header: () => 'Asset Symbol', - cell: (props) => props.getValue(), - }), - columnHelper.accessor('tvl', { - header: () => 'TVL', - cell: (props) => getRoundedAmountString(props.getValue()), - }), - columnHelper.accessor('myStake', { - header: () => 'My Stake', - cell: (props) => getRoundedAmountString(props.getValue()), - }), -]; - const VaultAssetsTable: FC = ({ LSTTokenIcon, isShown, }) => { const data = useVaultAssets(LSTTokenIcon); - const [sorting, setSorting] = useState([ - { id: 'tvl', desc: true }, - ]); - - const table = useReactTable({ - data, - columns, - getCoreRowModel: getCoreRowModel(), - getSortedRowModel: getSortedRowModel(), - onSortingChange: setSorting, - state: { - sorting, - }, - getRowId: (row) => row.id, - autoResetPageIndex: false, - enableSortingRemoval: false, - }); - return ( -
({ + id: d.id, + selfStake: d.myStake, + symbol: d.symbol, + tvl: d.tvl, + }))} /> ); }; diff --git a/apps/tangle-dapp/app/blueprints/[name]/useVaultAssets.tsx b/apps/tangle-dapp/app/blueprints/[name]/useVaultAssets.tsx index 790e653e3..ed3b02eb1 100644 --- a/apps/tangle-dapp/app/blueprints/[name]/useVaultAssets.tsx +++ b/apps/tangle-dapp/app/blueprints/[name]/useVaultAssets.tsx @@ -1,9 +1,8 @@ 'use client'; import { VaultAsset } from '../../../types/blueprint'; -import { LiquidStakingToken } from '../../../types/liquidStaking'; -export default function useVaultAssets(_: LiquidStakingToken): VaultAsset[] { +export default function useVaultAssets(_: string): VaultAsset[] { return [ { id: '31234', diff --git a/apps/tangle-dapp/app/restake/page.tsx b/apps/tangle-dapp/app/restake/page.tsx index e1a5b0d9b..077dcfb61 100644 --- a/apps/tangle-dapp/app/restake/page.tsx +++ b/apps/tangle-dapp/app/restake/page.tsx @@ -9,6 +9,7 @@ import { twMerge } from 'tailwind-merge'; import GlassCard from '../../components/GlassCard/GlassCard'; import StatItem from '../../components/LiquidStaking/StatItem'; import OperatorsTable from '../../components/tables/Operators'; +import VaultsTable from '../../components/tables/Vaults'; export const dynamic = 'force-static'; @@ -95,7 +96,7 @@ export default function RestakePage() { } > - TODO: Implement Restake Vaults + diff --git a/apps/tangle-dapp/components/Sidebar/sidebarProps.ts b/apps/tangle-dapp/components/Sidebar/sidebarProps.ts index 1cb848197..c83aac08b 100644 --- a/apps/tangle-dapp/components/Sidebar/sidebarProps.ts +++ b/apps/tangle-dapp/components/Sidebar/sidebarProps.ts @@ -59,8 +59,7 @@ const SIDEBAR_STATIC_ITEMS: SideBarItemProps[] = [ }, { name: 'Restake', - // The default restake page is the deposit page. - href: PagePath.RESTAKE_DEPOSIT, + href: PagePath.RESTAKE, isInternal: true, isNext: true, Icon: TokenSwapFill, diff --git a/apps/tangle-dapp/components/tables/Operators/index.tsx b/apps/tangle-dapp/components/tables/Operators/index.tsx index e8501f47c..1e762c5d8 100644 --- a/apps/tangle-dapp/components/tables/Operators/index.tsx +++ b/apps/tangle-dapp/components/tables/Operators/index.tsx @@ -22,6 +22,7 @@ import { twMerge } from 'tailwind-merge'; import { getSortAddressOrIdentityFnc } from '../../../utils/table'; import LsTokenIcon from '../../LsTokenIcon'; import { TableStatus } from '../../TableStatus'; +import { sharedTableStatusClxs } from '../shared'; import TableCellWrapper from '../TableCellWrapper'; import type { OperatorData, Props } from './types'; @@ -145,14 +146,14 @@ const columns = [ ]; const OperatorsTable: FC = ({ - operators = [], + data = [], isLoading, loadingTableProps, emptyTableProps, tableProps, }) => { const table = useReactTable({ - data: operators, + data, columns, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), @@ -177,33 +178,19 @@ const OperatorsTable: FC = ({ description="Please wait while we load the operators." icon="🔄" {...loadingTableProps} - className={twMerge( - 'relative px-6 py-10 rounded-2xl !bg-[unset] border-mono-0 dark:border-mono-160', - 'bg-[linear-gradient(180deg,rgba(255,255,255,0.20)0%,rgba(255,255,255,0.00)100%)]', - 'dark:bg-[linear-gradient(180deg,rgba(43,47,64,0.20)0%,rgba(43,47,64,0.00)100%)]', - 'before:absolute before:inset-0 before:bg-cover before:bg-no-repeat before:opacity-30 before:pointer-events-none', - "before:bg-[url('/static/assets/blueprints/grid-bg.png')] dark:before:bg-[url('/static/assets/blueprints/grid-bg-dark.png')]", - loadingTableProps?.className, - )} + className={twMerge(sharedTableStatusClxs, loadingTableProps?.className)} /> ); } - if (operators.length === 0) { + if (data.length === 0) { return ( ); } diff --git a/apps/tangle-dapp/components/tables/Operators/types.ts b/apps/tangle-dapp/components/tables/Operators/types.ts index c29de4db5..21c78b64b 100644 --- a/apps/tangle-dapp/components/tables/Operators/types.ts +++ b/apps/tangle-dapp/components/tables/Operators/types.ts @@ -14,8 +14,8 @@ export type OperatorData = { export type Props = { isLoading?: boolean; - operators?: OperatorData[]; - loadingTableProps?: ComponentProps; - emptyTableProps?: ComponentProps; - tableProps?: ComponentProps; + data?: OperatorData[]; + loadingTableProps?: Partial>; + emptyTableProps?: Partial>; + tableProps?: Partial>; }; diff --git a/apps/tangle-dapp/components/tables/VaultAssets/index.tsx b/apps/tangle-dapp/components/tables/VaultAssets/index.tsx new file mode 100644 index 000000000..511cbc0b6 --- /dev/null +++ b/apps/tangle-dapp/components/tables/VaultAssets/index.tsx @@ -0,0 +1,71 @@ +import { + createColumnHelper, + getCoreRowModel, + getSortedRowModel, + type TableOptions, + useReactTable, +} from '@tanstack/react-table'; +import { Table } from '@webb-tools/webb-ui-components/components/Table'; +import { getRoundedAmountString } from '@webb-tools/webb-ui-components/utils/getRoundedAmountString'; +import { FC, useMemo } from 'react'; +import { twMerge } from 'tailwind-merge'; + +import type { Props, VaultAssetData } from './types'; + +const columnHelper = createColumnHelper(); + +const columns = [ + columnHelper.accessor('id', { + header: () => 'Asset ID', + cell: (props) => props.getValue(), + }), + columnHelper.accessor('symbol', { + header: () => 'Asset Symbol', + cell: (props) => props.getValue(), + }), + columnHelper.accessor('tvl', { + header: () => 'TVL', + cell: (props) => getRoundedAmountString(props.getValue()), + }), + columnHelper.accessor('selfStake', { + header: () => 'My Stake', + cell: (props) => getRoundedAmountString(props.getValue()), + }), +]; + +const VaultAssetsTable: FC = ({ data = [], isShown }) => { + const table = useReactTable( + useMemo( + () => + ({ + data, + columns, + getCoreRowModel: getCoreRowModel(), + getSortedRowModel: getSortedRowModel(), + initialState: { + sorting: [{ id: 'tvl', desc: true }], + }, + getRowId: (row) => row.id, + autoResetPageIndex: false, + enableSortingRemoval: false, + }) satisfies TableOptions, + [data], + ), + ); + + return ( +
+ ); +}; + +export default VaultAssetsTable; diff --git a/apps/tangle-dapp/components/tables/VaultAssets/types.ts b/apps/tangle-dapp/components/tables/VaultAssets/types.ts new file mode 100644 index 000000000..603690776 --- /dev/null +++ b/apps/tangle-dapp/components/tables/VaultAssets/types.ts @@ -0,0 +1,11 @@ +export type VaultAssetData = { + id: string; + symbol: string; + tvl: number; + selfStake: number; +}; + +export type Props = { + isShown?: boolean; + data?: VaultAssetData[]; +}; diff --git a/apps/tangle-dapp/components/tables/Vaults/index.tsx b/apps/tangle-dapp/components/tables/Vaults/index.tsx new file mode 100644 index 000000000..cb9fb9b0a --- /dev/null +++ b/apps/tangle-dapp/components/tables/Vaults/index.tsx @@ -0,0 +1,215 @@ +'use client'; + +import { + createColumnHelper, + getCoreRowModel, + getExpandedRowModel, + getPaginationRowModel, + getSortedRowModel, + TableOptions, + useReactTable, +} from '@tanstack/react-table'; +import { ChevronUp } from '@webb-tools/icons/ChevronUp'; +import Button from '@webb-tools/webb-ui-components/components/buttons/Button'; +import { Table } from '@webb-tools/webb-ui-components/components/Table'; +import { Typography } from '@webb-tools/webb-ui-components/typography/Typography'; +import { getRoundedAmountString } from '@webb-tools/webb-ui-components/utils/getRoundedAmountString'; +import Link from 'next/link'; +import { FC, useMemo } from 'react'; +import { twMerge } from 'tailwind-merge'; + +import LsTokenIcon from '../../LsTokenIcon'; +import { TableStatus } from '../../TableStatus'; +import { sharedTableStatusClxs } from '../shared'; +import TableCellWrapper from '../TableCellWrapper'; +import type { Props, VaultData } from './types'; + +const columnHelper = createColumnHelper(); + +const columns = [ + columnHelper.accessor('name', { + header: () => 'Vault', + cell: (props) => ( + +
+ + + {props.getValue()} + +
+
+ ), + sortingFn: (rowA, rowB) => { + // NOTE: the sorting is reversed by default + return rowB.original.name.localeCompare(rowA.original.name); + }, + sortDescFirst: true, + }), + columnHelper.accessor('apyPercentage', { + header: () => 'APY', + cell: (props) => ( + + + {props.getValue().toFixed(2)}% + + + ), + }), + columnHelper.accessor('tokensCount', { + header: () => 'Tokens', + cell: (props) => ( + + + {props.getValue()} + + + ), + }), + columnHelper.accessor('tvlInUsd', { + header: () => 'Liquidity', + cell: (props) => ( + + + ${getRoundedAmountString(props.getValue())} + + + ), + }), + columnHelper.display({ + id: 'actions', + header: () => null, + cell: ({ row }) => ( + +
+ + + +
+
+ ), + enableSorting: false, + }), +]; + +const VaultsTable: FC = ({ + data = [], + isLoading, + emptyTableProps, + loadingTableProps, + tableProps, +}) => { + const table = useReactTable( + useMemo( + () => + ({ + data, + columns, + initialState: { + sorting: [ + { + id: 'apy', + desc: true, + }, + ], + }, + getCoreRowModel: getCoreRowModel(), + getExpandedRowModel: getExpandedRowModel(), + getSortedRowModel: getSortedRowModel(), + getPaginationRowModel: getPaginationRowModel(), + getRowCanExpand: (row) => row.original.tokensCount > 0, + autoResetPageIndex: false, + enableSortingRemoval: false, + }) satisfies TableOptions, + [data], + ), + ); + + if (isLoading) { + return ( + + ); + } + + if (data.length === 0) { + return ( + + ); + } + + return ( +
+ ); +}; + +export default VaultsTable; diff --git a/apps/tangle-dapp/components/tables/Vaults/types.ts b/apps/tangle-dapp/components/tables/Vaults/types.ts new file mode 100644 index 000000000..6dbae77b4 --- /dev/null +++ b/apps/tangle-dapp/components/tables/Vaults/types.ts @@ -0,0 +1,20 @@ +import type { Table } from '@webb-tools/webb-ui-components/components/Table'; +import type { ComponentProps } from 'react'; + +import type { TableStatus } from '../../TableStatus'; + +export type VaultData = { + name: string; + apyPercentage: number; + tokensCount: number; + tvlInUsd: number; + representToken: string; +}; + +export type Props = { + data?: VaultData[]; + isLoading?: boolean; + loadingTableProps?: Partial>; + emptyTableProps?: Partial>; + tableProps?: Partial>>; +}; diff --git a/apps/tangle-dapp/components/tables/shared.ts b/apps/tangle-dapp/components/tables/shared.ts new file mode 100644 index 000000000..73f0399fb --- /dev/null +++ b/apps/tangle-dapp/components/tables/shared.ts @@ -0,0 +1,9 @@ +import { twMerge } from 'tailwind-merge'; + +export const sharedTableStatusClxs = twMerge( + 'relative px-6 py-10 rounded-2xl !bg-[unset] border-mono-0 dark:border-mono-160', + 'bg-[linear-gradient(180deg,rgba(255,255,255,0.20)0%,rgba(255,255,255,0.00)100%)]', + 'dark:bg-[linear-gradient(180deg,rgba(43,47,64,0.20)0%,rgba(43,47,64,0.00)100%)]', + 'before:absolute before:inset-0 before:bg-cover before:bg-no-repeat before:opacity-30 before:pointer-events-none', + "before:bg-[url('/static/assets/blueprints/grid-bg.png')] dark:before:bg-[url('/static/assets/blueprints/grid-bg-dark.png')]", +); From 26c9bc83b26ad5e9f1ff490bdda77207326ff921 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Thu, 29 Aug 2024 19:31:04 +0700 Subject: [PATCH 07/51] feat(tangle-dapp): Integrate data for vaults and operators --- .../app/blueprints/[name]/TvlTable.tsx | 1 + apps/tangle-dapp/app/restake/TableTabs.tsx | 147 ++++++++++++++++++ apps/tangle-dapp/app/restake/page.tsx | 33 +--- .../components/tables/Operators/index.tsx | 58 ++++--- .../components/tables/VaultAssets/index.tsx | 1 - .../components/tables/Vaults/index.tsx | 4 +- .../components/tables/Vaults/types.ts | 1 + .../src/components/Table/Table.tsx | 2 +- 8 files changed, 191 insertions(+), 56 deletions(-) create mode 100644 apps/tangle-dapp/app/restake/TableTabs.tsx diff --git a/apps/tangle-dapp/app/blueprints/[name]/TvlTable.tsx b/apps/tangle-dapp/app/blueprints/[name]/TvlTable.tsx index 7ca77588f..339db877a 100644 --- a/apps/tangle-dapp/app/blueprints/[name]/TvlTable.tsx +++ b/apps/tangle-dapp/app/blueprints/[name]/TvlTable.tsx @@ -18,6 +18,7 @@ const TvlTable: FC = () => { ({ + id: v.name, apyPercentage: v.apy, name: v.name, representToken: v.lstToken, diff --git a/apps/tangle-dapp/app/restake/TableTabs.tsx b/apps/tangle-dapp/app/restake/TableTabs.tsx new file mode 100644 index 000000000..8815f14a4 --- /dev/null +++ b/apps/tangle-dapp/app/restake/TableTabs.tsx @@ -0,0 +1,147 @@ +'use client'; + +import { TableAndChartTabs } from '@webb-tools/webb-ui-components/components/TableAndChartTabs'; +import { TabContent } from '@webb-tools/webb-ui-components/components/Tabs/TabContent'; +import { type ComponentProps, useMemo } from 'react'; + +import OperatorsTable from '../../components/tables/Operators'; +import VaultAssetsTable from '../../components/tables/VaultAssets'; +import VaultsTable from '../../components/tables/Vaults'; +import { useRestakeContext } from '../../context/RestakeContext'; +import useRestakeOperatorMap from '../../data/restake/useRestakeOperatorMap'; +import useIdentities from '../../data/useIdentities'; + +const RESTAKE_VAULTS_TAB = 'Restake Vaults'; + +const OPERATORS_TAB = 'Operators'; + +type OperatorUI = NonNullable< + ComponentProps['data'] +>[number]; + +type VaultUI = NonNullable['data']>[number]; + +type VaultAssetUI = NonNullable< + ComponentProps['data'] +>[number]; + +const TableTabs = () => { + const { operatorMap } = useRestakeOperatorMap(); + const { assetMap } = useRestakeContext(); + + const { result: identities } = useIdentities( + useMemo(() => Object.keys(operatorMap), [operatorMap]), + ); + + const operators = useMemo( + () => + Object.entries(operatorMap).map( + ([address, { delegationCount, delegations }]) => { + const vaultTokens = delegations + .map((delegation) => assetMap[delegation.assetId]?.symbol) + .filter(Boolean); + + return { + address, + // TODO: Calculate concentration percentage + concentrationPercentage: 0, + identityName: identities[address]?.name ?? '', + restakersCount: delegationCount, + // TODO: Calculate tvl in USD + tvlInUsd: 0, + vaultTokens, + }; + }, + ), + [assetMap, identities, operatorMap], + ); + + // Recalculate vaults (pools) data from assetMap + const vaults = useMemo(() => { + const vaults: Record = {}; + + for (const { poolId, name, symbol } of Object.values(assetMap)) { + if (poolId === null) continue; + + if (vaults[poolId] === undefined) { + vaults[poolId] = { + id: poolId, + // TODO: Calculate APY + apyPercentage: 0, + // TODO: Find out a proper way to get the pool name, now it's the first token name + name: name, + // TODO: Find out a proper way to get the pool symbol, now it's the first token symbol + representToken: symbol, + tokensCount: 1, + // TODO: Calculate tvl in USD + tvlInUsd: 0, + }; + } else { + vaults[poolId].tokensCount += 1; + } + } + + return vaults; + }, [assetMap]); + + const tableProps = useMemo['tableProps']>( + () => ({ + onRowClick(row) { + if (!row.getCanExpand()) return; + return row.toggleExpanded(); + }, + getExpandedRowContent(row) { + const poolId = row.original.id; + const vaultAssets = Object.values(assetMap) + .filter((asset) => asset.poolId === poolId) + .map( + (asset) => + ({ + id: asset.id, + symbol: asset.symbol, + // TODO: Calculate tvl + tvl: 0, + // TODO: Calculate self stake + selfStake: 0, + }) satisfies VaultAssetUI, + ); + + return ( +
+ +
+ ); + }, + }), + [assetMap], + ); + + return ( + } + placeholder="Search identity or address" + className="w-1/3" + /> + } */ + > + + + + + + + + + ); +}; + +export default TableTabs; diff --git a/apps/tangle-dapp/app/restake/page.tsx b/apps/tangle-dapp/app/restake/page.tsx index 077dcfb61..5940c78f3 100644 --- a/apps/tangle-dapp/app/restake/page.tsx +++ b/apps/tangle-dapp/app/restake/page.tsx @@ -1,15 +1,10 @@ -import { Search } from '@webb-tools/icons/Search'; import Button from '@webb-tools/webb-ui-components/components/buttons/Button'; -import { Input } from '@webb-tools/webb-ui-components/components/Input'; -import { TableAndChartTabs } from '@webb-tools/webb-ui-components/components/TableAndChartTabs'; -import { TabContent } from '@webb-tools/webb-ui-components/components/Tabs/TabContent'; import { Typography } from '@webb-tools/webb-ui-components/typography/Typography'; import { twMerge } from 'tailwind-merge'; import GlassCard from '../../components/GlassCard/GlassCard'; import StatItem from '../../components/LiquidStaking/StatItem'; -import OperatorsTable from '../../components/tables/Operators'; -import VaultsTable from '../../components/tables/Vaults'; +import TableTabs from './TableTabs'; export const dynamic = 'force-static'; @@ -26,10 +21,6 @@ const CONTENT = { const minHeightClsx = 'min-h-[233px]'; -const RESTAKE_VAULTS_TAB = 'Restake Vaults'; - -const OPERATORS_TAB = 'Operators'; - export default function RestakePage() { return (
@@ -50,6 +41,7 @@ export default function RestakePage() {
+ {/* TODO: Calculate these values */} @@ -83,26 +75,7 @@ export default function RestakePage() {
- } - placeholder="Search identity or address" - className="w-1/3" - /> - } - > - - - - - - - - +
); } diff --git a/apps/tangle-dapp/components/tables/Operators/index.tsx b/apps/tangle-dapp/components/tables/Operators/index.tsx index 1e762c5d8..2bb9af543 100644 --- a/apps/tangle-dapp/components/tables/Operators/index.tsx +++ b/apps/tangle-dapp/components/tables/Operators/index.tsx @@ -105,18 +105,26 @@ const columns = [ }), columnHelper.accessor('vaultTokens', { header: () => 'Vaults', - cell: (props) => ( - -
- {props - .getValue() - .sort() // sort alphabetically - .map((vault, index) => ( - - ))} -
-
- ), + cell: (props) => { + const tokensList = props.getValue(); + + return ( + + {tokensList.length > 0 ? ( +
+ {props + .getValue() + .sort() // sort alphabetically + .map((vault, index) => ( + + ))} +
+ ) : ( + No vaults + )} +
+ ); + }, enableSorting: false, }), columnHelper.display({ @@ -126,18 +134,24 @@ const columns = [
{/* TODO: add proper href */} - - - + {/* TODO: add proper href */} - - - +
), diff --git a/apps/tangle-dapp/components/tables/VaultAssets/index.tsx b/apps/tangle-dapp/components/tables/VaultAssets/index.tsx index 511cbc0b6..161ae23e0 100644 --- a/apps/tangle-dapp/components/tables/VaultAssets/index.tsx +++ b/apps/tangle-dapp/components/tables/VaultAssets/index.tsx @@ -45,7 +45,6 @@ const VaultAssetsTable: FC = ({ data = [], isShown }) => { initialState: { sorting: [{ id: 'tvl', desc: true }], }, - getRowId: (row) => row.id, autoResetPageIndex: false, enableSortingRemoval: false, }) satisfies TableOptions, diff --git a/apps/tangle-dapp/components/tables/Vaults/index.tsx b/apps/tangle-dapp/components/tables/Vaults/index.tsx index cb9fb9b0a..8bf08607b 100644 --- a/apps/tangle-dapp/components/tables/Vaults/index.tsx +++ b/apps/tangle-dapp/components/tables/Vaults/index.tsx @@ -74,7 +74,7 @@ const columns = [ ), }), columnHelper.accessor('tvlInUsd', { - header: () => 'Liquidity', + header: () => 'TVL', cell: (props) => ( = ({ initialState: { sorting: [ { - id: 'apy', + id: 'apyPercentage', desc: true, }, ], diff --git a/apps/tangle-dapp/components/tables/Vaults/types.ts b/apps/tangle-dapp/components/tables/Vaults/types.ts index 6dbae77b4..f85386aab 100644 --- a/apps/tangle-dapp/components/tables/Vaults/types.ts +++ b/apps/tangle-dapp/components/tables/Vaults/types.ts @@ -4,6 +4,7 @@ import type { ComponentProps } from 'react'; import type { TableStatus } from '../../TableStatus'; export type VaultData = { + id: string; name: string; apyPercentage: number; tokensCount: number; diff --git a/libs/webb-ui-components/src/components/Table/Table.tsx b/libs/webb-ui-components/src/components/Table/Table.tsx index 71f5f3a5b..8d0228383 100644 --- a/libs/webb-ui-components/src/components/Table/Table.tsx +++ b/libs/webb-ui-components/src/components/Table/Table.tsx @@ -122,7 +122,7 @@ export const Table = ({ {getExpandedRowContent && row.getIsExpanded() && ( -
+ From 8f82bdb65427e686d7a0d792e0490c6d29d93931 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Thu, 29 Aug 2024 20:09:17 +0700 Subject: [PATCH 08/51] feat(tangle-dapp): Extract operators table to apply filtering --- .../app/restake/OperatorsTable.tsx | 70 +++++++++++++++++++ apps/tangle-dapp/app/restake/TableTabs.tsx | 47 +------------ .../components/tables/Operators/index.tsx | 9 +++ .../components/tables/Operators/types.ts | 2 + 4 files changed, 83 insertions(+), 45 deletions(-) create mode 100644 apps/tangle-dapp/app/restake/OperatorsTable.tsx diff --git a/apps/tangle-dapp/app/restake/OperatorsTable.tsx b/apps/tangle-dapp/app/restake/OperatorsTable.tsx new file mode 100644 index 000000000..e10c7a5fd --- /dev/null +++ b/apps/tangle-dapp/app/restake/OperatorsTable.tsx @@ -0,0 +1,70 @@ +'use client'; + +import { Search } from '@webb-tools/icons/Search'; +import { Input } from '@webb-tools/webb-ui-components/components/Input'; +import { ComponentProps, useMemo, useState } from 'react'; + +import OperatorsTableUI from '../../components/tables/Operators'; +import { useRestakeContext } from '../../context/RestakeContext'; +import useRestakeOperatorMap from '../../data/restake/useRestakeOperatorMap'; +import useIdentities from '../../data/useIdentities'; + +type OperatorUI = NonNullable< + ComponentProps['data'] +>[number]; + +const OperatorsTable = () => { + const [globalFilter, setGlobalFilter] = useState(''); + + const { operatorMap } = useRestakeOperatorMap(); + const { assetMap } = useRestakeContext(); + + const { result: identities } = useIdentities( + useMemo(() => Object.keys(operatorMap), [operatorMap]), + ); + + const operators = useMemo( + () => + Object.entries(operatorMap).map( + ([address, { delegationCount, delegations }]) => { + const vaultTokens = delegations + .map((delegation) => assetMap[delegation.assetId]?.symbol) + .filter(Boolean); + + return { + address, + // TODO: Calculate concentration percentage + concentrationPercentage: 0, + identityName: identities[address]?.name ?? '', + restakersCount: delegationCount, + // TODO: Calculate tvl in USD + tvlInUsd: 0, + vaultTokens, + }; + }, + ), + [assetMap, identities, operatorMap], + ); + + return ( + <> + } + placeholder="Search identity or address" + className="w-1/3 mb-4 ml-auto -mt-[54px]" + isControlled + debounceTime={500} + value={globalFilter} + onChange={setGlobalFilter} + /> + + + ); +}; + +export default OperatorsTable; diff --git a/apps/tangle-dapp/app/restake/TableTabs.tsx b/apps/tangle-dapp/app/restake/TableTabs.tsx index 8815f14a4..7719d8987 100644 --- a/apps/tangle-dapp/app/restake/TableTabs.tsx +++ b/apps/tangle-dapp/app/restake/TableTabs.tsx @@ -4,21 +4,15 @@ import { TableAndChartTabs } from '@webb-tools/webb-ui-components/components/Tab import { TabContent } from '@webb-tools/webb-ui-components/components/Tabs/TabContent'; import { type ComponentProps, useMemo } from 'react'; -import OperatorsTable from '../../components/tables/Operators'; import VaultAssetsTable from '../../components/tables/VaultAssets'; import VaultsTable from '../../components/tables/Vaults'; import { useRestakeContext } from '../../context/RestakeContext'; -import useRestakeOperatorMap from '../../data/restake/useRestakeOperatorMap'; -import useIdentities from '../../data/useIdentities'; +import OperatorsTable from './OperatorsTable'; const RESTAKE_VAULTS_TAB = 'Restake Vaults'; const OPERATORS_TAB = 'Operators'; -type OperatorUI = NonNullable< - ComponentProps['data'] ->[number]; - type VaultUI = NonNullable['data']>[number]; type VaultAssetUI = NonNullable< @@ -26,36 +20,8 @@ type VaultAssetUI = NonNullable< >[number]; const TableTabs = () => { - const { operatorMap } = useRestakeOperatorMap(); const { assetMap } = useRestakeContext(); - const { result: identities } = useIdentities( - useMemo(() => Object.keys(operatorMap), [operatorMap]), - ); - - const operators = useMemo( - () => - Object.entries(operatorMap).map( - ([address, { delegationCount, delegations }]) => { - const vaultTokens = delegations - .map((delegation) => assetMap[delegation.assetId]?.symbol) - .filter(Boolean); - - return { - address, - // TODO: Calculate concentration percentage - concentrationPercentage: 0, - identityName: identities[address]?.name ?? '', - restakersCount: delegationCount, - // TODO: Calculate tvl in USD - tvlInUsd: 0, - vaultTokens, - }; - }, - ), - [assetMap, identities, operatorMap], - ); - // Recalculate vaults (pools) data from assetMap const vaults = useMemo(() => { const vaults: Record = {}; @@ -123,22 +89,13 @@ const TableTabs = () => { } - placeholder="Search identity or address" - className="w-1/3" - /> - } */ > - + ); diff --git a/apps/tangle-dapp/components/tables/Operators/index.tsx b/apps/tangle-dapp/components/tables/Operators/index.tsx index 2bb9af543..d0094e011 100644 --- a/apps/tangle-dapp/components/tables/Operators/index.tsx +++ b/apps/tangle-dapp/components/tables/Operators/index.tsx @@ -3,6 +3,7 @@ import { createColumnHelper, getCoreRowModel, + getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, @@ -165,6 +166,8 @@ const OperatorsTable: FC = ({ loadingTableProps, emptyTableProps, tableProps, + globalFilter, + onGlobalFilterChange, }) => { const table = useReactTable({ data, @@ -172,6 +175,7 @@ const OperatorsTable: FC = ({ getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), getPaginationRowModel: getPaginationRowModel(), + getFilteredRowModel: getFilteredRowModel(), initialState: { sorting: [ { @@ -180,9 +184,14 @@ const OperatorsTable: FC = ({ }, ], }, + state: { + globalFilter, + }, + onGlobalFilterChange, getRowId: (row) => row.address, autoResetPageIndex: false, enableSortingRemoval: false, + enableGlobalFilter: true, }); if (isLoading) { diff --git a/apps/tangle-dapp/components/tables/Operators/types.ts b/apps/tangle-dapp/components/tables/Operators/types.ts index 21c78b64b..316d79850 100644 --- a/apps/tangle-dapp/components/tables/Operators/types.ts +++ b/apps/tangle-dapp/components/tables/Operators/types.ts @@ -15,6 +15,8 @@ export type OperatorData = { export type Props = { isLoading?: boolean; data?: OperatorData[]; + globalFilter?: string; + onGlobalFilterChange?: (value: string) => void; loadingTableProps?: Partial>; emptyTableProps?: Partial>; tableProps?: Partial>; From 8d6fa252dfa6eb7e998fb0b1117111a6165d1d79 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Thu, 29 Aug 2024 20:30:58 +0700 Subject: [PATCH 09/51] chore(tangle-dapp): Run format --- .../components/WalletModal/WalletModal.tsx | 185 +++++++++--------- 1 file changed, 91 insertions(+), 94 deletions(-) diff --git a/libs/webb-ui-components/src/components/WalletModal/WalletModal.tsx b/libs/webb-ui-components/src/components/WalletModal/WalletModal.tsx index ce18eaf16..89146aee0 100644 --- a/libs/webb-ui-components/src/components/WalletModal/WalletModal.tsx +++ b/libs/webb-ui-components/src/components/WalletModal/WalletModal.tsx @@ -6,111 +6,108 @@ import { WalletConnectionCard } from '../WalletConnectionCard'; import { WalletModalProps } from './types'; import WalletNotInstalledError from '@webb-tools/dapp-types/errors/WalletNotInstalledError'; -export const WalletModal: FC = - ( - { - notificationApi, - apiConfig, - connectingWalletId, - failedWalletId, - isModalOpen, - resetState, - selectedWallet, - connectWallet, - toggleModal, - connectError, - supportedWallets, - platformId, - targetTypedChainIds, - contentDefaultText, - }, - ) => { - // Get the current failed or connecting wallet - const getCurrentWallet = useCallback(() => { - const walletId = failedWalletId ?? connectingWalletId; - if (!walletId) { - return; - } +export const WalletModal: FC = ({ + notificationApi, + apiConfig, + connectingWalletId, + failedWalletId, + isModalOpen, + resetState, + selectedWallet, + connectWallet, + toggleModal, + connectError, + supportedWallets, + platformId, + targetTypedChainIds, + contentDefaultText, +}) => { + // Get the current failed or connecting wallet + const getCurrentWallet = useCallback(() => { + const walletId = failedWalletId ?? connectingWalletId; + if (!walletId) { + return; + } - return apiConfig.wallets[walletId]; - }, [apiConfig.wallets, connectingWalletId, failedWalletId]); + return apiConfig.wallets[walletId]; + }, [apiConfig.wallets, connectingWalletId, failedWalletId]); - const errorMessage = useMemo(() => { - if (!connectError) { - return; - } + const errorMessage = useMemo(() => { + if (!connectError) { + return; + } - return connectError.message; - }, [connectError]); + return connectError.message; + }, [connectError]); - const handleOpenChange = useCallback( - (isOpen: boolean) => { - toggleModal(isOpen); - }, - [toggleModal], - ); + const handleOpenChange = useCallback( + (isOpen: boolean) => { + toggleModal(isOpen); + }, + [toggleModal], + ); - const downloadURL = useMemo(() => { - if (platformId == null) return; + const downloadURL = useMemo(() => { + if (platformId == null) return; - const wallet = getCurrentWallet(); + const wallet = getCurrentWallet(); - if (wallet?.installLinks?.[platformId]) { - return new URL(wallet.installLinks[platformId]); - } - }, [getCurrentWallet, platformId]); + if (wallet?.installLinks?.[platformId]) { + return new URL(wallet.installLinks[platformId]); + } + }, [getCurrentWallet, platformId]); - const handleTryAgainBtnClick = useCallback(async () => { - if (connectError instanceof WalletNotInstalledError) { - return; - } + const handleTryAgainBtnClick = useCallback(async () => { + if (connectError instanceof WalletNotInstalledError) { + return; + } - if (!selectedWallet) { - notificationApi.addToQueue({ - variant: 'warning', - message: 'Failed to switch wallet', - secondaryMessage: 'No wallet selected. Please try again.', - }); - return; - } + if (!selectedWallet) { + notificationApi.addToQueue({ + variant: 'warning', + message: 'Failed to switch wallet', + secondaryMessage: 'No wallet selected. Please try again.', + }); + return; + } - await connectWallet(selectedWallet); - }, [connectWallet, notificationApi, selectedWallet, connectError]); + await connectWallet(selectedWallet); + }, [connectWallet, notificationApi, selectedWallet, connectError]); - return ( - - resetState()} - > - - connectWallet(nextWallet, targetTypedChainIds) - } - onClose={() => toggleModal(false)} - connectingWalletId={connectingWalletId} - errorMessage={errorMessage} - failedWalletId={failedWalletId} - onTryAgainBtnClick={handleTryAgainBtnClick} - errorBtnText={ - connectError instanceof WalletNotInstalledError - ? 'Download' - : 'Try Again' - } - tryAgainBtnProps={ - connectError instanceof WalletNotInstalledError - ? { + return ( + + resetState()} + > + + connectWallet(nextWallet, targetTypedChainIds) + } + onClose={() => toggleModal(false)} + connectingWalletId={connectingWalletId} + errorMessage={errorMessage} + failedWalletId={failedWalletId} + onTryAgainBtnClick={handleTryAgainBtnClick} + errorBtnText={ + connectError instanceof WalletNotInstalledError + ? 'Download' + : 'Try Again' + } + tryAgainBtnProps={ + connectError instanceof WalletNotInstalledError + ? { href: downloadURL?.toString(), target: '_blank', } - : {} - } - downloadWalletURL={downloadURL} - contentDefaultText={contentDefaultText} - /> - - - ); - }; + : {} + } + downloadWalletURL={downloadURL} + contentDefaultText={contentDefaultText} + /> + + + ); +}; From 802af2ff726200c7f4827c7812a040e00f8cc1a5 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Thu, 29 Aug 2024 20:50:21 +0700 Subject: [PATCH 10/51] chore: Resolve merge conflict --- ...{TvlTable.tsx => VaultsAndAssetsTable.tsx} | 4 +- .../app/blueprints/[name]/page.tsx | 4 +- .../app/blueprints/[name]/useVaults.tsx | 160 + .../app/liquid-staking/overview/page.tsx | 47 +- .../app/liquid-staking/useVaults.ts | 259 ++ .../stakeAndUnstake/LsOverviewItem.tsx | 2 +- .../{LiquidStaking => }/StatItem.tsx | 23 +- apps/tangle-dapp/components/index.ts | 1 + .../components/tableCells/HeaderCell.tsx | 9 +- .../components/tableCells/types.ts | 3 + apps/tangle-dapp/tailwind.config.js | 8 + apps/tangle-dapp/types/blueprint.ts | 3 +- apps/tangle-dapp/types/liquidStaking.ts | 23 + yarn.lock | 2585 ++++++----------- 14 files changed, 1458 insertions(+), 1673 deletions(-) rename apps/tangle-dapp/app/blueprints/[name]/{TvlTable.tsx => VaultsAndAssetsTable.tsx} (94%) create mode 100644 apps/tangle-dapp/app/liquid-staking/useVaults.ts rename apps/tangle-dapp/components/{LiquidStaking => }/StatItem.tsx (52%) diff --git a/apps/tangle-dapp/app/blueprints/[name]/TvlTable.tsx b/apps/tangle-dapp/app/blueprints/[name]/VaultsAndAssetsTable.tsx similarity index 94% rename from apps/tangle-dapp/app/blueprints/[name]/TvlTable.tsx rename to apps/tangle-dapp/app/blueprints/[name]/VaultsAndAssetsTable.tsx index 339db877a..d88968fce 100644 --- a/apps/tangle-dapp/app/blueprints/[name]/TvlTable.tsx +++ b/apps/tangle-dapp/app/blueprints/[name]/VaultsAndAssetsTable.tsx @@ -7,7 +7,7 @@ import VaultsTable from '../../../components/tables/Vaults'; import useVaults from './useVaults'; import VaultAssetsTable from './VaultAssetsTable'; -const TvlTable: FC = () => { +const VaultsAndAssetsTable: FC = () => { const vaults = useVaults(); return ( @@ -46,4 +46,4 @@ const TvlTable: FC = () => { ); }; -export default TvlTable; +export default VaultsAndAssetsTable; diff --git a/apps/tangle-dapp/app/blueprints/[name]/page.tsx b/apps/tangle-dapp/app/blueprints/[name]/page.tsx index e540a3f44..c7acffce9 100644 --- a/apps/tangle-dapp/app/blueprints/[name]/page.tsx +++ b/apps/tangle-dapp/app/blueprints/[name]/page.tsx @@ -2,7 +2,7 @@ import { FC } from 'react'; import BlueprintHeader from './BlueprintHeader'; import OperatorsTable from './OperatorsTable'; -import TvlTable from './TvlTable'; +import VaultsAndAssetsTable from './VaultsAndAssetsTable'; type Props = { params: { @@ -14,7 +14,7 @@ const BlueprintDetailsPage: FC = ({ params: { name } }) => { return (
- +
); diff --git a/apps/tangle-dapp/app/blueprints/[name]/useVaults.tsx b/apps/tangle-dapp/app/blueprints/[name]/useVaults.tsx index 94cd9e51c..bb5bd1dd3 100644 --- a/apps/tangle-dapp/app/blueprints/[name]/useVaults.tsx +++ b/apps/tangle-dapp/app/blueprints/[name]/useVaults.tsx @@ -14,6 +14,38 @@ export default function useVaults(): Vault[] { amount: 1000, usdValue: 10000, }, + assets: [ + { + id: '31234', + symbol: 'tgDOT_A', + tvl: 5588.23, + myStake: 10.12, + }, + { + id: '31235', + symbol: 'tgDOT_B', + tvl: 2044.12, + myStake: 0, + }, + { + id: '31236', + symbol: 'tgDOT_C', + tvl: 123.12, + myStake: 16, + }, + { + id: '31237', + symbol: 'tgDOT_D', + tvl: 6938.87, + myStake: 100, + }, + { + id: '31238', + symbol: 'tgDOT_E', + tvl: 0, + myStake: 0, + }, + ], }, { lstToken: LiquidStakingToken.ASTR, @@ -24,6 +56,38 @@ export default function useVaults(): Vault[] { amount: 23.34, usdValue: 233.4, }, + assets: [ + { + id: '31234', + symbol: 'tgDOT_A', + tvl: 5588.23, + myStake: 10.12, + }, + { + id: '31235', + symbol: 'tgDOT_B', + tvl: 2044.12, + myStake: 0, + }, + { + id: '31236', + symbol: 'tgDOT_C', + tvl: 123.12, + myStake: 16, + }, + { + id: '31237', + symbol: 'tgDOT_D', + tvl: 6938.87, + myStake: 100, + }, + { + id: '31238', + symbol: 'tgDOT_E', + tvl: 0, + myStake: 0, + }, + ], }, { lstToken: LiquidStakingToken.PHA, @@ -34,6 +98,38 @@ export default function useVaults(): Vault[] { amount: 50, usdValue: 500, }, + assets: [ + { + id: '31234', + symbol: 'tgDOT_A', + tvl: 5588.23, + myStake: 10.12, + }, + { + id: '31235', + symbol: 'tgDOT_B', + tvl: 2044.12, + myStake: 0, + }, + { + id: '31236', + symbol: 'tgDOT_C', + tvl: 123.12, + myStake: 16, + }, + { + id: '31237', + symbol: 'tgDOT_D', + tvl: 6938.87, + myStake: 100, + }, + { + id: '31238', + symbol: 'tgDOT_E', + tvl: 0, + myStake: 0, + }, + ], }, { lstToken: LiquidStakingToken.GLMR, @@ -44,6 +140,38 @@ export default function useVaults(): Vault[] { amount: 0, usdValue: 0, }, + assets: [ + { + id: '31234', + symbol: 'tgDOT_A', + tvl: 5588.23, + myStake: 10.12, + }, + { + id: '31235', + symbol: 'tgDOT_B', + tvl: 2044.12, + myStake: 0, + }, + { + id: '31236', + symbol: 'tgDOT_C', + tvl: 123.12, + myStake: 16, + }, + { + id: '31237', + symbol: 'tgDOT_D', + tvl: 6938.87, + myStake: 100, + }, + { + id: '31238', + symbol: 'tgDOT_E', + tvl: 0, + myStake: 0, + }, + ], }, { lstToken: LiquidStakingToken.MANTA, @@ -54,6 +182,38 @@ export default function useVaults(): Vault[] { amount: 0, usdValue: 0, }, + assets: [ + { + id: '31234', + symbol: 'tgDOT_A', + tvl: 5588.23, + myStake: 10.12, + }, + { + id: '31235', + symbol: 'tgDOT_B', + tvl: 2044.12, + myStake: 0, + }, + { + id: '31236', + symbol: 'tgDOT_C', + tvl: 123.12, + myStake: 16, + }, + { + id: '31237', + symbol: 'tgDOT_D', + tvl: 6938.87, + myStake: 100, + }, + { + id: '31238', + symbol: 'tgDOT_E', + tvl: 0, + myStake: 0, + }, + ], }, ]; } diff --git a/apps/tangle-dapp/app/liquid-staking/overview/page.tsx b/apps/tangle-dapp/app/liquid-staking/overview/page.tsx index 859d08db8..ec2d8b4db 100644 --- a/apps/tangle-dapp/app/liquid-staking/overview/page.tsx +++ b/apps/tangle-dapp/app/liquid-staking/overview/page.tsx @@ -1,59 +1,34 @@ import { Typography } from '@webb-tools/webb-ui-components'; import { FC } from 'react'; -import { GlassCard } from '../../../components'; -import LsOverviewItem from '../../../components/LiquidStaking/stakeAndUnstake/LsOverviewItem'; -import StatItem from '../../../components/LiquidStaking/StatItem'; -import { LS_PROTOCOLS } from '../../../constants/liquidStaking/constants'; -import { LsProtocolId } from '../../../constants/liquidStaking/types'; +import VaultsAndAssetsTable from '../../../components/LiquidStaking/VaultsAndAssetsTable'; +import StatItem from '../../../components/StatItem'; const LiquidStakingPage: FC = () => { return (
- +
Tangle Liquid Staking - + Get Liquid Staking Tokens (LSTs) to earn & unleash restaking on Tangle Mainnet via delegation.
- +
- - -
- - Liquid Staking Tokens - - - -
-
- {LS_PROTOCOLS.map((protocol) => { - return ( - - ); - })} -
-
-
+ +
); }; diff --git a/apps/tangle-dapp/app/liquid-staking/useVaults.ts b/apps/tangle-dapp/app/liquid-staking/useVaults.ts new file mode 100644 index 000000000..f30e4edee --- /dev/null +++ b/apps/tangle-dapp/app/liquid-staking/useVaults.ts @@ -0,0 +1,259 @@ +'use client'; + +import { LiquidStakingToken } from '../../types/liquidStaking'; +import { Vault } from '../../types/liquidStaking'; + +export default function useVaults(): Vault[] { + return [ + { + lstToken: LiquidStakingToken.DOT, + name: 'Tangle Liquid Polkadot', + tvl: { + value: 2000, + valueInUSD: 20000, + }, + derivativeTokens: 5, + myStake: { + value: 1000, + valueInUSD: 10000, + }, + assets: [ + { + id: '31234', + token: 'tgDOT_A', + tvl: 5588.23, + apy: 10.12, + myStake: 10.12, + }, + { + id: '31235', + token: 'tgDOT_B', + tvl: 2044.12, + apy: 0, + myStake: 0, + }, + { + id: '31236', + token: 'tgDOT_C', + tvl: 123.12, + apy: 16, + myStake: 16, + }, + { + id: '31237', + token: 'tgDOT_D', + tvl: 6938.87, + apy: 100, + myStake: 100, + }, + { + id: '31238', + token: 'tgDOT_E', + tvl: 0, + apy: 0, + myStake: 0, + }, + ], + }, + { + lstToken: LiquidStakingToken.ASTR, + name: 'Tangle Liquid Astar', + tvl: { + value: 48, + valueInUSD: 480, + }, + derivativeTokens: 10, + myStake: { + value: 23.34, + valueInUSD: 233.4, + }, + assets: [ + { + id: '31234', + token: 'tgDOT_A', + tvl: 5588.23, + apy: 10.12, + myStake: 10.12, + }, + { + id: '31235', + token: 'tgDOT_B', + tvl: 2044.12, + apy: 0, + myStake: 0, + }, + { + id: '31236', + token: 'tgDOT_C', + tvl: 123.12, + apy: 16, + myStake: 16, + }, + { + id: '31237', + token: 'tgDOT_D', + tvl: 6938.87, + apy: 100, + myStake: 100, + }, + { + id: '31238', + token: 'tgDOT_E', + tvl: 0, + apy: 0, + myStake: 0, + }, + ], + }, + { + lstToken: LiquidStakingToken.PHA, + name: 'Tangle Liquid Phala', + tvl: { + value: 60.13, + valueInUSD: 601.3, + }, + derivativeTokens: 7, + myStake: { + value: 50, + valueInUSD: 500, + }, + assets: [ + { + id: '31234', + token: 'tgDOT_A', + tvl: 5588.23, + apy: 10.12, + myStake: 10.12, + }, + { + id: '31235', + token: 'tgDOT_B', + tvl: 2044.12, + apy: 0, + myStake: 0, + }, + { + id: '31236', + token: 'tgDOT_C', + tvl: 123.12, + apy: 16, + myStake: 16, + }, + { + id: '31237', + token: 'tgDOT_D', + tvl: 6938.87, + apy: 100, + myStake: 100, + }, + { + id: '31238', + token: 'tgDOT_E', + tvl: 0, + apy: 0, + myStake: 0, + }, + ], + }, + { + lstToken: LiquidStakingToken.GLMR, + name: 'Tangle Liquid Glimmer', + tvl: { + value: 0, + valueInUSD: 0, + }, + derivativeTokens: 0, + myStake: { + value: 0, + valueInUSD: 0, + }, + assets: [ + { + id: '31234', + token: 'tgDOT_A', + tvl: 5588.23, + apy: 10.12, + myStake: 10.12, + }, + { + id: '31235', + token: 'tgDOT_B', + tvl: 2044.12, + apy: 0, + myStake: 0, + }, + { + id: '31236', + token: 'tgDOT_C', + tvl: 123.12, + apy: 16, + myStake: 16, + }, + { + id: '31237', + token: 'tgDOT_D', + tvl: 6938.87, + apy: 100, + myStake: 100, + }, + { + id: '31238', + token: 'tgDOT_E', + tvl: 0, + apy: 0, + myStake: 0, + }, + ], + }, + { + lstToken: LiquidStakingToken.MANTA, + name: 'Tangle Liquid Manta', + tvl: { + value: 0, + valueInUSD: 0, + }, + derivativeTokens: 0, + myStake: { + value: 0, + valueInUSD: 0, + }, + assets: [ + { + id: '31234', + token: 'tgDOT_A', + tvl: 5588.23, + apy: 10.12, + myStake: 10.12, + }, + { + id: '31235', + token: 'tgDOT_B', + tvl: 2044.12, + apy: 0, + myStake: 0, + }, + { + id: '31236', + token: 'tgDOT_C', + tvl: 123.12, + apy: 16, + myStake: 16, + }, + { + id: '31237', + token: 'tgDOT_D', + tvl: 6938.87, + apy: 100, + myStake: 100, + }, + { + id: '31238', + token: 'tgDOT_E', + tvl: 0, + apy: 0, + myStake: 0, + }, + ], + }, + ]; +} diff --git a/apps/tangle-dapp/components/LiquidStaking/stakeAndUnstake/LsOverviewItem.tsx b/apps/tangle-dapp/components/LiquidStaking/stakeAndUnstake/LsOverviewItem.tsx index b0e43ce6f..421154cbd 100644 --- a/apps/tangle-dapp/components/LiquidStaking/stakeAndUnstake/LsOverviewItem.tsx +++ b/apps/tangle-dapp/components/LiquidStaking/stakeAndUnstake/LsOverviewItem.tsx @@ -5,6 +5,7 @@ import { ArrowRight, ChainIcon } from '@webb-tools/icons'; import { Button, Chip, Typography } from '@webb-tools/webb-ui-components'; import { FC, useMemo } from 'react'; +import StatItem from '../../../components/StatItem'; import { LST_PREFIX, TVS_TOOLTIP, @@ -13,7 +14,6 @@ import { LsToken } from '../../../constants/liquidStaking/types'; import { PagePath } from '../../../types'; import formatTangleBalance from '../../../utils/formatTangleBalance'; import LsTokenIcon from '../../LsTokenIcon'; -import StatItem from '../StatItem'; export type LsOverviewItemProps = { title: string; diff --git a/apps/tangle-dapp/components/LiquidStaking/StatItem.tsx b/apps/tangle-dapp/components/StatItem.tsx similarity index 52% rename from apps/tangle-dapp/components/LiquidStaking/StatItem.tsx rename to apps/tangle-dapp/components/StatItem.tsx index 55b0a1f58..8d6867a0e 100644 --- a/apps/tangle-dapp/components/LiquidStaking/StatItem.tsx +++ b/apps/tangle-dapp/components/StatItem.tsx @@ -2,23 +2,40 @@ import { InfoIconWithTooltip, Typography, } from '@webb-tools/webb-ui-components'; +import cx from 'classnames'; import { FC } from 'react'; export type StatItemProps = { title: string; subtitle: string; tooltip?: string; + largeSubtitle?: boolean; + removeBorder?: boolean; }; -const StatItem: FC = ({ title, subtitle, tooltip }) => { +const StatItem: FC = ({ + title, + subtitle, + tooltip, + largeSubtitle = false, + removeBorder = false, +}) => { + const className = cx('flex flex-col items-start justify-center px-3', { + 'border-l dark:border-mono-120': !removeBorder, + }); + return ( -
+
{title}
- + {subtitle} diff --git a/apps/tangle-dapp/components/index.ts b/apps/tangle-dapp/components/index.ts index b73c8f101..40828dd4a 100644 --- a/apps/tangle-dapp/components/index.ts +++ b/apps/tangle-dapp/components/index.ts @@ -11,6 +11,7 @@ export * from './ServicesKeyMetricItem'; export * from './ServiceTable'; export * from './Sidebar'; export * from './skeleton'; +export { default as TableCellWrapper } from './TableCellWrapper'; export * from './TableStatus'; export { default as TangleBigLogo } from './TangleBigLogo'; export { default as TangleCard } from './TangleCard'; diff --git a/apps/tangle-dapp/components/tableCells/HeaderCell.tsx b/apps/tangle-dapp/components/tableCells/HeaderCell.tsx index bc41240e0..7d5e31e5a 100644 --- a/apps/tangle-dapp/components/tableCells/HeaderCell.tsx +++ b/apps/tangle-dapp/components/tableCells/HeaderCell.tsx @@ -7,10 +7,15 @@ import { twMerge } from 'tailwind-merge'; import { HeaderCellProps } from './types'; -const HeaderCell: FC = ({ title, tooltip, className }) => { +const HeaderCell: FC = ({ + title, + tooltip, + className, + titleVariant = 'body1', +}) => { return ( =19.0.0-rc <19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 - subscriptions-transport-ws: ^0.9.0 || ^0.11.0 - peerDependenciesMeta: - graphql-ws: - optional: true - react: - optional: true - react-dom: - optional: true - subscriptions-transport-ws: - optional: true - checksum: 10c0/b63e5c1a509ac721bfb3bfbf41d11ffc3f1460d98d297e65cad6ace2d5102d7591e6fb88297f286d7a9cfdcc7f4341cf787474a61c70a98e588ea5f6c8469435 - languageName: node - linkType: hard - "@ardatan/fast-json-stringify@npm:^0.0.6": version: 0.0.6 resolution: "@ardatan/fast-json-stringify@npm:0.0.6" @@ -228,14 +191,7 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/compat-data@npm:7.25.2" - checksum: 10c0/5bf1f14d6e5f0d37c19543e99209ff4a94bb97915e1ce01e5334a144aa08cd56b6e62ece8135dac77e126723d63d4d4b96fc603a12c43b88c28f4b5e070270c5 - languageName: node - linkType: hard - -"@babel/compat-data@npm:^7.25.4": +"@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.2, @babel/compat-data@npm:^7.25.4": version: 7.25.4 resolution: "@babel/compat-data@npm:7.25.4" checksum: 10c0/50d79734d584a28c69d6f5b99adfaa064d0f41609a378aef04eb06accc5b44f8520e68549eba3a082478180957b7d5783f1bfb1672e4ae8574e797ce8bae79fa @@ -265,27 +221,15 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.18.13, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.7.2": - version: 7.25.0 - resolution: "@babel/generator@npm:7.25.0" - dependencies: - "@babel/types": "npm:^7.25.0" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^2.5.1" - checksum: 10c0/d0e2dfcdc8bdbb5dded34b705ceebf2e0bc1b06795a1530e64fb6a3ccf313c189db7f60c1616effae48114e1a25adc75855bc4496f3779a396b3377bae718ce7 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/generator@npm:7.25.4" +"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.18.13, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.25.4, @babel/generator@npm:^7.7.2": + version: 7.25.5 + resolution: "@babel/generator@npm:7.25.5" dependencies: "@babel/types": "npm:^7.25.4" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^2.5.1" - checksum: 10c0/a2d8cc39e759214740f836360c8d9c17aa93e16e41afe73368a9e7ccd1d5c3303a420ce3aca1c9a31fdb93d1899de471d5aac97d1c64f741f8750a25a6e91fbc + checksum: 10c0/eb8af30c39476e4f4d6b953f355fcf092258291f78d65fb759b7d5e5e6fd521b5bfee64a4e2e4290279f0dcd25ccf8c49a61807828b99b5830d2b734506da1fd languageName: node linkType: hard @@ -321,24 +265,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.24.7, @babel/helper-create-class-features-plugin@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helper-create-class-features-plugin@npm:7.25.0" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-member-expression-to-functions": "npm:^7.24.8" - "@babel/helper-optimise-call-expression": "npm:^7.24.7" - "@babel/helper-replace-supers": "npm:^7.25.0" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" - "@babel/traverse": "npm:^7.25.0" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/2f8ac36cfeb45d462432acea64c78312cc9180dda7aa9337b77017961e373c323065362d2452f3d6f8bffeb254ff3f7346ac1b25c8ad7b81db813a95924f4053 - languageName: node - linkType: hard - -"@babel/helper-create-class-features-plugin@npm:^7.25.4": +"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.24.7, @babel/helper-create-class-features-plugin@npm:^7.25.0, @babel/helper-create-class-features-plugin@npm:^7.25.4": version: 7.25.4 resolution: "@babel/helper-create-class-features-plugin@npm:7.25.4" dependencies: @@ -533,18 +460,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.0.0, @babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.4, @babel/parser@npm:^7.21.8, @babel/parser@npm:^7.22.5, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.4, @babel/parser@npm:^7.24.7, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.3": - version: 7.25.3 - resolution: "@babel/parser@npm:7.25.3" - dependencies: - "@babel/types": "npm:^7.25.2" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/874b01349aedb805d6694f867a752fdc7469778fad76aca4548d2cc6ce96087c3ba5fb917a6f8d05d2d1a74aae309b5f50f1a4dba035f5a2c9fcfe6e106d2c4e - languageName: node - linkType: hard - -"@babel/parser@npm:^7.25.4": +"@babel/parser@npm:^7.0.0, @babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.4, @babel/parser@npm:^7.21.8, @babel/parser@npm:^7.22.5, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.7, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.4": version: 7.25.4 resolution: "@babel/parser@npm:7.25.4" dependencies: @@ -722,7 +638,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-class-properties@npm:^7.0.0, @babel/plugin-syntax-class-properties@npm:^7.12.13, @babel/plugin-syntax-class-properties@npm:^7.8.3": +"@babel/plugin-syntax-class-properties@npm:^7.0.0, @babel/plugin-syntax-class-properties@npm:^7.12.13": version: 7.12.13 resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" dependencies: @@ -810,7 +726,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-meta@npm:^7.10.4, @babel/plugin-syntax-import-meta@npm:^7.8.3": +"@babel/plugin-syntax-import-meta@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" dependencies: @@ -843,7 +759,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4, @babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" dependencies: @@ -865,7 +781,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-numeric-separator@npm:^7.10.4, @babel/plugin-syntax-numeric-separator@npm:^7.8.3": +"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" dependencies: @@ -920,7 +836,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-top-level-await@npm:^7.14.5, @babel/plugin-syntax-top-level-await@npm:^7.8.3": +"@babel/plugin-syntax-top-level-await@npm:^7.14.5": version: 7.14.5 resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" dependencies: @@ -932,13 +848,13 @@ __metadata: linkType: hard "@babel/plugin-syntax-typescript@npm:^7.24.7, @babel/plugin-syntax-typescript@npm:^7.3.3, @babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.24.7 - resolution: "@babel/plugin-syntax-typescript@npm:7.24.7" + version: 7.25.4 + resolution: "@babel/plugin-syntax-typescript@npm:7.25.4" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/cdabd2e8010fb0ad15b49c2c270efc97c4bfe109ead36c7bbcf22da7a74bc3e49702fc4f22f12d2d6049e8e22a5769258df1fd05f0420ae45e11bdd5bc07805a + checksum: 10c0/199919d44c73e5edee9ffd311cf638f88d26a810189e32d338c46c7600441fd5c4a2e431f9be377707cbf318410895304e90b83bf8d9011d205150fa7f260e63 languageName: node linkType: hard @@ -965,20 +881,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.0" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-remap-async-to-generator": "npm:^7.25.0" - "@babel/plugin-syntax-async-generators": "npm:^7.8.4" - "@babel/traverse": "npm:^7.25.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/5348c3a33d16e0d62f13482c6fa432185ba096d58880b08d42450f7db662d6b03e6149d495c8620897dcd3da35061068cbd6c09da7d0ec95743e55a788809e4e - languageName: node - linkType: hard - "@babel/plugin-transform-async-generator-functions@npm:^7.25.4": version: 7.25.4 resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.4" @@ -1028,19 +930,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.22.5, @babel/plugin-transform-class-properties@npm:^7.24.1, @babel/plugin-transform-class-properties@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-class-properties@npm:7.24.7" - dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/75018a466c7ede3d2397e158891c224ba7fca72864506ce067ddbc02fc65191d44da4d6379c996d0c7f09019e26b5c3f5f1d3a639cd98366519723886f0689d0 - languageName: node - linkType: hard - -"@babel/plugin-transform-class-properties@npm:^7.25.4": +"@babel/plugin-transform-class-properties@npm:^7.22.5, @babel/plugin-transform-class-properties@npm:^7.24.1, @babel/plugin-transform-class-properties@npm:^7.25.4": version: 7.25.4 resolution: "@babel/plugin-transform-class-properties@npm:7.25.4" dependencies: @@ -1065,23 +955,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.0.0, @babel/plugin-transform-classes@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-transform-classes@npm:7.25.0" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-compilation-targets": "npm:^7.24.8" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-replace-supers": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.0" - globals: "npm:^11.1.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/4451dccf8a7979427ae042afe381233f30764a8072faf0de1337a4fc297c6d7cb40df9e28931ac096e5b56392d0cd97d3ce10aee68288150a8701624d362a791 - languageName: node - linkType: hard - -"@babel/plugin-transform-classes@npm:^7.25.4": +"@babel/plugin-transform-classes@npm:^7.0.0, @babel/plugin-transform-classes@npm:^7.25.4": version: 7.25.4 resolution: "@babel/plugin-transform-classes@npm:7.25.4" dependencies: @@ -1434,19 +1308,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.22.5, @babel/plugin-transform-private-methods@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-private-methods@npm:7.24.7" - dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/5b7bf923b738fbe3ad6c33b260e0a7451be288edfe4ef516303fa787a1870cd87533bfbf61abb779c22ed003c2fc484dec2436fe75a48756f686c0241173d364 - languageName: node - linkType: hard - -"@babel/plugin-transform-private-methods@npm:^7.25.4": +"@babel/plugin-transform-private-methods@npm:^7.22.5, @babel/plugin-transform-private-methods@npm:^7.25.4": version: 7.25.4 resolution: "@babel/plugin-transform-private-methods@npm:7.25.4" dependencies: @@ -1588,7 +1450,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:7.25.4": +"@babel/plugin-transform-runtime@npm:7.25.4, @babel/plugin-transform-runtime@npm:^7.23.2, @babel/plugin-transform-runtime@npm:^7.24.0, @babel/plugin-transform-runtime@npm:^7.24.3": version: 7.25.4 resolution: "@babel/plugin-transform-runtime@npm:7.25.4" dependencies: @@ -1604,22 +1466,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:^7.23.2, @babel/plugin-transform-runtime@npm:^7.24.0, @babel/plugin-transform-runtime@npm:^7.24.3": - version: 7.24.7 - resolution: "@babel/plugin-transform-runtime@npm:7.24.7" - dependencies: - "@babel/helper-module-imports": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - babel-plugin-polyfill-corejs2: "npm:^0.4.10" - babel-plugin-polyfill-corejs3: "npm:^0.10.1" - babel-plugin-polyfill-regenerator: "npm:^0.6.1" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/a33f5095872bbba00b8ee553dfe6941477e69a017a2e65e9dd86e80dab5c627635093b796eb1eb22aaaf2f874704f63ad1d99b952b83b59ef6b368ae04e5bb41 - languageName: node - linkType: hard - "@babel/plugin-transform-shorthand-properties@npm:^7.0.0, @babel/plugin-transform-shorthand-properties@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.7" @@ -1726,18 +1572,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.7" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/7457c0ee8e80a80cb6fdc1fe54ab115b52815627616ce9151be8ef292fc99d04a910ec24f11382b4f124b89374264396892b086886bd2a9c2317904d87c9b21b - languageName: node - linkType: hard - "@babel/plugin-transform-unicode-sets-regex@npm:^7.25.4": version: 7.25.4 resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.4" @@ -1750,7 +1584,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:7.25.4": +"@babel/preset-env@npm:7.25.4, @babel/preset-env@npm:^7.20.2, @babel/preset-env@npm:^7.23.2, @babel/preset-env@npm:^7.24.0, @babel/preset-env@npm:^7.24.4": version: 7.25.4 resolution: "@babel/preset-env@npm:7.25.4" dependencies: @@ -1843,99 +1677,6 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:^7.20.2, @babel/preset-env@npm:^7.23.2, @babel/preset-env@npm:^7.24.0, @babel/preset-env@npm:^7.24.4": - version: 7.25.3 - resolution: "@babel/preset-env@npm:7.25.3" - dependencies: - "@babel/compat-data": "npm:^7.25.2" - "@babel/helper-compilation-targets": "npm:^7.25.2" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-validator-option": "npm:^7.24.8" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.25.3" - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.25.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.25.0" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.7" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.25.0" - "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators": "npm:^7.8.4" - "@babel/plugin-syntax-class-properties": "npm:^7.12.13" - "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" - "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" - "@babel/plugin-syntax-import-assertions": "npm:^7.24.7" - "@babel/plugin-syntax-import-attributes": "npm:^7.24.7" - "@babel/plugin-syntax-import-meta": "npm:^7.10.4" - "@babel/plugin-syntax-json-strings": "npm:^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" - "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" - "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" - "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" - "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.24.7" - "@babel/plugin-transform-async-generator-functions": "npm:^7.25.0" - "@babel/plugin-transform-async-to-generator": "npm:^7.24.7" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.7" - "@babel/plugin-transform-block-scoping": "npm:^7.25.0" - "@babel/plugin-transform-class-properties": "npm:^7.24.7" - "@babel/plugin-transform-class-static-block": "npm:^7.24.7" - "@babel/plugin-transform-classes": "npm:^7.25.0" - "@babel/plugin-transform-computed-properties": "npm:^7.24.7" - "@babel/plugin-transform-destructuring": "npm:^7.24.8" - "@babel/plugin-transform-dotall-regex": "npm:^7.24.7" - "@babel/plugin-transform-duplicate-keys": "npm:^7.24.7" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.25.0" - "@babel/plugin-transform-dynamic-import": "npm:^7.24.7" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.7" - "@babel/plugin-transform-export-namespace-from": "npm:^7.24.7" - "@babel/plugin-transform-for-of": "npm:^7.24.7" - "@babel/plugin-transform-function-name": "npm:^7.25.1" - "@babel/plugin-transform-json-strings": "npm:^7.24.7" - "@babel/plugin-transform-literals": "npm:^7.25.2" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.7" - "@babel/plugin-transform-member-expression-literals": "npm:^7.24.7" - "@babel/plugin-transform-modules-amd": "npm:^7.24.7" - "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" - "@babel/plugin-transform-modules-systemjs": "npm:^7.25.0" - "@babel/plugin-transform-modules-umd": "npm:^7.24.7" - "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.7" - "@babel/plugin-transform-new-target": "npm:^7.24.7" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.7" - "@babel/plugin-transform-numeric-separator": "npm:^7.24.7" - "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7" - "@babel/plugin-transform-object-super": "npm:^7.24.7" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.7" - "@babel/plugin-transform-optional-chaining": "npm:^7.24.8" - "@babel/plugin-transform-parameters": "npm:^7.24.7" - "@babel/plugin-transform-private-methods": "npm:^7.24.7" - "@babel/plugin-transform-private-property-in-object": "npm:^7.24.7" - "@babel/plugin-transform-property-literals": "npm:^7.24.7" - "@babel/plugin-transform-regenerator": "npm:^7.24.7" - "@babel/plugin-transform-reserved-words": "npm:^7.24.7" - "@babel/plugin-transform-shorthand-properties": "npm:^7.24.7" - "@babel/plugin-transform-spread": "npm:^7.24.7" - "@babel/plugin-transform-sticky-regex": "npm:^7.24.7" - "@babel/plugin-transform-template-literals": "npm:^7.24.7" - "@babel/plugin-transform-typeof-symbol": "npm:^7.24.8" - "@babel/plugin-transform-unicode-escapes": "npm:^7.24.7" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.7" - "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.24.7" - "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.10" - babel-plugin-polyfill-corejs3: "npm:^0.10.4" - babel-plugin-polyfill-regenerator: "npm:^0.6.1" - core-js-compat: "npm:^3.37.1" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/9287dc2e296fe2aa3367d84c2a799db17c9d1e48bba86525f47c6f51f5ba2e2cce454f45f4ae2ef928f9077c0640b04556b55b94835675ceeca94a0c5133205e - languageName: node - linkType: hard - "@babel/preset-flow@npm:^7.22.15": version: 7.24.7 resolution: "@babel/preset-flow@npm:7.24.7" @@ -2016,11 +1757,11 @@ __metadata: linkType: hard "@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.17.9, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.19.4, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.22.6, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.24.0, @babel/runtime@npm:^7.24.4, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": - version: 7.25.0 - resolution: "@babel/runtime@npm:7.25.0" + version: 7.25.4 + resolution: "@babel/runtime@npm:7.25.4" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/bd3faf246170826cef2071a94d7b47b49d532351360ecd17722d03f6713fd93a3eb3dbd9518faa778d5e8ccad7392a7a604e56bd37aaad3f3aa68d619ccd983d + checksum: 10c0/33e937e685f0bfc2d40c219261e2e50d0df7381a6e7cbf56b770e0c5d77cb0c21bf4d97da566cf0164317ed7508e992082c7b6cce7aaa3b17da5794f93fbfb46 languageName: node linkType: hard @@ -2035,22 +1776,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.0, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.1, @babel/traverse@npm:^7.25.2, @babel/traverse@npm:^7.25.3": - version: 7.25.3 - resolution: "@babel/traverse@npm:7.25.3" - dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.3" - "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.2" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10c0/4c8a1966fa90b53a783a4afd2fcdaa6ab1a912e6621dca9fcc6633e80ccb9491620e88caf73b537da4e16cefd537b548c87d7087868d5b0066414dea375c0e9b - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.25.4": +"@babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.0, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.1, @babel/traverse@npm:^7.25.2, @babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.25.4": version: 7.25.4 resolution: "@babel/traverse@npm:7.25.4" dependencies: @@ -2065,7 +1791,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:7.25.2, @babel/types@npm:^7.0.0, @babel/types@npm:^7.16.8, @babel/types@npm:^7.18.13, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.24.0, @babel/types@npm:^7.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": +"@babel/types@npm:7.25.2": version: 7.25.2 resolution: "@babel/types@npm:7.25.2" dependencies: @@ -2076,7 +1802,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.25.4": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.16.8, @babel/types@npm:^7.18.13, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.24.0, @babel/types@npm:^7.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.4, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": version: 7.25.4 resolution: "@babel/types@npm:7.25.4" dependencies: @@ -3073,7 +2799,7 @@ __metadata: languageName: node linkType: hard -"@emnapi/runtime@npm:^1.1.0, @emnapi/runtime@npm:^1.1.1": +"@emnapi/runtime@npm:^1.1.0, @emnapi/runtime@npm:^1.2.0": version: 1.2.0 resolution: "@emnapi/runtime@npm:1.2.0" dependencies: @@ -3125,12 +2851,12 @@ __metadata: linkType: hard "@envelop/core@npm:^5.0.0, @envelop/core@npm:^5.0.1": - version: 5.0.1 - resolution: "@envelop/core@npm:5.0.1" + version: 5.0.2 + resolution: "@envelop/core@npm:5.0.2" dependencies: "@envelop/types": "npm:5.0.0" tslib: "npm:^2.5.0" - checksum: 10c0/26bcad627d2959e5dadb7ad0f1d158ba8227e45e721c2112808633124228ed49ee4f8cbb498d57447c4730bfcb9734ebd0fa3e377d2f6dde6b4eb506fc96a568 + checksum: 10c0/ef671cf79b40c4ca387b80012f01e54896de7c933bbdd6b905ce09058ff52554116c54da98d1a1226f67a3bc169a0b115c895c01b7daa9d73f2777a692b9f41f languageName: node linkType: hard @@ -3148,15 +2874,15 @@ __metadata: linkType: hard "@envelop/extended-validation@npm:^4.0.0": - version: 4.0.0 - resolution: "@envelop/extended-validation@npm:4.0.0" + version: 4.1.0 + resolution: "@envelop/extended-validation@npm:4.1.0" dependencies: "@graphql-tools/utils": "npm:^10.0.0" tslib: "npm:^2.5.0" peerDependencies: - "@envelop/core": ^5.0.0 + "@envelop/core": ^5.0.2 graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 10c0/86ad663eef0303fab9e7fef233dfa798ff368526faf20cc6043bf8f6da455cf81eb3923b80bc424311f961b7cf87416158ef18abe6aaebba3cacdd4bfdf8f80e + checksum: 10c0/9b65b4c7040b024ab95aaf901d79cea9a7e61406fe0c7660cde91b7fbfbbae74516d3940b2df3e639e359bb96185df8769c2842367f70e78317cefe8cae12ddf languageName: node linkType: hard @@ -5305,21 +5031,21 @@ __metadata: linkType: hard "@floating-ui/core@npm:^1.6.0": - version: 1.6.5 - resolution: "@floating-ui/core@npm:1.6.5" + version: 1.6.7 + resolution: "@floating-ui/core@npm:1.6.7" dependencies: - "@floating-ui/utils": "npm:^0.2.5" - checksum: 10c0/41651f6ebed3123809a3992966d9d6b740048fe255e4754df61043ce28b40ba7202cf7ac163873b7f4c5f9969930e9d7cd3691e178739304eed1adc42bb6c628 + "@floating-ui/utils": "npm:^0.2.7" + checksum: 10c0/5c9ae274854f87ed09a61de758377d444c2b13ade7fd1067d74287b3e66de5340ae1281e48604b631c540855a2595cfc717adf9a2331eaadc4fa6d28e8571f64 languageName: node linkType: hard "@floating-ui/dom@npm:^1.0.0": - version: 1.6.8 - resolution: "@floating-ui/dom@npm:1.6.8" + version: 1.6.10 + resolution: "@floating-ui/dom@npm:1.6.10" dependencies: "@floating-ui/core": "npm:^1.6.0" - "@floating-ui/utils": "npm:^0.2.5" - checksum: 10c0/d52e257bbf1f04da7882d847dfe128783966a19e6d6a9e6d09d57d32bdc7255efce7ae15c3be781e349ae3b18c4575e910afde3e73ae57c31763e8a799f19f45 + "@floating-ui/utils": "npm:^0.2.7" + checksum: 10c0/ed7d7b400e00b2f31f1b8f11863af2cb95d0d3cd84635186ca31b41d8d9fe7fe12c85e4985617d7df7ed365abad48b327d0bae35934842007b4e1052d9780576 languageName: node linkType: hard @@ -5336,23 +5062,23 @@ __metadata: linkType: hard "@floating-ui/react@npm:^0.26.16": - version: 0.26.20 - resolution: "@floating-ui/react@npm:0.26.20" + version: 0.26.23 + resolution: "@floating-ui/react@npm:0.26.23" dependencies: "@floating-ui/react-dom": "npm:^2.1.1" - "@floating-ui/utils": "npm:^0.2.5" + "@floating-ui/utils": "npm:^0.2.7" tabbable: "npm:^6.0.0" peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 10c0/2fe96b8123734a9facb560b235bbb9a21849890f7a84a48c4e1d496dde045aafecb4575c3e035413f2d88a8324651c85b018bfbf8d57eb1fb9e469cdd211ca86 + checksum: 10c0/d339c3d760e83c8384a16c8a38fb47f7f855a3db4d19117fd54cccbf871a27b089887202074e9871ffc19ad769bed709ecdd69445a39d2ea9406c84814427f3b languageName: node linkType: hard -"@floating-ui/utils@npm:^0.2.5": - version: 0.2.5 - resolution: "@floating-ui/utils@npm:0.2.5" - checksum: 10c0/9e1c7330433c3a8f226c5a44ed1dcdda13b313c4126ce3281f970d1e471b1c9fd9e1559cc76a0592af25d55a3f81afe1a5778aa7b80e51c9fa01930cd1d5557e +"@floating-ui/utils@npm:^0.2.7": + version: 0.2.7 + resolution: "@floating-ui/utils@npm:0.2.7" + checksum: 10c0/0559ea5df2dc82219bad26e3509e9d2b70f6987e552dc8ddf7d7f5923cfeb7c44bf884567125b1f9cdb122a4c7e6e7ddbc666740bc30b0e4091ccbca63c6fb1c languageName: node linkType: hard @@ -5379,62 +5105,62 @@ __metadata: linkType: hard "@graphprotocol/client-add-source-name@npm:^2.0.0": - version: 2.0.4 - resolution: "@graphprotocol/client-add-source-name@npm:2.0.4" + version: 2.0.7 + resolution: "@graphprotocol/client-add-source-name@npm:2.0.7" dependencies: lodash: "npm:^4.17.21" tslib: "npm:^2.4.0" peerDependencies: - "@graphql-mesh/types": ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 || ^0.94.0 || ^0.97.0 || ^0.98.0 || ^0.99.0 + "@graphql-mesh/types": ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 || ^0.94.0 || ^0.97.0 || ^0.98.0 || ^0.99.0 || ^0.100.0 || ^0.101.0 || ^0.102.0 "@graphql-tools/delegate": ^9.0.32 || ^10.0.0 "@graphql-tools/utils": ^9.2.1 || ^10.0.0 "@graphql-tools/wrap": ^9.4.2 || ^10.0.0 graphql: ^15.2.0 || ^16.0.0 - checksum: 10c0/8f8642a0d10b59bcd0989f3ac225ce8ddc8328ca86d225c0f3316f6a0ed245cce7f065c0eabccebd745ab8f94fb165aadaae481b9d556bc0976d33842b095d05 + checksum: 10c0/7b1cb470517a1f5537638e8797efba4fafec9110cc5e9e8872a7f247ddfb54fa414517ec0116c7e9dcf679a89847d90ded2bf08d630cc78be2380555a755ea72 languageName: node linkType: hard "@graphprotocol/client-auto-pagination@npm:^2.0.0": - version: 2.0.4 - resolution: "@graphprotocol/client-auto-pagination@npm:2.0.4" + version: 2.0.7 + resolution: "@graphprotocol/client-auto-pagination@npm:2.0.7" dependencies: lodash: "npm:^4.17.21" tslib: "npm:^2.4.0" peerDependencies: - "@graphql-mesh/types": ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 || ^0.94.0 || ^0.97.0 || ^0.98.0 || ^0.99.0 + "@graphql-mesh/types": ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 || ^0.94.0 || ^0.97.0 || ^0.98.0 || ^0.99.0 || ^0.100.0 || ^0.101.0 || ^0.102.0 "@graphql-tools/delegate": ^9.0.32 || ^10.0.0 "@graphql-tools/utils": ^9.2.1 || ^10.0.0 "@graphql-tools/wrap": ^9.4.2 || ^10.0.0 graphql: ^15.2.0 || ^16.0.0 - checksum: 10c0/10660925fdca15e8865a39e1b320e4817e1fd222f5818b6e96598f177221d1fc2f28e43fd608981fca687bf898d4c2332b0ead3eb45003812c2a2092c36b03b7 + checksum: 10c0/16b730672d7b3821a6165d28432658c5a38c85c15850140c43abfd527b7641308f4bd867848434aa1074a6b07bdb9dad58469374d7a615024942f43d2f149951 languageName: node linkType: hard "@graphprotocol/client-auto-type-merging@npm:^2.0.0": - version: 2.0.4 - resolution: "@graphprotocol/client-auto-type-merging@npm:2.0.4" + version: 2.0.7 + resolution: "@graphprotocol/client-auto-type-merging@npm:2.0.7" dependencies: - "@graphql-mesh/transform-type-merging": "npm:^0.99.0" + "@graphql-mesh/transform-type-merging": "npm:^0.102.0" tslib: "npm:^2.4.0" peerDependencies: - "@graphql-mesh/types": ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 || ^0.94.0 || ^0.97.0 || ^0.98.0 || ^0.99.0 + "@graphql-mesh/types": ^0.78.0 || ^0.79.0 || ^0.80.0 || ^0.81.0 || ^0.82.0 || ^0.83.0 || ^0.84.0 || ^0.85.0 || ^0.89.0 || ^0.90.0 || ^0.91.0 || ^0.93.0 || ^0.94.0 || ^0.97.0 || ^0.98.0 || ^0.99.0 || ^0.100.0 || ^0.101.0 || ^0.102.0 "@graphql-tools/delegate": ^9.0.32 || ^10.0.0 graphql: ^15.2.0 || ^16.0.0 - checksum: 10c0/082b07fd32f68fa525cbef77371ca0bc6181dcb02fd3c38871d4f902a3194c3add0e73445a5e8cf5880fe12250365819d585c8c2e80a0d33c529dd015e957af5 + checksum: 10c0/6ad9821e4e47648d97a3266d10c08769be690f18313173cf5fa27092641edba68f7f607d6b5218dc324b8321e18a400de08ba854ecfc3e5bdf28657cb6e90f43 languageName: node linkType: hard "@graphprotocol/client-block-tracking@npm:^2.0.0": - version: 2.0.3 - resolution: "@graphprotocol/client-block-tracking@npm:2.0.3" + version: 2.0.6 + resolution: "@graphprotocol/client-block-tracking@npm:2.0.6" dependencies: - "@graphql-mesh/fusion-runtime": "npm:^0.5.0" + "@graphql-mesh/fusion-runtime": "npm:^0.8.0" "@graphql-tools/utils": "npm:^10.0.0" tslib: "npm:^2.4.0" peerDependencies: "@graphql-tools/delegate": ^9.0.32 || ^10.0.0 graphql: ^15.2.0 || ^16.0.0 - checksum: 10c0/dcbfc32ad768558751d7ac1e3aadf1066459b4fbc929697bb7cb863cd3e1e0496588606e625155c7123808dc862fe334b36705fb36a5a507bbcd5b5afcc2d364 + checksum: 10c0/dcd13151b2fb74d7b7b4bd3243dc15c11ca7f6a48a373468b123beb6549070941e6b26f73c4dd9ba62c9ade994696b29bc38bc8bedcbafcdbb1092d2cc6cd0ae languageName: node linkType: hard @@ -6021,42 +5747,42 @@ __metadata: languageName: node linkType: hard -"@graphql-mesh/cross-helpers@npm:^0.4.4": - version: 0.4.4 - resolution: "@graphql-mesh/cross-helpers@npm:0.4.4" +"@graphql-mesh/cross-helpers@npm:^0.4.6": + version: 0.4.6 + resolution: "@graphql-mesh/cross-helpers@npm:0.4.6" dependencies: path-browserify: "npm:1.0.1" peerDependencies: - "@graphql-tools/utils": ^10.2.3 + "@graphql-tools/utils": ^10.5.3 graphql: "*" - checksum: 10c0/27a6996147d453c27887cee4fd843818b550e434b28aa895e26a39ba6522c57f6d11b3c7945afb43b6b2777cd0e59de02ad07b67480f9d9140182b474572097f + checksum: 10c0/5cd88daa3df1fca07131c3b866e6f3d4ca01fb2c15fe6ee533b22c524904df519ca9cfdb2ac25e042dbe8b2e87cdf47c46bdf4c0fc34c3a1652dcc0c931f1db5 languageName: node linkType: hard -"@graphql-mesh/fusion-runtime@npm:^0.5.0": - version: 0.5.10 - resolution: "@graphql-mesh/fusion-runtime@npm:0.5.10" +"@graphql-mesh/fusion-runtime@npm:^0.8.0": + version: 0.8.5 + resolution: "@graphql-mesh/fusion-runtime@npm:0.8.5" dependencies: "@envelop/core": "npm:^5.0.1" - "@graphql-mesh/cross-helpers": "npm:^0.4.4" - "@graphql-mesh/runtime": "npm:^0.100.8" - "@graphql-mesh/transport-common": "npm:^0.4.7" - "@graphql-mesh/types": "npm:^0.99.7" - "@graphql-mesh/utils": "npm:^0.99.7" - "@graphql-tools/delegate": "npm:^10.0.17" - "@graphql-tools/executor": "npm:^1.3.0" - "@graphql-tools/federation": "npm:^2.2.4" + "@graphql-mesh/cross-helpers": "npm:^0.4.6" + "@graphql-mesh/runtime": "npm:^0.103.4" + "@graphql-mesh/transport-common": "npm:^0.7.5" + "@graphql-mesh/types": "npm:^0.102.4" + "@graphql-mesh/utils": "npm:^0.102.4" + "@graphql-tools/delegate": "npm:^10.0.21" + "@graphql-tools/executor": "npm:^1.3.1" + "@graphql-tools/federation": "npm:^2.2.9" "@graphql-tools/stitch": "npm:^9.2.10" "@graphql-tools/stitching-directives": "npm:^3.1.2" - "@graphql-tools/utils": "npm:^10.2.3" + "@graphql-tools/utils": "npm:^10.5.3" "@graphql-tools/wrap": "npm:^10.0.5" - "@whatwg-node/disposablestack": "npm:^0.0.1" + "@whatwg-node/disposablestack": "npm:^0.0.3" change-case: "npm:^4.1.2" - graphql-yoga: "npm:^5.6.0" + graphql-yoga: "npm:^5.7.0" tslib: "npm:^2.4.0" peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 10c0/1731cc9dd9ba9e1dff626d184b2e9da066a177dea091c3f80bc11b4117af42240a514a663ac9447509a03a5815e04be4a353e2625b8b0455b8905739860a0bdc + checksum: 10c0/4e0d19d172f81affee71d70e000ae6b317ab9e89e41851252ea820ea3b07cfdd31e86417e2ae1d7d776eaf0705eee62ae885393c674a65608126e24711523684 languageName: node linkType: hard @@ -6133,28 +5859,28 @@ __metadata: languageName: node linkType: hard -"@graphql-mesh/runtime@npm:^0.100.8": - version: 0.100.8 - resolution: "@graphql-mesh/runtime@npm:0.100.8" +"@graphql-mesh/runtime@npm:^0.103.4": + version: 0.103.4 + resolution: "@graphql-mesh/runtime@npm:0.103.4" dependencies: "@envelop/core": "npm:^5.0.0" "@envelop/extended-validation": "npm:^4.0.0" "@envelop/graphql-jit": "npm:^8.0.0" - "@graphql-mesh/string-interpolation": "npm:^0.5.5" + "@graphql-mesh/string-interpolation": "npm:^0.5.6" "@graphql-tools/batch-delegate": "npm:^9.0.3" - "@graphql-tools/delegate": "npm:^10.0.17" - "@graphql-tools/executor": "npm:^1.3.0" + "@graphql-tools/delegate": "npm:^10.0.21" + "@graphql-tools/executor": "npm:^1.3.1" "@graphql-tools/wrap": "npm:^10.0.5" "@whatwg-node/fetch": "npm:^0.9.0" graphql-jit: "npm:0.8.6" peerDependencies: - "@graphql-mesh/cross-helpers": ^0.4.4 - "@graphql-mesh/types": ^0.99.7 - "@graphql-mesh/utils": ^0.99.7 - "@graphql-tools/utils": ^10.2.3 + "@graphql-mesh/cross-helpers": ^0.4.6 + "@graphql-mesh/types": ^0.102.4 + "@graphql-mesh/utils": ^0.102.4 + "@graphql-tools/utils": ^10.5.3 graphql: "*" tslib: ^2.4.0 - checksum: 10c0/93101f14161cd4be7aff96b6e3ffb53a841e4bac0ac78aad0572bbdedde15b88b05f5295ec4fa7c414354ed2645266cc858218478b9c95ecad0b26ba9d3215b9 + checksum: 10c0/b8fb30086556ebda559da9ee6e3c3765350496a66bcc16713103d70a33666adf8b31bfbf6d36396e8204c7b0d2f5a503ddc7e3fdaa84276b75bcb5e661d46d50 languageName: node linkType: hard @@ -6211,47 +5937,63 @@ __metadata: languageName: node linkType: hard -"@graphql-mesh/string-interpolation@npm:^0.5.5": - version: 0.5.5 - resolution: "@graphql-mesh/string-interpolation@npm:0.5.5" +"@graphql-mesh/string-interpolation@npm:^0.5.6": + version: 0.5.6 + resolution: "@graphql-mesh/string-interpolation@npm:0.5.6" dependencies: - dayjs: "npm:1.11.12" + dayjs: "npm:1.11.13" json-pointer: "npm:0.6.2" lodash.get: "npm:4.4.2" peerDependencies: graphql: "*" tslib: ^2.4.0 - checksum: 10c0/424ed831359a8d4a9b4a06a06a07c23855a034eda15bdae4f6db9ed28884be193c1165ca709374d7b862eafb5eea188f1d4e71d0aad479dbf081aecd7f3df188 + checksum: 10c0/5442002c9edf46dff9f7953a846358d96377e3db01a729d94b7a1f3412cec5bd5b89472f5a3fd65ce1670c881a418da6c570490406cdf7802f1842e49350e9dc languageName: node linkType: hard -"@graphql-mesh/transform-type-merging@npm:^0.99.0": - version: 0.99.8 - resolution: "@graphql-mesh/transform-type-merging@npm:0.99.8" +"@graphql-mesh/transform-type-merging@npm:^0.102.0": + version: 0.102.4 + resolution: "@graphql-mesh/transform-type-merging@npm:0.102.4" dependencies: - "@graphql-tools/delegate": "npm:^10.0.17" + "@graphql-tools/delegate": "npm:^10.0.21" "@graphql-tools/stitching-directives": "npm:^3.1.2" peerDependencies: - "@graphql-mesh/types": ^0.99.7 - "@graphql-mesh/utils": ^0.99.7 + "@graphql-mesh/types": ^0.102.4 + "@graphql-mesh/utils": ^0.102.4 graphql: "*" tslib: ^2.4.0 - checksum: 10c0/0d88f6921c17a194635dd325390ef88b26d2b7f7f1e72f1f85176bd8fd6220b11b24f1a125b7125e59a3e5eb32d81016e6b51e0037fbdde1e9d976dd4bb8779b + checksum: 10c0/50409c8c7a6403fbf5f95b65977849951e532079ef564a0b9a5da9c73c77c8443cecd93fdbc03d495b86ce8deece6feb2bf6d2b580898b17da259bf99206652c languageName: node linkType: hard -"@graphql-mesh/transport-common@npm:^0.4.7": - version: 0.4.7 - resolution: "@graphql-mesh/transport-common@npm:0.4.7" +"@graphql-mesh/transport-common@npm:^0.7.5": + version: 0.7.5 + resolution: "@graphql-mesh/transport-common@npm:0.7.5" dependencies: "@envelop/core": "npm:^5.0.1" - "@graphql-tools/delegate": "npm:^10.0.17" - "@graphql-tools/utils": "npm:^10.2.3" + "@graphql-tools/delegate": "npm:^10.0.21" + "@graphql-tools/utils": "npm:^10.5.3" + peerDependencies: + "@graphql-mesh/types": ^0.102.4 + graphql: "*" + tslib: ^2.4.0 + checksum: 10c0/f6a26d8bbcadb75b07ab976740c5e139c06c3521d4d57014d3e33bc66ca37c26f778ec73638d0551a374c209974800681a7bc396c9ebd3e1aad4539a1f10000c + languageName: node + linkType: hard + +"@graphql-mesh/types@npm:^0.102.4": + version: 0.102.4 + resolution: "@graphql-mesh/types@npm:0.102.4" + dependencies: + "@graphql-tools/batch-delegate": "npm:^9.0.3" + "@graphql-tools/delegate": "npm:^10.0.21" + "@graphql-typed-document-node/core": "npm:^3.2.0" peerDependencies: - "@graphql-mesh/types": ^0.99.7 + "@graphql-mesh/store": ^0.102.4 + "@graphql-tools/utils": ^10.5.3 graphql: "*" tslib: ^2.4.0 - checksum: 10c0/0ae5922772b0528332457fbba0b2edb376ee5811a749e77b909a84150dd7b6d0b50424b1676e553d008a0eedb9662f5173cbb6902578db6b8dbe9b56e9974c59 + checksum: 10c0/789f697be60023da57c537ac05945f25fba2f2c79c406d936bfac42badd34c68d082db4e8fa8fe5df00835abc31c27aada8d971949a9ffccbd293ca1826f6504 languageName: node linkType: hard @@ -6271,19 +6013,26 @@ __metadata: languageName: node linkType: hard -"@graphql-mesh/types@npm:^0.99.7": - version: 0.99.7 - resolution: "@graphql-mesh/types@npm:0.99.7" +"@graphql-mesh/utils@npm:^0.102.4": + version: 0.102.4 + resolution: "@graphql-mesh/utils@npm:0.102.4" dependencies: - "@graphql-tools/batch-delegate": "npm:^9.0.3" - "@graphql-tools/delegate": "npm:^10.0.17" - "@graphql-typed-document-node/core": "npm:^3.2.0" + "@graphql-mesh/string-interpolation": "npm:^0.5.6" + "@graphql-tools/delegate": "npm:^10.0.21" + "@whatwg-node/disposablestack": "npm:^0.0.3" + "@whatwg-node/fetch": "npm:^0.9.13" + dset: "npm:^3.1.2" + js-yaml: "npm:^4.1.0" + lodash.get: "npm:^4.4.2" + lodash.topath: "npm:^4.5.2" + tiny-lru: "npm:^11.0.0" peerDependencies: - "@graphql-mesh/store": ^0.99.7 - "@graphql-tools/utils": ^10.2.3 + "@graphql-mesh/cross-helpers": ^0.4.6 + "@graphql-mesh/types": ^0.102.4 + "@graphql-tools/utils": ^10.5.3 graphql: "*" tslib: ^2.4.0 - checksum: 10c0/ca165742ceec37d73e3ee3b8496d8203b0877a07037c8c05b897545accb61c5bc19e64a3451d126b55fc7326dd6daaced6cfe7e93e170748cfbd55fa4ea0a07a + checksum: 10c0/3dd3d1c4e78173cfbe34c87b3ff6a3b62d03fa2e832bd51c70e9e0259a3eb9253bcdef1284053eb80ed0917dbf6d073514e3c7a30c8bbb347b0bbc926d175643 languageName: node linkType: hard @@ -6308,29 +6057,6 @@ __metadata: languageName: node linkType: hard -"@graphql-mesh/utils@npm:^0.99.7": - version: 0.99.7 - resolution: "@graphql-mesh/utils@npm:0.99.7" - dependencies: - "@graphql-mesh/string-interpolation": "npm:^0.5.5" - "@graphql-tools/delegate": "npm:^10.0.17" - "@whatwg-node/disposablestack": "npm:^0.0.1" - "@whatwg-node/fetch": "npm:^0.9.13" - dset: "npm:^3.1.2" - js-yaml: "npm:^4.1.0" - lodash.get: "npm:^4.4.2" - lodash.topath: "npm:^4.5.2" - tiny-lru: "npm:^11.0.0" - peerDependencies: - "@graphql-mesh/cross-helpers": ^0.4.4 - "@graphql-mesh/types": ^0.99.7 - "@graphql-tools/utils": ^10.2.3 - graphql: "*" - tslib: ^2.4.0 - checksum: 10c0/8f8d8fa3a0ece65b93e17904543ae477c0b6223afd16732ef41ba35be78c8d31bf173fde2a4786b85182b370be55141b6b6ea0c34d704a1c64467f00e77a3590 - languageName: node - linkType: hard - "@graphql-tools/apollo-engine-loader@npm:^8.0.0": version: 8.0.1 resolution: "@graphql-tools/apollo-engine-loader@npm:8.0.1" @@ -6433,19 +6159,20 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/delegate@npm:^10.0.11, @graphql-tools/delegate@npm:^10.0.12, @graphql-tools/delegate@npm:^10.0.17, @graphql-tools/delegate@npm:^10.0.4": - version: 10.0.17 - resolution: "@graphql-tools/delegate@npm:10.0.17" +"@graphql-tools/delegate@npm:^10.0.11, @graphql-tools/delegate@npm:^10.0.12, @graphql-tools/delegate@npm:^10.0.20, @graphql-tools/delegate@npm:^10.0.21, @graphql-tools/delegate@npm:^10.0.4": + version: 10.0.21 + resolution: "@graphql-tools/delegate@npm:10.0.21" dependencies: "@graphql-tools/batch-execute": "npm:^9.0.4" - "@graphql-tools/executor": "npm:^1.3.0" + "@graphql-tools/executor": "npm:^1.3.1" "@graphql-tools/schema": "npm:^10.0.4" - "@graphql-tools/utils": "npm:^10.2.3" + "@graphql-tools/utils": "npm:^10.3.4" + "@repeaterjs/repeater": "npm:^3.0.6" dataloader: "npm:^2.2.2" tslib: "npm:^2.5.0" peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 10c0/c136026d328ce29d542077305a639d8f84c254b8ef40a9d187b410b3b5d93bbd1c51c424c4318c2df02e8e8a03bea1cf336268010b59d6c28168b3e5c0fa847d + checksum: 10c0/2831f39c39402c5ee83193be51d71d5dfbdda3c5cbad4439f3f28b599f0690e554bf5812cfcd2c3de68b5d398828dfc2fab1319b85255275fd74edcf7c718cbc languageName: node linkType: hard @@ -6530,8 +6257,8 @@ __metadata: linkType: hard "@graphql-tools/executor-http@npm:^1.0.9, @graphql-tools/executor-http@npm:^1.1.5": - version: 1.1.5 - resolution: "@graphql-tools/executor-http@npm:1.1.5" + version: 1.1.6 + resolution: "@graphql-tools/executor-http@npm:1.1.6" dependencies: "@graphql-tools/utils": "npm:^10.3.2" "@repeaterjs/repeater": "npm:^3.0.4" @@ -6542,7 +6269,7 @@ __metadata: value-or-promise: "npm:^1.0.12" peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 10c0/1b4a3c6b4afa5b6f3397249ea5e5b0adc56151a74c56949b969377afdfb588b46c57a01e2826c74664cb40c24c4c0c312b1ca8ffb66429df453dabba046edb00 + checksum: 10c0/27000715f697e8540a30ac0df1be9d44ee5742ccab78ea3d1cb9f40b5896525f89ab8453e95cf826a810cb621e9bb18f4c63630719df454ad293a22ea0720120 languageName: node linkType: hard @@ -6606,32 +6333,32 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/executor@npm:^1.2.8, @graphql-tools/executor@npm:^1.3.0": - version: 1.3.0 - resolution: "@graphql-tools/executor@npm:1.3.0" +"@graphql-tools/executor@npm:^1.2.8, @graphql-tools/executor@npm:^1.3.0, @graphql-tools/executor@npm:^1.3.1": + version: 1.3.1 + resolution: "@graphql-tools/executor@npm:1.3.1" dependencies: - "@graphql-tools/utils": "npm:^10.2.3" + "@graphql-tools/utils": "npm:^10.3.4" "@graphql-typed-document-node/core": "npm:3.2.0" "@repeaterjs/repeater": "npm:^3.0.4" tslib: "npm:^2.4.0" value-or-promise: "npm:^1.0.12" peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 10c0/0e4ec4bcd7ba3f4d0053ae59117fa0367ee9444839f2c0568058494abfa1b4196e53aa738c88cb68a02f30d0a73827578f7f5cb7125a874063a4f1331cd98d62 + checksum: 10c0/91a0e43be277e034a37fd0200aae40ef5dc7fb982c44a0b7eb8e14d09f6e43996ccadad4ceafb4e1aa7dfcd6148e9972a94efff57a544eea9c3ca537a3804c3b languageName: node linkType: hard -"@graphql-tools/federation@npm:^2.2.4": - version: 2.2.4 - resolution: "@graphql-tools/federation@npm:2.2.4" +"@graphql-tools/federation@npm:^2.2.9": + version: 2.2.9 + resolution: "@graphql-tools/federation@npm:2.2.9" dependencies: "@apollo/client": "npm:~3.2.5 || ~3.3.0 || ~3.4.0 || ~3.5.0 || ~3.6.0 || ~3.7.0 || ~3.8.0 || ~3.9.0 || ~3.10.0 || ~3.11.0" - "@graphql-tools/delegate": "npm:^10.0.17" + "@graphql-tools/delegate": "npm:^10.0.20" "@graphql-tools/executor-http": "npm:^1.1.5" - "@graphql-tools/merge": "npm:^9.0.3" - "@graphql-tools/schema": "npm:^10.0.4" + "@graphql-tools/merge": "npm:^9.0.5" + "@graphql-tools/schema": "npm:^10.0.5" "@graphql-tools/stitch": "npm:^9.2.10" - "@graphql-tools/utils": "npm:^10.2.3" + "@graphql-tools/utils": "npm:^10.4.0" "@graphql-tools/wrap": "npm:^10.0.3" "@whatwg-node/fetch": "npm:^0.9.17" tslib: "npm:^2.4.0" @@ -6641,7 +6368,7 @@ __metadata: dependenciesMeta: "@apollo/client": optional: true - checksum: 10c0/a46340004223e7645fe5731a2050e518f429f3a2ee6e81800613b90b50a24d8207959603723048213dd7ef02eaff0c859d73606f57918c5b78726e74cad2d7c5 + checksum: 10c0/e56b21077c1db609672749a7c200549b675fcf1e50b9edee95d7c004608cbd9d796e39b31ace1f21e56387317cf9cf2baf85d9d9c9c714b1dafc725bb263cc77 languageName: node linkType: hard @@ -6821,15 +6548,15 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/merge@npm:^9.0.0, @graphql-tools/merge@npm:^9.0.3, @graphql-tools/merge@npm:^9.0.4": - version: 9.0.4 - resolution: "@graphql-tools/merge@npm:9.0.4" +"@graphql-tools/merge@npm:^9.0.0, @graphql-tools/merge@npm:^9.0.4, @graphql-tools/merge@npm:^9.0.5, @graphql-tools/merge@npm:^9.0.6": + version: 9.0.6 + resolution: "@graphql-tools/merge@npm:9.0.6" dependencies: - "@graphql-tools/utils": "npm:^10.0.13" + "@graphql-tools/utils": "npm:^10.5.4" tslib: "npm:^2.4.0" peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 10c0/baf8558955d2f5cefdad298be295e48564bd6d2e691eed1b6d4c62f58cea898c8269443181fe847ca2747ec179c5b2b620be9215323281b2d65afc29591ce52d + checksum: 10c0/827b1335ee89854b083aff819dc1b1004a6f87fe591c33441da83f6157ced091b511956297f7b8af2399be6a78522bd7dc492979990ac5cc29a2f9a375b6e6a9 languageName: node linkType: hard @@ -6921,17 +6648,17 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/schema@npm:^10.0.0, @graphql-tools/schema@npm:^10.0.3, @graphql-tools/schema@npm:^10.0.4": - version: 10.0.4 - resolution: "@graphql-tools/schema@npm:10.0.4" +"@graphql-tools/schema@npm:^10.0.0, @graphql-tools/schema@npm:^10.0.3, @graphql-tools/schema@npm:^10.0.4, @graphql-tools/schema@npm:^10.0.5": + version: 10.0.6 + resolution: "@graphql-tools/schema@npm:10.0.6" dependencies: - "@graphql-tools/merge": "npm:^9.0.3" - "@graphql-tools/utils": "npm:^10.2.1" + "@graphql-tools/merge": "npm:^9.0.6" + "@graphql-tools/utils": "npm:^10.5.4" tslib: "npm:^2.4.0" value-or-promise: "npm:^1.0.12" peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 10c0/991c54513df6d81962c0c6a283085c42446854dac59715e28d26a47dc4676ecd6c634f018dc5d9f60fdd5c922f6f28bf6f8a522e236ed1e3725c56bc5f7ec608 + checksum: 10c0/13df05c6696dd7ce63f1e773ad7be633db1c2a98eeff9d9695307f6588f3a987906eef01f68b74cafb0d2ee36aabe790bca67bda21662f1117d5fabac110ca3a languageName: node linkType: hard @@ -7045,17 +6772,17 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/utils@npm:^10.0.0, @graphql-tools/utils@npm:^10.0.13, @graphql-tools/utils@npm:^10.1.1, @graphql-tools/utils@npm:^10.2.1, @graphql-tools/utils@npm:^10.2.3, @graphql-tools/utils@npm:^10.3.0, @graphql-tools/utils@npm:^10.3.2": - version: 10.3.2 - resolution: "@graphql-tools/utils@npm:10.3.2" +"@graphql-tools/utils@npm:^10.0.0, @graphql-tools/utils@npm:^10.0.13, @graphql-tools/utils@npm:^10.1.1, @graphql-tools/utils@npm:^10.2.1, @graphql-tools/utils@npm:^10.2.3, @graphql-tools/utils@npm:^10.3.0, @graphql-tools/utils@npm:^10.3.2, @graphql-tools/utils@npm:^10.3.4, @graphql-tools/utils@npm:^10.4.0, @graphql-tools/utils@npm:^10.5.3, @graphql-tools/utils@npm:^10.5.4": + version: 10.5.4 + resolution: "@graphql-tools/utils@npm:10.5.4" dependencies: "@graphql-typed-document-node/core": "npm:^3.1.1" - cross-inspect: "npm:1.0.0" + cross-inspect: "npm:1.0.1" dset: "npm:^3.1.2" tslib: "npm:^2.4.0" peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 10c0/b154aa0cfac7fa56a5ffe09d4c56dd4651f50a8139d4010bebca48b62ffdce3a07727010a2d0c1a2263bdf35a6a937f402db0dcc5a8f06b7009b34a66d84c012 + checksum: 10c0/006d499d87eb5ee4680c43b6848de8a84e51c948d1ca18f98a062a405cf79472b14b93b97a77a1416d7e635f82e60583d432b3c0c2eaaf29eee322e18b8f651f languageName: node linkType: hard @@ -7184,8 +6911,8 @@ __metadata: linkType: hard "@headlessui/react@npm:^2.1.2": - version: 2.1.2 - resolution: "@headlessui/react@npm:2.1.2" + version: 2.1.3 + resolution: "@headlessui/react@npm:2.1.3" dependencies: "@floating-ui/react": "npm:^0.26.16" "@react-aria/focus": "npm:^3.17.1" @@ -7194,7 +6921,7 @@ __metadata: peerDependencies: react: ^18 react-dom: ^18 - checksum: 10c0/40f356b43f3774ce0387f5ebdadd307496ea64e9dae7baaa5046a9b76cbbf6350e3d5dfd7b4f497b161e56a3e408671da724c521ecad6631a95421ce5b59db50 + checksum: 10c0/abe576199248eea574627e243bb62397782957c302e91403bc8eb3678f3771bd9db253302b4c54f65d4191ae9b7134821efdd4781748202d5466b3c1cba53022 languageName: node linkType: hard @@ -7254,11 +6981,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-darwin-arm64@npm:0.33.4": - version: 0.33.4 - resolution: "@img/sharp-darwin-arm64@npm:0.33.4" +"@img/sharp-darwin-arm64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-darwin-arm64@npm:0.33.5" dependencies: - "@img/sharp-libvips-darwin-arm64": "npm:1.0.2" + "@img/sharp-libvips-darwin-arm64": "npm:1.0.4" dependenciesMeta: "@img/sharp-libvips-darwin-arm64": optional: true @@ -7266,11 +6993,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-darwin-x64@npm:0.33.4": - version: 0.33.4 - resolution: "@img/sharp-darwin-x64@npm:0.33.4" +"@img/sharp-darwin-x64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-darwin-x64@npm:0.33.5" dependencies: - "@img/sharp-libvips-darwin-x64": "npm:1.0.2" + "@img/sharp-libvips-darwin-x64": "npm:1.0.4" dependenciesMeta: "@img/sharp-libvips-darwin-x64": optional: true @@ -7278,67 +7005,67 @@ __metadata: languageName: node linkType: hard -"@img/sharp-libvips-darwin-arm64@npm:1.0.2": - version: 1.0.2 - resolution: "@img/sharp-libvips-darwin-arm64@npm:1.0.2" +"@img/sharp-libvips-darwin-arm64@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-darwin-arm64@npm:1.0.4" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@img/sharp-libvips-darwin-x64@npm:1.0.2": - version: 1.0.2 - resolution: "@img/sharp-libvips-darwin-x64@npm:1.0.2" +"@img/sharp-libvips-darwin-x64@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-darwin-x64@npm:1.0.4" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@img/sharp-libvips-linux-arm64@npm:1.0.2": - version: 1.0.2 - resolution: "@img/sharp-libvips-linux-arm64@npm:1.0.2" +"@img/sharp-libvips-linux-arm64@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-linux-arm64@npm:1.0.4" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@img/sharp-libvips-linux-arm@npm:1.0.2": - version: 1.0.2 - resolution: "@img/sharp-libvips-linux-arm@npm:1.0.2" +"@img/sharp-libvips-linux-arm@npm:1.0.5": + version: 1.0.5 + resolution: "@img/sharp-libvips-linux-arm@npm:1.0.5" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@img/sharp-libvips-linux-s390x@npm:1.0.2": - version: 1.0.2 - resolution: "@img/sharp-libvips-linux-s390x@npm:1.0.2" +"@img/sharp-libvips-linux-s390x@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-linux-s390x@npm:1.0.4" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@img/sharp-libvips-linux-x64@npm:1.0.2": - version: 1.0.2 - resolution: "@img/sharp-libvips-linux-x64@npm:1.0.2" +"@img/sharp-libvips-linux-x64@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-linux-x64@npm:1.0.4" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@img/sharp-libvips-linuxmusl-arm64@npm:1.0.2": - version: 1.0.2 - resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.0.2" +"@img/sharp-libvips-linuxmusl-arm64@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.0.4" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@img/sharp-libvips-linuxmusl-x64@npm:1.0.2": - version: 1.0.2 - resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.0.2" +"@img/sharp-libvips-linuxmusl-x64@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.0.4" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@img/sharp-linux-arm64@npm:0.33.4": - version: 0.33.4 - resolution: "@img/sharp-linux-arm64@npm:0.33.4" +"@img/sharp-linux-arm64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-linux-arm64@npm:0.33.5" dependencies: - "@img/sharp-libvips-linux-arm64": "npm:1.0.2" + "@img/sharp-libvips-linux-arm64": "npm:1.0.4" dependenciesMeta: "@img/sharp-libvips-linux-arm64": optional: true @@ -7346,11 +7073,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linux-arm@npm:0.33.4": - version: 0.33.4 - resolution: "@img/sharp-linux-arm@npm:0.33.4" +"@img/sharp-linux-arm@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-linux-arm@npm:0.33.5" dependencies: - "@img/sharp-libvips-linux-arm": "npm:1.0.2" + "@img/sharp-libvips-linux-arm": "npm:1.0.5" dependenciesMeta: "@img/sharp-libvips-linux-arm": optional: true @@ -7358,11 +7085,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linux-s390x@npm:0.33.4": - version: 0.33.4 - resolution: "@img/sharp-linux-s390x@npm:0.33.4" +"@img/sharp-linux-s390x@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-linux-s390x@npm:0.33.5" dependencies: - "@img/sharp-libvips-linux-s390x": "npm:1.0.2" + "@img/sharp-libvips-linux-s390x": "npm:1.0.4" dependenciesMeta: "@img/sharp-libvips-linux-s390x": optional: true @@ -7370,11 +7097,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linux-x64@npm:0.33.4": - version: 0.33.4 - resolution: "@img/sharp-linux-x64@npm:0.33.4" +"@img/sharp-linux-x64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-linux-x64@npm:0.33.5" dependencies: - "@img/sharp-libvips-linux-x64": "npm:1.0.2" + "@img/sharp-libvips-linux-x64": "npm:1.0.4" dependenciesMeta: "@img/sharp-libvips-linux-x64": optional: true @@ -7382,11 +7109,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linuxmusl-arm64@npm:0.33.4": - version: 0.33.4 - resolution: "@img/sharp-linuxmusl-arm64@npm:0.33.4" +"@img/sharp-linuxmusl-arm64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-linuxmusl-arm64@npm:0.33.5" dependencies: - "@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.2" + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.4" dependenciesMeta: "@img/sharp-libvips-linuxmusl-arm64": optional: true @@ -7394,11 +7121,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linuxmusl-x64@npm:0.33.4": - version: 0.33.4 - resolution: "@img/sharp-linuxmusl-x64@npm:0.33.4" +"@img/sharp-linuxmusl-x64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-linuxmusl-x64@npm:0.33.5" dependencies: - "@img/sharp-libvips-linuxmusl-x64": "npm:1.0.2" + "@img/sharp-libvips-linuxmusl-x64": "npm:1.0.4" dependenciesMeta: "@img/sharp-libvips-linuxmusl-x64": optional: true @@ -7406,25 +7133,25 @@ __metadata: languageName: node linkType: hard -"@img/sharp-wasm32@npm:0.33.4": - version: 0.33.4 - resolution: "@img/sharp-wasm32@npm:0.33.4" +"@img/sharp-wasm32@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-wasm32@npm:0.33.5" dependencies: - "@emnapi/runtime": "npm:^1.1.1" + "@emnapi/runtime": "npm:^1.2.0" conditions: cpu=wasm32 languageName: node linkType: hard -"@img/sharp-win32-ia32@npm:0.33.4": - version: 0.33.4 - resolution: "@img/sharp-win32-ia32@npm:0.33.4" +"@img/sharp-win32-ia32@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-win32-ia32@npm:0.33.5" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@img/sharp-win32-x64@npm:0.33.4": - version: 0.33.4 - resolution: "@img/sharp-win32-x64@npm:0.33.4" +"@img/sharp-win32-x64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-win32-x64@npm:0.33.5" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -7799,8 +7526,8 @@ __metadata: linkType: hard "@jsonjoy.com/json-pack@npm:^1.0.3": - version: 1.0.4 - resolution: "@jsonjoy.com/json-pack@npm:1.0.4" + version: 1.1.0 + resolution: "@jsonjoy.com/json-pack@npm:1.1.0" dependencies: "@jsonjoy.com/base64": "npm:^1.1.1" "@jsonjoy.com/util": "npm:^1.1.2" @@ -7808,7 +7535,7 @@ __metadata: thingies: "npm:^1.20.0" peerDependencies: tslib: 2 - checksum: 10c0/c06e57c33d3c18ab31af163e04f77cb759f68386c41375d1e1bd6c28beb1a3cc82217cc3b26f4c94b7385ed28a61e59b01498cf4cec562fd9e464b17eab0cf16 + checksum: 10c0/cdf5cb567a7f2e703d4966a3e3a5f7f7b54ee40a2102aa0ede5c79bcf2060c8465d82f39de8583db4cf1d8415bec8e57dfb1156ef663567b846cdea45813d9d1 languageName: node linkType: hard @@ -7859,9 +7586,9 @@ __metadata: linkType: hard "@lit-labs/ssr-dom-shim@npm:^1.0.0, @lit-labs/ssr-dom-shim@npm:^1.1.0": - version: 1.2.0 - resolution: "@lit-labs/ssr-dom-shim@npm:1.2.0" - checksum: 10c0/016168cf6901ab343462c13fb168dda6d549f8b42680aa394e6b7cd0af7cce51271e00dbfa5bbbe388912bf89cbb8f941a21cc3ec9bf95d6a84b6241aa9e5a72 + version: 1.2.1 + resolution: "@lit-labs/ssr-dom-shim@npm:1.2.1" + checksum: 10c0/75cecf2cc4c1a089c6984d9f45b8264e3b4947b4ebed96aef7eb201bd6b3f26caeaafedf457884ac38d4f2d99cddaf94a4b2414c02c61fbf1f64c0a0dade11f4 languageName: node linkType: hard @@ -8599,22 +8326,22 @@ __metadata: languageName: node linkType: hard -"@netlify/build@npm:29.53.0": - version: 29.53.0 - resolution: "@netlify/build@npm:29.53.0" +"@netlify/build@npm:29.54.0": + version: 29.54.0 + resolution: "@netlify/build@npm:29.54.0" dependencies: "@bugsnag/js": "npm:^7.0.0" "@netlify/blobs": "npm:^7.4.0" "@netlify/cache-utils": "npm:^5.1.6" - "@netlify/config": "npm:^20.18.0" + "@netlify/config": "npm:^20.19.0" "@netlify/edge-bundler": "npm:12.2.3" "@netlify/framework-info": "npm:^9.8.13" - "@netlify/functions-utils": "npm:^5.2.77" + "@netlify/functions-utils": "npm:^5.2.79" "@netlify/git-utils": "npm:^5.1.1" "@netlify/opentelemetry-utils": "npm:^1.2.1" "@netlify/plugins-list": "npm:^6.80.0" "@netlify/run-utils": "npm:^5.1.1" - "@netlify/zip-it-and-ship-it": "npm:9.37.9" + "@netlify/zip-it-and-ship-it": "npm:9.38.0" "@sindresorhus/slugify": "npm:^2.0.0" ansi-escapes: "npm:^6.0.0" chalk: "npm:^5.0.0" @@ -8669,7 +8396,7 @@ __metadata: optional: true bin: netlify-build: bin.js - checksum: 10c0/3d6ff31697226edc5524a5e42063c65cf7ce50b2223753bc82cc36aefb1be6cb2503a643f5e1884b921001510ed98615e2c8a037a45ab359370a2b915eea28b0 + checksum: 10c0/aa85901cd04188ce4d928b12f0e2349a56db05cc4d2edb7a4547b6551de6c9d7c6f40ffd04b5baac3e1f7706a914b46df34b99191dde4e86069270c7009c48d7 languageName: node linkType: hard @@ -8689,41 +8416,7 @@ __metadata: languageName: node linkType: hard -"@netlify/config@npm:20.18.0": - version: 20.18.0 - resolution: "@netlify/config@npm:20.18.0" - dependencies: - "@iarna/toml": "npm:^2.2.5" - chalk: "npm:^5.0.0" - cron-parser: "npm:^4.1.0" - deepmerge: "npm:^4.2.2" - dot-prop: "npm:^7.0.0" - execa: "npm:^6.0.0" - fast-safe-stringify: "npm:^2.0.7" - figures: "npm:^5.0.0" - filter-obj: "npm:^5.0.0" - find-up: "npm:^6.0.0" - indent-string: "npm:^5.0.0" - is-plain-obj: "npm:^4.0.0" - js-yaml: "npm:^4.0.0" - map-obj: "npm:^5.0.0" - netlify: "npm:^13.1.20" - netlify-headers-parser: "npm:^7.1.4" - netlify-redirect-parser: "npm:^14.3.0" - node-fetch: "npm:^3.3.1" - omit.js: "npm:^2.0.2" - p-locate: "npm:^6.0.0" - path-type: "npm:^5.0.0" - tomlify-j0.4: "npm:^3.0.0" - validate-npm-package-name: "npm:^4.0.0" - yargs: "npm:^17.6.0" - bin: - netlify-config: bin.js - checksum: 10c0/9d30802138f49d37733a6bf5fe998efa7e7b5c13fadfd5a5b974ffb4bcbb5b238f280c4748c10184bd01c115ff3ffcc0defee6e4ff74ff874321955d85086852 - languageName: node - linkType: hard - -"@netlify/config@npm:^20.18.0": +"@netlify/config@npm:20.19.0, @netlify/config@npm:^20.19.0": version: 20.19.0 resolution: "@netlify/config@npm:20.19.0" dependencies: @@ -8813,14 +8506,14 @@ __metadata: languageName: node linkType: hard -"@netlify/functions-utils@npm:^5.2.77": - version: 5.2.78 - resolution: "@netlify/functions-utils@npm:5.2.78" +"@netlify/functions-utils@npm:^5.2.79": + version: 5.2.79 + resolution: "@netlify/functions-utils@npm:5.2.79" dependencies: - "@netlify/zip-it-and-ship-it": "npm:9.37.10" + "@netlify/zip-it-and-ship-it": "npm:9.38.0" cpy: "npm:^9.0.0" path-exists: "npm:^5.0.0" - checksum: 10c0/88139e44c4963ab7b63aac4bc0392d4e5b77f021ce2099fcaf897e28fb563e32101463b8dd7f14bf2e386f5350429a522931ea6625c99c11de066db698fc7f9a + checksum: 10c0/22d02a015f099efc65411073fed6f01587684734f0927bbe2aae73b7c689b92b6d9a99930d92fcb15af605ad8c222cd4921a88143f915f42ddeb6c4c2c96a4ea languageName: node linkType: hard @@ -8997,13 +8690,6 @@ __metadata: languageName: node linkType: hard -"@netlify/open-api@npm:^2.33.1": - version: 2.33.1 - resolution: "@netlify/open-api@npm:2.33.1" - checksum: 10c0/0bd583d1bd01e937c8bb6398db8b389f677ef5558c3e8a9ba64fa58aa414aeac80ed5da03ca9353f6b86512b491540f1692f1929f6ac85f05a24f181f69253eb - languageName: node - linkType: hard - "@netlify/open-api@npm:^2.34.0": version: 2.34.0 resolution: "@netlify/open-api@npm:2.34.0" @@ -9046,53 +8732,9 @@ __metadata: languageName: node linkType: hard -"@netlify/zip-it-and-ship-it@npm:9.37.10": - version: 9.37.10 - resolution: "@netlify/zip-it-and-ship-it@npm:9.37.10" - dependencies: - "@babel/parser": "npm:^7.22.5" - "@babel/types": "npm:7.25.2" - "@netlify/binary-info": "npm:^1.0.0" - "@netlify/serverless-functions-api": "npm:^1.22.0" - "@vercel/nft": "npm:^0.27.1" - archiver: "npm:^7.0.0" - common-path-prefix: "npm:^3.0.0" - cp-file: "npm:^10.0.0" - es-module-lexer: "npm:^1.0.0" - esbuild: "npm:0.19.11" - execa: "npm:^6.0.0" - fast-glob: "npm:^3.3.2" - filter-obj: "npm:^5.0.0" - find-up: "npm:^6.0.0" - glob: "npm:^8.0.3" - is-builtin-module: "npm:^3.1.0" - is-path-inside: "npm:^4.0.0" - junk: "npm:^4.0.0" - locate-path: "npm:^7.0.0" - merge-options: "npm:^3.0.4" - minimatch: "npm:^9.0.0" - normalize-path: "npm:^3.0.0" - p-map: "npm:^5.0.0" - path-exists: "npm:^5.0.0" - precinct: "npm:^11.0.0" - require-package-name: "npm:^2.0.1" - resolve: "npm:^2.0.0-next.1" - semver: "npm:^7.3.8" - tmp-promise: "npm:^3.0.2" - toml: "npm:^3.0.0" - unixify: "npm:^1.0.0" - urlpattern-polyfill: "npm:8.0.2" - yargs: "npm:^17.0.0" - zod: "npm:^3.23.8" - bin: - zip-it-and-ship-it: bin.js - checksum: 10c0/96d408dc2b5474705a3a92c80e86377535d315be52eaab26e20a99b81c7b0d9d939aa3f88f3f23973afa9abbd22d32fe10f594508df4ceb245a87d1dcc0994fb - languageName: node - linkType: hard - -"@netlify/zip-it-and-ship-it@npm:9.37.9": - version: 9.37.9 - resolution: "@netlify/zip-it-and-ship-it@npm:9.37.9" +"@netlify/zip-it-and-ship-it@npm:9.38.0": + version: 9.38.0 + resolution: "@netlify/zip-it-and-ship-it@npm:9.38.0" dependencies: "@babel/parser": "npm:^7.22.5" "@babel/types": "npm:7.25.2" @@ -9130,7 +8772,7 @@ __metadata: zod: "npm:^3.23.8" bin: zip-it-and-ship-it: bin.js - checksum: 10c0/592f0a7fe957f1caee505bf1d017ed0f23596fad47da17a1acc03829949654a1c9f4e8bb9927224a3287ddd075a325ac02bc9c6b124944fff8d50094f4b722aa + checksum: 10c0/a332ee8bc73a5b160d558c2b8a6e79c7f7106fe084c460739de8220fae6b7a19034e1b2d4413d40a6afff7630f7bcdd85b466813ee1cf377f72a6e9cdc02b484 languageName: node linkType: hard @@ -9248,7 +8890,7 @@ __metadata: languageName: node linkType: hard -"@noble/curves@npm:1.4.2, @noble/curves@npm:^1.3.0, @noble/curves@npm:^1.4.0, @noble/curves@npm:~1.4.0": +"@noble/curves@npm:1.4.2, @noble/curves@npm:~1.4.0": version: 1.4.2 resolution: "@noble/curves@npm:1.4.2" dependencies: @@ -9257,6 +8899,15 @@ __metadata: languageName: node linkType: hard +"@noble/curves@npm:^1.3.0, @noble/curves@npm:^1.4.0": + version: 1.5.0 + resolution: "@noble/curves@npm:1.5.0" + dependencies: + "@noble/hashes": "npm:1.4.0" + checksum: 10c0/89faed98e7ff1fee086777afcf63b7ec237121ebfe09495eb9ff7f73c7dd696000c795a24a1bedadc804b592d4b3c655f2e4a9fe9a3afe312a9e6376558d3737 + languageName: node + linkType: hard + "@noble/hashes@npm:1.4.0, @noble/hashes@npm:^1.3.1, @noble/hashes@npm:^1.3.3, @noble/hashes@npm:^1.4.0, @noble/hashes@npm:~1.4.0": version: 1.4.0 resolution: "@noble/hashes@npm:1.4.0" @@ -9291,6 +8942,13 @@ __metadata: languageName: node linkType: hard +"@nolyfill/is-core-module@npm:1.0.39": + version: 1.0.39 + resolution: "@nolyfill/is-core-module@npm:1.0.39" + checksum: 10c0/34ab85fdc2e0250879518841f74a30c276bca4f6c3e13526d2d1fe515e1adf6d46c25fcd5989d22ea056d76f7c39210945180b4859fc83b050e2da411aa86289 + languageName: node + linkType: hard + "@npmcli/agent@npm:^2.0.0": version: 2.2.2 resolution: "@npmcli/agent@npm:2.2.2" @@ -10197,81 +9855,81 @@ __metadata: languageName: node linkType: hard -"@oxc-resolver/binding-darwin-arm64@npm:1.10.2": - version: 1.10.2 - resolution: "@oxc-resolver/binding-darwin-arm64@npm:1.10.2" +"@oxc-resolver/binding-darwin-arm64@npm:1.11.0": + version: 1.11.0 + resolution: "@oxc-resolver/binding-darwin-arm64@npm:1.11.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@oxc-resolver/binding-darwin-x64@npm:1.10.2": - version: 1.10.2 - resolution: "@oxc-resolver/binding-darwin-x64@npm:1.10.2" +"@oxc-resolver/binding-darwin-x64@npm:1.11.0": + version: 1.11.0 + resolution: "@oxc-resolver/binding-darwin-x64@npm:1.11.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@oxc-resolver/binding-freebsd-x64@npm:1.10.2": - version: 1.10.2 - resolution: "@oxc-resolver/binding-freebsd-x64@npm:1.10.2" +"@oxc-resolver/binding-freebsd-x64@npm:1.11.0": + version: 1.11.0 + resolution: "@oxc-resolver/binding-freebsd-x64@npm:1.11.0" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@oxc-resolver/binding-linux-arm-gnueabihf@npm:1.10.2": - version: 1.10.2 - resolution: "@oxc-resolver/binding-linux-arm-gnueabihf@npm:1.10.2" +"@oxc-resolver/binding-linux-arm-gnueabihf@npm:1.11.0": + version: 1.11.0 + resolution: "@oxc-resolver/binding-linux-arm-gnueabihf@npm:1.11.0" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@oxc-resolver/binding-linux-arm64-gnu@npm:1.10.2": - version: 1.10.2 - resolution: "@oxc-resolver/binding-linux-arm64-gnu@npm:1.10.2" +"@oxc-resolver/binding-linux-arm64-gnu@npm:1.11.0": + version: 1.11.0 + resolution: "@oxc-resolver/binding-linux-arm64-gnu@npm:1.11.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@oxc-resolver/binding-linux-arm64-musl@npm:1.10.2": - version: 1.10.2 - resolution: "@oxc-resolver/binding-linux-arm64-musl@npm:1.10.2" +"@oxc-resolver/binding-linux-arm64-musl@npm:1.11.0": + version: 1.11.0 + resolution: "@oxc-resolver/binding-linux-arm64-musl@npm:1.11.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@oxc-resolver/binding-linux-x64-gnu@npm:1.10.2": - version: 1.10.2 - resolution: "@oxc-resolver/binding-linux-x64-gnu@npm:1.10.2" +"@oxc-resolver/binding-linux-x64-gnu@npm:1.11.0": + version: 1.11.0 + resolution: "@oxc-resolver/binding-linux-x64-gnu@npm:1.11.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@oxc-resolver/binding-linux-x64-musl@npm:1.10.2": - version: 1.10.2 - resolution: "@oxc-resolver/binding-linux-x64-musl@npm:1.10.2" +"@oxc-resolver/binding-linux-x64-musl@npm:1.11.0": + version: 1.11.0 + resolution: "@oxc-resolver/binding-linux-x64-musl@npm:1.11.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@oxc-resolver/binding-wasm32-wasi@npm:1.10.2": - version: 1.10.2 - resolution: "@oxc-resolver/binding-wasm32-wasi@npm:1.10.2" +"@oxc-resolver/binding-wasm32-wasi@npm:1.11.0": + version: 1.11.0 + resolution: "@oxc-resolver/binding-wasm32-wasi@npm:1.11.0" dependencies: "@napi-rs/wasm-runtime": "npm:^0.2.4" conditions: cpu=wasm32 languageName: node linkType: hard -"@oxc-resolver/binding-win32-arm64-msvc@npm:1.10.2": - version: 1.10.2 - resolution: "@oxc-resolver/binding-win32-arm64-msvc@npm:1.10.2" +"@oxc-resolver/binding-win32-arm64-msvc@npm:1.11.0": + version: 1.11.0 + resolution: "@oxc-resolver/binding-win32-arm64-msvc@npm:1.11.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@oxc-resolver/binding-win32-x64-msvc@npm:1.10.2": - version: 1.10.2 - resolution: "@oxc-resolver/binding-win32-x64-msvc@npm:1.10.2" +"@oxc-resolver/binding-win32-x64-msvc@npm:1.11.0": + version: 1.11.0 + resolution: "@oxc-resolver/binding-win32-x64-msvc@npm:1.11.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -10561,13 +10219,13 @@ __metadata: linkType: hard "@pnpm/npm-conf@npm:^2.1.0": - version: 2.3.0 - resolution: "@pnpm/npm-conf@npm:2.3.0" + version: 2.3.1 + resolution: "@pnpm/npm-conf@npm:2.3.1" dependencies: "@pnpm/config.env-replace": "npm:^1.1.0" "@pnpm/network.ca-file": "npm:^1.0.1" config-chain: "npm:^1.1.11" - checksum: 10c0/605e986805b5bc46bde3d17cdc5a58f9da7da28ac331b83acde055eddefa8ca0e027844d8a97d337b8179ee6964db985214cec1206b76c29d0fcd5496c60abf2 + checksum: 10c0/778a3a34ff7d6000a2594d2a9821f873f737bc56367865718b2cf0ba5d366e49689efe7975148316d7afd8e6f1dcef7d736fbb6ea7ef55caadd1dc93a36bb302 languageName: node linkType: hard @@ -12324,31 +11982,31 @@ __metadata: linkType: hard "@react-aria/focus@npm:^3.17.1": - version: 3.18.1 - resolution: "@react-aria/focus@npm:3.18.1" + version: 3.18.2 + resolution: "@react-aria/focus@npm:3.18.2" dependencies: - "@react-aria/interactions": "npm:^3.22.1" - "@react-aria/utils": "npm:^3.25.1" + "@react-aria/interactions": "npm:^3.22.2" + "@react-aria/utils": "npm:^3.25.2" "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" clsx: "npm:^2.0.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/e52cac0c7b61f5e78fa4e7be7dc090fb5ff028549facaf58488712574042f73f1a0dc9f2f3b96ea2c239f581049bf3b4476aad292a7c9cda378c12d02327f1c6 + checksum: 10c0/378178278effdc8342ac08a198f7479fb6955e8b6c85ff238e1cb47b81fcae88e8fa9b6c14cb00f1e6cc8952a01eff9581b32022e5e631aceaa8dd63d59706a3 languageName: node linkType: hard -"@react-aria/interactions@npm:^3.21.3, @react-aria/interactions@npm:^3.22.1": - version: 3.22.1 - resolution: "@react-aria/interactions@npm:3.22.1" +"@react-aria/interactions@npm:^3.21.3, @react-aria/interactions@npm:^3.22.2": + version: 3.22.2 + resolution: "@react-aria/interactions@npm:3.22.2" dependencies: "@react-aria/ssr": "npm:^3.9.5" - "@react-aria/utils": "npm:^3.25.1" + "@react-aria/utils": "npm:^3.25.2" "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/d54d5398cd0e399b9752f57628b2c58c25add43c74fa785f849ffa187605a14bf0cc5754e1d8859af244cd3bb4478309fdea6e02653b5cbebfc7a66c8142e059 + checksum: 10c0/f5e1b3e8ea040cc2d32b35fcd749ba32d63069a31d407ac4fe08808d32a458a4a76ed7d630e88a38f0ba7cbea315908c020059ea21284b6003b106417da40e7a languageName: node linkType: hard @@ -12363,29 +12021,29 @@ __metadata: languageName: node linkType: hard -"@react-aria/utils@npm:^3.25.1": - version: 3.25.1 - resolution: "@react-aria/utils@npm:3.25.1" +"@react-aria/utils@npm:^3.25.2": + version: 3.25.2 + resolution: "@react-aria/utils@npm:3.25.2" dependencies: "@react-aria/ssr": "npm:^3.9.5" - "@react-stately/utils": "npm:^3.10.2" + "@react-stately/utils": "npm:^3.10.3" "@react-types/shared": "npm:^3.24.1" "@swc/helpers": "npm:^0.5.0" clsx: "npm:^2.0.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/a03638713ce7d4f415256cbd3643ef16f2cfd76839778a4ec3b232c6534bd1b4aa1ce02d77dddca57305a04a220dcf345da187e16ba4ae5b2081d73479bafb33 + checksum: 10c0/9e190a954d6e068439b90ef29ebd95193f8f50b9326b626985b6cb2ed72dd0d85b63c91505ddfc179a58b66940c598d2d9ef047e2dfd81b38c0878e550b2e22e languageName: node linkType: hard -"@react-stately/utils@npm:^3.10.2": - version: 3.10.2 - resolution: "@react-stately/utils@npm:3.10.2" +"@react-stately/utils@npm:^3.10.3": + version: 3.10.3 + resolution: "@react-stately/utils@npm:3.10.3" dependencies: "@swc/helpers": "npm:^0.5.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 10c0/b7cefaeaab45e700916130fbef25480245068d10272e40a18133d5fc6a187f666a2e50bf0c21cb6774060b9b2313a2ff4b188982e759b31995b87a51432c6fe1 + checksum: 10c0/5ab34ed32c49281e01b08d87d1564bae880b68b8d25faf2b3babf825eb75e7029b73fd6469a9567e03a0e152bfaf130700e1c9fb4949d1db62fac5cd33af951e languageName: node linkType: hard @@ -12419,7 +12077,7 @@ __metadata: languageName: node linkType: hard -"@repeaterjs/repeater@npm:^3.0.4": +"@repeaterjs/repeater@npm:^3.0.4, @repeaterjs/repeater@npm:^3.0.6": version: 3.0.6 resolution: "@repeaterjs/repeater@npm:3.0.6" checksum: 10c0/c3915e2603927c7d6a9eb09673bc28fc49ab3a86947ec191a74663b33deebee2fcc4b03c31cc663ff27bd6db9e6c9487639b6935e265d601ce71b8c497f5f4a8 @@ -12552,226 +12210,114 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.20.0" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@rollup/rollup-android-arm-eabi@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.21.0" +"@rollup/rollup-android-arm-eabi@npm:4.21.1": + version: 4.21.1 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.21.1" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-android-arm64@npm:4.20.0" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-android-arm64@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-android-arm64@npm:4.21.0" +"@rollup/rollup-android-arm64@npm:4.21.1": + version: 4.21.1 + resolution: "@rollup/rollup-android-arm64@npm:4.21.1" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.20.0" +"@rollup/rollup-darwin-arm64@npm:4.21.1": + version: 4.21.1 + resolution: "@rollup/rollup-darwin-arm64@npm:4.21.1" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.21.0" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-x64@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.20.0" +"@rollup/rollup-darwin-x64@npm:4.21.1": + version: 4.21.1 + resolution: "@rollup/rollup-darwin-x64@npm:4.21.1" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.21.0" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm-gnueabihf@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.20.0" - conditions: os=linux & cpu=arm & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm-gnueabihf@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.21.0" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.21.1": + version: 4.21.1 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.21.1" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.20.0" +"@rollup/rollup-linux-arm-musleabihf@npm:4.21.1": + version: 4.21.1 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.21.1" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.21.0" - conditions: os=linux & cpu=arm & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm64-gnu@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.20.0" +"@rollup/rollup-linux-arm64-gnu@npm:4.21.1": + version: 4.21.1 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.21.1" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.21.0" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm64-musl@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.20.0" +"@rollup/rollup-linux-arm64-musl@npm:4.21.1": + version: 4.21.1 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.21.1" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.21.0" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.20.0" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.21.0" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.21.1": + version: 4.21.1 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.21.1" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.20.0" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-riscv64-gnu@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.21.0" +"@rollup/rollup-linux-riscv64-gnu@npm:4.21.1": + version: 4.21.1 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.21.1" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.20.0" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-s390x-gnu@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.21.0" +"@rollup/rollup-linux-s390x-gnu@npm:4.21.1": + version: 4.21.1 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.21.1" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.20.0" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-gnu@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.21.0" +"@rollup/rollup-linux-x64-gnu@npm:4.21.1": + version: 4.21.1 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.21.1" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.20.0" +"@rollup/rollup-linux-x64-musl@npm:4.21.1": + version: 4.21.1 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.21.1" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.21.0" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-win32-arm64-msvc@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.20.0" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-arm64-msvc@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.21.0" +"@rollup/rollup-win32-arm64-msvc@npm:4.21.1": + version: 4.21.1 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.21.1" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.20.0" +"@rollup/rollup-win32-ia32-msvc@npm:4.21.1": + version: 4.21.1 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.21.1" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.21.0" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@rollup/rollup-win32-x64-msvc@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.20.0" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-x64-msvc@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.21.0" +"@rollup/rollup-win32-x64-msvc@npm:4.21.1": + version: 4.21.1 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.21.1" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -12862,9 +12408,9 @@ __metadata: linkType: hard "@safe-global/safe-gateway-typescript-sdk@npm:^3.5.3": - version: 3.22.1 - resolution: "@safe-global/safe-gateway-typescript-sdk@npm:3.22.1" - checksum: 10c0/5c294a831fcacf0e77d7b120a592883b0243a312f5bb5999e6c1a839dc7a2ca1a3056fcd0248475eed358eacbb6ddbab053951240d1a42ac68598a97bdb6701e + version: 3.22.2 + resolution: "@safe-global/safe-gateway-typescript-sdk@npm:3.22.2" + checksum: 10c0/4c61c6bc1e720ceb98e7812ef060e40120e130c385f1ac8012a99155179b0651e12f608e053c9e4d1d7917881920e9e3b15c3c90805f9bbb7f28d80b13d04381 languageName: node linkType: hard @@ -13882,9 +13428,9 @@ __metadata: linkType: hard "@substrate/connect-known-chains@npm:^1.1.4": - version: 1.2.2 - resolution: "@substrate/connect-known-chains@npm:1.2.2" - checksum: 10c0/e789404eaca7d4d51981296370a7cf6217cfaf4c9e8ff7421b158204b52abeb90064f543c96b2f3acf8101a72207f8b724c71832f6427b1f3cf2a2d72d7d681a + version: 1.3.0 + resolution: "@substrate/connect-known-chains@npm:1.3.0" + checksum: 10c0/1372dda752b053ae158bfbb8c756df6da062ba233f0b274b529143dc31dcacfdb92002eee61aabe49581cadec3aa9fb7e398f4681ec1a4d98cb6dd3d3ca0e3ca languageName: node linkType: hard @@ -13918,9 +13464,9 @@ __metadata: linkType: hard "@substrate/ss58-registry@npm:^1.44.0": - version: 1.49.0 - resolution: "@substrate/ss58-registry@npm:1.49.0" - checksum: 10c0/b50f32e2f4632b31b3e09cec026fef557b1b72f61b6811673f5b0fbe311c5394c2f19fc4c23f97b014c77eb2d0f535a8f079dfd3fb22d5a1d7b043ceeac0d9ac + version: 1.50.0 + resolution: "@substrate/ss58-registry@npm:1.50.0" + checksum: 10c0/49178248445d88b2f06f6e45e7890bd292f91b9d5d6bfa2788f27b5d9e3a08d3f18462440ea905b2fe7fa60dafb690d40ce1f549929bdbbe48562be622748717 languageName: node linkType: hard @@ -14152,9 +13698,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-darwin-arm64@npm:1.7.6" +"@swc/core-darwin-arm64@npm:1.7.18": + version: 1.7.18 + resolution: "@swc/core-darwin-arm64@npm:1.7.18" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -14166,9 +13712,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-darwin-x64@npm:1.7.6" +"@swc/core-darwin-x64@npm:1.7.18": + version: 1.7.18 + resolution: "@swc/core-darwin-x64@npm:1.7.18" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -14180,9 +13726,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.7.6" +"@swc/core-linux-arm-gnueabihf@npm:1.7.18": + version: 1.7.18 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.7.18" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -14194,9 +13740,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-linux-arm64-gnu@npm:1.7.6" +"@swc/core-linux-arm64-gnu@npm:1.7.18": + version: 1.7.18 + resolution: "@swc/core-linux-arm64-gnu@npm:1.7.18" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard @@ -14208,9 +13754,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-linux-arm64-musl@npm:1.7.6" +"@swc/core-linux-arm64-musl@npm:1.7.18": + version: 1.7.18 + resolution: "@swc/core-linux-arm64-musl@npm:1.7.18" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard @@ -14222,9 +13768,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-linux-x64-gnu@npm:1.7.6" +"@swc/core-linux-x64-gnu@npm:1.7.18": + version: 1.7.18 + resolution: "@swc/core-linux-x64-gnu@npm:1.7.18" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard @@ -14236,9 +13782,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-linux-x64-musl@npm:1.7.6" +"@swc/core-linux-x64-musl@npm:1.7.18": + version: 1.7.18 + resolution: "@swc/core-linux-x64-musl@npm:1.7.18" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard @@ -14250,9 +13796,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-win32-arm64-msvc@npm:1.7.6" +"@swc/core-win32-arm64-msvc@npm:1.7.18": + version: 1.7.18 + resolution: "@swc/core-win32-arm64-msvc@npm:1.7.18" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -14264,9 +13810,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-win32-ia32-msvc@npm:1.7.6" +"@swc/core-win32-ia32-msvc@npm:1.7.18": + version: 1.7.18 + resolution: "@swc/core-win32-ia32-msvc@npm:1.7.18" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -14278,9 +13824,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-win32-x64-msvc@npm:1.7.6" +"@swc/core-win32-x64-msvc@npm:1.7.18": + version: 1.7.18 + resolution: "@swc/core-win32-x64-msvc@npm:1.7.18" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -14332,19 +13878,19 @@ __metadata: linkType: hard "@swc/core@npm:^1.5.7, @swc/core@npm:^1.7.3": - version: 1.7.6 - resolution: "@swc/core@npm:1.7.6" - dependencies: - "@swc/core-darwin-arm64": "npm:1.7.6" - "@swc/core-darwin-x64": "npm:1.7.6" - "@swc/core-linux-arm-gnueabihf": "npm:1.7.6" - "@swc/core-linux-arm64-gnu": "npm:1.7.6" - "@swc/core-linux-arm64-musl": "npm:1.7.6" - "@swc/core-linux-x64-gnu": "npm:1.7.6" - "@swc/core-linux-x64-musl": "npm:1.7.6" - "@swc/core-win32-arm64-msvc": "npm:1.7.6" - "@swc/core-win32-ia32-msvc": "npm:1.7.6" - "@swc/core-win32-x64-msvc": "npm:1.7.6" + version: 1.7.18 + resolution: "@swc/core@npm:1.7.18" + dependencies: + "@swc/core-darwin-arm64": "npm:1.7.18" + "@swc/core-darwin-x64": "npm:1.7.18" + "@swc/core-linux-arm-gnueabihf": "npm:1.7.18" + "@swc/core-linux-arm64-gnu": "npm:1.7.18" + "@swc/core-linux-arm64-musl": "npm:1.7.18" + "@swc/core-linux-x64-gnu": "npm:1.7.18" + "@swc/core-linux-x64-musl": "npm:1.7.18" + "@swc/core-win32-arm64-msvc": "npm:1.7.18" + "@swc/core-win32-ia32-msvc": "npm:1.7.18" + "@swc/core-win32-x64-msvc": "npm:1.7.18" "@swc/counter": "npm:^0.1.3" "@swc/types": "npm:^0.1.12" peerDependencies: @@ -14373,7 +13919,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 10c0/45b37944c9ceceda234b8560df1bffa9c320f92bd4fa374c8eb19e0f37f3f20927c1e993d00efc4cde6012c530ea61699752b519e845370faccf2a244e4cb4dc + checksum: 10c0/4b81421353d2405eacb08e383e57e15cb8852b90f0b1acd799263d9073fb0e595a2d4878547ef82d95986ea39e49a7d48fee34d5b70e9b3fc7c99e64df9bc922 languageName: node linkType: hard @@ -14459,59 +14005,59 @@ __metadata: languageName: node linkType: hard -"@tanstack/query-core@npm:5.52.0": - version: 5.52.0 - resolution: "@tanstack/query-core@npm:5.52.0" - checksum: 10c0/6f2309294d23721e4508241a4e109d6134bd125b732271217181ae99cc7994ec02ff964397e08bc5e9af5302e3838a3f3259d6e49fdf6fc8aaf324bc4fde4939 +"@tanstack/query-core@npm:5.52.2": + version: 5.52.2 + resolution: "@tanstack/query-core@npm:5.52.2" + checksum: 10c0/34bc28f492272642159e6eb41cc45d05669a91a7a9124dcfa4a9b721696b921c0909234373035c9f51159069d71ee449459f0d528de500cfb07e6eb8fdd8857c languageName: node linkType: hard "@tanstack/react-query@npm:^5.52.0": - version: 5.52.0 - resolution: "@tanstack/react-query@npm:5.52.0" + version: 5.52.2 + resolution: "@tanstack/react-query@npm:5.52.2" dependencies: - "@tanstack/query-core": "npm:5.52.0" + "@tanstack/query-core": "npm:5.52.2" peerDependencies: - react: ^18.0.0 - checksum: 10c0/90e46fe0de5ed727a067e6ad0b7731ffa7c068f389577d9185261da175c24d932d50c0f781553a47801b4a1dbfbf63b8ef6e97bab36b1a891eed33cd59eadace + react: ^18 || ^19 + checksum: 10c0/936ecc8d4fbd2f89b5569ae9a2fe6e3c0af6ea02561de5f882b910662f1db1b0d73d7a9cbd94fd4d569a2c0773b5e629da4752dc62d4f3ebcf165f5b56d80c0e languageName: node linkType: hard "@tanstack/react-table@npm:^8.20.1": - version: 8.20.1 - resolution: "@tanstack/react-table@npm:8.20.1" + version: 8.20.5 + resolution: "@tanstack/react-table@npm:8.20.5" dependencies: - "@tanstack/table-core": "npm:8.20.1" + "@tanstack/table-core": "npm:8.20.5" peerDependencies: react: ">=16.8" react-dom: ">=16.8" - checksum: 10c0/dc0bac56425de05bb51dca32d488a6ca4f2395375f8c02b1c0082ee0f654841efa1263b357c62864f7c44ed39c0be1fb547aa7350ee7e39be5c7dd19b4155260 + checksum: 10c0/574fa62fc6868a3b1113dbd043323f8b73aeb60555609caa164d5137a14636d4502784a961191afde2ec46f33f8c2bbfc4561d27a701c3d084e899a632dda3c8 languageName: node linkType: hard "@tanstack/react-virtual@npm:^3.8.1": - version: 3.8.4 - resolution: "@tanstack/react-virtual@npm:3.8.4" + version: 3.10.4 + resolution: "@tanstack/react-virtual@npm:3.10.4" dependencies: - "@tanstack/virtual-core": "npm:3.8.4" + "@tanstack/virtual-core": "npm:3.10.4" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/2c803a0fd9101c75666b894d455c0c793bc50df4b5039e2bc748c4c50b64ec4ebaf3de990ab711d396ad8cd0582ca1858c7d0132d7f72acb57dfd9721464186e + checksum: 10c0/1ae1cabb0cd166acd6e1fc5a46008c150b503ea461f732f08efb09168a87b8b1a6db4ea7d19eb20d2cd62abd51825d35f4b2dcd13f9473afa5b7e1f4e7658104 languageName: node linkType: hard -"@tanstack/table-core@npm:8.20.1": - version: 8.20.1 - resolution: "@tanstack/table-core@npm:8.20.1" - checksum: 10c0/540a4df688cad9261f77ca454aab62720615569805b5396bd012b411bb65dbb3fdf38f2a0b91a60b2e0def139d1517ad9a3f28f2cede5317d70ad1ad0dd1c5a3 +"@tanstack/table-core@npm:8.20.5": + version: 8.20.5 + resolution: "@tanstack/table-core@npm:8.20.5" + checksum: 10c0/3c27b5debd61b6bd9bfbb40bfc7c5d5af90873ae1a566b20e3bf2d2f4f2e9a78061c081aacc5259a00e256f8df506ec250eb5472f5c01ff04baf9918b554982b languageName: node linkType: hard -"@tanstack/virtual-core@npm:3.8.4": - version: 3.8.4 - resolution: "@tanstack/virtual-core@npm:3.8.4" - checksum: 10c0/32b3d7c7d7c380992730f38efe171eddb4841a3f9bdac198ff6f6e7c00da0e22d2984d57dcb27895f234768accb5625fc04946aa8745c22a136b3f31941d42ac +"@tanstack/virtual-core@npm:3.10.4": + version: 3.10.4 + resolution: "@tanstack/virtual-core@npm:3.10.4" + checksum: 10c0/f6dfa898bccaa2a12215227ac09e55a11a8c2fac3112c7a067799c7d55f773d352dee1056311dd65e5ce3d1840d25e4805dc7d9ae55ee963ae5043c13be8ae0a languageName: node linkType: hard @@ -14940,12 +14486,12 @@ __metadata: linkType: hard "@types/eslint@npm:*": - version: 9.6.0 - resolution: "@types/eslint@npm:9.6.0" + version: 9.6.1 + resolution: "@types/eslint@npm:9.6.1" dependencies: "@types/estree": "npm:*" "@types/json-schema": "npm:*" - checksum: 10c0/69301356bc73b85e381ae00931291de2e96d1cc49a112c592c74ee32b2f85412203dea6a333b4315fd9839bb14f364f265cbfe7743fc5a78492ee0326dd6a2c1 + checksum: 10c0/69ba24fee600d1e4c5abe0df086c1a4d798abf13792d8cfab912d76817fe1a894359a1518557d21237fbaf6eda93c5ab9309143dee4c59ef54336d1b3570420e languageName: node linkType: hard @@ -15052,11 +14598,11 @@ __metadata: linkType: hard "@types/http-proxy@npm:^1.17.10, @types/http-proxy@npm:^1.17.8": - version: 1.17.14 - resolution: "@types/http-proxy@npm:1.17.14" + version: 1.17.15 + resolution: "@types/http-proxy@npm:1.17.15" dependencies: "@types/node": "npm:*" - checksum: 10c0/c4bffd87be9aff7e879c05bd2c28716220e0eb39788e3f8d314eee665324ad8f5f0919041cbd710254d553cd9cea023f8b776d4b1ec31d2188eac60af18c3022 + checksum: 10c0/e2bf2fcdf23c88141b8d2c85ed5e5418b62ef78285884a2b5a717af55f4d9062136aa475489d10292093343df58fb81975f34bebd6b9df322288fd9821cbee07 languageName: node linkType: hard @@ -15183,15 +14729,15 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 22.1.0 - resolution: "@types/node@npm:22.1.0" + version: 22.5.0 + resolution: "@types/node@npm:22.5.0" dependencies: - undici-types: "npm:~6.13.0" - checksum: 10c0/553dafcb842b889c036d43b390d464e8ffcf3ca455ddd5b1a1ef98396381eafbeb0c112a15cc6bf9662b72bc25fc45efc4b6f604760e1e84c410f1b7936c488b + undici-types: "npm:~6.19.2" + checksum: 10c0/45aa75c5e71645fac42dced4eff7f197c3fdfff6e8a9fdacd0eb2e748ff21ee70ffb73982f068a58e8d73b2c088a63613142c125236cdcf3c072ea97eada1559 languageName: node linkType: hard -"@types/node@npm:18.19.43, @types/node@npm:^18.0.0": +"@types/node@npm:18.19.43": version: 18.19.43 resolution: "@types/node@npm:18.19.43" dependencies: @@ -15207,6 +14753,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^18.0.0": + version: 18.19.46 + resolution: "@types/node@npm:18.19.46" + dependencies: + undici-types: "npm:~5.26.4" + checksum: 10c0/9b4aae9d2bd84f450f4e64f84d793b8867f7caaa66d0bfff2babf45cd2bb3836f245deb12ebf145da267e39a31a8d9a3484012c2b0a16894d384b66bb0c2b1b5 + languageName: node + linkType: hard + "@types/normalize-package-data@npm:^2.4.1, @types/normalize-package-data@npm:^2.4.3": version: 2.4.4 resolution: "@types/normalize-package-data@npm:2.4.4" @@ -15290,17 +14845,7 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:*, @types/react@npm:^16.8.0 || ^17.0.0 || ^18.0.0": - version: 18.3.3 - resolution: "@types/react@npm:18.3.3" - dependencies: - "@types/prop-types": "npm:*" - csstype: "npm:^3.0.2" - checksum: 10c0/fe455f805c5da13b89964c3d68060cebd43e73ec15001a68b34634604a78140e6fc202f3f61679b9d809dde6d7a7c2cb3ed51e0fd1462557911db09879b55114 - languageName: node - linkType: hard - -"@types/react@npm:18.3.4": +"@types/react@npm:*, @types/react@npm:18.3.4, @types/react@npm:^16.8.0 || ^17.0.0 || ^18.0.0": version: 18.3.4 resolution: "@types/react@npm:18.3.4" dependencies: @@ -15459,16 +15004,16 @@ __metadata: linkType: hard "@types/unist@npm:*, @types/unist@npm:^3.0.0": - version: 3.0.2 - resolution: "@types/unist@npm:3.0.2" - checksum: 10c0/39f220ce184a773c55c18a127062bfc4d0d30c987250cd59bab544d97be6cfec93717a49ef96e81f024b575718f798d4d329eb81c452fc57d6d051af8b043ebf + version: 3.0.3 + resolution: "@types/unist@npm:3.0.3" + checksum: 10c0/2b1e4adcab78388e088fcc3c0ae8700f76619dbcb4741d7d201f87e2cb346bfc29a89003cfea2d76c996e1061452e14fcd737e8b25aacf949c1f2d6b2bc3dd60 languageName: node linkType: hard "@types/unist@npm:^2, @types/unist@npm:^2.0.0": - version: 2.0.10 - resolution: "@types/unist@npm:2.0.10" - checksum: 10c0/5f247dc2229944355209ad5c8e83cfe29419fa7f0a6d557421b1985a1500444719cc9efcc42c652b55aab63c931813c88033e0202c1ac684bcd4829d66e44731 + version: 2.0.11 + resolution: "@types/unist@npm:2.0.11" + checksum: 10c0/24dcdf25a168f453bb70298145eb043cfdbb82472db0bc0b56d6d51cd2e484b9ed8271d4ac93000a80da568f2402e9339723db262d0869e2bf13bc58e081768d languageName: node linkType: hard @@ -15513,7 +15058,7 @@ __metadata: languageName: node linkType: hard -"@types/yargs@npm:^17.0.33": +"@types/yargs@npm:^17.0.33, @types/yargs@npm:^17.0.8": version: 17.0.33 resolution: "@types/yargs@npm:17.0.33" dependencies: @@ -15522,15 +15067,6 @@ __metadata: languageName: node linkType: hard -"@types/yargs@npm:^17.0.8": - version: 17.0.32 - resolution: "@types/yargs@npm:17.0.32" - dependencies: - "@types/yargs-parser": "npm:*" - checksum: 10c0/2095e8aad8a4e66b86147415364266b8d607a3b95b4239623423efd7e29df93ba81bb862784a6e08664f645cc1981b25fd598f532019174cd3e5e1e689e1cccf - languageName: node - linkType: hard - "@types/yauzl@npm:^2.9.1": version: 2.10.3 resolution: "@types/yauzl@npm:2.10.3" @@ -16132,80 +15668,53 @@ __metadata: languageName: node linkType: hard -"@volar/language-core@npm:2.3.4": - version: 2.3.4 - resolution: "@volar/language-core@npm:2.3.4" - dependencies: - "@volar/source-map": "npm:2.3.4" - checksum: 10c0/3bfd6f039788aa6365e1c69fc695305abdb00d3e75fdce2958eb41d1f9fb03b7a300075303430f039c027f62dbd7377c0c266bca52615b4eedd0df9c8aa14de0 - languageName: node - linkType: hard - -"@volar/language-core@npm:2.4.0-alpha.18, @volar/language-core@npm:~2.4.0-alpha.18": - version: 2.4.0-alpha.18 - resolution: "@volar/language-core@npm:2.4.0-alpha.18" +"@volar/language-core@npm:2.4.0, @volar/language-core@npm:~2.4.0-alpha.18": + version: 2.4.0 + resolution: "@volar/language-core@npm:2.4.0" dependencies: - "@volar/source-map": "npm:2.4.0-alpha.18" - checksum: 10c0/1cf2392997b7b197c3761994b694fdfe4d4fa7659c19760b983208c699fdacda01fb46e94740ee9e1db4771d834ec0fabdfb62b74a6ed0c0b90d15b762556338 - languageName: node - linkType: hard - -"@volar/source-map@npm:2.3.4": - version: 2.3.4 - resolution: "@volar/source-map@npm:2.3.4" - checksum: 10c0/04e12088cd79671e2104ee0f5e8cfb5b52a5d2a1499472db243cd0cfa5557c993c08854af9fb183b1cf32ecd122706ad27e6438a7669215c6fc12dd3fc7544d7 - languageName: node - linkType: hard - -"@volar/source-map@npm:2.4.0-alpha.18": - version: 2.4.0-alpha.18 - resolution: "@volar/source-map@npm:2.4.0-alpha.18" - checksum: 10c0/f7b662b50b1d0c14741e96f5f7e2ea887377b2c421d946ff919bfbbfc1dab0b7e76861cc525c1161b24005238d8362bab1c1637c393b65137e4922b3d2309559 + "@volar/source-map": "npm:2.4.0" + checksum: 10c0/10d62ed6556dae586a26899407ff75fa7e30be6df9ee5e2a1f05a38bfbde454ce03a02dd0a8e5fcc396d9cf91ddceec4ac79707cd92e2257e29fdc121d78085c languageName: node linkType: hard -"@volar/typescript@npm:^2.3.4": - version: 2.3.4 - resolution: "@volar/typescript@npm:2.3.4" - dependencies: - "@volar/language-core": "npm:2.3.4" - path-browserify: "npm:^1.0.1" - vscode-uri: "npm:^3.0.8" - checksum: 10c0/d2738db314bffade831e0db75abce269a533aa91e0311a889fd31a83390480db33a06b06418c81dfc291c40ca344c8a687d1970d5ff2c366d0506080d12143bb +"@volar/source-map@npm:2.4.0": + version: 2.4.0 + resolution: "@volar/source-map@npm:2.4.0" + checksum: 10c0/e1bd40c96e7d5e7fcd7270b15909080065154a2227af44b341d0edc7b7a417a13a4b71dd661cd62af0fdad431a0fd50f17393707534c8f3b6891252d0135d86e languageName: node linkType: hard -"@volar/typescript@npm:~2.4.0-alpha.18": - version: 2.4.0-alpha.18 - resolution: "@volar/typescript@npm:2.4.0-alpha.18" +"@volar/typescript@npm:^2.3.4, @volar/typescript@npm:~2.4.0-alpha.18": + version: 2.4.0 + resolution: "@volar/typescript@npm:2.4.0" dependencies: - "@volar/language-core": "npm:2.4.0-alpha.18" + "@volar/language-core": "npm:2.4.0" path-browserify: "npm:^1.0.1" vscode-uri: "npm:^3.0.8" - checksum: 10c0/0a033423f5dac8a4ac88af012025bb0f7d4457a71e484610b1afa7f88888f2ffffd5141069348051b6c03d5002ffbb18db944cab64849d5d7bab937968e6d277 + checksum: 10c0/8684b87edec5ffef034895766daab099a214cb75e49d726825b80bc16dcc046bd84422bd7d19e05bfef3aa174d1e5e1102a80c26732726f625fa277e7674c35a languageName: node linkType: hard -"@vue/compiler-core@npm:3.4.35": - version: 3.4.35 - resolution: "@vue/compiler-core@npm:3.4.35" +"@vue/compiler-core@npm:3.4.38": + version: 3.4.38 + resolution: "@vue/compiler-core@npm:3.4.38" dependencies: "@babel/parser": "npm:^7.24.7" - "@vue/shared": "npm:3.4.35" + "@vue/shared": "npm:3.4.38" entities: "npm:^4.5.0" estree-walker: "npm:^2.0.2" source-map-js: "npm:^1.2.0" - checksum: 10c0/34fe4aaee292cda4e6fadeca6b85e0ca635c6b57aad47054e9764bc56a5dd7621c9ac9df1021b612f336d215add8e8f8674606074471ddac5ea36a759cf59e86 + checksum: 10c0/0031eaaf0ac8898f23c04e6cf9de16ed0ea80fb6597be77c3c02cb4481ad5ccc2fbc31ff96d4317489ac8da94daa0f9c4f2a0d63d53c13e25e769cf97b42ab5a languageName: node linkType: hard "@vue/compiler-dom@npm:^3.4.0": - version: 3.4.35 - resolution: "@vue/compiler-dom@npm:3.4.35" + version: 3.4.38 + resolution: "@vue/compiler-dom@npm:3.4.38" dependencies: - "@vue/compiler-core": "npm:3.4.35" - "@vue/shared": "npm:3.4.35" - checksum: 10c0/e1470ae29a87d4be187a9030f0048df134d6c4672fa24522ce9c3476b9495e7818764512f1ae57b2dac1dee1a87374f68da65ce9e3a70a02f4c9f44f029d19ef + "@vue/compiler-core": "npm:3.4.38" + "@vue/shared": "npm:3.4.38" + checksum: 10c0/3732b85786444151048b31fb47e6ee17e148a91bdd28048e378ebbfad22255434abd1d50fa5c0b2f9b5fc7666c8a386965f8df63da4fcb89cbf4590049685d9e languageName: node linkType: hard @@ -16240,10 +15749,10 @@ __metadata: languageName: node linkType: hard -"@vue/shared@npm:3.4.35, @vue/shared@npm:^3.4.0": - version: 3.4.35 - resolution: "@vue/shared@npm:3.4.35" - checksum: 10c0/a3711abaf4e5be996112387f2304bf5d51d246c680d93eb8894430b37fe3f0edc9f72428ccbb3ed91656e947d3ac9bdcad41f5c6e51bd1121e222901dab8cb10 +"@vue/shared@npm:3.4.38, @vue/shared@npm:^3.4.0": + version: 3.4.38 + resolution: "@vue/shared@npm:3.4.38" + checksum: 10c0/2a5368fa27a8cc59830f7d77df40247c5c61b10f14b7aa1f384bbbd0ff7cea90be46bdf6038320910bec7d7687403a4ae84d75f1681d0a40ff59628f6d044a92 languageName: node linkType: hard @@ -17081,12 +16590,12 @@ __metadata: languageName: node linkType: hard -"@whatwg-node/disposablestack@npm:^0.0.1": - version: 0.0.1 - resolution: "@whatwg-node/disposablestack@npm:0.0.1" +"@whatwg-node/disposablestack@npm:^0.0.3": + version: 0.0.3 + resolution: "@whatwg-node/disposablestack@npm:0.0.3" dependencies: tslib: "npm:^2.6.3" - checksum: 10c0/8e1ecd8695bc0ea9630a4daffbaa4b461261e2421ac2ce56f95b63a38835e3d402f3c5f9be00cbb8afdcf85f0cf46105ef1cac1931c2e7ed929660e02ccd1172 + checksum: 10c0/af4daf2260a29c0d9e20fe776ab2ca7003d6842faeaf1852914743b4f20fcff808df20cd5f0383ebc3c7942c53fb3cd7e24772559dddf0e8168dc80ca6ad75ce languageName: node linkType: hard @@ -17126,13 +16635,13 @@ __metadata: languageName: node linkType: hard -"@whatwg-node/fetch@npm:^0.9.0, @whatwg-node/fetch@npm:^0.9.13, @whatwg-node/fetch@npm:^0.9.17, @whatwg-node/fetch@npm:^0.9.18, @whatwg-node/fetch@npm:^0.9.19": - version: 0.9.19 - resolution: "@whatwg-node/fetch@npm:0.9.19" +"@whatwg-node/fetch@npm:^0.9.0, @whatwg-node/fetch@npm:^0.9.13, @whatwg-node/fetch@npm:^0.9.17, @whatwg-node/fetch@npm:^0.9.18, @whatwg-node/fetch@npm:^0.9.21": + version: 0.9.21 + resolution: "@whatwg-node/fetch@npm:0.9.21" dependencies: - "@whatwg-node/node-fetch": "npm:^0.5.16" + "@whatwg-node/node-fetch": "npm:^0.5.23" urlpattern-polyfill: "npm:^10.0.0" - checksum: 10c0/df446e2348c1ac795f6dd241f5c4c89dc303bfcc44ab27fa85c959d40b542deb6335d19bf5ad8271a40c1d2be66987932bfe83a7fce11831a33dbd97c7d5711e + checksum: 10c0/c0727e32673fa0596aff9786995b308fc92c33290807c72333af2a5c7a7e38ca6e236ec641bb4caded25e30127bee4b9df2e15d47c064970c2f7df58b084ca8d languageName: node linkType: hard @@ -17149,15 +16658,15 @@ __metadata: languageName: node linkType: hard -"@whatwg-node/node-fetch@npm:^0.5.16": - version: 0.5.20 - resolution: "@whatwg-node/node-fetch@npm:0.5.20" +"@whatwg-node/node-fetch@npm:^0.5.23": + version: 0.5.25 + resolution: "@whatwg-node/node-fetch@npm:0.5.25" dependencies: "@kamilkisiela/fast-url-parser": "npm:^1.1.4" busboy: "npm:^1.6.0" fast-querystring: "npm:^1.1.1" tslib: "npm:^2.6.3" - checksum: 10c0/ce1ac9fe52afc027530755f1d09eeddd89e5199c25fa6bd6d3917d672eb2beeb39ea05638679a0581ac4a77e2ca47fc1e88dd04878c1af6b942601a8249c524d + checksum: 10c0/d4d6601dcc0e01ffede5b554ef160a50235732bd77a74cab98f7f7daf535459389f2e627ee17bf066a2d24741de60d58b5ad835778659b62239ae78d5b816881 languageName: node linkType: hard @@ -17171,13 +16680,13 @@ __metadata: languageName: node linkType: hard -"@whatwg-node/server@npm:^0.9.41": - version: 0.9.46 - resolution: "@whatwg-node/server@npm:0.9.46" +"@whatwg-node/server@npm:^0.9.44": + version: 0.9.49 + resolution: "@whatwg-node/server@npm:0.9.49" dependencies: - "@whatwg-node/fetch": "npm:^0.9.19" + "@whatwg-node/fetch": "npm:^0.9.21" tslib: "npm:^2.6.3" - checksum: 10c0/af4eea053e4e0ba7283f9ef93cf17811633660bc04ed7bcd6f3ef63a375f03d7936f84bf3b657a46cd500f5fee4df4a3ed598d32ce66ffbcee86187f2eec6aab + checksum: 10c0/e8d99eceeb309a03061e0860ccf6ac11bf28534d2cd22d9d1b19e972dba7d673bf73fa915715948c59e12c5b86b56da5a9885bd96e740159adc4fa621b07e739 languageName: node linkType: hard @@ -17574,9 +17083,9 @@ __metadata: linkType: hard "adm-zip@npm:^0.5.10": - version: 0.5.14 - resolution: "adm-zip@npm:0.5.14" - checksum: 10c0/1bdef41afb6a6fe35878906e5a8a9037899afeffd2907a0fae7e4b5b67ec722c74b9d23e7633570c26f06e824d3f9406f7271d91dde6a6ca5a49798c8a401c31 + version: 0.5.15 + resolution: "adm-zip@npm:0.5.15" + checksum: 10c0/40ad504176c4b7f41983d11f7ff28acd3ce5b9bd51a09356be2447cb1799de4a4d93f8b0f65f75814add17687445cc807bbcb5ec8f73f44af1aefe4509894a8c languageName: node linkType: hard @@ -18344,11 +17853,11 @@ __metadata: linkType: hard "astring@npm:^1.8.5": - version: 1.8.6 - resolution: "astring@npm:1.8.6" + version: 1.9.0 + resolution: "astring@npm:1.9.0" bin: astring: bin/astring - checksum: 10c0/31f09144597048c11072417959a412f208f8f95ba8dce408dfbc3367acb929f31fbcc00ed5eb61ccbf7c2f1173b9ac8bfcaaa37134a9455050c669b2b036ed88 + checksum: 10c0/e7519544d9824494e80ef0e722bb3a0c543a31440d59691c13aeaceb75b14502af536b23f08db50aa6c632dafaade54caa25f0788aa7550b6b2d6e2df89e0830 languageName: node linkType: hard @@ -18385,9 +17894,9 @@ __metadata: linkType: hard "async@npm:^3.2.0, async@npm:^3.2.3, async@npm:^3.2.4": - version: 3.2.5 - resolution: "async@npm:3.2.5" - checksum: 10c0/1408287b26c6db67d45cb346e34892cee555b8b59e6c68e6f8c3e495cad5ca13b4f218180e871f3c2ca30df4ab52693b66f2f6ff43644760cab0b2198bda79c1 + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 10c0/36484bb15ceddf07078688d95e27076379cc2f87b10c03b6dd8a83e89475a3c8df5848859dd06a4c95af1e4c16fc973de0171a77f18ea00be899aca2a4f85e70 languageName: node linkType: hard @@ -18461,12 +17970,12 @@ __metadata: linkType: hard "avvio@npm:^8.3.0": - version: 8.3.2 - resolution: "avvio@npm:8.3.2" + version: 8.4.0 + resolution: "avvio@npm:8.4.0" dependencies: "@fastify/error": "npm:^3.3.0" fastq: "npm:^1.17.1" - checksum: 10c0/280767ca1259cac1e78fc75ee4f1f6a735914e045015b1ac4c0ce9c5b0933edcb7e9a31fb286a479e51e56562b352dcfa35941e6f555edd341ed5d355e36e4ac + checksum: 10c0/bea7f28e38b57755786852226f380ea087d572f8bbcfe14b59d1239551ef89cecc40229a6ac85e17af44c81a481d03280576586385e93d76bb9f2c5bc75c6067 languageName: node linkType: hard @@ -18478,9 +17987,9 @@ __metadata: linkType: hard "aws4@npm:^1.8.0": - version: 1.13.0 - resolution: "aws4@npm:1.13.0" - checksum: 10c0/4c71398543e432631a226cabafaa138f8070482f99790233840d84847291ec744e739cb18684a68f52125d0e73f82f16f0246d93524ec85167fadb3cf60dfa4f + version: 1.13.1 + resolution: "aws4@npm:1.13.1" + checksum: 10c0/c40a90b998853b92f9d0198e9992f4a94c81f29b02ca02b75952efaef07ff0660e756c7ebd04ff674edfa36c29406abaa8aad84f23dbc8b362d31979a631d3fe languageName: node linkType: hard @@ -18491,25 +18000,14 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.6.7": - version: 1.7.3 - resolution: "axios@npm:1.7.3" - dependencies: - follow-redirects: "npm:^1.15.6" - form-data: "npm:^4.0.0" - proxy-from-env: "npm:^1.1.0" - checksum: 10c0/a18cbe559203efa05fb1fec2d1898e23bf6329bd2575784ee32aa11b5bbe1d54b9f472c49a261294125519cf62aa4fe5ef6e647bb7482eafc15bffe15ab314ce - languageName: node - linkType: hard - -"axios@npm:^1.7.4": - version: 1.7.4 - resolution: "axios@npm:1.7.4" +"axios@npm:^1.6.7, axios@npm:^1.7.4": + version: 1.7.5 + resolution: "axios@npm:1.7.5" dependencies: follow-redirects: "npm:^1.15.6" form-data: "npm:^4.0.0" proxy-from-env: "npm:^1.1.0" - checksum: 10c0/5ea1a93140ca1d49db25ef8e1bd8cfc59da6f9220159a944168860ad15a2743ea21c5df2967795acb15cbe81362f5b157fdebbea39d53117ca27658bab9f7f17 + checksum: 10c0/1d5daeb28b3d1bb2a7b9f0743433c4bfbeaddc15461e50ebde487eec6c009af2515749d5261096dd430c90cd891bd310bcba5ec3967bae2033c4a307f58a6ad3 languageName: node linkType: hard @@ -18650,7 +18148,7 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.10.1, babel-plugin-polyfill-corejs3@npm:^0.10.4, babel-plugin-polyfill-corejs3@npm:^0.10.6": +"babel-plugin-polyfill-corejs3@npm:^0.10.6": version: 0.10.6 resolution: "babel-plugin-polyfill-corejs3@npm:0.10.6" dependencies: @@ -18705,24 +18203,27 @@ __metadata: linkType: hard "babel-preset-current-node-syntax@npm:^1.0.0": - version: 1.0.1 - resolution: "babel-preset-current-node-syntax@npm:1.0.1" + version: 1.1.0 + resolution: "babel-preset-current-node-syntax@npm:1.1.0" dependencies: "@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-bigint": "npm:^7.8.3" - "@babel/plugin-syntax-class-properties": "npm:^7.8.3" - "@babel/plugin-syntax-import-meta": "npm:^7.8.3" + "@babel/plugin-syntax-class-properties": "npm:^7.12.13" + "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" + "@babel/plugin-syntax-import-attributes": "npm:^7.24.7" + "@babel/plugin-syntax-import-meta": "npm:^7.10.4" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" - "@babel/plugin-syntax-numeric-separator": "npm:^7.8.3" + "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" - "@babel/plugin-syntax-top-level-await": "npm:^7.8.3" + "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" + "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/5ba39a3a0e6c37d25e56a4fb843be632dac98d54706d8a0933f9bcb1a07987a96d55c2b5a6c11788a74063fb2534fe68c1f1dbb6c93626850c785e0938495627 + checksum: 10c0/0b838d4412e3322cb4436f246e24e9c00bebcedfd8f00a2f51489db683bd35406bbd55a700759c28d26959c6e03f84dd6a1426f576f440267c1d7a73c5717281 languageName: node linkType: hard @@ -18833,11 +18334,11 @@ __metadata: linkType: hard "bare-stream@npm:^2.0.0": - version: 2.1.3 - resolution: "bare-stream@npm:2.1.3" + version: 2.2.0 + resolution: "bare-stream@npm:2.2.0" dependencies: streamx: "npm:^2.18.0" - checksum: 10c0/8703b1d80318496ea560483943d5f425a160ded8d3d75659571842caf5f374f52668809bc1e39b032af14df7210973995efaf273f8c35986bef697380ef4674a + checksum: 10c0/2c59d5abd5d5c8337f6b090bb5ed6870a96040814a4e36165deccfd0a116094ad526888af676073b0748fb7831fd3d6798da9e687aa699143c453b2b52c9ae0a languageName: node linkType: hard @@ -19692,9 +19193,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001646": - version: 1.0.30001649 - resolution: "caniuse-lite@npm:1.0.30001649" - checksum: 10c0/0ca2f3776324acfc36d72a575e72ffd1408b91f0ac462a6f0aa08ea24d0d16e83f85f652e19d40e6d6d82ab0fb588740f948e7c88d2818fe6bcd68f70ca33acf + version: 1.0.30001653 + resolution: "caniuse-lite@npm:1.0.30001653" + checksum: 10c0/7aedf037541c93744148f599daea93d46d1f93ab4347997189efa2d1f003af8eadd7e1e05347ef09261ac1dc635ce375b8c6c00796245fffb4120a124824a14f languageName: node linkType: hard @@ -20012,26 +19513,7 @@ __metadata: languageName: node linkType: hard -"chromatic@npm:^11.4.0": - version: 11.7.0 - resolution: "chromatic@npm:11.7.0" - peerDependencies: - "@chromatic-com/cypress": ^0.*.* || ^1.0.0 - "@chromatic-com/playwright": ^0.*.* || ^1.0.0 - peerDependenciesMeta: - "@chromatic-com/cypress": - optional: true - "@chromatic-com/playwright": - optional: true - bin: - chroma: dist/bin.js - chromatic: dist/bin.js - chromatic-cli: dist/bin.js - checksum: 10c0/f9164191f0ca4412ebdd2756428c02d5365d5b7e9cc70f509aeda870dfa569ff96654e3b4f6540e2c0f5ec8e49640bccc22dedafc7329fa2a922ac27cbd3b9ce - languageName: node - linkType: hard - -"chromatic@npm:^11.7.1": +"chromatic@npm:^11.4.0, chromatic@npm:^11.7.1": version: 11.7.1 resolution: "chromatic@npm:11.7.1" peerDependencies: @@ -20147,9 +19629,9 @@ __metadata: linkType: hard "cjs-module-lexer@npm:^1.0.0, cjs-module-lexer@npm:^1.2.3": - version: 1.3.1 - resolution: "cjs-module-lexer@npm:1.3.1" - checksum: 10c0/cd98fbf3c7f4272fb0ebf71d08d0c54bc75ce0e30b9d186114e15b4ba791f3d310af65a339eea2a0318599af2818cdd8886d353b43dfab94468f72987397ad16 + version: 1.4.0 + resolution: "cjs-module-lexer@npm:1.4.0" + checksum: 10c0/b5ef03e10297c24f0db56b13d7d2f92e377499c83d7bf9352ec73df544b5310e024dfb1779a6b810e7a06eb18caa6a0e2da5f11df8116af73306f362e67fb61a languageName: node linkType: hard @@ -21018,18 +20500,18 @@ __metadata: linkType: hard "core-js-compat@npm:^3.37.1, core-js-compat@npm:^3.38.0": - version: 3.38.0 - resolution: "core-js-compat@npm:3.38.0" + version: 3.38.1 + resolution: "core-js-compat@npm:3.38.1" dependencies: browserslist: "npm:^4.23.3" - checksum: 10c0/9d653a448b8a491034358d2f052e63dda86f75fb65646e2d313a938212470ba1c2f5a83bf31cc583d6c87a9e8d7b0d49458447cab2ff36c4caa097ae381de336 + checksum: 10c0/d8bc8a35591fc5fbf3e376d793f298ec41eb452619c7ef9de4ea59b74be06e9fda799e0dcbf9ba59880dae87e3b41fb191d744ffc988315642a1272bb9442b31 languageName: node linkType: hard "core-js-pure@npm:^3.23.3": - version: 3.38.0 - resolution: "core-js-pure@npm:3.38.0" - checksum: 10c0/331937ef8c29fd6dc2f87e14a125d7e959881abfced84670cdd289949c85dd992013f9a8f85e9a234b55f912d3638a5873499f672b473a483d2750b22fafe8ac + version: 3.38.1 + resolution: "core-js-pure@npm:3.38.1" + checksum: 10c0/466adbc0468b8c2a95b9bc49829492dece2cc6584d757c5b38555a26ed3d71f8364ac1ea3128a0a949e004e0e60206cc535ed84320982c3efb9a40c1785ddcc6 languageName: node linkType: hard @@ -21110,7 +20592,7 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^8.1.0, cosmiconfig@npm:^8.1.3": +"cosmiconfig@npm:^8.1.3": version: 8.3.6 resolution: "cosmiconfig@npm:8.3.6" dependencies: @@ -21297,12 +20779,12 @@ __metadata: languageName: node linkType: hard -"cross-inspect@npm:1.0.0": - version: 1.0.0 - resolution: "cross-inspect@npm:1.0.0" +"cross-inspect@npm:1.0.1": + version: 1.0.1 + resolution: "cross-inspect@npm:1.0.1" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/53530865c357c69a5a0543e2f2c61d3d46c9c316a19169372f5094cfb0a7c7e674f2daf2d5253a6731dfd9a8538aa4a4e13c6b4613b6f72b48bb0c41d2015ff4 + checksum: 10c0/2493ee47a801b46ede1c42ca6242b8d2059f7319b5baf23887bbaf46a6ea8e536d2e271d0990176c05092f67b32d084ffd8c93e7c1227eff4a06cceadb49af47 languageName: node linkType: hard @@ -21664,43 +21146,43 @@ __metadata: languageName: node linkType: hard -"cssnano-preset-default@npm:^7.0.4": - version: 7.0.4 - resolution: "cssnano-preset-default@npm:7.0.4" +"cssnano-preset-default@npm:^7.0.5": + version: 7.0.5 + resolution: "cssnano-preset-default@npm:7.0.5" dependencies: - browserslist: "npm:^4.23.1" + browserslist: "npm:^4.23.3" css-declaration-sorter: "npm:^7.2.0" cssnano-utils: "npm:^5.0.0" - postcss-calc: "npm:^10.0.0" - postcss-colormin: "npm:^7.0.1" - postcss-convert-values: "npm:^7.0.2" - postcss-discard-comments: "npm:^7.0.1" - postcss-discard-duplicates: "npm:^7.0.0" + postcss-calc: "npm:^10.0.1" + postcss-colormin: "npm:^7.0.2" + postcss-convert-values: "npm:^7.0.3" + postcss-discard-comments: "npm:^7.0.2" + postcss-discard-duplicates: "npm:^7.0.1" postcss-discard-empty: "npm:^7.0.0" postcss-discard-overridden: "npm:^7.0.0" - postcss-merge-longhand: "npm:^7.0.2" - postcss-merge-rules: "npm:^7.0.2" + postcss-merge-longhand: "npm:^7.0.3" + postcss-merge-rules: "npm:^7.0.3" postcss-minify-font-values: "npm:^7.0.0" postcss-minify-gradients: "npm:^7.0.0" - postcss-minify-params: "npm:^7.0.1" - postcss-minify-selectors: "npm:^7.0.2" + postcss-minify-params: "npm:^7.0.2" + postcss-minify-selectors: "npm:^7.0.3" postcss-normalize-charset: "npm:^7.0.0" postcss-normalize-display-values: "npm:^7.0.0" postcss-normalize-positions: "npm:^7.0.0" postcss-normalize-repeat-style: "npm:^7.0.0" postcss-normalize-string: "npm:^7.0.0" postcss-normalize-timing-functions: "npm:^7.0.0" - postcss-normalize-unicode: "npm:^7.0.1" + postcss-normalize-unicode: "npm:^7.0.2" postcss-normalize-url: "npm:^7.0.0" postcss-normalize-whitespace: "npm:^7.0.0" postcss-ordered-values: "npm:^7.0.1" - postcss-reduce-initial: "npm:^7.0.1" + postcss-reduce-initial: "npm:^7.0.2" postcss-reduce-transforms: "npm:^7.0.0" postcss-svgo: "npm:^7.0.1" - postcss-unique-selectors: "npm:^7.0.1" + postcss-unique-selectors: "npm:^7.0.2" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/0083821e778bdf7b8aa9589408a01a717be730f73584e7b81756a6fcf87af05b8f17342025e666572a8d573cc30783f2d817b0f7ad63670398bc3135b017ccad + checksum: 10c0/ffa7c6fa16c6ad98b7732fc563de74d492e6ad6d243a9f00431c0cbdbc576bcd49226d2695d881465d32dea0a2916add40ac10e7560dd7b5de9fd0fa25ee081b languageName: node linkType: hard @@ -21735,14 +21217,14 @@ __metadata: linkType: hard "cssnano@npm:^7.0.1": - version: 7.0.4 - resolution: "cssnano@npm:7.0.4" + version: 7.0.5 + resolution: "cssnano@npm:7.0.5" dependencies: - cssnano-preset-default: "npm:^7.0.4" + cssnano-preset-default: "npm:^7.0.5" lilconfig: "npm:^3.1.2" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/3939a0b37b11cb4bae92f7916517c7ba21257551f92517b49a640d5df32e855fb7e73321f4be44d2c2de578309c05d711cdcb1976e95607b1b7f92bd4cbd1350 + checksum: 10c0/cb43ed964787dca33efb44d8f4fea8a49c495db44d1d12940493f0dd5d63db78e01c5b140fe42b480b332733602a25f4c85186d00977eb3070b29f7422761985 languageName: node linkType: hard @@ -22079,10 +21561,10 @@ __metadata: languageName: node linkType: hard -"dayjs@npm:1.11.12, dayjs@npm:^1.10.4": - version: 1.11.12 - resolution: "dayjs@npm:1.11.12" - checksum: 10c0/9673d37f3f9ad8a91caaeae9b3fea9a0010c81c7f58599fb9d860bc3359b86632fbff8eb7dddc86c2acaab01c5e6860bc672952f17b58c9286140c52b077c8e4 +"dayjs@npm:1.11.13, dayjs@npm:^1.10.4": + version: 1.11.13 + resolution: "dayjs@npm:1.11.13" + checksum: 10c0/a3caf6ac8363c7dade9d1ee797848ddcf25c1ace68d9fe8678ecf8ba0675825430de5d793672ec87b24a69bf04a1544b176547b2539982275d5542a7955f35b7 languageName: node linkType: hard @@ -23166,13 +22648,13 @@ __metadata: linkType: hard "eciesjs@npm:^0.3.15": - version: 0.3.19 - resolution: "eciesjs@npm:0.3.19" + version: 0.3.20 + resolution: "eciesjs@npm:0.3.20" dependencies: "@types/secp256k1": "npm:^4.0.6" futoin-hkdf: "npm:^1.5.3" secp256k1: "npm:^5.0.0" - checksum: 10c0/8fc86c7675f0e7bb169c546b5422992d52bbbeeeea6abb8e958815b09138873d195a00c708ffa239da29160344b594858ee0d04b3010598b25426029ec75b1c1 + checksum: 10c0/b8706ef28f6f3721002c901afe97d29976a12cec0f0e9a15728741d69006449ad2a6ad75688e52d18d5c1341704ff6706ada30ca2fd4a88d7ca610bc651492a8 languageName: node linkType: hard @@ -23206,9 +22688,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.5.4": - version: 1.5.4 - resolution: "electron-to-chromium@npm:1.5.4" - checksum: 10c0/139abf1b7281c2f3288819fb9b114f09d541ac38c9f0373f194ce2d483d82d118b8751f1b2a59b04ed0d8f414071b58508a40050fc0f23b5aa7e38d11d0cf30c + version: 1.5.13 + resolution: "electron-to-chromium@npm:1.5.13" + checksum: 10c0/1d88ac39447e1d718c4296f92fe89836df4688daf2d362d6c49108136795f05a56dd9c950f1c6715e0395fa037c3b5f5ea686c543fdc90e6d74a005877c45022 languageName: node linkType: hard @@ -23228,8 +22710,8 @@ __metadata: linkType: hard "elliptic@npm:^6.4.0, elliptic@npm:^6.5.2, elliptic@npm:^6.5.3, elliptic@npm:^6.5.4, elliptic@npm:^6.5.5": - version: 6.5.6 - resolution: "elliptic@npm:6.5.6" + version: 6.5.7 + resolution: "elliptic@npm:6.5.7" dependencies: bn.js: "npm:^4.11.9" brorand: "npm:^1.1.0" @@ -23238,7 +22720,7 @@ __metadata: inherits: "npm:^2.0.4" minimalistic-assert: "npm:^1.0.1" minimalistic-crypto-utils: "npm:^1.0.1" - checksum: 10c0/635ccd2b3c76a8506071804fc1f7b34db62f8b1b570032f593417f2a84853211d891003ec952730a310577ac30898bc338c91c10d53d4b9e13339896b05420a1 + checksum: 10c0/799959b6c54ea3564e8961f35abdf8c77e37617f3051614b05ab1fb6a04ddb65bd1caa75ed1bae375b15dda312a0f79fed26ebe76ecf05c5a7af244152a601b8 languageName: node linkType: hard @@ -23264,9 +22746,9 @@ __metadata: linkType: hard "emoji-regex@npm:^10.3.0": - version: 10.3.0 - resolution: "emoji-regex@npm:10.3.0" - checksum: 10c0/b4838e8dcdceb44cf47f59abe352c25ff4fe7857acaf5fb51097c427f6f75b44d052eb907a7a3b86f86bc4eae3a93f5c2b7460abe79c407307e6212d65c91163 + version: 10.4.0 + resolution: "emoji-regex@npm:10.4.0" + checksum: 10c0/a3fcedfc58bfcce21a05a5f36a529d81e88d602100145fcca3dc6f795e3c8acc4fc18fe773fbf9b6d6e9371205edb3afa2668ec3473fa2aa7fd47d2a9d46482d languageName: node linkType: hard @@ -23361,7 +22843,7 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.12.0, enhanced-resolve@npm:^5.16.0, enhanced-resolve@npm:^5.7.0, enhanced-resolve@npm:^5.8.3": +"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.15.0, enhanced-resolve@npm:^5.16.0, enhanced-resolve@npm:^5.7.0, enhanced-resolve@npm:^5.8.3": version: 5.17.1 resolution: "enhanced-resolve@npm:5.17.1" dependencies: @@ -24165,32 +23647,39 @@ __metadata: linkType: hard "eslint-import-resolver-typescript@npm:^3.5.2, eslint-import-resolver-typescript@npm:^3.6.1": - version: 3.6.1 - resolution: "eslint-import-resolver-typescript@npm:3.6.1" + version: 3.6.3 + resolution: "eslint-import-resolver-typescript@npm:3.6.3" dependencies: - debug: "npm:^4.3.4" - enhanced-resolve: "npm:^5.12.0" - eslint-module-utils: "npm:^2.7.4" - fast-glob: "npm:^3.3.1" - get-tsconfig: "npm:^4.5.0" - is-core-module: "npm:^2.11.0" + "@nolyfill/is-core-module": "npm:1.0.39" + debug: "npm:^4.3.5" + enhanced-resolve: "npm:^5.15.0" + eslint-module-utils: "npm:^2.8.1" + fast-glob: "npm:^3.3.2" + get-tsconfig: "npm:^4.7.5" + is-bun-module: "npm:^1.0.2" is-glob: "npm:^4.0.3" peerDependencies: eslint: "*" eslint-plugin-import: "*" - checksum: 10c0/cb1cb4389916fe78bf8c8567aae2f69243dbfe624bfe21078c56ad46fa1ebf0634fa7239dd3b2055ab5c27359e4b4c28b69b11fcb3a5df8a9e6f7add8e034d86 + eslint-plugin-import-x: "*" + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + checksum: 10c0/5933b00791b7b077725b9ba9a85327d2e2dc7c8944c18a868feb317a0bf0e1e77aed2254c9c5e24dcc49360d119331d2c15281837f4269592965ace380a75111 languageName: node linkType: hard -"eslint-module-utils@npm:^2.7.4, eslint-module-utils@npm:^2.8.0": - version: 2.8.1 - resolution: "eslint-module-utils@npm:2.8.1" +"eslint-module-utils@npm:^2.8.0, eslint-module-utils@npm:^2.8.1": + version: 2.8.2 + resolution: "eslint-module-utils@npm:2.8.2" dependencies: debug: "npm:^3.2.7" peerDependenciesMeta: eslint: optional: true - checksum: 10c0/1aeeb97bf4b688d28de136ee57c824480c37691b40fa825c711a4caf85954e94b99c06ac639d7f1f6c1d69223bd21bcb991155b3e589488e958d5b83dfd0f882 + checksum: 10c0/98c5ca95db75507b148c05d157b287116c677bfc9ca6bef4d5455c8b199eb2c35b9204a15ca7a3497085daef8ca3a3f579bd9e753ad4ad4df6256e4ef1107c51 languageName: node linkType: hard @@ -25401,7 +24890,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.5, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.1, fast-glob@npm:^3.3.2": +"fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.5, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2": version: 3.3.2 resolution: "fast-glob@npm:3.3.2" dependencies: @@ -25625,14 +25114,14 @@ __metadata: linkType: hard "fdir@npm:^6.0.1": - version: 6.2.0 - resolution: "fdir@npm:6.2.0" + version: 6.3.0 + resolution: "fdir@npm:6.3.0" peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true - checksum: 10c0/9f7dad7d3c9c0bc5ce3df61fe2d6d75950e0ad585dee2df26d36edfbd81c63db31eca4cf281d9399a1054618de41030b1911fd5145486b07e2e698553f49c261 + checksum: 10c0/be91cd6ab2edbc6df457a69b79672ee9345996986821918ef01908ce9619b8cbecd9c6c13d4ca5d0aeb548b162050d68c599f45bb3fbff194a91e16f25e646b5 languageName: node linkType: hard @@ -26127,9 +25616,9 @@ __metadata: linkType: hard "flow-parser@npm:0.*": - version: 0.242.1 - resolution: "flow-parser@npm:0.242.1" - checksum: 10c0/7aaf2f0e6b4bfa78bd3f8981de1063a23810aa8d32f6dbe20d429a787e4e4ab0fbc2b43790b50138cb294b2ca9dc3309ad22b41f8f4102ea047007bb1e5ca353 + version: 0.244.0 + resolution: "flow-parser@npm:0.244.0" + checksum: 10c0/094192d431c06b48e7788cda76b6c0f386669895a83ad72456eea299dcc98bf653050f3a92678bdec99389c769353e4cc56a4e869d81622f6e0ce1054372a330 languageName: node linkType: hard @@ -26186,12 +25675,12 @@ __metadata: linkType: hard "foreground-child@npm:^3.1.0": - version: 3.2.1 - resolution: "foreground-child@npm:3.2.1" + version: 3.3.0 + resolution: "foreground-child@npm:3.3.0" dependencies: cross-spawn: "npm:^7.0.0" signal-exit: "npm:^4.0.1" - checksum: 10c0/9a53a33dbd87090e9576bef65fb4a71de60f6863a8062a7b11bc1cbe3cc86d428677d7c0b9ef61cdac11007ac580006f78bd5638618d564cfd5e6fd713d6878f + checksum: 10c0/028f1d41000553fcfa6c4bb5c372963bf3d9bf0b1f25a87d1a6253014343fb69dfb1b42d9625d7cf44c8ba429940f3d0ff718b62105d4d4a4f6ef8ca0a53faa2 languageName: node linkType: hard @@ -26319,8 +25808,8 @@ __metadata: linkType: hard "framer-motion@npm:^11.3.29": - version: 11.3.29 - resolution: "framer-motion@npm:11.3.29" + version: 11.3.30 + resolution: "framer-motion@npm:11.3.30" dependencies: tslib: "npm:^2.4.0" peerDependencies: @@ -26334,7 +25823,7 @@ __metadata: optional: true react-dom: optional: true - checksum: 10c0/f60d9bbeca70a803f80d390bd7db42c2b7cb497d24bc788719dc46325ce81c629a0c92260aea0a25747b39b6dee889203a1c44710e0741cfc4d83441ba32a763 + checksum: 10c0/58355809d13f65bbd7a903de755cf1b78d9d3d5039de9b2ae0e25a6ab77748e3429c93e8056ad6fab378e4d0f1cf256133c11cd51f07b9b4d64550feea675b54 languageName: node linkType: hard @@ -26799,7 +26288,7 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.5.0, get-tsconfig@npm:^4.7.0, get-tsconfig@npm:^4.7.5": +"get-tsconfig@npm:^4.7.0, get-tsconfig@npm:^4.7.5": version: 4.7.6 resolution: "get-tsconfig@npm:4.7.6" dependencies: @@ -27368,8 +26857,8 @@ __metadata: linkType: hard "graphql-config@npm:^5.0.2": - version: 5.1.0 - resolution: "graphql-config@npm:5.1.0" + version: 5.1.2 + resolution: "graphql-config@npm:5.1.2" dependencies: "@graphql-tools/graphql-file-loader": "npm:^8.0.0" "@graphql-tools/json-file-loader": "npm:^8.0.0" @@ -27377,9 +26866,9 @@ __metadata: "@graphql-tools/merge": "npm:^9.0.0" "@graphql-tools/url-loader": "npm:^8.0.0" "@graphql-tools/utils": "npm:^10.0.0" - cosmiconfig: "npm:^8.1.0" + cosmiconfig: "npm:^9.0.0" jiti: "npm:^1.18.2" - minimatch: "npm:^4.2.3" + minimatch: "npm:^9.0.5" string-env-interpolation: "npm:^1.0.1" tslib: "npm:^2.4.0" peerDependencies: @@ -27388,7 +26877,7 @@ __metadata: peerDependenciesMeta: cosmiconfig-toml-loader: optional: true - checksum: 10c0/bd2ce60b75ea8117cb977c22aa57e19414e4f61dcc36980602dcb58a5a14cd8de1260139822667887563c89d93ef3a9e8a29cec7bbcfc2a2ee3b0462cc89241a + checksum: 10c0/9f61bba544d7de757e4572445bdc55bd0d1be01bf3def06833834a7ae070cb8fc3b83f2ab7f47f4fd9f4855f18a2f9528124e0a4c6630c72e1ff012a2cc85154 languageName: node linkType: hard @@ -27480,9 +26969,9 @@ __metadata: languageName: node linkType: hard -"graphql-yoga@npm:^5.6.0": - version: 5.6.3 - resolution: "graphql-yoga@npm:5.6.3" +"graphql-yoga@npm:^5.7.0": + version: 5.7.0 + resolution: "graphql-yoga@npm:5.7.0" dependencies: "@envelop/core": "npm:^5.0.1" "@graphql-tools/executor": "npm:^1.3.0" @@ -27491,13 +26980,13 @@ __metadata: "@graphql-yoga/logger": "npm:^2.0.0" "@graphql-yoga/subscription": "npm:^5.0.1" "@whatwg-node/fetch": "npm:^0.9.18" - "@whatwg-node/server": "npm:^0.9.41" + "@whatwg-node/server": "npm:^0.9.44" dset: "npm:^3.1.1" lru-cache: "npm:^10.0.0" tslib: "npm:^2.5.2" peerDependencies: graphql: ^15.2.0 || ^16.0.0 - checksum: 10c0/0196963b5c78cb10dd673dc785d6895e1f6d14c8442a626e728889c027422332def571a110deac2de0d18975817486d73e7d8d82bbff2c1fa29e3e372ebf95fc + checksum: 10c0/dc7524bd076bf336ca671a40a9765cf5ec66c0c6feda658bcd817966814010c849a7fa5b49ffdc3121ad9887b9791a460bf51ebdab3d0c7d2b9d5038230c6328 languageName: node linkType: hard @@ -28495,9 +27984,9 @@ __metadata: linkType: hard "ignore@npm:^5.0.4, ignore@npm:^5.1.9, ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.1": - version: 5.3.1 - resolution: "ignore@npm:5.3.1" - checksum: 10c0/703f7f45ffb2a27fb2c5a8db0c32e7dee66b33a225d28e8db4e1be6474795f606686a6e3bcc50e1aa12f2042db4c9d4a7d60af3250511de74620fbed052ea4cd + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 languageName: node linkType: hard @@ -29010,6 +28499,15 @@ __metadata: languageName: node linkType: hard +"is-bun-module@npm:^1.0.2": + version: 1.1.0 + resolution: "is-bun-module@npm:1.1.0" + dependencies: + semver: "npm:^7.6.3" + checksum: 10c0/17cae968c3fe08e2bd66f8477e4d5a166d6299b5e7ce5c7558355551c50267f77dd386297fada6b68e4a32f01ce8920b0423e4d258242ea463b45901ec474beb + languageName: node + linkType: hard + "is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" @@ -29039,12 +28537,12 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.11.0, is-core-module@npm:^2.12.1, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1, is-core-module@npm:^2.5.0": - version: 2.15.0 - resolution: "is-core-module@npm:2.15.0" +"is-core-module@npm:^2.12.1, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1, is-core-module@npm:^2.5.0": + version: 2.15.1 + resolution: "is-core-module@npm:2.15.1" dependencies: hasown: "npm:^2.0.2" - checksum: 10c0/da161f3d9906f459486da65609b2f1a2dfdc60887c689c234d04e88a062cb7920fa5be5fb7ab08dc43b732929653c4135ef05bf77888ae2a9040ce76815eb7b1 + checksum: 10c0/53432f10c69c40bfd2fa8914133a68709ff9498c86c3bf5fca3cdf3145a56fd2168cbf4a43b29843a6202a120a5f9c5ffba0a4322e1e3441739bc0b641682612 languageName: node linkType: hard @@ -30383,9 +29881,9 @@ __metadata: linkType: hard "jose@npm:^5.0.0": - version: 5.6.3 - resolution: "jose@npm:5.6.3" - checksum: 10c0/c33d8d37b86a17b1f720c667a1208248171b602375131828f645fff0d71a2fbe9b5e2a47c3fd9b7c3e41f3bf25761398150d1f158a2ee1b616ac90cf56f5e862 + version: 5.8.0 + resolution: "jose@npm:5.8.0" + checksum: 10c0/f4dba1bbc41c46ae549840c3f99db07e72c1a191dffeef46bbd81c5fdc01827bb4be4d9f3e77d37887ffb56c57bd276e5fde314e6e790db19809008e47004c48 languageName: node linkType: hard @@ -30547,8 +30045,8 @@ __metadata: linkType: hard "jsdom@npm:^24.0.0, jsdom@npm:~24.1.1": - version: 24.1.1 - resolution: "jsdom@npm:24.1.1" + version: 24.1.3 + resolution: "jsdom@npm:24.1.3" dependencies: cssstyle: "npm:^4.0.1" data-urls: "npm:^5.0.0" @@ -30576,7 +30074,7 @@ __metadata: peerDependenciesMeta: canvas: optional: true - checksum: 10c0/02d6bfe32f09f26329c0e53ad9f9883a3c671fc1f75725167d2089ca412f5b7ca85ff8aa62327d1cc6fc70ffbb3b18dfc7642c4b2096c2c8b19aaf9a48473eb3 + checksum: 10c0/e48b342afacd7418a23dac204a62deea729c50f4d072a7c04c09fd32355fdb4335f8779fa79fd0277a2dbeb2d356250a950955719d00047324b251233b11277f languageName: node linkType: hard @@ -31123,12 +30621,12 @@ __metadata: linkType: hard "launch-editor@npm:^2.6.0, launch-editor@npm:^2.6.1": - version: 2.8.0 - resolution: "launch-editor@npm:2.8.0" + version: 2.8.1 + resolution: "launch-editor@npm:2.8.1" dependencies: picocolors: "npm:^1.0.0" shell-quote: "npm:^1.8.1" - checksum: 10c0/bfe946d4eda8d3405b1e15d2ad71323c9f31c5cf1412733d3f933a06a967c93e76965ec7b88a312616321e73ed77ccdf67ac8f9f0ba137709f07edcc21156e4e + checksum: 10c0/e18fcda6617a995306602871c7a71ddcfdd82d88a57508ae970be86bfb6685f131cf9ddb8896df4e8e4cde6d0e2d14318d2b41314eaae6abf03ca205948daa27 languageName: node linkType: hard @@ -32056,13 +31554,13 @@ __metadata: linkType: hard "magicast@npm:^0.3.3": - version: 0.3.4 - resolution: "magicast@npm:0.3.4" + version: 0.3.5 + resolution: "magicast@npm:0.3.5" dependencies: - "@babel/parser": "npm:^7.24.4" - "@babel/types": "npm:^7.24.0" + "@babel/parser": "npm:^7.25.4" + "@babel/types": "npm:^7.25.4" source-map-js: "npm:^1.2.0" - checksum: 10c0/7ebaaac397b13c31ca05e6d9649296751d76749b945d10a0800107872119fbdf267acdb604571d25e38ec6fd7ab3568a951b6e76eaef1caba9eaa11778fd9783 + checksum: 10c0/a6cacc0a848af84f03e3f5bda7b0de75e4d0aa9ddce5517fd23ed0f31b5ddd51b2d0ff0b7e09b51f7de0f4053c7a1107117edda6b0732dca3e9e39e6c5a68c64 languageName: node linkType: hard @@ -32170,11 +31668,11 @@ __metadata: linkType: hard "markdown-to-jsx@npm:^7.4.5": - version: 7.4.7 - resolution: "markdown-to-jsx@npm:7.4.7" + version: 7.5.0 + resolution: "markdown-to-jsx@npm:7.5.0" peerDependencies: react: ">= 0.14.0" - checksum: 10c0/7dab3e2c8d7374c45e6ca34fd12b40453533a5b89749eff3359975b1d296c553ff7675f56be7c9d1fb3b97b7b7d143d1b3237137d5c262322e0534eea72e2800 + checksum: 10c0/88213e64afd41d6934fbb70bcea0e2ef1f9553db1ba4c6f423b17d6e9c2b99c82b0fcbed29036dd5b91704b170803d1fae730ab40ae27af5c7994e2717686ebc languageName: node linkType: hard @@ -32259,15 +31757,15 @@ __metadata: linkType: hard "mdast-util-gfm-autolink-literal@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-gfm-autolink-literal@npm:2.0.0" + version: 2.0.1 + resolution: "mdast-util-gfm-autolink-literal@npm:2.0.1" dependencies: "@types/mdast": "npm:^4.0.0" ccount: "npm:^2.0.0" devlop: "npm:^1.0.0" mdast-util-find-and-replace: "npm:^3.0.0" micromark-util-character: "npm:^2.0.0" - checksum: 10c0/821ef91db108f05b321c54fdf4436df9d6badb33e18f714d8d52c0e70f988f5b6b118cdd4d607b4cb3bef1718304ce7e9fb25fa580622c3d20d68c1489c64875 + checksum: 10c0/963cd22bd42aebdec7bdd0a527c9494d024d1ad0739c43dc040fee35bdfb5e29c22564330a7418a72b5eab51d47a6eff32bc0255ef3ccb5cebfe8970e91b81b6 languageName: node linkType: hard @@ -32350,8 +31848,8 @@ __metadata: linkType: hard "mdast-util-mdx-jsx@npm:^3.0.0": - version: 3.1.2 - resolution: "mdast-util-mdx-jsx@npm:3.1.2" + version: 3.1.3 + resolution: "mdast-util-mdx-jsx@npm:3.1.3" dependencies: "@types/estree-jsx": "npm:^1.0.0" "@types/hast": "npm:^3.0.0" @@ -32363,10 +31861,9 @@ __metadata: mdast-util-to-markdown: "npm:^2.0.0" parse-entities: "npm:^4.0.0" stringify-entities: "npm:^4.0.0" - unist-util-remove-position: "npm:^5.0.0" unist-util-stringify-position: "npm:^4.0.0" vfile-message: "npm:^4.0.0" - checksum: 10c0/855b60c3db9bde2fe142bd366597f7bd5892fc288428ba054e26ffcffc07bfe5648c0792d614ba6e08b1eab9784ffc3c1267cf29dfc6db92b419d68b5bcd487d + checksum: 10c0/1b0b64215efbbbb1ee9ba2a2b3e5f11859dada7dff162949a0d503aefbd75c0308f17d404df126c54acea06d2224905915b2cac2e6c999514c919bd963b8de24 languageName: node linkType: hard @@ -32901,12 +32398,12 @@ __metadata: linkType: hard "micromatch@npm:^4.0.0, micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": - version: 4.0.7 - resolution: "micromatch@npm:4.0.7" + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" dependencies: braces: "npm:^3.0.3" picomatch: "npm:^2.3.1" - checksum: 10c0/58fa99bc5265edec206e9163a1d2cec5fabc46a5b473c45f4a700adce88c2520456ae35f2b301e4410fb3afb27e9521fb2813f6fc96be0a48a89430e0916a772 + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 languageName: node linkType: hard @@ -33092,15 +32589,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^4.2.3": - version: 4.2.3 - resolution: "minimatch@npm:4.2.3" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10c0/ce19d52a4692037aa7768bfcdca0cef3eb3975ab8e3aaf32ab0a3d23863fca94ba7555d1ca67893320076efe8376e61bf7cc6fa82161a3c1127f0d0b9b06b666 - languageName: node - linkType: hard - "minimatch@npm:^5.0.1, minimatch@npm:^5.1.0": version: 5.1.6 resolution: "minimatch@npm:5.1.6" @@ -33119,7 +32607,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.0, minimatch@npm:^9.0.1, minimatch@npm:^9.0.3, minimatch@npm:^9.0.4": +"minimatch@npm:^9.0.0, minimatch@npm:^9.0.1, minimatch@npm:^9.0.3, minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": version: 9.0.5 resolution: "minimatch@npm:9.0.5" dependencies: @@ -33693,19 +33181,19 @@ __metadata: linkType: hard "netlify-cli@npm:^17.34.2": - version: 17.34.2 - resolution: "netlify-cli@npm:17.34.2" + version: 17.34.3 + resolution: "netlify-cli@npm:17.34.3" dependencies: "@bugsnag/js": "npm:7.25.0" "@fastify/static": "npm:7.0.4" "@netlify/blobs": "npm:8.0.0" - "@netlify/build": "npm:29.53.0" + "@netlify/build": "npm:29.54.0" "@netlify/build-info": "npm:7.14.1" - "@netlify/config": "npm:20.18.0" + "@netlify/config": "npm:20.19.0" "@netlify/edge-bundler": "npm:12.2.3" "@netlify/edge-functions": "npm:2.9.0" "@netlify/local-functions-proxy": "npm:1.1.1" - "@netlify/zip-it-and-ship-it": "npm:9.37.9" + "@netlify/zip-it-and-ship-it": "npm:9.38.0" "@octokit/rest": "npm:20.1.1" "@opentelemetry/api": "npm:1.8.0" ansi-escapes: "npm:7.0.0" @@ -33772,7 +33260,7 @@ __metadata: maxstache: "npm:1.0.7" maxstache-stream: "npm:1.0.4" multiparty: "npm:4.2.3" - netlify: "npm:13.1.20" + netlify: "npm:13.1.21" netlify-headers-parser: "npm:7.1.4" netlify-redirect-parser: "npm:14.3.0" netlify-redirector: "npm:0.5.0" @@ -33812,7 +33300,7 @@ __metadata: bin: netlify: bin/run.js ntl: bin/run.js - checksum: 10c0/47078aa4e348f37f6313eed761583562b55119998bc3b9acdbf2b5c13169830f4b43217e19c9b5f0fc61dadd0a56b0ed9b6d79cb28453f8e582e629414eac318 + checksum: 10c0/cbb5f67db96bc78435dd0c5eede93ff85f0aa2bc3a016d567e2097b20f9cff7a59a1deb9ef3c8d675ec497d16484566220b9c847509247fd92fc6b564fbc8531 languageName: node linkType: hard @@ -33850,22 +33338,7 @@ __metadata: languageName: node linkType: hard -"netlify@npm:13.1.20, netlify@npm:^13.1.20": - version: 13.1.20 - resolution: "netlify@npm:13.1.20" - dependencies: - "@netlify/open-api": "npm:^2.33.1" - lodash-es: "npm:^4.17.21" - micro-api-client: "npm:^3.3.0" - node-fetch: "npm:^3.0.0" - omit.js: "npm:^2.0.2" - p-wait-for: "npm:^4.0.0" - qs: "npm:^6.9.6" - checksum: 10c0/96548ef38dfb4ec4f47536fc1b63afb10c52148aee80ee0597c8141a7e78c53ed8d3adc2b5ccf31c84481975ef3fd67b62df27094bd3b0fb5740f14a60d5e3aa - languageName: node - linkType: hard - -"netlify@npm:^13.1.21": +"netlify@npm:13.1.21, netlify@npm:^13.1.21": version: 13.1.21 resolution: "netlify@npm:13.1.21" dependencies: @@ -34015,22 +33488,22 @@ __metadata: linkType: hard "nock@npm:^13.5.0": - version: 13.5.4 - resolution: "nock@npm:13.5.4" + version: 13.5.5 + resolution: "nock@npm:13.5.5" dependencies: debug: "npm:^4.1.0" json-stringify-safe: "npm:^5.0.1" propagate: "npm:^2.0.0" - checksum: 10c0/9ca47d9d7e4b1f4adf871d7ca12722f8ef1dc7d2b9610b2568f5d9264eae9f424baa24fd9d91da9920b360d641b4243e89de198bd22c061813254a99cc6252af + checksum: 10c0/58be4dda214d6e1914232ae41a3ac4f4e05622f71eb82825816f3030e0343bd54c1001878a6bce8412067c1059730919f3d600069d76f1336da11f47bd3b5d40 languageName: node linkType: hard "node-abi@npm:^3.3.0": - version: 3.65.0 - resolution: "node-abi@npm:3.65.0" + version: 3.67.0 + resolution: "node-abi@npm:3.67.0" dependencies: semver: "npm:^7.3.5" - checksum: 10c0/112672015d8f27d6be2f18d64569f28f5d6a15a94cc510da513c69c3e3ab5df6dac196ef13ff115a8fadb69b554974c47ef89b4f6350a2b02de2bca5c23db1e5 + checksum: 10c0/72ce2edbdfb84745bc201a4e48aa7146fd88a0d2c80046b6b17f28439c9a7683eab846f40f1e819349c31f7d9331ed5c50d1e741208d938dd5f38b29cab2275e languageName: node linkType: hard @@ -34613,18 +34086,18 @@ __metadata: linkType: hard "nypm@npm:^0.3.8": - version: 0.3.9 - resolution: "nypm@npm:0.3.9" + version: 0.3.11 + resolution: "nypm@npm:0.3.11" dependencies: citty: "npm:^0.1.6" consola: "npm:^3.2.3" execa: "npm:^8.0.1" pathe: "npm:^1.1.2" - pkg-types: "npm:^1.1.1" - ufo: "npm:^1.5.3" + pkg-types: "npm:^1.2.0" + ufo: "npm:^1.5.4" bin: nypm: dist/cli.mjs - checksum: 10c0/47aef92be6b7cef2c4eb8992ff5a5bb1de0689951a60101541574fd43cbdc3ec398e35565be7146f2242070b3f21ac4ea5773413d4fbc2a3171b7f470d8aa5a7 + checksum: 10c0/016a74110f9629ddb9ee06d378aca56004ba0cbf824defb1f558342e411051443f95ae20171f538691798d4ac1da72d7582192c1a9c858843a2a90d6f5c3f86b languageName: node linkType: hard @@ -35094,20 +34567,20 @@ __metadata: linkType: hard "oxc-resolver@npm:^1.10.2": - version: 1.10.2 - resolution: "oxc-resolver@npm:1.10.2" - dependencies: - "@oxc-resolver/binding-darwin-arm64": "npm:1.10.2" - "@oxc-resolver/binding-darwin-x64": "npm:1.10.2" - "@oxc-resolver/binding-freebsd-x64": "npm:1.10.2" - "@oxc-resolver/binding-linux-arm-gnueabihf": "npm:1.10.2" - "@oxc-resolver/binding-linux-arm64-gnu": "npm:1.10.2" - "@oxc-resolver/binding-linux-arm64-musl": "npm:1.10.2" - "@oxc-resolver/binding-linux-x64-gnu": "npm:1.10.2" - "@oxc-resolver/binding-linux-x64-musl": "npm:1.10.2" - "@oxc-resolver/binding-wasm32-wasi": "npm:1.10.2" - "@oxc-resolver/binding-win32-arm64-msvc": "npm:1.10.2" - "@oxc-resolver/binding-win32-x64-msvc": "npm:1.10.2" + version: 1.11.0 + resolution: "oxc-resolver@npm:1.11.0" + dependencies: + "@oxc-resolver/binding-darwin-arm64": "npm:1.11.0" + "@oxc-resolver/binding-darwin-x64": "npm:1.11.0" + "@oxc-resolver/binding-freebsd-x64": "npm:1.11.0" + "@oxc-resolver/binding-linux-arm-gnueabihf": "npm:1.11.0" + "@oxc-resolver/binding-linux-arm64-gnu": "npm:1.11.0" + "@oxc-resolver/binding-linux-arm64-musl": "npm:1.11.0" + "@oxc-resolver/binding-linux-x64-gnu": "npm:1.11.0" + "@oxc-resolver/binding-linux-x64-musl": "npm:1.11.0" + "@oxc-resolver/binding-wasm32-wasi": "npm:1.11.0" + "@oxc-resolver/binding-win32-arm64-msvc": "npm:1.11.0" + "@oxc-resolver/binding-win32-x64-msvc": "npm:1.11.0" dependenciesMeta: "@oxc-resolver/binding-darwin-arm64": optional: true @@ -35131,7 +34604,7 @@ __metadata: optional: true "@oxc-resolver/binding-win32-x64-msvc": optional: true - checksum: 10c0/8e3fa7439c777a44130417612816e98cc8f71d8ed015f84588ec4fbe9ac19846c0c91e3f1a6cb0d9c1cde08afd5892f1e6abe4c4a693b2230aaafc1e884b3e31 + checksum: 10c0/371a370cb1c68d48601aab519bfa41fd36dcd28ec8c3225f934f576efb9977b16e0eb2e5ee35783bf205faa2218ae08c34ffb61b31234ec8505545715364afe4 languageName: node linkType: hard @@ -35790,9 +35263,9 @@ __metadata: linkType: hard "peek-readable@npm:^5.1.3": - version: 5.1.3 - resolution: "peek-readable@npm:5.1.3" - checksum: 10c0/4697a0e50778171467c0cdb3059c0810809787ae0dcbb4d44316dd2846be1829f62a790d6e9f8c9600a91aca74520ece7731b5914e3180ca1364268d168bd0e3 + version: 5.1.4 + resolution: "peek-readable@npm:5.1.4" + checksum: 10c0/19015142b2f2556bec8b51c53111209bd6d774181df26dbf68908495819e35f4103e83915aa7ea35505d2a65d2712f2ab58f36b329cf61219c012621e65211b3 languageName: node linkType: hard @@ -35997,14 +35470,14 @@ __metadata: languageName: node linkType: hard -"pkg-types@npm:^1.0.3, pkg-types@npm:^1.1.1": - version: 1.1.3 - resolution: "pkg-types@npm:1.1.3" +"pkg-types@npm:^1.0.3, pkg-types@npm:^1.1.1, pkg-types@npm:^1.2.0": + version: 1.2.0 + resolution: "pkg-types@npm:1.2.0" dependencies: confbox: "npm:^0.1.7" mlly: "npm:^1.7.1" pathe: "npm:^1.1.2" - checksum: 10c0/4cd2c9442dd5e4ae0c61cbd8fdaa92a273939749b081f78150ce9a3f4e625cca0375607386f49f103f0720b239d02369bf181c3ea6c80cf1028a633df03706ad + checksum: 10c0/111cf6ad4235438821ea195a0d70570b1bd36a71d094d258349027c9c304dea8b4f9669c9f7ce813f9a48a02942fb0d7fe9809127dbe7bb4b18a8de71583a081 languageName: node linkType: hard @@ -36103,15 +35576,15 @@ __metadata: languageName: node linkType: hard -"postcss-calc@npm:^10.0.0": - version: 10.0.0 - resolution: "postcss-calc@npm:10.0.0" +"postcss-calc@npm:^10.0.1": + version: 10.0.2 + resolution: "postcss-calc@npm:10.0.2" dependencies: - postcss-selector-parser: "npm:^6.0.16" + postcss-selector-parser: "npm:^6.1.2" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.38 - checksum: 10c0/d4d529f2f71b49f17441eed74a7564ccd2779c72ed8648d4bb2530261a27c0ca01fe6a07260e7bf57e55f46dd68dea07e52fd1a6b538db7bc13015124be258a5 + checksum: 10c0/f57c9db7a7a2f3a0cdf45990089c051248d995bb2b9d1bd1fcd1634507851e92ea85bbc71a3594e359e9e9287ba0a820c90d6d292126a4b735cda364a86ce9cf languageName: node linkType: hard @@ -36191,17 +35664,17 @@ __metadata: languageName: node linkType: hard -"postcss-colormin@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-colormin@npm:7.0.1" +"postcss-colormin@npm:^7.0.2": + version: 7.0.2 + resolution: "postcss-colormin@npm:7.0.2" dependencies: - browserslist: "npm:^4.23.1" + browserslist: "npm:^4.23.3" caniuse-api: "npm:^3.0.0" colord: "npm:^2.9.3" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/e01e9e129ce39320cf10bb09ee2a3ab5b44b77805d3f7827eea07297644838b85c33b78996eeae0a1aba327ffd72a6ab1d24949ebc831523e310e916d5500371 + checksum: 10c0/76d09fb7e0218698e622a7c2cfc9087985f48f3a7e44f2655d5eefac4ae9c04198ae9d408dc7ace15d3aa5bde80e7031e462b0cb9b5bd50cfa76bbb1503c755b languageName: node linkType: hard @@ -36217,15 +35690,15 @@ __metadata: languageName: node linkType: hard -"postcss-convert-values@npm:^7.0.2": - version: 7.0.2 - resolution: "postcss-convert-values@npm:7.0.2" +"postcss-convert-values@npm:^7.0.3": + version: 7.0.3 + resolution: "postcss-convert-values@npm:7.0.3" dependencies: - browserslist: "npm:^4.23.1" + browserslist: "npm:^4.23.3" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/beb59faf6aae97e6d3c233c5e6ed06cc60d65c49eec576036e3d0da1a831a1e827e3d41f5e81d016440b4f0bdf1406268ae069c4d5b38a6667b310c3da079d22 + checksum: 10c0/dbb6278bd8d8b11e448933d823426c883bff3f6abeaa23c7530cc4668b9da6f714e073840f280273f8a14022c3a99eb461ec732f7539e062b32f5281e1be6526 languageName: node linkType: hard @@ -36292,14 +35765,14 @@ __metadata: languageName: node linkType: hard -"postcss-discard-comments@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-discard-comments@npm:7.0.1" +"postcss-discard-comments@npm:^7.0.2": + version: 7.0.2 + resolution: "postcss-discard-comments@npm:7.0.2" dependencies: - postcss-selector-parser: "npm:^6.1.0" + postcss-selector-parser: "npm:^6.1.1" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/64de3fced7e0e49dfea6aede8a5ca495b81dcd01c3c47734a5fbc86a3cb2b1ae39e1958e34e9bea64ecabd5fb4d8c287ec1d6189cf175c2434c6b6582da79948 + checksum: 10c0/c01632e643b6ec1f61ad59efe06a9e8dfc7fcedeb1551ae48fc33fa801353f6222e31954286cd97171c694f34c2b4c7f7a2213fd0f913e37c34d0353258ed234 languageName: node linkType: hard @@ -36312,12 +35785,12 @@ __metadata: languageName: node linkType: hard -"postcss-discard-duplicates@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-discard-duplicates@npm:7.0.0" +"postcss-discard-duplicates@npm:^7.0.1": + version: 7.0.1 + resolution: "postcss-discard-duplicates@npm:7.0.1" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/37d568dc18d47b8b9f0fd6d5115b1faf96c2bf429fc4586508a773533479e18627d6260cad6a3ca7d3bfc2f220fd9448410aee40e07f2ec6c6f96bbe3595dbc8 + checksum: 10c0/5cc2cac249f68004864865ea2ec38b7d5e28184f33e904e531ff57b533aacb73ec49e4a7d83219184001b8d167e5bcabc1673248134468d7ebaa0bfb9ff78f0a languageName: node linkType: hard @@ -36562,15 +36035,15 @@ __metadata: languageName: node linkType: hard -"postcss-merge-longhand@npm:^7.0.2": - version: 7.0.2 - resolution: "postcss-merge-longhand@npm:7.0.2" +"postcss-merge-longhand@npm:^7.0.3": + version: 7.0.3 + resolution: "postcss-merge-longhand@npm:7.0.3" dependencies: postcss-value-parser: "npm:^4.2.0" - stylehacks: "npm:^7.0.2" + stylehacks: "npm:^7.0.3" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/71d22418e5850e134bfcf2038acb1c91eeb48d9b6f9e4c0252fee757e11dc4ae351097a855c327fbc38dc7658fa6edc7cc7f458c08bb4044b82c6005dc565fcb + checksum: 10c0/b968c3d16f3edc6075b20219a1165c089dc454a6a42951dcdfc94adb932fb96ef7bcd465c6cd21b0e5b55ac08921355ddbbbc7cdcf87a345e4bef8b3cdd2e7e9 languageName: node linkType: hard @@ -36588,17 +36061,17 @@ __metadata: languageName: node linkType: hard -"postcss-merge-rules@npm:^7.0.2": - version: 7.0.2 - resolution: "postcss-merge-rules@npm:7.0.2" +"postcss-merge-rules@npm:^7.0.3": + version: 7.0.3 + resolution: "postcss-merge-rules@npm:7.0.3" dependencies: - browserslist: "npm:^4.23.1" + browserslist: "npm:^4.23.3" caniuse-api: "npm:^3.0.0" cssnano-utils: "npm:^5.0.0" - postcss-selector-parser: "npm:^6.1.0" + postcss-selector-parser: "npm:^6.1.1" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/fbad20382ca45f1b3b5ff704c075f899cc9ba8418ae6effbdeb9e7c1f9b5c24996d1941ad36cd0936d60cbf127a72f235b2cbb0c44d9239a8a61042406d95b4a + checksum: 10c0/3cd20484ab6d15c62eded408248d5eeaba52a573935943f933865680e070a0e75b3a7447802c575bc86e1fae667cf51d9d5766537835d9b8c090337b5adf928e languageName: node linkType: hard @@ -36663,16 +36136,16 @@ __metadata: languageName: node linkType: hard -"postcss-minify-params@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-minify-params@npm:7.0.1" +"postcss-minify-params@npm:^7.0.2": + version: 7.0.2 + resolution: "postcss-minify-params@npm:7.0.2" dependencies: - browserslist: "npm:^4.23.1" + browserslist: "npm:^4.23.3" cssnano-utils: "npm:^5.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/84e1c4de5af47178c1f48e10ce16341560f32bb2becf5ec9b014103f6c706174bc70885e2e13ced4de9b4f1959fb970193261cbd4751c8b87d5159e859e8c5ec + checksum: 10c0/0e041f70554bae9d4a66c8ab2f2f3ed8bf73862c9d5ff9972ac7f1a596badd1544f093fa2362dd33e96c038af9e10287cdbfec9f480c49bffdcbaca9fdcb1e4e languageName: node linkType: hard @@ -36687,15 +36160,15 @@ __metadata: languageName: node linkType: hard -"postcss-minify-selectors@npm:^7.0.2": - version: 7.0.2 - resolution: "postcss-minify-selectors@npm:7.0.2" +"postcss-minify-selectors@npm:^7.0.3": + version: 7.0.3 + resolution: "postcss-minify-selectors@npm:7.0.3" dependencies: cssesc: "npm:^3.0.0" - postcss-selector-parser: "npm:^6.1.0" + postcss-selector-parser: "npm:^6.1.1" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/87e0c21a0135b6c61b58d62c4c1e0cbd3cfb516ff8105db714c6a33a5edc477846ae220399d368e4ef6518529c711aa2dee9ff49e9befd93e83d5c939f3084a1 + checksum: 10c0/5211f63a1672f646a1bab57bd8eac0816d42adacb5e286ad5e6e342a795bb0d086bd6044a1b338311ca28f33f2c1833165ee611eaa671287379821ba3c5d68ad languageName: node linkType: hard @@ -36907,15 +36380,15 @@ __metadata: languageName: node linkType: hard -"postcss-normalize-unicode@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-normalize-unicode@npm:7.0.1" +"postcss-normalize-unicode@npm:^7.0.2": + version: 7.0.2 + resolution: "postcss-normalize-unicode@npm:7.0.2" dependencies: - browserslist: "npm:^4.23.1" + browserslist: "npm:^4.23.3" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/fcabac738765f608cb211ac01a19f9a7d784f99d223ef6f31352f37b9bcf008e0ca7849414c9e77116be8660d78b01dba6fc4a87cee7c9a977d3c2741d6a222d + checksum: 10c0/0df1aac932cc2340715178fd024e0f6d872ea5a4bee1bc8357317a75a7b2c904d885f754cc162af001aa2a9ded7c54fac7cbcd701e21e995c1ace92dc08f2b9d languageName: node linkType: hard @@ -37121,15 +36594,15 @@ __metadata: languageName: node linkType: hard -"postcss-reduce-initial@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-reduce-initial@npm:7.0.1" +"postcss-reduce-initial@npm:^7.0.2": + version: 7.0.2 + resolution: "postcss-reduce-initial@npm:7.0.2" dependencies: - browserslist: "npm:^4.23.1" + browserslist: "npm:^4.23.3" caniuse-api: "npm:^3.0.0" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/3e7c6c1d0cc4ace38f44971f02d0dd98131af678cf114aa05cfa0c066420019d5329c221ef8507644b8a79d0e76534303f747c97860ac777fe17f57110edefe1 + checksum: 10c0/1e6fafaf5fac52b351c8de156ed62e4e1f48da7eb07f9ce90da54b45dca61da9af1e954b8a343271cb3e4ec99e0c5f18d7f9f96da0ca144511fca04498fac78c languageName: node linkType: hard @@ -37175,13 +36648,13 @@ __metadata: languageName: node linkType: hard -"postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.16, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.1.0, postcss-selector-parser@npm:^6.1.1": - version: 6.1.1 - resolution: "postcss-selector-parser@npm:6.1.1" +"postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.16, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.1.0, postcss-selector-parser@npm:^6.1.1, postcss-selector-parser@npm:^6.1.2": + version: 6.1.2 + resolution: "postcss-selector-parser@npm:6.1.2" dependencies: cssesc: "npm:^3.0.0" util-deprecate: "npm:^1.0.2" - checksum: 10c0/5608765e033fee35d448e1f607ffbaa750eb86901824a8bc4a911ea8bc137cb82f29239330787427c5d3695afd90d8721e190f211dbbf733e25033d8b3100763 + checksum: 10c0/523196a6bd8cf660bdf537ad95abd79e546d54180f9afb165a4ab3e651ac705d0f8b8ce6b3164fb9e3279ce482c5f751a69eb2d3a1e8eb0fd5e82294fb3ef13e languageName: node linkType: hard @@ -37220,14 +36693,14 @@ __metadata: languageName: node linkType: hard -"postcss-unique-selectors@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-unique-selectors@npm:7.0.1" +"postcss-unique-selectors@npm:^7.0.2": + version: 7.0.2 + resolution: "postcss-unique-selectors@npm:7.0.2" dependencies: - postcss-selector-parser: "npm:^6.1.0" + postcss-selector-parser: "npm:^6.1.1" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/6352d71ce2f65265f545831c2ce3686bd71961d08a2247c545d717d93d23b1eb08bb986efc11194d31970eea4cb42207b9aa9a3f4666d75492a6cbf1493cf466 + checksum: 10c0/cc54c57cd1c5a6e3e166ec63cc036d9e2df80b05e508d9ce754ca4193bf8c1bfcc16b3c6f0d81b8352a3282201d249b90bb87abacfcfb9065c9e3705ea5d110e languageName: node linkType: hard @@ -37284,7 +36757,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:8.4.41, postcss@npm:^8.4.41": +"postcss@npm:8.4.41, postcss@npm:^8.1.7, postcss@npm:^8.2.14, postcss@npm:^8.4.23, postcss@npm:^8.4.24, postcss@npm:^8.4.33, postcss@npm:^8.4.38, postcss@npm:^8.4.41": version: 8.4.41 resolution: "postcss@npm:8.4.41" dependencies: @@ -37295,21 +36768,10 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.1.7, postcss@npm:^8.2.14, postcss@npm:^8.4.23, postcss@npm:^8.4.24, postcss@npm:^8.4.33, postcss@npm:^8.4.38, postcss@npm:^8.4.39": - version: 8.4.40 - resolution: "postcss@npm:8.4.40" - dependencies: - nanoid: "npm:^3.3.7" - picocolors: "npm:^1.0.1" - source-map-js: "npm:^1.2.0" - checksum: 10c0/65ed67573e5443beaeb582282ff27a6be7c7fe3b4d9fa15761157616f2b97510cb1c335023c26220b005909f007337026d6e3ff092f25010b484ad484e80ea7f - languageName: node - linkType: hard - "preact@npm:^10.16.0": - version: 10.23.1 - resolution: "preact@npm:10.23.1" - checksum: 10c0/f0eb37999bfa9cbc725e57e189387c77919fa05d17cdc3c4ff41660298805159867689f1d974eb8e6496288c0212760490d0e6f1c12022e0f5a74d06cc618e85 + version: 10.23.2 + resolution: "preact@npm:10.23.2" + checksum: 10c0/6e0dc1b38ead7554c99ddec9a32162b456e8f622229413b136042a777445a12d115633cd49d6df83c30b64d721a0ad4d3c71bb468edc759c15799896e96fd9f2 languageName: node linkType: hard @@ -38011,9 +37473,9 @@ __metadata: linkType: hard "rambda@npm:^9.1.0": - version: 9.2.1 - resolution: "rambda@npm:9.2.1" - checksum: 10c0/d2740fa7ac02f28099ee314b6e09cfbc937851230c04999578dda7caddba5914763b0198e11bf9b993637d19b84c087921650918ab3f4aed714c96a1ee63bd03 + version: 9.3.0 + resolution: "rambda@npm:9.3.0" + checksum: 10c0/7ec1a2763faa564ad7cd65cef86d94ac89e44b57274e83501cd7e22bc516b82a35b8462d6070fa714bfbabcd1c7426ddc09081156284b28b0bf4937c8786e386 languageName: node linkType: hard @@ -38195,11 +37657,11 @@ __metadata: linkType: hard "react-hook-form@npm:^7.52.2": - version: 7.52.2 - resolution: "react-hook-form@npm:7.52.2" + version: 7.53.0 + resolution: "react-hook-form@npm:7.53.0" peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - checksum: 10c0/2b8d37239d40f4326a24609c1bf5b4ba2cf66bc4a988213ccd7eb92a254dd5bf9c4b94caa353bce4b1d6d8a9ecd2ea3103e25c6d2d72d53f7be26f09053a8b2f + checksum: 10c0/6d62b150618a833c17d59e669b707661499e2bb516a8d340ca37699f99eb448bbba7b5b78324938c8948014e21efaa32e3510c2ba246fd5e97a96fca0cfa7c98 languageName: node linkType: hard @@ -39445,26 +38907,26 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.13.0, rollup@npm:^4.20.0, rollup@npm:^4.9.6": - version: 4.20.0 - resolution: "rollup@npm:4.20.0" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.20.0" - "@rollup/rollup-android-arm64": "npm:4.20.0" - "@rollup/rollup-darwin-arm64": "npm:4.20.0" - "@rollup/rollup-darwin-x64": "npm:4.20.0" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.20.0" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.20.0" - "@rollup/rollup-linux-arm64-gnu": "npm:4.20.0" - "@rollup/rollup-linux-arm64-musl": "npm:4.20.0" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.20.0" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.20.0" - "@rollup/rollup-linux-s390x-gnu": "npm:4.20.0" - "@rollup/rollup-linux-x64-gnu": "npm:4.20.0" - "@rollup/rollup-linux-x64-musl": "npm:4.20.0" - "@rollup/rollup-win32-arm64-msvc": "npm:4.20.0" - "@rollup/rollup-win32-ia32-msvc": "npm:4.20.0" - "@rollup/rollup-win32-x64-msvc": "npm:4.20.0" +"rollup@npm:^4.20.0, rollup@npm:^4.21.0, rollup@npm:^4.9.6": + version: 4.21.1 + resolution: "rollup@npm:4.21.1" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.21.1" + "@rollup/rollup-android-arm64": "npm:4.21.1" + "@rollup/rollup-darwin-arm64": "npm:4.21.1" + "@rollup/rollup-darwin-x64": "npm:4.21.1" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.21.1" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.21.1" + "@rollup/rollup-linux-arm64-gnu": "npm:4.21.1" + "@rollup/rollup-linux-arm64-musl": "npm:4.21.1" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.21.1" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.21.1" + "@rollup/rollup-linux-s390x-gnu": "npm:4.21.1" + "@rollup/rollup-linux-x64-gnu": "npm:4.21.1" + "@rollup/rollup-linux-x64-musl": "npm:4.21.1" + "@rollup/rollup-win32-arm64-msvc": "npm:4.21.1" + "@rollup/rollup-win32-ia32-msvc": "npm:4.21.1" + "@rollup/rollup-win32-x64-msvc": "npm:4.21.1" "@types/estree": "npm:1.0.5" fsevents: "npm:~2.3.2" dependenciesMeta: @@ -39504,70 +38966,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/9b23bf0e3380e64573a5f68a55274d5c7969036e55c19aab9fb4deea2e938d76769db70f3c95ee3783c24af152bea1772ad73f9e3625b6ffd4e600a788fe97ea - languageName: node - linkType: hard - -"rollup@npm:^4.21.0": - version: 4.21.0 - resolution: "rollup@npm:4.21.0" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.21.0" - "@rollup/rollup-android-arm64": "npm:4.21.0" - "@rollup/rollup-darwin-arm64": "npm:4.21.0" - "@rollup/rollup-darwin-x64": "npm:4.21.0" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.21.0" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.21.0" - "@rollup/rollup-linux-arm64-gnu": "npm:4.21.0" - "@rollup/rollup-linux-arm64-musl": "npm:4.21.0" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.21.0" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.21.0" - "@rollup/rollup-linux-s390x-gnu": "npm:4.21.0" - "@rollup/rollup-linux-x64-gnu": "npm:4.21.0" - "@rollup/rollup-linux-x64-musl": "npm:4.21.0" - "@rollup/rollup-win32-arm64-msvc": "npm:4.21.0" - "@rollup/rollup-win32-ia32-msvc": "npm:4.21.0" - "@rollup/rollup-win32-x64-msvc": "npm:4.21.0" - "@types/estree": "npm:1.0.5" - fsevents: "npm:~2.3.2" - dependenciesMeta: - "@rollup/rollup-android-arm-eabi": - optional: true - "@rollup/rollup-android-arm64": - optional: true - "@rollup/rollup-darwin-arm64": - optional: true - "@rollup/rollup-darwin-x64": - optional: true - "@rollup/rollup-linux-arm-gnueabihf": - optional: true - "@rollup/rollup-linux-arm-musleabihf": - optional: true - "@rollup/rollup-linux-arm64-gnu": - optional: true - "@rollup/rollup-linux-arm64-musl": - optional: true - "@rollup/rollup-linux-powerpc64le-gnu": - optional: true - "@rollup/rollup-linux-riscv64-gnu": - optional: true - "@rollup/rollup-linux-s390x-gnu": - optional: true - "@rollup/rollup-linux-x64-gnu": - optional: true - "@rollup/rollup-linux-x64-musl": - optional: true - "@rollup/rollup-win32-arm64-msvc": - optional: true - "@rollup/rollup-win32-ia32-msvc": - optional: true - "@rollup/rollup-win32-x64-msvc": - optional: true - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: 10c0/984beb858da245c5e3a9027d6d87e67ad6443f1b46eab07685b861d9e49da5856693265c62a6f8262c36d11c9092713a96a9124f43e6de6698eb84d77118496a + checksum: 10c0/e64b6adabadc3e18544c68e9704744c333b38a68ba803c49b5344a015c5865bf35a72669ba121ba26869fa306f193884e07319ccfc570c08fd8f9e72c9949d4d languageName: node linkType: hard @@ -39687,9 +39086,9 @@ __metadata: linkType: hard "safe-stable-stringify@npm:^2.1.0, safe-stable-stringify@npm:^2.3.1": - version: 2.4.3 - resolution: "safe-stable-stringify@npm:2.4.3" - checksum: 10c0/81dede06b8f2ae794efd868b1e281e3c9000e57b39801c6c162267eb9efda17bd7a9eafa7379e1f1cacd528d4ced7c80d7460ad26f62ada7c9e01dec61b2e768 + version: 2.5.0 + resolution: "safe-stable-stringify@npm:2.5.0" + checksum: 10c0/baea14971858cadd65df23894a40588ed791769db21bafb7fd7608397dbdce9c5aac60748abae9995e0fc37e15f2061980501e012cd48859740796bea2987f49 languageName: node linkType: hard @@ -39945,7 +39344,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.6.3, semver@npm:^7.0.0, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": +"semver@npm:7.6.3, semver@npm:^7.0.0, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: @@ -40178,31 +39577,31 @@ __metadata: linkType: hard "sharp@npm:^0.33.3": - version: 0.33.4 - resolution: "sharp@npm:0.33.4" - dependencies: - "@img/sharp-darwin-arm64": "npm:0.33.4" - "@img/sharp-darwin-x64": "npm:0.33.4" - "@img/sharp-libvips-darwin-arm64": "npm:1.0.2" - "@img/sharp-libvips-darwin-x64": "npm:1.0.2" - "@img/sharp-libvips-linux-arm": "npm:1.0.2" - "@img/sharp-libvips-linux-arm64": "npm:1.0.2" - "@img/sharp-libvips-linux-s390x": "npm:1.0.2" - "@img/sharp-libvips-linux-x64": "npm:1.0.2" - "@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.2" - "@img/sharp-libvips-linuxmusl-x64": "npm:1.0.2" - "@img/sharp-linux-arm": "npm:0.33.4" - "@img/sharp-linux-arm64": "npm:0.33.4" - "@img/sharp-linux-s390x": "npm:0.33.4" - "@img/sharp-linux-x64": "npm:0.33.4" - "@img/sharp-linuxmusl-arm64": "npm:0.33.4" - "@img/sharp-linuxmusl-x64": "npm:0.33.4" - "@img/sharp-wasm32": "npm:0.33.4" - "@img/sharp-win32-ia32": "npm:0.33.4" - "@img/sharp-win32-x64": "npm:0.33.4" + version: 0.33.5 + resolution: "sharp@npm:0.33.5" + dependencies: + "@img/sharp-darwin-arm64": "npm:0.33.5" + "@img/sharp-darwin-x64": "npm:0.33.5" + "@img/sharp-libvips-darwin-arm64": "npm:1.0.4" + "@img/sharp-libvips-darwin-x64": "npm:1.0.4" + "@img/sharp-libvips-linux-arm": "npm:1.0.5" + "@img/sharp-libvips-linux-arm64": "npm:1.0.4" + "@img/sharp-libvips-linux-s390x": "npm:1.0.4" + "@img/sharp-libvips-linux-x64": "npm:1.0.4" + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.4" + "@img/sharp-libvips-linuxmusl-x64": "npm:1.0.4" + "@img/sharp-linux-arm": "npm:0.33.5" + "@img/sharp-linux-arm64": "npm:0.33.5" + "@img/sharp-linux-s390x": "npm:0.33.5" + "@img/sharp-linux-x64": "npm:0.33.5" + "@img/sharp-linuxmusl-arm64": "npm:0.33.5" + "@img/sharp-linuxmusl-x64": "npm:0.33.5" + "@img/sharp-wasm32": "npm:0.33.5" + "@img/sharp-win32-ia32": "npm:0.33.5" + "@img/sharp-win32-x64": "npm:0.33.5" color: "npm:^4.2.3" detect-libc: "npm:^2.0.3" - semver: "npm:^7.6.0" + semver: "npm:^7.6.3" dependenciesMeta: "@img/sharp-darwin-arm64": optional: true @@ -40242,7 +39641,7 @@ __metadata: optional: true "@img/sharp-win32-x64": optional: true - checksum: 10c0/428c5c6a84ff8968effe50c2de931002f5f30b9f263e1c026d0384e581673c13088a49322f7748114d3d9be4ae9476a74bf003a3af34743e97ef2f880d1cfe45 + checksum: 10c0/6b81421ddfe6ee524d8d77e325c5e147fef22884e1c7b1656dfd89a88d7025894115da02d5f984261bf2e6daa16f98cadd1721c4ba408b4212b1d2a60f233484 languageName: node linkType: hard @@ -40735,9 +40134,9 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.18 - resolution: "spdx-license-ids@npm:3.0.18" - checksum: 10c0/c64ba03d4727191c8fdbd001f137d6ab51386c350d5516be8a4576c2e74044cb27bc8a758f6a04809da986cc0b14213f069b04de72caccecbc9f733753ccde32 + version: 3.0.20 + resolution: "spdx-license-ids@npm:3.0.20" + checksum: 10c0/bdff7534fad6ef59be49becda1edc3fb7f5b3d6f296a715516ab9d972b8ad59af2c34b2003e01db8970d4c673d185ff696ba74c6b61d3bf327e2b3eac22c297c languageName: node linkType: hard @@ -41073,8 +40472,8 @@ __metadata: linkType: hard "streamx@npm:^2.15.0, streamx@npm:^2.18.0": - version: 2.18.0 - resolution: "streamx@npm:2.18.0" + version: 2.19.0 + resolution: "streamx@npm:2.19.0" dependencies: bare-events: "npm:^2.2.0" fast-fifo: "npm:^1.3.2" @@ -41083,7 +40482,7 @@ __metadata: dependenciesMeta: bare-events: optional: true - checksum: 10c0/ef50f419252a73dd35abcde72329eafbf5ad9cd2e27f0cc3abebeff6e0dbea124ac6d3e16acbdf081cce41b4125393ac22f9848fcfa19e640830734883e622ba + checksum: 10c0/5833a2c1226488a015e8efde08c6cd4983d7d20098b2210d09594b23f598a8b028c083d542621e2e91ddcb33a266233c3524c60152203be40f1dd816b9ede9da languageName: node linkType: hard @@ -41540,15 +40939,15 @@ __metadata: languageName: node linkType: hard -"stylehacks@npm:^7.0.2": - version: 7.0.2 - resolution: "stylehacks@npm:7.0.2" +"stylehacks@npm:^7.0.3": + version: 7.0.3 + resolution: "stylehacks@npm:7.0.3" dependencies: - browserslist: "npm:^4.23.1" - postcss-selector-parser: "npm:^6.1.0" + browserslist: "npm:^4.23.3" + postcss-selector-parser: "npm:^6.1.1" peerDependencies: postcss: ^8.4.31 - checksum: 10c0/552299e869ac430e1076c025ace6c80bdfd5b672632435625eb1bd45ff5611aad7f3ee810e72edc04dc0fc3761e08dec40d27b72c50b95690eea2de43238b8d8 + checksum: 10c0/5030334b06ef705b5700444dab120b540b09159e935e75b60f25bd56db1d85f0d11755f0b0f64ce3f12c5a72ff1b6f57fea49c26d18eb0de2334d6a143b94f8d languageName: node linkType: hard @@ -42015,8 +41414,8 @@ __metadata: linkType: hard "terser@npm:^5.10.0, terser@npm:^5.15.1, terser@npm:^5.26.0": - version: 5.31.3 - resolution: "terser@npm:5.31.3" + version: 5.31.6 + resolution: "terser@npm:5.31.6" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.8.2" @@ -42024,7 +41423,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10c0/eb2b525dada9febd3db74e94bd295f9cd7abd809e4f9c6bbc795a3048ad50fd327c15eab99db383fa820239680eef6d2dbd7dc05361769c204ddee5cf684d41e + checksum: 10c0/b17d02b65a52a5041430572b3c514475820f5e7590fa93773c0f5b4be601ccf3f6d745bf5a79f3ee58187cf85edf61c24ddf4345783839fccb44c9c8fa9b427e languageName: node linkType: hard @@ -42729,10 +42128,10 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.5.2, tslib@npm:^2.6.1, tslib@npm:^2.6.2, tslib@npm:^2.6.3, tslib@npm:~2.6.0": - version: 2.6.3 - resolution: "tslib@npm:2.6.3" - checksum: 10c0/2598aef53d9dbe711af75522464b2104724d6467b26a60f2bdac8297d2b5f1f6b86a71f61717384aa8fd897240467aaa7bcc36a0700a0faf751293d1331db39a +"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.5.2, tslib@npm:^2.6.1, tslib@npm:^2.6.2, tslib@npm:^2.6.3": + version: 2.7.0 + resolution: "tslib@npm:2.7.0" + checksum: 10c0/469e1d5bf1af585742128827000711efa61010b699cb040ab1800bcd3ccdd37f63ec30642c9e07c4439c1db6e46345582614275daca3e0f4abae29b0083f04a6 languageName: node linkType: hard @@ -42750,6 +42149,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:~2.6.0": + version: 2.6.3 + resolution: "tslib@npm:2.6.3" + checksum: 10c0/2598aef53d9dbe711af75522464b2104724d6467b26a60f2bdac8297d2b5f1f6b86a71f61717384aa8fd897240467aaa7bcc36a0700a0faf751293d1331db39a + languageName: node + linkType: hard + "tsscmp@npm:1.0.6": version: 1.0.6 resolution: "tsscmp@npm:1.0.6" @@ -42769,8 +42175,8 @@ __metadata: linkType: hard "tsx@npm:^4.17.0": - version: 4.17.0 - resolution: "tsx@npm:4.17.0" + version: 4.19.0 + resolution: "tsx@npm:4.19.0" dependencies: esbuild: "npm:~0.23.0" fsevents: "npm:~2.3.3" @@ -42780,7 +42186,7 @@ __metadata: optional: true bin: tsx: dist/cli.mjs - checksum: 10c0/ad720b81d6447c7695d24c27947fa1a2b6db9d2ef03216389edd6fa0006aa479bc0d8348a1ac9975a08edef4ce791ff5629a24d8dccbb0987f42e5407785cfa4 + checksum: 10c0/d14463a78067c6db84c677b79b14861de6d7f6fb0ffa5727cc500c4552459e936395a3854ad0112af0fd7b263bcedd62ce3929b036188eb10cd9902a607ffe34 languageName: node linkType: hard @@ -42917,9 +42323,9 @@ __metadata: linkType: hard "type-fest@npm:^4.18.2, type-fest@npm:^4.6.0, type-fest@npm:^4.7.1": - version: 4.23.0 - resolution: "type-fest@npm:4.23.0" - checksum: 10c0/c42bb14e99329ab37983d1f188e307bf0cc705a23807d9b2268d8fb2ae781d610ac6e2058dde8f9ea2b1b8ddc77ceb578d157fa81f69f8f70aef1d42fb002996 + version: 4.25.0 + resolution: "type-fest@npm:4.25.0" + checksum: 10c0/1187b30d74e72f4b0b44a3493d2c1c2a9dc46423961c8250bd1535e976c4b8afc3916f6b4b90d7f56ed5b2f36d1645b05c318b4915fe4909a8a66890bda1d68d languageName: node linkType: hard @@ -43142,7 +42548,7 @@ __metadata: languageName: node linkType: hard -"ufo@npm:^1.3.2, ufo@npm:^1.4.0, ufo@npm:^1.5.3": +"ufo@npm:^1.3.2, ufo@npm:^1.4.0, ufo@npm:^1.5.3, ufo@npm:^1.5.4": version: 1.5.4 resolution: "ufo@npm:1.5.4" checksum: 10c0/b5dc4dc435c49c9ef8890f1b280a19ee4d0954d1d6f9ab66ce62ce64dd04c7be476781531f952a07c678d51638d02ad4b98e16237be29149295b0f7c09cda765 @@ -43150,11 +42556,11 @@ __metadata: linkType: hard "uglify-js@npm:^3.1.4": - version: 3.19.1 - resolution: "uglify-js@npm:3.19.1" + version: 3.19.2 + resolution: "uglify-js@npm:3.19.2" bin: uglifyjs: bin/uglifyjs - checksum: 10c0/7609ab3f10d54de5ef014770f845c747266a969e9092d2284ca0ba18f10a4488208c1491bd8b52bd4c40cf6687b47a77c495f08e4a625babcdd57f58e34a3976 + checksum: 10c0/51dbe1304a91cac5daa01f6a2d4ecd545fab7b7d0625e11590b923e95a6d2263b3481dcea974abfc0282b33d2c76f74f1196a992df07eae0847175bc39ea45bb languageName: node linkType: hard @@ -43258,10 +42664,10 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~6.13.0": - version: 6.13.0 - resolution: "undici-types@npm:6.13.0" - checksum: 10c0/2de55181f569c77a4f08063f8bf2722fcbb6ea312a26a9e927bd1f5ea5cf3a281c5ddf23155061db083e0a25838f54813543ff13b0ac34d230d5c1205ead66c1 +"undici-types@npm:~6.19.2": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 languageName: node linkType: hard @@ -43410,16 +42816,6 @@ __metadata: languageName: node linkType: hard -"unist-util-remove-position@npm:^5.0.0": - version: 5.0.0 - resolution: "unist-util-remove-position@npm:5.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - unist-util-visit: "npm:^5.0.0" - checksum: 10c0/e8c76da4399446b3da2d1c84a97c607b37d03d1d92561e14838cbe4fdcb485bfc06c06cfadbb808ccb72105a80643976d0660d1fe222ca372203075be9d71105 - languageName: node - linkType: hard - "unist-util-stringify-position@npm:^4.0.0": version: 4.0.0 resolution: "unist-util-stringify-position@npm:4.0.0" @@ -43513,14 +42909,14 @@ __metadata: linkType: hard "unplugin@npm:^1.3.1": - version: 1.12.0 - resolution: "unplugin@npm:1.12.0" + version: 1.12.2 + resolution: "unplugin@npm:1.12.2" dependencies: acorn: "npm:^8.12.1" chokidar: "npm:^3.6.0" webpack-sources: "npm:^3.2.3" webpack-virtual-modules: "npm:^0.6.2" - checksum: 10c0/d4ca9508adbc3724fbafe0eec50e346b3772d3bca7881f20b29d403c576fae5ac2f1224cc84481913396e9c52cba5e934d2815d1b2a206c439fdc52ec39889b8 + checksum: 10c0/1ebdca5437adcf83f53ef715f336b9e5b85d671c40769c9fc4f3412e59c825c16bb56fb4e706b21991175db6addbc5fce10c8e2f67fb0387703431a8a1601c0d languageName: node linkType: hard @@ -44052,13 +43448,12 @@ __metadata: linkType: hard "vfile@npm:^6.0.0": - version: 6.0.2 - resolution: "vfile@npm:6.0.2" + version: 6.0.3 + resolution: "vfile@npm:6.0.3" dependencies: "@types/unist": "npm:^3.0.0" - unist-util-stringify-position: "npm:^4.0.0" vfile-message: "npm:^4.0.0" - checksum: 10c0/96b7e060b332ff1b05462053bd9b0f39062c00c5eabb78fc75603cc808d5f77c4379857fffca3e30a28e0aad2d51c065dfcd4a43fbe15b1fc9c2aaa9ac1be8e1 + checksum: 10c0/e5d9eb4810623f23758cfc2205323e33552fb5972e5c2e6587babe08fe4d24859866277404fb9e2a20afb71013860d96ec806cb257536ae463c87d70022ab9ef languageName: node linkType: hard @@ -44084,31 +43479,9 @@ __metadata: languageName: node linkType: hard -"viem@npm:^2.1.1": - version: 2.18.8 - resolution: "viem@npm:2.18.8" - dependencies: - "@adraffy/ens-normalize": "npm:1.10.0" - "@noble/curves": "npm:1.4.0" - "@noble/hashes": "npm:1.4.0" - "@scure/bip32": "npm:1.4.0" - "@scure/bip39": "npm:1.3.0" - abitype: "npm:1.0.5" - isows: "npm:1.0.4" - webauthn-p256: "npm:0.0.5" - ws: "npm:8.17.1" - peerDependencies: - typescript: ">=5.0.4" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/c1394b71fdb00096d7a41608cbf06e77719501a82a7ca74e4aaa8667e937f67f3d7c0da8e7e62293ca7663a99e581c67a901d21df6a7e9c46697eb06056a3bb4 - languageName: node - linkType: hard - -"viem@npm:^2.20.0": - version: 2.20.0 - resolution: "viem@npm:2.20.0" +"viem@npm:^2.1.1, viem@npm:^2.20.0": + version: 2.20.1 + resolution: "viem@npm:2.20.1" dependencies: "@adraffy/ens-normalize": "npm:1.10.0" "@noble/curves": "npm:1.4.0" @@ -44124,7 +43497,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/6e59a90be6323e152cfe8bfbe617645da0262db29616d2802fb66a5088e9482cc37d4b6dbf90a151a6ea767a4959141c80dd7761742b996d6552008e9e521c5e + checksum: 10c0/67d22fa3d83e04ae350aae6c9922fe0fa1209af55297b6fff0fc9be57842fa8ef78879476720fdf10ef39751ed87cf3f6868ddd5863de389f12cdd5bb128b5bd languageName: node linkType: hard @@ -44180,47 +43553,7 @@ __metadata: languageName: node linkType: hard -"vite@npm:^5.0.0": - version: 5.3.5 - resolution: "vite@npm:5.3.5" - dependencies: - esbuild: "npm:^0.21.3" - fsevents: "npm:~2.3.3" - postcss: "npm:^8.4.39" - rollup: "npm:^4.13.0" - peerDependencies: - "@types/node": ^18.0.0 || >=20.0.0 - less: "*" - lightningcss: ^1.21.0 - sass: "*" - stylus: "*" - sugarss: "*" - terser: ^5.4.0 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - "@types/node": - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - bin: - vite: bin/vite.js - checksum: 10c0/795c7e0dbc94b96c4a0aff0d5d4b349dd28ad8b7b70979c1010f96b4d83f7d6c1700ebd6fed91de2e021b0a3689b9abc2d8017f6dfa8c9a6ca5c7af637d6afc6 - languageName: node - linkType: hard - -"vite@npm:~5.4.2": +"vite@npm:^5.0.0, vite@npm:~5.4.2": version: 5.4.2 resolution: "vite@npm:5.4.2" dependencies: @@ -44432,12 +43765,12 @@ __metadata: linkType: hard "watchpack@npm:^2.4.1": - version: 2.4.1 - resolution: "watchpack@npm:2.4.1" + version: 2.4.2 + resolution: "watchpack@npm:2.4.2" dependencies: glob-to-regexp: "npm:^0.4.1" graceful-fs: "npm:^4.1.2" - checksum: 10c0/c694de0a61004e587a8a0fdc9cfec20ee692c52032d9ab2c2e99969a37fdab9e6e1bd3164ed506f9a13f7c83e65563d563e0d6b87358470cdb7309b83db78683 + checksum: 10c0/ec60a5f0e9efaeca0102fd9126346b3b2d523e01c34030d3fddf5813a7125765121ebdc2552981136dcd2c852deb1af0b39340f2fcc235f292db5399d0283577 languageName: node linkType: hard @@ -45175,8 +44508,8 @@ __metadata: linkType: hard "webpack-dev-middleware@npm:^7.1.0": - version: 7.3.0 - resolution: "webpack-dev-middleware@npm:7.3.0" + version: 7.4.2 + resolution: "webpack-dev-middleware@npm:7.4.2" dependencies: colorette: "npm:^2.0.10" memfs: "npm:^4.6.0" @@ -45189,7 +44522,7 @@ __metadata: peerDependenciesMeta: webpack: optional: true - checksum: 10c0/03d34e1c7af3af8c98efe754ce6cfb9fe84a1f02d312bc37a77f55b8ae9525bc3ac913fc92c0143ab93a3a6377781661f07336031fcd5e6bbddccc11df9345db + checksum: 10c0/2aa873ef57a7095d7fba09400737b6066adc3ded229fd6eba89a666f463c2614c68e01ae58f662c9cdd74f0c8da088523d972329bf4a054e470bc94feb8bcad0 languageName: node linkType: hard @@ -45681,8 +45014,8 @@ __metadata: linkType: hard "winston@npm:^3.10.0": - version: 3.13.1 - resolution: "winston@npm:3.13.1" + version: 3.14.2 + resolution: "winston@npm:3.14.2" dependencies: "@colors/colors": "npm:^1.6.0" "@dabh/diagnostics": "npm:^2.0.2" @@ -45695,7 +45028,7 @@ __metadata: stack-trace: "npm:0.0.x" triple-beam: "npm:^1.3.0" winston-transport: "npm:^4.7.0" - checksum: 10c0/986a542f17b71935b88c14465939bf7eaf64d8d13c18792f74b0eb19b31abdaf472df92049a1d7882405076aba95de13cdb5b3243d0c04c4f9632fac85f57788 + checksum: 10c0/3f8fe505ea18310982e60452f335dd2b22fdbc9b25839b6ad882971b2416d5adc94a1f1a46e24cb37d967ad01dfe5499adaf5e53575626b5ebb2a25ff30f4e1d languageName: node linkType: hard From b69df072c1e99898a4e555d047bf42abfdf1d352 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Thu, 29 Aug 2024 21:04:18 +0700 Subject: [PATCH 11/51] fix(tangle-dapp): Fix build command --- apps/tangle-dapp/app/blueprints/[name]/useVaultAssets.tsx | 4 +--- apps/tangle-dapp/app/restake/page.tsx | 2 +- apps/tangle-dapp/components/index.ts | 1 - 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/apps/tangle-dapp/app/blueprints/[name]/useVaultAssets.tsx b/apps/tangle-dapp/app/blueprints/[name]/useVaultAssets.tsx index ed3b02eb1..9ba7a53ac 100644 --- a/apps/tangle-dapp/app/blueprints/[name]/useVaultAssets.tsx +++ b/apps/tangle-dapp/app/blueprints/[name]/useVaultAssets.tsx @@ -1,8 +1,6 @@ 'use client'; -import { VaultAsset } from '../../../types/blueprint'; - -export default function useVaultAssets(_: string): VaultAsset[] { +export default function useVaultAssets(_: string) { return [ { id: '31234', diff --git a/apps/tangle-dapp/app/restake/page.tsx b/apps/tangle-dapp/app/restake/page.tsx index 5940c78f3..5c100f58d 100644 --- a/apps/tangle-dapp/app/restake/page.tsx +++ b/apps/tangle-dapp/app/restake/page.tsx @@ -3,7 +3,7 @@ import { Typography } from '@webb-tools/webb-ui-components/typography/Typography import { twMerge } from 'tailwind-merge'; import GlassCard from '../../components/GlassCard/GlassCard'; -import StatItem from '../../components/LiquidStaking/StatItem'; +import StatItem from '../../components/StatItem'; import TableTabs from './TableTabs'; export const dynamic = 'force-static'; diff --git a/apps/tangle-dapp/components/index.ts b/apps/tangle-dapp/components/index.ts index 40828dd4a..b73c8f101 100644 --- a/apps/tangle-dapp/components/index.ts +++ b/apps/tangle-dapp/components/index.ts @@ -11,7 +11,6 @@ export * from './ServicesKeyMetricItem'; export * from './ServiceTable'; export * from './Sidebar'; export * from './skeleton'; -export { default as TableCellWrapper } from './TableCellWrapper'; export * from './TableStatus'; export { default as TangleBigLogo } from './TangleBigLogo'; export { default as TangleCard } from './TangleCard'; From 001d3142278105f9e4be58c06b564c1e9b4f42b0 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Thu, 29 Aug 2024 22:54:24 +0700 Subject: [PATCH 12/51] feat: debug Netlify --- apps/tangle-dapp/netlify.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/tangle-dapp/netlify.toml b/apps/tangle-dapp/netlify.toml index acdbbeae8..887740816 100644 --- a/apps/tangle-dapp/netlify.toml +++ b/apps/tangle-dapp/netlify.toml @@ -1,3 +1,3 @@ [build] -command = "yarn nx build tangle-dapp" +command = "ls . && echo \"\n\" && ls ./apps/tangle-dapp && yarn nx build tangle-dapp" publish = "./dist/apps/tangle-dapp/.next" From 3180cada64fe0a0c317a163a2086af4388547119 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Thu, 29 Aug 2024 23:02:27 +0700 Subject: [PATCH 13/51] feat: list hidden files --- apps/tangle-dapp/netlify.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/tangle-dapp/netlify.toml b/apps/tangle-dapp/netlify.toml index 887740816..c61ced778 100644 --- a/apps/tangle-dapp/netlify.toml +++ b/apps/tangle-dapp/netlify.toml @@ -1,3 +1,3 @@ [build] -command = "ls . && echo \"\n\" && ls ./apps/tangle-dapp && yarn nx build tangle-dapp" +command = "ls -a . && echo \"\n\n\" && ls -a ./apps/tangle-dapp && yarn nx build tangle-dapp" publish = "./dist/apps/tangle-dapp/.next" From 0118c34cf85dba215e3273457e386c97104f819c Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Thu, 29 Aug 2024 23:35:10 +0700 Subject: [PATCH 14/51] chore(tangle-dapp): Remove the debug command --- apps/tangle-dapp/netlify.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/tangle-dapp/netlify.toml b/apps/tangle-dapp/netlify.toml index c61ced778..acdbbeae8 100644 --- a/apps/tangle-dapp/netlify.toml +++ b/apps/tangle-dapp/netlify.toml @@ -1,3 +1,3 @@ [build] -command = "ls -a . && echo \"\n\n\" && ls -a ./apps/tangle-dapp && yarn nx build tangle-dapp" +command = "yarn nx build tangle-dapp" publish = "./dist/apps/tangle-dapp/.next" From bd6adbf115305e1ac546b559c5c72d95d265a5cf Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Fri, 30 Aug 2024 14:36:31 +0700 Subject: [PATCH 15/51] fix(webb-ui): Resolve the `key` warnings --- apps/tangle-dapp/app/blueprints/[name]/useOperators.ts | 6 +++--- libs/webb-ui-components/src/components/Table/Table.tsx | 9 ++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/apps/tangle-dapp/app/blueprints/[name]/useOperators.ts b/apps/tangle-dapp/app/blueprints/[name]/useOperators.ts index 830e58fd6..324b2904d 100644 --- a/apps/tangle-dapp/app/blueprints/[name]/useOperators.ts +++ b/apps/tangle-dapp/app/blueprints/[name]/useOperators.ts @@ -6,7 +6,7 @@ import { LiquidStakingToken } from '../../../types/liquidStaking'; export default function useOperators(): Operator[] { return [ { - address: 'tgDRbUxr3dV3j5pCW7DrpmswiABCMTN2NxioeDfA9TXLw6X1u', + address: 'tgC2pxrFu34VuBNGsz3yes6PYnE8cf6VQ5JroY96NTUW5cmU2', identityName: 'PIKACHU.COM', restakersCount: 43, concentration: 50.123, @@ -21,7 +21,7 @@ export default function useOperators(): Operator[] { ], }, { - address: 'tgDRbUxr3dV3j5pCW7DrpmswiABCMTN2NxioeDfA9TXLw6X1u', + address: 'tgCFwkpaXGNNfaFQ4dKDCrGkARQztJp82ekxwRJav9MhMiqD1', identityName: 'CHARIZARD.COM', restakersCount: 24, concentration: 60.89, @@ -52,7 +52,7 @@ export default function useOperators(): Operator[] { ], }, { - address: 'tgDRbUxr3dV3j5pCW7DrpmswiABCMTN2NxioeDfA9TXLw6X1u', + address: 'tgCZuFEMk6yFqTzjSs9sZrdSHAWUXRuneA2e1TRxE8GcLQyfS', identityName: 'GENGAR.COM', restakersCount: 12, concentration: 55, diff --git a/libs/webb-ui-components/src/components/Table/Table.tsx b/libs/webb-ui-components/src/components/Table/Table.tsx index 8d0228383..f934e963a 100644 --- a/libs/webb-ui-components/src/components/Table/Table.tsx +++ b/libs/webb-ui-components/src/components/Table/Table.tsx @@ -1,5 +1,5 @@ import { type Row, type RowData, flexRender } from '@tanstack/react-table'; -import React, { useCallback } from 'react'; +import React, { Fragment, useCallback } from 'react'; import { ArrowDropDownFill, ArrowDropUpFill } from '@webb-tools/icons'; import { twMerge } from 'tailwind-merge'; @@ -101,9 +101,8 @@ export const Table = ({
{table.getRowModel().rows.map((row) => ( - <> + @@ -122,13 +121,13 @@ export const Table = ({ {getExpandedRowContent && row.getIsExpanded() && ( - + )} - + ))} {isDisplayFooter && ( From 98d9e327598b5ee5d5bcc0e1afa0c694dc5c192c Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Fri, 30 Aug 2024 15:23:01 +0700 Subject: [PATCH 16/51] feat(tangle-dapp): Add vault tokens dropdown --- .../app/blueprints/[name]/OperatorsTable.tsx | 6 +- .../tables/Operators/VaultsDropdown.tsx | 73 +++++++++++++++++++ .../components/tables/Operators/index.tsx | 11 +-- .../components/tables/Operators/types.ts | 8 +- 4 files changed, 87 insertions(+), 11 deletions(-) create mode 100644 apps/tangle-dapp/components/tables/Operators/VaultsDropdown.tsx diff --git a/apps/tangle-dapp/app/blueprints/[name]/OperatorsTable.tsx b/apps/tangle-dapp/app/blueprints/[name]/OperatorsTable.tsx index ffbd8dbdd..baa5f9e2a 100644 --- a/apps/tangle-dapp/app/blueprints/[name]/OperatorsTable.tsx +++ b/apps/tangle-dapp/app/blueprints/[name]/OperatorsTable.tsx @@ -23,7 +23,11 @@ const OperatorsTable: FC = () => { restakersCount: o.restakersCount, concentrationPercentage: o.concentration, tvlInUsd: o.liquidity.usdValue, - vaultTokens: o.vaults, + vaultTokens: o.vaults.map((v) => ({ + name: v, + symbol: v, + amount: 0, + })), }))} /> diff --git a/apps/tangle-dapp/components/tables/Operators/VaultsDropdown.tsx b/apps/tangle-dapp/components/tables/Operators/VaultsDropdown.tsx new file mode 100644 index 000000000..ec97c5a7b --- /dev/null +++ b/apps/tangle-dapp/components/tables/Operators/VaultsDropdown.tsx @@ -0,0 +1,73 @@ +import { + createColumnHelper, + getCoreRowModel, + useReactTable, +} from '@tanstack/react-table'; +import { + Dropdown, + DropdownBasicButton, + DropdownBody, +} from '@webb-tools/webb-ui-components/components/Dropdown'; +import { Table } from '@webb-tools/webb-ui-components/components/Table'; +import { Typography } from '@webb-tools/webb-ui-components/typography/Typography'; +import { getRoundedAmountString } from '@webb-tools/webb-ui-components/utils/getRoundedAmountString'; +import cx from 'classnames'; +import { FC } from 'react'; + +import LsTokenIcon from '../../LsTokenIcon'; +import type { VaultToken } from './types'; + +const columnHelper = createColumnHelper(); + +const columns = [ + columnHelper.accessor('name', { + header: () => Token, + cell: (props) => ( +

+ + + {props.getValue()} +

+ ), + }), + columnHelper.accessor('amount', { + header: () => ( + + Amount + + ), + cell: (props) => ( + + {getRoundedAmountString(props.getValue())} + + ), + }), +]; + +const VaultsDropdown: FC<{ vaultTokens: VaultToken[] }> = ({ vaultTokens }) => { + const table = useReactTable({ + columns, + data: vaultTokens, + getCoreRowModel: getCoreRowModel(), + }); + + return ( + + + {vaultTokens.map(({ name, symbol }, idx) => ( + + ))} + + + +
{getExpandedRowContent(row)}
{getExpandedRowContent(row)}
+ + + ); +}; + +export default VaultsDropdown; diff --git a/apps/tangle-dapp/components/tables/Operators/index.tsx b/apps/tangle-dapp/components/tables/Operators/index.tsx index d0094e011..b536174c7 100644 --- a/apps/tangle-dapp/components/tables/Operators/index.tsx +++ b/apps/tangle-dapp/components/tables/Operators/index.tsx @@ -21,11 +21,11 @@ import { FC } from 'react'; import { twMerge } from 'tailwind-merge'; import { getSortAddressOrIdentityFnc } from '../../../utils/table'; -import LsTokenIcon from '../../LsTokenIcon'; import { TableStatus } from '../../TableStatus'; import { sharedTableStatusClxs } from '../shared'; import TableCellWrapper from '../TableCellWrapper'; import type { OperatorData, Props } from './types'; +import VaultsDropdown from './VaultsDropdown'; const columnHelper = createColumnHelper(); @@ -112,14 +112,7 @@ const columns = [ return ( {tokensList.length > 0 ? ( -
- {props - .getValue() - .sort() // sort alphabetically - .map((vault, index) => ( - - ))} -
+ ) : ( No vaults )} diff --git a/apps/tangle-dapp/components/tables/Operators/types.ts b/apps/tangle-dapp/components/tables/Operators/types.ts index 316d79850..6b70ace78 100644 --- a/apps/tangle-dapp/components/tables/Operators/types.ts +++ b/apps/tangle-dapp/components/tables/Operators/types.ts @@ -3,13 +3,19 @@ import type { ComponentProps } from 'react'; import type { TableStatus } from '../../TableStatus'; +export type VaultToken = { + name: string; + symbol: string; + amount: number; +}; + export type OperatorData = { address: string; identityName: string; restakersCount: number; concentrationPercentage: number; tvlInUsd: number; - vaultTokens: string[]; + vaultTokens: VaultToken[]; }; export type Props = { From 6a04d4f0aa6db0b441fc26181af77d18256ae3bb Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Fri, 30 Aug 2024 15:33:54 +0700 Subject: [PATCH 17/51] feat(tangle-dapp): Align operator with vault table --- apps/tangle-dapp/app/restake/OperatorsTable.tsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/tangle-dapp/app/restake/OperatorsTable.tsx b/apps/tangle-dapp/app/restake/OperatorsTable.tsx index e10c7a5fd..ebc59ace3 100644 --- a/apps/tangle-dapp/app/restake/OperatorsTable.tsx +++ b/apps/tangle-dapp/app/restake/OperatorsTable.tsx @@ -27,8 +27,8 @@ const OperatorsTable = () => { () => Object.entries(operatorMap).map( ([address, { delegationCount, delegations }]) => { - const vaultTokens = delegations - .map((delegation) => assetMap[delegation.assetId]?.symbol) + const vaultAssets = delegations + .map((delegation) => assetMap[delegation.assetId]) .filter(Boolean); return { @@ -39,7 +39,12 @@ const OperatorsTable = () => { restakersCount: delegationCount, // TODO: Calculate tvl in USD tvlInUsd: 0, - vaultTokens, + vaultTokens: vaultAssets.map((asset) => ({ + // TODO: Calculate amount + amount: 0, + name: asset.name, + symbol: asset.symbol, + })), }; }, ), @@ -52,7 +57,7 @@ const OperatorsTable = () => { id="search-validators" rightIcon={} placeholder="Search identity or address" - className="w-1/3 mb-4 ml-auto -mt-[54px]" + className="w-1/3 mb-1.5 ml-auto -mt-[54px]" isControlled debounceTime={500} value={globalFilter} From 7fa7cb4c01b8fa5e48abedc0c1a7fcc0670ed880 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Fri, 30 Aug 2024 15:54:47 +0700 Subject: [PATCH 18/51] feat(tangle-dapp): Integrate apy and self stake for vaults --- apps/tangle-dapp/app/restake/TableTabs.tsx | 62 ++++++++++++++++------ 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/apps/tangle-dapp/app/restake/TableTabs.tsx b/apps/tangle-dapp/app/restake/TableTabs.tsx index 7719d8987..34e7c2210 100644 --- a/apps/tangle-dapp/app/restake/TableTabs.tsx +++ b/apps/tangle-dapp/app/restake/TableTabs.tsx @@ -3,10 +3,13 @@ import { TableAndChartTabs } from '@webb-tools/webb-ui-components/components/TableAndChartTabs'; import { TabContent } from '@webb-tools/webb-ui-components/components/Tabs/TabContent'; import { type ComponentProps, useMemo } from 'react'; +import { formatUnits } from 'viem'; import VaultAssetsTable from '../../components/tables/VaultAssets'; import VaultsTable from '../../components/tables/Vaults'; import { useRestakeContext } from '../../context/RestakeContext'; +import useRestakeDelegatorInfo from '../../data/restake/useRestakeDelegatorInfo'; +import useRestakeRewardConfig from '../../data/restake/useRestakeRewardConfig'; import OperatorsTable from './OperatorsTable'; const RESTAKE_VAULTS_TAB = 'Restake Vaults'; @@ -21,6 +24,9 @@ type VaultAssetUI = NonNullable< const TableTabs = () => { const { assetMap } = useRestakeContext(); + const { delegatorInfo } = useRestakeDelegatorInfo(); + + const { rewardConfig } = useRestakeRewardConfig(); // Recalculate vaults (pools) data from assetMap const vaults = useMemo(() => { @@ -32,8 +38,7 @@ const TableTabs = () => { if (vaults[poolId] === undefined) { vaults[poolId] = { id: poolId, - // TODO: Calculate APY - apyPercentage: 0, + apyPercentage: rewardConfig.configs[poolId]?.apy ?? 0, // TODO: Find out a proper way to get the pool name, now it's the first token name name: name, // TODO: Find out a proper way to get the pool symbol, now it's the first token symbol @@ -48,7 +53,25 @@ const TableTabs = () => { } return vaults; - }, [assetMap]); + }, [assetMap, rewardConfig.configs]); + + const delegatorTotalRestakedAssets = useMemo(() => { + if (!delegatorInfo?.delegations) { + return {}; + } + + return delegatorInfo.delegations.reduce>( + (acc, { amountBonded, assetId }) => { + if (acc[assetId] === undefined) { + acc[assetId] = amountBonded; + } else { + acc[assetId] += amountBonded; + } + return acc; + }, + {}, + ); + }, [delegatorInfo?.delegations]); const tableProps = useMemo['tableProps']>( () => ({ @@ -60,17 +83,26 @@ const TableTabs = () => { const poolId = row.original.id; const vaultAssets = Object.values(assetMap) .filter((asset) => asset.poolId === poolId) - .map( - (asset) => - ({ - id: asset.id, - symbol: asset.symbol, - // TODO: Calculate tvl - tvl: 0, - // TODO: Calculate self stake - selfStake: 0, - }) satisfies VaultAssetUI, - ); + .map((asset) => { + const selfStake = (() => { + if (delegatorTotalRestakedAssets[asset.id] === undefined) { + return 0; + } + + return +formatUnits( + delegatorTotalRestakedAssets[asset.id], + asset.decimals, + ); + })(); + + return { + id: asset.id, + symbol: asset.symbol, + // TODO: Calculate tvl + tvl: 0, + selfStake, + } satisfies VaultAssetUI; + }); return (
@@ -82,7 +114,7 @@ const TableTabs = () => { ); }, }), - [assetMap], + [assetMap, delegatorTotalRestakedAssets], ); return ( From 8179e76ffb20230db243800666fb50bc6be364e9 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Fri, 30 Aug 2024 17:09:21 +0700 Subject: [PATCH 19/51] feat(tangle-dapp): Add proper link to restake tables --- .../app/restake/deposit/DepositForm.tsx | 34 +++++++++++++++++++ apps/tangle-dapp/app/restake/stake/page.tsx | 14 +++++--- .../components/Breadcrumbs/utils.tsx | 2 +- .../components/tables/Operators/index.tsx | 7 ++-- .../components/tables/Vaults/index.tsx | 4 ++- apps/tangle-dapp/types/index.ts | 4 ++- 6 files changed, 55 insertions(+), 10 deletions(-) diff --git a/apps/tangle-dapp/app/restake/deposit/DepositForm.tsx b/apps/tangle-dapp/app/restake/deposit/DepositForm.tsx index 1b431a195..b32fce021 100644 --- a/apps/tangle-dapp/app/restake/deposit/DepositForm.tsx +++ b/apps/tangle-dapp/app/restake/deposit/DepositForm.tsx @@ -1,5 +1,6 @@ 'use client'; +import { ZERO_BIG_INT } from '@webb-tools/dapp-config/constants'; import isDefined from '@webb-tools/dapp-types/utils/isDefined'; import { ArrowRight } from '@webb-tools/icons/ArrowRight'; import { @@ -8,6 +9,7 @@ import { } from '@webb-tools/webb-ui-components/components/ListCard/types'; import { Modal } from '@webb-tools/webb-ui-components/components/Modal'; import { useModal } from '@webb-tools/webb-ui-components/hooks/useModal'; +import { useQueryState } from 'nuqs'; import { type ComponentProps, useCallback, @@ -33,6 +35,7 @@ import ViewTxOnExplorer from '../../../data/restake/ViewTxOnExplorer'; import useIdentities from '../../../data/useIdentities'; import useActiveTypedChainId from '../../../hooks/useActiveTypedChainId'; import { useRpcSubscription } from '../../../hooks/usePolkadotApi'; +import { QueryParamKey } from '../../../types'; import { DepositFormFields } from '../../../types/restake'; import AssetList from '../AssetList'; import AvatarWithText from '../AvatarWithText'; @@ -73,6 +76,8 @@ const DepositForm = ({ ...props }: DepositFormProps) => { }, }); + const [poolIdParam] = useQueryState(QueryParamKey.RESTAKE_VAULT); + const { assetMap, assetWithBalances } = useRestakeContext(); const { operatorMap } = useRestakeOperatorMap(); const { result: operatorIdentities } = useIdentities( @@ -107,6 +112,35 @@ const DepositForm = ({ ...props }: DepositFormProps) => { resetField('amount'); }, [activeTypedChainId, resetField]); + useEffect(() => { + if (!poolIdParam) return; + + const defaultAsset = assetWithBalances + .filter((asset) => asset.metadata.poolId === poolIdParam) + .sort((a, b) => { + const aBalance = a.balance?.balance ?? ZERO_BIG_INT; + const bBalance = b.balance?.balance ?? ZERO_BIG_INT; + + if (aBalance === bBalance) return 0; + + return aBalance > bBalance ? -1 : 1; + }) + // Find the first asset with balance + .find( + (asset) => + asset.balance?.balance && asset.balance.balance > ZERO_BIG_INT, + ); + + if (!defaultAsset?.balance?.balance) return; + + // Select the first asset in the pool by default + setValue('depositAssetId', defaultAsset.assetId); + setValue( + 'amount', + formatUnits(defaultAsset.balance.balance, defaultAsset.metadata.decimals), + ); + }, [assetWithBalances, poolIdParam, setValue]); + const sourceTypedChainId = watch('sourceTypedChainId'); // Subscribe to sourceTypedChainId and update customRpc diff --git a/apps/tangle-dapp/app/restake/stake/page.tsx b/apps/tangle-dapp/app/restake/stake/page.tsx index a47c2504b..b5222a4c4 100644 --- a/apps/tangle-dapp/app/restake/stake/page.tsx +++ b/apps/tangle-dapp/app/restake/stake/page.tsx @@ -12,6 +12,7 @@ import { Typography } from '@webb-tools/webb-ui-components/typography/Typography import entries from 'lodash/entries'; import keys from 'lodash/keys'; import Link from 'next/link'; +import { useQueryState } from 'nuqs'; import { useCallback, useEffect, useMemo } from 'react'; import { SubmitHandler, useForm } from 'react-hook-form'; import { formatUnits, parseUnits } from 'viem'; @@ -31,7 +32,7 @@ import ViewTxOnExplorer from '../../../data/restake/ViewTxOnExplorer'; import useIdentities from '../../../data/useIdentities'; import useActiveTypedChainId from '../../../hooks/useActiveTypedChainId'; import { useRpcSubscription } from '../../../hooks/usePolkadotApi'; -import { PagePath } from '../../../types'; +import { PagePath, QueryParamKey } from '../../../types'; import type { DelegationFormFields } from '../../../types/restake'; import AssetList from '../AssetList'; import AvatarWithText from '../AvatarWithText'; @@ -58,6 +59,8 @@ export default function Page() { mode: 'onBlur', }); + const [operatorParam] = useQueryState(QueryParamKey.RESTAKE_OPERATOR); + const setValue = useCallback( (...params: Parameters) => { setFormValue(params[0], params[1], { @@ -109,10 +112,13 @@ export default function Page() { } }, [defaultAssetId, setValue]); - // Reset form when active chain changes useEffect(() => { - reset(); - }, [activeTypedChainId, reset]); + if (!operatorParam) return; + + if (!operatorMap[operatorParam]) return; + + setFormValue('operatorAccountId', operatorParam); + }, [operatorMap, operatorParam, setFormValue]); const { status: isChainModalOpen, diff --git a/apps/tangle-dapp/components/Breadcrumbs/utils.tsx b/apps/tangle-dapp/components/Breadcrumbs/utils.tsx index 530037f37..484c1af8b 100644 --- a/apps/tangle-dapp/components/Breadcrumbs/utils.tsx +++ b/apps/tangle-dapp/components/Breadcrumbs/utils.tsx @@ -25,7 +25,7 @@ const BREADCRUMB_ICONS: Record JSX.Element> = { [PagePath.SERVICES]: GridFillIcon, [PagePath.RESTAKE]: TokenSwapFill, [PagePath.RESTAKE_DEPOSIT]: TokenSwapFill, - [PagePath.RESTAKE_DELEGATE]: TokenSwapFill, + [PagePath.RESTAKE_STAKE]: TokenSwapFill, [PagePath.BRIDGE]: ShuffleLine, [PagePath.LIQUID_STAKING]: WaterDropletIcon, [PagePath.LIQUID_STAKING_OVERVIEW]: WaterDropletIcon, diff --git a/apps/tangle-dapp/components/tables/Operators/index.tsx b/apps/tangle-dapp/components/tables/Operators/index.tsx index b536174c7..d6cbe3b83 100644 --- a/apps/tangle-dapp/components/tables/Operators/index.tsx +++ b/apps/tangle-dapp/components/tables/Operators/index.tsx @@ -20,6 +20,7 @@ import Link from 'next/link'; import { FC } from 'react'; import { twMerge } from 'tailwind-merge'; +import { PagePath, QueryParamKey } from '../../../types'; import { getSortAddressOrIdentityFnc } from '../../../utils/table'; import { TableStatus } from '../../TableStatus'; import { sharedTableStatusClxs } from '../shared'; @@ -124,12 +125,13 @@ const columns = [ columnHelper.display({ id: 'actions', header: () => null, - cell: () => ( + cell: (props) => (
{/* TODO: add proper href */} diff --git a/apps/tangle-dapp/types/index.ts b/apps/tangle-dapp/types/index.ts index d28e8c40a..6f185859b 100755 --- a/apps/tangle-dapp/types/index.ts +++ b/apps/tangle-dapp/types/index.ts @@ -15,13 +15,15 @@ export enum PagePath { SERVICES = '/services', RESTAKE = '/restake', RESTAKE_DEPOSIT = '/restake/deposit', - RESTAKE_DELEGATE = '/restake/delegate', + RESTAKE_STAKE = '/restake/stake', LIQUID_STAKING = '/liquid-staking', LIQUID_STAKING_OVERVIEW = '/liquid-staking/overview', } export enum QueryParamKey { DELEGATIONS_AND_PAYOUTS_TAB = 'tab', + RESTAKE_VAULT = 'vault', + RESTAKE_OPERATOR = 'operator', } export type QueryParamKeyOf = From 7e51aa188ef00c7122887c4bbe7751129ac2c126 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Sun, 1 Sep 2024 17:48:36 +0700 Subject: [PATCH 20/51] feat(tangle-dapp): Add token price fetchers --- .../data/tokenPrice/fetchers/coinbase.ts | 32 +++++++++++++++++ .../data/tokenPrice/fetchers/coincap.ts | 35 +++++++++++++++++++ apps/tangle-dapp/data/tokenPrice/index.ts | 13 +++++++ apps/tangle-dapp/data/tokenPrice/types.ts | 9 +++++ 4 files changed, 89 insertions(+) create mode 100644 apps/tangle-dapp/data/tokenPrice/fetchers/coinbase.ts create mode 100644 apps/tangle-dapp/data/tokenPrice/fetchers/coincap.ts create mode 100644 apps/tangle-dapp/data/tokenPrice/index.ts create mode 100644 apps/tangle-dapp/data/tokenPrice/types.ts diff --git a/apps/tangle-dapp/data/tokenPrice/fetchers/coinbase.ts b/apps/tangle-dapp/data/tokenPrice/fetchers/coinbase.ts new file mode 100644 index 000000000..a907cc3a8 --- /dev/null +++ b/apps/tangle-dapp/data/tokenPrice/fetchers/coinbase.ts @@ -0,0 +1,32 @@ +import axios from 'axios'; +import z from 'zod'; + +import type { TokenPriceFetcher } from '../types'; + +export const coinbaseTokenPriceFetcher = { + endpoint: 'https://api.coinbase.com/v2/exchange-rates', + + isBatchSupported: false, + + async fetchTokenPrice(token: string): Promise { + const response = await axios.get(this.endpoint, { + params: { + currency: token, + }, + }); + + const Schema = z.object({ + data: z.object({ + rates: z.object({ + USD: z.string(), + }), + }), + }); + + const result = Schema.safeParse(response.data); + if (result.success === false) + throw new Error('Invalid response from coinbase'); + + return Number(result.data.data.rates.USD); + }, +} as const satisfies TokenPriceFetcher; diff --git a/apps/tangle-dapp/data/tokenPrice/fetchers/coincap.ts b/apps/tangle-dapp/data/tokenPrice/fetchers/coincap.ts new file mode 100644 index 000000000..e72373f2c --- /dev/null +++ b/apps/tangle-dapp/data/tokenPrice/fetchers/coincap.ts @@ -0,0 +1,35 @@ +import axios from 'axios'; +import z from 'zod'; + +import type { TokenPriceFetcher } from '../types'; + +export const coincapTokenPriceFetcher = { + endpoint: 'https://api.coincap.io/v2/assets', + + isBatchSupported: false, + + async fetchTokenPrice(token: string): Promise { + const response = await axios.get(this.endpoint, { + params: { + search: token, + }, + }); + + const Schema = z.object({ + data: z.array( + z.object({ + priceUsd: z.string(), + }), + ), + }); + + const result = Schema.safeParse(response.data); + if (result.success === false) + throw new Error('Invalid response from coincap'); + + if (result.data.data.length === 0) + throw new Error('Token not found on coincap'); + + return Number(result.data.data[0].priceUsd); + }, +} as const satisfies TokenPriceFetcher; diff --git a/apps/tangle-dapp/data/tokenPrice/index.ts b/apps/tangle-dapp/data/tokenPrice/index.ts new file mode 100644 index 000000000..309b69b79 --- /dev/null +++ b/apps/tangle-dapp/data/tokenPrice/index.ts @@ -0,0 +1,13 @@ +export const fetchTokenPrices = async (tokens: string[]): Promise => { + // TODO: Implement the proper logic to fetch the price of the tokens + console.warn('fetchTokenPrices not implemented'); + return tokens.map(() => 0); +}; + +export const fetchSingleTokenPrice = async ( + _token: string, +): Promise => { + // TODO: Implement the proper logic to fetch the price of the token + console.warn('fetchSingleTokenPrice not implemented'); + return 0; +}; diff --git a/apps/tangle-dapp/data/tokenPrice/types.ts b/apps/tangle-dapp/data/tokenPrice/types.ts new file mode 100644 index 000000000..bc4f4ec71 --- /dev/null +++ b/apps/tangle-dapp/data/tokenPrice/types.ts @@ -0,0 +1,9 @@ +export interface TokenPriceFetcher { + endpoint: string; + + isBatchSupported: TIsBatchSupported; + + fetchTokenPrice( + token: TIsBatchSupported extends true ? string[] : string, + ): Promise; +} From 2f5fca86c0f633fc44e207a76ed5ac068d79f3ec Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Sun, 1 Sep 2024 22:34:24 +0700 Subject: [PATCH 21/51] feat(tangle-dapp): Fetch token prices and update asset map --- .../data/restake/useRestakeAssetMap.ts | 14 +++++++ apps/tangle-dapp/data/tokenPrice/index.ts | 38 ++++++++++++++++++- apps/tangle-dapp/types/restake.ts | 4 +- 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/apps/tangle-dapp/data/restake/useRestakeAssetMap.ts b/apps/tangle-dapp/data/restake/useRestakeAssetMap.ts index db0599e3d..cc98c8d2d 100644 --- a/apps/tangle-dapp/data/restake/useRestakeAssetMap.ts +++ b/apps/tangle-dapp/data/restake/useRestakeAssetMap.ts @@ -14,6 +14,7 @@ import usePolkadotApi from '../../hooks/usePolkadotApi'; import type { AssetMap, AssetMetadata } from '../../types/restake'; import hasAssetsPallet from '../../utils/hasAssetsPallet'; import filterNativeAsset from '../../utils/restaking/filterNativeAsset'; +import { fetchSingleTokenPrice, fetchTokenPrices } from '../tokenPrice'; import useRestakeAssetIds from './useRestakeAssetIds'; /** @@ -114,6 +115,15 @@ const mapAssetDetails = async ( api.queryMulti[]>(assetPoolIdQueries), ] as const); + // Get list of token symbols for fetching the prices + const tokenSymbols = nonNativeAssetIds.map((_, idx) => { + const metadata = assetMetadatas[idx]; + return hexToString(metadata.symbol.toHex()); + }); + + // Fetch the prices of the tokens + const tokenPrices = await fetchTokenPrices(tokenSymbols); + const initialAssetMap: AssetMap = hasNative ? await (async () => { const nativeAsset = await getNativeAsset(nativeCurrentcy, api); @@ -153,6 +163,7 @@ const mapAssetDetails = async ( decimals: metadata.decimals.toNumber(), status: detail.status.type, poolId: u128ToPoolId(poolId), + priceInUsd: tokenPrices[idx], }, } satisfies AssetMap); }, initialAssetMap); @@ -176,10 +187,13 @@ const getNativeAsset = async ( assetId, ); + const priceInUsd = await fetchSingleTokenPrice(nativeCurrency.symbol); + return { ...nativeCurrency, id: assetId, status: 'Live', poolId: u128ToPoolId(poolId), + priceInUsd, } satisfies AssetMetadata; }; diff --git a/apps/tangle-dapp/data/tokenPrice/index.ts b/apps/tangle-dapp/data/tokenPrice/index.ts index 309b69b79..6cec3dbaa 100644 --- a/apps/tangle-dapp/data/tokenPrice/index.ts +++ b/apps/tangle-dapp/data/tokenPrice/index.ts @@ -1,13 +1,47 @@ +/** + * Fetches the prices of multiple tokens, return `Number.NaN` + * if failed to fetch the price of that token. + * + * @param {string[]} tokens - An array of token symbols. + * @returns {Promise} A promise that resolves to an array of token prices. + * + * @example + * const tokens = ['ETH', 'BTC', 'USDT']; + * fetchTokenPrices(tokens).then(prices => { + * console.log(prices); // [2000, 30000, 1] + * }); + * + * @remarks + * This function currently returns an array of `Number.NaN` and logs a warning to the console. + * The actual implementation to fetch real token prices needs to be added. + */ export const fetchTokenPrices = async (tokens: string[]): Promise => { // TODO: Implement the proper logic to fetch the price of the tokens console.warn('fetchTokenPrices not implemented'); - return tokens.map(() => 0); + return tokens.map(() => Number.NaN); }; +/** + * Fetches the price of a single token, returns `Number.NaN` if failed to fetch the price. + * + * @param {string} _token - The symbol of the token. + * @returns {Promise} A promise that resolves to the token price. + * + * @example + * const token = 'ETH'; + * fetchSingleTokenPrice(token).then(price => { + * console.log(price); // 2000 + * }); + * + * @remarks + * This function currently returns `Number.NaN` and logs a warning to the console. + * The actual implementation to fetch the real token price needs to be added. + * The function will return `Number.NaN` when failed to fetch the price. + */ export const fetchSingleTokenPrice = async ( _token: string, ): Promise => { // TODO: Implement the proper logic to fetch the price of the token console.warn('fetchSingleTokenPrice not implemented'); - return 0; + return Number.NaN; }; diff --git a/apps/tangle-dapp/types/restake.ts b/apps/tangle-dapp/types/restake.ts index b8a1b669b..34153f4f4 100644 --- a/apps/tangle-dapp/types/restake.ts +++ b/apps/tangle-dapp/types/restake.ts @@ -95,7 +95,9 @@ export type AssetMetadata = { */ readonly status: TransformEnum; - poolId: string | null; + readonly poolId: string | null; + + readonly priceInUsd: number; }; /** From 30a6f7185763789bffe23180630bf6502d4d47f3 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Sun, 1 Sep 2024 22:34:41 +0700 Subject: [PATCH 22/51] feat(tangle-dapp): Add useRestakeTVL hook for calculating TVL --- .../tangle-dapp/data/restake/useRestakeTVL.ts | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 apps/tangle-dapp/data/restake/useRestakeTVL.ts diff --git a/apps/tangle-dapp/data/restake/useRestakeTVL.ts b/apps/tangle-dapp/data/restake/useRestakeTVL.ts new file mode 100644 index 000000000..b5b32219d --- /dev/null +++ b/apps/tangle-dapp/data/restake/useRestakeTVL.ts @@ -0,0 +1,100 @@ +import { useObservable, useObservableState } from 'observable-hooks'; +import { of, switchMap } from 'rxjs'; +import { formatUnits } from 'viem'; + +import useRestakeAssetMap from './useRestakeAssetMap'; +import useRestakeDelegatorInfo from './useRestakeDelegatorInfo'; +import useRestakeOperatorMap from './useRestakeOperatorMap'; + +export default function useRestakeTVL() { + const { operatorMap } = useRestakeOperatorMap(); + const { delegatorInfo } = useRestakeDelegatorInfo(); + const { assetMap } = useRestakeAssetMap(); + + const tvl$ = useObservable( + (input$) => + input$.pipe( + switchMap(([operatorMap, delegatorInfo, assetMap]) => { + const operatorTVL = Object.entries(operatorMap).reduce( + (acc, [operatorId, operatorData]) => { + const operatorTVL = operatorData.delegations.reduce( + (sum, delegation) => { + const assetPrice = + assetMap[delegation.assetId]?.priceInUsd || Number.NaN; + + if (Number.isNaN(assetPrice)) { + return sum; + } + + const formattedAmount = Number( + formatUnits( + delegation.amount, + assetMap[delegation.assetId].decimals, + ), + ); + + return sum + formattedAmount * assetPrice; + }, + 0, + ); + acc[operatorId] = operatorTVL; + return acc; + }, + {} as Record, + ); + + const totalNetworkTVL = Object.values(operatorTVL).reduce( + (sum, tvl) => sum + tvl, + 0, + ); + + const delegatorTVL = + delegatorInfo?.delegations.reduce( + (acc, delegation) => { + const assetPrice = + assetMap[delegation.assetId]?.priceInUsd || Number.NaN; + + if (Number.isNaN(assetPrice)) { + return acc; + } + + const formattedAmount = Number( + formatUnits( + delegation.amountBonded, + assetMap[delegation.assetId].decimals, + ), + ); + + acc[delegation.assetId] = + (acc[delegation.assetId] || 0) + formattedAmount * assetPrice; + + return acc; + }, + {} as Record, + ) || {}; + + const totalDelegatorTVL = Object.values(delegatorTVL).reduce( + (sum, tvl) => sum + tvl, + 0, + ); + + return of({ + operatorTVL, + totalNetworkTVL, + delegatorTVL, + totalDelegatorTVL, + }); + }), + ), + [operatorMap, delegatorInfo, assetMap], + ); + + const tvl = useObservableState(tvl$, { + operatorTVL: {}, + totalNetworkTVL: 0, + delegatorTVL: {}, + totalDelegatorTVL: 0, + }); + + return tvl; +} From 1e4803d555cc863f1d4369a12dc2bf37a7ba1853 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Sun, 1 Sep 2024 22:35:00 +0700 Subject: [PATCH 23/51] feat(restake): Add OverviewTVLStats component --- .../app/restake/OverviewTVLStats.tsx | 19 +++++++++++++++++++ apps/tangle-dapp/app/restake/page.tsx | 9 ++------- apps/tangle-dapp/app/restake/utils.ts | 6 ++++++ 3 files changed, 27 insertions(+), 7 deletions(-) create mode 100644 apps/tangle-dapp/app/restake/OverviewTVLStats.tsx diff --git a/apps/tangle-dapp/app/restake/OverviewTVLStats.tsx b/apps/tangle-dapp/app/restake/OverviewTVLStats.tsx new file mode 100644 index 000000000..c92cafb0b --- /dev/null +++ b/apps/tangle-dapp/app/restake/OverviewTVLStats.tsx @@ -0,0 +1,19 @@ +'use client'; + +import StatItem from '../../components/StatItem' +import useRestakeTVL from '../../data/restake/useRestakeTVL'; +import { tvlToDisplay } from './utils'; + +const OverviewTVLStats = () => { + const { totalNetworkTVL, totalDelegatorTVL } = useRestakeTVL() + + return ( +
+ + + +
+ ) +} + +export default OverviewTVLStats diff --git a/apps/tangle-dapp/app/restake/page.tsx b/apps/tangle-dapp/app/restake/page.tsx index 5c100f58d..de91b6a0b 100644 --- a/apps/tangle-dapp/app/restake/page.tsx +++ b/apps/tangle-dapp/app/restake/page.tsx @@ -3,7 +3,7 @@ import { Typography } from '@webb-tools/webb-ui-components/typography/Typography import { twMerge } from 'tailwind-merge'; import GlassCard from '../../components/GlassCard/GlassCard'; -import StatItem from '../../components/StatItem'; +import OverviewTVLStats from './OverviewTVLStats'; import TableTabs from './TableTabs'; export const dynamic = 'force-static'; @@ -40,12 +40,7 @@ export default function RestakePage() { {CONTENT.OVERVIEW} -
- {/* TODO: Calculate these values */} - - - -
+ Date: Mon, 2 Sep 2024 19:16:32 +0700 Subject: [PATCH 24/51] chore(restake): Refactor OperatorsTable component to accept operatorMap as a prop --- .../app/restake/OperatorsTable.tsx | 11 +++++--- .../app/restake/OverviewTVLStats.tsx | 19 ------------- apps/tangle-dapp/app/restake/TableTabs.tsx | 14 ++++++---- apps/tangle-dapp/app/restake/page.tsx | 27 ++++++++++++++++--- .../tangle-dapp/data/restake/useRestakeTVL.ts | 16 +++++------ 5 files changed, 48 insertions(+), 39 deletions(-) delete mode 100644 apps/tangle-dapp/app/restake/OverviewTVLStats.tsx diff --git a/apps/tangle-dapp/app/restake/OperatorsTable.tsx b/apps/tangle-dapp/app/restake/OperatorsTable.tsx index ebc59ace3..0c97f78cf 100644 --- a/apps/tangle-dapp/app/restake/OperatorsTable.tsx +++ b/apps/tangle-dapp/app/restake/OperatorsTable.tsx @@ -2,21 +2,24 @@ import { Search } from '@webb-tools/icons/Search'; import { Input } from '@webb-tools/webb-ui-components/components/Input'; -import { ComponentProps, useMemo, useState } from 'react'; +import { type ComponentProps, type FC, useMemo, useState } from 'react'; import OperatorsTableUI from '../../components/tables/Operators'; import { useRestakeContext } from '../../context/RestakeContext'; -import useRestakeOperatorMap from '../../data/restake/useRestakeOperatorMap'; import useIdentities from '../../data/useIdentities'; +import type { OperatorMap } from '../../types/restake'; type OperatorUI = NonNullable< ComponentProps['data'] >[number]; -const OperatorsTable = () => { +type Props = { + operatorMap: OperatorMap, +} + +const OperatorsTable: FC = ({ operatorMap }) => { const [globalFilter, setGlobalFilter] = useState(''); - const { operatorMap } = useRestakeOperatorMap(); const { assetMap } = useRestakeContext(); const { result: identities } = useIdentities( diff --git a/apps/tangle-dapp/app/restake/OverviewTVLStats.tsx b/apps/tangle-dapp/app/restake/OverviewTVLStats.tsx deleted file mode 100644 index c92cafb0b..000000000 --- a/apps/tangle-dapp/app/restake/OverviewTVLStats.tsx +++ /dev/null @@ -1,19 +0,0 @@ -'use client'; - -import StatItem from '../../components/StatItem' -import useRestakeTVL from '../../data/restake/useRestakeTVL'; -import { tvlToDisplay } from './utils'; - -const OverviewTVLStats = () => { - const { totalNetworkTVL, totalDelegatorTVL } = useRestakeTVL() - - return ( -
- - - -
- ) -} - -export default OverviewTVLStats diff --git a/apps/tangle-dapp/app/restake/TableTabs.tsx b/apps/tangle-dapp/app/restake/TableTabs.tsx index 34e7c2210..98555b66c 100644 --- a/apps/tangle-dapp/app/restake/TableTabs.tsx +++ b/apps/tangle-dapp/app/restake/TableTabs.tsx @@ -2,14 +2,14 @@ import { TableAndChartTabs } from '@webb-tools/webb-ui-components/components/TableAndChartTabs'; import { TabContent } from '@webb-tools/webb-ui-components/components/Tabs/TabContent'; -import { type ComponentProps, useMemo } from 'react'; +import { type ComponentProps, type FC, useMemo } from 'react'; import { formatUnits } from 'viem'; import VaultAssetsTable from '../../components/tables/VaultAssets'; import VaultsTable from '../../components/tables/Vaults'; import { useRestakeContext } from '../../context/RestakeContext'; -import useRestakeDelegatorInfo from '../../data/restake/useRestakeDelegatorInfo'; import useRestakeRewardConfig from '../../data/restake/useRestakeRewardConfig'; +import type { DelegatorInfo, OperatorMap } from '../../types/restake'; import OperatorsTable from './OperatorsTable'; const RESTAKE_VAULTS_TAB = 'Restake Vaults'; @@ -22,9 +22,13 @@ type VaultAssetUI = NonNullable< ComponentProps['data'] >[number]; -const TableTabs = () => { +type Props = { + operatorMap: OperatorMap, + delegatorInfo: DelegatorInfo | null, +} + +const TableTabs: FC = ({ delegatorInfo, operatorMap }) => { const { assetMap } = useRestakeContext(); - const { delegatorInfo } = useRestakeDelegatorInfo(); const { rewardConfig } = useRestakeRewardConfig(); @@ -127,7 +131,7 @@ const TableTabs = () => { - + ); diff --git a/apps/tangle-dapp/app/restake/page.tsx b/apps/tangle-dapp/app/restake/page.tsx index de91b6a0b..9f82f8349 100644 --- a/apps/tangle-dapp/app/restake/page.tsx +++ b/apps/tangle-dapp/app/restake/page.tsx @@ -1,10 +1,16 @@ +'use client'; + import Button from '@webb-tools/webb-ui-components/components/buttons/Button'; import { Typography } from '@webb-tools/webb-ui-components/typography/Typography'; import { twMerge } from 'tailwind-merge'; import GlassCard from '../../components/GlassCard/GlassCard'; -import OverviewTVLStats from './OverviewTVLStats'; +import StatItem from '../../components/StatItem'; +import useRestakeDelegatorInfo from '../../data/restake/useRestakeDelegatorInfo'; +import useRestakeOperatorMap from '../../data/restake/useRestakeOperatorMap'; +import useRestakeTVL from '../../data/restake/useRestakeTVL'; import TableTabs from './TableTabs'; +import { tvlToDisplay } from './utils'; export const dynamic = 'force-static'; @@ -22,6 +28,14 @@ const CONTENT = { const minHeightClsx = 'min-h-[233px]'; export default function RestakePage() { + const { delegatorInfo } = useRestakeDelegatorInfo(); + const { operatorMap } = useRestakeOperatorMap(); + + const { totalNetworkTVL, totalDelegatorTVL } = useRestakeTVL( + operatorMap, + delegatorInfo + ) + return (
@@ -40,7 +54,11 @@ export default function RestakePage() { {CONTENT.OVERVIEW} - +
+ + + +
- +
); } diff --git a/apps/tangle-dapp/data/restake/useRestakeTVL.ts b/apps/tangle-dapp/data/restake/useRestakeTVL.ts index b5b32219d..27fe1debd 100644 --- a/apps/tangle-dapp/data/restake/useRestakeTVL.ts +++ b/apps/tangle-dapp/data/restake/useRestakeTVL.ts @@ -2,14 +2,14 @@ import { useObservable, useObservableState } from 'observable-hooks'; import { of, switchMap } from 'rxjs'; import { formatUnits } from 'viem'; -import useRestakeAssetMap from './useRestakeAssetMap'; -import useRestakeDelegatorInfo from './useRestakeDelegatorInfo'; -import useRestakeOperatorMap from './useRestakeOperatorMap'; - -export default function useRestakeTVL() { - const { operatorMap } = useRestakeOperatorMap(); - const { delegatorInfo } = useRestakeDelegatorInfo(); - const { assetMap } = useRestakeAssetMap(); +import { useRestakeContext } from '../../context/RestakeContext'; +import type { DelegatorInfo, OperatorMap } from '../../types/restake'; + +export default function useRestakeTVL( + operatorMap: OperatorMap, + delegatorInfo: DelegatorInfo | null, +) { + const { assetMap } = useRestakeContext(); const tvl$ = useObservable( (input$) => From f70c6e01f824f48120cf83f8fec40c45ab62d037 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Tue, 3 Sep 2024 00:38:20 +0700 Subject: [PATCH 25/51] feat(tangle-dapp): Calculate pool TVL and display TVLs on UI --- .../app/restake/OperatorsTable.tsx | 20 ++++++----- apps/tangle-dapp/app/restake/TableTabs.tsx | 30 +++++++++++----- apps/tangle-dapp/app/restake/page.tsx | 17 ++++++--- apps/tangle-dapp/app/restake/utils.ts | 6 ---- .../components/tables/Operators/index.tsx | 4 +-- .../components/tables/VaultAssets/index.tsx | 3 +- .../components/tables/Vaults/index.tsx | 4 +-- .../tangle-dapp/data/restake/useRestakeTVL.ts | 35 +++++++++++++------ apps/tangle-dapp/utils/getTVLToDisplay.ts | 7 ++++ 9 files changed, 82 insertions(+), 44 deletions(-) create mode 100644 apps/tangle-dapp/utils/getTVLToDisplay.ts diff --git a/apps/tangle-dapp/app/restake/OperatorsTable.tsx b/apps/tangle-dapp/app/restake/OperatorsTable.tsx index 0c97f78cf..4f3ca04a6 100644 --- a/apps/tangle-dapp/app/restake/OperatorsTable.tsx +++ b/apps/tangle-dapp/app/restake/OperatorsTable.tsx @@ -3,6 +3,7 @@ import { Search } from '@webb-tools/icons/Search'; import { Input } from '@webb-tools/webb-ui-components/components/Input'; import { type ComponentProps, type FC, useMemo, useState } from 'react'; +import { formatUnits } from 'viem'; import OperatorsTableUI from '../../components/tables/Operators'; import { useRestakeContext } from '../../context/RestakeContext'; @@ -15,9 +16,10 @@ type OperatorUI = NonNullable< type Props = { operatorMap: OperatorMap, + operatorTVL?: Record } -const OperatorsTable: FC = ({ operatorMap }) => { +const OperatorsTable: FC = ({ operatorMap, operatorTVL }) => { const [globalFilter, setGlobalFilter] = useState(''); const { assetMap } = useRestakeContext(); @@ -31,8 +33,10 @@ const OperatorsTable: FC = ({ operatorMap }) => { Object.entries(operatorMap).map( ([address, { delegationCount, delegations }]) => { const vaultAssets = delegations - .map((delegation) => assetMap[delegation.assetId]) - .filter(Boolean); + .map((delegation) => ({ asset: assetMap[delegation.assetId], amount: delegation.amount })) + .filter(vaultAsset => Boolean(vaultAsset.asset)); + + const tvlInUsd = operatorTVL?.[address] ?? Number.NaN; return { address, @@ -40,18 +44,16 @@ const OperatorsTable: FC = ({ operatorMap }) => { concentrationPercentage: 0, identityName: identities[address]?.name ?? '', restakersCount: delegationCount, - // TODO: Calculate tvl in USD - tvlInUsd: 0, - vaultTokens: vaultAssets.map((asset) => ({ - // TODO: Calculate amount - amount: 0, + tvlInUsd, + vaultTokens: vaultAssets.map(({ asset, amount }) => ({ + amount: +formatUnits(amount, asset.decimals), name: asset.name, symbol: asset.symbol, })), }; }, ), - [assetMap, identities, operatorMap], + [assetMap, identities, operatorMap, operatorTVL], ); return ( diff --git a/apps/tangle-dapp/app/restake/TableTabs.tsx b/apps/tangle-dapp/app/restake/TableTabs.tsx index 98555b66c..cbc7e8098 100644 --- a/apps/tangle-dapp/app/restake/TableTabs.tsx +++ b/apps/tangle-dapp/app/restake/TableTabs.tsx @@ -25,9 +25,18 @@ type VaultAssetUI = NonNullable< type Props = { operatorMap: OperatorMap, delegatorInfo: DelegatorInfo | null, + delegatorTVL?: Record, + operatorTVL?: Record, + vaultTVL?: Record, } -const TableTabs: FC = ({ delegatorInfo, operatorMap }) => { +const TableTabs: FC = ({ + delegatorInfo, + delegatorTVL, + operatorMap, + operatorTVL, + vaultTVL +}) => { const { assetMap } = useRestakeContext(); const { rewardConfig } = useRestakeRewardConfig(); @@ -40,16 +49,18 @@ const TableTabs: FC = ({ delegatorInfo, operatorMap }) => { if (poolId === null) continue; if (vaults[poolId] === undefined) { + const apyPercentage = rewardConfig.configs[poolId]?.apy ?? 0 + const tvlInUsd = vaultTVL?.[poolId] ?? Number.NaN; + vaults[poolId] = { id: poolId, - apyPercentage: rewardConfig.configs[poolId]?.apy ?? 0, + apyPercentage, // TODO: Find out a proper way to get the pool name, now it's the first token name name: name, // TODO: Find out a proper way to get the pool symbol, now it's the first token symbol representToken: symbol, tokensCount: 1, - // TODO: Calculate tvl in USD - tvlInUsd: 0, + tvlInUsd, }; } else { vaults[poolId].tokensCount += 1; @@ -57,7 +68,7 @@ const TableTabs: FC = ({ delegatorInfo, operatorMap }) => { } return vaults; - }, [assetMap, rewardConfig.configs]); + }, [assetMap, rewardConfig.configs, vaultTVL]); const delegatorTotalRestakedAssets = useMemo(() => { if (!delegatorInfo?.delegations) { @@ -99,11 +110,12 @@ const TableTabs: FC = ({ delegatorInfo, operatorMap }) => { ); })(); + const tvl = delegatorTVL?.[asset.id] ?? Number.NaN; + return { id: asset.id, symbol: asset.symbol, - // TODO: Calculate tvl - tvl: 0, + tvl, selfStake, } satisfies VaultAssetUI; }); @@ -118,7 +130,7 @@ const TableTabs: FC = ({ delegatorInfo, operatorMap }) => { ); }, }), - [assetMap, delegatorTotalRestakedAssets], + [assetMap, delegatorTVL, delegatorTotalRestakedAssets], ); return ( @@ -131,7 +143,7 @@ const TableTabs: FC = ({ delegatorInfo, operatorMap }) => { - + ); diff --git a/apps/tangle-dapp/app/restake/page.tsx b/apps/tangle-dapp/app/restake/page.tsx index 9f82f8349..6b0a1091a 100644 --- a/apps/tangle-dapp/app/restake/page.tsx +++ b/apps/tangle-dapp/app/restake/page.tsx @@ -9,8 +9,8 @@ import StatItem from '../../components/StatItem'; import useRestakeDelegatorInfo from '../../data/restake/useRestakeDelegatorInfo'; import useRestakeOperatorMap from '../../data/restake/useRestakeOperatorMap'; import useRestakeTVL from '../../data/restake/useRestakeTVL'; +import getTVLToDisplay from '../../utils/getTVLToDisplay'; import TableTabs from './TableTabs'; -import { tvlToDisplay } from './utils'; export const dynamic = 'force-static'; @@ -31,7 +31,13 @@ export default function RestakePage() { const { delegatorInfo } = useRestakeDelegatorInfo(); const { operatorMap } = useRestakeOperatorMap(); - const { totalNetworkTVL, totalDelegatorTVL } = useRestakeTVL( + const { + delegatorTVL, + operatorTVL, + poolTVL, + totalDelegatorTVL, + totalNetworkTVL, + } = useRestakeTVL( operatorMap, delegatorInfo ) @@ -55,9 +61,9 @@ export default function RestakePage() {
- + - +
@@ -89,8 +95,11 @@ export default function RestakePage() {
); diff --git a/apps/tangle-dapp/app/restake/utils.ts b/apps/tangle-dapp/app/restake/utils.ts index a0b55d664..db7223fcc 100644 --- a/apps/tangle-dapp/app/restake/utils.ts +++ b/apps/tangle-dapp/app/restake/utils.ts @@ -14,9 +14,3 @@ export function calculateTimeRemaining( export function isScheduledRequestReady(timeRemaining: number) { return timeRemaining === 0; } - -export function tvlToDisplay(tvl: number) { - if (Number.isNaN(tvl) || tvl === 0) return '--'; - - return `$${tvl}`; -} diff --git a/apps/tangle-dapp/components/tables/Operators/index.tsx b/apps/tangle-dapp/components/tables/Operators/index.tsx index d6cbe3b83..5e1b0352d 100644 --- a/apps/tangle-dapp/components/tables/Operators/index.tsx +++ b/apps/tangle-dapp/components/tables/Operators/index.tsx @@ -11,7 +11,6 @@ import { import { Avatar, Button, - getRoundedAmountString, shortenString, Table, Typography, @@ -21,6 +20,7 @@ import { FC } from 'react'; import { twMerge } from 'tailwind-merge'; import { PagePath, QueryParamKey } from '../../../types'; +import getTVLToDisplay from '../../../utils/getTVLToDisplay'; import { getSortAddressOrIdentityFnc } from '../../../utils/table'; import { TableStatus } from '../../TableStatus'; import { sharedTableStatusClxs } from '../shared'; @@ -100,7 +100,7 @@ const columns = [ variant="body1" className="text-mono-120 dark:text-mono-100" > - ${getRoundedAmountString(props.getValue())} + {getTVLToDisplay(props.getValue())}
), diff --git a/apps/tangle-dapp/components/tables/VaultAssets/index.tsx b/apps/tangle-dapp/components/tables/VaultAssets/index.tsx index 161ae23e0..71a2b004d 100644 --- a/apps/tangle-dapp/components/tables/VaultAssets/index.tsx +++ b/apps/tangle-dapp/components/tables/VaultAssets/index.tsx @@ -10,6 +10,7 @@ import { getRoundedAmountString } from '@webb-tools/webb-ui-components/utils/get import { FC, useMemo } from 'react'; import { twMerge } from 'tailwind-merge'; +import getTVLToDisplay from '../../../utils/getTVLToDisplay'; import type { Props, VaultAssetData } from './types'; const columnHelper = createColumnHelper(); @@ -25,7 +26,7 @@ const columns = [ }), columnHelper.accessor('tvl', { header: () => 'TVL', - cell: (props) => getRoundedAmountString(props.getValue()), + cell: (props) => getTVLToDisplay(props.getValue()), }), columnHelper.accessor('selfStake', { header: () => 'My Stake', diff --git a/apps/tangle-dapp/components/tables/Vaults/index.tsx b/apps/tangle-dapp/components/tables/Vaults/index.tsx index e44da07b7..d744f4db8 100644 --- a/apps/tangle-dapp/components/tables/Vaults/index.tsx +++ b/apps/tangle-dapp/components/tables/Vaults/index.tsx @@ -13,12 +13,12 @@ import { ChevronUp } from '@webb-tools/icons/ChevronUp'; import Button from '@webb-tools/webb-ui-components/components/buttons/Button'; import { Table } from '@webb-tools/webb-ui-components/components/Table'; import { Typography } from '@webb-tools/webb-ui-components/typography/Typography'; -import { getRoundedAmountString } from '@webb-tools/webb-ui-components/utils/getRoundedAmountString'; import Link from 'next/link'; import { FC, useMemo } from 'react'; import { twMerge } from 'tailwind-merge'; import { PagePath, QueryParamKey } from '../../../types'; +import getTVLToDisplay from '../../../utils/getTVLToDisplay'; import LsTokenIcon from '../../LsTokenIcon'; import { TableStatus } from '../../TableStatus'; import { sharedTableStatusClxs } from '../shared'; @@ -82,7 +82,7 @@ const columns = [ variant="body1" className="text-mono-120 dark:text-mono-100" > - ${getRoundedAmountString(props.getValue())} + {getTVLToDisplay(props.getValue())} ), diff --git a/apps/tangle-dapp/data/restake/useRestakeTVL.ts b/apps/tangle-dapp/data/restake/useRestakeTVL.ts index 27fe1debd..949c3554d 100644 --- a/apps/tangle-dapp/data/restake/useRestakeTVL.ts +++ b/apps/tangle-dapp/data/restake/useRestakeTVL.ts @@ -15,35 +15,46 @@ export default function useRestakeTVL( (input$) => input$.pipe( switchMap(([operatorMap, delegatorInfo, assetMap]) => { - const operatorTVL = Object.entries(operatorMap).reduce( + const { operatorTVL, poolTVL } = Object.entries(operatorMap).reduce( (acc, [operatorId, operatorData]) => { const operatorTVL = operatorData.delegations.reduce( (sum, delegation) => { - const assetPrice = - assetMap[delegation.assetId]?.priceInUsd || Number.NaN; + const asset = assetMap[delegation.assetId]; + const assetPrice = asset?.priceInUsd || Number.NaN; if (Number.isNaN(assetPrice)) { return sum; } const formattedAmount = Number( - formatUnits( - delegation.amount, - assetMap[delegation.assetId].decimals, - ), + formatUnits(delegation.amount, asset.decimals), ); - return sum + formattedAmount * assetPrice; + // Calculate operator TVL + sum += formattedAmount * assetPrice; + + // Calculate pool TVL + const poolId = asset.poolId; + if (poolId !== null) { + acc.poolTVL[poolId] = + (acc.poolTVL[poolId] || 0) + formattedAmount * assetPrice; + } + + return sum; }, 0, ); - acc[operatorId] = operatorTVL; + + acc.operatorTVL[operatorId] = operatorTVL; return acc; }, - {} as Record, + { + operatorTVL: {} as Record, + poolTVL: {} as Record, + }, ); - const totalNetworkTVL = Object.values(operatorTVL).reduce( + const totalNetworkTVL = Object.values(poolTVL).reduce( (sum, tvl) => sum + tvl, 0, ); @@ -80,6 +91,7 @@ export default function useRestakeTVL( return of({ operatorTVL, + poolTVL, totalNetworkTVL, delegatorTVL, totalDelegatorTVL, @@ -91,6 +103,7 @@ export default function useRestakeTVL( const tvl = useObservableState(tvl$, { operatorTVL: {}, + poolTVL: {}, totalNetworkTVL: 0, delegatorTVL: {}, totalDelegatorTVL: 0, diff --git a/apps/tangle-dapp/utils/getTVLToDisplay.ts b/apps/tangle-dapp/utils/getTVLToDisplay.ts new file mode 100644 index 000000000..88d4c379a --- /dev/null +++ b/apps/tangle-dapp/utils/getTVLToDisplay.ts @@ -0,0 +1,7 @@ +import { getRoundedAmountString } from '@webb-tools/webb-ui-components/utils/getRoundedAmountString'; + +export default function getTVLToDisplay(tvl: number) { + if (Number.isNaN(tvl) || tvl === 0) return '--'; + + return `$${getRoundedAmountString(tvl)}`; +} From 0db1540d7a9078f951b9b11cd797f9ee0c874d1b Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Tue, 3 Sep 2024 00:40:55 +0700 Subject: [PATCH 26/51] chore: Run format --- apps/tangle-dapp/app/restake/OperatorsTable.tsx | 13 ++++++++----- apps/tangle-dapp/app/restake/TableTabs.tsx | 16 ++++++++-------- apps/tangle-dapp/app/restake/page.tsx | 15 +++++++++------ 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/apps/tangle-dapp/app/restake/OperatorsTable.tsx b/apps/tangle-dapp/app/restake/OperatorsTable.tsx index 4f3ca04a6..5db7a3174 100644 --- a/apps/tangle-dapp/app/restake/OperatorsTable.tsx +++ b/apps/tangle-dapp/app/restake/OperatorsTable.tsx @@ -15,9 +15,9 @@ type OperatorUI = NonNullable< >[number]; type Props = { - operatorMap: OperatorMap, - operatorTVL?: Record -} + operatorMap: OperatorMap; + operatorTVL?: Record; +}; const OperatorsTable: FC = ({ operatorMap, operatorTVL }) => { const [globalFilter, setGlobalFilter] = useState(''); @@ -33,8 +33,11 @@ const OperatorsTable: FC = ({ operatorMap, operatorTVL }) => { Object.entries(operatorMap).map( ([address, { delegationCount, delegations }]) => { const vaultAssets = delegations - .map((delegation) => ({ asset: assetMap[delegation.assetId], amount: delegation.amount })) - .filter(vaultAsset => Boolean(vaultAsset.asset)); + .map((delegation) => ({ + asset: assetMap[delegation.assetId], + amount: delegation.amount, + })) + .filter((vaultAsset) => Boolean(vaultAsset.asset)); const tvlInUsd = operatorTVL?.[address] ?? Number.NaN; diff --git a/apps/tangle-dapp/app/restake/TableTabs.tsx b/apps/tangle-dapp/app/restake/TableTabs.tsx index cbc7e8098..06c8dadf4 100644 --- a/apps/tangle-dapp/app/restake/TableTabs.tsx +++ b/apps/tangle-dapp/app/restake/TableTabs.tsx @@ -23,19 +23,19 @@ type VaultAssetUI = NonNullable< >[number]; type Props = { - operatorMap: OperatorMap, - delegatorInfo: DelegatorInfo | null, - delegatorTVL?: Record, - operatorTVL?: Record, - vaultTVL?: Record, -} + operatorMap: OperatorMap; + delegatorInfo: DelegatorInfo | null; + delegatorTVL?: Record; + operatorTVL?: Record; + vaultTVL?: Record; +}; const TableTabs: FC = ({ delegatorInfo, delegatorTVL, operatorMap, operatorTVL, - vaultTVL + vaultTVL, }) => { const { assetMap } = useRestakeContext(); @@ -49,7 +49,7 @@ const TableTabs: FC = ({ if (poolId === null) continue; if (vaults[poolId] === undefined) { - const apyPercentage = rewardConfig.configs[poolId]?.apy ?? 0 + const apyPercentage = rewardConfig.configs[poolId]?.apy ?? 0; const tvlInUsd = vaultTVL?.[poolId] ?? Number.NaN; vaults[poolId] = { diff --git a/apps/tangle-dapp/app/restake/page.tsx b/apps/tangle-dapp/app/restake/page.tsx index 6b0a1091a..23191969c 100644 --- a/apps/tangle-dapp/app/restake/page.tsx +++ b/apps/tangle-dapp/app/restake/page.tsx @@ -37,10 +37,7 @@ export default function RestakePage() { poolTVL, totalDelegatorTVL, totalNetworkTVL, - } = useRestakeTVL( - operatorMap, - delegatorInfo - ) + } = useRestakeTVL(operatorMap, delegatorInfo); return (
@@ -61,9 +58,15 @@ export default function RestakePage() {
- + - +
From 70926aa3ae2a432bf82e9fec1b938c7134c3e0ce Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Tue, 3 Sep 2024 00:51:42 +0700 Subject: [PATCH 27/51] feat(tangle-dapp): Add operator concentration --- .../app/restake/OperatorsTable.tsx | 14 +++++++++---- apps/tangle-dapp/app/restake/TableTabs.tsx | 10 +++++++-- apps/tangle-dapp/app/restake/page.tsx | 2 ++ .../components/tables/Operators/index.tsx | 4 +++- .../tangle-dapp/data/restake/useRestakeTVL.ts | 21 +++++++++++++++---- 5 files changed, 40 insertions(+), 11 deletions(-) diff --git a/apps/tangle-dapp/app/restake/OperatorsTable.tsx b/apps/tangle-dapp/app/restake/OperatorsTable.tsx index 5db7a3174..35a6cc8e0 100644 --- a/apps/tangle-dapp/app/restake/OperatorsTable.tsx +++ b/apps/tangle-dapp/app/restake/OperatorsTable.tsx @@ -15,11 +15,16 @@ type OperatorUI = NonNullable< >[number]; type Props = { + operatorConcentration?: Record; operatorMap: OperatorMap; operatorTVL?: Record; }; -const OperatorsTable: FC = ({ operatorMap, operatorTVL }) => { +const OperatorsTable: FC = ({ + operatorConcentration, + operatorMap, + operatorTVL, +}) => { const [globalFilter, setGlobalFilter] = useState(''); const { assetMap } = useRestakeContext(); @@ -40,11 +45,12 @@ const OperatorsTable: FC = ({ operatorMap, operatorTVL }) => { .filter((vaultAsset) => Boolean(vaultAsset.asset)); const tvlInUsd = operatorTVL?.[address] ?? Number.NaN; + const concentrationPercentage = + operatorConcentration?.[address] ?? Number.NaN; return { address, - // TODO: Calculate concentration percentage - concentrationPercentage: 0, + concentrationPercentage, identityName: identities[address]?.name ?? '', restakersCount: delegationCount, tvlInUsd, @@ -56,7 +62,7 @@ const OperatorsTable: FC = ({ operatorMap, operatorTVL }) => { }; }, ), - [assetMap, identities, operatorMap, operatorTVL], + [assetMap, identities, operatorConcentration, operatorMap, operatorTVL], ); return ( diff --git a/apps/tangle-dapp/app/restake/TableTabs.tsx b/apps/tangle-dapp/app/restake/TableTabs.tsx index 06c8dadf4..517667759 100644 --- a/apps/tangle-dapp/app/restake/TableTabs.tsx +++ b/apps/tangle-dapp/app/restake/TableTabs.tsx @@ -23,9 +23,10 @@ type VaultAssetUI = NonNullable< >[number]; type Props = { - operatorMap: OperatorMap; delegatorInfo: DelegatorInfo | null; delegatorTVL?: Record; + operatorConcentration?: Record; + operatorMap: OperatorMap; operatorTVL?: Record; vaultTVL?: Record; }; @@ -33,6 +34,7 @@ type Props = { const TableTabs: FC = ({ delegatorInfo, delegatorTVL, + operatorConcentration, operatorMap, operatorTVL, vaultTVL, @@ -143,7 +145,11 @@ const TableTabs: FC = ({ - + ); diff --git a/apps/tangle-dapp/app/restake/page.tsx b/apps/tangle-dapp/app/restake/page.tsx index 23191969c..c6dc89852 100644 --- a/apps/tangle-dapp/app/restake/page.tsx +++ b/apps/tangle-dapp/app/restake/page.tsx @@ -33,6 +33,7 @@ export default function RestakePage() { const { delegatorTVL, + operatorConcentration, operatorTVL, poolTVL, totalDelegatorTVL, @@ -103,6 +104,7 @@ export default function RestakePage() { delegatorInfo={delegatorInfo} operatorTVL={operatorTVL} vaultTVL={poolTVL} + operatorConcentration={operatorConcentration} />
); diff --git a/apps/tangle-dapp/components/tables/Operators/index.tsx b/apps/tangle-dapp/components/tables/Operators/index.tsx index 5e1b0352d..20158cf7d 100644 --- a/apps/tangle-dapp/components/tables/Operators/index.tsx +++ b/apps/tangle-dapp/components/tables/Operators/index.tsx @@ -87,7 +87,9 @@ const columns = [ fw="bold" className="text-mono-200 dark:text-mono-0" > - {props.getValue().toFixed(2)}% + {Number.isNaN(props.getValue()) + ? '--' + : `${props.getValue().toFixed(2)}%`} ), diff --git a/apps/tangle-dapp/data/restake/useRestakeTVL.ts b/apps/tangle-dapp/data/restake/useRestakeTVL.ts index 949c3554d..cd6bda2f2 100644 --- a/apps/tangle-dapp/data/restake/useRestakeTVL.ts +++ b/apps/tangle-dapp/data/restake/useRestakeTVL.ts @@ -59,6 +59,17 @@ export default function useRestakeTVL( 0, ); + const operatorConcentration = Object.entries(operatorTVL).reduce( + (acc, [operatorId, operatorTVL]) => { + acc[operatorId] = + totalNetworkTVL > 0 + ? (operatorTVL / totalNetworkTVL) * 100 + : Number.NaN; + return acc; + }, + {} as Record, + ); + const delegatorTVL = delegatorInfo?.delegations.reduce( (acc, delegation) => { @@ -90,11 +101,12 @@ export default function useRestakeTVL( ); return of({ + delegatorTVL, + operatorConcentration, operatorTVL, poolTVL, - totalNetworkTVL, - delegatorTVL, totalDelegatorTVL, + totalNetworkTVL, }); }), ), @@ -102,11 +114,12 @@ export default function useRestakeTVL( ); const tvl = useObservableState(tvl$, { + delegatorTVL: {}, + operatorConcentration: {}, operatorTVL: {}, poolTVL: {}, - totalNetworkTVL: 0, - delegatorTVL: {}, totalDelegatorTVL: 0, + totalNetworkTVL: 0, }); return tvl; From 8f82230efca6fe0b82d812086b0139c1109eaf49 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Tue, 3 Sep 2024 02:22:46 +0700 Subject: [PATCH 28/51] chore: Ignore stats on link checker --- .lycheeignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.lycheeignore b/.lycheeignore index ca4aa3b3f..1a5ddb5b2 100644 --- a/.lycheeignore +++ b/.lycheeignore @@ -37,6 +37,7 @@ https://github.com/webb-tools/webb-dapp/releases/tag/v1.0.10 https://github.com/webb-tools/webb-dapp/releases/tag/v1.0.11 https://github.com/webb-tools/webb-dapp/releases/tag/v1.0.12 https://github.com/webb-tools/webb-dapp/releases/tag/v1.0.13 +https://stats.tangle.tools # Something happened with conventional commits link, temporary disabled to fix the CI https://www.conventionalcommits.org/en/v1.0.0/ From b5e4efc90a5fdc2401938b0424a3211567cee717 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Tue, 3 Sep 2024 02:44:37 +0700 Subject: [PATCH 29/51] fix(tangle-dapp): add missing query param parsing --- apps/tangle-dapp/hooks/useQueryParamKey.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/tangle-dapp/hooks/useQueryParamKey.ts b/apps/tangle-dapp/hooks/useQueryParamKey.ts index e3dde4337..9630e7720 100644 --- a/apps/tangle-dapp/hooks/useQueryParamKey.ts +++ b/apps/tangle-dapp/hooks/useQueryParamKey.ts @@ -25,6 +25,10 @@ function validateQueryParam( switch (key) { case QueryParamKey.DELEGATIONS_AND_PAYOUTS_TAB: return z.nativeEnum(DelegationsAndPayoutsTab).safeParse(value).success; + + case QueryParamKey.RESTAKE_OPERATOR: + case QueryParamKey.RESTAKE_VAULT: + return z.string().safeParse(value).success; } } From 940a3119453fccd5efc86ec630b08a07ccb40868 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Tue, 3 Sep 2024 14:01:23 +0700 Subject: [PATCH 30/51] fix(tangle-dapp): Remove query params after initial load --- apps/tangle-dapp/app/restake/deposit/DepositForm.tsx | 9 +++++++-- apps/tangle-dapp/app/restake/stake/page.tsx | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/apps/tangle-dapp/app/restake/deposit/DepositForm.tsx b/apps/tangle-dapp/app/restake/deposit/DepositForm.tsx index b32fce021..42ce62e3a 100644 --- a/apps/tangle-dapp/app/restake/deposit/DepositForm.tsx +++ b/apps/tangle-dapp/app/restake/deposit/DepositForm.tsx @@ -76,7 +76,9 @@ const DepositForm = ({ ...props }: DepositFormProps) => { }, }); - const [poolIdParam] = useQueryState(QueryParamKey.RESTAKE_VAULT); + const [poolIdParam, setPoolIdParam] = useQueryState( + QueryParamKey.RESTAKE_VAULT, + ); const { assetMap, assetWithBalances } = useRestakeContext(); const { operatorMap } = useRestakeOperatorMap(); @@ -139,7 +141,10 @@ const DepositForm = ({ ...props }: DepositFormProps) => { 'amount', formatUnits(defaultAsset.balance.balance, defaultAsset.metadata.decimals), ); - }, [assetWithBalances, poolIdParam, setValue]); + + // Remove the param to prevent reuse after initial load + setPoolIdParam(null); + }, [assetWithBalances, poolIdParam, setPoolIdParam, setValue]); const sourceTypedChainId = watch('sourceTypedChainId'); diff --git a/apps/tangle-dapp/app/restake/stake/page.tsx b/apps/tangle-dapp/app/restake/stake/page.tsx index b5222a4c4..bf8f405a3 100644 --- a/apps/tangle-dapp/app/restake/stake/page.tsx +++ b/apps/tangle-dapp/app/restake/stake/page.tsx @@ -59,7 +59,9 @@ export default function Page() { mode: 'onBlur', }); - const [operatorParam] = useQueryState(QueryParamKey.RESTAKE_OPERATOR); + const [operatorParam, setOperatorParam] = useQueryState( + QueryParamKey.RESTAKE_OPERATOR, + ); const setValue = useCallback( (...params: Parameters) => { @@ -118,7 +120,10 @@ export default function Page() { if (!operatorMap[operatorParam]) return; setFormValue('operatorAccountId', operatorParam); - }, [operatorMap, operatorParam, setFormValue]); + + // Remove the param to prevent reuse after initial load + setOperatorParam(null); + }, [operatorMap, operatorParam, setFormValue, setOperatorParam]); const { status: isChainModalOpen, From 4f06c74a45c451b4432eea1efe8212b087b62465 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Tue, 3 Sep 2024 14:16:22 +0700 Subject: [PATCH 31/51] chore(tangle-dapp): Update VaultsDropdown component to use div instead of p for token display --- .../components/tables/Operators/VaultsDropdown.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/tangle-dapp/components/tables/Operators/VaultsDropdown.tsx b/apps/tangle-dapp/components/tables/Operators/VaultsDropdown.tsx index ec97c5a7b..611a6b103 100644 --- a/apps/tangle-dapp/components/tables/Operators/VaultsDropdown.tsx +++ b/apps/tangle-dapp/components/tables/Operators/VaultsDropdown.tsx @@ -23,11 +23,11 @@ const columns = [ columnHelper.accessor('name', { header: () => Token, cell: (props) => ( -

+

{props.getValue()} -

+
), }), columnHelper.accessor('amount', { From d1c551b354b9183baa158cfd2149d2f8148bfc24 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Tue, 3 Sep 2024 16:18:06 +0700 Subject: [PATCH 32/51] chore(restake): Refactor OperatorsTable component to optimize restaker count calculation --- .../app/restake/OperatorsTable.tsx | 9 ++- .../data/restake/useRestakeOperatorMap.ts | 77 +++++++++---------- 2 files changed, 42 insertions(+), 44 deletions(-) diff --git a/apps/tangle-dapp/app/restake/OperatorsTable.tsx b/apps/tangle-dapp/app/restake/OperatorsTable.tsx index 35a6cc8e0..d15330687 100644 --- a/apps/tangle-dapp/app/restake/OperatorsTable.tsx +++ b/apps/tangle-dapp/app/restake/OperatorsTable.tsx @@ -36,7 +36,7 @@ const OperatorsTable: FC = ({ const operators = useMemo( () => Object.entries(operatorMap).map( - ([address, { delegationCount, delegations }]) => { + ([address, { delegations }]) => { const vaultAssets = delegations .map((delegation) => ({ asset: assetMap[delegation.assetId], @@ -44,6 +44,11 @@ const OperatorsTable: FC = ({ })) .filter((vaultAsset) => Boolean(vaultAsset.asset)); + const restakerSet = delegations.reduce((restakerSet, delegation) => { + restakerSet.add(delegation.delegatorAccountId); + return restakerSet; + }, new Set()); + const tvlInUsd = operatorTVL?.[address] ?? Number.NaN; const concentrationPercentage = operatorConcentration?.[address] ?? Number.NaN; @@ -52,7 +57,7 @@ const OperatorsTable: FC = ({ address, concentrationPercentage, identityName: identities[address]?.name ?? '', - restakersCount: delegationCount, + restakersCount: restakerSet.size, tvlInUsd, vaultTokens: vaultAssets.map(({ asset, amount }) => ({ amount: +formatUnits(amount, asset.decimals), diff --git a/apps/tangle-dapp/data/restake/useRestakeOperatorMap.ts b/apps/tangle-dapp/data/restake/useRestakeOperatorMap.ts index 0507e7e17..eb167be17 100644 --- a/apps/tangle-dapp/data/restake/useRestakeOperatorMap.ts +++ b/apps/tangle-dapp/data/restake/useRestakeOperatorMap.ts @@ -4,9 +4,10 @@ import type { PalletMultiAssetDelegationOperatorOperatorBondLessRequest, PalletMultiAssetDelegationOperatorOperatorStatus, } from '@polkadot/types/lookup'; -import { useObservable, useObservableState } from 'observable-hooks'; +import isDefined from '@webb-tools/dapp-types/utils/isDefined'; +import { useObservableState } from 'observable-hooks'; import { useMemo } from 'react'; -import { map, type Observable, of, switchMap } from 'rxjs'; +import { map, type Observable, of } from 'rxjs'; import usePolkadotApi from '../../hooks/usePolkadotApi'; import type { OperatorMap, OperatorMetadata } from '../../types/restake'; @@ -34,50 +35,42 @@ interface PalletMultiAssetDelegationOperatorOperatorMetadata extends Struct { export default function useRestakeOperatorMap(): UseRestakeOperatorMapReturnType { const { apiRx } = usePolkadotApi(); - const entries$ = useMemo( + const operatorMap$ = useMemo( () => - apiRx.query.multiAssetDelegation?.operators !== undefined - ? apiRx.query.multiAssetDelegation.operators.entries< - Option - >() - : of([]), + isDefined(apiRx.query?.multiAssetDelegation?.operators?.entries) + ? apiRx.query.multiAssetDelegation.operators + .entries< + Option + >() + .pipe( + map((entries) => { + return entries.reduce( + (operatorsMap, [accountStorage, operatorMetadata]) => { + if (operatorMetadata.isNone) return operatorsMap; + + const accountId = accountStorage.args[0]; + const operator = operatorMetadata.unwrap(); + + const operatorMetadataPrimitive = { + stake: operator.stake.toBigInt(), + delegationCount: operator.delegationCount.toNumber(), + bondLessRequest: toPrimitiveRequest(operator.request), + delegations: toPrimitiveDelegations(operator.delegations), + status: toPrimitiveStatus(operator.status), + } satisfies OperatorMetadata; + + return Object.assign(operatorsMap, { + [accountId.toString()]: operatorMetadataPrimitive, + } satisfies OperatorMap); + }, + {} as OperatorMap, + ); + }), + ) + : of({}), [apiRx.query.multiAssetDelegation?.operators], ); - const operatorMap$ = useObservable( - (input$) => - input$.pipe( - switchMap(([entries$]) => { - return entries$.pipe( - map((entries) => - entries.reduce( - (operatorsMap, [accountStorage, operatorMetadata]) => { - if (operatorMetadata.isNone) return operatorsMap; - - const accountId = accountStorage.args[0]; - const operator = operatorMetadata.unwrap(); - - const operatorMetadataPrimitive = { - stake: operator.stake.toBigInt(), - delegationCount: operator.delegationCount.toNumber(), - bondLessRequest: toPrimitiveRequest(operator.request), - delegations: toPrimitiveDelegations(operator.delegations), - status: toPrimitiveStatus(operator.status), - } satisfies OperatorMetadata; - - return Object.assign(operatorsMap, { - [accountId.toString()]: operatorMetadataPrimitive, - } satisfies OperatorMap); - }, - {} as OperatorMap, - ), - ), - ); - }), - ), - [entries$], - ); - const operatorMap = useObservableState(operatorMap$, {}); return { From c79422d5a9e469c1fb1d02429b394c815a6d7488 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Tue, 3 Sep 2024 16:24:28 +0700 Subject: [PATCH 33/51] fix(tangle-dapp): Remove commit links to fix link checker --- apps/bridge-dapp/CHANGELOG.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/bridge-dapp/CHANGELOG.md b/apps/bridge-dapp/CHANGELOG.md index 08b992ad0..54e36dec8 100644 --- a/apps/bridge-dapp/CHANGELOG.md +++ b/apps/bridge-dapp/CHANGELOG.md @@ -40,19 +40,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- Relayer filter by environment: https://github.com/webb-tools/webb-dapp/commit/5c2ef97cd7e7788b858c414f4b9546bdcfcfc2d8 -- Relayer fee and refund support: https://github.com/webb-tools/webb-dapp/commit/32ac5b0c7494c7ca746c6e56bda65cbfd692118f -- Added liquidity check on withdrawal: https://github.com/webb-tools/webb-dapp/commit/f9617e364f40b577f0a5bd4d9dc2bc2cea9f3168 -- Added failed transaction monitoring: https://github.com/webb-tools/webb-dapp/commit/f9617e364f40b577f0a5bd4d9dc2bc2cea9f3168 -- Added max fee calculation: https://github.com/webb-tools/webb-dapp/commit/6f3fa726513accda142dac87b03e2a06e7d094c3 +- Relayer filter by environment +- Relayer fee and refund support +- Added liquidity check on withdrawal +- Added failed transaction monitoring +- Added max fee calculation ### Changed -- Updated confirmation cards UI: https://github.com/webb-tools/webb-dapp/commit/094b85dbc469f1c8b2250e8030b9b02dcb30d9b1 +- Updated confirmation cards UI ### Fixed -- Fixed balance calculation: https://github.com/webb-tools/webb-dapp/commit/dece224d7fa739a7b9a02ee3397c9591330e9e9b +- Fixed balance calculation ## [0.0.3] - 2023-04-25 From 9d9b47425815b39879330f63a58990f781fc9a9a Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Tue, 3 Sep 2024 19:45:16 +0700 Subject: [PATCH 34/51] fix(tangle-dapp): Incoporate base on feedback --- .../blueprints/[name]/VaultAssetsTable.tsx | 12 +--- .../app/blueprints/[name]/useVaultAssets.tsx | 15 +++-- .../app/restake/OperatorsTable.tsx | 6 +- apps/tangle-dapp/app/restake/TableTabs.tsx | 21 ++---- .../components/tables/Operators/index.tsx | 31 +++++---- .../components/tables/Operators/types.ts | 4 +- .../components/tables/VaultAssets/index.tsx | 7 +- .../components/tables/VaultAssets/types.ts | 5 +- .../components/tables/Vaults/index.tsx | 2 +- .../components/tables/Vaults/types.ts | 2 +- .../data/restake/useRestakeAssetMap.ts | 5 +- .../data/restake/useRestakeOperatorMap.ts | 67 +++++++++---------- .../tangle-dapp/data/restake/useRestakeTVL.ts | 45 ++++++++----- .../data/tokenPrice/fetchers/coinbase.ts | 37 +++++----- .../data/tokenPrice/fetchers/coincap.ts | 51 +++++++------- apps/tangle-dapp/data/tokenPrice/index.ts | 24 ++++--- apps/tangle-dapp/data/tokenPrice/types.ts | 2 +- apps/tangle-dapp/types/restake.ts | 2 +- apps/tangle-dapp/utils/getTVLToDisplay.ts | 6 +- 19 files changed, 184 insertions(+), 160 deletions(-) diff --git a/apps/tangle-dapp/app/blueprints/[name]/VaultAssetsTable.tsx b/apps/tangle-dapp/app/blueprints/[name]/VaultAssetsTable.tsx index 257bfa4ff..10a39d594 100644 --- a/apps/tangle-dapp/app/blueprints/[name]/VaultAssetsTable.tsx +++ b/apps/tangle-dapp/app/blueprints/[name]/VaultAssetsTable.tsx @@ -16,17 +16,7 @@ const VaultAssetsTable: FC = ({ }) => { const data = useVaultAssets(LSTTokenIcon); - return ( - ({ - id: d.id, - selfStake: d.myStake, - symbol: d.symbol, - tvl: d.tvl, - }))} - /> - ); + return ; }; export default VaultAssetsTable; diff --git a/apps/tangle-dapp/app/blueprints/[name]/useVaultAssets.tsx b/apps/tangle-dapp/app/blueprints/[name]/useVaultAssets.tsx index 9ba7a53ac..4d411d0cb 100644 --- a/apps/tangle-dapp/app/blueprints/[name]/useVaultAssets.tsx +++ b/apps/tangle-dapp/app/blueprints/[name]/useVaultAssets.tsx @@ -5,32 +5,37 @@ export default function useVaultAssets(_: string) { { id: '31234', symbol: 'tgDOT_A', + decimals: 18, tvl: 5588.23, - myStake: 10.12, + selfStake: BigInt('1012000000000000000000'), }, { id: '31235', symbol: 'tgDOT_B', + decimals: 18, tvl: 2044.12, - myStake: 0, + selfStake: BigInt(0), }, { id: '31236', symbol: 'tgDOT_C', + decimals: 18, tvl: 123.12, - myStake: 16, + selfStake: BigInt('16000000000000000000'), }, { id: '31237', symbol: 'tgDOT_D', + decimals: 18, tvl: 6938.87, - myStake: 100, + selfStake: BigInt('100000000000000000000'), }, { id: '31238', symbol: 'tgDOT_E', + decimals: 18, tvl: 0, - myStake: 0, + selfStake: BigInt(0), }, ]; } diff --git a/apps/tangle-dapp/app/restake/OperatorsTable.tsx b/apps/tangle-dapp/app/restake/OperatorsTable.tsx index d15330687..8a06c18b6 100644 --- a/apps/tangle-dapp/app/restake/OperatorsTable.tsx +++ b/apps/tangle-dapp/app/restake/OperatorsTable.tsx @@ -15,7 +15,7 @@ type OperatorUI = NonNullable< >[number]; type Props = { - operatorConcentration?: Record; + operatorConcentration?: Record; operatorMap: OperatorMap; operatorTVL?: Record; }; @@ -49,9 +49,9 @@ const OperatorsTable: FC = ({ return restakerSet; }, new Set()); - const tvlInUsd = operatorTVL?.[address] ?? Number.NaN; + const tvlInUsd = operatorTVL?.[address] ?? null; const concentrationPercentage = - operatorConcentration?.[address] ?? Number.NaN; + operatorConcentration?.[address] ?? null; return { address, diff --git a/apps/tangle-dapp/app/restake/TableTabs.tsx b/apps/tangle-dapp/app/restake/TableTabs.tsx index 517667759..9b7597edb 100644 --- a/apps/tangle-dapp/app/restake/TableTabs.tsx +++ b/apps/tangle-dapp/app/restake/TableTabs.tsx @@ -1,9 +1,9 @@ 'use client'; +import { ZERO_BIG_INT } from '@webb-tools/dapp-config/constants'; import { TableAndChartTabs } from '@webb-tools/webb-ui-components/components/TableAndChartTabs'; import { TabContent } from '@webb-tools/webb-ui-components/components/Tabs/TabContent'; import { type ComponentProps, type FC, useMemo } from 'react'; -import { formatUnits } from 'viem'; import VaultAssetsTable from '../../components/tables/VaultAssets'; import VaultsTable from '../../components/tables/Vaults'; @@ -25,7 +25,7 @@ type VaultAssetUI = NonNullable< type Props = { delegatorInfo: DelegatorInfo | null; delegatorTVL?: Record; - operatorConcentration?: Record; + operatorConcentration?: Record; operatorMap: OperatorMap; operatorTVL?: Record; vaultTVL?: Record; @@ -52,7 +52,7 @@ const TableTabs: FC = ({ if (vaults[poolId] === undefined) { const apyPercentage = rewardConfig.configs[poolId]?.apy ?? 0; - const tvlInUsd = vaultTVL?.[poolId] ?? Number.NaN; + const tvlInUsd = vaultTVL?.[poolId] ?? null; vaults[poolId] = { id: poolId, @@ -101,22 +101,15 @@ const TableTabs: FC = ({ const vaultAssets = Object.values(assetMap) .filter((asset) => asset.poolId === poolId) .map((asset) => { - const selfStake = (() => { - if (delegatorTotalRestakedAssets[asset.id] === undefined) { - return 0; - } + const selfStake = + delegatorTotalRestakedAssets[asset.id] ?? ZERO_BIG_INT; - return +formatUnits( - delegatorTotalRestakedAssets[asset.id], - asset.decimals, - ); - })(); - - const tvl = delegatorTVL?.[asset.id] ?? Number.NaN; + const tvl = delegatorTVL?.[asset.id] ?? null; return { id: asset.id, symbol: asset.symbol, + decimals: asset.decimals, tvl, selfStake, } satisfies VaultAssetUI; diff --git a/apps/tangle-dapp/components/tables/Operators/index.tsx b/apps/tangle-dapp/components/tables/Operators/index.tsx index 20158cf7d..56c35779a 100644 --- a/apps/tangle-dapp/components/tables/Operators/index.tsx +++ b/apps/tangle-dapp/components/tables/Operators/index.tsx @@ -19,6 +19,7 @@ import Link from 'next/link'; import { FC } from 'react'; import { twMerge } from 'tailwind-merge'; +import { EMPTY_VALUE_PLACEHOLDER } from '../../../constants'; import { PagePath, QueryParamKey } from '../../../types'; import getTVLToDisplay from '../../../utils/getTVLToDisplay'; import { getSortAddressOrIdentityFnc } from '../../../utils/table'; @@ -80,19 +81,23 @@ const columns = [ }), columnHelper.accessor('concentrationPercentage', { header: () => 'Concentration', - cell: (props) => ( - - - {Number.isNaN(props.getValue()) - ? '--' - : `${props.getValue().toFixed(2)}%`} - - - ), + cell: (props) => { + const value = props.getValue(); + + return ( + + + {typeof value !== 'number' + ? EMPTY_VALUE_PLACEHOLDER + : `${value.toFixed(2)}%`} + + + ); + }, }), columnHelper.accessor('tvlInUsd', { header: () => 'TVL', diff --git a/apps/tangle-dapp/components/tables/Operators/types.ts b/apps/tangle-dapp/components/tables/Operators/types.ts index 6b70ace78..f5c1d3d64 100644 --- a/apps/tangle-dapp/components/tables/Operators/types.ts +++ b/apps/tangle-dapp/components/tables/Operators/types.ts @@ -13,8 +13,8 @@ export type OperatorData = { address: string; identityName: string; restakersCount: number; - concentrationPercentage: number; - tvlInUsd: number; + concentrationPercentage: number | null; + tvlInUsd: number | null; vaultTokens: VaultToken[]; }; diff --git a/apps/tangle-dapp/components/tables/VaultAssets/index.tsx b/apps/tangle-dapp/components/tables/VaultAssets/index.tsx index 71a2b004d..d21a19b1a 100644 --- a/apps/tangle-dapp/components/tables/VaultAssets/index.tsx +++ b/apps/tangle-dapp/components/tables/VaultAssets/index.tsx @@ -6,10 +6,10 @@ import { useReactTable, } from '@tanstack/react-table'; import { Table } from '@webb-tools/webb-ui-components/components/Table'; -import { getRoundedAmountString } from '@webb-tools/webb-ui-components/utils/getRoundedAmountString'; import { FC, useMemo } from 'react'; import { twMerge } from 'tailwind-merge'; +import formatTangleBalance from '../../../utils/formatTangleBalance'; import getTVLToDisplay from '../../../utils/getTVLToDisplay'; import type { Props, VaultAssetData } from './types'; @@ -30,7 +30,10 @@ const columns = [ }), columnHelper.accessor('selfStake', { header: () => 'My Stake', - cell: (props) => getRoundedAmountString(props.getValue()), + cell: (props) => + formatTangleBalance(props.getValue(), undefined, { + decimals: props.row.original.decimals, + }), }), ]; diff --git a/apps/tangle-dapp/components/tables/VaultAssets/types.ts b/apps/tangle-dapp/components/tables/VaultAssets/types.ts index 603690776..e8725a5a1 100644 --- a/apps/tangle-dapp/components/tables/VaultAssets/types.ts +++ b/apps/tangle-dapp/components/tables/VaultAssets/types.ts @@ -1,8 +1,9 @@ export type VaultAssetData = { id: string; symbol: string; - tvl: number; - selfStake: number; + decimals: number; + tvl: number | null; + selfStake: bigint; }; export type Props = { diff --git a/apps/tangle-dapp/components/tables/Vaults/index.tsx b/apps/tangle-dapp/components/tables/Vaults/index.tsx index d744f4db8..478ff0788 100644 --- a/apps/tangle-dapp/components/tables/Vaults/index.tsx +++ b/apps/tangle-dapp/components/tables/Vaults/index.tsx @@ -110,7 +110,7 @@ const columns = [ row.getIsExpanded() ? 'rotate-180' : '', )} > - + diff --git a/apps/tangle-dapp/components/tables/Vaults/types.ts b/apps/tangle-dapp/components/tables/Vaults/types.ts index f85386aab..8c5014ade 100644 --- a/apps/tangle-dapp/components/tables/Vaults/types.ts +++ b/apps/tangle-dapp/components/tables/Vaults/types.ts @@ -8,7 +8,7 @@ export type VaultData = { name: string; apyPercentage: number; tokensCount: number; - tvlInUsd: number; + tvlInUsd: number | null; representToken: string; }; diff --git a/apps/tangle-dapp/data/restake/useRestakeAssetMap.ts b/apps/tangle-dapp/data/restake/useRestakeAssetMap.ts index cc98c8d2d..bf576ccd5 100644 --- a/apps/tangle-dapp/data/restake/useRestakeAssetMap.ts +++ b/apps/tangle-dapp/data/restake/useRestakeAssetMap.ts @@ -163,7 +163,8 @@ const mapAssetDetails = async ( decimals: metadata.decimals.toNumber(), status: detail.status.type, poolId: u128ToPoolId(poolId), - priceInUsd: tokenPrices[idx], + priceInUsd: + typeof tokenPrices[idx] === 'number' ? tokenPrices[idx] : null, }, } satisfies AssetMap); }, initialAssetMap); @@ -194,6 +195,6 @@ const getNativeAsset = async ( id: assetId, status: 'Live', poolId: u128ToPoolId(poolId), - priceInUsd, + priceInUsd: typeof priceInUsd === 'number' ? priceInUsd : null, } satisfies AssetMetadata; }; diff --git a/apps/tangle-dapp/data/restake/useRestakeOperatorMap.ts b/apps/tangle-dapp/data/restake/useRestakeOperatorMap.ts index eb167be17..a3104648b 100644 --- a/apps/tangle-dapp/data/restake/useRestakeOperatorMap.ts +++ b/apps/tangle-dapp/data/restake/useRestakeOperatorMap.ts @@ -35,41 +35,38 @@ interface PalletMultiAssetDelegationOperatorOperatorMetadata extends Struct { export default function useRestakeOperatorMap(): UseRestakeOperatorMapReturnType { const { apiRx } = usePolkadotApi(); - const operatorMap$ = useMemo( - () => - isDefined(apiRx.query?.multiAssetDelegation?.operators?.entries) - ? apiRx.query.multiAssetDelegation.operators - .entries< - Option - >() - .pipe( - map((entries) => { - return entries.reduce( - (operatorsMap, [accountStorage, operatorMetadata]) => { - if (operatorMetadata.isNone) return operatorsMap; - - const accountId = accountStorage.args[0]; - const operator = operatorMetadata.unwrap(); - - const operatorMetadataPrimitive = { - stake: operator.stake.toBigInt(), - delegationCount: operator.delegationCount.toNumber(), - bondLessRequest: toPrimitiveRequest(operator.request), - delegations: toPrimitiveDelegations(operator.delegations), - status: toPrimitiveStatus(operator.status), - } satisfies OperatorMetadata; - - return Object.assign(operatorsMap, { - [accountId.toString()]: operatorMetadataPrimitive, - } satisfies OperatorMap); - }, - {} as OperatorMap, - ); - }), - ) - : of({}), - [apiRx.query.multiAssetDelegation?.operators], - ); + const operatorMap$ = useMemo(() => { + if (!isDefined(apiRx.query?.multiAssetDelegation?.operators?.entries)) + return of({}); + + return apiRx.query.multiAssetDelegation.operators + .entries>() + .pipe( + map((entries) => { + return entries.reduce( + (operatorsMap, [accountStorage, operatorMetadata]) => { + if (operatorMetadata.isNone) return operatorsMap; + + const accountId = accountStorage.args[0]; + const operator = operatorMetadata.unwrap(); + + const operatorMetadataPrimitive = { + stake: operator.stake.toBigInt(), + delegationCount: operator.delegationCount.toNumber(), + bondLessRequest: toPrimitiveRequest(operator.request), + delegations: toPrimitiveDelegations(operator.delegations), + status: toPrimitiveStatus(operator.status), + } satisfies OperatorMetadata; + + return Object.assign(operatorsMap, { + [accountId.toString()]: operatorMetadataPrimitive, + } satisfies OperatorMap); + }, + {} as OperatorMap, + ); + }), + ); + }, [apiRx.query.multiAssetDelegation?.operators]); const operatorMap = useObservableState(operatorMap$, {}); diff --git a/apps/tangle-dapp/data/restake/useRestakeTVL.ts b/apps/tangle-dapp/data/restake/useRestakeTVL.ts index cd6bda2f2..29c21507b 100644 --- a/apps/tangle-dapp/data/restake/useRestakeTVL.ts +++ b/apps/tangle-dapp/data/restake/useRestakeTVL.ts @@ -1,9 +1,9 @@ import { useObservable, useObservableState } from 'observable-hooks'; import { of, switchMap } from 'rxjs'; -import { formatUnits } from 'viem'; import { useRestakeContext } from '../../context/RestakeContext'; import type { DelegatorInfo, OperatorMap } from '../../types/restake'; +import safeFormatUnits from '../../utils/safeFormatUnits'; export default function useRestakeTVL( operatorMap: OperatorMap, @@ -20,16 +20,23 @@ export default function useRestakeTVL( const operatorTVL = operatorData.delegations.reduce( (sum, delegation) => { const asset = assetMap[delegation.assetId]; - const assetPrice = asset?.priceInUsd || Number.NaN; + const assetPrice = asset?.priceInUsd ?? null; - if (Number.isNaN(assetPrice)) { + if (typeof assetPrice !== 'number') { return sum; } - const formattedAmount = Number( - formatUnits(delegation.amount, asset.decimals), + const result = safeFormatUnits( + delegation.amount, + asset.decimals, ); + if (!result.sucess) { + return sum; + } + + const formattedAmount = Number(result.value); + // Calculate operator TVL sum += formattedAmount * assetPrice; @@ -64,29 +71,37 @@ export default function useRestakeTVL( acc[operatorId] = totalNetworkTVL > 0 ? (operatorTVL / totalNetworkTVL) * 100 - : Number.NaN; + : null; return acc; }, - {} as Record, + {} as Record, ); const delegatorTVL = delegatorInfo?.delegations.reduce( (acc, delegation) => { - const assetPrice = - assetMap[delegation.assetId]?.priceInUsd || Number.NaN; + const assetData = assetMap[delegation.assetId]; + if (assetData === undefined) { + return acc; + } - if (Number.isNaN(assetPrice)) { + const assetPrice = assetData.priceInUsd ?? null; + + if (typeof assetPrice !== 'number') { return acc; } - const formattedAmount = Number( - formatUnits( - delegation.amountBonded, - assetMap[delegation.assetId].decimals, - ), + const result = safeFormatUnits( + delegation.amountBonded, + assetData.decimals, ); + if (!result.sucess) { + return acc; + } + + const formattedAmount = Number(result.value); + acc[delegation.assetId] = (acc[delegation.assetId] || 0) + formattedAmount * assetPrice; diff --git a/apps/tangle-dapp/data/tokenPrice/fetchers/coinbase.ts b/apps/tangle-dapp/data/tokenPrice/fetchers/coinbase.ts index a907cc3a8..45cdc3145 100644 --- a/apps/tangle-dapp/data/tokenPrice/fetchers/coinbase.ts +++ b/apps/tangle-dapp/data/tokenPrice/fetchers/coinbase.ts @@ -1,6 +1,7 @@ import axios from 'axios'; import z from 'zod'; +import ensureError from '../../../utils/ensureError'; import type { TokenPriceFetcher } from '../types'; export const coinbaseTokenPriceFetcher = { @@ -8,25 +9,29 @@ export const coinbaseTokenPriceFetcher = { isBatchSupported: false, - async fetchTokenPrice(token: string): Promise { - const response = await axios.get(this.endpoint, { - params: { - currency: token, - }, - }); + async fetchTokenPrice(token: string): Promise { + try { + const response = await axios.get(this.endpoint, { + params: { + currency: token, + }, + }); - const Schema = z.object({ - data: z.object({ - rates: z.object({ - USD: z.string(), + const Schema = z.object({ + data: z.object({ + rates: z.object({ + USD: z.string(), + }), }), - }), - }); + }); - const result = Schema.safeParse(response.data); - if (result.success === false) - throw new Error('Invalid response from coinbase'); + const result = Schema.safeParse(response.data); + if (result.success === false) + throw new Error('Invalid response from coinbase'); - return Number(result.data.data.rates.USD); + return Number(result.data.data.rates.USD); + } catch (error) { + return ensureError(error); + } }, } as const satisfies TokenPriceFetcher; diff --git a/apps/tangle-dapp/data/tokenPrice/fetchers/coincap.ts b/apps/tangle-dapp/data/tokenPrice/fetchers/coincap.ts index e72373f2c..eb54c18e4 100644 --- a/apps/tangle-dapp/data/tokenPrice/fetchers/coincap.ts +++ b/apps/tangle-dapp/data/tokenPrice/fetchers/coincap.ts @@ -1,6 +1,7 @@ import axios from 'axios'; import z from 'zod'; +import ensureError from '../../../utils/ensureError'; import type { TokenPriceFetcher } from '../types'; export const coincapTokenPriceFetcher = { @@ -8,28 +9,32 @@ export const coincapTokenPriceFetcher = { isBatchSupported: false, - async fetchTokenPrice(token: string): Promise { - const response = await axios.get(this.endpoint, { - params: { - search: token, - }, - }); - - const Schema = z.object({ - data: z.array( - z.object({ - priceUsd: z.string(), - }), - ), - }); - - const result = Schema.safeParse(response.data); - if (result.success === false) - throw new Error('Invalid response from coincap'); - - if (result.data.data.length === 0) - throw new Error('Token not found on coincap'); - - return Number(result.data.data[0].priceUsd); + async fetchTokenPrice(token: string): Promise { + try { + const response = await axios.get(this.endpoint, { + params: { + search: token, + }, + }); + + const Schema = z.object({ + data: z.array( + z.object({ + priceUsd: z.string(), + }), + ), + }); + + const result = Schema.safeParse(response.data); + if (result.success === false) + throw new Error('Invalid response from coincap'); + + if (result.data.data.length === 0) + throw new Error('Token not found on coincap'); + + return Number(result.data.data[0].priceUsd); + } catch (error) { + return ensureError(error); + } }, } as const satisfies TokenPriceFetcher; diff --git a/apps/tangle-dapp/data/tokenPrice/index.ts b/apps/tangle-dapp/data/tokenPrice/index.ts index 6cec3dbaa..07eb28554 100644 --- a/apps/tangle-dapp/data/tokenPrice/index.ts +++ b/apps/tangle-dapp/data/tokenPrice/index.ts @@ -1,9 +1,9 @@ /** - * Fetches the prices of multiple tokens, return `Number.NaN` + * Fetches the prices of multiple tokens, return `Error` * if failed to fetch the price of that token. * * @param {string[]} tokens - An array of token symbols. - * @returns {Promise} A promise that resolves to an array of token prices. + * @returns {Promise<(number | Error)[]>} A promise that resolves to an array of token prices. * * @example * const tokens = ['ETH', 'BTC', 'USDT']; @@ -12,20 +12,22 @@ * }); * * @remarks - * This function currently returns an array of `Number.NaN` and logs a warning to the console. + * This function currently returns an array of `Error` and logs a warning to the console. * The actual implementation to fetch real token prices needs to be added. */ -export const fetchTokenPrices = async (tokens: string[]): Promise => { +export const fetchTokenPrices = async ( + tokens: string[], +): Promise<(number | Error)[]> => { // TODO: Implement the proper logic to fetch the price of the tokens console.warn('fetchTokenPrices not implemented'); - return tokens.map(() => Number.NaN); + return tokens.map(() => new Error('Token not found')); }; /** - * Fetches the price of a single token, returns `Number.NaN` if failed to fetch the price. + * Fetches the price of a single token, returns `Error` if failed to fetch the price. * * @param {string} _token - The symbol of the token. - * @returns {Promise} A promise that resolves to the token price. + * @returns {Promise} A promise that resolves to the token price. * * @example * const token = 'ETH'; @@ -34,14 +36,14 @@ export const fetchTokenPrices = async (tokens: string[]): Promise => { * }); * * @remarks - * This function currently returns `Number.NaN` and logs a warning to the console. + * This function currently returns `Error` and logs a warning to the console. * The actual implementation to fetch the real token price needs to be added. - * The function will return `Number.NaN` when failed to fetch the price. + * The function will return `Error` when failed to fetch the price. */ export const fetchSingleTokenPrice = async ( _token: string, -): Promise => { +): Promise => { // TODO: Implement the proper logic to fetch the price of the token console.warn('fetchSingleTokenPrice not implemented'); - return Number.NaN; + return new Error('Token not found'); }; diff --git a/apps/tangle-dapp/data/tokenPrice/types.ts b/apps/tangle-dapp/data/tokenPrice/types.ts index bc4f4ec71..bcee5ecd9 100644 --- a/apps/tangle-dapp/data/tokenPrice/types.ts +++ b/apps/tangle-dapp/data/tokenPrice/types.ts @@ -5,5 +5,5 @@ export interface TokenPriceFetcher { fetchTokenPrice( token: TIsBatchSupported extends true ? string[] : string, - ): Promise; + ): Promise<(TIsBatchSupported extends true ? number[] : number) | Error>; } diff --git a/apps/tangle-dapp/types/restake.ts b/apps/tangle-dapp/types/restake.ts index 34153f4f4..e646d7bfa 100644 --- a/apps/tangle-dapp/types/restake.ts +++ b/apps/tangle-dapp/types/restake.ts @@ -97,7 +97,7 @@ export type AssetMetadata = { readonly poolId: string | null; - readonly priceInUsd: number; + readonly priceInUsd: number | null; }; /** diff --git a/apps/tangle-dapp/utils/getTVLToDisplay.ts b/apps/tangle-dapp/utils/getTVLToDisplay.ts index 88d4c379a..c786636b0 100644 --- a/apps/tangle-dapp/utils/getTVLToDisplay.ts +++ b/apps/tangle-dapp/utils/getTVLToDisplay.ts @@ -1,7 +1,9 @@ import { getRoundedAmountString } from '@webb-tools/webb-ui-components/utils/getRoundedAmountString'; -export default function getTVLToDisplay(tvl: number) { - if (Number.isNaN(tvl) || tvl === 0) return '--'; +import { EMPTY_VALUE_PLACEHOLDER } from '../constants'; + +export default function getTVLToDisplay(tvl: number | null) { + if (tvl === null || tvl === 0) return EMPTY_VALUE_PLACEHOLDER; return `$${getRoundedAmountString(tvl)}`; } From 597361cbcaefc4fafc68031fdfe7d30c59c36474 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Wed, 4 Sep 2024 15:21:24 +0700 Subject: [PATCH 35/51] chore: Remove shortenFn from KeyValueWithButton component --- .../src/components/NoteAccountAvatarWithKey.tsx | 2 -- .../SpendNotesTableContainer.tsx | 2 -- apps/tangle-dapp/app/restake/OperatorList.tsx | 7 +------ .../RestakeDetailCard/RestakeOperatorDetailCard.tsx | 6 +----- .../components/WalletDropdown/WalletDropdown.tsx | 2 +- .../KeyValueWithButton/KeyValueWithButton.tsx | 13 ++++++------- .../src/components/KeyValueWithButton/types.ts | 8 -------- 7 files changed, 9 insertions(+), 31 deletions(-) diff --git a/apps/bridge-dapp/src/components/NoteAccountAvatarWithKey.tsx b/apps/bridge-dapp/src/components/NoteAccountAvatarWithKey.tsx index 8c32e8098..38507aafd 100644 --- a/apps/bridge-dapp/src/components/NoteAccountAvatarWithKey.tsx +++ b/apps/bridge-dapp/src/components/NoteAccountAvatarWithKey.tsx @@ -4,7 +4,6 @@ import { IconWithTooltip } from '@webb-tools/webb-ui-components/components/IconW import { KeyValueWithButton } from '@webb-tools/webb-ui-components/components/KeyValueWithButton'; import { useCopyable } from '@webb-tools/webb-ui-components/hooks/useCopyable'; import type { PropsOf } from '@webb-tools/webb-ui-components/types'; -import { shortenString } from '@webb-tools/webb-ui-components/utils/shortenString'; import type { ComponentProps, ElementRef } from 'react'; import { forwardRef } from 'react'; import { twMerge } from 'tailwind-merge'; @@ -55,7 +54,6 @@ const NoteAccountAvatarWithKey = forwardRef< .join('') : keyValue } - shortenFn={isHiddenValue ? shortenString : undefined} isDisabledTooltip={isHiddenValue} copyProps={isHiddenValue ? copyableResult : undefined} onCopyButtonClick={ diff --git a/apps/bridge-dapp/src/containers/note-account-tables/SpendNotesTableContainer/SpendNotesTableContainer.tsx b/apps/bridge-dapp/src/containers/note-account-tables/SpendNotesTableContainer/SpendNotesTableContainer.tsx index e58d7678b..1697efdc8 100644 --- a/apps/bridge-dapp/src/containers/note-account-tables/SpendNotesTableContainer/SpendNotesTableContainer.tsx +++ b/apps/bridge-dapp/src/containers/note-account-tables/SpendNotesTableContainer/SpendNotesTableContainer.tsx @@ -22,7 +22,6 @@ import { formatTokenAmount, fuzzyFilter, numberToString, - shortenString, } from '@webb-tools/webb-ui-components'; import { FC, useMemo } from 'react'; @@ -121,7 +120,6 @@ const staticColumns = [ cell: (props) => (
shortenString(note, 4)} isHiddenLabel size="sm" keyValue={props.getValue()} diff --git a/apps/tangle-dapp/app/restake/OperatorList.tsx b/apps/tangle-dapp/app/restake/OperatorList.tsx index f5527d017..d4ddfe89e 100644 --- a/apps/tangle-dapp/app/restake/OperatorList.tsx +++ b/apps/tangle-dapp/app/restake/OperatorList.tsx @@ -9,7 +9,6 @@ import { ListCardWrapper } from '@webb-tools/webb-ui-components/components/ListC import { ListItem } from '@webb-tools/webb-ui-components/components/ListCard/ListItem'; import { ScrollArea } from '@webb-tools/webb-ui-components/components/ScrollArea'; import { Typography } from '@webb-tools/webb-ui-components/typography/Typography'; -import { shortenString } from '@webb-tools/webb-ui-components/utils/shortenString'; import isFunction from 'lodash/isFunction'; import keys from 'lodash/keys'; import omitBy from 'lodash/omitBy'; @@ -110,11 +109,7 @@ const OperatorList = forwardRef( operatorIdentities?.[current]?.name || '' } description={ - + } /> diff --git a/apps/tangle-dapp/components/RestakeDetailCard/RestakeOperatorDetailCard.tsx b/apps/tangle-dapp/components/RestakeDetailCard/RestakeOperatorDetailCard.tsx index 0bb2fd1b4..71dcdad0c 100644 --- a/apps/tangle-dapp/components/RestakeDetailCard/RestakeOperatorDetailCard.tsx +++ b/apps/tangle-dapp/components/RestakeDetailCard/RestakeOperatorDetailCard.tsx @@ -49,11 +49,7 @@ const RestakeOperatorDetailCard = ({ } title={identityName || shortenString(operatorAccountId ?? '')} description={ - + } descExternalLink={validatorExternalLink} /> diff --git a/apps/tangle-dapp/components/WalletDropdown/WalletDropdown.tsx b/apps/tangle-dapp/components/WalletDropdown/WalletDropdown.tsx index 4041e8117..1df957c89 100644 --- a/apps/tangle-dapp/components/WalletDropdown/WalletDropdown.tsx +++ b/apps/tangle-dapp/components/WalletDropdown/WalletDropdown.tsx @@ -96,7 +96,7 @@ export const WalletDropdown: FC<{ size="sm" labelVariant="body1" valueVariant="body1" - shortenFn={(str) => shortenString(str, 5)} + displayCharCount={5} /> {accountExplorerUrl && ( diff --git a/libs/webb-ui-components/src/components/KeyValueWithButton/KeyValueWithButton.tsx b/libs/webb-ui-components/src/components/KeyValueWithButton/KeyValueWithButton.tsx index 4c09c1de6..0f9db791a 100644 --- a/libs/webb-ui-components/src/components/KeyValueWithButton/KeyValueWithButton.tsx +++ b/libs/webb-ui-components/src/components/KeyValueWithButton/KeyValueWithButton.tsx @@ -1,3 +1,5 @@ +'use client'; + import { FileCopyLine } from '@webb-tools/icons'; import cx from 'classnames'; import { @@ -40,7 +42,6 @@ export const KeyValueWithButton = forwardRef< valueFontWeight, valueVariant, label = '', - shortenFn, isDisabledTooltip, onCopyButtonClick, displayCharCount = 5, @@ -82,13 +83,11 @@ export const KeyValueWithButton = forwardRef< const value = useMemo( () => hasShortenValue - ? shortenFn - ? shortenFn(keyValue) - : isHex(keyValue) - ? shortenHex(keyValue, displayCharCount) - : shortenString(keyValue, displayCharCount) + ? isHex(keyValue) + ? shortenHex(keyValue, displayCharCount) + : shortenString(keyValue, displayCharCount) : keyValue, - [displayCharCount, hasShortenValue, keyValue, shortenFn], + [displayCharCount, hasShortenValue, keyValue], ); return ( diff --git a/libs/webb-ui-components/src/components/KeyValueWithButton/types.ts b/libs/webb-ui-components/src/components/KeyValueWithButton/types.ts index 9b22096d0..e92a825b9 100644 --- a/libs/webb-ui-components/src/components/KeyValueWithButton/types.ts +++ b/libs/webb-ui-components/src/components/KeyValueWithButton/types.ts @@ -46,14 +46,6 @@ export interface KeyValueWithButtonProps */ hasShortenValue?: boolean; - /** - * The shorten string function - * @param value represents the value to shorten - * @param chars number of displayed characters - * @returns the shortened string - */ - shortenFn?: (value: string, chars?: number) => string; - /** * If `true`, the tooltip value will be disabled. */ From 4d371cb91c2474e020988a8b0269424b8100b41d Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Wed, 4 Sep 2024 15:23:08 +0700 Subject: [PATCH 36/51] chore: Add ValidatorSocials component for displaying social media links and location --- .../components/ValidatorSocials.tsx | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 apps/tangle-dapp/components/ValidatorSocials.tsx diff --git a/apps/tangle-dapp/components/ValidatorSocials.tsx b/apps/tangle-dapp/components/ValidatorSocials.tsx new file mode 100644 index 000000000..6aab41e1d --- /dev/null +++ b/apps/tangle-dapp/components/ValidatorSocials.tsx @@ -0,0 +1,50 @@ +import MapPinLine from '@webb-tools/icons/MapPinLine'; +import { Chip } from '@webb-tools/webb-ui-components/components/Chip'; +import { SocialChip } from '@webb-tools/webb-ui-components/components/SocialChip'; +import type { ComponentProps, FC } from 'react'; +import { twMerge } from 'tailwind-merge'; + +interface Props extends ComponentProps<'div'> { + email?: string; + githubUrl?: string; + location?: string; + locationPlaceholder?: string; + twitterUrl?: string; + webUrl?: string; +} + +const ValidatorSocials: FC = ({ + email, + githubUrl, + location, + locationPlaceholder = 'Unknown', + twitterUrl, + webUrl, + ...divProps +}) => { + return ( +
+
+ {twitterUrl && } + {githubUrl && } + {email && } + {webUrl && } +
+ + {(location || locationPlaceholder) && ( +
+ + + + {location || locationPlaceholder} + +
+ )} +
+ ); +}; + +export default ValidatorSocials; From 4316a8f63b91486783eefda191c116e7cef3534e Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Wed, 4 Sep 2024 15:24:20 +0700 Subject: [PATCH 37/51] refactor(nomination): Update InfoCard component to use ValidatorSocials --- .../nomination/[validatorAddress]/InfoCard.tsx | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/apps/tangle-dapp/app/nomination/[validatorAddress]/InfoCard.tsx b/apps/tangle-dapp/app/nomination/[validatorAddress]/InfoCard.tsx index 98c6c5f71..194a873b1 100644 --- a/apps/tangle-dapp/app/nomination/[validatorAddress]/InfoCard.tsx +++ b/apps/tangle-dapp/app/nomination/[validatorAddress]/InfoCard.tsx @@ -6,7 +6,6 @@ import { Chip, CopyWithTooltip, ExternalLinkIcon, - SocialChip, Typography, } from '@webb-tools/webb-ui-components'; import { shortenString } from '@webb-tools/webb-ui-components/utils/shortenString'; @@ -14,6 +13,7 @@ import { FC } from 'react'; import { twMerge } from 'tailwind-merge'; import { TangleCard } from '../../../components'; +import ValidatorSocials from '../../../components/ValidatorSocials'; import { EMPTY_VALUE_PLACEHOLDER } from '../../../constants'; import useNetworkStore from '../../../context/useNetworkStore'; import useValidatorInfoCard from '../../../data/validatorDetails/useValidatorInfoCard'; @@ -106,14 +106,13 @@ const InfoCard: FC = ({
{/* Socials & Location */} -
-
- {twitter && } - {email && } - {web && } -
- {/* TODO: get location later */} -
+ ); From 4aa7336bdcd712d988208b1131723b97ea541c32 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Wed, 4 Sep 2024 15:31:03 +0700 Subject: [PATCH 38/51] chore: Update Identicon component to use client-side rendering --- libs/webb-ui-components/src/components/Avatar/Identicon.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libs/webb-ui-components/src/components/Avatar/Identicon.tsx b/libs/webb-ui-components/src/components/Avatar/Identicon.tsx index 0d623591a..dd4cfb2c6 100644 --- a/libs/webb-ui-components/src/components/Avatar/Identicon.tsx +++ b/libs/webb-ui-components/src/components/Avatar/Identicon.tsx @@ -1,3 +1,5 @@ +'use client'; + import dynamic from 'next/dynamic'; export const Identicon = dynamic(() => import('@polkadot/react-identicon'), { From 111ed46bbaac6daf9913f5b095e8e1973ecb69e3 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Thu, 5 Sep 2024 02:02:01 +0700 Subject: [PATCH 39/51] feat: Add OperatorInfoCard for displaying operator information --- .../operators/[address]/OperatorInfoCard.tsx | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 apps/tangle-dapp/app/restake/operators/[address]/OperatorInfoCard.tsx diff --git a/apps/tangle-dapp/app/restake/operators/[address]/OperatorInfoCard.tsx b/apps/tangle-dapp/app/restake/operators/[address]/OperatorInfoCard.tsx new file mode 100644 index 000000000..06dd21c4c --- /dev/null +++ b/apps/tangle-dapp/app/restake/operators/[address]/OperatorInfoCard.tsx @@ -0,0 +1,98 @@ +import { ExternalLinkLine } from '@webb-tools/icons/ExternalLinkLine'; +import { Chip } from '@webb-tools/webb-ui-components/components/Chip'; +import InfoIconWithTooltip from '@webb-tools/webb-ui-components/components/IconWithTooltip/InfoIconWithTooltip'; +import { KeyValueWithButton } from '@webb-tools/webb-ui-components/components/KeyValueWithButton'; +import { Typography } from '@webb-tools/webb-ui-components/typography/Typography'; +import type { ComponentProps, FC, ReactNode } from 'react'; +import { twMerge } from 'tailwind-merge'; + +import GlassCard from '../../../../components/GlassCard/GlassCard'; +import ValidatorSocials from '../../../../components/ValidatorSocials'; +import AvatarWithText from '../../AvatarWithText'; + +interface Props extends Partial> {} + +const OperatorInfoCard: FC = ({ className, ...props }) => { + const isRestaked = true; + const accountAddress = 'tgDeWmUCK6uinvwV6qc2wCHxJboC9RAkYK79xNqeaGgp7Pp6K'; + const totalRestaked = `$0.00`; + const restakerCount = `1`; + + const validatorSocials = { + location: '🌎 Earth', + twitterUrl: 'https://x.com/tangle_network', + webUrl: 'https://tangle.tools', + email: 'hello@webb.tools', + githubUrl: 'https://github.com/webb-tools/tangle', + }; + + return ( + +
+ + + + +
+ } + /> + + {isRestaked && Restaked} + + +
+ + +
+ + +
+ ); +}; + +export default OperatorInfoCard; + +interface StatsItemProps { + label: string; + value: string; + info?: ReactNode; +} + +const StatsItem: FC = ({ label, value, info }) => { + return ( +
+ + {value} + + + + {label} + {info && ( + + )} + +
+ ); +}; From 4bf536f6172b88b40b57bef544f89a675db2b71a Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Thu, 5 Sep 2024 02:02:11 +0700 Subject: [PATCH 40/51] feat: Add RegisteredBlueprintsCard for displaying registered blueprints --- .../[address]/RegisteredBlueprintsCard.tsx | 65 +++++++++++++++++++ .../app/restake/operators/[address]/page.tsx | 18 +++++ 2 files changed, 83 insertions(+) create mode 100644 apps/tangle-dapp/app/restake/operators/[address]/RegisteredBlueprintsCard.tsx create mode 100644 apps/tangle-dapp/app/restake/operators/[address]/page.tsx diff --git a/apps/tangle-dapp/app/restake/operators/[address]/RegisteredBlueprintsCard.tsx b/apps/tangle-dapp/app/restake/operators/[address]/RegisteredBlueprintsCard.tsx new file mode 100644 index 000000000..533513ceb --- /dev/null +++ b/apps/tangle-dapp/app/restake/operators/[address]/RegisteredBlueprintsCard.tsx @@ -0,0 +1,65 @@ +import { Avatar } from '@webb-tools/webb-ui-components/components/Avatar'; +import { ScrollArea } from '@webb-tools/webb-ui-components/components/ScrollArea'; +import { Typography } from '@webb-tools/webb-ui-components/typography/Typography'; +import type { ComponentProps, FC } from 'react'; +import { twMerge } from 'tailwind-merge'; + +import GlassCard from '../../../../components/GlassCard/GlassCard'; + +interface Props extends Partial> {} + +const blueprints = [ + { + id: '1', + name: 'DKLS', + avatarUrl: 'https://avatars.githubusercontent.com/u/76852793?s=96&v=4', + githubUrl: 'https://github.com/webb-tools/tangle', + }, + { + id: '2', + name: 'DFNS CGGMP21', + avatarUrl: + 'https://pbs.twimg.com/profile_images/1746972470840836096/Xzg3jx6V_400x400.png', + githubUrl: 'https://github.com/webb-tools/tangle', + }, +]; + +const RegisteredBlueprintsCard: FC = ({ className, ...props }) => { + const isEmpty = true; + + return ( + + + Registered Blueprints + + +
+ {isEmpty ? ( + + This Operator has not registered any Blueprints. + + ) : ( + +
    + {blueprints.map(({ id, avatarUrl }) => { + return ( +
  • +

    + +

    +
  • + ); + })} +
+
+ )} +
+
+ ); +}; + +export default RegisteredBlueprintsCard; diff --git a/apps/tangle-dapp/app/restake/operators/[address]/page.tsx b/apps/tangle-dapp/app/restake/operators/[address]/page.tsx new file mode 100644 index 000000000..ede8c63c7 --- /dev/null +++ b/apps/tangle-dapp/app/restake/operators/[address]/page.tsx @@ -0,0 +1,18 @@ +import OperatorInfoCard from './OperatorInfoCard'; +import RegisteredBlueprintsCard from './RegisteredBlueprintsCard'; + +export const dynamic = 'force-static'; + +const page = ({ params: { address } }: { params: { address: string } }) => { + return ( +
+
+ + + +
+
+ ); +}; + +export default page; From 72e0e43b8b013ffe7150e8beaaefe95f1c72ad39 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Thu, 5 Sep 2024 17:35:03 +0700 Subject: [PATCH 41/51] style(webb-ui): Update ScrollArea component styles --- .../src/components/ScrollArea/ScrollArea.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/webb-ui-components/src/components/ScrollArea/ScrollArea.tsx b/libs/webb-ui-components/src/components/ScrollArea/ScrollArea.tsx index 027933276..edc9048f9 100644 --- a/libs/webb-ui-components/src/components/ScrollArea/ScrollArea.tsx +++ b/libs/webb-ui-components/src/components/ScrollArea/ScrollArea.tsx @@ -39,9 +39,9 @@ const Scrollbar = forwardRef< {...props} className={twMerge( cx( - 'flex select-none touch-none p-[2px]', + 'flex select-none touch-none p-0.5 w-2.5', 'bg-transparent', - 'radix-orientation-vertical:w-[10px] radix-orientation-horizontal:flex-col radix-orientation-horizontal:h-[10px]', + 'data-[orientation=vertical]:w-2.5 data-[orientation=horizontal]:flex-col data-[orientation=horizontal]:h-2.5', ), className, )} @@ -60,8 +60,8 @@ const Thumb: FC = forwardRef< className={twMerge( cx( 'flex-1 bg-mono-60 dark:bg-mono-120 rounded-full', - 'relative before:content-["\'\'"] before:absolute before:top-1/2 before:left-1/2 before:-translate-x-1/2 before:-translate-y-1/2', - 'before:w-full before:h-full before:min-w-[44px] before:min-h-[44px]', + 'relative before:content-[""] before:absolute before:top-1/2 before:left-1/2 before:-translate-x-1/2 before:-translate-y-1/2', + 'before:w-full before:h-full', ), className, )} From 2790b00d3d29b90cbdf6ff298029fd953c6d9958 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Mon, 9 Sep 2024 03:58:18 +0700 Subject: [PATCH 42/51] feat(tangle-dapp): Display detail info for registered blueprints --- .../[address]/RegisteredBlueprintsCard.tsx | 94 ++++++++++++++++--- 1 file changed, 79 insertions(+), 15 deletions(-) diff --git a/apps/tangle-dapp/app/restake/operators/[address]/RegisteredBlueprintsCard.tsx b/apps/tangle-dapp/app/restake/operators/[address]/RegisteredBlueprintsCard.tsx index 533513ceb..4b138f8b0 100644 --- a/apps/tangle-dapp/app/restake/operators/[address]/RegisteredBlueprintsCard.tsx +++ b/apps/tangle-dapp/app/restake/operators/[address]/RegisteredBlueprintsCard.tsx @@ -1,10 +1,16 @@ +'use client'; + +import { ExternalLinkLine, GithubFill } from '@webb-tools/icons'; import { Avatar } from '@webb-tools/webb-ui-components/components/Avatar'; import { ScrollArea } from '@webb-tools/webb-ui-components/components/ScrollArea'; +import type { EventFor } from '@webb-tools/webb-ui-components/types'; import { Typography } from '@webb-tools/webb-ui-components/typography/Typography'; +import Link from 'next/link'; import type { ComponentProps, FC } from 'react'; import { twMerge } from 'tailwind-merge'; import GlassCard from '../../../../components/GlassCard/GlassCard'; +import { PagePath } from '../../../../types'; interface Props extends Partial> {} @@ -22,18 +28,44 @@ const blueprints = [ 'https://pbs.twimg.com/profile_images/1746972470840836096/Xzg3jx6V_400x400.png', githubUrl: 'https://github.com/webb-tools/tangle', }, + { + id: '3', + name: 'LIT Protocol fork of ZCash Frost', + avatarUrl: + 'https://pbs.twimg.com/profile_images/1746972470840836096/Xzg3jx6V_400x400.png', + githubUrl: 'https://github.com/webb-tools/tangle', + }, + { + id: '4', + name: 'DFNS', + avatarUrl: + 'https://pbs.twimg.com/profile_images/1746972470840836096/Xzg3jx6V_400x400.png', + }, ]; +// Use `twMerge` here for intellisense +const bgDarkClassName = twMerge( + 'dark:[background:_linear-gradient(180deg,_rgba(12,_10,_56,_0.20)_0%,_rgba(30,_25,_138,_0.20)_100%),_linear-gradient(180deg,_rgba(43,_47,_64,_0.70)_0%,_rgba(43,_47,_64,_0.42)_100%)]', + 'dark:[background-blend-mode:_normal,_plus-lighter,_normal]', +); + +const bgClassName = twMerge( + '[background:_linear-gradient(180deg,_rgba(236,_239,_255,_0.20)_0%,_rgba(129,_149,_246,_0.20)_100%),_linear-gradient(180deg,_rgba(255,_255,_255,_0.70)_0%,_rgba(255,_255,_255,_0.00)_100%)]', +); + const RegisteredBlueprintsCard: FC = ({ className, ...props }) => { - const isEmpty = true; + const isEmpty = false; return ( - + Registered Blueprints -
+ {isEmpty ? ( = ({ className, ...props }) => { This Operator has not registered any Blueprints. ) : ( - -
    - {blueprints.map(({ id, avatarUrl }) => { - return ( -
  • -

    +

      + {blueprints.map(({ id, avatarUrl, name, githubUrl }) => { + return ( +
    • + +

      + + + {name} + + +

      -
    • - ); - })} -
    - + + {githubUrl && ( + + + + )} + +
  • + ); + })} +
)} -
+
); }; export default RegisteredBlueprintsCard; + +const handleLinkClick = (event: EventFor<'a', 'onClick'>) => { + event.stopPropagation(); +}; From e8b3f7023ff1548391d827a7f006a2b500cb96dc Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Mon, 9 Sep 2024 03:58:36 +0700 Subject: [PATCH 43/51] feat(tangle-dapp): Add TVL table for operator --- .../app/restake/operators/[address]/page.tsx | 25 +++++++++++++++++-- .../components/tables/Vaults/index.tsx | 4 +-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/apps/tangle-dapp/app/restake/operators/[address]/page.tsx b/apps/tangle-dapp/app/restake/operators/[address]/page.tsx index ede8c63c7..7d1249309 100644 --- a/apps/tangle-dapp/app/restake/operators/[address]/page.tsx +++ b/apps/tangle-dapp/app/restake/operators/[address]/page.tsx @@ -1,3 +1,6 @@ +import { Typography } from '@webb-tools/webb-ui-components/typography/Typography'; + +import VaultsTable from '../../../../components/tables/Vaults'; import OperatorInfoCard from './OperatorInfoCard'; import RegisteredBlueprintsCard from './RegisteredBlueprintsCard'; @@ -5,12 +8,30 @@ export const dynamic = 'force-static'; const page = ({ params: { address } }: { params: { address: string } }) => { return ( -
-
+
+
+ +
+ + Total Value Locked + + + +
); }; diff --git a/apps/tangle-dapp/components/tables/Vaults/index.tsx b/apps/tangle-dapp/components/tables/Vaults/index.tsx index 3428357ed..8505deedb 100644 --- a/apps/tangle-dapp/components/tables/Vaults/index.tsx +++ b/apps/tangle-dapp/components/tables/Vaults/index.tsx @@ -164,8 +164,8 @@ const VaultsTable: FC = ({ if (isLoading) { return ( Date: Mon, 9 Sep 2024 04:33:31 +0700 Subject: [PATCH 44/51] feat(tangle-dapp): Integrate API for operator info card --- .../app/restake/OperatorsTable.tsx | 9 +- .../operators/[address]/OperatorInfoCard.tsx | 111 +++++++++++++++--- .../app/restake/operators/[address]/page.tsx | 2 +- .../data/restake/useRestakeOperatorMap.ts | 33 ++++-- apps/tangle-dapp/types/restake.ts | 1 + apps/tangle-dapp/utils/getTVLToDisplay.ts | 5 +- 6 files changed, 126 insertions(+), 35 deletions(-) diff --git a/apps/tangle-dapp/app/restake/OperatorsTable.tsx b/apps/tangle-dapp/app/restake/OperatorsTable.tsx index 8a06c18b6..ada7da4f3 100644 --- a/apps/tangle-dapp/app/restake/OperatorsTable.tsx +++ b/apps/tangle-dapp/app/restake/OperatorsTable.tsx @@ -36,7 +36,7 @@ const OperatorsTable: FC = ({ const operators = useMemo( () => Object.entries(operatorMap).map( - ([address, { delegations }]) => { + ([address, { delegations, restakersCount }]) => { const vaultAssets = delegations .map((delegation) => ({ asset: assetMap[delegation.assetId], @@ -44,11 +44,6 @@ const OperatorsTable: FC = ({ })) .filter((vaultAsset) => Boolean(vaultAsset.asset)); - const restakerSet = delegations.reduce((restakerSet, delegation) => { - restakerSet.add(delegation.delegatorAccountId); - return restakerSet; - }, new Set()); - const tvlInUsd = operatorTVL?.[address] ?? null; const concentrationPercentage = operatorConcentration?.[address] ?? null; @@ -57,7 +52,7 @@ const OperatorsTable: FC = ({ address, concentrationPercentage, identityName: identities[address]?.name ?? '', - restakersCount: restakerSet.size, + restakersCount, tvlInUsd, vaultTokens: vaultAssets.map(({ asset, amount }) => ({ amount: +formatUnits(amount, asset.decimals), diff --git a/apps/tangle-dapp/app/restake/operators/[address]/OperatorInfoCard.tsx b/apps/tangle-dapp/app/restake/operators/[address]/OperatorInfoCard.tsx index 06dd21c4c..d5fab3d9d 100644 --- a/apps/tangle-dapp/app/restake/operators/[address]/OperatorInfoCard.tsx +++ b/apps/tangle-dapp/app/restake/operators/[address]/OperatorInfoCard.tsx @@ -1,30 +1,105 @@ +'use client'; + +import { isHex } from '@polkadot/util'; +import isValidUrl from '@webb-tools/dapp-types/utils/isValidUrl'; import { ExternalLinkLine } from '@webb-tools/icons/ExternalLinkLine'; import { Chip } from '@webb-tools/webb-ui-components/components/Chip'; import InfoIconWithTooltip from '@webb-tools/webb-ui-components/components/IconWithTooltip/InfoIconWithTooltip'; import { KeyValueWithButton } from '@webb-tools/webb-ui-components/components/KeyValueWithButton'; import { Typography } from '@webb-tools/webb-ui-components/typography/Typography'; -import type { ComponentProps, FC, ReactNode } from 'react'; +import { shortenHex } from '@webb-tools/webb-ui-components/utils/shortenHex'; +import { shortenString } from '@webb-tools/webb-ui-components/utils/shortenString'; +import { notFound } from 'next/navigation'; +import { type ComponentProps, type FC, type ReactNode, useMemo } from 'react'; +import useSWRImmutable from 'swr/immutable'; import { twMerge } from 'tailwind-merge'; import GlassCard from '../../../../components/GlassCard/GlassCard'; import ValidatorSocials from '../../../../components/ValidatorSocials'; +import useNetworkStore from '../../../../context/useNetworkStore'; +import useRestakeDelegatorInfo from '../../../../data/restake/useRestakeDelegatorInfo'; +import useRestakeOperatorMap from '../../../../data/restake/useRestakeOperatorMap'; +import useRestakeTVL from '../../../../data/restake/useRestakeTVL'; +import getTVLToDisplay from '../../../../utils/getTVLToDisplay'; +import { getAccountInfo } from '../../../../utils/polkadot'; import AvatarWithText from '../../AvatarWithText'; -interface Props extends Partial> {} +interface Props extends Partial> { + operatorAddress: string; +} + +const OperatorInfoCard: FC = ({ + className, + operatorAddress, + ...props +}) => { + const { operatorMap } = useRestakeOperatorMap(); + const { delegatorInfo } = useRestakeDelegatorInfo(); + const { operatorTVL } = useRestakeTVL(operatorMap, delegatorInfo); + const { rpcEndpoint } = useNetworkStore(); + + if (operatorMap[operatorAddress] === undefined) { + notFound(); + } + + const isRestaked = useMemo(() => { + if (delegatorInfo === null) { + return false; + } + + const foundDelegation = delegatorInfo.delegations.find( + (delegation) => delegation.operatorAccountId === operatorAddress, + ); + + return Boolean(foundDelegation); + }, [delegatorInfo, operatorAddress]); + + const totalRestaked = useMemo( + () => getTVLToDisplay(operatorTVL[operatorAddress]), + [operatorAddress, operatorTVL], + ); + + const restakersCount = useMemo( + () => operatorMap[operatorAddress].restakersCount.toString(), + [operatorAddress, operatorMap], + ); + + const { data: operatorInfo } = useSWRImmutable( + [rpcEndpoint, operatorAddress], + (args) => getAccountInfo(...args), + ); + + const identityName = useMemo(() => { + const defaultName = isHex(operatorAddress) + ? shortenHex(operatorAddress) + : shortenString(operatorAddress); + + if (!operatorInfo) { + return defaultName; + } + + return operatorInfo.name || defaultName; + }, [operatorAddress, operatorInfo]); + + const validatorSocials = useMemo(() => { + const twitterHandle = operatorInfo?.twitter ?? ''; + const webUrl = operatorInfo?.web ?? ''; + const email = operatorInfo?.email ?? ''; -const OperatorInfoCard: FC = ({ className, ...props }) => { - const isRestaked = true; - const accountAddress = 'tgDeWmUCK6uinvwV6qc2wCHxJboC9RAkYK79xNqeaGgp7Pp6K'; - const totalRestaked = `$0.00`; - const restakerCount = `1`; + const twitterUrl = isValidUrl(twitterHandle) + ? twitterHandle + : `https://x.com/${twitterHandle}`; - const validatorSocials = { - location: '🌎 Earth', - twitterUrl: 'https://x.com/tangle_network', - webUrl: 'https://tangle.tools', - email: 'hello@webb.tools', - githubUrl: 'https://github.com/webb-tools/tangle', - }; + return { + twitterUrl, + webUrl, + email, + // TODO: Add location + location: '', + // TODO: Add github link + githubUrl: '', + }; + }, [operatorInfo?.email, operatorInfo?.twitter, operatorInfo?.web]); return ( @@ -37,14 +112,14 @@ const OperatorInfoCard: FC = ({ className, ...props }) => { variant: 'h4', fw: 'bold', }} - accountAddress={accountAddress} - identityName="NodeSync.Top" + accountAddress={operatorAddress} + identityName={identityName} description={
@@ -57,7 +132,7 @@ const OperatorInfoCard: FC = ({ className, ...props }) => {
- +
diff --git a/apps/tangle-dapp/app/restake/operators/[address]/page.tsx b/apps/tangle-dapp/app/restake/operators/[address]/page.tsx index 7d1249309..b0fe5e65e 100644 --- a/apps/tangle-dapp/app/restake/operators/[address]/page.tsx +++ b/apps/tangle-dapp/app/restake/operators/[address]/page.tsx @@ -10,7 +10,7 @@ const page = ({ params: { address } }: { params: { address: string } }) => { return (
- +
diff --git a/apps/tangle-dapp/data/restake/useRestakeOperatorMap.ts b/apps/tangle-dapp/data/restake/useRestakeOperatorMap.ts index a3104648b..dc3e521c1 100644 --- a/apps/tangle-dapp/data/restake/useRestakeOperatorMap.ts +++ b/apps/tangle-dapp/data/restake/useRestakeOperatorMap.ts @@ -49,12 +49,16 @@ export default function useRestakeOperatorMap(): UseRestakeOperatorMapReturnType const accountId = accountStorage.args[0]; const operator = operatorMetadata.unwrap(); + const { delegations, restakersCount } = toPrimitiveDelegations( + operator.delegations, + ); const operatorMetadataPrimitive = { stake: operator.stake.toBigInt(), delegationCount: operator.delegationCount.toNumber(), bondLessRequest: toPrimitiveRequest(operator.request), - delegations: toPrimitiveDelegations(operator.delegations), + delegations, + restakersCount, status: toPrimitiveStatus(operator.status), } satisfies OperatorMetadata; @@ -112,10 +116,25 @@ function toPrimitiveStatus( */ function toPrimitiveDelegations( delegations: Vec, -): OperatorMetadata['delegations'] { - return delegations.map(({ amount, assetId, delegator }) => ({ - amount: amount.toBigInt(), - delegatorAccountId: delegator.toString(), - assetId: assetId.toString(), - })); +) { + const restakerSet = new Set(); + + const primitiveDelegations = delegations.map( + ({ amount, assetId, delegator }) => { + const delegatorAccountId = delegator.toString(); + + restakerSet.add(delegatorAccountId); + + return { + amount: amount.toBigInt(), + delegatorAccountId, + assetId: assetId.toString(), + } satisfies OperatorMetadata['delegations'][number]; + }, + ); + + return { + delegations: primitiveDelegations, + restakersCount: restakerSet.size, + }; } diff --git a/apps/tangle-dapp/types/restake.ts b/apps/tangle-dapp/types/restake.ts index e646d7bfa..04ce1c236 100644 --- a/apps/tangle-dapp/types/restake.ts +++ b/apps/tangle-dapp/types/restake.ts @@ -64,6 +64,7 @@ export type OperatorMetadata = { readonly bondLessRequest: OperatorBondLessRequest | null; readonly delegations: Array; readonly status: OperatorStatus; + readonly restakersCount: number; }; /** diff --git a/apps/tangle-dapp/utils/getTVLToDisplay.ts b/apps/tangle-dapp/utils/getTVLToDisplay.ts index c786636b0..f0b37ca86 100644 --- a/apps/tangle-dapp/utils/getTVLToDisplay.ts +++ b/apps/tangle-dapp/utils/getTVLToDisplay.ts @@ -2,8 +2,9 @@ import { getRoundedAmountString } from '@webb-tools/webb-ui-components/utils/get import { EMPTY_VALUE_PLACEHOLDER } from '../constants'; -export default function getTVLToDisplay(tvl: number | null) { - if (tvl === null || tvl === 0) return EMPTY_VALUE_PLACEHOLDER; +export default function getTVLToDisplay(tvl: number | null | undefined) { + if (tvl === null || tvl === undefined || tvl === 0) + return EMPTY_VALUE_PLACEHOLDER; return `$${getRoundedAmountString(tvl)}`; } From 5fea510368c114c64d2221d024d61e4120f4345c Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Mon, 9 Sep 2024 04:57:10 +0700 Subject: [PATCH 45/51] feat(tangle-dapp): Integrate data for operator TVL table --- .../operators/[address]/OperatorInfoCard.tsx | 30 ++-- .../restake/operators/[address]/TVLTable.tsx | 133 ++++++++++++++++++ .../app/restake/operators/[address]/page.tsx | 47 +++++-- 3 files changed, 181 insertions(+), 29 deletions(-) create mode 100644 apps/tangle-dapp/app/restake/operators/[address]/TVLTable.tsx diff --git a/apps/tangle-dapp/app/restake/operators/[address]/OperatorInfoCard.tsx b/apps/tangle-dapp/app/restake/operators/[address]/OperatorInfoCard.tsx index d5fab3d9d..2fdc39995 100644 --- a/apps/tangle-dapp/app/restake/operators/[address]/OperatorInfoCard.tsx +++ b/apps/tangle-dapp/app/restake/operators/[address]/OperatorInfoCard.tsx @@ -1,5 +1,3 @@ -'use client'; - import { isHex } from '@polkadot/util'; import isValidUrl from '@webb-tools/dapp-types/utils/isValidUrl'; import { ExternalLinkLine } from '@webb-tools/icons/ExternalLinkLine'; @@ -9,7 +7,6 @@ import { KeyValueWithButton } from '@webb-tools/webb-ui-components/components/Ke import { Typography } from '@webb-tools/webb-ui-components/typography/Typography'; import { shortenHex } from '@webb-tools/webb-ui-components/utils/shortenHex'; import { shortenString } from '@webb-tools/webb-ui-components/utils/shortenString'; -import { notFound } from 'next/navigation'; import { type ComponentProps, type FC, type ReactNode, useMemo } from 'react'; import useSWRImmutable from 'swr/immutable'; import { twMerge } from 'tailwind-merge'; @@ -17,31 +14,34 @@ import { twMerge } from 'tailwind-merge'; import GlassCard from '../../../../components/GlassCard/GlassCard'; import ValidatorSocials from '../../../../components/ValidatorSocials'; import useNetworkStore from '../../../../context/useNetworkStore'; -import useRestakeDelegatorInfo from '../../../../data/restake/useRestakeDelegatorInfo'; -import useRestakeOperatorMap from '../../../../data/restake/useRestakeOperatorMap'; -import useRestakeTVL from '../../../../data/restake/useRestakeTVL'; +import type { + DelegatorInfo, + OperatorMap, + OperatorMetadata, +} from '../../../../types/restake'; import getTVLToDisplay from '../../../../utils/getTVLToDisplay'; import { getAccountInfo } from '../../../../utils/polkadot'; import AvatarWithText from '../../AvatarWithText'; interface Props extends Partial> { operatorAddress: string; + operatorData: OperatorMetadata; + operatorMap: OperatorMap; + delegatorInfo: DelegatorInfo | null; + operatorTVL: Record; } const OperatorInfoCard: FC = ({ className, operatorAddress, + operatorData, + operatorMap, + delegatorInfo, + operatorTVL, ...props }) => { - const { operatorMap } = useRestakeOperatorMap(); - const { delegatorInfo } = useRestakeDelegatorInfo(); - const { operatorTVL } = useRestakeTVL(operatorMap, delegatorInfo); const { rpcEndpoint } = useNetworkStore(); - if (operatorMap[operatorAddress] === undefined) { - notFound(); - } - const isRestaked = useMemo(() => { if (delegatorInfo === null) { return false; @@ -60,8 +60,8 @@ const OperatorInfoCard: FC = ({ ); const restakersCount = useMemo( - () => operatorMap[operatorAddress].restakersCount.toString(), - [operatorAddress, operatorMap], + () => operatorData.restakersCount.toString(), + [operatorData.restakersCount], ); const { data: operatorInfo } = useSWRImmutable( diff --git a/apps/tangle-dapp/app/restake/operators/[address]/TVLTable.tsx b/apps/tangle-dapp/app/restake/operators/[address]/TVLTable.tsx new file mode 100644 index 000000000..28a70abdf --- /dev/null +++ b/apps/tangle-dapp/app/restake/operators/[address]/TVLTable.tsx @@ -0,0 +1,133 @@ +import { ZERO_BIG_INT } from '@webb-tools/dapp-config/constants'; +import { ComponentProps, type FC, useMemo } from 'react'; + +import VaultAssetsTable from '../../../../components/tables/VaultAssets'; +import { VaultAssetData } from '../../../../components/tables/VaultAssets/types'; +import VaultsTable from '../../../../components/tables/Vaults'; +import type { VaultData } from '../../../../components/tables/Vaults/types'; +import { useRestakeContext } from '../../../../context/RestakeContext'; +import useRestakeRewardConfig from '../../../../data/restake/useRestakeRewardConfig'; +import type { + DelegatorInfo, + OperatorMetadata, +} from '../../../../types/restake'; + +type Props = { + operatorData: OperatorMetadata; + delegatorInfo: DelegatorInfo | null; + delegatorTVL: Record; + vaultTVL: Record; +}; + +const TVLTable: FC = ({ + operatorData, + vaultTVL, + delegatorInfo, + delegatorTVL, +}) => { + const { assetMap } = useRestakeContext(); + const { rewardConfig } = useRestakeRewardConfig(); + + const vaults = useMemo(() => { + const vaults: Record = {}; + + operatorData.delegations.forEach(({ assetId }) => { + if (assetMap[assetId] === undefined) return; + + if (assetMap[assetId].poolId === null) return; + + const poolId = assetMap[assetId].poolId; + if (vaults[poolId] === undefined) { + // TODO: Find out a proper way to get the pool name, now it's the first token name + const name = assetMap[assetId].name; + // TODO: Find out a proper way to get the pool symbol, now it's the first token symbol + const representToken = assetMap[assetId].symbol; + const apyPercentage = rewardConfig.configs[poolId]?.apy ?? null; + const tvlInUsd = vaultTVL?.[poolId] ?? null; + + vaults[poolId] = { + id: poolId, + apyPercentage, + name, + representToken, + tokensCount: 1, + tvlInUsd, + }; + } else { + vaults[poolId].tokensCount += 1; + } + }); + + return vaults; + }, [assetMap, operatorData.delegations, rewardConfig.configs, vaultTVL]); + + const delegatorTotalRestakedAssets = useMemo(() => { + if (!delegatorInfo?.delegations) { + return {}; + } + + return delegatorInfo.delegations.reduce>( + (acc, { amountBonded, assetId }) => { + if (acc[assetId] === undefined) { + acc[assetId] = amountBonded; + } else { + acc[assetId] += amountBonded; + } + return acc; + }, + {}, + ); + }, [delegatorInfo?.delegations]); + + const tableProps = useMemo['tableProps']>( + () => ({ + onRowClick(row) { + if (!row.getCanExpand()) return; + return row.toggleExpanded(); + }, + getExpandedRowContent(row) { + const poolId = row.original.id; + const vaultAssets = Object.values(assetMap) + .filter((asset) => asset.poolId === poolId) + .map((asset) => { + const selfStake = + delegatorTotalRestakedAssets[asset.id] ?? ZERO_BIG_INT; + + const tvl = delegatorTVL?.[asset.id] ?? null; + + return { + id: asset.id, + symbol: asset.symbol, + decimals: asset.decimals, + tvl, + selfStake, + } satisfies VaultAssetData; + }); + + return ( +
+ +
+ ); + }, + }), + [assetMap, delegatorTVL, delegatorTotalRestakedAssets], + ); + + return ( + + ); +}; + +export default TVLTable; diff --git a/apps/tangle-dapp/app/restake/operators/[address]/page.tsx b/apps/tangle-dapp/app/restake/operators/[address]/page.tsx index b0fe5e65e..f16bf8784 100644 --- a/apps/tangle-dapp/app/restake/operators/[address]/page.tsx +++ b/apps/tangle-dapp/app/restake/operators/[address]/page.tsx @@ -1,16 +1,40 @@ +'use client'; + import { Typography } from '@webb-tools/webb-ui-components/typography/Typography'; +import { notFound } from 'next/navigation'; -import VaultsTable from '../../../../components/tables/Vaults'; +import useRestakeDelegatorInfo from '../../../../data/restake/useRestakeDelegatorInfo'; +import useRestakeOperatorMap from '../../../../data/restake/useRestakeOperatorMap'; +import useRestakeTVL from '../../../../data/restake/useRestakeTVL'; import OperatorInfoCard from './OperatorInfoCard'; import RegisteredBlueprintsCard from './RegisteredBlueprintsCard'; +import TVLTable from './TVLTable'; export const dynamic = 'force-static'; -const page = ({ params: { address } }: { params: { address: string } }) => { +const Page = ({ params: { address } }: { params: { address: string } }) => { + const { operatorMap } = useRestakeOperatorMap(); + const { delegatorInfo } = useRestakeDelegatorInfo(); + const { operatorTVL, poolTVL, delegatorTVL } = useRestakeTVL( + operatorMap, + delegatorInfo, + ); + + if (operatorMap[address] === undefined) { + notFound(); + } + return (
- +
@@ -20,20 +44,15 @@ const page = ({ params: { address } }: { params: { address: string } }) => { Total Value Locked -
); }; -export default page; +export default Page; From 3775af0a7f029efc401360e3b6eeaf595be4b97d Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Wed, 11 Sep 2024 14:25:26 +0700 Subject: [PATCH 46/51] chore(tangle-dapp): Add TODO for integrate blueprint API --- .../restake/operators/[address]/RegisteredBlueprintsCard.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/tangle-dapp/app/restake/operators/[address]/RegisteredBlueprintsCard.tsx b/apps/tangle-dapp/app/restake/operators/[address]/RegisteredBlueprintsCard.tsx index 4b138f8b0..792d46a55 100644 --- a/apps/tangle-dapp/app/restake/operators/[address]/RegisteredBlueprintsCard.tsx +++ b/apps/tangle-dapp/app/restake/operators/[address]/RegisteredBlueprintsCard.tsx @@ -14,6 +14,8 @@ import { PagePath } from '../../../../types'; interface Props extends Partial> {} +// TODO: Integrate API to get the blueprint detail. +// The backend team is still working on adding these APIs. const blueprints = [ { id: '1', From 1dd4a455646c494fd4fac50b7599b8d63f8d9ba7 Mon Sep 17 00:00:00 2001 From: Trung-Tin Pham <60747384+AtelyPham@users.noreply.github.com> Date: Tue, 17 Sep 2024 15:21:35 +0700 Subject: [PATCH 47/51] fix(tangle-dapp): Update operator link --- apps/tangle-dapp/components/Breadcrumbs/utils.tsx | 1 + apps/tangle-dapp/components/tables/Operators/index.tsx | 4 +--- apps/tangle-dapp/types/index.ts | 1 + 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/tangle-dapp/components/Breadcrumbs/utils.tsx b/apps/tangle-dapp/components/Breadcrumbs/utils.tsx index 484c1af8b..49f1c4776 100644 --- a/apps/tangle-dapp/components/Breadcrumbs/utils.tsx +++ b/apps/tangle-dapp/components/Breadcrumbs/utils.tsx @@ -26,6 +26,7 @@ const BREADCRUMB_ICONS: Record JSX.Element> = { [PagePath.RESTAKE]: TokenSwapFill, [PagePath.RESTAKE_DEPOSIT]: TokenSwapFill, [PagePath.RESTAKE_STAKE]: TokenSwapFill, + [PagePath.RESTAKE_OPERATOR]: TokenSwapFill, [PagePath.BRIDGE]: ShuffleLine, [PagePath.LIQUID_STAKING]: WaterDropletIcon, [PagePath.LIQUID_STAKING_OVERVIEW]: WaterDropletIcon, diff --git a/apps/tangle-dapp/components/tables/Operators/index.tsx b/apps/tangle-dapp/components/tables/Operators/index.tsx index 018ab559c..f3ea298ef 100644 --- a/apps/tangle-dapp/components/tables/Operators/index.tsx +++ b/apps/tangle-dapp/components/tables/Operators/index.tsx @@ -135,11 +135,9 @@ const columns = [ cell: (props) => (
- {/* TODO: add proper href */}