From bea5a35d377b878342b6669597665c438c11a160 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 17 Jun 2024 22:35:30 +0330 Subject: [PATCH 001/168] chore: Init assets page --- apps/rosen/app/SideBar.tsx | 1 - apps/rosen/app/_backend/assets/index.ts | 1 + .../assets/repository.ts} | 54 ++++-- apps/rosen/app/_backend/assets/services.ts | 47 ++++++ apps/rosen/app/_types/api.ts | 4 + .../rosen/app/api/v1/assets/assets-service.ts | 28 ---- .../detail/[id]/asset-details-repository.ts | 45 ----- .../detail/[id]/asset-details-service.ts | 28 ---- .../app/api/v1/assets/detail/[id]/route.ts | 8 +- .../api/v1/assets/detail/[id]/validations.ts | 9 +- apps/rosen/app/api/v1/assets/route.ts | 15 +- apps/rosen/app/api/v1/assets/validations.ts | 9 +- apps/rosen/app/assets/TableRow.tsx | 112 +++++++++++++ apps/rosen/app/assets/page.tsx | 156 +++++++++++++++++- 14 files changed, 374 insertions(+), 143 deletions(-) create mode 100644 apps/rosen/app/_backend/assets/index.ts rename apps/rosen/app/{api/v1/assets/assets-repository.ts => _backend/assets/repository.ts} (60%) create mode 100644 apps/rosen/app/_backend/assets/services.ts delete mode 100644 apps/rosen/app/api/v1/assets/assets-service.ts delete mode 100644 apps/rosen/app/api/v1/assets/detail/[id]/asset-details-repository.ts delete mode 100644 apps/rosen/app/api/v1/assets/detail/[id]/asset-details-service.ts create mode 100644 apps/rosen/app/assets/TableRow.tsx diff --git a/apps/rosen/app/SideBar.tsx b/apps/rosen/app/SideBar.tsx index 6e9ccec3..3854477c 100644 --- a/apps/rosen/app/SideBar.tsx +++ b/apps/rosen/app/SideBar.tsx @@ -76,7 +76,6 @@ const SideBar = () => { } onClick={() => router.push('/assets')} isActive={pathname.startsWith('/assets')} - disabled /> diff --git a/apps/rosen/app/_backend/assets/index.ts b/apps/rosen/app/_backend/assets/index.ts new file mode 100644 index 00000000..e371345e --- /dev/null +++ b/apps/rosen/app/_backend/assets/index.ts @@ -0,0 +1 @@ +export * from './services'; diff --git a/apps/rosen/app/api/v1/assets/assets-repository.ts b/apps/rosen/app/_backend/assets/repository.ts similarity index 60% rename from apps/rosen/app/api/v1/assets/assets-repository.ts rename to apps/rosen/app/_backend/assets/repository.ts index 94972e7a..48762817 100644 --- a/apps/rosen/app/api/v1/assets/assets-repository.ts +++ b/apps/rosen/app/_backend/assets/repository.ts @@ -4,13 +4,15 @@ import { TokenEntity, } from '@rosen-ui/asset-calculator'; -import dataSource from '../../../_backend/dataSource'; +import NotFoundError from '@/_errors/NotFoundError'; + +import dataSource from '../dataSource'; const bridgedAssetRepository = dataSource.getRepository(BridgedAssetEntity); const lockedAssetRepository = dataSource.getRepository(LockedAssetEntity); const tokenRepository = dataSource.getRepository(TokenEntity); -interface AssetWithTotal { +export interface Asset { id: string; name: string; decimal: number; @@ -18,18 +20,46 @@ interface AssetWithTotal { bridged: string; locked: string; chain: string; +} + +export type AssetFilters = Partial>; + +interface AssetWithTotal extends Asset { total: number; } -export type AssetFilters = Partial< - Pick ->; /** - * remove total field from rawItems returned by query in getAssets - * @param rawItems + * get details of an asset, including its token info, plus locked and bridged + * data + * @param id */ -const getItemsWithoutTotal = (rawItems: AssetWithTotal[]) => - rawItems.map(({ total, ...item }) => item); +export const getAsset = async (id: string) => { + const token = await tokenRepository.findOne({ + where: { id }, + }); + + if (!token) { + throw new NotFoundError(`Token with id [${id}] not found`); + } + + const bridged: Pick[] = + await bridgedAssetRepository.find({ + where: { tokenId: id }, + select: ['amount', 'chain'], + }); + + const locked: Pick[] = + await lockedAssetRepository.find({ + where: { tokenId: id }, + select: ['amount', 'address'], + }); + + return { + token, + bridged, + locked, + }; +}; /** * get paginated list of assets @@ -77,10 +107,12 @@ export const getAssets = async ( .limit(limit) .getRawMany(); - const items = getItemsWithoutTotal(rawItems); + const items = rawItems.map(({ total, ...item }) => item); + + const total = rawItems[0]?.total ?? 0; return { items, - total: rawItems[0]?.total ?? 0, + total, }; }; diff --git a/apps/rosen/app/_backend/assets/services.ts b/apps/rosen/app/_backend/assets/services.ts new file mode 100644 index 00000000..fb2fbb6b --- /dev/null +++ b/apps/rosen/app/_backend/assets/services.ts @@ -0,0 +1,47 @@ +import { + AssetFilters, + getAsset as getAssetCore, + getAssets as getAssetsCore, +} from './repository'; + +/** + * return asset details + * @param offset + * @param limit + */ +export const getAsset = async (id: string) => { + const assetDetails = await getAssetCore(id); + + return { + token: assetDetails.token, + locked: assetDetails.locked.map((lockedItem) => ({ + address: lockedItem.address, + amount: lockedItem.amount.toString(), + })), + bridged: assetDetails.bridged.map((bridgedItem) => ({ + chain: bridgedItem.chain, + amount: bridgedItem.amount.toString(), + })), + }; +}; + +/** + * return assets + * @param offset + * @param limit + */ +export const getAssets = async ( + offset: number, + limit: number, + filters: AssetFilters = {}, +) => { + const assets = await getAssetsCore(offset, limit, filters); + + return { + total: assets.total, + items: assets.items.map((asset) => ({ + ...asset, + id: asset.isNative ? asset.name : asset.id, + })), + }; +}; diff --git a/apps/rosen/app/_types/api.ts b/apps/rosen/app/_types/api.ts index dcf012d7..a79c3874 100644 --- a/apps/rosen/app/_types/api.ts +++ b/apps/rosen/app/_types/api.ts @@ -1,3 +1,4 @@ +import { getAssets } from '@/_backend/assets'; import eventService from '@/_backend/events/event-service'; export type ApiEventResponse = Awaited< @@ -5,3 +6,6 @@ export type ApiEventResponse = Awaited< >; type ArrayElement = T extends (infer Element)[] ? Element : never; export type Event = ArrayElement; + +export type ApiAssetResponse = Awaited>; +export type Asset = ArrayElement; diff --git a/apps/rosen/app/api/v1/assets/assets-service.ts b/apps/rosen/app/api/v1/assets/assets-service.ts deleted file mode 100644 index 9a355171..00000000 --- a/apps/rosen/app/api/v1/assets/assets-service.ts +++ /dev/null @@ -1,28 +0,0 @@ -import * as assetsRepository from './assets-repository'; - -/** - * return assets - * @param offset - * @param limit - */ -const getAssets = async ( - offset: number, - limit: number, - filters: assetsRepository.AssetFilters = {}, -) => { - const assets = await assetsRepository.getAssets(offset, limit, filters); - - return { - total: assets.total, - items: assets.items.map((asset) => ({ - ...asset, - id: asset.isNative ? asset.name : asset.id, - })), - }; -}; - -const eventService = { - getAssets, -}; - -export default eventService; diff --git a/apps/rosen/app/api/v1/assets/detail/[id]/asset-details-repository.ts b/apps/rosen/app/api/v1/assets/detail/[id]/asset-details-repository.ts deleted file mode 100644 index 83abfe65..00000000 --- a/apps/rosen/app/api/v1/assets/detail/[id]/asset-details-repository.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { - BridgedAssetEntity, - LockedAssetEntity, - TokenEntity, -} from '@rosen-ui/asset-calculator'; - -import dataSource from '@/_backend/dataSource'; -import NotFoundError from '@/_errors/NotFoundError'; - -const bridgedAssetRepository = dataSource.getRepository(BridgedAssetEntity); -const lockedAssetRepository = dataSource.getRepository(LockedAssetEntity); -const tokenRepository = dataSource.getRepository(TokenEntity); - -/** - * get details of an asset, including its token info, plus locked and bridged - * data - * @param id - */ -export const getAssets = async (id: string) => { - const token = await tokenRepository.findOne({ - where: { id }, - }); - - if (!token) { - throw new NotFoundError(`Token with id [${id}] not found`); - } - - const bridged: Pick[] = - await bridgedAssetRepository.find({ - where: { tokenId: id }, - select: ['amount', 'chain'], - }); - - const locked: Pick[] = - await lockedAssetRepository.find({ - where: { tokenId: id }, - select: ['amount', 'address'], - }); - - return { - token, - bridged, - locked, - }; -}; diff --git a/apps/rosen/app/api/v1/assets/detail/[id]/asset-details-service.ts b/apps/rosen/app/api/v1/assets/detail/[id]/asset-details-service.ts deleted file mode 100644 index e45d840c..00000000 --- a/apps/rosen/app/api/v1/assets/detail/[id]/asset-details-service.ts +++ /dev/null @@ -1,28 +0,0 @@ -import * as assetDetailsRepository from './asset-details-repository'; - -/** - * return asset details - * @param offset - * @param limit - */ -const getAssetDetails = async (id: string) => { - const assetDetails = await assetDetailsRepository.getAssets(id); - - return { - token: assetDetails.token, - locked: assetDetails.locked.map((lockedItem) => ({ - address: lockedItem.address, - amount: lockedItem.amount.toString(), - })), - bridged: assetDetails.bridged.map((bridgedItem) => ({ - chain: bridgedItem.chain, - amount: bridgedItem.amount.toString(), - })), - }; -}; - -const assetDetailsService = { - getAssetDetails, -}; - -export default assetDetailsService; diff --git a/apps/rosen/app/api/v1/assets/detail/[id]/route.ts b/apps/rosen/app/api/v1/assets/detail/[id]/route.ts index 8502fbc0..de49c3f0 100644 --- a/apps/rosen/app/api/v1/assets/detail/[id]/route.ts +++ b/apps/rosen/app/api/v1/assets/detail/[id]/route.ts @@ -1,11 +1,9 @@ -import assetDetailsService from './asset-details-service'; +import { getAsset } from '@/_backend/assets'; import withValidation from '../../../withValidation'; -import AssetDetailsValidations from './validations'; +import { validateGet } from './validations'; import '../../../initialize-datasource-if-needed'; -export const GET = withValidation(AssetDetailsValidations.GET, (value) => - assetDetailsService.getAssetDetails(value.id), -); +export const GET = withValidation(validateGet, (value) => getAsset(value.id)); diff --git a/apps/rosen/app/api/v1/assets/detail/[id]/validations.ts b/apps/rosen/app/api/v1/assets/detail/[id]/validations.ts index 64653f55..3842f032 100644 --- a/apps/rosen/app/api/v1/assets/detail/[id]/validations.ts +++ b/apps/rosen/app/api/v1/assets/detail/[id]/validations.ts @@ -4,6 +4,7 @@ import Joi from 'joi'; interface GETPositionalParams { id: string; } + const getQueryParamsSchema = Joi.object().keys({ id: Joi.string().required(), }); @@ -12,15 +13,9 @@ const getQueryParamsSchema = Joi.object().keys({ * validate get requests * @param request */ -const validateGet = ( +export const validateGet = ( _: NextRequest, context?: { params: GETPositionalParams }, ) => { return getQueryParamsSchema.validate(context?.params); }; - -const AssetDetailsValidations = { - GET: validateGet, -}; - -export default AssetDetailsValidations; diff --git a/apps/rosen/app/api/v1/assets/route.ts b/apps/rosen/app/api/v1/assets/route.ts index 9d642cd3..855fc31c 100644 --- a/apps/rosen/app/api/v1/assets/route.ts +++ b/apps/rosen/app/api/v1/assets/route.ts @@ -1,17 +1,12 @@ import { pick } from 'lodash-es'; -import assetService from './assets-service'; +import { getAssets } from '@/_backend/assets'; +import '../initialize-datasource-if-needed'; import withValidation from '../withValidation'; -import EventsValidations from './validations'; - -import '../initialize-datasource-if-needed'; +import { validateGet } from './validations'; -export const GET = withValidation(EventsValidations.GET, (value) => - assetService.getAssets( - value.offset, - value.limit, - pick(value, 'chain', 'name', 'id'), - ), +export const GET = withValidation(validateGet, (value) => + getAssets(value.offset, value.limit, pick(value, 'chain', 'name', 'id')), ); diff --git a/apps/rosen/app/api/v1/assets/validations.ts b/apps/rosen/app/api/v1/assets/validations.ts index 6e56f15a..2d3b9fec 100644 --- a/apps/rosen/app/api/v1/assets/validations.ts +++ b/apps/rosen/app/api/v1/assets/validations.ts @@ -8,6 +8,7 @@ interface GETQueryParams { name?: string; chain?: 'ergo' | 'cardano' | 'bitcoin'; } + const getQueryParamsSchema = Joi.object().keys({ offset: Joi.number().min(0).default(0), limit: Joi.number().min(0).max(100).default(20), @@ -20,12 +21,6 @@ const getQueryParamsSchema = Joi.object().keys({ * validate get requests * @param request */ -const validateGet = ({ nextUrl: { searchParams } }: NextRequest) => { +export const validateGet = ({ nextUrl: { searchParams } }: NextRequest) => { return getQueryParamsSchema.validate(Object.fromEntries(searchParams)); }; - -const EventsValidations = { - GET: validateGet, -}; - -export default EventsValidations; diff --git a/apps/rosen/app/assets/TableRow.tsx b/apps/rosen/app/assets/TableRow.tsx new file mode 100644 index 00000000..42149990 --- /dev/null +++ b/apps/rosen/app/assets/TableRow.tsx @@ -0,0 +1,112 @@ +import { upperFirst } from 'lodash-es'; +import moment from 'moment'; +import { useState, FC, useMemo } from 'react'; + +import { + Button, + EnhancedTableCell, + TableRow, + Link, + Typography, + Id, +} from '@rosen-bridge/ui-kit'; + +import { AngleDown, AngleUp } from '@rosen-bridge/icons'; + +import { getDecimalString, getTxURL } from '@rosen-ui/utils'; + +import { Asset } from '@/_types/api'; + +interface RowProps extends Asset { + isLoading?: boolean; +} + +export const mobileHeader = [ + { + title: '', + cellProps: { + width: '40%', + }, + }, + { + title: '', + cellProps: { + width: '60%', + }, + }, +]; + +export const tabletHeader = [ + { + title: 'Name', + cellProps: { + width: 150, + align: 'center' as const, + }, + }, + { + title: 'Id', + cellProps: { + width: 300, + align: 'left' as const, + }, + }, + { + title: 'Type', + cellProps: { + width: 150, + align: 'center' as const, + }, + }, + { + title: 'Locked', + cellProps: { + width: 150, + align: 'center' as const, + }, + }, + { + title: 'Bridged', + cellProps: { + width: 150, + align: 'center' as const, + }, + }, +]; + +const statusMap = { + fraud: 'fraud', + processing: 'processing', + successful: 'done', +}; + +export const MobileRow: FC = (props) => { + const { isLoading, ...row } = props; + const [expand, setExpand] = useState(false); + + const rowStyles = useMemo( + () => (isLoading ? { opacity: 0.3 } : {}), + [isLoading], + ); + + const toggleExpand = () => { + setExpand((prevState) => !prevState); + }; + + return <>; +}; + +export const TabletRow: FC = (props) => { + const { isLoading, ...row } = props; + return ( + + {row.name} + + + + {row.chain} + {row.locked} + {row.bridged} + + ); +}; diff --git a/apps/rosen/app/assets/page.tsx b/apps/rosen/app/assets/page.tsx index bc4be3e8..db38437e 100644 --- a/apps/rosen/app/assets/page.tsx +++ b/apps/rosen/app/assets/page.tsx @@ -1,5 +1,159 @@ 'use client'; -const Assets = () => null; +import { + EnhancedTable, + FormControl, + Grid, + InputLabel, + MenuItem, + Select, + TablePaginationProps, + Typography, + useTableDataPagination, +} from '@rosen-bridge/ui-kit'; +import { MouseEvent, useCallback, useMemo, useState } from 'react'; + +import { ApiAssetResponse, Asset } from '@/_types/api'; + +import { MobileRow, TabletRow, mobileHeader, tabletHeader } from './TableRow'; + +const getKey = (chain: string) => (offset: number, limit: number) => { + return [ + '/v1/assets', + { offset, limit, chain: chain == 'all' ? undefined : chain }, + ]; +}; + +const Assets = () => { + const [network, setNetwork] = useState('all'); + + const { + data, + isLoading, + pageIndex, + pageSize, + setPageIndex, + setPageSize, + isFirstLoad, + isFirstPage, + isLastPage, + } = useTableDataPagination(getKey(network)); + + const handleChangeNetwork = (event: any) => { + setNetwork(event.target.value as string); + }; + + const handleChangePage = useCallback( + (event: MouseEvent | null, newPage: number) => { + setPageIndex(newPage); + }, + [setPageIndex], + ); + + const handleChangeRowsPerPage = useCallback( + (event: React.ChangeEvent) => { + setPageSize(parseInt(event.target.value, 10)); + }, + [setPageSize], + ); + + const renderMobileRow = useCallback( + (rowData: Asset) => , + [isLoading], + ); + + const renderTabletRow = useCallback( + (rowData: Asset) => , + [isLoading], + ); + + const tableHeaderProps = useMemo( + () => ({ + mobile: mobileHeader, + tablet: tabletHeader, + }), + [], + ); + + const tableRenderRowProps = useMemo( + () => ({ + mobile: renderMobileRow, + tablet: renderTabletRow, + }), + [renderMobileRow, renderTabletRow], + ); + + const paginationProps = useMemo( + () => ({ + component: 'div', + count: data?.total ?? 0, + rowsPerPage: pageSize, + page: pageIndex, + onPageChange: handleChangePage, + onRowsPerPageChange: handleChangeRowsPerPage, + nextIconButtonProps: { + disabled: isLoading || isLastPage, + }, + backIconButtonProps: { + disabled: isLoading || isFirstPage, + }, + SelectProps: { + disabled: isLoading, + }, + }), + [ + data?.total, + pageIndex, + pageSize, + handleChangePage, + handleChangeRowsPerPage, + isLoading, + isFirstPage, + isLastPage, + ], + ); + + return ( + <> + + + List of Locked Assets + + Showing {paginationProps.page * paginationProps.rowsPerPage + 1} to{' '} + {isLastPage + ? paginationProps.count + : paginationProps.page * paginationProps.rowsPerPage + + paginationProps.rowsPerPage}{' '} + of {paginationProps.count} Entries{' '} + + + + + Network + + + + + {data && ( + + )} + + ); +}; export default Assets; From 738665a02ffdc765372e937da2b27b2165108f13 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 18 Jun 2024 13:57:53 +0330 Subject: [PATCH 002/168] chore: Add expantion panel to each table row in assets page --- apps/rosen/app/assets/TableRow.tsx | 104 +++++++++++++++++++++-------- apps/rosen/app/assets/page.tsx | 21 +++--- 2 files changed, 90 insertions(+), 35 deletions(-) diff --git a/apps/rosen/app/assets/TableRow.tsx b/apps/rosen/app/assets/TableRow.tsx index 42149990..b013a589 100644 --- a/apps/rosen/app/assets/TableRow.tsx +++ b/apps/rosen/app/assets/TableRow.tsx @@ -1,19 +1,16 @@ -import { upperFirst } from 'lodash-es'; -import moment from 'moment'; -import { useState, FC, useMemo } from 'react'; - +import { AngleDown } from '@rosen-bridge/icons'; import { - Button, + Box, + CircularProgress, + Collapse, + Divider, EnhancedTableCell, - TableRow, - Link, - Typography, + IconButton, Id, + TableRow, } from '@rosen-bridge/ui-kit'; - -import { AngleDown, AngleUp } from '@rosen-bridge/icons'; - -import { getDecimalString, getTxURL } from '@rosen-ui/utils'; +import { useState, FC, useMemo } from 'react'; +import useSWRMutation from 'swr/mutation'; import { Asset } from '@/_types/api'; @@ -72,14 +69,15 @@ export const tabletHeader = [ align: 'center' as const, }, }, + { + title: '', + cellProps: { + width: 100, + align: 'center' as const, + }, + }, ]; -const statusMap = { - fraud: 'fraud', - processing: 'processing', - successful: 'done', -}; - export const MobileRow: FC = (props) => { const { isLoading, ...row } = props; const [expand, setExpand] = useState(false); @@ -98,15 +96,67 @@ export const MobileRow: FC = (props) => { export const TabletRow: FC = (props) => { const { isLoading, ...row } = props; + + const [detail, setDetail] = useState(); + + const [expanded, setExpanded] = useState(false); + + const [loading, setLoading] = useState(false); + + // const { trigger } = useSWRMutation(`/assets/detail/${row.id}`,); + + const handleExpandClick = () => { + if (expanded) return setExpanded(false); + if (detail) return setExpanded(true); + setLoading(true); + // trigger().then((response) => { + // setDetail(response) + // setExpanded(true); + // }) + }; + return ( - - {row.name} - - - - {row.chain} - {row.locked} - {row.bridged} - + <> + + {row.name} + + + + {row.chain} + {row.locked} + {row.bridged} + + { + return theme.transitions.create('transform', { + duration: theme.transitions.duration.shortest, + }); + }, + }} + onClick={handleExpandClick} + > + {loading ? ( + + ) : ( + + )} + + + + + + + + + This Box renders as an HTML section element. + + + + + ); }; diff --git a/apps/rosen/app/assets/page.tsx b/apps/rosen/app/assets/page.tsx index db38437e..95ca6f7f 100644 --- a/apps/rosen/app/assets/page.tsx +++ b/apps/rosen/app/assets/page.tsx @@ -143,14 +143,19 @@ const Assets = () => { - {data && ( - + {isFirstLoad && ( + {/* */} + )} + {!isFirstLoad && data && ( + + + )} ); From a55e27525805ff5468fa545597fa8b991a55a298 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 19 Jun 2024 01:10:36 +0330 Subject: [PATCH 003/168] chore: Update assets page --- apps/rosen/app/_types/api.ts | 8 +- apps/rosen/app/assets/TableRow.tsx | 105 ++++++++++++++++++++---- apps/rosen/app/assets/TableSkeleton.tsx | 69 ++++++++++++++++ apps/rosen/app/assets/page.tsx | 13 +-- 4 files changed, 173 insertions(+), 22 deletions(-) create mode 100644 apps/rosen/app/assets/TableSkeleton.tsx diff --git a/apps/rosen/app/_types/api.ts b/apps/rosen/app/_types/api.ts index a79c3874..d80eb2c3 100644 --- a/apps/rosen/app/_types/api.ts +++ b/apps/rosen/app/_types/api.ts @@ -1,4 +1,4 @@ -import { getAssets } from '@/_backend/assets'; +import { getAsset, getAssets } from '@/_backend/assets'; import eventService from '@/_backend/events/event-service'; export type ApiEventResponse = Awaited< @@ -7,5 +7,7 @@ export type ApiEventResponse = Awaited< type ArrayElement = T extends (infer Element)[] ? Element : never; export type Event = ArrayElement; -export type ApiAssetResponse = Awaited>; -export type Asset = ArrayElement; +export type ApiAssetsResponse = Awaited>; +export type Assets = ArrayElement; + +export type ApiAssetResponse = Awaited>; diff --git a/apps/rosen/app/assets/TableRow.tsx b/apps/rosen/app/assets/TableRow.tsx index b013a589..8e0bffc9 100644 --- a/apps/rosen/app/assets/TableRow.tsx +++ b/apps/rosen/app/assets/TableRow.tsx @@ -1,20 +1,26 @@ import { AngleDown } from '@rosen-bridge/icons'; import { + Avatar, Box, CircularProgress, Collapse, Divider, EnhancedTableCell, + Grid, IconButton, Id, + SvgIcon, + Table, + TableBody, + TableCell, TableRow, } from '@rosen-bridge/ui-kit'; import { useState, FC, useMemo } from 'react'; import useSWRMutation from 'swr/mutation'; -import { Asset } from '@/_types/api'; +import { ApiAssetResponse, Assets } from '@/_types/api'; -interface RowProps extends Asset { +interface RowProps extends Assets { isLoading?: boolean; } @@ -38,7 +44,7 @@ export const tabletHeader = [ title: 'Name', cellProps: { width: 150, - align: 'center' as const, + align: 'left' as const, }, }, { @@ -97,28 +103,46 @@ export const MobileRow: FC = (props) => { export const TabletRow: FC = (props) => { const { isLoading, ...row } = props; - const [detail, setDetail] = useState(); + const [detail, setDetail] = useState(); const [expanded, setExpanded] = useState(false); const [loading, setLoading] = useState(false); - // const { trigger } = useSWRMutation(`/assets/detail/${row.id}`,); + const { trigger } = useSWRMutation(`/api/v1/assets/detail/${row.id}`, (url) => + fetch(url, { method: 'GET' }).then((res) => res.json()), + ); const handleExpandClick = () => { if (expanded) return setExpanded(false); + if (detail) return setExpanded(true); + setLoading(true); - // trigger().then((response) => { - // setDetail(response) - // setExpanded(true); - // }) + + trigger() + .then((response) => { + setDetail(response); + setExpanded(true); + }) + .catch(() => { + setExpanded(false); + }) + .finally(() => { + setLoading(false); + }); }; return ( <> - - {row.name} + td': { border: 0 }, + }} + > + {row.name} @@ -127,6 +151,7 @@ export const TabletRow: FC = (props) => { {row.bridged} = (props) => { {loading ? ( ) : ( - + + + )} - + - This Box renders as an HTML section element. + {detail && ( + + + {detail.locked && ( + + + {detail.locked.map((row) => ( + + + T + + + + + {row.amount} + + ))} + +
+ )} +
+ + {detail.bridged && ( + + + {detail.bridged.map((item) => ( + + + T + + {item.chain} + {item.amount} + + ))} + +
+ )} +
+
+ )}
diff --git a/apps/rosen/app/assets/TableSkeleton.tsx b/apps/rosen/app/assets/TableSkeleton.tsx new file mode 100644 index 00000000..0a760bc4 --- /dev/null +++ b/apps/rosen/app/assets/TableSkeleton.tsx @@ -0,0 +1,69 @@ +import { useCallback, useMemo, FC } from 'react'; + +import { + Skeleton, + EnhancedTable, + TableRow, + TableCell, +} from '@rosen-bridge/ui-kit'; + +import { mobileHeader, tabletHeader } from './TableRow'; + +interface TableSkeletonProps { + numberOfItems: number; +} + +const TableSkeleton: FC = (props) => { + const renderMobileRow = useCallback( + () => ( + + {mobileHeader.map((headerItem) => ( + + + + ))} + + ), + [], + ); + + const renderTabletRow = useCallback( + () => ( + + {tabletHeader.map((headerItem) => ( + + + + ))} + + ), + [], + ); + + const tableHeaderProps = useMemo( + () => ({ + mobile: mobileHeader, + tablet: tabletHeader, + }), + [], + ); + + const tableRenderRowProps = useMemo( + () => ({ + mobile: renderMobileRow, + tablet: renderTabletRow, + }), + [renderMobileRow, renderTabletRow], + ); + + return ( + + ); +}; + +export default TableSkeleton; diff --git a/apps/rosen/app/assets/page.tsx b/apps/rosen/app/assets/page.tsx index 95ca6f7f..16b17537 100644 --- a/apps/rosen/app/assets/page.tsx +++ b/apps/rosen/app/assets/page.tsx @@ -13,9 +13,10 @@ import { } from '@rosen-bridge/ui-kit'; import { MouseEvent, useCallback, useMemo, useState } from 'react'; -import { ApiAssetResponse, Asset } from '@/_types/api'; +import { ApiAssetsResponse, Assets } from '@/_types/api'; import { MobileRow, TabletRow, mobileHeader, tabletHeader } from './TableRow'; +import TableSkeleton from './TableSkeleton'; const getKey = (chain: string) => (offset: number, limit: number) => { return [ @@ -37,7 +38,7 @@ const Assets = () => { isFirstLoad, isFirstPage, isLastPage, - } = useTableDataPagination(getKey(network)); + } = useTableDataPagination(getKey(network)); const handleChangeNetwork = (event: any) => { setNetwork(event.target.value as string); @@ -58,12 +59,12 @@ const Assets = () => { ); const renderMobileRow = useCallback( - (rowData: Asset) => , + (rowData: Assets) => , [isLoading], ); const renderTabletRow = useCallback( - (rowData: Asset) => , + (rowData: Assets) => , [isLoading], ); @@ -144,7 +145,9 @@ const Assets = () => { {isFirstLoad && ( - {/* */} + + + )} {!isFirstLoad && data && ( From 06b5a84f551ad6c9c13206f404968eedf523ed2e Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Thu, 20 Jun 2024 17:02:54 +0000 Subject: [PATCH 004/168] chore: Fix assets type --- apps/rosen/app/assets/page.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/rosen/app/assets/page.tsx b/apps/rosen/app/assets/page.tsx index 16b17537..b24ced0c 100644 --- a/apps/rosen/app/assets/page.tsx +++ b/apps/rosen/app/assets/page.tsx @@ -25,7 +25,7 @@ const getKey = (chain: string) => (offset: number, limit: number) => { ]; }; -const Assets = () => { +export default function Page() { const [network, setNetwork] = useState('all'); const { @@ -162,6 +162,4 @@ const Assets = () => { )} ); -}; - -export default Assets; +} From 26b7b19dae81ff0528128910683b3dd16e702496 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Fri, 21 Jun 2024 12:27:12 +0000 Subject: [PATCH 005/168] chore: Update assets page --- apps/rosen/app/assets/DetailsDrawer.tsx | 40 ++++++++ apps/rosen/app/assets/TableRow.tsx | 91 ++++++++++++++++++- apps/rosen/app/assets/page.tsx | 58 +++++++----- .../src/components/base/SwipeableDrawer.tsx | 2 + packages/ui-kit/src/components/base/index.ts | 1 + 5 files changed, 166 insertions(+), 26 deletions(-) create mode 100644 apps/rosen/app/assets/DetailsDrawer.tsx create mode 100644 packages/ui-kit/src/components/base/SwipeableDrawer.tsx diff --git a/apps/rosen/app/assets/DetailsDrawer.tsx b/apps/rosen/app/assets/DetailsDrawer.tsx new file mode 100644 index 00000000..c2474cc5 --- /dev/null +++ b/apps/rosen/app/assets/DetailsDrawer.tsx @@ -0,0 +1,40 @@ +import { SwipeableDrawer } from '@rosen-bridge/ui-kit'; +import { useEffect, useState } from 'react'; +import useSWRMutation from 'swr/mutation'; + +import { ApiAssetResponse } from '@/_types/api'; + +interface DetailsDrawerProps { + id: string; + open: boolean; + onClose: () => void; + onOpen: () => void; +} + +export const DetailsDrawer = ({ + id, + open, + onClose, + onOpen, +}: DetailsDrawerProps) => { + const [data, setData] = useState(); + + const { isMutating, trigger } = useSWRMutation( + `/api/v1/assets/detail/${id}`, + (url) => fetch(url, { method: 'GET' }).then((res) => res.json()), + ); + + useEffect(() => { + if (!id || !open) return; + trigger().then(setData); + }, [id, open, trigger]); + + return ( + + ); +}; diff --git a/apps/rosen/app/assets/TableRow.tsx b/apps/rosen/app/assets/TableRow.tsx index 8e0bffc9..1200e506 100644 --- a/apps/rosen/app/assets/TableRow.tsx +++ b/apps/rosen/app/assets/TableRow.tsx @@ -1,7 +1,8 @@ -import { AngleDown } from '@rosen-bridge/icons'; +import { AngleDown, AngleUp, Eye } from '@rosen-bridge/icons'; import { Avatar, Box, + Button, CircularProgress, Collapse, Divider, @@ -20,6 +21,8 @@ import useSWRMutation from 'swr/mutation'; import { ApiAssetResponse, Assets } from '@/_types/api'; +import { DetailsDrawer } from './DetailsDrawer'; + interface RowProps extends Assets { isLoading?: boolean; } @@ -86,10 +89,19 @@ export const tabletHeader = [ export const MobileRow: FC = (props) => { const { isLoading, ...row } = props; + const [expand, setExpand] = useState(false); + const [open, setOpen] = useState(false); + const rowStyles = useMemo( - () => (isLoading ? { opacity: 0.3 } : {}), + () => ({ + opacity: isLoading ? 0.3 : 1.0, + '& > td': { + border: 0, + padding: 1, + }, + }), [isLoading], ); @@ -97,7 +109,80 @@ export const MobileRow: FC = (props) => { setExpand((prevState) => !prevState); }; - return <>; + return ( + <> + + Name + {row.name} + + + Id + + + + + + Type + {row.chain} + + {expand && ( + <> + + + Locked + + {row.locked} + + + + Bridged + + {row.locked} + + + )} + td': { + border: 0, + }, + }} + > + + + + + {expand && ( + + )} + + + + + + setOpen(false)} + onOpen={() => setOpen(true)} + /> + + ); }; export const TabletRow: FC = (props) => { diff --git a/apps/rosen/app/assets/page.tsx b/apps/rosen/app/assets/page.tsx index b24ced0c..f0e7e14d 100644 --- a/apps/rosen/app/assets/page.tsx +++ b/apps/rosen/app/assets/page.tsx @@ -1,6 +1,7 @@ 'use client'; import { + Box, EnhancedTable, FormControl, Grid, @@ -15,7 +16,7 @@ import { MouseEvent, useCallback, useMemo, useState } from 'react'; import { ApiAssetsResponse, Assets } from '@/_types/api'; -import { MobileRow, TabletRow, mobileHeader, tabletHeader } from './TableRow'; +import { MobileRow, TabletRow, tabletHeader } from './TableRow'; import TableSkeleton from './TableSkeleton'; const getKey = (chain: string) => (offset: number, limit: number) => { @@ -70,7 +71,7 @@ export default function Page() { const tableHeaderProps = useMemo( () => ({ - mobile: mobileHeader, + mobile: [], tablet: tabletHeader, }), [], @@ -116,20 +117,33 @@ export default function Page() { return ( <> - + - List of Locked Assets - - Showing {paginationProps.page * paginationProps.rowsPerPage + 1} to{' '} - {isLastPage - ? paginationProps.count - : paginationProps.page * paginationProps.rowsPerPage + - paginationProps.rowsPerPage}{' '} - of {paginationProps.count} Entries{' '} - + + List of Locked Assets + + Showing {paginationProps.page * paginationProps.rowsPerPage + 1}{' '} + to{' '} + {isLastPage + ? paginationProps.count + : paginationProps.page * paginationProps.rowsPerPage + + paginationProps.rowsPerPage}{' '} + of {paginationProps.count} Entries{' '} + + - - + + Network - All - Bitcoin - Cardano - Ergo - - + + All + Bitcoin + Cardano + Ergo + {isFirstLoad && ( From cb03f33f1a547ea4a26924394041597ed739b7ae Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Thu, 27 Jun 2024 07:46:01 +0000 Subject: [PATCH 010/168] chore: Update assets page fetching data --- apps/rosen/app/assets/DetailsDrawer.tsx | 40 ++++++++++--------------- apps/rosen/app/assets/TableRow.tsx | 29 +++++++++--------- 2 files changed, 29 insertions(+), 40 deletions(-) diff --git a/apps/rosen/app/assets/DetailsDrawer.tsx b/apps/rosen/app/assets/DetailsDrawer.tsx index ad28d744..6a737024 100644 --- a/apps/rosen/app/assets/DetailsDrawer.tsx +++ b/apps/rosen/app/assets/DetailsDrawer.tsx @@ -11,8 +11,9 @@ import { Typography, CircularProgress, } from '@rosen-bridge/ui-kit'; -import { useEffect, useState } from 'react'; -import useSWRMutation from 'swr/mutation'; + +import useSWR from 'swr'; +import { fetcher } from '@rosen-ui/swr-helpers'; import { ApiAssetResponse, Assets } from '@/_types/api'; @@ -23,22 +24,11 @@ interface DetailsDrawerProps { } export const DetailsDrawer = ({ asset, open, onClose }: DetailsDrawerProps) => { - const id = asset.id; - - const [detail, setDetail] = useState(); - - const { isMutating, trigger } = useSWRMutation( - `/api/v1/assets/detail/${id}`, - (url) => fetch(url, { method: 'GET' }).then((res) => res.json()), + const { data, isLoading } = useSWR( + open ? `/v1/assets/detail/${asset.id}` : null, + fetcher, ); - useEffect(() => { - if (!id || !open) return; - trigger() - .then(setDetail) - .catch(() => onClose()); - }, [id, open, trigger, onClose]); - return ( { onClose={onClose} > - {isMutating && ( + {isLoading && ( )} - {!isMutating && detail && ( + {!isLoading && data && ( Name - {detail.token.name} + {data.token.name} Id - {detail.token.id} + {data.token.id} Type - {detail.token.chain} + {data.token.chain} Locked @@ -83,10 +73,10 @@ export const DetailsDrawer = ({ asset, open, onClose }: DetailsDrawerProps) => { Locked - {detail.locked && ( + {data.locked && ( - {detail.locked.map((row) => ( + {data.locked.map((row) => ( { Bridged - {detail.bridged && ( + {data.bridged && (
- {detail.bridged.map((item) => ( + {data.bridged.map((item) => ( = (props) => { const [expanded, setExpanded] = useState(false); - const [loading, setLoading] = useState(false); + const [shouldFetch, setShouldFetch] = useState(false); - const { trigger } = useSWRMutation(`/api/v1/assets/detail/${row.id}`, (url) => - fetch(url, { method: 'GET' }).then((res) => res.json()), + const { data, isLoading: loading } = useSWR( + shouldFetch ? `/v1/assets/detail/${row.id}` : null, + fetcher, ); const handleExpandClick = () => { @@ -200,18 +202,15 @@ export const TabletRow: FC = (props) => { if (detail) return setExpanded(true); - setLoading(true); - - trigger() - .then((response) => { - setDetail(response); - setExpanded(true); - }) - .finally(() => { - setLoading(false); - }); + setShouldFetch(true); }; + useEffect(() => { + if (!data) return; + setDetail(data); + setExpanded(true); + }, [data]); + return ( <> Date: Thu, 27 Jun 2024 10:15:47 +0000 Subject: [PATCH 011/168] chore: Update amount previewing on assets page. --- apps/rosen/app/assets/DetailsDrawer.tsx | 23 ++++++++++++++++------- apps/rosen/app/assets/TableRow.tsx | 22 +++++++++++++++------- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/apps/rosen/app/assets/DetailsDrawer.tsx b/apps/rosen/app/assets/DetailsDrawer.tsx index 6a737024..1098cc67 100644 --- a/apps/rosen/app/assets/DetailsDrawer.tsx +++ b/apps/rosen/app/assets/DetailsDrawer.tsx @@ -16,6 +16,7 @@ import useSWR from 'swr'; import { fetcher } from '@rosen-ui/swr-helpers'; import { ApiAssetResponse, Assets } from '@/_types/api'; +import { getDecimalString } from '@rosen-ui/utils'; interface DetailsDrawerProps { asset: Assets; @@ -65,11 +66,15 @@ export const DetailsDrawer = ({ asset, open, onClose }: DetailsDrawerProps) => { Locked - {asset.locked} + + {getDecimalString(asset.locked, asset.decimal)} + Bridged - {asset.bridged} + + {getDecimalString(asset.bridged, asset.decimal)} + Locked @@ -87,7 +92,9 @@ export const DetailsDrawer = ({ asset, open, onClose }: DetailsDrawerProps) => { - {row.amount} + + {getDecimalString(row.amount, asset.decimal)} + ))} @@ -99,16 +106,18 @@ export const DetailsDrawer = ({ asset, open, onClose }: DetailsDrawerProps) => { {data.bridged && (
- {data.bridged.map((item) => ( + {data.bridged.map((row) => ( T - {item.chain} - {item.amount} + {row.chain} + + {getDecimalString(row.amount, asset.decimal)} + ))} diff --git a/apps/rosen/app/assets/TableRow.tsx b/apps/rosen/app/assets/TableRow.tsx index f549e854..6e5e7cdc 100644 --- a/apps/rosen/app/assets/TableRow.tsx +++ b/apps/rosen/app/assets/TableRow.tsx @@ -134,13 +134,17 @@ export const MobileRow: FC = (props) => { Locked - {row.locked} + + {getDecimalString(row.locked, row.decimal)} + Bridged - {row.locked} + + {getDecimalString(row.bridged, row.decimal)} + )} @@ -273,18 +277,20 @@ export const TabletRow: FC = (props) => { {detail.locked && (
- {detail.locked.map((row) => ( + {detail.locked.map((item) => ( T - + + + + {getDecimalString(item.amount, row.decimal)} - {row.amount} ))} @@ -305,7 +311,9 @@ export const TabletRow: FC = (props) => { T {item.chain} - {item.amount} + + {getDecimalString(item.amount, row.decimal)} + ))} From b90e8c9d2673dc553e0caed7203c0f7cf6765eb6 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Thu, 27 Jun 2024 10:42:02 +0000 Subject: [PATCH 012/168] chore: Update loading data in assets page --- apps/rosen/app/assets/TableRow.tsx | 38 +++++++++--------------------- 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/apps/rosen/app/assets/TableRow.tsx b/apps/rosen/app/assets/TableRow.tsx index 6e5e7cdc..6d6d05e2 100644 --- a/apps/rosen/app/assets/TableRow.tsx +++ b/apps/rosen/app/assets/TableRow.tsx @@ -190,30 +190,14 @@ export const MobileRow: FC = (props) => { export const TabletRow: FC = (props) => { const { isLoading, ...row } = props; - const [detail, setDetail] = useState(); - const [expanded, setExpanded] = useState(false); - const [shouldFetch, setShouldFetch] = useState(false); - - const { data, isLoading: loading } = useSWR( - shouldFetch ? `/v1/assets/detail/${row.id}` : null, + const { data, isLoading: loading } = useSWR( + expanded ? `/v1/assets/detail/${row.id}` : null, fetcher, ); - const handleExpandClick = () => { - if (expanded) return setExpanded(false); - - if (detail) return setExpanded(true); - - setShouldFetch(true); - }; - - useEffect(() => { - if (!data) return; - setDetail(data); - setExpanded(true); - }, [data]); + const open = expanded && data && !loading; return ( <> @@ -240,7 +224,7 @@ export const TabletRow: FC = (props) => { size="small" disabled={loading} sx={{ - transform: !expanded ? 'rotate(0deg)' : 'rotate(180deg)', + transform: !open ? 'rotate(0deg)' : 'rotate(180deg)', marginLeft: 'auto', transition: (theme) => { return theme.transitions.create('transform', { @@ -248,7 +232,7 @@ export const TabletRow: FC = (props) => { }); }, }} - onClick={handleExpandClick} + onClick={() => setExpanded(!open)} > {loading ? ( @@ -267,17 +251,17 @@ export const TabletRow: FC = (props) => { }} > - + - {detail && ( + {data && ( Locked - {detail.locked && ( + {data.locked && (
- {detail.locked.map((item) => ( + {data.locked.map((item) => ( = (props) => { Bridged - {detail.bridged && ( + {data.bridged && (
- {detail.bridged.map((item) => ( + {data.bridged.map((item) => ( Date: Sat, 29 Jun 2024 07:18:22 +0000 Subject: [PATCH 013/168] chore: Update assets page --- apps/rosen/app/assets/TableRow.tsx | 170 ++++++++++++++--------- packages/icons/src/icons/open-in-new.svg | 3 + packages/icons/src/index.ts | 1 + 3 files changed, 108 insertions(+), 66 deletions(-) create mode 100644 packages/icons/src/icons/open-in-new.svg diff --git a/apps/rosen/app/assets/TableRow.tsx b/apps/rosen/app/assets/TableRow.tsx index 6d6d05e2..3546b50d 100644 --- a/apps/rosen/app/assets/TableRow.tsx +++ b/apps/rosen/app/assets/TableRow.tsx @@ -1,4 +1,10 @@ -import { AngleDown, AngleUp, Eye } from '@rosen-bridge/icons'; +import { + AngleDown, + AngleUp, + SquareShape, + Eye, + OpenInNew, +} from '@rosen-bridge/icons'; import { Avatar, Box, @@ -10,6 +16,8 @@ import { Grid, IconButton, Id, + Link, + Stack, SvgIcon, Table, TableBody, @@ -17,7 +25,7 @@ import { TableRow, Typography, } from '@rosen-bridge/ui-kit'; -import { useState, FC, useMemo, useEffect } from 'react'; +import { useState, FC, useMemo } from 'react'; import useSWR from 'swr'; import { fetcher } from '@rosen-ui/swr-helpers'; @@ -49,26 +57,33 @@ export const tabletHeader = [ { title: 'Name', cellProps: { - width: 150, + width: 200, align: 'left' as const, }, }, { - title: 'Id', + title: 'Network', cellProps: { - width: 300, - align: 'left' as const, + width: 150, + align: 'center' as const, }, }, { - title: 'Type', + title: 'Locked', cellProps: { width: 150, align: 'center' as const, }, }, { - title: 'Locked', + title: 'Hot', + cellProps: { + width: 150, + align: 'center' as const, + }, + }, + { + title: 'Cold', cellProps: { width: 150, align: 'center' as const, @@ -208,16 +223,52 @@ export const TabletRow: FC = (props) => { '& > td': { border: 0 }, }} > - {row.name} - + + + + + {row.name} + + + + + + + + + + + + + {row.chain} + + + + {getDecimalString(row.locked, row.decimal)} - {row.chain} {getDecimalString(row.locked, row.decimal)} - {getDecimalString(row.bridged, row.decimal)} + + HOT + + + + + + + + + + COLD + + + + + + = (props) => { - - {data && ( - - - Locked - {data.locked && ( -
- - {data.locked.map((item) => ( - - - T - - - - - - {getDecimalString(item.amount, row.decimal)} - - - ))} - -
- )} -
- - Bridged - {data.bridged && ( - - - {data.bridged.map((item) => ( - - - T - - {item.chain} - - {getDecimalString(item.amount, row.decimal)} - - - ))} - -
- )} -
-
- )} -
+ {data && ( + + {data.bridged && ( + + + {data.bridged.map((item) => ( + + + + + + + {item.chain} + + + + {getDecimalString(item.amount, row.decimal)} + + + + ID + + + + + + + + + ))} + +
+ )} +
+ )}
diff --git a/packages/icons/src/icons/open-in-new.svg b/packages/icons/src/icons/open-in-new.svg new file mode 100644 index 00000000..d1a592bd --- /dev/null +++ b/packages/icons/src/icons/open-in-new.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/icons/src/index.ts b/packages/icons/src/index.ts index b62cf8be..501cd562 100644 --- a/packages/icons/src/index.ts +++ b/packages/icons/src/index.ts @@ -23,6 +23,7 @@ export { ReactComponent as Moneybag } from './icons/moneybag.svg'; export { ReactComponent as MoneyWithdrawal } from './icons/money-withdrawal.svg'; export { ReactComponent as Moon } from './icons/moon.svg'; export { ReactComponent as Newspaper } from './icons/newspaper.svg'; +export { ReactComponent as OpenInNew } from './icons/open-in-new.svg'; export { ReactComponent as Pause } from './icons/pause.svg'; export { ReactComponent as PauseCircle } from './icons/pause-circle.svg'; export { ReactComponent as QrcodeScan } from './icons/qrcode-scan.svg'; From 8d7f79529ca0a083dcf15f4f9e6993f658a9cd17 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 29 Jun 2024 07:57:04 +0000 Subject: [PATCH 014/168] fix: Fix bridged amount in assets page --- apps/rosen/app/assets/TableRow.tsx | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/apps/rosen/app/assets/TableRow.tsx b/apps/rosen/app/assets/TableRow.tsx index 3546b50d..2f49bd9e 100644 --- a/apps/rosen/app/assets/TableRow.tsx +++ b/apps/rosen/app/assets/TableRow.tsx @@ -65,42 +65,42 @@ export const tabletHeader = [ title: 'Network', cellProps: { width: 150, - align: 'center' as const, + align: 'left' as const, }, }, { title: 'Locked', cellProps: { width: 150, - align: 'center' as const, + align: 'left' as const, }, }, { title: 'Hot', cellProps: { width: 150, - align: 'center' as const, + align: 'left' as const, }, }, { title: 'Cold', cellProps: { width: 150, - align: 'center' as const, + align: 'left' as const, }, }, { title: 'Bridged', cellProps: { width: 150, - align: 'center' as const, + align: 'left' as const, }, }, { title: '', cellProps: { width: 100, - align: 'center' as const, + align: 'left' as const, }, }, ]; @@ -236,7 +236,7 @@ export const TabletRow: FC = (props) => { - + @@ -244,13 +244,10 @@ export const TabletRow: FC = (props) => { {row.chain} - - {getDecimalString(row.locked, row.decimal)} - - + {getDecimalString(row.locked, row.decimal)} - + HOT @@ -260,7 +257,7 @@ export const TabletRow: FC = (props) => { - + COLD @@ -270,7 +267,10 @@ export const TabletRow: FC = (props) => { - + + {getDecimalString(row.bridged, row.decimal)} + + Date: Wed, 3 Jul 2024 05:45:26 +0000 Subject: [PATCH 015/168] init: Add a utils for server actions --- apps/rosen/app/_error-handling/config.ts | 7 +++ apps/rosen/app/_error-handling/usage.ts | 17 +++++++ apps/rosen/app/_error-handling/wrapper.ts | 60 +++++++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 apps/rosen/app/_error-handling/config.ts create mode 100644 apps/rosen/app/_error-handling/usage.ts create mode 100644 apps/rosen/app/_error-handling/wrapper.ts diff --git a/apps/rosen/app/_error-handling/config.ts b/apps/rosen/app/_error-handling/config.ts new file mode 100644 index 00000000..dcf148e3 --- /dev/null +++ b/apps/rosen/app/_error-handling/config.ts @@ -0,0 +1,7 @@ +import { PROPERTY_NAME, WrapError, create } from './wrapper'; + +export class MyError extends WrapError { + static [PROPERTY_NAME] = 'my-error'; +} + +export const { wrap, unwrap } = create(MyError); diff --git a/apps/rosen/app/_error-handling/usage.ts b/apps/rosen/app/_error-handling/usage.ts new file mode 100644 index 00000000..274fca09 --- /dev/null +++ b/apps/rosen/app/_error-handling/usage.ts @@ -0,0 +1,17 @@ +'use server'; + +import { MyError, wrap } from './config'; + +const serverAction = async ( + param1: string, + param2: number, +): Promise => { + if (Math.random() > 0.5) { + throw new MyError('this is a message'); + } + return [1]; +}; +export const serverActionWrapped = wrap(serverAction); + +// const clientAction = unwrap(serverActionWrapped); +// const result = await clientAction('param1', 5); diff --git a/apps/rosen/app/_error-handling/wrapper.ts b/apps/rosen/app/_error-handling/wrapper.ts new file mode 100644 index 00000000..5452a7cc --- /dev/null +++ b/apps/rosen/app/_error-handling/wrapper.ts @@ -0,0 +1,60 @@ +type AsyncFunction = (...args: any[]) => Promise; + +type Wrap = ( + func: Func, +) => ( + ...args: Parameters +) => Promise> | WrapError>; + +type Unwrap = ( + func: Func, +) => ( + ...args: Parameters +) => Promise>, WrapError>>; + +export const PROPERTY_NAME = '__TYPE__'; + +export class WrapError extends Error { + static [PROPERTY_NAME] = 'default'; +} + +export const create = (...errors: Array) => { + const wrap: Wrap = + (func) => + async (...args) => { + try { + return await func(...args); + } catch (error: any) { + return { + message: error.message, + [PROPERTY_NAME]: error.constructor[PROPERTY_NAME], + }; + } + }; + + const unwrap: Unwrap = + (func) => + async (...args) => { + const result = await func(...args); + + if (Object.prototype.toString.call(result) != '[object Object]') + return result; + + for (const err of errors) { + if (err[PROPERTY_NAME] != result[PROPERTY_NAME]) continue; + + const error = new err(result.message); + + for (const key in result) { + if (!Object.prototype.hasOwnProperty.call(result, key)) continue; + (error as any)[key] = result[key]; + } + + throw error; + } + + return result; + }; + + return { wrap, unwrap }; +}; From a3194f480c49ad9e480f236c4ce4c17f2b6e93f1 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 3 Jul 2024 07:39:04 +0000 Subject: [PATCH 016/168] feat: Implement an error handling utility for the server actions --- .changeset/wise-badgers-shake.md | 5 ++++ apps/rosen/app/_error-handling/config.ts | 7 ----- apps/rosen/app/_error-handling/usage.ts | 17 ----------- apps/rosen/app/_errors/config.ts | 9 ++++++ .../wrapper.ts => _errors/core.ts} | 29 +++++++------------ apps/rosen/app/_errors/index.ts | 1 + 6 files changed, 25 insertions(+), 43 deletions(-) create mode 100644 .changeset/wise-badgers-shake.md delete mode 100644 apps/rosen/app/_error-handling/config.ts delete mode 100644 apps/rosen/app/_error-handling/usage.ts create mode 100644 apps/rosen/app/_errors/config.ts rename apps/rosen/app/{_error-handling/wrapper.ts => _errors/core.ts} (52%) create mode 100644 apps/rosen/app/_errors/index.ts diff --git a/.changeset/wise-badgers-shake.md b/.changeset/wise-badgers-shake.md new file mode 100644 index 00000000..7b7cdaa1 --- /dev/null +++ b/.changeset/wise-badgers-shake.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': minor +--- + +Implement an error handling utility for the server actions diff --git a/apps/rosen/app/_error-handling/config.ts b/apps/rosen/app/_error-handling/config.ts deleted file mode 100644 index dcf148e3..00000000 --- a/apps/rosen/app/_error-handling/config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { PROPERTY_NAME, WrapError, create } from './wrapper'; - -export class MyError extends WrapError { - static [PROPERTY_NAME] = 'my-error'; -} - -export const { wrap, unwrap } = create(MyError); diff --git a/apps/rosen/app/_error-handling/usage.ts b/apps/rosen/app/_error-handling/usage.ts deleted file mode 100644 index 274fca09..00000000 --- a/apps/rosen/app/_error-handling/usage.ts +++ /dev/null @@ -1,17 +0,0 @@ -'use server'; - -import { MyError, wrap } from './config'; - -const serverAction = async ( - param1: string, - param2: number, -): Promise => { - if (Math.random() > 0.5) { - throw new MyError('this is a message'); - } - return [1]; -}; -export const serverActionWrapped = wrap(serverAction); - -// const clientAction = unwrap(serverActionWrapped); -// const result = await clientAction('param1', 5); diff --git a/apps/rosen/app/_errors/config.ts b/apps/rosen/app/_errors/config.ts new file mode 100644 index 00000000..77a260b2 --- /dev/null +++ b/apps/rosen/app/_errors/config.ts @@ -0,0 +1,9 @@ +import { create } from './core'; + +const KEY = '__TYPE__'; + +export class MyError extends Error { + static [KEY] = 'my-error'; +} + +export const { wrap, unwrap } = create(KEY, [MyError]); diff --git a/apps/rosen/app/_error-handling/wrapper.ts b/apps/rosen/app/_errors/core.ts similarity index 52% rename from apps/rosen/app/_error-handling/wrapper.ts rename to apps/rosen/app/_errors/core.ts index 5452a7cc..66d65905 100644 --- a/apps/rosen/app/_error-handling/wrapper.ts +++ b/apps/rosen/app/_errors/core.ts @@ -4,21 +4,17 @@ type Wrap = ( func: Func, ) => ( ...args: Parameters -) => Promise> | WrapError>; +) => Promise> | WrapResult>; type Unwrap = ( func: Func, ) => ( ...args: Parameters -) => Promise>, WrapError>>; +) => Promise>, WrapResult>>; -export const PROPERTY_NAME = '__TYPE__'; +export class WrapResult {} -export class WrapError extends Error { - static [PROPERTY_NAME] = 'default'; -} - -export const create = (...errors: Array) => { +export const create = (key: string, errors: Array) => { const wrap: Wrap = (func) => async (...args) => { @@ -27,7 +23,7 @@ export const create = (...errors: Array) => { } catch (error: any) { return { message: error.message, - [PROPERTY_NAME]: error.constructor[PROPERTY_NAME], + [key]: error.constructor[key] || 'unknown', }; } }; @@ -40,20 +36,15 @@ export const create = (...errors: Array) => { if (Object.prototype.toString.call(result) != '[object Object]') return result; - for (const err of errors) { - if (err[PROPERTY_NAME] != result[PROPERTY_NAME]) continue; - - const error = new err(result.message); + if (!(key in result)) return result; - for (const key in result) { - if (!Object.prototype.hasOwnProperty.call(result, key)) continue; - (error as any)[key] = result[key]; + for (const err of errors) { + if (err[key] == result[key]) { + throw new err(result.message); } - - throw error; } - return result; + throw new Error(result.message); }; return { wrap, unwrap }; diff --git a/apps/rosen/app/_errors/index.ts b/apps/rosen/app/_errors/index.ts new file mode 100644 index 00000000..f03c2281 --- /dev/null +++ b/apps/rosen/app/_errors/index.ts @@ -0,0 +1 @@ +export * from './config'; From 4888b9aa920d477a0e43a6d2380d149ee72649d3 Mon Sep 17 00:00:00 2001 From: Mohammad Kermani Date: Wed, 3 Jul 2024 08:50:36 +0000 Subject: [PATCH 017/168] feat(rosen-app): add `bridgedTokenId` to asset details API response --- .changeset/famous-zebras-attend.md | 5 +++++ apps/rosen/app/_backend/assets/repository.ts | 12 +++++++----- apps/rosen/app/_backend/assets/services.ts | 1 + 3 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 .changeset/famous-zebras-attend.md diff --git a/.changeset/famous-zebras-attend.md b/.changeset/famous-zebras-attend.md new file mode 100644 index 00000000..1788c082 --- /dev/null +++ b/.changeset/famous-zebras-attend.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': minor +--- + +Add token id of the bridged asset to asset details API response diff --git a/apps/rosen/app/_backend/assets/repository.ts b/apps/rosen/app/_backend/assets/repository.ts index 580f1526..767e62dc 100644 --- a/apps/rosen/app/_backend/assets/repository.ts +++ b/apps/rosen/app/_backend/assets/repository.ts @@ -42,11 +42,13 @@ export const getAsset = async (id: string) => { throw new NotFoundError(`Token with id [${id}] not found`); } - const bridged: Pick[] = - await bridgedAssetRepository.find({ - where: { tokenId: id }, - select: ['amount', 'chain'], - }); + const bridged: Pick< + BridgedAssetEntity, + 'amount' | 'chain' | 'bridgedTokenId' + >[] = await bridgedAssetRepository.find({ + where: { tokenId: id }, + select: ['amount', 'chain', 'bridgedTokenId'], + }); const locked: Pick[] = await lockedAssetRepository.find({ diff --git a/apps/rosen/app/_backend/assets/services.ts b/apps/rosen/app/_backend/assets/services.ts index 40abe3d6..44f57b8a 100644 --- a/apps/rosen/app/_backend/assets/services.ts +++ b/apps/rosen/app/_backend/assets/services.ts @@ -21,6 +21,7 @@ export const getAsset = async (id: string) => { bridged: assetDetails.bridged.map((bridgedItem) => ({ chain: bridgedItem.chain, amount: bridgedItem.amount.toString(), + birdgedTokenId: bridgedItem.bridgedTokenId })), }; }; From 539498c9dfa353347afadbb958e8cc9929250360 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 3 Jul 2024 10:41:47 +0000 Subject: [PATCH 018/168] chore: Update error handler logic --- apps/rosen/app/_errors/config.ts | 6 +-- apps/rosen/app/_errors/core.ts | 79 +++++++++++++++++++++++++++++--- 2 files changed, 74 insertions(+), 11 deletions(-) diff --git a/apps/rosen/app/_errors/config.ts b/apps/rosen/app/_errors/config.ts index 77a260b2..6c1a0f7c 100644 --- a/apps/rosen/app/_errors/config.ts +++ b/apps/rosen/app/_errors/config.ts @@ -2,8 +2,4 @@ import { create } from './core'; const KEY = '__TYPE__'; -export class MyError extends Error { - static [KEY] = 'my-error'; -} - -export const { wrap, unwrap } = create(KEY, [MyError]); +export const { wrap, unwrap } = create(KEY, []); diff --git a/apps/rosen/app/_errors/core.ts b/apps/rosen/app/_errors/core.ts index 66d65905..317e34ec 100644 --- a/apps/rosen/app/_errors/core.ts +++ b/apps/rosen/app/_errors/core.ts @@ -4,48 +4,115 @@ type Wrap = ( func: Func, ) => ( ...args: Parameters -) => Promise> | WrapResult>; +) => Promise> | WrapError>; type Unwrap = ( func: Func, ) => ( ...args: Parameters -) => Promise>, WrapResult>>; +) => Promise>, WrapError>>; -export class WrapResult {} +/** + * Interface representing the result of an error. + */ +export interface WrapError {} +/** + * Factory function to create wrap and unwrap functions. + * + * @param key - A string key used to identify errors. + * @param errors - An array of error classes for handling. + * + * @returns An object containing the wrap and unwrap functions. + * + * @example + * ``` + * // common.ts + * const KEY = 'THIS_A_KEY'; + * class MyError extends Error { + * static [KEY] = 'my-error'; + * } + * const { wrap, unwrap } = create(KEY, [MyError]); + * + * // server.ts + * import { wrap } from './common.ts'; + * const greet = async (name: string) => { + * if (Math.random() > 0.5) throw new MyError('BOM'); + * return 'Hello ' + name; + * } + * export const wrapped = wrap(greet); + * + * // client.ts + * import { unwrap } from './common.ts'; + * import { wrapped } from './server.ts'; + * const unwrapped = unwrap(wrapped); + * try { + * await unwrapped('John'); // Hello John + * } catch (error) { + * if (error instanceof MyError) { + * // do + * } + * } + * ``` + */ export const create = (key: string, errors: Array) => { + /** + * Convert the asynchronous function to a transferable type. + * + * @param func - The asynchronous function to convert. + * @returns A new converted asynchronous function. + */ const wrap: Wrap = (func) => async (...args) => { try { + // Attempt to execute the asynchronous function with the provided arguments. return await func(...args); - } catch (error: any) { + } catch (error: unknown) { + // If an error is thrown, return a WrapError object. + if (error instanceof Error) { + return { + message: error.message, + [key]: (error.constructor as any)[key] || 'unknown', + }; + } return { - message: error.message, - [key]: error.constructor[key] || 'unknown', + message: String(error), + [key]: 'unknown', }; } }; + /** + * Recover the original asynchronous function. + * + * @param func - The converted asynchronous function. + * @returns A new recovered asynchronous function. + */ const unwrap: Unwrap = (func) => async (...args) => { + // Execute the asynchronous function with the provided arguments. const result = await func(...args); + // Return result if it not an object. if (Object.prototype.toString.call(result) != '[object Object]') return result; + // Return result if the key is not in the object. if (!(key in result)) return result; + // Try to reproduce the related error. for (const err of errors) { if (err[key] == result[key]) { throw new err(result.message); } } + // Throw a generic error. throw new Error(result.message); }; + // Return an object containing the wrap and unwrap functions. return { wrap, unwrap }; }; From 79120467231b5de44557f371577542c84c2966b8 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 3 Jul 2024 11:26:42 +0000 Subject: [PATCH 019/168] fix: Update WrapError interface --- apps/rosen/app/_errors/core.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/rosen/app/_errors/core.ts b/apps/rosen/app/_errors/core.ts index 317e34ec..1e962fd9 100644 --- a/apps/rosen/app/_errors/core.ts +++ b/apps/rosen/app/_errors/core.ts @@ -15,7 +15,7 @@ type Unwrap = ( /** * Interface representing the result of an error. */ -export interface WrapError {} +export interface WrapError extends Error {} /** * Factory function to create wrap and unwrap functions. From 18332fc8dc52873ce329165a88e936cc2e766805 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 3 Jul 2024 12:24:04 +0000 Subject: [PATCH 020/168] fix: Update the server actions based on new error handler --- apps/rosen/app/_actions/calculateFee.ts | 79 +++++++++------------ apps/rosen/app/_actions/validateAddress.ts | 6 +- apps/rosen/app/_hooks/useBridgeForm.ts | 14 ++-- apps/rosen/app/_hooks/useTransactionFees.ts | 40 +++++++---- apps/rosen/app/_utils/index.ts | 37 ++++++---- 5 files changed, 94 insertions(+), 82 deletions(-) diff --git a/apps/rosen/app/_actions/calculateFee.ts b/apps/rosen/app/_actions/calculateFee.ts index 68bc8d97..4d664282 100644 --- a/apps/rosen/app/_actions/calculateFee.ts +++ b/apps/rosen/app/_actions/calculateFee.ts @@ -15,6 +15,7 @@ const ergoExplorerClient = ergoExplorerClientFactory( import { Networks } from '@rosen-ui/constants'; import { ERGO_EXPLORER_URL, feeConfigTokenId } from '@/_constants'; import { AvailableNetworks } from '@/_networks'; +import { wrap } from '@/_errors'; const GetHeight = { [Networks.CARDANO]: async () => @@ -39,53 +40,43 @@ const GetHeight = { * @param nextHeightInterval */ -export const calculateFee = async ( - sourceNetwork: AvailableNetworks, - targetNetwork: AvailableNetworks, - tokenId: string, - nextHeightInterval: number, -) => { - try { - const height = await GetHeight[sourceNetwork](); +export const calculateFee = wrap( + async ( + sourceNetwork: AvailableNetworks, + targetNetwork: AvailableNetworks, + tokenId: string, + nextHeightInterval: number, + ) => { + try { + const height = await GetHeight[sourceNetwork](); - if (!height) { - return { - tokenId, - status: 'error', - message: 'Cannot fetch height from the api endpoint', - }; - } + if (!height) { + throw new Error('Cannot fetch height from the api endpoint'); + } - const minFeeBox = new MinimumFeeBox( - tokenId, - feeConfigTokenId, - ErgoNetworkType.explorer, - ERGO_EXPLORER_URL, - ); - await minFeeBox.fetchBox(); + const minFeeBox = new MinimumFeeBox( + tokenId, + feeConfigTokenId, + ErgoNetworkType.explorer, + ERGO_EXPLORER_URL, + ); + await minFeeBox.fetchBox(); - const [fees, nextFees] = await Promise.all([ - minFeeBox.getFee(sourceNetwork, height, targetNetwork), - minFeeBox.getFee( - sourceNetwork, - height + nextHeightInterval, - targetNetwork, - ), - ]); + const [fees, nextFees] = await Promise.all([ + minFeeBox.getFee(sourceNetwork, height, targetNetwork), + minFeeBox.getFee( + sourceNetwork, + height + nextHeightInterval, + targetNetwork, + ), + ]); - return { - status: 'success', - tokenId, - data: JsonBigInt.stringify({ + return JsonBigInt.stringify({ fees, nextFees, - }), - }; - } catch (error) { - return { - tokenId, - status: 'error', - message: error instanceof Error ? error.message : 'Unknown Error', - }; - } -}; + }); + } catch (error) { + throw new Error(error instanceof Error ? error.message : 'Unknown Error'); + } + }, +); diff --git a/apps/rosen/app/_actions/validateAddress.ts b/apps/rosen/app/_actions/validateAddress.ts index d4290ba1..e9b1a8d7 100644 --- a/apps/rosen/app/_actions/validateAddress.ts +++ b/apps/rosen/app/_actions/validateAddress.ts @@ -12,7 +12,7 @@ import { isValidAddress } from '@rosen-network/bitcoin'; * @param walletAddress - wallet address to verify * @returns the validation results for the passed address */ -export const validateAddress = ( +export const validateAddress = async ( chain: AvailableNetworks, walletAddress: string, ) => { @@ -26,8 +26,8 @@ export const validateAddress = ( throw new Error(); } } - return { isValid: true }; + return true; } catch { - return { isValid: false, message: 'Invalid Address' }; + return false; } }; diff --git a/apps/rosen/app/_hooks/useBridgeForm.ts b/apps/rosen/app/_hooks/useBridgeForm.ts index b8db2da4..197f28c9 100644 --- a/apps/rosen/app/_hooks/useBridgeForm.ts +++ b/apps/rosen/app/_hooks/useBridgeForm.ts @@ -128,12 +128,16 @@ const useBridgeForm = () => { return validationCache.get(cacheKey); } - const validationResult = ( - await validateAddress(targetField.value, value) - ).message; - validationCache.set(cacheKey, validationResult); + const validationResult = await validateAddress( + targetField.value, + value, + ); + + const message = validationResult ? undefined : 'Invalid Address'; + + validationCache.set(cacheKey, message); - return validationResult; + return message; }, }, }); diff --git a/apps/rosen/app/_hooks/useTransactionFees.ts b/apps/rosen/app/_hooks/useTransactionFees.ts index 4e7bef5c..bdca164c 100644 --- a/apps/rosen/app/_hooks/useTransactionFees.ts +++ b/apps/rosen/app/_hooks/useTransactionFees.ts @@ -11,6 +11,7 @@ import { useTokensMap } from './useTokensMap'; import { calculateFee } from '@/_actions/calculateFee'; import { AvailableNetworks } from '@/_networks'; +import { unwrap } from '@/_errors'; /** * calculates the fees for a token swap between @@ -71,18 +72,18 @@ const useTransactionFees = ( !pending ) { startTransition(async () => { - const data = await calculateFee( - sourceChain, - targetChain, - tokenId, - selectedNetwork.nextHeightInterval, - ); - if (data.status === 'success') { - const parsedData = { - ...data, - data: JsonBigInt.parse(data.data!), - }; - const { fees, nextFees } = parsedData.data; + try { + const data = await unwrap(calculateFee)( + sourceChain, + targetChain, + tokenId, + selectedNetwork.nextHeightInterval, + ); + + const parsedData = JsonBigInt.parse(data); + + const { fees, nextFees } = parsedData; + if ( fees.bridgeFee !== nextFees.bridgeFee || fees.networkFee !== nextFees.networkFee @@ -92,10 +93,19 @@ const useTransactionFees = ( 'warning', ); } - feeInfo.current = parsedData; - } else if (data.status === 'error') { + + feeInfo.current = { + tokenId, + tatus: 'success', + data: parsedData, + }; + } catch (error: any) { openSnackbar('something went wrong! please try again', 'error'); - feeInfo.current = data; + feeInfo.current = { + tokenId, + status: 'error', + message: error?.message || error, + }; } }); } diff --git a/apps/rosen/app/_utils/index.ts b/apps/rosen/app/_utils/index.ts index bfe4cfb7..273009e5 100644 --- a/apps/rosen/app/_utils/index.ts +++ b/apps/rosen/app/_utils/index.ts @@ -7,6 +7,7 @@ import { calculateFee } from '@/_actions/calculateFee'; import { Networks } from '@rosen-ui/constants'; import { AvailableNetworks } from '@/_networks'; +import { unwrap } from '@/_errors'; /** * a utility to make unique interface for accessing token name @@ -42,22 +43,28 @@ export const getMinTransfer = async ( }); const ergoTokenId = tokens[0].ergo.tokenId; - const data = await calculateFee(sourceChain, targetChain, ergoTokenId, 0); - const parsedData = { - ...data, - data: JsonBigInt.parse(data.data!), - }; - const { fees } = parsedData.data; + try { + const data = await unwrap(calculateFee)( + sourceChain, + targetChain, + ergoTokenId, + 0, + ); - const networkFee = fees ? Number(fees.networkFee) : 0; - const bridgeFee = fees ? Number(fees.bridgeFee) : 0; + const { fees } = JsonBigInt.parse(data); - const minTransfer = bridgeFee + networkFee; + const networkFee = fees ? Number(fees.networkFee) : 0; + const bridgeFee = fees ? Number(fees.bridgeFee) : 0; - return minTransfer - ? getDecimalString( - (minTransfer + 1).toString() || '0', - token?.decimals || 0, - ) - : '0'; + const minTransfer = bridgeFee + networkFee; + + return minTransfer + ? getDecimalString( + (minTransfer + 1).toString() || '0', + token?.decimals || 0, + ) + : '0'; + } catch { + return '0'; + } }; From 2f85d75d1ac38aa447d81e11b2233f0602429d66 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 3 Jul 2024 12:29:20 +0000 Subject: [PATCH 021/168] chore: Add changeset file --- .changeset/old-tigers-think.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/old-tigers-think.md diff --git a/.changeset/old-tigers-think.md b/.changeset/old-tigers-think.md new file mode 100644 index 00000000..b58fa0de --- /dev/null +++ b/.changeset/old-tigers-think.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': patch +--- + +Update server actions for error handling based on new error handling module From a6d6e100b59f8e4a348b6e3c836be82c8a9a04f9 Mon Sep 17 00:00:00 2001 From: Mohammad Kermani Date: Wed, 3 Jul 2024 15:36:58 +0000 Subject: [PATCH 022/168] feat(rosen-app): optionally enable CORS --- .changeset/light-drinks-unite.md | 5 +++++ apps/rosen/.env.example | 2 ++ apps/rosen/next.config.js | 22 ++++++++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 .changeset/light-drinks-unite.md diff --git a/.changeset/light-drinks-unite.md b/.changeset/light-drinks-unite.md new file mode 100644 index 00000000..39f8249e --- /dev/null +++ b/.changeset/light-drinks-unite.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': minor +--- + +Enable CORS headers for allowing certain origins to access APIs diff --git a/apps/rosen/.env.example b/apps/rosen/.env.example index 2b1cdbc8..f02d43c9 100644 --- a/apps/rosen/.env.example +++ b/apps/rosen/.env.example @@ -16,3 +16,5 @@ KV_REST_API_TOKEN= # redis proxy token RATE_LIMIT_WINDOW= # for example '1s', '1m', '1h', '1d' RATE_LIMIT_TOKENS= # number of permitted requests in the window + +ALLOWED_ORIGINS= # comma-separated list of supported origins (e.g. https://google.com) diff --git a/apps/rosen/next.config.js b/apps/rosen/next.config.js index a4e04b08..89a91f9b 100644 --- a/apps/rosen/next.config.js +++ b/apps/rosen/next.config.js @@ -1,4 +1,5 @@ /** @type {import('next').NextConfig} */ + const nextConfig = { experimental: { serverComponentsExternalPackages: [ @@ -18,6 +19,27 @@ const nextConfig = { }, ], }, + ...(process.env.ALLOWED_ORIGINS + ? [ + { + source: '/api/:path*', + headers: [ + { + key: 'Access-Control-Allow-Origin', + value: process.env.ALLOWED_ORIGINS.slice(','), + }, + { + key: 'Access-Control-Allow-Methods', + value: 'GET', + }, + { + key: 'Access-Control-Allow-Headers', + value: 'Content-Type', + }, + ], + }, + ] + : []), ]; }, webpack: function (config, options) { From 31f47fe5937d60974b1e354584a58afa28d420ee Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 6 Jul 2024 06:58:59 +0000 Subject: [PATCH 023/168] chore: Improve error handler logic. --- apps/rosen/app/_errors/core.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/rosen/app/_errors/core.ts b/apps/rosen/app/_errors/core.ts index 1e962fd9..305d2610 100644 --- a/apps/rosen/app/_errors/core.ts +++ b/apps/rosen/app/_errors/core.ts @@ -1,3 +1,5 @@ +import { isPlainObject } from 'lodash-es'; + type AsyncFunction = (...args: any[]) => Promise; type Wrap = ( @@ -77,7 +79,7 @@ export const create = (key: string, errors: Array) => { }; } return { - message: String(error), + message: JSON.stringify(error), [key]: 'unknown', }; } @@ -96,8 +98,7 @@ export const create = (key: string, errors: Array) => { const result = await func(...args); // Return result if it not an object. - if (Object.prototype.toString.call(result) != '[object Object]') - return result; + if (!isPlainObject(result)) return result; // Return result if the key is not in the object. if (!(key in result)) return result; From e84aedc20d056f5a51b6e0d73dd838390e745f10 Mon Sep 17 00:00:00 2001 From: Mohammad Kermani Date: Sat, 6 Jul 2024 11:30:55 +0000 Subject: [PATCH 024/168] fix(rosen-app): move CORS logic to middleware --- apps/rosen/middleware.ts | 27 +++++++++++++++++++++++++++ apps/rosen/next.config.js | 21 --------------------- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/apps/rosen/middleware.ts b/apps/rosen/middleware.ts index 6d94e81a..b07675cc 100644 --- a/apps/rosen/middleware.ts +++ b/apps/rosen/middleware.ts @@ -15,6 +15,27 @@ const rateLimit = }) : undefined; +/** + * check if origin is an allowed origin from CORS perspective + * @param origin + */ +const isOriginAllowed = (origin: string) => + process.env.ALLOWED_ORIGINS?.includes('*') || + process.env.ALLOWED_ORIGINS?.includes(origin); + +/** + * get a headers object through which CORS can be enabled + * @param origin + */ +const getCORSHeaders = (origin: string) => { + const responseHeaders = new Headers(); + responseHeaders.append('Access-Control-Allow-Methods', 'GET'); + responseHeaders.append('Access-Control-Allow-Headers', 'Content-Type'); + responseHeaders.append('Access-Control-Allow-Origin', origin); + + return responseHeaders; +}; + export async function middleware(request: NextRequest) { const ip = request.ip ?? '127.0.0.1'; @@ -23,6 +44,12 @@ export async function middleware(request: NextRequest) { if (!success) { return Response.json('Too many requests', { status: 429 }); } + + const origin = request.headers.get('Origin'); + if (request.url.includes('/api') && origin && isOriginAllowed(origin)) { + return NextResponse.next({ headers: getCORSHeaders(origin) }); + } + return NextResponse.next(); } diff --git a/apps/rosen/next.config.js b/apps/rosen/next.config.js index 89a91f9b..0be08142 100644 --- a/apps/rosen/next.config.js +++ b/apps/rosen/next.config.js @@ -19,27 +19,6 @@ const nextConfig = { }, ], }, - ...(process.env.ALLOWED_ORIGINS - ? [ - { - source: '/api/:path*', - headers: [ - { - key: 'Access-Control-Allow-Origin', - value: process.env.ALLOWED_ORIGINS.slice(','), - }, - { - key: 'Access-Control-Allow-Methods', - value: 'GET', - }, - { - key: 'Access-Control-Allow-Headers', - value: 'Content-Type', - }, - ], - }, - ] - : []), ]; }, webpack: function (config, options) { From 0e2a7a5cada724681ccd3668e46c6beaafc94a03 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 8 Jul 2024 06:17:14 +0000 Subject: [PATCH 025/168] Update useTransactionFees.ts --- apps/rosen/app/_hooks/useTransactionFees.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/rosen/app/_hooks/useTransactionFees.ts b/apps/rosen/app/_hooks/useTransactionFees.ts index bdca164c..3574da23 100644 --- a/apps/rosen/app/_hooks/useTransactionFees.ts +++ b/apps/rosen/app/_hooks/useTransactionFees.ts @@ -96,7 +96,7 @@ const useTransactionFees = ( feeInfo.current = { tokenId, - tatus: 'success', + status: 'success', data: parsedData, }; } catch (error: any) { From 9397a8d10d204581e141ba342a34969ee61307f4 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 8 Jul 2024 12:24:21 +0000 Subject: [PATCH 026/168] fix: Update all server actions with the error handler utility --- .../app/_networks/bitcoin/getMaxTransfer.ts | 79 ++++++++++--------- apps/rosen/app/_networks/bitcoin/index.ts | 13 +-- apps/rosen/app/_networks/bitcoin/server.ts | 10 ++- apps/rosen/app/_networks/cardano/index.ts | 41 +++++----- apps/rosen/app/_networks/cardano/server.ts | 10 ++- apps/rosen/app/_networks/ergo/index.ts | 3 +- apps/rosen/app/_networks/ergo/server.ts | 4 +- 7 files changed, 85 insertions(+), 75 deletions(-) diff --git a/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts b/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts index 9cff21e6..a6942684 100644 --- a/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts @@ -8,50 +8,51 @@ import { getMinimumMeaningfulSatoshi, } from '@rosen-network/bitcoin'; +import { wrap } from '@/_errors'; import { BitcoinNetwork } from '@/_types/network'; /** * get max transfer for bitcoin */ -const getMaxTransfer = async ({ - balance, - isNative, - eventData, -}: Parameters[0]) => { - if (!eventData.toAddress) return 0; +export const getMaxTransfer = wrap( + async ({ + balance, + isNative, + eventData, + }: Parameters[0]) => { + if (!eventData.toAddress) return 0; - const feeRatio = await getFeeRatio(); - const opRetrunDataLength = ( - await generateOpReturnData( - eventData.toChain, - eventData.toAddress, - // We don't care about the actual op return data and only need the length - '0', - '0', - ) - ).length; - const utxos = await getAddressUtxos(eventData.fromAddress); - const estimatedTxWeight = await estimateTxWeight( - /** - * When getting max transfer, probably all of the utxos are going to be - * spent - */ - utxos.length, - 2, - opRetrunDataLength, - ); - const estimatedFee = Math.ceil((estimatedTxWeight / 4) * feeRatio); - const minSatoshi = await getMinimumMeaningfulSatoshi(feeRatio); - - return balance < 0 || !isNative - ? 0 - : /** - * We need to subtract (utxos.length + 1) from the calculated value because - * of a bug in bitcoin box selection - * - * local:ergo/rosen-bridge/utils#204 + const feeRatio = await getFeeRatio(); + const opRetrunDataLength = ( + await generateOpReturnData( + eventData.toChain, + eventData.toAddress, + // We don't care about the actual op return data and only need the length + '0', + '0', + ) + ).length; + const utxos = await getAddressUtxos(eventData.fromAddress); + const estimatedTxWeight = await estimateTxWeight( + /** + * When getting max transfer, probably all of the utxos are going to be + * spent */ - balance - estimatedFee - Number(minSatoshi) - utxos.length - 1; -}; + utxos.length, + 2, + opRetrunDataLength, + ); + const estimatedFee = Math.ceil((estimatedTxWeight / 4) * feeRatio); + const minSatoshi = await getMinimumMeaningfulSatoshi(feeRatio); -export default getMaxTransfer; + return balance < 0 || !isNative + ? 0 + : /** + * We need to subtract (utxos.length + 1) from the calculated value because + * of a bug in bitcoin box selection + * + * local:ergo/rosen-bridge/utils#204 + */ + balance - estimatedFee - Number(minSatoshi) - utxos.length - 1; + }, +); diff --git a/apps/rosen/app/_networks/bitcoin/index.ts b/apps/rosen/app/_networks/bitcoin/index.ts index 6a571f1f..e705dec6 100644 --- a/apps/rosen/app/_networks/bitcoin/index.ts +++ b/apps/rosen/app/_networks/bitcoin/index.ts @@ -3,10 +3,11 @@ import { xdefiWalletCreator, xdefiWalletInfo } from '@rosen-ui/xdefi-wallet'; import { compact } from 'lodash-es'; -import getMaxTransfer from './getMaxTransfer'; +import { getMaxTransfer } from './getMaxTransfer'; import { Networks } from '@rosen-ui/constants'; +import { unwrap } from '@/_errors'; import { BitcoinNetwork as BitcoinNetworkType } from '@/_types/network'; import { @@ -28,15 +29,15 @@ const BitcoinNetwork: BitcoinNetworkType = { supportedWallets: [xdefiWalletInfo], availableWallets: compact([ xdefiWalletCreator({ - generateOpReturnData, - generateUnsignedTx, - getAddressBalance, - submitTransaction, + generateOpReturnData: unwrap(generateOpReturnData), + generateUnsignedTx: unwrap(generateUnsignedTx), + getAddressBalance: unwrap(getAddressBalance), + submitTransaction: unwrap(submitTransaction), }), ]), nextHeightInterval: 1, lockAddress: process.env.NEXT_PUBLIC_BITCOIN_LOCK_ADDRESS!, - getMaxTransfer, + getMaxTransfer: unwrap(getMaxTransfer), }; export default BitcoinNetwork; diff --git a/apps/rosen/app/_networks/bitcoin/server.ts b/apps/rosen/app/_networks/bitcoin/server.ts index d02c071a..5e4cd2e9 100644 --- a/apps/rosen/app/_networks/bitcoin/server.ts +++ b/apps/rosen/app/_networks/bitcoin/server.ts @@ -7,7 +7,9 @@ import { submitTransaction as submitTransactionCore, } from '@rosen-network/bitcoin'; -export const generateOpReturnData = generateOpReturnDataCore; -export const generateUnsignedTx = generateUnsignedTxCore; -export const getAddressBalance = getAddressBalanceCore; -export const submitTransaction = submitTransactionCore; +import { wrap } from '@/_errors'; + +export const generateOpReturnData = wrap(generateOpReturnDataCore); +export const generateUnsignedTx = wrap(generateUnsignedTxCore); +export const getAddressBalance = wrap(getAddressBalanceCore); +export const submitTransaction = wrap(submitTransactionCore); diff --git a/apps/rosen/app/_networks/cardano/index.ts b/apps/rosen/app/_networks/cardano/index.ts index 18834477..eafb93e1 100644 --- a/apps/rosen/app/_networks/cardano/index.ts +++ b/apps/rosen/app/_networks/cardano/index.ts @@ -4,6 +4,7 @@ import { convertNumberToBigint, validateDecimalPlaces } from '@rosen-ui/utils'; import { Networks } from '@rosen-ui/constants'; +import { unwrap } from '@/_errors'; import { CardanoNetwork as CardanoNetworkType } from '@/_types/network'; import { RosenChainToken } from '@rosen-bridge/tokens'; @@ -44,35 +45,35 @@ const CardanoNetwork: CardanoNetworkType = { ], availableWallets: compact([ eternlWalletCreator({ - decodeWasmValue: decodeWasmValue, - generateLockAuxiliaryData: generateLockAuxiliaryData, - generateUnsignedTx: generateUnsignedTx, - setTxWitnessSet: setTxWitnessSet, + decodeWasmValue: unwrap(decodeWasmValue), + generateLockAuxiliaryData: unwrap(generateLockAuxiliaryData), + generateUnsignedTx: unwrap(generateUnsignedTx), + setTxWitnessSet: unwrap(setTxWitnessSet), }), flintWalletCreator({ - decodeWasmValue: decodeWasmValue, - generateLockAuxiliaryData: generateLockAuxiliaryData, - generateUnsignedTx: generateUnsignedTx, - setTxWitnessSet: setTxWitnessSet, + decodeWasmValue: unwrap(decodeWasmValue), + generateLockAuxiliaryData: unwrap(generateLockAuxiliaryData), + generateUnsignedTx: unwrap(generateUnsignedTx), + setTxWitnessSet: unwrap(setTxWitnessSet), }), laceWalletCreator({ - decodeWasmValue: decodeWasmValue, - generateLockAuxiliaryData: generateLockAuxiliaryData, - generateUnsignedTx: generateUnsignedTx, - setTxWitnessSet: setTxWitnessSet, + decodeWasmValue: unwrap(decodeWasmValue), + generateLockAuxiliaryData: unwrap(generateLockAuxiliaryData), + generateUnsignedTx: unwrap(generateUnsignedTx), + setTxWitnessSet: unwrap(setTxWitnessSet), }), namiWalletCreator({ - decodeWasmValue: decodeWasmValue, - generateLockAuxiliaryData: generateLockAuxiliaryData, - generateUnsignedTx: generateUnsignedTx, - setTxWitnessSet: setTxWitnessSet, + decodeWasmValue: unwrap(decodeWasmValue), + generateLockAuxiliaryData: unwrap(generateLockAuxiliaryData), + generateUnsignedTx: unwrap(generateUnsignedTx), + setTxWitnessSet: unwrap(setTxWitnessSet), }), isVesprAvailable() && { ...getVesprWallet(), getBalance: async (token: RosenChainToken) => { const context = await getVesprWallet().api.enable(); const rawValue = await context.getBalance(); - const balances = await decodeWasmValue(rawValue); + const balances = await unwrap(decodeWasmValue)(rawValue); const amount = balances.find( (asset) => asset.policyId === token.policyId, @@ -106,7 +107,7 @@ const CardanoNetwork: CardanoNetworkType = { ); const changeAddressHex = await wallet.getChangeAddress(); - const auxiliaryDataHex = await generateLockAuxiliaryData( + const auxiliaryDataHex = await unwrap(generateLockAuxiliaryData)( toChain, toAddress, changeAddressHex, @@ -116,7 +117,7 @@ const CardanoNetwork: CardanoNetworkType = { const walletUtxos = await wallet.getUtxos(); if (!walletUtxos) throw Error(`Failed to fetch wallet utxos`); - const unsignedTxHex = await generateUnsignedTx( + const unsignedTxHex = await unwrap(generateUnsignedTx)( walletUtxos, lockAddress, changeAddressHex, @@ -126,7 +127,7 @@ const CardanoNetwork: CardanoNetworkType = { auxiliaryDataHex, ); - const signedTxHex = await setTxWitnessSet( + const signedTxHex = await unwrap(setTxWitnessSet)( unsignedTxHex, await wallet.signTx(unsignedTxHex, false), ); diff --git a/apps/rosen/app/_networks/cardano/server.ts b/apps/rosen/app/_networks/cardano/server.ts index 34dfd46f..82dcba4d 100644 --- a/apps/rosen/app/_networks/cardano/server.ts +++ b/apps/rosen/app/_networks/cardano/server.ts @@ -7,7 +7,9 @@ import { setTxWitnessSet as setTxWitnessSetCore, } from '@rosen-network/cardano'; -export const decodeWasmValue = decodeWasmValueCore; -export const generateLockAuxiliaryData = generateLockAuxiliaryDataCore; -export const generateUnsignedTx = generateUnsignedTxCore; -export const setTxWitnessSet = setTxWitnessSetCore; +import { wrap } from '@/_errors'; + +export const decodeWasmValue = wrap(decodeWasmValueCore); +export const generateLockAuxiliaryData = wrap(generateLockAuxiliaryDataCore); +export const generateUnsignedTx = wrap(generateUnsignedTxCore); +export const setTxWitnessSet = wrap(setTxWitnessSetCore); diff --git a/apps/rosen/app/_networks/ergo/index.ts b/apps/rosen/app/_networks/ergo/index.ts index 0015e9c7..51197f97 100644 --- a/apps/rosen/app/_networks/ergo/index.ts +++ b/apps/rosen/app/_networks/ergo/index.ts @@ -6,6 +6,7 @@ import { compact } from 'lodash-es'; import { Networks } from '@rosen-ui/constants'; +import { unwrap } from '@/_errors'; import { ErgoNetwork as ErgoNetworkType } from '@/_types/network'; import { ErgoIcon } from '@rosen-bridge/icons'; @@ -27,7 +28,7 @@ const ErgoNetwork: ErgoNetworkType = { supportedWallets: [nautilusWalletInfo], availableWallets: compact([ nautilusWalletCreator({ - generateUnsignedTx, + generateUnsignedTx: unwrap(generateUnsignedTx), }), ]), logo: ErgoIcon, diff --git a/apps/rosen/app/_networks/ergo/server.ts b/apps/rosen/app/_networks/ergo/server.ts index a6f8d7c3..1e1ccfff 100644 --- a/apps/rosen/app/_networks/ergo/server.ts +++ b/apps/rosen/app/_networks/ergo/server.ts @@ -2,4 +2,6 @@ import { generateUnsignedTx as generateUnsignedTxCore } from '@rosen-network/ergo'; -export const generateUnsignedTx = generateUnsignedTxCore; +import { unwrap } from '@/_errors'; + +export const generateUnsignedTx = unwrap(generateUnsignedTxCore); From 8dc7997594ffb8f5c769419d1ff398416bfa7007 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 9 Jul 2024 06:57:57 +0000 Subject: [PATCH 027/168] refactor: Update wallets and networks packages --- apps/rosen/app/(bridge)/BridgeForm.tsx | 4 ++-- apps/rosen/app/_networks/bitcoin/index.ts | 9 +++------ apps/rosen/app/_networks/cardano/index.ts | 20 ++++++------------- apps/rosen/app/_networks/ergo/index.ts | 11 +++------- apps/rosen/app/_types/network.ts | 5 ++--- networks/bitcoin/src/types.ts | 2 +- networks/cardano/src/types.ts | 2 +- networks/ergo/src/types.ts | 2 +- .../eternl-wallet/src/eternlWalletCreator.ts | 2 +- .../flint-wallet/src/flintWalletCreator.ts | 2 +- wallets/lace-wallet/src/isLaceAvailable.ts | 2 +- wallets/lace-wallet/src/laceWalletCreator.ts | 2 +- wallets/nami-wallet/src/isNamiAvailable.ts | 2 +- wallets/nami-wallet/src/namiWalletCreator.ts | 2 +- .../src/nautilusWalletCreator.ts | 2 +- wallets/wallet-api/src/types/index.ts | 1 + .../xdefi-wallet/src/xdefiWalletCreator.ts | 2 +- 17 files changed, 28 insertions(+), 44 deletions(-) diff --git a/apps/rosen/app/(bridge)/BridgeForm.tsx b/apps/rosen/app/(bridge)/BridgeForm.tsx index 4d1955f4..24ed2434 100644 --- a/apps/rosen/app/(bridge)/BridgeForm.tsx +++ b/apps/rosen/app/(bridge)/BridgeForm.tsx @@ -95,8 +95,8 @@ const BridgeForm = () => { formState: { isValidating }, } = useTransactionFormData(); - const { availableNetworks, tokens, targetNetworks, selectedNetwork } = - useNetwork(); + const { availableNetworks, tokens, targetNetworks } = useNetwork(); + const { isLoading, amount, token } = useTokenBalance(); const { max } = useMaxTransfer(); diff --git a/apps/rosen/app/_networks/bitcoin/index.ts b/apps/rosen/app/_networks/bitcoin/index.ts index 6a571f1f..5ac3b2d8 100644 --- a/apps/rosen/app/_networks/bitcoin/index.ts +++ b/apps/rosen/app/_networks/bitcoin/index.ts @@ -1,7 +1,5 @@ import { BitcoinIcon } from '@rosen-bridge/icons'; -import { xdefiWalletCreator, xdefiWalletInfo } from '@rosen-ui/xdefi-wallet'; - -import { compact } from 'lodash-es'; +import { xdefiWalletCreator } from '@rosen-ui/xdefi-wallet'; import getMaxTransfer from './getMaxTransfer'; @@ -25,15 +23,14 @@ const BitcoinNetwork: BitcoinNetworkType = { name: Networks.BITCOIN, label: 'Bitcoin', logo: BitcoinIcon, - supportedWallets: [xdefiWalletInfo], - availableWallets: compact([ + wallets: [ xdefiWalletCreator({ generateOpReturnData, generateUnsignedTx, getAddressBalance, submitTransaction, }), - ]), + ], nextHeightInterval: 1, lockAddress: process.env.NEXT_PUBLIC_BITCOIN_LOCK_ADDRESS!, getMaxTransfer, diff --git a/apps/rosen/app/_networks/cardano/index.ts b/apps/rosen/app/_networks/cardano/index.ts index 18834477..107f8612 100644 --- a/apps/rosen/app/_networks/cardano/index.ts +++ b/apps/rosen/app/_networks/cardano/index.ts @@ -1,5 +1,3 @@ -import { compact } from 'lodash-es'; - import { convertNumberToBigint, validateDecimalPlaces } from '@rosen-ui/utils'; import { Networks } from '@rosen-ui/constants'; @@ -9,10 +7,10 @@ import { CardanoNetwork as CardanoNetworkType } from '@/_types/network'; import { RosenChainToken } from '@rosen-bridge/tokens'; import { CardanoIcon } from '@rosen-bridge/icons'; -import { eternlWalletCreator, eternlWalletInfo } from '@rosen-ui/eternl-wallet'; -import { flintWalletCreator, flintWalletInfo } from '@rosen-ui/flint-wallet'; -import { laceWalletCreator, laceWalletInfo } from '@rosen-ui/lace-wallet'; -import { namiWalletCreator, namiWalletInfo } from '@rosen-ui/nami-wallet'; +import { eternlWalletCreator } from '@rosen-ui/eternl-wallet'; +import { flintWalletCreator } from '@rosen-ui/flint-wallet'; +import { laceWalletCreator } from '@rosen-ui/lace-wallet'; +import { namiWalletCreator } from '@rosen-ui/nami-wallet'; import { decodeWasmValue, @@ -36,13 +34,7 @@ import getVesprWallet, { const CardanoNetwork: CardanoNetworkType = { name: Networks.CARDANO, label: 'Cardano', - supportedWallets: [ - eternlWalletInfo, - flintWalletInfo, - laceWalletInfo, - namiWalletInfo, - ], - availableWallets: compact([ + wallets: [ eternlWalletCreator({ decodeWasmValue: decodeWasmValue, generateLockAuxiliaryData: generateLockAuxiliaryData, @@ -135,7 +127,7 @@ const CardanoNetwork: CardanoNetworkType = { return result; }, }, - ]), + ], nextHeightInterval: 25, logo: CardanoIcon, lockAddress: process.env.NEXT_PUBLIC_CARDANO_LOCK_ADDRESS!, diff --git a/apps/rosen/app/_networks/ergo/index.ts b/apps/rosen/app/_networks/ergo/index.ts index 0015e9c7..4960c653 100644 --- a/apps/rosen/app/_networks/ergo/index.ts +++ b/apps/rosen/app/_networks/ergo/index.ts @@ -1,8 +1,4 @@ -import { - nautilusWalletCreator, - nautilusWalletInfo, -} from '@rosen-ui/nautilus-wallet'; -import { compact } from 'lodash-es'; +import { nautilusWalletCreator } from '@rosen-ui/nautilus-wallet'; import { Networks } from '@rosen-ui/constants'; @@ -24,12 +20,11 @@ import { generateUnsignedTx } from './server'; const ErgoNetwork: ErgoNetworkType = { name: Networks.ERGO, label: 'Ergo', - supportedWallets: [nautilusWalletInfo], - availableWallets: compact([ + wallets: [ nautilusWalletCreator({ generateUnsignedTx, }), - ]), + ], logo: ErgoIcon, nextHeightInterval: 5, lockAddress: process.env.NEXT_PUBLIC_ERGO_LOCK_ADDRESS!, diff --git a/apps/rosen/app/_types/network.ts b/apps/rosen/app/_types/network.ts index 4762a968..226b5b51 100644 --- a/apps/rosen/app/_types/network.ts +++ b/apps/rosen/app/_types/network.ts @@ -1,4 +1,4 @@ -import { Wallet, WalletInfo } from '@rosen-ui/wallet-api'; +import { Wallet } from '@rosen-ui/wallet-api'; import { AvailableNetworks } from '@/_networks'; @@ -17,8 +17,7 @@ export interface BaseNetwork< name: NetworkName; logo: string; label: string; - availableWallets: Wallet[]; - supportedWallets: WalletInfo[]; + wallets: Wallet[]; nextHeightInterval: number; lockAddress: string; getMaxTransfer: ( diff --git a/networks/bitcoin/src/types.ts b/networks/bitcoin/src/types.ts index 79dbd2ac..62294a3f 100644 --- a/networks/bitcoin/src/types.ts +++ b/networks/bitcoin/src/types.ts @@ -66,7 +66,7 @@ export interface UnsignedPsbtData { inputSize: number; } -export type WalletCreator = (config: WalletCreatorConfig) => Wallet | undefined; +export type WalletCreator = (config: WalletCreatorConfig) => Wallet; export type WalletCreatorConfig = { generateOpReturnData: typeof generateOpReturnData; diff --git a/networks/cardano/src/types.ts b/networks/cardano/src/types.ts index 2ceed70d..cd1c1e43 100644 --- a/networks/cardano/src/types.ts +++ b/networks/cardano/src/types.ts @@ -19,7 +19,7 @@ export interface CardanoProtocolParams { export const ADA_POLICY_ID = ''; -export type WalletCreator = (config: WalletCreatorConfig) => Wallet | undefined; +export type WalletCreator = (config: WalletCreatorConfig) => Wallet; export type WalletCreatorConfig = { decodeWasmValue: typeof decodeWasmValue; diff --git a/networks/ergo/src/types.ts b/networks/ergo/src/types.ts index 2d363f0f..2f93bebc 100644 --- a/networks/ergo/src/types.ts +++ b/networks/ergo/src/types.ts @@ -22,7 +22,7 @@ export interface CoveringBoxes { boxes: Array; } -export type WalletCreator = (config: WalletCreatorConfig) => Wallet | undefined; +export type WalletCreator = (config: WalletCreatorConfig) => Wallet; export type WalletCreatorConfig = { generateUnsignedTx: typeof generateUnsignedTx; diff --git a/wallets/eternl-wallet/src/eternlWalletCreator.ts b/wallets/eternl-wallet/src/eternlWalletCreator.ts index 942a2113..90e674ae 100644 --- a/wallets/eternl-wallet/src/eternlWalletCreator.ts +++ b/wallets/eternl-wallet/src/eternlWalletCreator.ts @@ -6,8 +6,8 @@ import { isEternlAvailable } from './isEternlAvailable'; import { transferCreator } from './transfer'; export const eternlWalletCreator: WalletCreator = (config) => { - if (!isEternlAvailable()) return; return Object.assign({}, getEternlWallet(), { + isAvailable: isEternlAvailable, getBalance: getBalanceCreator(config), transfer: transferCreator(config), getAddress: async () => { diff --git a/wallets/flint-wallet/src/flintWalletCreator.ts b/wallets/flint-wallet/src/flintWalletCreator.ts index 15999bac..848f6c73 100644 --- a/wallets/flint-wallet/src/flintWalletCreator.ts +++ b/wallets/flint-wallet/src/flintWalletCreator.ts @@ -6,8 +6,8 @@ import { isFlintAvailable } from './isFlintAvailable'; import { transferCreator } from './transfer'; export const flintWalletCreator: WalletCreator = (config) => { - if (!isFlintAvailable()) return; return Object.assign({}, getFlintWallet(), { + isAvailable: isFlintAvailable, getBalance: getBalanceCreator(config), transfer: transferCreator(config), getAddress: async () => { diff --git a/wallets/lace-wallet/src/isLaceAvailable.ts b/wallets/lace-wallet/src/isLaceAvailable.ts index e166c4e7..caa83538 100644 --- a/wallets/lace-wallet/src/isLaceAvailable.ts +++ b/wallets/lace-wallet/src/isLaceAvailable.ts @@ -1,3 +1,3 @@ export const isLaceAvailable = () => { - return typeof cardano !== 'undefined' && cardano?.lace; + return typeof cardano !== 'undefined' && !!cardano?.lace; }; diff --git a/wallets/lace-wallet/src/laceWalletCreator.ts b/wallets/lace-wallet/src/laceWalletCreator.ts index 0392a03a..af5e4138 100644 --- a/wallets/lace-wallet/src/laceWalletCreator.ts +++ b/wallets/lace-wallet/src/laceWalletCreator.ts @@ -6,8 +6,8 @@ import { isLaceAvailable } from './isLaceAvailable'; import { transferCreator } from './transfer'; export const laceWalletCreator: WalletCreator = (config) => { - if (!isLaceAvailable()) return; return Object.assign({}, getLaceWallet(), { + isAvailable: isLaceAvailable, getBalance: getBalanceCreator(config), transfer: transferCreator(config), getAddress: async () => { diff --git a/wallets/nami-wallet/src/isNamiAvailable.ts b/wallets/nami-wallet/src/isNamiAvailable.ts index bde6b6fb..311ecff1 100644 --- a/wallets/nami-wallet/src/isNamiAvailable.ts +++ b/wallets/nami-wallet/src/isNamiAvailable.ts @@ -1,3 +1,3 @@ export const isNamiAvailable = () => { - return typeof cardano !== 'undefined' && cardano?.nami; + return typeof cardano !== 'undefined' && !!cardano?.nami; }; diff --git a/wallets/nami-wallet/src/namiWalletCreator.ts b/wallets/nami-wallet/src/namiWalletCreator.ts index f6b79d48..e714c849 100644 --- a/wallets/nami-wallet/src/namiWalletCreator.ts +++ b/wallets/nami-wallet/src/namiWalletCreator.ts @@ -6,8 +6,8 @@ import { isNamiAvailable } from './isNamiAvailable'; import { transferCreator } from './transfer'; export const namiWalletCreator: WalletCreator = (config) => { - if (!isNamiAvailable()) return; return Object.assign({}, getNamiWallet(), { + isAvailable: isNamiAvailable, getBalance: getBalanceCreator(config), transfer: transferCreator(config), getAddress: async () => { diff --git a/wallets/nautilus-wallet/src/nautilusWalletCreator.ts b/wallets/nautilus-wallet/src/nautilusWalletCreator.ts index 900d7809..345f451b 100644 --- a/wallets/nautilus-wallet/src/nautilusWalletCreator.ts +++ b/wallets/nautilus-wallet/src/nautilusWalletCreator.ts @@ -6,8 +6,8 @@ import { isNautilusAvailable } from './isNautilusAvailable'; import { transferCreator } from './transfer'; export const nautilusWalletCreator: WalletCreator = (config) => { - if (!isNautilusAvailable()) return; return Object.assign({}, getNautilusWallet(), { + isAvailable: isNautilusAvailable, getBalance: getBalanceCreator(config), transfer: transferCreator(config), getAddress: async () => { diff --git a/wallets/wallet-api/src/types/index.ts b/wallets/wallet-api/src/types/index.ts index 9250fa87..814c70eb 100644 --- a/wallets/wallet-api/src/types/index.ts +++ b/wallets/wallet-api/src/types/index.ts @@ -37,6 +37,7 @@ export interface Wallet extends WalletBase { lockAddress: string ) => Promise; readonly getAddress: () => Promise; + readonly isAvailable: () => boolean; } export interface RawWallet extends WalletBase { diff --git a/wallets/xdefi-wallet/src/xdefiWalletCreator.ts b/wallets/xdefi-wallet/src/xdefiWalletCreator.ts index e17f69c9..f25fda24 100644 --- a/wallets/xdefi-wallet/src/xdefiWalletCreator.ts +++ b/wallets/xdefi-wallet/src/xdefiWalletCreator.ts @@ -7,8 +7,8 @@ import { transferCreator } from './transfer'; import { getAddressCreator } from './getAddressCreator'; export const xdefiWalletCreator: WalletCreator = (config) => { - if (!isXdefiAvailable()) return; return Object.assign({}, getXdefiWallet(), { + isAvailable: isXdefiAvailable, getBalance: getBalanceCreator(config), transfer: transferCreator(config), getAddress: getAddressCreator(config), From 5b97ba95c21609042eb858578331f0fa1d6c915a Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 9 Jul 2024 09:12:57 +0000 Subject: [PATCH 028/168] chore: Update api typing in wallets --- apps/rosen/app/(bridge)/ChooseWalletModal.tsx | 34 +++---- apps/rosen/app/_networks/cardano/index.ts | 10 +- wallets/eternl-wallet/src/getBalance.ts | 2 +- wallets/eternl-wallet/src/getEternlWallet.ts | 2 +- wallets/eternl-wallet/src/transfer.ts | 2 +- wallets/flint-wallet/src/getBalance.ts | 2 +- wallets/flint-wallet/src/getFlintWallet.ts | 2 +- wallets/flint-wallet/src/transfer.ts | 2 +- wallets/lace-wallet/src/getBalance.ts | 2 +- wallets/lace-wallet/src/getLaceWallet.ts | 2 +- wallets/lace-wallet/src/transfer.ts | 2 +- wallets/nami-wallet/src/getBalance.ts | 2 +- wallets/nami-wallet/src/getNamiWallet.ts | 2 +- wallets/nami-wallet/src/transfer.ts | 2 +- wallets/nautilus-wallet/src/getBalance.ts | 2 +- .../nautilus-wallet/src/getNautilusWallet.ts | 2 +- wallets/nautilus-wallet/src/transfer.ts | 2 +- wallets/vespr-wallet/src/index.ts | 2 +- wallets/wallet-api/src/index.ts | 2 +- wallets/wallet-api/src/types/index.ts | 2 +- wallets/xdefi-wallet/src/getAddressCreator.ts | 40 ++++---- wallets/xdefi-wallet/src/getBalance.ts | 48 +++++----- wallets/xdefi-wallet/src/getXdefiWallet.ts | 4 +- wallets/xdefi-wallet/src/transfer.ts | 94 ++++++++++--------- 24 files changed, 134 insertions(+), 132 deletions(-) diff --git a/apps/rosen/app/(bridge)/ChooseWalletModal.tsx b/apps/rosen/app/(bridge)/ChooseWalletModal.tsx index 6c6772b7..047bb512 100644 --- a/apps/rosen/app/(bridge)/ChooseWalletModal.tsx +++ b/apps/rosen/app/(bridge)/ChooseWalletModal.tsx @@ -7,15 +7,14 @@ import { Grid, Tooltip, } from '@rosen-bridge/ui-kit'; -import { Wallet, WalletInfo } from '@rosen-ui/wallet-api'; +import { Wallet } from '@rosen-ui/wallet-api'; interface ChooseWalletModalProps { open: boolean; handleClose: () => void; setSelectedWallet: ((wallet: Wallet) => Promise) | undefined; chainName: string; - supportedWallets: WalletInfo[]; - availableWallets: Wallet[]; + wallets: Wallet[]; } /** @@ -25,8 +24,7 @@ interface ChooseWalletModalProps { * @param handleClose * @param setSelectedWallet * @param chainName - * @param supportedWallets - * @param availableWallets + * @param wallets * */ export const ChooseWalletModal = ({ @@ -34,8 +32,7 @@ export const ChooseWalletModal = ({ handleClose, setSelectedWallet, chainName, - supportedWallets, - availableWallets, + wallets, }: ChooseWalletModalProps) => { const handleConnect = async (wallet: Wallet) => { setSelectedWallet && (await setSelectedWallet(wallet)); @@ -57,9 +54,10 @@ export const ChooseWalletModal = ({ mt: (theme) => theme.spacing(4), }} > - {supportedWallets.map( - ({ icon: WalletIcon, label, link, name }, index) => ( - + {wallets.map((wallet) => { + const WalletIcon = wallet.icon; + return ( + @@ -95,25 +93,19 @@ export const ChooseWalletModal = ({ - ), - )} + ); + })} diff --git a/apps/rosen/app/_networks/cardano/index.ts b/apps/rosen/app/_networks/cardano/index.ts index 107f8612..02613094 100644 --- a/apps/rosen/app/_networks/cardano/index.ts +++ b/apps/rosen/app/_networks/cardano/index.ts @@ -1,3 +1,5 @@ +import { compact } from 'lodash-es'; + import { convertNumberToBigint, validateDecimalPlaces } from '@rosen-ui/utils'; import { Networks } from '@rosen-ui/constants'; @@ -34,7 +36,7 @@ import getVesprWallet, { const CardanoNetwork: CardanoNetworkType = { name: Networks.CARDANO, label: 'Cardano', - wallets: [ + wallets: compact([ eternlWalletCreator({ decodeWasmValue: decodeWasmValue, generateLockAuxiliaryData: generateLockAuxiliaryData, @@ -62,7 +64,7 @@ const CardanoNetwork: CardanoNetworkType = { isVesprAvailable() && { ...getVesprWallet(), getBalance: async (token: RosenChainToken) => { - const context = await getVesprWallet().api.enable(); + const context = await getVesprWallet().api().enable(); const rawValue = await context.getBalance(); const balances = await decodeWasmValue(rawValue); @@ -84,7 +86,7 @@ const CardanoNetwork: CardanoNetworkType = { validateDecimalPlaces(decimalBridgeFee, token.decimals); validateDecimalPlaces(decimalNetworkFee, token.decimals); - const wallet = await getVesprWallet().api.enable(); + const wallet = await getVesprWallet().api().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; const amount = convertNumberToBigint( @@ -127,7 +129,7 @@ const CardanoNetwork: CardanoNetworkType = { return result; }, }, - ], + ]), nextHeightInterval: 25, logo: CardanoIcon, lockAddress: process.env.NEXT_PUBLIC_CARDANO_LOCK_ADDRESS!, diff --git a/wallets/eternl-wallet/src/getBalance.ts b/wallets/eternl-wallet/src/getBalance.ts index d6ac9db3..027ed0f1 100644 --- a/wallets/eternl-wallet/src/getBalance.ts +++ b/wallets/eternl-wallet/src/getBalance.ts @@ -6,7 +6,7 @@ import { getEternlWallet } from './getEternlWallet'; export const getBalanceCreator = (config: WalletCreatorConfig) => async (token: RosenChainToken): Promise => { - const context = await getEternlWallet().api.enable(); + const context = await getEternlWallet().api().enable(); const rawValue = await context.getBalance(); const balances = await config.decodeWasmValue(rawValue); diff --git a/wallets/eternl-wallet/src/getEternlWallet.ts b/wallets/eternl-wallet/src/getEternlWallet.ts index af6a109b..ecaa7142 100644 --- a/wallets/eternl-wallet/src/getEternlWallet.ts +++ b/wallets/eternl-wallet/src/getEternlWallet.ts @@ -13,6 +13,6 @@ export const getEternlWallet = () => { ...eternlWalletInfo, connectWallet, }, - cardano.eternl + () => cardano.eternl ); }; diff --git a/wallets/eternl-wallet/src/transfer.ts b/wallets/eternl-wallet/src/transfer.ts index 9e950eef..d6807bb2 100644 --- a/wallets/eternl-wallet/src/transfer.ts +++ b/wallets/eternl-wallet/src/transfer.ts @@ -19,7 +19,7 @@ export const transferCreator = validateDecimalPlaces(decimalBridgeFee, token.decimals); validateDecimalPlaces(decimalNetworkFee, token.decimals); - const wallet = await getEternlWallet().api.enable(); + const wallet = await getEternlWallet().api().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; const amount = convertNumberToBigint(decimalAmount * 10 ** token.decimals); diff --git a/wallets/flint-wallet/src/getBalance.ts b/wallets/flint-wallet/src/getBalance.ts index fc45b77e..df6a89c1 100644 --- a/wallets/flint-wallet/src/getBalance.ts +++ b/wallets/flint-wallet/src/getBalance.ts @@ -6,7 +6,7 @@ import { getFlintWallet } from './getFlintWallet'; export const getBalanceCreator = (config: WalletCreatorConfig) => async (token: RosenChainToken): Promise => { - const context = await getFlintWallet().api.enable(); + const context = await getFlintWallet().api().enable(); const rawValue = await context.getBalance(); const balances = await config.decodeWasmValue(rawValue); diff --git a/wallets/flint-wallet/src/getFlintWallet.ts b/wallets/flint-wallet/src/getFlintWallet.ts index b9142568..d3598222 100644 --- a/wallets/flint-wallet/src/getFlintWallet.ts +++ b/wallets/flint-wallet/src/getFlintWallet.ts @@ -13,5 +13,5 @@ export const getFlintWallet = () => ...flintWalletInfo, connectWallet, }, - cardano.flint + () => cardano.flint ); diff --git a/wallets/flint-wallet/src/transfer.ts b/wallets/flint-wallet/src/transfer.ts index 6601edf0..050d3b3a 100644 --- a/wallets/flint-wallet/src/transfer.ts +++ b/wallets/flint-wallet/src/transfer.ts @@ -19,7 +19,7 @@ export const transferCreator = validateDecimalPlaces(decimalBridgeFee, token.decimals); validateDecimalPlaces(decimalNetworkFee, token.decimals); - const wallet = await getFlintWallet().api.enable(); + const wallet = await getFlintWallet().api().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; const amount = convertNumberToBigint(decimalAmount * 10 ** token.decimals); diff --git a/wallets/lace-wallet/src/getBalance.ts b/wallets/lace-wallet/src/getBalance.ts index 237b3467..b69bf789 100644 --- a/wallets/lace-wallet/src/getBalance.ts +++ b/wallets/lace-wallet/src/getBalance.ts @@ -6,7 +6,7 @@ import { getLaceWallet } from './getLaceWallet'; export const getBalanceCreator = (config: WalletCreatorConfig) => async (token: RosenChainToken): Promise => { - const context = await getLaceWallet().api.enable(); + const context = await getLaceWallet().api().enable(); const rawValue = await context.getBalance(); const balances = await config.decodeWasmValue(rawValue); diff --git a/wallets/lace-wallet/src/getLaceWallet.ts b/wallets/lace-wallet/src/getLaceWallet.ts index c52cc12d..e8340faa 100644 --- a/wallets/lace-wallet/src/getLaceWallet.ts +++ b/wallets/lace-wallet/src/getLaceWallet.ts @@ -13,6 +13,6 @@ export const getLaceWallet = () => { ...laceWalletInfo, connectWallet, }, - cardano.lace + () => cardano.lace ); }; diff --git a/wallets/lace-wallet/src/transfer.ts b/wallets/lace-wallet/src/transfer.ts index 3580a272..166d56c1 100644 --- a/wallets/lace-wallet/src/transfer.ts +++ b/wallets/lace-wallet/src/transfer.ts @@ -19,7 +19,7 @@ export const transferCreator = validateDecimalPlaces(decimalBridgeFee, token.decimals); validateDecimalPlaces(decimalNetworkFee, token.decimals); - const wallet = await getLaceWallet().api.enable(); + const wallet = await getLaceWallet().api().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; const amount = convertNumberToBigint(decimalAmount * 10 ** token.decimals); diff --git a/wallets/nami-wallet/src/getBalance.ts b/wallets/nami-wallet/src/getBalance.ts index 01e8ca75..768bb84f 100644 --- a/wallets/nami-wallet/src/getBalance.ts +++ b/wallets/nami-wallet/src/getBalance.ts @@ -7,7 +7,7 @@ import { getNamiWallet } from './getNamiWallet'; export const getBalanceCreator = (config: WalletCreatorConfig) => async (token: RosenChainToken): Promise => { - const context = await getNamiWallet().api.enable(); + const context = await getNamiWallet().api().enable(); const rawValue = await context.getBalance(); const balances = await config.decodeWasmValue(rawValue); diff --git a/wallets/nami-wallet/src/getNamiWallet.ts b/wallets/nami-wallet/src/getNamiWallet.ts index 547ffbe5..5ac5f6ae 100644 --- a/wallets/nami-wallet/src/getNamiWallet.ts +++ b/wallets/nami-wallet/src/getNamiWallet.ts @@ -13,6 +13,6 @@ export const getNamiWallet = () => { ...namiWalletInfo, connectWallet, }, - cardano.nami + () => cardano.nami ); }; diff --git a/wallets/nami-wallet/src/transfer.ts b/wallets/nami-wallet/src/transfer.ts index bf884c0a..0f04c485 100644 --- a/wallets/nami-wallet/src/transfer.ts +++ b/wallets/nami-wallet/src/transfer.ts @@ -19,7 +19,7 @@ export const transferCreator = validateDecimalPlaces(decimalBridgeFee, token.decimals); validateDecimalPlaces(decimalNetworkFee, token.decimals); - const wallet = await getNamiWallet().api.enable(); + const wallet = await getNamiWallet().api().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; const amount = convertNumberToBigint(decimalAmount * 10 ** token.decimals); diff --git a/wallets/nautilus-wallet/src/getBalance.ts b/wallets/nautilus-wallet/src/getBalance.ts index 02af05be..117374b6 100644 --- a/wallets/nautilus-wallet/src/getBalance.ts +++ b/wallets/nautilus-wallet/src/getBalance.ts @@ -7,7 +7,7 @@ import { getNautilusWallet } from './getNautilusWallet'; export const getBalanceCreator = (config: WalletCreatorConfig) => async (token: RosenChainToken): Promise => { - const context = await getNautilusWallet().api.getContext(); + const context = await getNautilusWallet().api().getContext(); const tokenId = (token as ErgoToken).tokenId; /** * The following condition is required because nautilus only accepts diff --git a/wallets/nautilus-wallet/src/getNautilusWallet.ts b/wallets/nautilus-wallet/src/getNautilusWallet.ts index 475c55cd..c238d6f8 100644 --- a/wallets/nautilus-wallet/src/getNautilusWallet.ts +++ b/wallets/nautilus-wallet/src/getNautilusWallet.ts @@ -14,6 +14,6 @@ export const getNautilusWallet = () => { ...nautilusWalletInfo, connectWallet, }, - ergoConnector.nautilus + () => ergoConnector.nautilus ); }; diff --git a/wallets/nautilus-wallet/src/transfer.ts b/wallets/nautilus-wallet/src/transfer.ts index fd6600c7..7dbe863a 100644 --- a/wallets/nautilus-wallet/src/transfer.ts +++ b/wallets/nautilus-wallet/src/transfer.ts @@ -19,7 +19,7 @@ export const transferCreator = validateDecimalPlaces(decimalBridgeFee, token.decimals); validateDecimalPlaces(decimalNetworkFee, token.decimals); - const wallet = await getNautilusWallet().api.getContext(); + const wallet = await getNautilusWallet().api().getContext(); const tokenId = token.tokenId; const amount = convertNumberToBigint(decimalAmount * 10 ** token.decimals); const bridgeFee = convertNumberToBigint( diff --git a/wallets/vespr-wallet/src/index.ts b/wallets/vespr-wallet/src/index.ts index 2a2f07bf..058bb419 100644 --- a/wallets/vespr-wallet/src/index.ts +++ b/wallets/vespr-wallet/src/index.ts @@ -21,7 +21,7 @@ const getVesprWallet = () => ...walletInfo, connectWallet, }, - cardano.vespr + () => cardano.vespr ); export const isVesprAvailable = () => diff --git a/wallets/wallet-api/src/index.ts b/wallets/wallet-api/src/index.ts index 7e8e88bd..fbf5e881 100644 --- a/wallets/wallet-api/src/index.ts +++ b/wallets/wallet-api/src/index.ts @@ -2,7 +2,7 @@ import { RawWallet, WalletBase } from './types'; export const createRawWallet = ( wallet: WalletBase, - api: T + api: () => T ): RawWallet => { return { ...wallet, diff --git a/wallets/wallet-api/src/types/index.ts b/wallets/wallet-api/src/types/index.ts index 814c70eb..10e27b40 100644 --- a/wallets/wallet-api/src/types/index.ts +++ b/wallets/wallet-api/src/types/index.ts @@ -41,7 +41,7 @@ export interface Wallet extends WalletBase { } export interface RawWallet extends WalletBase { - api: Api; + api: () => Api; } export * from './common'; diff --git a/wallets/xdefi-wallet/src/getAddressCreator.ts b/wallets/xdefi-wallet/src/getAddressCreator.ts index 5c7b0c71..26aaf2f7 100644 --- a/wallets/xdefi-wallet/src/getAddressCreator.ts +++ b/wallets/xdefi-wallet/src/getAddressCreator.ts @@ -6,25 +6,27 @@ import { getXdefiWallet } from './getXdefiWallet'; export const getAddressCreator = (config: WalletCreatorConfig) => (): Promise => { return new Promise((resolve, reject) => { - getXdefiWallet().api.getAddress({ - payload: { - message: 'Allow Xdefi to expose wallet address', - network: { - type: BitcoinNetworkType.Mainnet, + getXdefiWallet() + .api() + .getAddress({ + payload: { + message: 'Allow Xdefi to expose wallet address', + network: { + type: BitcoinNetworkType.Mainnet, + }, + purposes: [AddressPurpose.Payment], }, - purposes: [AddressPurpose.Payment], - }, - onFinish: ({ addresses }) => { - const segwitPaymentAddresses = addresses.filter( - (address) => address.purpose === AddressPurpose.Payment - ); - if (segwitPaymentAddresses.length > 0) { - resolve(segwitPaymentAddresses[0].address); - } else reject(); - }, - onCancel: () => { - reject(); - }, - }); + onFinish: ({ addresses }) => { + const segwitPaymentAddresses = addresses.filter( + (address) => address.purpose === AddressPurpose.Payment + ); + if (segwitPaymentAddresses.length > 0) { + resolve(segwitPaymentAddresses[0].address); + } else reject(); + }, + onCancel: () => { + reject(); + }, + }); }); }; diff --git a/wallets/xdefi-wallet/src/getBalance.ts b/wallets/xdefi-wallet/src/getBalance.ts index 881eac2d..823f41dc 100644 --- a/wallets/xdefi-wallet/src/getBalance.ts +++ b/wallets/xdefi-wallet/src/getBalance.ts @@ -6,29 +6,31 @@ import { getXdefiWallet } from './getXdefiWallet'; export const getBalanceCreator = (config: WalletCreatorConfig) => (): Promise => { return new Promise((resolve, reject) => { - getXdefiWallet().api.getAddress({ - payload: { - message: '', - network: { - type: BitcoinNetworkType.Mainnet, + getXdefiWallet() + .api() + .getAddress({ + payload: { + message: '', + network: { + type: BitcoinNetworkType.Mainnet, + }, + purposes: [AddressPurpose.Payment], }, - purposes: [AddressPurpose.Payment], - }, - onFinish: ({ addresses }) => { - const segwitPaymentAddresses = addresses.filter( - (address) => address.purpose === AddressPurpose.Payment - ); - if (segwitPaymentAddresses.length > 0) { - const address = segwitPaymentAddresses[0].address; - config - .getAddressBalance(address) - .then((balance) => resolve(Number(balance))) - .catch((e) => reject(e)); - } else reject(); - }, - onCancel: () => { - reject(); - }, - }); + onFinish: ({ addresses }) => { + const segwitPaymentAddresses = addresses.filter( + (address) => address.purpose === AddressPurpose.Payment + ); + if (segwitPaymentAddresses.length > 0) { + const address = segwitPaymentAddresses[0].address; + config + .getAddressBalance(address) + .then((balance) => resolve(Number(balance))) + .catch((e) => reject(e)); + } else reject(); + }, + onCancel: () => { + reject(); + }, + }); }); }; diff --git a/wallets/xdefi-wallet/src/getXdefiWallet.ts b/wallets/xdefi-wallet/src/getXdefiWallet.ts index 0a154644..062bab57 100644 --- a/wallets/xdefi-wallet/src/getXdefiWallet.ts +++ b/wallets/xdefi-wallet/src/getXdefiWallet.ts @@ -14,9 +14,9 @@ export const getXdefiWallet = () => { ...xdefiWalletInfo, connectWallet, }, - { + () => ({ getAddress, signTransaction, - } + }) ); }; diff --git a/wallets/xdefi-wallet/src/transfer.ts b/wallets/xdefi-wallet/src/transfer.ts index e4b547ce..9282d991 100644 --- a/wallets/xdefi-wallet/src/transfer.ts +++ b/wallets/xdefi-wallet/src/transfer.ts @@ -32,26 +32,28 @@ export const transferCreator = ); const userAddress: string = await new Promise((resolve, reject) => { - getXdefiWallet().api.getAddress({ - payload: { - message: '', - network: { - type: BitcoinNetworkType.Mainnet, + getXdefiWallet() + .api() + .getAddress({ + payload: { + message: '', + network: { + type: BitcoinNetworkType.Mainnet, + }, + purposes: [AddressPurpose.Payment], + }, + onFinish: ({ addresses }) => { + const segwitPaymentAddresses = addresses.filter( + (address) => address.purpose === AddressPurpose.Payment + ); + if (segwitPaymentAddresses.length > 0) + resolve(segwitPaymentAddresses[0].address); + else reject(); }, - purposes: [AddressPurpose.Payment], - }, - onFinish: ({ addresses }) => { - const segwitPaymentAddresses = addresses.filter( - (address) => address.purpose === AddressPurpose.Payment - ); - if (segwitPaymentAddresses.length > 0) - resolve(segwitPaymentAddresses[0].address); - else reject(); - }, - onCancel: () => { - reject(); - }, - }); + onCancel: () => { + reject(); + }, + }); }); const opReturnData = await config.generateOpReturnData( @@ -69,33 +71,35 @@ export const transferCreator = ); const result: string = await new Promise((resolve, reject) => { - getXdefiWallet().api.signTransaction({ - payload: { - network: { - type: BitcoinNetworkType.Mainnet, - }, - message: 'Sign Transaction', - psbtBase64: psbtData.psbt, - broadcast: false, - inputsToSign: [ - { - address: userAddress, - signingIndexes: Array.from(Array(psbtData.inputSize).keys()), - sigHash: SigHash.SINGLE | SigHash.DEFAULT_ANYONECANPAY, + getXdefiWallet() + .api() + .signTransaction({ + payload: { + network: { + type: BitcoinNetworkType.Mainnet, }, - ], - }, - onFinish: (response) => { - const signedPsbtBase64 = response.psbtBase64; - config - .submitTransaction(signedPsbtBase64) - .then((result) => resolve(result)) - .catch((e) => reject(e)); - }, - onCancel: () => { - reject(); - }, - }); + message: 'Sign Transaction', + psbtBase64: psbtData.psbt, + broadcast: false, + inputsToSign: [ + { + address: userAddress, + signingIndexes: Array.from(Array(psbtData.inputSize).keys()), + sigHash: SigHash.SINGLE | SigHash.DEFAULT_ANYONECANPAY, + }, + ], + }, + onFinish: (response) => { + const signedPsbtBase64 = response.psbtBase64; + config + .submitTransaction(signedPsbtBase64) + .then((result) => resolve(result)) + .catch((e) => reject(e)); + }, + onCancel: () => { + reject(); + }, + }); }); return result; }; From 16974659c90097f5127155921cac9e77938933eb Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 9 Jul 2024 14:45:55 +0000 Subject: [PATCH 029/168] chore: Update logic to support wallet detection on runtime --- .changeset/cool-cooks-sneeze.md | 5 ++++ .changeset/fifty-jeans-bake.md | 15 +++++++++++ apps/rosen/app/(bridge)/BridgeTransaction.tsx | 7 +++--- apps/rosen/app/(bridge)/ChooseWalletModal.tsx | 25 ++++++++++++++++++- apps/rosen/app/_hooks/useWallet.ts | 6 +++-- 5 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 .changeset/cool-cooks-sneeze.md create mode 100644 .changeset/fifty-jeans-bake.md diff --git a/.changeset/cool-cooks-sneeze.md b/.changeset/cool-cooks-sneeze.md new file mode 100644 index 00000000..37575413 --- /dev/null +++ b/.changeset/cool-cooks-sneeze.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': minor +--- + +Implement logic for automatic detection of installed wallets in runtime without the need to refresh the page. diff --git a/.changeset/fifty-jeans-bake.md b/.changeset/fifty-jeans-bake.md new file mode 100644 index 00000000..b5a0410c --- /dev/null +++ b/.changeset/fifty-jeans-bake.md @@ -0,0 +1,15 @@ +--- +'@rosen-ui/nautilus-wallet': patch +'@rosen-ui/eternl-wallet': patch +'@rosen-ui/flint-wallet': patch +'@rosen-ui/vespr-wallet': patch +'@rosen-ui/xdefi-wallet': patch +'@rosen-ui/lace-wallet': patch +'@rosen-ui/nami-wallet': patch +'@rosen-ui/wallet-api': patch +'@rosen-network/bitcoin': patch +'@rosen-network/cardano': patch +'@rosen-network/ergo': patch +--- + +Revise the wallet creation logic and update the access type for each API. diff --git a/apps/rosen/app/(bridge)/BridgeTransaction.tsx b/apps/rosen/app/(bridge)/BridgeTransaction.tsx index d942c490..57e736d0 100644 --- a/apps/rosen/app/(bridge)/BridgeTransaction.tsx +++ b/apps/rosen/app/(bridge)/BridgeTransaction.tsx @@ -69,7 +69,7 @@ const BridgeTransaction = () => { isLoading: isLoadingFees, minTransfer, } = useTransactionFees(sourceValue, targetValue, tokenValue, amountValue); - const { setSelectedWallet, availableWallets, selectedWallet } = useWallet(); + const { setSelectedWallet, wallets, selectedWallet } = useWallet(); const { selectedNetwork } = useNetwork(); @@ -225,7 +225,7 @@ const BridgeTransaction = () => { isFormSubmitting || isTransactionSubmitting || isLoadingFees } type="submit" - disabled={!availableWallets} + disabled={!sourceValue} onClick={() => { if (!selectedWallet) { setChooseWalletsModalOpen(true); @@ -243,8 +243,7 @@ const BridgeTransaction = () => { chainName={selectedNetwork?.name ?? ''} setSelectedWallet={setSelectedWallet} handleClose={() => setChooseWalletsModalOpen(false)} - supportedWallets={selectedNetwork?.supportedWallets ?? []} - availableWallets={availableWallets ?? []} + wallets={wallets || []} /> ); diff --git a/apps/rosen/app/(bridge)/ChooseWalletModal.tsx b/apps/rosen/app/(bridge)/ChooseWalletModal.tsx index 047bb512..e0cc0c28 100644 --- a/apps/rosen/app/(bridge)/ChooseWalletModal.tsx +++ b/apps/rosen/app/(bridge)/ChooseWalletModal.tsx @@ -6,8 +6,10 @@ import { DialogContentText, Grid, Tooltip, + Typography, } from '@rosen-bridge/ui-kit'; import { Wallet } from '@rosen-ui/wallet-api'; +import { useEffect, useState } from 'react'; interface ChooseWalletModalProps { open: boolean; @@ -34,22 +36,43 @@ export const ChooseWalletModal = ({ chainName, wallets, }: ChooseWalletModalProps) => { + const [, forceUpdate] = useState(0); + const handleConnect = async (wallet: Wallet) => { setSelectedWallet && (await setSelectedWallet(wallet)); handleClose(); }; + useEffect(() => { + if (!open) return; + + const timeout = setInterval(() => { + forceUpdate((prevState) => prevState + 1); + }, 2000); + + return () => { + clearInterval(timeout); + }; + }, [open]); + return ( Please choose any of the supported wallets for {chainName} chain. + theme.palette.warning.light} + variant="body1" + pt={1} + > + It may be necessary to reload this page after the following extensions + have been installed in order to connect to them. + theme.spacing(1), gap: (theme) => theme.spacing(2), mt: (theme) => theme.spacing(4), }} diff --git a/apps/rosen/app/_hooks/useWallet.ts b/apps/rosen/app/_hooks/useWallet.ts index 6cf30bc6..78c30d41 100644 --- a/apps/rosen/app/_hooks/useWallet.ts +++ b/apps/rosen/app/_hooks/useWallet.ts @@ -44,7 +44,9 @@ const useWallet = () => { let wallet: SupportedWallets | undefined; wallet = ( - selectedNetwork ? [...selectedNetwork.availableWallets] : [] + selectedNetwork + ? selectedNetwork.wallets.filter((wallet) => wallet.isAvailable()) + : [] ).find((w: SupportedWallets) => w.name === name); if (!wallet) { throw new Error(`unsupported wallet with name ${name}`); @@ -124,7 +126,7 @@ const useWallet = () => { ? { setSelectedWallet, selectedWallet: walletGlobalContext?.state.selectedWallet, - availableWallets: selectedNetwork.availableWallets, + wallets: selectedNetwork.wallets, getBalance: walletGlobalContext?.state.selectedWallet?.getBalance, } : {}; From 916947d2b09b388ee7fba638f00b613fff58c6d1 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 10 Jul 2024 10:58:50 +0000 Subject: [PATCH 030/168] chore: Rename `api` key to `getApi` in wallet api package --- apps/rosen/app/_networks/cardano/index.ts | 4 ++-- wallets/eternl-wallet/src/getBalance.ts | 2 +- wallets/eternl-wallet/src/transfer.ts | 2 +- wallets/flint-wallet/src/getBalance.ts | 2 +- wallets/flint-wallet/src/transfer.ts | 2 +- wallets/lace-wallet/src/getBalance.ts | 2 +- wallets/lace-wallet/src/transfer.ts | 2 +- wallets/nami-wallet/src/getBalance.ts | 2 +- wallets/nami-wallet/src/transfer.ts | 2 +- wallets/nautilus-wallet/src/getBalance.ts | 2 +- wallets/nautilus-wallet/src/transfer.ts | 2 +- wallets/wallet-api/src/index.ts | 4 ++-- wallets/wallet-api/src/types/index.ts | 2 +- wallets/xdefi-wallet/src/getAddressCreator.ts | 2 +- wallets/xdefi-wallet/src/getBalance.ts | 2 +- wallets/xdefi-wallet/src/transfer.ts | 4 ++-- 16 files changed, 19 insertions(+), 19 deletions(-) diff --git a/apps/rosen/app/_networks/cardano/index.ts b/apps/rosen/app/_networks/cardano/index.ts index e27fd482..709341c9 100644 --- a/apps/rosen/app/_networks/cardano/index.ts +++ b/apps/rosen/app/_networks/cardano/index.ts @@ -65,7 +65,7 @@ const CardanoNetwork: CardanoNetworkType = { isVesprAvailable() && { ...getVesprWallet(), getBalance: async (token: RosenChainToken) => { - const context = await getVesprWallet().api().enable(); + const context = await getVesprWallet().getApi().enable(); const rawValue = await context.getBalance(); const balances = await unwrap(decodeWasmValue)(rawValue); @@ -87,7 +87,7 @@ const CardanoNetwork: CardanoNetworkType = { validateDecimalPlaces(decimalBridgeFee, token.decimals); validateDecimalPlaces(decimalNetworkFee, token.decimals); - const wallet = await getVesprWallet().api().enable(); + const wallet = await getVesprWallet().getApi().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; const amount = convertNumberToBigint( diff --git a/wallets/eternl-wallet/src/getBalance.ts b/wallets/eternl-wallet/src/getBalance.ts index 027ed0f1..a93fdceb 100644 --- a/wallets/eternl-wallet/src/getBalance.ts +++ b/wallets/eternl-wallet/src/getBalance.ts @@ -6,7 +6,7 @@ import { getEternlWallet } from './getEternlWallet'; export const getBalanceCreator = (config: WalletCreatorConfig) => async (token: RosenChainToken): Promise => { - const context = await getEternlWallet().api().enable(); + const context = await getEternlWallet().getApi().enable(); const rawValue = await context.getBalance(); const balances = await config.decodeWasmValue(rawValue); diff --git a/wallets/eternl-wallet/src/transfer.ts b/wallets/eternl-wallet/src/transfer.ts index d6807bb2..7bb0a02c 100644 --- a/wallets/eternl-wallet/src/transfer.ts +++ b/wallets/eternl-wallet/src/transfer.ts @@ -19,7 +19,7 @@ export const transferCreator = validateDecimalPlaces(decimalBridgeFee, token.decimals); validateDecimalPlaces(decimalNetworkFee, token.decimals); - const wallet = await getEternlWallet().api().enable(); + const wallet = await getEternlWallet().getApi().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; const amount = convertNumberToBigint(decimalAmount * 10 ** token.decimals); diff --git a/wallets/flint-wallet/src/getBalance.ts b/wallets/flint-wallet/src/getBalance.ts index df6a89c1..bff57cc8 100644 --- a/wallets/flint-wallet/src/getBalance.ts +++ b/wallets/flint-wallet/src/getBalance.ts @@ -6,7 +6,7 @@ import { getFlintWallet } from './getFlintWallet'; export const getBalanceCreator = (config: WalletCreatorConfig) => async (token: RosenChainToken): Promise => { - const context = await getFlintWallet().api().enable(); + const context = await getFlintWallet().getApi().enable(); const rawValue = await context.getBalance(); const balances = await config.decodeWasmValue(rawValue); diff --git a/wallets/flint-wallet/src/transfer.ts b/wallets/flint-wallet/src/transfer.ts index 050d3b3a..8894463f 100644 --- a/wallets/flint-wallet/src/transfer.ts +++ b/wallets/flint-wallet/src/transfer.ts @@ -19,7 +19,7 @@ export const transferCreator = validateDecimalPlaces(decimalBridgeFee, token.decimals); validateDecimalPlaces(decimalNetworkFee, token.decimals); - const wallet = await getFlintWallet().api().enable(); + const wallet = await getFlintWallet().getApi().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; const amount = convertNumberToBigint(decimalAmount * 10 ** token.decimals); diff --git a/wallets/lace-wallet/src/getBalance.ts b/wallets/lace-wallet/src/getBalance.ts index b69bf789..d2938879 100644 --- a/wallets/lace-wallet/src/getBalance.ts +++ b/wallets/lace-wallet/src/getBalance.ts @@ -6,7 +6,7 @@ import { getLaceWallet } from './getLaceWallet'; export const getBalanceCreator = (config: WalletCreatorConfig) => async (token: RosenChainToken): Promise => { - const context = await getLaceWallet().api().enable(); + const context = await getLaceWallet().getApi().enable(); const rawValue = await context.getBalance(); const balances = await config.decodeWasmValue(rawValue); diff --git a/wallets/lace-wallet/src/transfer.ts b/wallets/lace-wallet/src/transfer.ts index 166d56c1..ba504bf1 100644 --- a/wallets/lace-wallet/src/transfer.ts +++ b/wallets/lace-wallet/src/transfer.ts @@ -19,7 +19,7 @@ export const transferCreator = validateDecimalPlaces(decimalBridgeFee, token.decimals); validateDecimalPlaces(decimalNetworkFee, token.decimals); - const wallet = await getLaceWallet().api().enable(); + const wallet = await getLaceWallet().getApi().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; const amount = convertNumberToBigint(decimalAmount * 10 ** token.decimals); diff --git a/wallets/nami-wallet/src/getBalance.ts b/wallets/nami-wallet/src/getBalance.ts index 768bb84f..c780880a 100644 --- a/wallets/nami-wallet/src/getBalance.ts +++ b/wallets/nami-wallet/src/getBalance.ts @@ -7,7 +7,7 @@ import { getNamiWallet } from './getNamiWallet'; export const getBalanceCreator = (config: WalletCreatorConfig) => async (token: RosenChainToken): Promise => { - const context = await getNamiWallet().api().enable(); + const context = await getNamiWallet().getApi().enable(); const rawValue = await context.getBalance(); const balances = await config.decodeWasmValue(rawValue); diff --git a/wallets/nami-wallet/src/transfer.ts b/wallets/nami-wallet/src/transfer.ts index 0f04c485..567d2375 100644 --- a/wallets/nami-wallet/src/transfer.ts +++ b/wallets/nami-wallet/src/transfer.ts @@ -19,7 +19,7 @@ export const transferCreator = validateDecimalPlaces(decimalBridgeFee, token.decimals); validateDecimalPlaces(decimalNetworkFee, token.decimals); - const wallet = await getNamiWallet().api().enable(); + const wallet = await getNamiWallet().getApi().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; const amount = convertNumberToBigint(decimalAmount * 10 ** token.decimals); diff --git a/wallets/nautilus-wallet/src/getBalance.ts b/wallets/nautilus-wallet/src/getBalance.ts index 117374b6..191eadc0 100644 --- a/wallets/nautilus-wallet/src/getBalance.ts +++ b/wallets/nautilus-wallet/src/getBalance.ts @@ -7,7 +7,7 @@ import { getNautilusWallet } from './getNautilusWallet'; export const getBalanceCreator = (config: WalletCreatorConfig) => async (token: RosenChainToken): Promise => { - const context = await getNautilusWallet().api().getContext(); + const context = await getNautilusWallet().getApi().getContext(); const tokenId = (token as ErgoToken).tokenId; /** * The following condition is required because nautilus only accepts diff --git a/wallets/nautilus-wallet/src/transfer.ts b/wallets/nautilus-wallet/src/transfer.ts index 7dbe863a..a820a645 100644 --- a/wallets/nautilus-wallet/src/transfer.ts +++ b/wallets/nautilus-wallet/src/transfer.ts @@ -19,7 +19,7 @@ export const transferCreator = validateDecimalPlaces(decimalBridgeFee, token.decimals); validateDecimalPlaces(decimalNetworkFee, token.decimals); - const wallet = await getNautilusWallet().api().getContext(); + const wallet = await getNautilusWallet().getApi().getContext(); const tokenId = token.tokenId; const amount = convertNumberToBigint(decimalAmount * 10 ** token.decimals); const bridgeFee = convertNumberToBigint( diff --git a/wallets/wallet-api/src/index.ts b/wallets/wallet-api/src/index.ts index fbf5e881..6eff4d25 100644 --- a/wallets/wallet-api/src/index.ts +++ b/wallets/wallet-api/src/index.ts @@ -2,11 +2,11 @@ import { RawWallet, WalletBase } from './types'; export const createRawWallet = ( wallet: WalletBase, - api: () => T + getApi: () => T ): RawWallet => { return { ...wallet, - api, + getApi, }; }; diff --git a/wallets/wallet-api/src/types/index.ts b/wallets/wallet-api/src/types/index.ts index 10e27b40..77e5ba33 100644 --- a/wallets/wallet-api/src/types/index.ts +++ b/wallets/wallet-api/src/types/index.ts @@ -41,7 +41,7 @@ export interface Wallet extends WalletBase { } export interface RawWallet extends WalletBase { - api: () => Api; + getApi: () => Api; } export * from './common'; diff --git a/wallets/xdefi-wallet/src/getAddressCreator.ts b/wallets/xdefi-wallet/src/getAddressCreator.ts index 26aaf2f7..34ac7e4f 100644 --- a/wallets/xdefi-wallet/src/getAddressCreator.ts +++ b/wallets/xdefi-wallet/src/getAddressCreator.ts @@ -7,7 +7,7 @@ export const getAddressCreator = (config: WalletCreatorConfig) => (): Promise => { return new Promise((resolve, reject) => { getXdefiWallet() - .api() + .getApi() .getAddress({ payload: { message: 'Allow Xdefi to expose wallet address', diff --git a/wallets/xdefi-wallet/src/getBalance.ts b/wallets/xdefi-wallet/src/getBalance.ts index 823f41dc..deaa98e4 100644 --- a/wallets/xdefi-wallet/src/getBalance.ts +++ b/wallets/xdefi-wallet/src/getBalance.ts @@ -7,7 +7,7 @@ export const getBalanceCreator = (config: WalletCreatorConfig) => (): Promise => { return new Promise((resolve, reject) => { getXdefiWallet() - .api() + .getApi() .getAddress({ payload: { message: '', diff --git a/wallets/xdefi-wallet/src/transfer.ts b/wallets/xdefi-wallet/src/transfer.ts index 9282d991..8df41fe2 100644 --- a/wallets/xdefi-wallet/src/transfer.ts +++ b/wallets/xdefi-wallet/src/transfer.ts @@ -33,7 +33,7 @@ export const transferCreator = const userAddress: string = await new Promise((resolve, reject) => { getXdefiWallet() - .api() + .getApi() .getAddress({ payload: { message: '', @@ -72,7 +72,7 @@ export const transferCreator = const result: string = await new Promise((resolve, reject) => { getXdefiWallet() - .api() + .getApi() .signTransaction({ payload: { network: { From 992334a99893c9abf615a371c206f3534b99fb05 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 10 Jul 2024 11:15:08 +0000 Subject: [PATCH 031/168] fix: Prevent to extra rerendering on wallet conection modal --- apps/rosen/app/(bridge)/ChooseWalletModal.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/rosen/app/(bridge)/ChooseWalletModal.tsx b/apps/rosen/app/(bridge)/ChooseWalletModal.tsx index e0cc0c28..ea7e6791 100644 --- a/apps/rosen/app/(bridge)/ChooseWalletModal.tsx +++ b/apps/rosen/app/(bridge)/ChooseWalletModal.tsx @@ -36,7 +36,7 @@ export const ChooseWalletModal = ({ chainName, wallets, }: ChooseWalletModalProps) => { - const [, forceUpdate] = useState(0); + const [, forceUpdate] = useState(''); const handleConnect = async (wallet: Wallet) => { setSelectedWallet && (await setSelectedWallet(wallet)); @@ -47,13 +47,13 @@ export const ChooseWalletModal = ({ if (!open) return; const timeout = setInterval(() => { - forceUpdate((prevState) => prevState + 1); + forceUpdate(wallets.map((wallet) => wallet.isAvailable()).join(':')); }, 2000); return () => { clearInterval(timeout); }; - }, [open]); + }, [open, wallets]); return ( From 61240d5c76cc4ec66b891f4a87f81c6a31298757 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sun, 14 Jul 2024 10:52:33 +0000 Subject: [PATCH 032/168] chore: Add ersn token support in the watcher --- .changeset/sour-bobcats-wait.md | 5 ++++ .../(home)/@infoWidgets/InfoWidgetCard.tsx | 8 ++++-- apps/watcher/app/(home)/@infoWidgets/page.tsx | 22 ++++++++++++--- apps/watcher/app/_hooks/useERsnToken.ts | 28 +++++++++++++++++++ apps/watcher/app/_mock/mockedData.ts | 2 ++ apps/watcher/app/_types/api.ts | 1 + apps/watcher/app/revenues/TableRow.tsx | 24 ++++++++++++---- 7 files changed, 79 insertions(+), 11 deletions(-) create mode 100644 .changeset/sour-bobcats-wait.md create mode 100644 apps/watcher/app/_hooks/useERsnToken.ts diff --git a/.changeset/sour-bobcats-wait.md b/.changeset/sour-bobcats-wait.md new file mode 100644 index 00000000..0a6f77e6 --- /dev/null +++ b/.changeset/sour-bobcats-wait.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/watcher-app': minor +--- + +Implement ERSN token integration for dashboard and revenue pages diff --git a/apps/watcher/app/(home)/@infoWidgets/InfoWidgetCard.tsx b/apps/watcher/app/(home)/@infoWidgets/InfoWidgetCard.tsx index 4a671ad9..11c4979a 100644 --- a/apps/watcher/app/(home)/@infoWidgets/InfoWidgetCard.tsx +++ b/apps/watcher/app/(home)/@infoWidgets/InfoWidgetCard.tsx @@ -64,7 +64,7 @@ interface InfoWidgetCardProps { color?: keyof AugmentedPalette; icon: ReactNode; isLoading?: boolean; - title: string; + title: string | ReactNode; unit?: string; value: string; } @@ -101,7 +101,11 @@ const InfoWidgetCard = ({ {unit} )} - {title} + {typeof title == 'string' ? ( + {title} + ) : ( + title + )} ); diff --git a/apps/watcher/app/(home)/@infoWidgets/page.tsx b/apps/watcher/app/(home)/@infoWidgets/page.tsx index ab75aa99..8f54a460 100644 --- a/apps/watcher/app/(home)/@infoWidgets/page.tsx +++ b/apps/watcher/app/(home)/@infoWidgets/page.tsx @@ -10,7 +10,7 @@ import { ShieldExclamation, Wallet, } from '@rosen-bridge/icons'; -import { Box, Grid, SvgIcon } from '@rosen-bridge/ui-kit'; +import { Box, Grid, SvgIcon, Typography } from '@rosen-bridge/ui-kit'; import { healthStatusColorMap } from '@rosen-ui/constants'; import { fetcher } from '@rosen-ui/swr-helpers'; import { AugmentedPalette } from '@rosen-ui/types'; @@ -19,6 +19,7 @@ import { getDecimalString } from '@rosen-ui/utils'; import InfoWidgetCard from './InfoWidgetCard'; import useRsnToken from '@/_hooks/useRsnToken'; +import useERsnToken from '@/_hooks/useERsnToken'; import useToken from '@/_hooks/useToken'; import { ApiInfoResponse } from '@/_types/api'; @@ -30,6 +31,7 @@ const InfoWidgets = () => { ); const { rsnToken, isLoading: isRsnTokenLoading } = useRsnToken(); + const { eRsnToken, isLoading: isERsnTokenLoading } = useERsnToken(); const { token: ergToken, isLoading: isErgTokenLoading } = useToken('erg'); /** @@ -150,10 +152,22 @@ const InfoWidgets = () => { + {eRsnToken?.amount !== undefined + ? getDecimalString( + eRsnToken.amount.toString(), + eRsnToken.decimals, + ) + ' eRSN' + : ''} + + } value={ rsnToken?.amount !== undefined - ? getDecimalString(rsnToken.amount.toString(), rsnToken.decimals) + ? getDecimalString( + rsnToken.amount.toString(), + rsnToken.decimals, + ) + ' RSN' : '' } icon={ @@ -165,7 +179,7 @@ const InfoWidgets = () => { } color="warning" - isLoading={isRsnTokenLoading} + isLoading={isRsnTokenLoading || isERsnTokenLoading} /> diff --git a/apps/watcher/app/_hooks/useERsnToken.ts b/apps/watcher/app/_hooks/useERsnToken.ts new file mode 100644 index 00000000..08a89fac --- /dev/null +++ b/apps/watcher/app/_hooks/useERsnToken.ts @@ -0,0 +1,28 @@ +import useSWR from 'swr'; + +import { fetcher } from '@rosen-ui/swr-helpers'; + +import useToken from './useToken'; + +import { ApiInfoResponse } from '@/_types/api'; + +/** + * fetch rsn token info (if present) + */ +const useERsnToken = () => { + const { data: info, isLoading: isInfoLoading } = useSWR( + '/info', + fetcher, + ); + + const { token: eRsnToken, isLoading: isRsnInfoLoading } = useToken( + info?.eRsnTokenId, + ); + + return { + eRsnToken, + isLoading: isInfoLoading || isRsnInfoLoading, + }; +}; + +export default useERsnToken; diff --git a/apps/watcher/app/_mock/mockedData.ts b/apps/watcher/app/_mock/mockedData.ts index 36f5ec96..91b0dae4 100644 --- a/apps/watcher/app/_mock/mockedData.ts +++ b/apps/watcher/app/_mock/mockedData.ts @@ -33,6 +33,8 @@ const info: ApiInfoResponse = { }, rsnTokenId: '6c1526b2a5ef010edb622719d9d7fbde8437a39543547c3effbe72ad33504cf1', + eRsnTokenId: + '6c1526b2a5ef010edb622719d9d7fbde8437a39543547c3effbe72ad33504cf2', version: '2.5.1', }; diff --git a/apps/watcher/app/_types/api.ts b/apps/watcher/app/_types/api.ts index cd1700f4..524f27e2 100644 --- a/apps/watcher/app/_types/api.ts +++ b/apps/watcher/app/_types/api.ts @@ -21,6 +21,7 @@ export interface ApiInfoResponse { health: 'Healthy' | 'Unstable' | 'Broken'; address: string; rsnTokenId: string; + eRsnTokenId: string; version: string; } diff --git a/apps/watcher/app/revenues/TableRow.tsx b/apps/watcher/app/revenues/TableRow.tsx index 151ff3cf..6386879c 100644 --- a/apps/watcher/app/revenues/TableRow.tsx +++ b/apps/watcher/app/revenues/TableRow.tsx @@ -8,6 +8,7 @@ import { AngleDown, AngleUp } from '@rosen-bridge/icons'; import useRsnToken from '@/_hooks/useRsnToken'; import { Revenue } from '@/_types/api'; +import useERsnToken from '@/_hooks/useERsnToken'; interface RowProps extends Revenue { isLoading?: boolean; @@ -42,7 +43,7 @@ export const tabletHeader = [ }, }, { - title: 'RSN Income', + title: 'Income (RSN/eRSN)', cellProps: { width: 150, }, @@ -138,17 +139,30 @@ export const TabletRow: FC = (props) => { const { isLoading: isLoadingProp, ...row } = props; const { rsnToken, isLoading: isRsnTokenLoading } = useRsnToken(); + const { eRsnToken, isLoading: isERsnTokenLoading } = useERsnToken(); - const isLoading = isLoadingProp || isRsnTokenLoading; + const isLoading = isLoadingProp || isRsnTokenLoading || isERsnTokenLoading; const getRSNIncome = () => { const rsnTokenInfo = row.revenues.find( (token) => token.tokenId === rsnToken?.tokenId, ); - return getDecimalString( - rsnTokenInfo?.amount.toString() ?? '0', - rsnTokenInfo?.decimals ?? 0, + const eRsnTokenInfo = row.revenues.find( + (token) => token.tokenId === eRsnToken?.tokenId, ); + + const amount = [rsnTokenInfo, eRsnTokenInfo] + .filter((info) => !!info) + .map((info) => { + return getDecimalString( + info?.amount.toString() ?? '0', + info?.decimals ?? 0, + ); + }) + .reduce((sum, amount) => sum + parseFloat(amount), 0) + .toString(); + + return amount; }; const getTokenIncome = () => From d811fb55083071ca6f266291def1998f37b0a954 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sun, 14 Jul 2024 11:50:16 +0000 Subject: [PATCH 033/168] fix: Update the logic in ersn --- apps/watcher/app/_hooks/useERsnToken.ts | 6 +++--- apps/watcher/app/revenues/TableRow.tsx | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/watcher/app/_hooks/useERsnToken.ts b/apps/watcher/app/_hooks/useERsnToken.ts index 08a89fac..010fa456 100644 --- a/apps/watcher/app/_hooks/useERsnToken.ts +++ b/apps/watcher/app/_hooks/useERsnToken.ts @@ -7,7 +7,7 @@ import useToken from './useToken'; import { ApiInfoResponse } from '@/_types/api'; /** - * fetch rsn token info (if present) + * fetch ersn token info (if present) */ const useERsnToken = () => { const { data: info, isLoading: isInfoLoading } = useSWR( @@ -15,13 +15,13 @@ const useERsnToken = () => { fetcher, ); - const { token: eRsnToken, isLoading: isRsnInfoLoading } = useToken( + const { token: eRsnToken, isLoading: isERsnInfoLoading } = useToken( info?.eRsnTokenId, ); return { eRsnToken, - isLoading: isInfoLoading || isRsnInfoLoading, + isLoading: isInfoLoading || isERsnInfoLoading, }; }; diff --git a/apps/watcher/app/revenues/TableRow.tsx b/apps/watcher/app/revenues/TableRow.tsx index 6386879c..6a242901 100644 --- a/apps/watcher/app/revenues/TableRow.tsx +++ b/apps/watcher/app/revenues/TableRow.tsx @@ -152,7 +152,6 @@ export const TabletRow: FC = (props) => { ); const amount = [rsnTokenInfo, eRsnTokenInfo] - .filter((info) => !!info) .map((info) => { return getDecimalString( info?.amount.toString() ?? '0', From 808f43fa0f412bf818830fee9ec776f867e6f457 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 15 Jul 2024 09:31:49 +0000 Subject: [PATCH 034/168] chore: Update display of token income value --- apps/watcher/app/revenues/TableRow.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/watcher/app/revenues/TableRow.tsx b/apps/watcher/app/revenues/TableRow.tsx index 6a242901..22d97c41 100644 --- a/apps/watcher/app/revenues/TableRow.tsx +++ b/apps/watcher/app/revenues/TableRow.tsx @@ -166,7 +166,11 @@ export const TabletRow: FC = (props) => { const getTokenIncome = () => row.revenues - .filter((token) => token.tokenId !== rsnToken?.tokenId) + .filter( + (token) => + token.tokenId !== rsnToken?.tokenId && + token.tokenId !== eRsnToken?.tokenId, + ) .map( (token) => `${getDecimalString(token.amount.toString(), token.decimals)} ${ From 73aa65f4131e01832f2e2dab99da8be4bd08df3c Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Thu, 18 Jul 2024 10:14:51 +0330 Subject: [PATCH 035/168] chore: Update dashboard in watcher app. --- .../app/(home)/@infoWidgets/InfoWidgetCard.tsx | 10 +++------- apps/watcher/app/(home)/@infoWidgets/page.tsx | 14 ++++++-------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/apps/watcher/app/(home)/@infoWidgets/InfoWidgetCard.tsx b/apps/watcher/app/(home)/@infoWidgets/InfoWidgetCard.tsx index 11c4979a..5a73a8e7 100644 --- a/apps/watcher/app/(home)/@infoWidgets/InfoWidgetCard.tsx +++ b/apps/watcher/app/(home)/@infoWidgets/InfoWidgetCard.tsx @@ -41,7 +41,7 @@ const InfoWidgetCardBase = styled(Card)( opacity: 0.75, }, '& .value': { - fontSize: theme.typography.h2.fontSize, + fontSize: theme.typography.h6.fontSize, fontWeight: 'bold', lineHeight: 1, '& span': { @@ -64,7 +64,7 @@ interface InfoWidgetCardProps { color?: keyof AugmentedPalette; icon: ReactNode; isLoading?: boolean; - title: string | ReactNode; + title: string; unit?: string; value: string; } @@ -101,11 +101,7 @@ const InfoWidgetCard = ({ {unit} )} - {typeof title == 'string' ? ( - {title} - ) : ( - title - )} + {title} ); diff --git a/apps/watcher/app/(home)/@infoWidgets/page.tsx b/apps/watcher/app/(home)/@infoWidgets/page.tsx index 8f54a460..81ad1c0f 100644 --- a/apps/watcher/app/(home)/@infoWidgets/page.tsx +++ b/apps/watcher/app/(home)/@infoWidgets/page.tsx @@ -153,14 +153,12 @@ const InfoWidgets = () => { - {eRsnToken?.amount !== undefined - ? getDecimalString( - eRsnToken.amount.toString(), - eRsnToken.decimals, - ) + ' eRSN' - : ''} - + eRsnToken?.amount !== undefined + ? getDecimalString( + eRsnToken.amount.toString(), + eRsnToken.decimals, + ) + ' eRSN' + : '' } value={ rsnToken?.amount !== undefined From f324b3eb0139c78bd8074b052d89c7e14e85016f Mon Sep 17 00:00:00 2001 From: Moein zargarzadeh Date: Sun, 21 Jul 2024 20:10:45 +0330 Subject: [PATCH 036/168] add github action to run tests and lint --- .changeset/long-gorillas-brake.md | 2 + .github/workflows/ci.yml | 63 +++++++++++++++++++++++++++++++ .gitlab-ci.yml | 19 +--------- build.sh | 24 ++++++++++++ package.json | 1 + vitest.config.ts | 3 +- 6 files changed, 93 insertions(+), 19 deletions(-) create mode 100644 .changeset/long-gorillas-brake.md create mode 100644 .github/workflows/ci.yml create mode 100755 build.sh diff --git a/.changeset/long-gorillas-brake.md b/.changeset/long-gorillas-brake.md new file mode 100644 index 00000000..a845151c --- /dev/null +++ b/.changeset/long-gorillas-brake.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..8b599024 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,63 @@ +name: CI + +on: + pull_request: + branches: ['master', 'dev'] + +concurrency: + group: ci-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + type-lint: + name: type-check and lint + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: 'npm' + + - run: npm ci + - run: npm run type-check --workspaces --if-present + - run: npm run lint --workspaces --if-present + + test: + name: '[node] build and test' + runs-on: ubuntu-latest + timeout-minutes: 20 + strategy: + fail-fast: false + matrix: + node-version: [18, 20] + steps: + - uses: actions/checkout@v3 + + - name: Build and test using Node.js v${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + + - run: npm ci + - run: npm run build:mono-packages + - run: npm run coverage + + changeset: + name: 'changeset' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Run changeset to check versions + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: 'npm' + + - run: git fetch origin dev + - run: npx changeset status --since=origin/dev diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index af01e405..86dfae19 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -35,24 +35,7 @@ build: - wallets/*/node_modules - wallets/*/dist script: - # FIXME: This needs to be removed when a monorepo build mechanism is added - # local:ergo/rosen-bridge/ui#24 - - npm run build --workspace packages/utils - - npm run build --workspace packages/constants - - npm run build --workspace packages/types - - npm run build --workspace packages/shared-contexts - - npm run build --workspace packages --if-present - - npm run build --workspace wallets/wallet-api - - npm run build --workspace networks/bitcoin - - npm run build --workspace networks/cardano - - npm run build --workspace networks/ergo - - npm run build --workspace wallets/nami-wallet - - npm run build --workspace wallets/lace-wallet - - npm run build --workspace wallets/eternl-wallet - - npm run build --workspace wallets/flint-wallet - - npm run build --workspace wallets/vespr-wallet - - npm run build --workspace wallets/nautilus-wallet - - npm run build --workspace wallets/xdefi-wallet + - npm run build:mono-packages type_check: stage: type_check diff --git a/build.sh b/build.sh new file mode 100755 index 00000000..97c2390d --- /dev/null +++ b/build.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# A temporary script for building rosen app inside vercel, due to vercel +# character limitation for build command +# This file should be removed when #24 is implemented + +echo "building monorepo packages..." + +npm run build --workspace packages/utils +npm run build --workspace packages/constants +npm run build --workspace packages/types +npm run build --workspace packages/shared-contexts +npm run build --workspace packages --if-present +npm run build --workspace wallets/wallet-api +npm run build --workspace networks/bitcoin +npm run build --workspace networks/cardano +npm run build --workspace networks/ergo +npm run build --workspace wallets/nami-wallet +npm run build --workspace wallets/lace-wallet +npm run build --workspace wallets/eternl-wallet +npm run build --workspace wallets/flint-wallet +npm run build --workspace wallets/vespr-wallet +npm run build --workspace wallets/nautilus-wallet +npm run build --workspace wallets/xdefi-wallet diff --git a/package.json b/package.json index 704a7c93..912865c7 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "wallets/*" ], "scripts": { + "build:mono-packages": "./build.sh", "prepare": "husky install", "test": "NODE_OPTIONS=--loader=extensionless vitest", "test:related": "NODE_OPTIONS=--loader=extensionless vitest related --run", diff --git a/vitest.config.ts b/vitest.config.ts index 46ffa35a..164b2e3c 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,7 +5,8 @@ export default defineConfig({ coverage: { enabled: true, provider: 'istanbul', - reporter: ['cobertura'], + reporter: ['cobertura', 'json-summary'], + reportOnFailure: true, }, }, }); From 8707be8ef9dec1f9567fbbdb8ddbb1d9a6cc7087 Mon Sep 17 00:00:00 2001 From: Moein zargarzadeh Date: Mon, 22 Jul 2024 15:17:52 +0330 Subject: [PATCH 037/168] fix CI action --- .github/workflows/ci.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8b599024..bd8a292f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,6 +23,7 @@ jobs: cache: 'npm' - run: npm ci + - run: npm run build:mono-packages - run: npm run type-check --workspaces --if-present - run: npm run lint --workspaces --if-present @@ -58,6 +59,6 @@ jobs: with: node-version: 18 cache: 'npm' - - - run: git fetch origin dev - - run: npx changeset status --since=origin/dev + - run: | + git fetch origin dev + npx @changesets/cli@2.27.7 status --since=origin/dev From 10f7216d5efa878f4d6c5ed5b1d731edf64e9514 Mon Sep 17 00:00:00 2001 From: Moein zargarzadeh Date: Mon, 22 Jul 2024 15:44:12 +0330 Subject: [PATCH 038/168] fix git fetch depth --- .github/workflows/ci.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bd8a292f..07231c43 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -53,12 +53,13 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 + with: + # check out full history + fetch-depth: 0 - name: Run changeset to check versions uses: actions/setup-node@v3 with: node-version: 18 cache: 'npm' - - run: | - git fetch origin dev - npx @changesets/cli@2.27.7 status --since=origin/dev + - run: npx @changesets/cli@2.27.7 status --since=origin/dev From 4212a02494b5c208a7d07a95aa25817260df9ebc Mon Sep 17 00:00:00 2001 From: Moein zargarzadeh Date: Wed, 24 Jul 2024 03:41:37 +0330 Subject: [PATCH 039/168] fix node version --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 07231c43..dde82eeb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: - name: Setup node uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20 cache: 'npm' - run: npm ci @@ -28,7 +28,7 @@ jobs: - run: npm run lint --workspaces --if-present test: - name: '[node] build and test' + name: 'build and test' runs-on: ubuntu-latest timeout-minutes: 20 strategy: @@ -60,6 +60,6 @@ jobs: - name: Run changeset to check versions uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20 cache: 'npm' - run: npx @changesets/cli@2.27.7 status --since=origin/dev From d880105f9e90f8610f74b10b00a95c631657a942 Mon Sep 17 00:00:00 2001 From: Moein zargarzadeh Date: Wed, 24 Jul 2024 13:39:28 +0330 Subject: [PATCH 040/168] improve build script in rosen-app --- apps/rosen/build.sh | 30 ------------------------------ apps/rosen/package.json | 2 +- 2 files changed, 1 insertion(+), 31 deletions(-) delete mode 100755 apps/rosen/build.sh diff --git a/apps/rosen/build.sh b/apps/rosen/build.sh deleted file mode 100755 index d266dc5d..00000000 --- a/apps/rosen/build.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash - -# A temporary script for building rosen app inside vercel, due to vercel -# character limitation for build command -# This file should be removed when #24 is implemented - -cd ../.. - -echo "building monorepo packages..." - -npm run build --workspace packages/utils -npm run build --workspace packages/constants -npm run build --workspace packages/types -npm run build --workspace packages/shared-contexts -npm run build --workspace packages --if-present -npm run build --workspace wallets/wallet-api -npm run build --workspace networks/bitcoin -npm run build --workspace networks/cardano -npm run build --workspace networks/ergo -npm run build --workspace wallets/nami-wallet -npm run build --workspace wallets/lace-wallet -npm run build --workspace wallets/eternl-wallet -npm run build --workspace wallets/flint-wallet -npm run build --workspace wallets/vespr-wallet -npm run build --workspace wallets/nautilus-wallet -npm run build --workspace wallets/xdefi-wallet - -cd apps/rosen - -npm run build diff --git a/apps/rosen/package.json b/apps/rosen/package.json index 1d1f761f..fc7278a9 100644 --- a/apps/rosen/package.json +++ b/apps/rosen/package.json @@ -11,7 +11,7 @@ "start": "next start", "test": "vitest", "get-config": "npx @rosen-bridge/cli download-assets --chain-type mainnet --out configs --include-prereleases", - "build:vercel": "./build.sh" + "build:vercel": "cd ../../ && ./build.sh && cd apps/rosen && npm run build" }, "dependencies": { "@emurgo/cardano-serialization-lib-browser": "^11.5.0", From 37953e262f6133a44614d2ff2f47c778601ad489 Mon Sep 17 00:00:00 2001 From: Mohammad Kermani Date: Tue, 23 Jul 2024 12:57:40 +0000 Subject: [PATCH 041/168] doc: update all READMEs and add one for monorepo root --- .changeset/twelve-colts-hunt.md | 8 +++++++ README.md | 20 ++++++++++++++++ apps/guard/README.md | 29 ++++++++++++++++++++++- apps/rosen-service/README.md | 6 +++-- apps/rosen/README.md | 42 ++++++++++++++++++++++++++++++++- apps/watcher/README.md | 29 ++++++++++++++++++++++- 6 files changed, 129 insertions(+), 5 deletions(-) create mode 100644 .changeset/twelve-colts-hunt.md create mode 100644 README.md diff --git a/.changeset/twelve-colts-hunt.md b/.changeset/twelve-colts-hunt.md new file mode 100644 index 00000000..e15d4c8a --- /dev/null +++ b/.changeset/twelve-colts-hunt.md @@ -0,0 +1,8 @@ +--- +'@rosen-bridge/rosen-service': patch +'@rosen-bridge/watcher-app': patch +'@rosen-bridge/guard-app': patch +'@rosen-bridge/rosen-app': patch +--- + +Update README diff --git a/README.md b/README.md new file mode 100644 index 00000000..ae690b47 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# Rosen Bridge Frontend Monorepo + +This monorepo contains all Rosen Bridge frontend applications: + +1. [Rosen App](./apps/rosen/README.md) +2. [Guard App](./apps/guard/README.md) +3. [Watcher App](./apps/watcher/README.md) +4. [Rosen Service](./apps/rosen-service/README.md) + +## Quick Start + +For setup instructions, refer to each app's README file linked above. + +## Contributing + +We welcome contributions! Please see our [Contributing Guidelines](CONTRIBUTING.md) for more information. + +## Support + +For technical support or feature requests, please open an issue in the respective app's repository. diff --git a/apps/guard/README.md b/apps/guard/README.md index 53d67991..45d5f7e1 100644 --- a/apps/guard/README.md +++ b/apps/guard/README.md @@ -1 +1,28 @@ -# Rosen Bridge guard app +# Guard App + +## Setup Guide + +Follow these steps to set up and run your local version of Guard App: + +1. **Run a Guard Service** + + - Guard App requires a running Guard Service. + - Refer to the Guard Service documentation for setup instructions. + - Important: Set `allowedOrigin` in the service config to enable API requests from localhost. + +2. **Configure API URL** + + - Open the `fetcher.ts` file. + - Set `axios.defaults.baseURL` to your Guard Service API URL. + +3. **Install Dependencies and Build Packages** + ```bash + npm install + cd apps/rosen + ./build.sh + cd ../guard + ``` +4. **Launch the App** + ```bash + npm run dev + ``` diff --git a/apps/rosen-service/README.md b/apps/rosen-service/README.md index af566f8f..44f43f76 100644 --- a/apps/rosen-service/README.md +++ b/apps/rosen-service/README.md @@ -1,3 +1,5 @@ -# @rosen-bridge/rosen-service +# Rosen Service -Rosen service, scanning and extracting data for Rosen App. +Rosen Service is the backend data provider for Rosen App. + +Documentation is currently in development. diff --git a/apps/rosen/README.md b/apps/rosen/README.md index fbe1b672..d132bbdf 100644 --- a/apps/rosen/README.md +++ b/apps/rosen/README.md @@ -1 +1,41 @@ -# Rosen Bridge app +# Rosen App + +## Setup Guide + +Follow these steps to set up and run your local version of Rosen App: + +### Prerequisites + +1. **Postgres & Rosen Service** (Optional for bridge page access) + + - Required for full functionality + - Setup instructions: [Rosen Service README](../rosen-service/README.md) + +2. **Vercel KV Instance** + - Required for API rate limiting feature + - Use Vercel KV or host your own instance + +### Installation and Configuration + +1. **Install Dependencies and Build Packages** + + ```bash + npm install + cd apps/rosen + ./build.sh + + ``` + +2. **Fetch Tokens Data** + ```bash + npm run get-config + ``` +3. **Set Environmental Variables** + ```bash + cp .env.example .env.local + # Edit .env.local with your configuration + ``` +4. **Launch the App** + ```bash + npm run dev + ``` diff --git a/apps/watcher/README.md b/apps/watcher/README.md index bbaf0ab4..a4c9a006 100644 --- a/apps/watcher/README.md +++ b/apps/watcher/README.md @@ -1 +1,28 @@ -# Rosen Bridge watcher app +# Watcher App + +## Setup Guide + +Follow these steps to set up and run your local version of Watcher App: + +1. **Run a Watcher Service** + + - Watcher App requires a running Watcher Service. + - Refer to the Watcher Service documentation for setup instructions. + - Important: Set `allowedOrigin` in the service config to enable API requests from localhost. + +2. **Configure API URL** + + - Open the `fetcher.ts` file. + - Set `axios.defaults.baseURL` to your Watcher Service API URL. + +3. **Install Dependencies and Build Packages** + ```bash + npm install + cd apps/rosen + ./build.sh + cd ../watcher + ``` +4. **Launch the App** + ```bash + npm run dev + ``` From bdb1c331ee324408cb928fd5a172c6d119828e43 Mon Sep 17 00:00:00 2001 From: Mohammad Kermani Date: Wed, 24 Jul 2024 13:46:15 +0000 Subject: [PATCH 042/168] chore: update READMEs to reflect new `build.sh` path --- apps/guard/README.md | 3 +-- apps/rosen/README.md | 3 +-- apps/watcher/README.md | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/apps/guard/README.md b/apps/guard/README.md index 45d5f7e1..b0416fa4 100644 --- a/apps/guard/README.md +++ b/apps/guard/README.md @@ -18,9 +18,8 @@ Follow these steps to set up and run your local version of Guard App: 3. **Install Dependencies and Build Packages** ```bash npm install - cd apps/rosen ./build.sh - cd ../guard + cd apps/guard ``` 4. **Launch the App** ```bash diff --git a/apps/rosen/README.md b/apps/rosen/README.md index d132bbdf..e3951a63 100644 --- a/apps/rosen/README.md +++ b/apps/rosen/README.md @@ -21,9 +21,8 @@ Follow these steps to set up and run your local version of Rosen App: ```bash npm install - cd apps/rosen ./build.sh - + cd apps/rosen ``` 2. **Fetch Tokens Data** diff --git a/apps/watcher/README.md b/apps/watcher/README.md index a4c9a006..cdfd1de1 100644 --- a/apps/watcher/README.md +++ b/apps/watcher/README.md @@ -18,9 +18,8 @@ Follow these steps to set up and run your local version of Watcher App: 3. **Install Dependencies and Build Packages** ```bash npm install - cd apps/rosen ./build.sh - cd ../watcher + cd apps/watcher ``` 4. **Launch the App** ```bash From e232d84d0c0970084be5026b34b1d62a8408d303 Mon Sep 17 00:00:00 2001 From: Mohammad Kermani Date: Sun, 28 Jul 2024 10:51:52 +0000 Subject: [PATCH 043/168] refactor(rosen-app): update assets API Remove `locked` key from assets API response in favor of `lockedPerAddress`, providing lock information for hot and cold addresses. --- apps/rosen/app/_backend/assets/repository.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/rosen/app/_backend/assets/repository.ts b/apps/rosen/app/_backend/assets/repository.ts index 767e62dc..70b2a3ac 100644 --- a/apps/rosen/app/_backend/assets/repository.ts +++ b/apps/rosen/app/_backend/assets/repository.ts @@ -88,7 +88,10 @@ export const getAllAssets = async ( .leftJoin( (queryBuilder) => queryBuilder - .select(['lae.tokenId AS "tokenId"', 'sum(lae.amount) AS "locked"']) + .select([ + 'lae.tokenId AS "tokenId"', + `jsonb_agg(to_jsonb(lae) - 'tokenId') AS "lockedPerAddress"`, + ]) .from(lockedAssetRepository.metadata.tableName, 'lae') .groupBy('lae.tokenId'), 'laeq', @@ -100,7 +103,7 @@ export const getAllAssets = async ( 'decimal', '"isNative"', '"bridged"', - '"locked"', + '"lockedPerAddress"', 'chain', 'count(*) over() AS total', ]) From b35460935d104c094bddee3e37aec011d34d0845 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 31 Jul 2024 13:36:08 +0000 Subject: [PATCH 044/168] chore: Update the asset page logic. --- .changeset/modern-jokes-complain.md | 5 + .changeset/silly-wasps-share.md | 5 + apps/rosen/app/_backend/assets/repository.ts | 2 +- apps/rosen/app/assets/DetailsDrawer.tsx | 132 ----------------- apps/rosen/app/assets/TableRow.tsx | 148 ++++++++++++------- apps/rosen/app/assets/page.tsx | 2 +- packages/utils/src/getAddressUrl.ts | 13 ++ packages/utils/src/getTokenUrl.ts | 13 ++ packages/utils/src/index.ts | 2 + 9 files changed, 136 insertions(+), 186 deletions(-) create mode 100644 .changeset/modern-jokes-complain.md create mode 100644 .changeset/silly-wasps-share.md delete mode 100644 apps/rosen/app/assets/DetailsDrawer.tsx create mode 100644 packages/utils/src/getAddressUrl.ts create mode 100644 packages/utils/src/getTokenUrl.ts diff --git a/.changeset/modern-jokes-complain.md b/.changeset/modern-jokes-complain.md new file mode 100644 index 00000000..5c4d8412 --- /dev/null +++ b/.changeset/modern-jokes-complain.md @@ -0,0 +1,5 @@ +--- +'@rosen-ui/utils': minor +--- + +Implement a utility function to retrieve the link address from the chain. diff --git a/.changeset/silly-wasps-share.md b/.changeset/silly-wasps-share.md new file mode 100644 index 00000000..40cd30c4 --- /dev/null +++ b/.changeset/silly-wasps-share.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': patch +--- + +Update the asset user interface to align with the latest API changes. diff --git a/apps/rosen/app/_backend/assets/repository.ts b/apps/rosen/app/_backend/assets/repository.ts index 70b2a3ac..2887bdcb 100644 --- a/apps/rosen/app/_backend/assets/repository.ts +++ b/apps/rosen/app/_backend/assets/repository.ts @@ -18,7 +18,7 @@ export interface Asset { decimal: number; isNative: boolean; bridged: string; - locked: string; + lockedPerAddress: Array<{ amount: number; address: string }>; chain: string; } diff --git a/apps/rosen/app/assets/DetailsDrawer.tsx b/apps/rosen/app/assets/DetailsDrawer.tsx deleted file mode 100644 index 1098cc67..00000000 --- a/apps/rosen/app/assets/DetailsDrawer.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import { - Avatar, - Box, - Grid, - Id, - Drawer, - Table, - TableBody, - TableCell, - TableRow, - Typography, - CircularProgress, -} from '@rosen-bridge/ui-kit'; - -import useSWR from 'swr'; -import { fetcher } from '@rosen-ui/swr-helpers'; - -import { ApiAssetResponse, Assets } from '@/_types/api'; -import { getDecimalString } from '@rosen-ui/utils'; - -interface DetailsDrawerProps { - asset: Assets; - open: boolean; - onClose: () => void; -} - -export const DetailsDrawer = ({ asset, open, onClose }: DetailsDrawerProps) => { - const { data, isLoading } = useSWR( - open ? `/v1/assets/detail/${asset.id}` : null, - fetcher, - ); - - return ( - - `${theme.shape.borderRadius}px ${theme.shape.borderRadius}px 0 0`, - }, - }} - open={open} - onClose={onClose} - > - - {isLoading && ( - - - - )} - {!isLoading && data && ( - - - Name - {data.token.name} - - - Id - - {data.token.id} - - - - Type - {data.token.chain} - - - Locked - - {getDecimalString(asset.locked, asset.decimal)} - - - - Bridged - - {getDecimalString(asset.bridged, asset.decimal)} - - - - Locked - {data.locked && ( - - - {data.locked.map((row) => ( - - - T - - - - - - {getDecimalString(row.amount, asset.decimal)} - - - ))} - -
- )} -
- - Bridged - {data.bridged && ( - - - {data.bridged.map((row) => ( - - - T - - {row.chain} - - {getDecimalString(row.amount, asset.decimal)} - - - ))} - -
- )} -
-
- )} -
-
- ); -}; diff --git a/apps/rosen/app/assets/TableRow.tsx b/apps/rosen/app/assets/TableRow.tsx index 2f49bd9e..00669e8d 100644 --- a/apps/rosen/app/assets/TableRow.tsx +++ b/apps/rosen/app/assets/TableRow.tsx @@ -6,14 +6,12 @@ import { OpenInNew, } from '@rosen-bridge/icons'; import { - Avatar, Box, Button, CircularProgress, Collapse, Divider, EnhancedTableCell, - Grid, IconButton, Id, Link, @@ -23,7 +21,6 @@ import { TableBody, TableCell, TableRow, - Typography, } from '@rosen-bridge/ui-kit'; import { useState, FC, useMemo } from 'react'; import useSWR from 'swr'; @@ -31,13 +28,23 @@ import { fetcher } from '@rosen-ui/swr-helpers'; import { ApiAssetResponse, Assets } from '@/_types/api'; -import { DetailsDrawer } from './DetailsDrawer'; -import { getDecimalString } from '@rosen-ui/utils'; +import { + getAddressUrl, + getDecimalString, + getTokenUrl, + getTxURL, +} from '@rosen-ui/utils'; interface RowProps extends Assets { isLoading?: boolean; } +const LOCK_ADDRESSES = [ + process.env.NEXT_PUBLIC_ERGO_LOCK_ADDRESS, + process.env.NEXT_PUBLIC_ERGO_LOCK_ADDRESS, + process.env.NEXT_PUBLIC_ERGO_LOCK_ADDRESS, +]; + export const mobileHeader = [ { title: '', @@ -127,6 +134,18 @@ export const MobileRow: FC = (props) => { setExpand((prevState) => !prevState); }; + const hot = row.lockedPerAddress.find((item) => { + return LOCK_ADDRESSES.includes(item.address) == true; + }); + + const hotUrl = getAddressUrl(row.chain, hot?.address); + + const cold = row.lockedPerAddress.find((item) => { + return LOCK_ADDRESSES.includes(item.address) != true; + }); + + const coldUrl = getAddressUrl(row.chain, cold?.address); + return ( <> @@ -134,23 +153,30 @@ export const MobileRow: FC = (props) => { {row.name} - Id - - - + Network + {row.chain} - Type - {row.chain} + Locked + + {getDecimalString( + ((hot?.amount || 0) + (cold?.amount || 0)).toString(), + row.decimal, + )} + {expand && ( <> - - Locked + Hot + + {getDecimalString(hot?.amount.toString() || '0', row.decimal)} + + + Cold - {getDecimalString(row.locked, row.decimal)} + {getDecimalString(cold?.amount.toString() || '0', row.decimal)} @@ -158,7 +184,7 @@ export const MobileRow: FC = (props) => { Bridged
- {getDecimalString(row.bridged, row.decimal)} + {getDecimalString(row.bridged.toString(), row.decimal)}
@@ -181,23 +207,7 @@ export const MobileRow: FC = (props) => { {expand ? 'Show less' : 'Show more'} - - {expand && ( - - )} -
- - - - setOpen(false)} /> ); }; @@ -212,6 +222,18 @@ export const TabletRow: FC = (props) => { fetcher, ); + const hot = row.lockedPerAddress.find((item) => { + return LOCK_ADDRESSES.includes(item.address) == true; + }); + + const hotUrl = getAddressUrl(row.chain, hot?.address); + + const cold = row.lockedPerAddress.find((item) => { + return LOCK_ADDRESSES.includes(item.address) != true; + }); + + const coldUrl = getAddressUrl(row.chain, cold?.address); + const open = expanded && data && !loading; return ( @@ -229,11 +251,16 @@ export const TabletRow: FC = (props) => { {row.name} - - - - - + {!row.isNative && ( + + + + + + )} @@ -245,26 +272,37 @@ export const TabletRow: FC = (props) => { - {getDecimalString(row.locked, row.decimal)} + {getDecimalString( + ((hot?.amount || 0) + (cold?.amount || 0)).toString(), + row.decimal, + )} - HOT - - - - - + + {getDecimalString(hot?.amount.toString() || '0', row.decimal)} + + {hotUrl && ( + + + + + + )} - COLD - - - - - + + {getDecimalString(cold?.amount.toString() || '0', row.decimal)} + + {coldUrl && ( + + + + + + )} @@ -327,10 +365,16 @@ export const TabletRow: FC = (props) => { - ID - + + diff --git a/apps/rosen/app/assets/page.tsx b/apps/rosen/app/assets/page.tsx index fa3fe487..bb03518e 100644 --- a/apps/rosen/app/assets/page.tsx +++ b/apps/rosen/app/assets/page.tsx @@ -74,7 +74,7 @@ export default function Page() { const tableHeaderProps = useMemo( () => ({ - mobile: [], + mobile: mobileHeader, tablet: tabletHeader, }), [], diff --git a/packages/utils/src/getAddressUrl.ts b/packages/utils/src/getAddressUrl.ts new file mode 100644 index 00000000..397659f3 --- /dev/null +++ b/packages/utils/src/getAddressUrl.ts @@ -0,0 +1,13 @@ +const baseTxURLs = { + ergo: 'https://explorer.ergoplatform.com/en/addresses', + cardano: 'https://cardanoscan.io/address', + bitcoin: 'https://www.blockchain.com/explorer/addresses/btc', +}; + +export const getAddressUrl = (network: string, address?: string) => { + const baseURL = baseTxURLs[network as keyof typeof baseTxURLs]; + + if (!baseURL || !address) return null; + + return `${baseURL}/${address}`; +}; diff --git a/packages/utils/src/getTokenUrl.ts b/packages/utils/src/getTokenUrl.ts new file mode 100644 index 00000000..440c3ac7 --- /dev/null +++ b/packages/utils/src/getTokenUrl.ts @@ -0,0 +1,13 @@ +const baseTxURLs = { + ergo: 'https://explorer.ergoplatform.com/en/token', + cardano: 'https://cardanoscan.io/token', + bitcoin: '', +}; + +export const getTokenUrl = (network: string, tokenId?: string) => { + const baseURL = baseTxURLs[network as keyof typeof baseTxURLs]; + + if (!baseURL || !tokenId) return null; + + return `${baseURL}/${tokenId}`; +}; diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 00ea399a..320662bb 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,4 +1,6 @@ export * from './bigint'; export * from './decimals'; export * from './hex'; +export * from './getAddressUrl'; +export * from './getTokenUrl'; export * from './getTxUrl'; From aed9ced681440be0902514acc55c6bece67eed7d Mon Sep 17 00:00:00 2001 From: Mohammad Kermani Date: Sun, 4 Aug 2024 12:21:21 +0000 Subject: [PATCH 045/168] Apply 1 suggestion(s) to 1 file(s) --- .changeset/modern-jokes-complain.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/modern-jokes-complain.md b/.changeset/modern-jokes-complain.md index 5c4d8412..35eeff9c 100644 --- a/.changeset/modern-jokes-complain.md +++ b/.changeset/modern-jokes-complain.md @@ -2,4 +2,4 @@ '@rosen-ui/utils': minor --- -Implement a utility function to retrieve the link address from the chain. +Implement a utility function to retrieve the link associated with an address in the chain. From e553d9fd9ab2cdaa7824d015e6efc491845e32e0 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sun, 4 Aug 2024 13:16:01 +0000 Subject: [PATCH 046/168] chore: Update the asset context. --- apps/rosen/app/assets/TableRow.tsx | 91 ++++++++++++++++------------- packages/utils/src/getAddressUrl.ts | 6 +- packages/utils/src/getTokenUrl.ts | 4 +- 3 files changed, 56 insertions(+), 45 deletions(-) diff --git a/apps/rosen/app/assets/TableRow.tsx b/apps/rosen/app/assets/TableRow.tsx index 00669e8d..22f3aedc 100644 --- a/apps/rosen/app/assets/TableRow.tsx +++ b/apps/rosen/app/assets/TableRow.tsx @@ -236,6 +236,13 @@ export const TabletRow: FC = (props) => { const open = expanded && data && !loading; + const tokenUrl = + !row.isNative && + getTokenUrl( + row.chain, + row.chain == 'cardano' ? row.id.replace('.', '') : row.id, + ); + return ( <> = (props) => { {row.name} - {!row.isNative && ( - + {tokenUrl && ( + @@ -347,43 +351,50 @@ export const TabletRow: FC = (props) => { {data.bridged && ( - {data.bridged.map((item) => ( - - - - - - - {item.chain} - - - - {getDecimalString(item.amount, row.decimal)} - - - - - { + const txUrl = getTxURL(item.chain, item.birdgedTokenId); + return ( + + + - - + + - - - - - ))} + {item.chain} + + + + {getDecimalString(item.amount, row.decimal)} + + + + + {txUrl && ( + + + + + + )} + + + + ); + })}
)} diff --git a/packages/utils/src/getAddressUrl.ts b/packages/utils/src/getAddressUrl.ts index 397659f3..e7bfe7a2 100644 --- a/packages/utils/src/getAddressUrl.ts +++ b/packages/utils/src/getAddressUrl.ts @@ -1,11 +1,11 @@ -const baseTxURLs = { +const baseAddressURLs = { ergo: 'https://explorer.ergoplatform.com/en/addresses', cardano: 'https://cardanoscan.io/address', - bitcoin: 'https://www.blockchain.com/explorer/addresses/btc', + bitcoin: 'https://mempool.space/address', }; export const getAddressUrl = (network: string, address?: string) => { - const baseURL = baseTxURLs[network as keyof typeof baseTxURLs]; + const baseURL = baseAddressURLs[network as keyof typeof baseAddressURLs]; if (!baseURL || !address) return null; diff --git a/packages/utils/src/getTokenUrl.ts b/packages/utils/src/getTokenUrl.ts index 440c3ac7..81c7dfc7 100644 --- a/packages/utils/src/getTokenUrl.ts +++ b/packages/utils/src/getTokenUrl.ts @@ -1,11 +1,11 @@ -const baseTxURLs = { +const baseTokenURLs = { ergo: 'https://explorer.ergoplatform.com/en/token', cardano: 'https://cardanoscan.io/token', bitcoin: '', }; export const getTokenUrl = (network: string, tokenId?: string) => { - const baseURL = baseTxURLs[network as keyof typeof baseTxURLs]; + const baseURL = baseTokenURLs[network as keyof typeof baseTokenURLs]; if (!baseURL || !tokenId) return null; From 2e9abdf59301791a3ec147f4ea17f59703705bd6 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 5 Aug 2024 11:41:59 +0000 Subject: [PATCH 047/168] feat: Develop a utility to validate the arguments for server actions. --- .changeset/orange-weeks-juggle.md | 5 ++++ apps/rosen/app/_actions/validateAddress.ts | 18 ++++++++++++- apps/rosen/app/_errors/config.ts | 5 ---- apps/rosen/app/_errors/index.ts | 10 ++++++- apps/rosen/app/_validation/index.ts | 31 ++++++++++++++++++++++ 5 files changed, 62 insertions(+), 7 deletions(-) create mode 100644 .changeset/orange-weeks-juggle.md delete mode 100644 apps/rosen/app/_errors/config.ts create mode 100644 apps/rosen/app/_validation/index.ts diff --git a/.changeset/orange-weeks-juggle.md b/.changeset/orange-weeks-juggle.md new file mode 100644 index 00000000..d9a9b0fa --- /dev/null +++ b/.changeset/orange-weeks-juggle.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': minor +--- + +Develop a utility to validate the arguments for server actions. diff --git a/apps/rosen/app/_actions/validateAddress.ts b/apps/rosen/app/_actions/validateAddress.ts index e9b1a8d7..60eeae36 100644 --- a/apps/rosen/app/_actions/validateAddress.ts +++ b/apps/rosen/app/_actions/validateAddress.ts @@ -6,13 +6,16 @@ import { Networks } from '@rosen-ui/constants'; import * as wasm from '@emurgo/cardano-serialization-lib-nodejs'; import { AvailableNetworks } from '@/_networks'; import { isValidAddress } from '@rosen-network/bitcoin'; +import { withValidation } from '@/_validation'; +import { wrap } from '@/_errors'; +import Joi from 'joi'; /** * server action to verify the wallet addresses * @param walletAddress - wallet address to verify * @returns the validation results for the passed address */ -export const validateAddress = async ( +const validateAddressCore = async ( chain: AvailableNetworks, walletAddress: string, ) => { @@ -31,3 +34,16 @@ export const validateAddress = async ( return false; } }; + +type Schema = Parameters; + +const schema = Joi.array().ordered( + Joi.string() + .required() + .valid(Networks.BITCOIN, Networks.CARDANO, Networks.ERGO), + Joi.string().required(), +); + +export const validateAddress = wrap( + withValidation(schema, validateAddressCore), +); diff --git a/apps/rosen/app/_errors/config.ts b/apps/rosen/app/_errors/config.ts deleted file mode 100644 index 6c1a0f7c..00000000 --- a/apps/rosen/app/_errors/config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { create } from './core'; - -const KEY = '__TYPE__'; - -export const { wrap, unwrap } = create(KEY, []); diff --git a/apps/rosen/app/_errors/index.ts b/apps/rosen/app/_errors/index.ts index f03c2281..b4243a4a 100644 --- a/apps/rosen/app/_errors/index.ts +++ b/apps/rosen/app/_errors/index.ts @@ -1 +1,9 @@ -export * from './config'; +import { create } from './core'; + +const KEY = '__TYPE__'; + +export class ValidationError extends Error { + static [KEY] = 'validation-error'; +} + +export const { wrap, unwrap } = create(KEY, [ValidationError]); diff --git a/apps/rosen/app/_validation/index.ts b/apps/rosen/app/_validation/index.ts new file mode 100644 index 00000000..2cad9b09 --- /dev/null +++ b/apps/rosen/app/_validation/index.ts @@ -0,0 +1,31 @@ +import Joi from 'joi'; + +import { ValidationError } from '@/_errors'; + +type AsyncFunction = ( + ...args: Args +) => Promise; + +type WithValidation = ( + schema: Joi.Schema, + handler: AsyncFunction, +) => AsyncFunction; + +/** + * Validates the arguments of an asynchronous function before executing it. + * + * @param schema - The Joi schema to validate the handler's arguments against. + * @param handler - The asynchronous function whose arguments need validation. + * @returns The original handler. + */ +export const withValidation: WithValidation = + (schema, handler) => + (...args) => { + const { error } = schema.validate(args); + + if (error) { + throw new ValidationError(error.message); + } + + return handler(...args); + }; From a136939a92be2f484eecd2e52534ec969f06af6d Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 5 Aug 2024 14:11:41 +0000 Subject: [PATCH 048/168] fix: Update asset page --- apps/rosen/app/assets/TableRow.tsx | 48 +++++++----------------------- 1 file changed, 11 insertions(+), 37 deletions(-) diff --git a/apps/rosen/app/assets/TableRow.tsx b/apps/rosen/app/assets/TableRow.tsx index 22f3aedc..daba816c 100644 --- a/apps/rosen/app/assets/TableRow.tsx +++ b/apps/rosen/app/assets/TableRow.tsx @@ -1,10 +1,4 @@ -import { - AngleDown, - AngleUp, - SquareShape, - Eye, - OpenInNew, -} from '@rosen-bridge/icons'; +import { AngleDown, AngleUp, OpenInNew } from '@rosen-bridge/icons'; import { Box, Button, @@ -41,8 +35,8 @@ interface RowProps extends Assets { const LOCK_ADDRESSES = [ process.env.NEXT_PUBLIC_ERGO_LOCK_ADDRESS, - process.env.NEXT_PUBLIC_ERGO_LOCK_ADDRESS, - process.env.NEXT_PUBLIC_ERGO_LOCK_ADDRESS, + process.env.NEXT_PUBLIC_CARDANO_LOCK_ADDRESS, + process.env.NEXT_PUBLIC_BITCOIN_LOCK_ADDRESS, ]; export const mobileHeader = [ @@ -134,13 +128,13 @@ export const MobileRow: FC = (props) => { setExpand((prevState) => !prevState); }; - const hot = row.lockedPerAddress.find((item) => { + const hot = row.lockedPerAddress?.find((item) => { return LOCK_ADDRESSES.includes(item.address) == true; }); const hotUrl = getAddressUrl(row.chain, hot?.address); - const cold = row.lockedPerAddress.find((item) => { + const cold = row.lockedPerAddress?.find((item) => { return LOCK_ADDRESSES.includes(item.address) != true; }); @@ -218,17 +212,17 @@ export const TabletRow: FC = (props) => { const [expanded, setExpanded] = useState(false); const { data, isLoading: loading } = useSWR( - expanded ? `/v1/assets/detail/${row.id}` : null, + expanded ? `/v1/assets/detail/${row.id.toLowerCase()}` : null, fetcher, ); - const hot = row.lockedPerAddress.find((item) => { + const hot = row.lockedPerAddress?.find((item) => { return LOCK_ADDRESSES.includes(item.address) == true; }); const hotUrl = getAddressUrl(row.chain, hot?.address); - const cold = row.lockedPerAddress.find((item) => { + const cold = row.lockedPerAddress?.find((item) => { return LOCK_ADDRESSES.includes(item.address) != true; }); @@ -251,12 +245,10 @@ export const TabletRow: FC = (props) => { opacity: isLoading ? 0.3 : 1.0, '& > td': { border: 0 }, }} + onClick={() => setExpanded(!open)} > - - - {row.name} {tokenUrl && ( @@ -267,14 +259,7 @@ export const TabletRow: FC = (props) => { )} - - - - - - {row.chain} - - + {row.chain} {getDecimalString( ((hot?.amount || 0) + (cold?.amount || 0)).toString(), @@ -358,18 +343,7 @@ export const TabletRow: FC = (props) => { key={item.chain} sx={{ '&:last-child td': { border: 0 } }} > - - - - - - {item.chain} - - + {item.chain} {getDecimalString(item.amount, row.decimal)} From 8cd6c97244dcf94655122a04fd376be88495ef2b Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 6 Aug 2024 11:21:27 +0000 Subject: [PATCH 049/168] fix: Update asset interface. --- apps/rosen/app/_backend/assets/repository.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/rosen/app/_backend/assets/repository.ts b/apps/rosen/app/_backend/assets/repository.ts index 2887bdcb..363554cc 100644 --- a/apps/rosen/app/_backend/assets/repository.ts +++ b/apps/rosen/app/_backend/assets/repository.ts @@ -18,7 +18,7 @@ export interface Asset { decimal: number; isNative: boolean; bridged: string; - lockedPerAddress: Array<{ amount: number; address: string }>; + lockedPerAddress?: Array<{ amount: number; address: string }>; chain: string; } From 4b91769aa60b565f6e592216ff46ca18b742bf3c Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 6 Aug 2024 11:37:28 +0000 Subject: [PATCH 050/168] chore: Update validateAddress schema. --- apps/rosen/app/_actions/validateAddress.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/rosen/app/_actions/validateAddress.ts b/apps/rosen/app/_actions/validateAddress.ts index 60eeae36..0b6962fe 100644 --- a/apps/rosen/app/_actions/validateAddress.ts +++ b/apps/rosen/app/_actions/validateAddress.ts @@ -40,7 +40,7 @@ type Schema = Parameters; const schema = Joi.array().ordered( Joi.string() .required() - .valid(Networks.BITCOIN, Networks.CARDANO, Networks.ERGO), + .valid(...Object.values(Networks)), Joi.string().required(), ); From 39bf7395151b1586b5249d29e7f2bc2f2ba1a632 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sun, 11 Aug 2024 13:15:37 +0000 Subject: [PATCH 051/168] feat: Update network packages and their wallets. --- networks/bitcoin/src/generateUnsignedTx.ts | 26 +++++- networks/bitcoin/src/types.ts | 4 +- networks/bitcoin/src/utils.ts | 4 +- .../bitcoin/unitTests/src/generateTx.test.ts | 83 ++++++++++++++++++- networks/bitcoin/unitTests/test-data.ts | 46 ++++++++++ networks/cardano/src/constants.ts | 1 + networks/cardano/src/generateUnsignedTx.ts | 33 +++++++- networks/cardano/src/types.ts | 4 +- networks/cardano/src/utils.ts | 16 +++- networks/ergo/src/constants.ts | 3 + networks/ergo/src/generateUnsignedTx.ts | 36 +++++++- networks/ergo/src/types.ts | 4 +- networks/ergo/src/utils.ts | 22 ++++- package-lock.json | 20 ++--- wallets/eternl-wallet/package.json | 2 +- wallets/eternl-wallet/src/getBalance.ts | 14 +++- wallets/eternl-wallet/src/transfer.ts | 16 +--- wallets/flint-wallet/package.json | 2 +- wallets/flint-wallet/src/getBalance.ts | 14 +++- wallets/flint-wallet/src/transfer.ts | 16 +--- wallets/lace-wallet/package.json | 2 +- wallets/lace-wallet/src/getBalance.ts | 14 +++- wallets/lace-wallet/src/transfer.ts | 16 +--- wallets/nami-wallet/package.json | 2 +- wallets/nami-wallet/src/getBalance.ts | 14 +++- wallets/nami-wallet/src/transfer.ts | 16 +--- wallets/nautilus-wallet/package.json | 2 +- wallets/nautilus-wallet/src/getBalance.ts | 20 ++++- wallets/nautilus-wallet/src/transfer.ts | 20 ++--- wallets/xdefi-wallet/package.json | 2 +- wallets/xdefi-wallet/src/getBalance.ts | 15 +++- wallets/xdefi-wallet/src/transfer.ts | 17 ++-- 32 files changed, 394 insertions(+), 112 deletions(-) create mode 100644 networks/bitcoin/unitTests/test-data.ts diff --git a/networks/bitcoin/src/generateUnsignedTx.ts b/networks/bitcoin/src/generateUnsignedTx.ts index cda14798..d187ca1d 100644 --- a/networks/bitcoin/src/generateUnsignedTx.ts +++ b/networks/bitcoin/src/generateUnsignedTx.ts @@ -9,6 +9,8 @@ import { getFeeRatio, getMinimumMeaningfulSatoshi, } from './utils'; +import { TokenMap, RosenChainToken } from '@rosen-bridge/tokens'; +import { Networks } from '@rosen-ui/constants'; /** * generates bitcoin lock tx @@ -18,7 +20,7 @@ import { * @param opReturnData * @returns */ -export const generateUnsignedTx = async ( +const generateUnsignedTxCore = async ( lockAddress: string, fromAddress: string, amount: bigint, @@ -111,3 +113,25 @@ export const generateUnsignedTx = async ( inputSize: psbt.inputCount, }; }; + +export const generateUnsignedTx = (tokenMap: TokenMap) => { + return ( + lockAddress: string, + fromAddress: string, + wrappedAmount: bigint, + opReturnData: string, + token: RosenChainToken + ) => { + const unwrappedAmount = tokenMap.unwrapAmount( + token[tokenMap.getIdKey(Networks.BITCOIN)], + wrappedAmount, + Networks.BITCOIN + ).amount; + return generateUnsignedTxCore( + lockAddress, + fromAddress, + unwrappedAmount, + opReturnData + ); + }; +}; diff --git a/networks/bitcoin/src/types.ts b/networks/bitcoin/src/types.ts index 62294a3f..c45f2215 100644 --- a/networks/bitcoin/src/types.ts +++ b/networks/bitcoin/src/types.ts @@ -1,3 +1,4 @@ +import { TokenMap } from '@rosen-bridge/tokens'; import { Wallet } from '@rosen-ui/wallet-api'; import { generateUnsignedTx } from './generateUnsignedTx'; @@ -69,8 +70,9 @@ export interface UnsignedPsbtData { export type WalletCreator = (config: WalletCreatorConfig) => Wallet; export type WalletCreatorConfig = { + getTokenMap(): Promise; generateOpReturnData: typeof generateOpReturnData; - generateUnsignedTx: typeof generateUnsignedTx; + generateUnsignedTx: ReturnType; submitTransaction: typeof submitTransaction; getAddressBalance: typeof getAddressBalance; }; diff --git a/networks/bitcoin/src/utils.ts b/networks/bitcoin/src/utils.ts index f4d70de2..65fc7b11 100644 --- a/networks/bitcoin/src/utils.ts +++ b/networks/bitcoin/src/utils.ts @@ -71,7 +71,7 @@ export const getAddressUtxos = async ( /** * gets address BTC balance from Esplora * @param address - * @returns + * @returns this is a UNWRAPPED-VALUE amount */ export const getAddressBalance = async (address: string): Promise => { const esploraUrl = process.env.BITCOIN_ESPLORA_API; @@ -96,7 +96,7 @@ export const getFeeRatio = async (): Promise => { /** * gets the minimum amount of satoshi for a utxo that can cover * additional fee for adding it to a tx - * @returns the minimum amount + * @returns the minimum UNWRAPPED-VALUE amount */ export const getMinimumMeaningfulSatoshi = (feeRatio: number): bigint => { return BigInt( diff --git a/networks/bitcoin/unitTests/src/generateTx.test.ts b/networks/bitcoin/unitTests/src/generateTx.test.ts index 5e29b882..fd06d6c2 100644 --- a/networks/bitcoin/unitTests/src/generateTx.test.ts +++ b/networks/bitcoin/unitTests/src/generateTx.test.ts @@ -1,6 +1,8 @@ import { describe, expect, it, vi } from 'vitest'; import { Psbt } from 'bitcoinjs-lib'; import { generateUnsignedTx } from '../../src'; +import { testTokenMap, multiDecimalTokenMap } from '../test-data'; +import { TokenMap } from '@rosen-bridge/tokens'; const testData = await vi.hoisted(async () => await import('./testData')); @@ -44,11 +46,12 @@ describe('generateUnsignedTx', () => { const data = '00000000007554fc820000000000962f582103f999da8e6e42660e4464d17d29e63bc006734a6710a24eb489b466323d3a9339'; - const result = await generateUnsignedTx( + const result = await generateUnsignedTx(new TokenMap(testTokenMap))( lockAddress, fromAddress, amount, - data + data, + {} as any ); const psbt = Psbt.fromBase64(result.psbt); @@ -80,6 +83,74 @@ describe('generateUnsignedTx', () => { ); }); + /** + * @target generateUnsignedTx should generate lock transaction successfully + * @dependencies + * - utils.getAddressUtxos + * - utils.getFeeRatio + * @scenario + * - run test + * - check returned data + * @expected + * - returned inputSize should be equal to inputs count in psbt + * - input count should be 1 + * - 1st input should be 1st mocked utxo + * - output count should be 3 (OP_RETURN, lock and change utxos) + * - 1st output should be OP_RETURN utxo with given data and no BTC + * - 2nd output should be to lock address with given amount + * - 3rd output should be to from address with remaining BTC minus fee + */ + it('should generate lock transaction successfully', async () => { + const lockAddress = 'bc1qkgp89fjerymm5ltg0hygnumr0m2qa7n22gyw6h'; + const fromAddress = 'bc1qhuv3dhpnm0wktasd3v0kt6e4aqfqsd0uhfdu7d'; + const wrappedAmount = 5000000n; + const unwrappedAmount = 500000000n; + const data = + '00000000007554fc820000000000962f582103f999da8e6e42660e4464d17d29e63bc006734a6710a24eb489b466323d3a9339'; + + const tokenMap = new TokenMap(multiDecimalTokenMap); + + const chain = tokenMap.getAllChains()[0]; + + const token = tokenMap.search(chain, {})[0][chain]; + + const result = await generateUnsignedTx(tokenMap)( + lockAddress, + fromAddress, + wrappedAmount, + data, + token + ); + + const psbt = Psbt.fromBase64(result.psbt); + expect(result.inputSize).toEqual(psbt.inputCount); + + expect(psbt.inputCount).toEqual(1); + const mockedInput = testData.mockedUtxos[0]; + expect(psbt.txInputs[0].hash.reverse().toString('hex')).toEqual( + mockedInput.txId + ); + expect(psbt.txInputs[0].index).toEqual(mockedInput.index); + + expect(psbt.txOutputs.length).toEqual(3); + const opReturnUtxo = psbt.txOutputs[0]; + expect(opReturnUtxo.script.toString('hex')).toEqual( + '6a' + // OP_RETURN + (data.length / 2).toString(16).padStart(2, '0') + + data + ); + expect(opReturnUtxo.value).toEqual(0); + const lockUtxo = psbt.txOutputs[1]; + expect(lockUtxo.address).toEqual(lockAddress); + expect(lockUtxo.value).toEqual(Number(unwrappedAmount)); + const changeUtxo = psbt.txOutputs[2]; + expect(changeUtxo.address).toEqual(fromAddress); + const expectedFee = 203n; + expect(changeUtxo.value).toEqual( + Number(mockedInput.value - unwrappedAmount - expectedFee) + ); + }); + /** * @target generateUnsignedTx should throw error when address utxos cannot cover required BTC * @dependencies @@ -98,7 +169,13 @@ describe('generateUnsignedTx', () => { '00000000007554fc820000000000962f582103f999da8e6e42660e4464d17d29e63bc006734a6710a24eb489b466323d3a9339'; await expect(async () => { - await generateUnsignedTx(lockAddress, fromAddress, amount, data); + await generateUnsignedTx(new TokenMap(testTokenMap))( + lockAddress, + fromAddress, + amount, + data, + {} as any + ); }).rejects.toThrow(Error); }); }); diff --git a/networks/bitcoin/unitTests/test-data.ts b/networks/bitcoin/unitTests/test-data.ts new file mode 100644 index 00000000..6631ce4a --- /dev/null +++ b/networks/bitcoin/unitTests/test-data.ts @@ -0,0 +1,46 @@ +import { RosenTokens } from '@rosen-bridge/tokens'; + +export const testTokenMap: RosenTokens = JSON.parse(` + { + "idKeys" : { + "ergo" : "tokenId", + "cardano" : "tokenId", + "bitcoin" : "tokenId" + }, + "tokens" : [] + } +`); + +export const multiDecimalTokenMap: RosenTokens = JSON.parse(` + { + "idKeys" : { + "ergo" : "tokenId", + "cardano" : "tokenId", + "bitcoin" : "tokenId" + }, + "tokens" : [ + { + "cardano": { + "tokenId": "6d7cc9577a04be165cc4f2cf36f580dbeaf88f68e78f790805430940.72734254432d6c6f656e", + "policyId": "6d7cc9577a04be165cc4f2cf36f580dbeaf88f68e78f790805430940", + "assetName": "72734254432d6c6f656e", + "name": "rsBTC-loen", + "decimals": 6, + "metaData": { + "type": "CIP26", + "residency": "wrapped" + } + }, + "bitcoin": { + "tokenId": "btc", + "name": "BTC", + "decimals": 8, + "metaData": { + "type": "native", + "residency": "native" + } + } + } + ] + } +`); diff --git a/networks/cardano/src/constants.ts b/networks/cardano/src/constants.ts index 5eacf5e1..f04afa9e 100644 --- a/networks/cardano/src/constants.ts +++ b/networks/cardano/src/constants.ts @@ -1 +1,2 @@ +// THIS IS AN UNWRAPPED-VALUE export const feeAndMinBoxValue = 3000000n; diff --git a/networks/cardano/src/generateUnsignedTx.ts b/networks/cardano/src/generateUnsignedTx.ts index d88f0d6d..b08c57c2 100644 --- a/networks/cardano/src/generateUnsignedTx.ts +++ b/networks/cardano/src/generateUnsignedTx.ts @@ -15,6 +15,8 @@ import { sumAssetBalance, walletUtxoToCardanoUtxo, } from './utils'; +import { TokenMap } from '@rosen-bridge/tokens'; +import { Networks } from '@rosen-ui/constants'; /** * generates a lock transaction on Cardano @@ -27,7 +29,7 @@ import { * @param auxiliaryData * @returns hex representation of the unsigned tx */ -export const generateUnsignedTx = async ( +const generateUnsignedTxCore = async ( walletUtxos: string[], lockAddress: string, changeAddressHex: string, @@ -77,7 +79,7 @@ export const generateUnsignedTx = async ( const utxos = await Promise.all(walletUtxos.map(walletUtxoToCardanoUtxo)); // add required ADA estimation for tx fee and change box requiredAssets.nativeToken += feeAndMinBoxValue; - // get input boxes + // get input boxes, THIS FUNCTION WORKS WITH UNWRAPPED-VALUE const inputs = await selectCardanoUtxos( requiredAssets, [], @@ -135,3 +137,30 @@ export const generateUnsignedTx = async ( const tx = wasm.Transaction.new(txBody, witnessSet, auxiliaryData); return tx.to_hex(); }; + +export const generateUnsignedTx = (tokenMap: TokenMap) => { + return ( + walletUtxos: string[], + lockAddress: string, + changeAddressHex: string, + policyIdHex: string, + assetNameHex: string, + wrappedAmount: bigint, + auxiliaryDataHex: string + ) => { + const unwrappedAmount = tokenMap.unwrapAmount( + `${policyIdHex}.${assetNameHex}`, + wrappedAmount, + Networks.CARDANO + ).amount; + return generateUnsignedTxCore( + walletUtxos, + lockAddress, + changeAddressHex, + policyIdHex, + assetNameHex, + unwrappedAmount.toString(), + auxiliaryDataHex + ); + }; +}; diff --git a/networks/cardano/src/types.ts b/networks/cardano/src/types.ts index cd1c1e43..400ae867 100644 --- a/networks/cardano/src/types.ts +++ b/networks/cardano/src/types.ts @@ -1,3 +1,4 @@ +import { TokenMap } from '@rosen-bridge/tokens'; import { CipWalletApi, Wallet } from '@rosen-ui/wallet-api'; import { generateUnsignedTx } from './generateUnsignedTx'; @@ -22,9 +23,10 @@ export const ADA_POLICY_ID = ''; export type WalletCreator = (config: WalletCreatorConfig) => Wallet; export type WalletCreatorConfig = { + getTokenMap(): Promise; decodeWasmValue: typeof decodeWasmValue; generateLockAuxiliaryData: typeof generateLockAuxiliaryData; - generateUnsignedTx: typeof generateUnsignedTx; + generateUnsignedTx: ReturnType; setTxWitnessSet: typeof setTxWitnessSet; }; diff --git a/networks/cardano/src/utils.ts b/networks/cardano/src/utils.ts index d4adbedc..d0a6189f 100644 --- a/networks/cardano/src/utils.ts +++ b/networks/cardano/src/utils.ts @@ -130,6 +130,9 @@ export const generateLockAuxiliaryData = async ( /** * converts utxo type from wallet type to CardanoUtxo + * + * THIS FUNCTION WORKS WITH UNWRAPPED VALUES + * * @param serializedUtxo serialized hex string of TransactionUnspentOutput */ export const walletUtxoToCardanoUtxo = ( @@ -165,6 +168,10 @@ export const walletUtxoToCardanoUtxo = ( /** * sums two AssetBalance + * + * IT DOESN'T MATTER WHETHER THESE VALUES ARE WRAPPED OR UNWRAPPED; + * WHAT TRULY MATTERS IS THE CONTEXT IN WHICH THIS FUNCTION IS USED. + * * @param a first AssetBalance object * @param b second AssetBalance object * @returns aggregated AssetBalance @@ -192,6 +199,9 @@ export const sumAssetBalance = ( /** * converts CardanoUtxo assets to AssetBalance + * + * THIS FUNCTION WORKS WITH UNWRAPPED-VALUE + * * @param utxo * @returns */ @@ -207,6 +217,10 @@ export const getUtxoAssets = (utxo: CardanoUtxo): AssetBalance => { /** * subtracts two AssetBalance + * + * IT DOESN'T MATTER WHETHER THESE VALUES ARE WRAPPED OR UNWRAPPED; + * WHAT TRULY MATTERS IS THE CONTEXT IN WHICH THIS FUNCTION IS USED. + * * @param a first AssetBalance object * @param b second AssetBalance object * @param minimumNativeToken minimum allowed native token @@ -254,7 +268,7 @@ export const subtractAssetBalance = ( /** * generates cardano box in TransactionOutput type - * @param balance + * @param balance THIS IS AN UNWRAPPED-VALUE * @param address * @returns */ diff --git a/networks/ergo/src/constants.ts b/networks/ergo/src/constants.ts index 94b71d35..982e0aec 100644 --- a/networks/ergo/src/constants.ts +++ b/networks/ergo/src/constants.ts @@ -1,2 +1,5 @@ +// THIS IS AN UNWRAPPED-VALUE export const fee = 1000000n; + +// THIS IS AN UNWRAPPED-VALUE export const minBoxValue = 400000n; diff --git a/networks/ergo/src/generateUnsignedTx.ts b/networks/ergo/src/generateUnsignedTx.ts index bdcd07f9..79e2e18f 100644 --- a/networks/ergo/src/generateUnsignedTx.ts +++ b/networks/ergo/src/generateUnsignedTx.ts @@ -14,6 +14,8 @@ import { } from './utils'; import * as wasm from 'ergo-lib-wasm-nodejs'; import { ErgoBoxProxy } from '@rosen-bridge/ergo-box-selection'; +import { TokenMap, RosenChainToken } from '@rosen-bridge/tokens'; +import { Networks } from '@rosen-ui/constants'; /** * generates an unsigned lock transaction on Ergo @@ -28,7 +30,7 @@ import { ErgoBoxProxy } from '@rosen-bridge/ergo-box-selection'; * @param networkFee * @returns */ -export const generateUnsignedTx = async ( +const generateUnsignedTxCore = async ( changeAddress: string, walletUtxos: ErgoBoxProxy[], lockAddress: string, @@ -118,3 +120,35 @@ export const generateUnsignedTx = async ( ); return unsignedTransactionToProxy(unsignedTx, inputs.boxes); }; + +export const generateUnsignedTx = (tokenMap: TokenMap) => { + return ( + changeAddress: string, + walletUtxos: ErgoBoxProxy[], + lockAddress: string, + toChain: string, + toAddress: string, + wrappedAmount: bigint, + bridgeFeeString: string, + networkFeeString: string, + token: RosenChainToken + ) => { + const tokenId = token[tokenMap.getIdKey(Networks.ERGO)]; + const unwrappedAmount = tokenMap.unwrapAmount( + tokenId, + wrappedAmount, + Networks.ERGO + ).amount; + return generateUnsignedTxCore( + changeAddress, + walletUtxos, + lockAddress, + toChain, + toAddress, + tokenId, + unwrappedAmount.toString(), + bridgeFeeString, + networkFeeString + ); + }; +}; diff --git a/networks/ergo/src/types.ts b/networks/ergo/src/types.ts index 2f93bebc..5b245c8e 100644 --- a/networks/ergo/src/types.ts +++ b/networks/ergo/src/types.ts @@ -1,3 +1,4 @@ +import { TokenMap } from '@rosen-bridge/tokens'; import { EipWalletApi, ErgoBoxProxy, Wallet } from '@rosen-ui/wallet-api'; import { generateUnsignedTx } from './generateUnsignedTx'; @@ -25,7 +26,8 @@ export interface CoveringBoxes { export type WalletCreator = (config: WalletCreatorConfig) => Wallet; export type WalletCreatorConfig = { - generateUnsignedTx: typeof generateUnsignedTx; + getTokenMap(): Promise; + generateUnsignedTx: ReturnType; }; /** diff --git a/networks/ergo/src/utils.ts b/networks/ergo/src/utils.ts index 7d58d93d..8cf50354 100644 --- a/networks/ergo/src/utils.ts +++ b/networks/ergo/src/utils.ts @@ -20,7 +20,7 @@ export const getHeight = async (): Promise => { * @param lockAddress * @param height * @param tokenId - * @param amount + * @param amount THIS IS AN UNWRAPPED-VALUE * @param toChain * @param toAddress * @param fromAddress @@ -75,6 +75,9 @@ export const createLockBox = ( /** * creates change box candidate + * + * THIS FUNCTION WORKS WITH UNWRAPPED VALUES + * * @param changeAddress * @param height * @param balance @@ -102,6 +105,9 @@ export const createChangeBox = ( /** * extracts box id and assets of a box + * + * THIS FUNCTION WORKS WITH UNWRAPPED VALUES + * * @param box the box * @returns an object containing the box id and assets */ @@ -120,6 +126,9 @@ const getBoxInfo = (box: ErgoBoxProxy): BoxInfo => { /** * select useful boxes for an address until required assets are satisfied + * + * THIS FUNCTION WORKS WITH UNWRAPPED VALUES + * * @param address the address * @param requiredAssets the required assets * @param forbiddenBoxIds the id of forbidden boxes @@ -201,6 +210,10 @@ export const getCoveringBoxes = async ( /** * sums two AssetBalance + * + * IT DOESN'T MATTER WHETHER THESE VALUES ARE WRAPPED OR UNWRAPPED; + * WHAT TRULY MATTERS IS THE CONTEXT IN WHICH THIS FUNCTION IS USED. + * * @param a first AssetBalance object * @param b second AssetBalance object * @returns aggregated AssetBalance @@ -228,6 +241,10 @@ export const sumAssetBalance = ( /** * subtracts two AssetBalance + * + * IT DOESN'T MATTER WHETHER THESE VALUES ARE WRAPPED OR UNWRAPPED; + * WHAT TRULY MATTERS IS THE CONTEXT IN WHICH THIS FUNCTION IS USED. + * * @param a first AssetBalance object * @param b second AssetBalance object * @param minimumNativeToken minimum allowed native token @@ -275,6 +292,9 @@ export const subtractAssetBalance = ( /** * calculates box assets + * + * THIS FUNCTION WORKS WITH UNWRAPPED VALUES + * * @param utxo * @returns */ diff --git a/package-lock.json b/package-lock.json index 7b6b2e8e..9c30994f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4099,9 +4099,9 @@ "link": true }, "node_modules/@rosen-bridge/tokens": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/tokens/-/tokens-1.1.0.tgz", - "integrity": "sha512-Ott48bFRKoK4h+ePUuPmWFUtOCGcuWiAbPrZ7h9BgX6GRj3/NTpzPFQgnaXk62oyJrZgWubgpcuQTf1yieTS+Q==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rosen-bridge/tokens/-/tokens-1.2.1.tgz", + "integrity": "sha512-sWn2XMQvzLKRZTlw3mlZZWLGy81XzFEJuLu/WBPq0EyHy2eXFSOacID7uwvD+EIoldfwwraX1bv/+u3gY0gKHw==" }, "node_modules/@rosen-bridge/tss": { "version": "1.2.0", @@ -17034,7 +17034,7 @@ "version": "0.1.3", "dependencies": { "@rosen-bridge/icons": "^0.4.0", - "@rosen-bridge/tokens": "^1.1.0", + "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/cardano": "^0.1.1", "@rosen-ui/utils": "^0.3.0", "@rosen-ui/wallet-api": "^1.0.2" @@ -17067,7 +17067,7 @@ "version": "0.1.3", "dependencies": { "@rosen-bridge/icons": "^0.4.0", - "@rosen-bridge/tokens": "^1.1.0", + "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/cardano": "^0.1.1", "@rosen-ui/utils": "^0.3.0", "@rosen-ui/wallet-api": "^1.0.2" @@ -17100,7 +17100,7 @@ "version": "0.1.3", "dependencies": { "@rosen-bridge/icons": "^0.4.0", - "@rosen-bridge/tokens": "^1.1.0", + "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/cardano": "^0.1.1", "@rosen-ui/utils": "^0.3.0", "@rosen-ui/wallet-api": "^1.0.2" @@ -17133,7 +17133,7 @@ "version": "0.1.3", "dependencies": { "@rosen-bridge/icons": "^0.4.0", - "@rosen-bridge/tokens": "^1.1.0", + "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/cardano": "^0.1.1", "@rosen-ui/utils": "^0.3.0", "@rosen-ui/wallet-api": "^1.0.2" @@ -17170,7 +17170,7 @@ "@rosen-ui/wallet-api": "^1.0.2" }, "devDependencies": { - "@rosen-bridge/tokens": "^1.1.0", + "@rosen-bridge/tokens": "^1.2.1", "@rosen-ui/utils": "^0.3.0", "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.26.0", @@ -17206,7 +17206,7 @@ "@rosen-ui/wallet-api": "^1.0.2" }, "devDependencies": { - "@rosen-bridge/tokens": "^1.0.0", + "@rosen-bridge/tokens": "^1.2.1", "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.26.0", "eslint": "^8.16.0", @@ -17269,7 +17269,7 @@ "@rosen-bridge/address-codec": "^0.2.1", "@rosen-bridge/bitcoin-utxo-selection": "^0.2.0", "@rosen-bridge/icons": "^0.4.0", - "@rosen-bridge/tokens": "^1.1.0", + "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/bitcoin": "^0.2.0", "@rosen-ui/constants": "^0.0.3", "@rosen-ui/utils": "^0.3.0", diff --git a/wallets/eternl-wallet/package.json b/wallets/eternl-wallet/package.json index 1313e30e..bc9026e4 100644 --- a/wallets/eternl-wallet/package.json +++ b/wallets/eternl-wallet/package.json @@ -21,7 +21,7 @@ }, "dependencies": { "@rosen-bridge/icons": "^0.4.0", - "@rosen-bridge/tokens": "^1.1.0", + "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/cardano": "^0.1.1", "@rosen-ui/utils": "^0.3.0", "@rosen-ui/wallet-api": "^1.0.2" diff --git a/wallets/eternl-wallet/src/getBalance.ts b/wallets/eternl-wallet/src/getBalance.ts index a93fdceb..5e831420 100644 --- a/wallets/eternl-wallet/src/getBalance.ts +++ b/wallets/eternl-wallet/src/getBalance.ts @@ -1,5 +1,6 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; +import { Networks } from '@rosen-ui/constants'; import { getEternlWallet } from './getEternlWallet'; @@ -11,5 +12,16 @@ export const getBalanceCreator = const balances = await config.decodeWasmValue(rawValue); const amount = balances.find((asset) => asset.policyId === token.policyId); - return amount ? Number(amount.quantity) : 0; + + if (!amount) return 0; + + const tokenMap = await config.getTokenMap(); + + const wrappedAmount = tokenMap.wrapAmount( + token[tokenMap.getIdKey(Networks.CARDANO)], + amount.quantity, + Networks.CARDANO + ).amount; + + return Number(wrappedAmount); }; diff --git a/wallets/eternl-wallet/src/transfer.ts b/wallets/eternl-wallet/src/transfer.ts index 7bb0a02c..bedb16bf 100644 --- a/wallets/eternl-wallet/src/transfer.ts +++ b/wallets/eternl-wallet/src/transfer.ts @@ -15,20 +15,12 @@ export const transferCreator = decimalNetworkFee: number, lockAddress: string ): Promise => { - validateDecimalPlaces(decimalAmount, token.decimals); - validateDecimalPlaces(decimalBridgeFee, token.decimals); - validateDecimalPlaces(decimalNetworkFee, token.decimals); - const wallet = await getEternlWallet().getApi().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; - const amount = convertNumberToBigint(decimalAmount * 10 ** token.decimals); - const bridgeFee = convertNumberToBigint( - decimalBridgeFee * 10 ** token.decimals - ); - const networkFee = convertNumberToBigint( - decimalNetworkFee * 10 ** token.decimals - ); + const amount = convertNumberToBigint(decimalAmount); + const bridgeFee = convertNumberToBigint(decimalBridgeFee); + const networkFee = convertNumberToBigint(decimalNetworkFee); const changeAddressHex = await wallet.getChangeAddress(); const auxiliaryDataHex = await config.generateLockAuxiliaryData( @@ -47,7 +39,7 @@ export const transferCreator = changeAddressHex, policyIdHex, assetNameHex, - amount.toString(), + amount, auxiliaryDataHex ); diff --git a/wallets/flint-wallet/package.json b/wallets/flint-wallet/package.json index 98e28363..2c71ff73 100644 --- a/wallets/flint-wallet/package.json +++ b/wallets/flint-wallet/package.json @@ -21,7 +21,7 @@ }, "dependencies": { "@rosen-bridge/icons": "^0.4.0", - "@rosen-bridge/tokens": "^1.1.0", + "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/cardano": "^0.1.1", "@rosen-ui/utils": "^0.3.0", "@rosen-ui/wallet-api": "^1.0.2" diff --git a/wallets/flint-wallet/src/getBalance.ts b/wallets/flint-wallet/src/getBalance.ts index bff57cc8..644dd68a 100644 --- a/wallets/flint-wallet/src/getBalance.ts +++ b/wallets/flint-wallet/src/getBalance.ts @@ -1,5 +1,6 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; +import { Networks } from '@rosen-ui/constants'; import { getFlintWallet } from './getFlintWallet'; @@ -11,5 +12,16 @@ export const getBalanceCreator = const balances = await config.decodeWasmValue(rawValue); const amount = balances.find((asset) => asset.policyId === token.policyId); - return amount ? Number(amount.quantity) : 0; + + if (!amount) return 0; + + const tokenMap = await config.getTokenMap(); + + const wrappedAmount = tokenMap.wrapAmount( + token[tokenMap.getIdKey(Networks.CARDANO)], + amount.quantity, + Networks.CARDANO + ).amount; + + return Number(wrappedAmount); }; diff --git a/wallets/flint-wallet/src/transfer.ts b/wallets/flint-wallet/src/transfer.ts index 8894463f..bc86896a 100644 --- a/wallets/flint-wallet/src/transfer.ts +++ b/wallets/flint-wallet/src/transfer.ts @@ -15,20 +15,12 @@ export const transferCreator = decimalNetworkFee: number, lockAddress: string ): Promise => { - validateDecimalPlaces(decimalAmount, token.decimals); - validateDecimalPlaces(decimalBridgeFee, token.decimals); - validateDecimalPlaces(decimalNetworkFee, token.decimals); - const wallet = await getFlintWallet().getApi().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; - const amount = convertNumberToBigint(decimalAmount * 10 ** token.decimals); - const bridgeFee = convertNumberToBigint( - decimalBridgeFee * 10 ** token.decimals - ); - const networkFee = convertNumberToBigint( - decimalNetworkFee * 10 ** token.decimals - ); + const amount = convertNumberToBigint(decimalAmount); + const bridgeFee = convertNumberToBigint(decimalBridgeFee); + const networkFee = convertNumberToBigint(decimalNetworkFee); const changeAddressHex = await wallet.getChangeAddress(); const auxiliaryDataHex = await config.generateLockAuxiliaryData( @@ -47,7 +39,7 @@ export const transferCreator = changeAddressHex, policyIdHex, assetNameHex, - amount.toString(), + amount, auxiliaryDataHex ); diff --git a/wallets/lace-wallet/package.json b/wallets/lace-wallet/package.json index 9c290881..d7215f6d 100644 --- a/wallets/lace-wallet/package.json +++ b/wallets/lace-wallet/package.json @@ -21,7 +21,7 @@ }, "dependencies": { "@rosen-bridge/icons": "^0.4.0", - "@rosen-bridge/tokens": "^1.1.0", + "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/cardano": "^0.1.1", "@rosen-ui/utils": "^0.3.0", "@rosen-ui/wallet-api": "^1.0.2" diff --git a/wallets/lace-wallet/src/getBalance.ts b/wallets/lace-wallet/src/getBalance.ts index d2938879..e3d79006 100644 --- a/wallets/lace-wallet/src/getBalance.ts +++ b/wallets/lace-wallet/src/getBalance.ts @@ -1,5 +1,6 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; +import { Networks } from '@rosen-ui/constants'; import { getLaceWallet } from './getLaceWallet'; @@ -11,5 +12,16 @@ export const getBalanceCreator = const balances = await config.decodeWasmValue(rawValue); const amount = balances.find((asset) => asset.policyId === token.policyId); - return amount ? Number(amount.quantity) : 0; + + if (!amount) return 0; + + const tokenMap = await config.getTokenMap(); + + const wrappedAmount = tokenMap.wrapAmount( + token[tokenMap.getIdKey(Networks.CARDANO)], + amount.quantity, + Networks.CARDANO + ).amount; + + return Number(wrappedAmount); }; diff --git a/wallets/lace-wallet/src/transfer.ts b/wallets/lace-wallet/src/transfer.ts index ba504bf1..b57583bb 100644 --- a/wallets/lace-wallet/src/transfer.ts +++ b/wallets/lace-wallet/src/transfer.ts @@ -15,20 +15,12 @@ export const transferCreator = decimalNetworkFee: number, lockAddress: string ): Promise => { - validateDecimalPlaces(decimalAmount, token.decimals); - validateDecimalPlaces(decimalBridgeFee, token.decimals); - validateDecimalPlaces(decimalNetworkFee, token.decimals); - const wallet = await getLaceWallet().getApi().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; - const amount = convertNumberToBigint(decimalAmount * 10 ** token.decimals); - const bridgeFee = convertNumberToBigint( - decimalBridgeFee * 10 ** token.decimals - ); - const networkFee = convertNumberToBigint( - decimalNetworkFee * 10 ** token.decimals - ); + const amount = convertNumberToBigint(decimalAmount); + const bridgeFee = convertNumberToBigint(decimalBridgeFee); + const networkFee = convertNumberToBigint(decimalNetworkFee); const changeAddressHex = await wallet.getChangeAddress(); const auxiliaryDataHex = await config.generateLockAuxiliaryData( @@ -47,7 +39,7 @@ export const transferCreator = changeAddressHex, policyIdHex, assetNameHex, - amount.toString(), + amount, auxiliaryDataHex ); diff --git a/wallets/nami-wallet/package.json b/wallets/nami-wallet/package.json index 36580de0..224d0474 100644 --- a/wallets/nami-wallet/package.json +++ b/wallets/nami-wallet/package.json @@ -21,7 +21,7 @@ }, "dependencies": { "@rosen-bridge/icons": "^0.4.0", - "@rosen-bridge/tokens": "^1.1.0", + "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/cardano": "^0.1.1", "@rosen-ui/utils": "^0.3.0", "@rosen-ui/wallet-api": "^1.0.2" diff --git a/wallets/nami-wallet/src/getBalance.ts b/wallets/nami-wallet/src/getBalance.ts index c780880a..088742ec 100644 --- a/wallets/nami-wallet/src/getBalance.ts +++ b/wallets/nami-wallet/src/getBalance.ts @@ -1,6 +1,7 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; import { hexToCbor } from '@rosen-ui/utils'; +import { Networks } from '@rosen-ui/constants'; import { getNamiWallet } from './getNamiWallet'; @@ -16,5 +17,16 @@ export const getBalanceCreator = asset.policyId === token.policyId && (asset.nameHex === hexToCbor(token.assetName) || !token.policyId) ); - return amount ? Number(amount.quantity) : 0; + + if (!amount) return 0; + + const tokenMap = await config.getTokenMap(); + + const wrappedAmount = tokenMap.wrapAmount( + token[tokenMap.getIdKey(Networks.CARDANO)], + amount.quantity, + Networks.CARDANO + ).amount; + + return Number(wrappedAmount); }; diff --git a/wallets/nami-wallet/src/transfer.ts b/wallets/nami-wallet/src/transfer.ts index 567d2375..80c4e79c 100644 --- a/wallets/nami-wallet/src/transfer.ts +++ b/wallets/nami-wallet/src/transfer.ts @@ -15,20 +15,12 @@ export const transferCreator = decimalNetworkFee: number, lockAddress: string ): Promise => { - validateDecimalPlaces(decimalAmount, token.decimals); - validateDecimalPlaces(decimalBridgeFee, token.decimals); - validateDecimalPlaces(decimalNetworkFee, token.decimals); - const wallet = await getNamiWallet().getApi().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; - const amount = convertNumberToBigint(decimalAmount * 10 ** token.decimals); - const bridgeFee = convertNumberToBigint( - decimalBridgeFee * 10 ** token.decimals - ); - const networkFee = convertNumberToBigint( - decimalNetworkFee * 10 ** token.decimals - ); + const amount = convertNumberToBigint(decimalAmount); + const bridgeFee = convertNumberToBigint(decimalBridgeFee); + const networkFee = convertNumberToBigint(decimalNetworkFee); const changeAddressHex = await wallet.getChangeAddress(); const auxiliaryDataHex = await config.generateLockAuxiliaryData( @@ -47,7 +39,7 @@ export const transferCreator = changeAddressHex, policyIdHex, assetNameHex, - amount.toString(), + amount, auxiliaryDataHex ); diff --git a/wallets/nautilus-wallet/package.json b/wallets/nautilus-wallet/package.json index 4e6f92cf..2a492c04 100644 --- a/wallets/nautilus-wallet/package.json +++ b/wallets/nautilus-wallet/package.json @@ -12,7 +12,7 @@ "type-check": "tsc --noEmit" }, "devDependencies": { - "@rosen-bridge/tokens": "^1.1.0", + "@rosen-bridge/tokens": "^1.2.1", "@rosen-ui/utils": "^0.3.0", "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.26.0", diff --git a/wallets/nautilus-wallet/src/getBalance.ts b/wallets/nautilus-wallet/src/getBalance.ts index 191eadc0..95a87570 100644 --- a/wallets/nautilus-wallet/src/getBalance.ts +++ b/wallets/nautilus-wallet/src/getBalance.ts @@ -1,6 +1,6 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/ergo'; -import { ErgoToken } from '@rosen-ui/wallet-api'; +import { Networks } from '@rosen-ui/constants'; import { getNautilusWallet } from './getNautilusWallet'; @@ -8,7 +8,10 @@ export const getBalanceCreator = (config: WalletCreatorConfig) => async (token: RosenChainToken): Promise => { const context = await getNautilusWallet().getApi().getContext(); - const tokenId = (token as ErgoToken).tokenId; + + const tokenMap = await config.getTokenMap(); + + const tokenId = token[tokenMap.getIdKey(Networks.ERGO)]; /** * The following condition is required because nautilus only accepts * uppercase ERG as tokenId for the erg native token @@ -16,5 +19,16 @@ export const getBalanceCreator = const balance = await context.get_balance( tokenId === 'erg' ? 'ERG' : tokenId ); - return +balance; + + const amount = BigInt(balance); + + if (!amount) return 0; + + const wrappedAmount = tokenMap.wrapAmount( + tokenId, + amount, + Networks.ERGO + ).amount; + + return Number(wrappedAmount); }; diff --git a/wallets/nautilus-wallet/src/transfer.ts b/wallets/nautilus-wallet/src/transfer.ts index a820a645..ef60cada 100644 --- a/wallets/nautilus-wallet/src/transfer.ts +++ b/wallets/nautilus-wallet/src/transfer.ts @@ -15,19 +15,11 @@ export const transferCreator = decimalNetworkFee: number, lockAddress: string ): Promise => { - validateDecimalPlaces(decimalAmount, token.decimals); - validateDecimalPlaces(decimalBridgeFee, token.decimals); - validateDecimalPlaces(decimalNetworkFee, token.decimals); - const wallet = await getNautilusWallet().getApi().getContext(); const tokenId = token.tokenId; - const amount = convertNumberToBigint(decimalAmount * 10 ** token.decimals); - const bridgeFee = convertNumberToBigint( - decimalBridgeFee * 10 ** token.decimals - ); - const networkFee = convertNumberToBigint( - decimalNetworkFee * 10 ** token.decimals - ); + const amount = convertNumberToBigint(decimalAmount); + const bridgeFee = convertNumberToBigint(decimalBridgeFee); + const networkFee = convertNumberToBigint(decimalNetworkFee); const changeAddress = await wallet.get_change_address(); const walletUtxos = await wallet.get_utxos(); @@ -39,10 +31,10 @@ export const transferCreator = lockAddress, toChain, toAddress, - tokenId, - amount.toString(), + amount, bridgeFee.toString(), - networkFee.toString() + networkFee.toString(), + token ); const signedTx = await wallet.sign_tx(unsignedTx); const result = await wallet.submit_tx(signedTx); diff --git a/wallets/xdefi-wallet/package.json b/wallets/xdefi-wallet/package.json index 11d350b5..b298141a 100644 --- a/wallets/xdefi-wallet/package.json +++ b/wallets/xdefi-wallet/package.json @@ -23,7 +23,7 @@ "@rosen-bridge/address-codec": "^0.2.1", "@rosen-bridge/bitcoin-utxo-selection": "^0.2.0", "@rosen-bridge/icons": "^0.4.0", - "@rosen-bridge/tokens": "^1.1.0", + "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/bitcoin": "^0.2.0", "@rosen-ui/constants": "^0.0.3", "@rosen-ui/utils": "^0.3.0", diff --git a/wallets/xdefi-wallet/src/getBalance.ts b/wallets/xdefi-wallet/src/getBalance.ts index deaa98e4..3b597279 100644 --- a/wallets/xdefi-wallet/src/getBalance.ts +++ b/wallets/xdefi-wallet/src/getBalance.ts @@ -1,10 +1,13 @@ import { WalletCreatorConfig } from '@rosen-network/bitcoin'; import { AddressPurpose, BitcoinNetworkType } from 'sats-connect'; +import { Networks } from '@rosen-ui/constants'; +import { RosenChainToken } from '@rosen-bridge/tokens'; import { getXdefiWallet } from './getXdefiWallet'; export const getBalanceCreator = - (config: WalletCreatorConfig) => (): Promise => { + (config: WalletCreatorConfig) => + (token: RosenChainToken): Promise => { return new Promise((resolve, reject) => { getXdefiWallet() .getApi() @@ -25,6 +28,16 @@ export const getBalanceCreator = config .getAddressBalance(address) .then((balance) => resolve(Number(balance))) + .then((balance) => + config.getTokenMap().then((tokenMap) => { + const wrappedAmount = tokenMap.wrapAmount( + token[tokenMap.getIdKey(Networks.BITCOIN)], + BigInt(Number(balance)), + Networks.BITCOIN + ).amount; + resolve(Number(wrappedAmount)); + }) + ) .catch((e) => reject(e)); } else reject(); }, diff --git a/wallets/xdefi-wallet/src/transfer.ts b/wallets/xdefi-wallet/src/transfer.ts index 8df41fe2..4017a79d 100644 --- a/wallets/xdefi-wallet/src/transfer.ts +++ b/wallets/xdefi-wallet/src/transfer.ts @@ -19,17 +19,9 @@ export const transferCreator = decimalNetworkFee: number, lockAddress: string ): Promise => { - validateDecimalPlaces(decimalAmount, token.decimals); - validateDecimalPlaces(decimalBridgeFee, token.decimals); - validateDecimalPlaces(decimalNetworkFee, token.decimals); - - const amount = convertNumberToBigint(decimalAmount * 10 ** token.decimals); - const bridgeFee = convertNumberToBigint( - decimalBridgeFee * 10 ** token.decimals - ); - const networkFee = convertNumberToBigint( - decimalNetworkFee * 10 ** token.decimals - ); + const amount = convertNumberToBigint(decimalAmount); + const bridgeFee = convertNumberToBigint(decimalBridgeFee); + const networkFee = convertNumberToBigint(decimalNetworkFee); const userAddress: string = await new Promise((resolve, reject) => { getXdefiWallet() @@ -67,7 +59,8 @@ export const transferCreator = lockAddress, userAddress, amount, - opReturnData + opReturnData, + token ); const result: string = await new Promise((resolve, reject) => { From 5273c10e7467f88ddce4548e96ba35addadf2dcc Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sun, 11 Aug 2024 15:03:43 +0000 Subject: [PATCH 052/168] chore: Update rosen app --- apps/rosen/app/_actions/calculateFee.ts | 1 + apps/rosen/app/_backend/utils.ts | 2 ++ apps/rosen/app/_hooks/useTokenBalance.ts | 6 ++-- apps/rosen/app/_hooks/useTokenMap.ts | 17 ++++++++++ .../app/_networks/bitcoin/getMaxTransfer.ts | 12 ++++++- apps/rosen/app/_networks/bitcoin/index.ts | 3 ++ apps/rosen/app/_networks/bitcoin/server.ts | 6 +++- .../app/_networks/cardano/getMaxTransfer.ts | 31 +++++++++++++++++ apps/rosen/app/_networks/cardano/index.ts | 16 ++++----- apps/rosen/app/_networks/cardano/server.ts | 6 +++- .../app/_networks/ergo/getMaxTransfer.ts | 34 +++++++++++++++++++ apps/rosen/app/_networks/ergo/index.ts | 11 +++--- apps/rosen/app/_networks/ergo/server.ts | 8 +++-- apps/rosen/app/_networks/getTokenMap.ts | 12 +++++++ apps/rosen/app/_types/network.ts | 1 + apps/rosen/app/_utils/getMaxTransfer.ts | 3 +- apps/rosen/app/_utils/index.ts | 5 ++- 17 files changed, 150 insertions(+), 24 deletions(-) create mode 100644 apps/rosen/app/_hooks/useTokenMap.ts create mode 100644 apps/rosen/app/_networks/cardano/getMaxTransfer.ts create mode 100644 apps/rosen/app/_networks/ergo/getMaxTransfer.ts create mode 100644 apps/rosen/app/_networks/getTokenMap.ts diff --git a/apps/rosen/app/_actions/calculateFee.ts b/apps/rosen/app/_actions/calculateFee.ts index 4d664282..b67891bd 100644 --- a/apps/rosen/app/_actions/calculateFee.ts +++ b/apps/rosen/app/_actions/calculateFee.ts @@ -38,6 +38,7 @@ const GetHeight = { * @param height * @param explorerUrl * @param nextHeightInterval + * @returns CONTAINS WRAPPED-VALUE */ export const calculateFee = wrap( diff --git a/apps/rosen/app/_backend/utils.ts b/apps/rosen/app/_backend/utils.ts index 4d4798ef..6f72dafe 100644 --- a/apps/rosen/app/_backend/utils.ts +++ b/apps/rosen/app/_backend/utils.ts @@ -1,3 +1,5 @@ +'use server'; + import fs from 'fs'; import path from 'path'; diff --git a/apps/rosen/app/_hooks/useTokenBalance.ts b/apps/rosen/app/_hooks/useTokenBalance.ts index aeb1bc33..e4c2b8c2 100644 --- a/apps/rosen/app/_hooks/useTokenBalance.ts +++ b/apps/rosen/app/_hooks/useTokenBalance.ts @@ -9,12 +9,13 @@ import { SupportedWallets } from '@/_types/network'; interface UseTokenBalance { isLoading: boolean; - amount: number; + amount: number; // THIS IS A WRAPPED-VALUE token: TokenInfo | null; } /** * returns the amount of currently selected asset + * @returns CONTAINS A WRAPPED-VALUE */ const useTokenBalance = () => { const [balanceState, setBalanceState] = useState({ @@ -32,7 +33,7 @@ const useTokenBalance = () => { const getAssetBalance = useCallback( async (wallet: SupportedWallets) => { setBalanceState({ isLoading: true, amount: 0, token: null }); - const balance = await wallet.getBalance(token); + const balance = await wallet.getBalance(token); // THIS IS A WRAPPED-VALUE setBalanceState({ isLoading: false, amount: balance || 0, token }); }, [token], @@ -51,6 +52,7 @@ const useTokenBalance = () => { tokenField.value && !balanceState.isLoading && (balanceState.token !== token || + // THIS IS A WRAPPED-VALUE balanceState.amount !== (await selectedWallet.getBalance(token))) ) getAssetBalance(selectedWallet); diff --git a/apps/rosen/app/_hooks/useTokenMap.ts b/apps/rosen/app/_hooks/useTokenMap.ts new file mode 100644 index 00000000..5ba5a341 --- /dev/null +++ b/apps/rosen/app/_hooks/useTokenMap.ts @@ -0,0 +1,17 @@ +import { useMemo } from 'react'; +import { TokenMap } from '@rosen-bridge/tokens'; + +import { useTokensMap } from './useTokensMap'; + +/** + * return TokenMap instance + */ +export const useTokenMap = () => { + const tokensMapObject = useTokensMap(); + + const tokenMap = useMemo(() => { + return new TokenMap(tokensMapObject); + }, [tokensMapObject]); + + return tokenMap; +}; diff --git a/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts b/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts index a6942684..c8575da2 100644 --- a/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts @@ -10,6 +10,8 @@ import { import { wrap } from '@/_errors'; import { BitcoinNetwork } from '@/_types/network'; +import { Networks } from '@rosen-ui/constants'; +import { getTokenMap } from '../getTokenMap'; /** * get max transfer for bitcoin @@ -45,6 +47,14 @@ export const getMaxTransfer = wrap( const estimatedFee = Math.ceil((estimatedTxWeight / 4) * feeRatio); const minSatoshi = await getMinimumMeaningfulSatoshi(feeRatio); + const tokenMap = await getTokenMap(); + + const offset = tokenMap.wrapAmount( + 'btc', + BigInt(estimatedFee) + minSatoshi, + Networks.BITCOIN, + ).amount; + return balance < 0 || !isNative ? 0 : /** @@ -53,6 +63,6 @@ export const getMaxTransfer = wrap( * * local:ergo/rosen-bridge/utils#204 */ - balance - estimatedFee - Number(minSatoshi) - utxos.length - 1; + balance - Number(offset) - utxos.length - 1; }, ); diff --git a/apps/rosen/app/_networks/bitcoin/index.ts b/apps/rosen/app/_networks/bitcoin/index.ts index b4c09acc..29d6227c 100644 --- a/apps/rosen/app/_networks/bitcoin/index.ts +++ b/apps/rosen/app/_networks/bitcoin/index.ts @@ -15,6 +15,8 @@ import { getAddressBalance, } from './server'; +import { getTokenMap } from '../getTokenMap'; + /** * the main object for Bitcoin network * providing access to network info and wallets and network specific @@ -26,6 +28,7 @@ const BitcoinNetwork: BitcoinNetworkType = { logo: BitcoinIcon, wallets: [ xdefiWalletCreator({ + getTokenMap, generateOpReturnData: unwrap(generateOpReturnData), generateUnsignedTx: unwrap(generateUnsignedTx), getAddressBalance: unwrap(getAddressBalance), diff --git a/apps/rosen/app/_networks/bitcoin/server.ts b/apps/rosen/app/_networks/bitcoin/server.ts index 5e4cd2e9..ed07de59 100644 --- a/apps/rosen/app/_networks/bitcoin/server.ts +++ b/apps/rosen/app/_networks/bitcoin/server.ts @@ -8,8 +8,12 @@ import { } from '@rosen-network/bitcoin'; import { wrap } from '@/_errors'; +import { TokenMap } from '@rosen-bridge/tokens'; +import { getRosenTokens } from '@/_backend/utils'; export const generateOpReturnData = wrap(generateOpReturnDataCore); -export const generateUnsignedTx = wrap(generateUnsignedTxCore); +export const generateUnsignedTx = wrap( + generateUnsignedTxCore(new TokenMap(getRosenTokens())), +); export const getAddressBalance = wrap(getAddressBalanceCore); export const submitTransaction = wrap(submitTransactionCore); diff --git a/apps/rosen/app/_networks/cardano/getMaxTransfer.ts b/apps/rosen/app/_networks/cardano/getMaxTransfer.ts new file mode 100644 index 00000000..b5c81c50 --- /dev/null +++ b/apps/rosen/app/_networks/cardano/getMaxTransfer.ts @@ -0,0 +1,31 @@ +'use server'; + +import { feeAndMinBoxValue } from '@rosen-network/cardano/dist/src/constants'; +import { Networks } from '@rosen-ui/constants'; + +import { wrap } from '@/_errors'; +import { CardanoNetwork } from '@/_types/network'; + +import { getTokenMap } from '../getTokenMap'; + +/** + * get max transfer for cardano + */ +export const getMaxTransfer = wrap( + async ({ + balance, + isNative, + }: Parameters[0]) => { + const tokenMap = await getTokenMap(); + const feeAndMinBoxValueWrapped = tokenMap.wrapAmount( + 'ada', + feeAndMinBoxValue, + Networks.CARDANO, + ).amount; + const offsetCandidateWrapped = Number(feeAndMinBoxValueWrapped); + const shouldApplyOffset = isNative; + const offset = shouldApplyOffset ? offsetCandidateWrapped : 0; + const amount = balance - offset; + return amount < 0 ? 0 : amount; + }, +); diff --git a/apps/rosen/app/_networks/cardano/index.ts b/apps/rosen/app/_networks/cardano/index.ts index 709341c9..4a1e7fc5 100644 --- a/apps/rosen/app/_networks/cardano/index.ts +++ b/apps/rosen/app/_networks/cardano/index.ts @@ -28,6 +28,8 @@ import getVesprWallet, { isVesprAvailable, walletInfo as vesprWalletInfo, } from '@rosen-ui/vespr-wallet'; +import { getTokenMap } from '../getTokenMap'; +import { getMaxTransfer } from './getMaxTransfer'; /** * the main object for Cardano network @@ -39,24 +41,28 @@ const CardanoNetwork: CardanoNetworkType = { label: 'Cardano', wallets: compact([ eternlWalletCreator({ + getTokenMap, decodeWasmValue: unwrap(decodeWasmValue), generateLockAuxiliaryData: unwrap(generateLockAuxiliaryData), generateUnsignedTx: unwrap(generateUnsignedTx), setTxWitnessSet: unwrap(setTxWitnessSet), }), flintWalletCreator({ + getTokenMap, decodeWasmValue: unwrap(decodeWasmValue), generateLockAuxiliaryData: unwrap(generateLockAuxiliaryData), generateUnsignedTx: unwrap(generateUnsignedTx), setTxWitnessSet: unwrap(setTxWitnessSet), }), laceWalletCreator({ + getTokenMap, decodeWasmValue: unwrap(decodeWasmValue), generateLockAuxiliaryData: unwrap(generateLockAuxiliaryData), generateUnsignedTx: unwrap(generateUnsignedTx), setTxWitnessSet: unwrap(setTxWitnessSet), }), namiWalletCreator({ + getTokenMap, decodeWasmValue: unwrap(decodeWasmValue), generateLockAuxiliaryData: unwrap(generateLockAuxiliaryData), generateUnsignedTx: unwrap(generateUnsignedTx), @@ -117,7 +123,7 @@ const CardanoNetwork: CardanoNetworkType = { changeAddressHex, policyIdHex, assetNameHex, - amount.toString(), + amount, auxiliaryDataHex, ); @@ -134,13 +140,7 @@ const CardanoNetwork: CardanoNetworkType = { nextHeightInterval: 25, logo: CardanoIcon, lockAddress: process.env.NEXT_PUBLIC_CARDANO_LOCK_ADDRESS!, - async getMaxTransfer({ balance, isNative }) { - const offsetCandidate = Number(feeAndMinBoxValue); - const shouldApplyOffset = isNative; - const offset = shouldApplyOffset ? offsetCandidate : 0; - const amount = balance - offset; - return amount < 0 ? 0 : amount; - }, + getMaxTransfer: unwrap(getMaxTransfer), }; export default CardanoNetwork; diff --git a/apps/rosen/app/_networks/cardano/server.ts b/apps/rosen/app/_networks/cardano/server.ts index 82dcba4d..dc5f6bd2 100644 --- a/apps/rosen/app/_networks/cardano/server.ts +++ b/apps/rosen/app/_networks/cardano/server.ts @@ -8,8 +8,12 @@ import { } from '@rosen-network/cardano'; import { wrap } from '@/_errors'; +import { TokenMap } from '@rosen-bridge/tokens'; +import { getRosenTokens } from '@/_backend/utils'; export const decodeWasmValue = wrap(decodeWasmValueCore); export const generateLockAuxiliaryData = wrap(generateLockAuxiliaryDataCore); -export const generateUnsignedTx = wrap(generateUnsignedTxCore); +export const generateUnsignedTx = wrap( + generateUnsignedTxCore(new TokenMap(getRosenTokens())), +); export const setTxWitnessSet = wrap(setTxWitnessSetCore); diff --git a/apps/rosen/app/_networks/ergo/getMaxTransfer.ts b/apps/rosen/app/_networks/ergo/getMaxTransfer.ts new file mode 100644 index 00000000..fa784ca6 --- /dev/null +++ b/apps/rosen/app/_networks/ergo/getMaxTransfer.ts @@ -0,0 +1,34 @@ +'use server'; + +import { + fee as ergoFee, + minBoxValue as ergoMinBoxValue, +} from '@rosen-network/ergo/dist/src/constants'; +import { Networks } from '@rosen-ui/constants'; + +import { wrap } from '@/_errors'; +import { CardanoNetwork } from '@/_types/network'; + +import { getTokenMap } from '../getTokenMap'; + +/** + * get max transfer for ergo + */ +export const getMaxTransfer = wrap( + async ({ + balance, + isNative, + }: Parameters[0]) => { + const tokenMap = await getTokenMap(); + const feeAndMinBoxValueWrapped = tokenMap.wrapAmount( + 'erg', + ergoFee + ergoMinBoxValue, + Networks.ERGO, + ).amount; + const offsetCandidateWrapped = Number(feeAndMinBoxValueWrapped); + const shouldApplyOffset = isNative; + const offset = shouldApplyOffset ? offsetCandidateWrapped : 0; + const amount = balance - offset; + return amount < 0 ? 0 : amount; + }, +); diff --git a/apps/rosen/app/_networks/ergo/index.ts b/apps/rosen/app/_networks/ergo/index.ts index e990f9c0..7e8779e5 100644 --- a/apps/rosen/app/_networks/ergo/index.ts +++ b/apps/rosen/app/_networks/ergo/index.ts @@ -12,6 +12,8 @@ import { } from '@rosen-network/ergo/dist/src/constants'; import { generateUnsignedTx } from './server'; +import { getTokenMap } from '../getTokenMap'; +import { getMaxTransfer } from './getMaxTransfer'; /** * the main object for Ergo network @@ -23,19 +25,14 @@ const ErgoNetwork: ErgoNetworkType = { label: 'Ergo', wallets: [ nautilusWalletCreator({ + getTokenMap, generateUnsignedTx: unwrap(generateUnsignedTx), }), ], logo: ErgoIcon, nextHeightInterval: 5, lockAddress: process.env.NEXT_PUBLIC_ERGO_LOCK_ADDRESS!, - async getMaxTransfer({ balance, isNative }) { - const offsetCandidate = Number(ergoFee + ergoMinBoxValue); - const shouldApplyOffset = isNative; - const offset = shouldApplyOffset ? offsetCandidate : 0; - const amount = balance - offset; - return amount < 0 ? 0 : amount; - }, + getMaxTransfer: unwrap(getMaxTransfer), }; export default ErgoNetwork; diff --git a/apps/rosen/app/_networks/ergo/server.ts b/apps/rosen/app/_networks/ergo/server.ts index 1e1ccfff..7218a80e 100644 --- a/apps/rosen/app/_networks/ergo/server.ts +++ b/apps/rosen/app/_networks/ergo/server.ts @@ -2,6 +2,10 @@ import { generateUnsignedTx as generateUnsignedTxCore } from '@rosen-network/ergo'; -import { unwrap } from '@/_errors'; +import { wrap } from '@/_errors'; +import { TokenMap } from '@rosen-bridge/tokens'; +import { getRosenTokens } from '@/_backend/utils'; -export const generateUnsignedTx = unwrap(generateUnsignedTxCore); +export const generateUnsignedTx = wrap( + generateUnsignedTxCore(new TokenMap(getRosenTokens())), +); diff --git a/apps/rosen/app/_networks/getTokenMap.ts b/apps/rosen/app/_networks/getTokenMap.ts new file mode 100644 index 00000000..793f1434 --- /dev/null +++ b/apps/rosen/app/_networks/getTokenMap.ts @@ -0,0 +1,12 @@ +import { TokenMap } from '@rosen-bridge/tokens'; + +import { getRosenTokens } from '@/_backend/utils'; + +let tokenMap: TokenMap; + +export const getTokenMap = async () => { + if (tokenMap) return tokenMap; + const tokens = await getRosenTokens(); + tokenMap = new TokenMap(tokens); + return tokenMap; +}; diff --git a/apps/rosen/app/_types/network.ts b/apps/rosen/app/_types/network.ts index 226b5b51..75e2128c 100644 --- a/apps/rosen/app/_types/network.ts +++ b/apps/rosen/app/_types/network.ts @@ -20,6 +20,7 @@ export interface BaseNetwork< wallets: Wallet[]; nextHeightInterval: number; lockAddress: string; + // THIS FUNCTION WORKS WITH WRAPPED-VALUE getMaxTransfer: ( props: GetMaxTransferParams & GetMaxTransferParamsExtra, ) => Promise; diff --git a/apps/rosen/app/_utils/getMaxTransfer.ts b/apps/rosen/app/_utils/getMaxTransfer.ts index 940c2fd3..407c261d 100644 --- a/apps/rosen/app/_utils/getMaxTransfer.ts +++ b/apps/rosen/app/_utils/getMaxTransfer.ts @@ -3,8 +3,9 @@ import { BitcoinNetwork, CardanoNetwork, ErgoNetwork } from '@/_types/network'; /** * return max transfer, considering all the context that affects it * @param network - * @param tokenInfo + * @param tokenInfo CONTAINS A WRAPPED-VALUE * @param context + * @returns THIS IS A WRAPPED-VALUE */ const getMaxTransfer = async ( network: ErgoNetwork | CardanoNetwork | BitcoinNetwork, diff --git a/apps/rosen/app/_utils/index.ts b/apps/rosen/app/_utils/index.ts index 273009e5..2829fb8d 100644 --- a/apps/rosen/app/_utils/index.ts +++ b/apps/rosen/app/_utils/index.ts @@ -29,6 +29,7 @@ export const getTokenNameAndId = ( * @param token * @param amount * @param sourceChain + * @returns A WRAPPED-VALUE */ export const getMinTransfer = async ( token: RosenChainToken, @@ -61,7 +62,9 @@ export const getMinTransfer = async ( return minTransfer ? getDecimalString( (minTransfer + 1).toString() || '0', - token?.decimals || 0, + tokenMap.getSignificantDecimals( + token[tokenMap.getIdKey(sourceChain)], + ) || 0, ) : '0'; } catch { From 8783e4f3d711d53868f25b41c57c8041e59d4301 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sun, 11 Aug 2024 16:29:56 +0000 Subject: [PATCH 053/168] chore: Use significant decimals instead of token decimals in the Rosen App. --- apps/rosen/app/(bridge)/BridgeForm.tsx | 16 +++++++++++++--- apps/rosen/app/_hooks/useBridgeForm.ts | 21 ++++++++++----------- apps/rosen/app/_hooks/useMaxTransfer.ts | 1 + apps/rosen/app/_hooks/useTokenBalance.ts | 6 ++++-- apps/rosen/app/_hooks/useTransaction.ts | 18 +++++++++++++++++- 5 files changed, 45 insertions(+), 17 deletions(-) diff --git a/apps/rosen/app/(bridge)/BridgeForm.tsx b/apps/rosen/app/(bridge)/BridgeForm.tsx index 24ed2434..576d96e6 100644 --- a/apps/rosen/app/(bridge)/BridgeForm.tsx +++ b/apps/rosen/app/(bridge)/BridgeForm.tsx @@ -24,6 +24,7 @@ import { getTokenNameAndId } from '@/_utils'; import useMaxTransfer from '@/_hooks/useMaxTransfer'; import useTokenBalance from '@/_hooks/useTokenBalance'; import useTransactionFormData from '@/_hooks/useTransactionFormData'; +import { useTokenMap } from '@/_hooks/useTokenMap'; /** * customized form input @@ -100,6 +101,7 @@ const BridgeForm = () => { const { isLoading, amount, token } = useTokenBalance(); const { max } = useMaxTransfer(); + const tokenMap = useTokenMap(); const renderSelectedNetwork = (value: unknown) => { const network = availableNetworks.find( @@ -171,13 +173,16 @@ const BridgeForm = () => { ); const handleSelectMax = useCallback(async () => { - const value = getDecimalString(max.toString(), token?.decimals ?? 0); + const value = getDecimalString( + max.toString(), + tokenMap.getSignificantDecimals(tokenField.value?.tokenId) ?? 0, + ); setValue('amount', value, { shouldDirty: true, shouldTouch: true, }); - }, [max, token?.decimals, setValue]); + }, [max, tokenMap, tokenField.value, setValue]); const renderInputActions = () => ( <> @@ -192,7 +197,12 @@ const BridgeForm = () => { {`Balance: ${ isLoading ? 'loading...' - : getDecimalString(amount.toString(), token?.decimals ?? 0) + : getDecimalString( + amount.toString(), + tokenMap.getSignificantDecimals( + tokenField.value.tokenId, + ) ?? 0, + ) }`} diff --git a/apps/rosen/app/_hooks/useBridgeForm.ts b/apps/rosen/app/_hooks/useBridgeForm.ts index 197f28c9..06a39db7 100644 --- a/apps/rosen/app/_hooks/useBridgeForm.ts +++ b/apps/rosen/app/_hooks/useBridgeForm.ts @@ -13,6 +13,7 @@ import { validateAddress } from '@/_actions/validateAddress'; import { AvailableNetworks, availableNetworks } from '@/_networks'; import { getMinTransfer } from '@/_utils/index'; import getMaxTransfer from '@/_utils/getMaxTransfer'; +import { useTokenMap } from './useTokenMap'; const validationCache = new Map(); @@ -25,6 +26,7 @@ const useBridgeForm = () => { const { control, resetField, reset, setValue, formState, setFocus } = useTransactionFormData(); + const tokenMap = useTokenMap(); const tokensMap = useTokensMap(); const walletGlobalContext = useContext(WalletContext); @@ -49,6 +51,9 @@ const useBridgeForm = () => { control, rules: { validate: async (value) => { + const decimals = + tokenMap.getSignificantDecimals(tokenField.value.tokenId) || 0; + // match any complete or incomplete decimal number const match = value.match(/^(\d+(\.(?\d+)?)?)?$/); @@ -58,10 +63,9 @@ const useBridgeForm = () => { // prevent user from entering more decimals than token decimals const isDecimalsLarge = - (match?.groups?.floatingDigits?.length ?? 0) > - tokenField.value?.decimals; + (match?.groups?.floatingDigits?.length ?? 0) > decimals; if (isDecimalsLarge) - return `The current token only supports ${tokenField.value?.decimals} decimals`; + return `The current token only supports ${decimals} decimals`; if (walletGlobalContext!.state.selectedWallet) { // prevent user from entering more than token amount @@ -87,7 +91,7 @@ const useBridgeForm = () => { ); const isAmountLarge = - BigInt(getNonDecimalString(value, tokenField.value?.decimals)) > + BigInt(getNonDecimalString(value, decimals)) > BigInt(maxTransfer.toString()); if (isAmountLarge) return 'Balance insufficient'; } @@ -99,13 +103,8 @@ const useBridgeForm = () => { tokensMap, ); const isAmountSmall = - BigInt(getNonDecimalString(value, tokenField.value?.decimals)) < - BigInt( - getNonDecimalString( - minTransfer.toString(), - tokenField.value.decimals, - ), - ); + BigInt(getNonDecimalString(value, decimals)) < + BigInt(getNonDecimalString(minTransfer.toString(), decimals)); if (isAmountSmall) return 'Minimum transfer amount not respected'; return undefined; diff --git a/apps/rosen/app/_hooks/useMaxTransfer.ts b/apps/rosen/app/_hooks/useMaxTransfer.ts index 611b6267..c56e6cf4 100644 --- a/apps/rosen/app/_hooks/useMaxTransfer.ts +++ b/apps/rosen/app/_hooks/useMaxTransfer.ts @@ -9,6 +9,7 @@ import getMaxTransfer from '@/_utils/getMaxTransfer'; /** * a hook version of `getMaxTransfer` util + * @returns CONTAINS A WRAPPED-VALUE */ const useMaxTransfer = () => { const [max, setMax] = useState(0); diff --git a/apps/rosen/app/_hooks/useTokenBalance.ts b/apps/rosen/app/_hooks/useTokenBalance.ts index e4c2b8c2..9b4df971 100644 --- a/apps/rosen/app/_hooks/useTokenBalance.ts +++ b/apps/rosen/app/_hooks/useTokenBalance.ts @@ -9,7 +9,8 @@ import { SupportedWallets } from '@/_types/network'; interface UseTokenBalance { isLoading: boolean; - amount: number; // THIS IS A WRAPPED-VALUE + // THIS IS A WRAPPED-VALUE + amount: number; token: TokenInfo | null; } @@ -33,7 +34,8 @@ const useTokenBalance = () => { const getAssetBalance = useCallback( async (wallet: SupportedWallets) => { setBalanceState({ isLoading: true, amount: 0, token: null }); - const balance = await wallet.getBalance(token); // THIS IS A WRAPPED-VALUE + // THIS IS A WRAPPED-VALUE + const balance = await wallet.getBalance(token); setBalanceState({ isLoading: false, amount: balance || 0, token }); }, [token], diff --git a/apps/rosen/app/_hooks/useTransaction.ts b/apps/rosen/app/_hooks/useTransaction.ts index 97cffbba..d5258f6c 100644 --- a/apps/rosen/app/_hooks/useTransaction.ts +++ b/apps/rosen/app/_hooks/useTransaction.ts @@ -6,11 +6,15 @@ import { useSnackbar } from '@rosen-bridge/ui-kit'; import useLockAddress from './useLockAddress'; import useTransactionFormData from './useTransactionFormData'; import useWallet from './useWallet'; +import { getNonDecimalString } from '@rosen-ui/utils'; +import { useTokenMap } from './useTokenMap'; /** * a react hook to create and sign and submit transactions */ export const useTransaction = () => { + const tokenMap = useTokenMap(); + const { sourceValue } = useTransactionFormData(); const { targetValue, tokenValue, amountValue, walletAddressValue } = useTransactionFormData(); @@ -32,9 +36,21 @@ export const useTransaction = () => { ) { setIsSubmitting(true); try { + const amountValueWrapped = Number( + tokenMap.wrapAmount( + tokenValue.tokenId, + BigInt( + getNonDecimalString( + amountValue as string, + tokenMap.getSignificantDecimals(tokenValue.tokenId) || 0, + ), + ), + sourceValue, + ).amount, + ); const txId = await selectedWallet?.transfer( tokenValue as RosenChainToken, - amountValue, + amountValueWrapped, targetValue, walletAddressValue, bridgeFee, From 71710acb7f714c4d0d3302645a4ebd1bf3cc5079 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 12 Aug 2024 16:44:28 +0000 Subject: [PATCH 054/168] chore: Update fees for decimal drop. --- apps/rosen/app/(bridge)/BridgeTransaction.tsx | 14 ++++--- apps/rosen/app/_hooks/useTransactionFees.ts | 38 +++++++++++-------- package-lock.json | 2 +- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/apps/rosen/app/(bridge)/BridgeTransaction.tsx b/apps/rosen/app/(bridge)/BridgeTransaction.tsx index 57e736d0..f9fa45a9 100644 --- a/apps/rosen/app/(bridge)/BridgeTransaction.tsx +++ b/apps/rosen/app/(bridge)/BridgeTransaction.tsx @@ -64,10 +64,12 @@ const BridgeTransaction = () => { const { status, networkFee, + networkFeeRaw, bridgeFee, - receivingAmount, + bridgeFeeRaw, + receivingAmountRaw, isLoading: isLoadingFees, - minTransfer, + minTransferRaw, } = useTransactionFees(sourceValue, targetValue, tokenValue, amountValue); const { setSelectedWallet, wallets, selectedWallet } = useWallet(); @@ -191,26 +193,26 @@ const BridgeTransaction = () => { {renderFee( 'Transaction Fee', tokenInfo?.tokenName, - networkFee || 'Pending', + networkFeeRaw || 'Pending', 'primary', )} {renderFee( 'Bridge Fee', tokenInfo?.tokenName, - bridgeFee || 'Pending', + bridgeFeeRaw || 'Pending', 'primary', )} {renderFee( 'Min Transfer', tokenInfo?.tokenName, - minTransfer || 'Pending', + minTransferRaw || 'Pending', 'primary', )} {renderFee( 'You will receive', targetTokenInfo?.name, - receivingAmount, + receivingAmountRaw, 'secondary', )} {status?.status === 'error' && renderAlert()} diff --git a/apps/rosen/app/_hooks/useTransactionFees.ts b/apps/rosen/app/_hooks/useTransactionFees.ts index 3574da23..b17e819d 100644 --- a/apps/rosen/app/_hooks/useTransactionFees.ts +++ b/apps/rosen/app/_hooks/useTransactionFees.ts @@ -12,6 +12,7 @@ import { calculateFee } from '@/_actions/calculateFee'; import { AvailableNetworks } from '@/_networks'; import { unwrap } from '@/_errors'; +import { useTokenMap } from './useTokenMap'; /** * calculates the fees for a token swap between @@ -28,6 +29,7 @@ const useTransactionFees = ( const { selectedNetwork } = useNetwork(); const feeInfo = useRef(null); + const tokenMap = useTokenMap(); const tokensMap = useTokensMap(); /** @@ -55,6 +57,11 @@ const useTransactionFees = ( return null; }, [getTokenId, sourceChain, token]); + const decimals = useMemo(() => { + if (!tokenId) return; + return tokenMap.getSignificantDecimals(tokenId); + }, [tokenId, tokenMap]); + useEffect(() => { feeInfo.current = null; }, [sourceChain, targetChain, token]); @@ -125,10 +132,9 @@ const useTransactionFees = ( : 1; const transactionFees = useMemo(() => { - let paymentAmount = - amount && token - ? +getNonDecimalString(amount.toString(), token.decimals) - : 0; + let paymentAmount = amount + ? +getNonDecimalString(amount.toString(), decimals || 0) + : 0; const networkFee = fees ? Number(fees.networkFee) : 0; const feeRatio = fees ? Number(fees?.feeRatio) : 0; @@ -146,31 +152,33 @@ const useTransactionFees = ( const minTransfer = bridgeFeeBase! + networkFee!; return { - bridgeFee: getDecimalString( + bridgeFee: bridgeFee || 0, + bridgeFeeRaw: getDecimalString( bridgeFee?.toString() || '0', - token?.decimals || 0, + decimals || 0, ), - networkFee: getDecimalString( + networkFee: networkFee || 0, + networkFeeRaw: getDecimalString( networkFee?.toString() || '0', - token?.decimals || 0, + decimals || 0, ), receivingAmount: + fees && receivingAmountValue > 0 ? receivingAmountValue || 0 : 0, + receivingAmountRaw: fees && receivingAmountValue > 0 ? getDecimalString( receivingAmountValue.toString() || '0', - token?.decimals || 0, + decimals || 0, ) : '0', - minTransfer: minTransfer - ? getDecimalString( - (minTransfer + 1).toString() || '0', - token?.decimals || 0, - ) + minTransfer: minTransfer ? minTransfer + 1 || 0 : 0, + minTransferRaw: minTransfer + ? getDecimalString((minTransfer + 1).toString() || '0', decimals || 0) : '0', isLoading: pending, status: feeInfo.current, }; - }, [amount, fees, pending, token, feeRatioDivisor]); + }, [amount, fees, pending, decimals, feeRatioDivisor]); return transactionFees; }; diff --git a/package-lock.json b/package-lock.json index 9c30994f..05632b3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17206,7 +17206,7 @@ "@rosen-ui/wallet-api": "^1.0.2" }, "devDependencies": { - "@rosen-bridge/tokens": "^1.2.1", + "@rosen-bridge/tokens": "^1.0.0", "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.26.0", "eslint": "^8.16.0", From 46c57d99aee1b5aabc122bbf24aa86f8801da4a0 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 12 Aug 2024 17:35:12 +0000 Subject: [PATCH 055/168] feat: Update asset-calculator package to drop decimals. --- package-lock.json | 2 +- .../asset-calculator/lib/asset-calculator.ts | 3 ++ .../lib/calculator/abstract-calculator.ts | 47 +++++++++++++++++-- .../calculator/chains/bitcoin-calculator.ts | 13 +++-- .../calculator/chains/cardano-calculator.ts | 13 +++-- .../lib/calculator/chains/ergo-calculator.ts | 13 +++-- packages/asset-calculator/package.json | 2 +- .../chains/cardano-calculator.spec.ts | 4 ++ .../calculator/chains/ergo-calculator.spec.ts | 5 ++ 9 files changed, 80 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 05632b3f..8d9b8ec0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16302,7 +16302,7 @@ "@rosen-bridge/abstract-logger": "^1.0.0", "@rosen-bridge/extended-typeorm": "^0.0.2", "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-bridge/tokens": "^1.0.1", + "@rosen-bridge/tokens": "^1.2.0", "@rosen-clients/cardano-koios": "^2.0.1", "@rosen-clients/ergo-explorer": "^1.0.3", "axios": "^1.7.0", diff --git a/packages/asset-calculator/lib/asset-calculator.ts b/packages/asset-calculator/lib/asset-calculator.ts index 93cfc6c9..32722519 100644 --- a/packages/asset-calculator/lib/asset-calculator.ts +++ b/packages/asset-calculator/lib/asset-calculator.ts @@ -42,17 +42,20 @@ class AssetCalculator { ) { this.tokens = new TokenMap(tokens); const ergoAssetCalculator = new ErgoCalculator( + this.tokens, ergoCalculator.addresses, ergoCalculator.explorerUrl, logger ); const cardanoAssetCalculator = new CardanoCalculator( + this.tokens, cardanoCalculator.addresses, cardanoCalculator.authToken, logger, cardanoCalculator.koiosUrl ); const bitcoinAssetCalculator = new BitcoinCalculator( + this.tokens, bitcoinCalculator.addresses, bitcoinCalculator.esploraUrl, logger diff --git a/packages/asset-calculator/lib/calculator/abstract-calculator.ts b/packages/asset-calculator/lib/calculator/abstract-calculator.ts index 7257f2a2..793f9c75 100644 --- a/packages/asset-calculator/lib/calculator/abstract-calculator.ts +++ b/packages/asset-calculator/lib/calculator/abstract-calculator.ts @@ -1,26 +1,63 @@ -import { RosenChainToken } from '@rosen-bridge/tokens'; +import { RosenChainToken, TokenMap } from '@rosen-bridge/tokens'; import { AbstractLogger, DummyLogger } from '@rosen-bridge/abstract-logger'; export default abstract class AbstractCalculator { + abstract readonly chain: string; + constructor( protected readonly addresses: string[], - protected readonly logger: AbstractLogger = new DummyLogger() + protected readonly logger: AbstractLogger = new DummyLogger(), + protected tokenMap: TokenMap ) {} + get idKey() { + return this.tokenMap.getIdKey(this.chain); + } + + abstract totalRawSupply: (token: RosenChainToken) => Promise; + /** * returns total supply of a specific token in this network */ - abstract totalSupply: (token: RosenChainToken) => Promise; + totalSupply = async (token: RosenChainToken): Promise => { + return this.tokenMap.wrapAmount( + token[this.idKey], + await this.totalRawSupply(token), + this.chain + ).amount; + }; + + abstract totalRawBalance: (token: RosenChainToken) => Promise; /** * returns total balance of a specific token in this network (hot + cold) */ - abstract totalBalance: (token: RosenChainToken) => Promise; + totalBalance = async (token: RosenChainToken): Promise => { + return this.tokenMap.wrapAmount( + token[this.idKey], + await this.totalRawBalance(token), + this.chain + ).amount; + }; /** * returns locked amounts of a specific token for different addresses */ - abstract getLockedAmountsPerAddress: ( + abstract getRawLockedAmountsPerAddress: ( token: RosenChainToken ) => Promise<{ address: string; amount: bigint }[]>; + + getLockedAmountsPerAddress = async ( + token: RosenChainToken + ): Promise<{ address: string; amount: bigint }[]> => { + const amounts = await this.getRawLockedAmountsPerAddress(token); + return amounts.map((amount) => ({ + address: amount.address, + amount: this.tokenMap.wrapAmount( + token[this.idKey], + amount.amount, + this.chain + ).amount, + })); + }; } diff --git a/packages/asset-calculator/lib/calculator/chains/bitcoin-calculator.ts b/packages/asset-calculator/lib/calculator/chains/bitcoin-calculator.ts index 9080846f..6dcb121e 100644 --- a/packages/asset-calculator/lib/calculator/chains/bitcoin-calculator.ts +++ b/packages/asset-calculator/lib/calculator/chains/bitcoin-calculator.ts @@ -1,4 +1,4 @@ -import { NATIVE_TOKEN, RosenChainToken } from '@rosen-bridge/tokens'; +import { NATIVE_TOKEN, RosenChainToken, TokenMap } from '@rosen-bridge/tokens'; import AbstractCalculator from '../abstract-calculator'; import { AbstractLogger } from '@rosen-bridge/abstract-logger'; import axios, { AxiosInstance } from 'axios'; @@ -15,14 +15,17 @@ interface PartialEsploraAddress { } export class BitcoinCalculator extends AbstractCalculator { + readonly chain: string = 'bitcoin'; + protected client: AxiosInstance; constructor( + tokenMap: TokenMap, addresses: string[], url: string = 'https://blockstream.info', logger?: AbstractLogger ) { - super(addresses, logger); + super(addresses, logger, tokenMap); this.client = axios.create({ baseURL: url, }); @@ -31,14 +34,14 @@ export class BitcoinCalculator extends AbstractCalculator { /** * @param token Bitcoin chain token supply, always 0 */ - totalSupply = async (): Promise => { + totalRawSupply = async (): Promise => { return 0n; }; /** * @param token Bitcoin chain token balance, always 0 */ - totalBalance = async (): Promise => { + totalRawBalance = async (): Promise => { return 0n; }; @@ -46,7 +49,7 @@ export class BitcoinCalculator extends AbstractCalculator { * returns locked amounts of a specific token for different addresses * @param token */ - getLockedAmountsPerAddress = async (token: RosenChainToken) => { + getRawLockedAmountsPerAddress = async (token: RosenChainToken) => { if (token.metaData.type === NATIVE_TOKEN) { const balances = await Promise.all( this.addresses.map(async (address) => { diff --git a/packages/asset-calculator/lib/calculator/chains/cardano-calculator.ts b/packages/asset-calculator/lib/calculator/chains/cardano-calculator.ts index 1a18804c..7981de83 100644 --- a/packages/asset-calculator/lib/calculator/chains/cardano-calculator.ts +++ b/packages/asset-calculator/lib/calculator/chains/cardano-calculator.ts @@ -1,19 +1,22 @@ -import { NATIVE_TOKEN, RosenChainToken } from '@rosen-bridge/tokens'; +import { NATIVE_TOKEN, RosenChainToken, TokenMap } from '@rosen-bridge/tokens'; import { AbstractLogger } from '@rosen-bridge/abstract-logger'; import cardanoKoiosClientFactory from '@rosen-clients/cardano-koios'; import AbstractCalculator from '../abstract-calculator'; export class CardanoCalculator extends AbstractCalculator { + readonly chain: string = 'cardano'; + private koiosApi; constructor( + tokenMap: TokenMap, addresses: string[], authToken?: string, logger?: AbstractLogger, koiosUrl: string = 'https://api.koios.rest/api/v1' ) { - super(addresses, logger); + super(addresses, logger, tokenMap); this.koiosApi = cardanoKoiosClientFactory(koiosUrl, authToken); } @@ -21,7 +24,7 @@ export class CardanoCalculator extends AbstractCalculator { * @param token Cardano chain token info * @returns total supply of the token in Cardano */ - totalSupply = async (token: RosenChainToken): Promise => { + totalRawSupply = async (token: RosenChainToken): Promise => { const assetSummary = await this.koiosApi.postAssetInfo({ _asset_list: [[token.policyId, token.assetName]], }); @@ -40,7 +43,7 @@ export class CardanoCalculator extends AbstractCalculator { * @param token Cardano chain token info * @returns total balance in hot and cold wallets */ - totalBalance = async (token: RosenChainToken): Promise => { + totalRawBalance = async (token: RosenChainToken): Promise => { const assets = await this.koiosApi.postAddressAssets({ _addresses: this.addresses, }); @@ -62,7 +65,7 @@ export class CardanoCalculator extends AbstractCalculator { * returns locked amounts of a specific token for different addresses * @param token */ - getLockedAmountsPerAddress = async (token: RosenChainToken) => { + getRawLockedAmountsPerAddress = async (token: RosenChainToken) => { if (token.metaData.type === NATIVE_TOKEN) { const addressesInfo = await this.koiosApi.postAddressInfo({ _addresses: this.addresses, diff --git a/packages/asset-calculator/lib/calculator/chains/ergo-calculator.ts b/packages/asset-calculator/lib/calculator/chains/ergo-calculator.ts index 10c89fae..810112bb 100644 --- a/packages/asset-calculator/lib/calculator/chains/ergo-calculator.ts +++ b/packages/asset-calculator/lib/calculator/chains/ergo-calculator.ts @@ -1,4 +1,4 @@ -import { NATIVE_TOKEN, RosenChainToken } from '@rosen-bridge/tokens'; +import { NATIVE_TOKEN, RosenChainToken, TokenMap } from '@rosen-bridge/tokens'; import { AbstractLogger } from '@rosen-bridge/abstract-logger'; import ergoExplorerClientFactory from '@rosen-clients/ergo-explorer'; @@ -7,14 +7,17 @@ import { Balance } from '@rosen-clients/ergo-explorer/dist/src/v1/types'; import { zipWith } from 'lodash-es'; export class ErgoCalculator extends AbstractCalculator { + readonly chain: string = 'ergo'; + private explorerApi; constructor( + tokenMap: TokenMap, addresses: string[], explorerUrl: string, logger?: AbstractLogger ) { - super(addresses, logger); + super(addresses, logger, tokenMap); this.explorerApi = ergoExplorerClientFactory(explorerUrl); } @@ -22,7 +25,7 @@ export class ErgoCalculator extends AbstractCalculator { * @param token Ergo chain token info * @returns total supply of the token in Ergo */ - totalSupply = async (token: RosenChainToken): Promise => { + totalRawSupply = async (token: RosenChainToken): Promise => { const tokenDetail = await this.explorerApi.v1.getApiV1TokensP1( token.tokenId ); @@ -39,7 +42,7 @@ export class ErgoCalculator extends AbstractCalculator { * @param token Ergo chain token info * @returns total balance in hot and cold wallets */ - totalBalance = async (token: RosenChainToken): Promise => { + totalRawBalance = async (token: RosenChainToken): Promise => { let tokenBalance = 0n; for (const address of this.addresses) { const balance = @@ -79,7 +82,7 @@ export class ErgoCalculator extends AbstractCalculator { * returns locked amounts of a specific token for different addresses * @param token */ - getLockedAmountsPerAddress = async (token: RosenChainToken) => { + getRawLockedAmountsPerAddress = async (token: RosenChainToken) => { const addressBalances = await Promise.all( this.addresses.map((address) => this.explorerApi.v1.getApiV1AddressesP1BalanceConfirmed(address) diff --git a/packages/asset-calculator/package.json b/packages/asset-calculator/package.json index 1c29fd5c..06d37591 100644 --- a/packages/asset-calculator/package.json +++ b/packages/asset-calculator/package.json @@ -34,7 +34,7 @@ "@rosen-bridge/abstract-logger": "^1.0.0", "@rosen-bridge/extended-typeorm": "^0.0.2", "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-bridge/tokens": "^1.0.1", + "@rosen-bridge/tokens": "^1.2.0", "@rosen-clients/cardano-koios": "^2.0.1", "@rosen-clients/ergo-explorer": "^1.0.3", "axios": "^1.7.0", diff --git a/packages/asset-calculator/tests/calculator/chains/cardano-calculator.spec.ts b/packages/asset-calculator/tests/calculator/chains/cardano-calculator.spec.ts index da1228f2..41155c8a 100644 --- a/packages/asset-calculator/tests/calculator/chains/cardano-calculator.spec.ts +++ b/packages/asset-calculator/tests/calculator/chains/cardano-calculator.spec.ts @@ -1,8 +1,10 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { beforeEach, describe, expect, it, vitest } from 'vitest'; +import { TokenMap } from '@rosen-bridge/tokens'; import cardanoKoiosClientFactory from '@rosen-clients/cardano-koios'; import { CardanoCalculator } from '../../../lib/calculator/chains/cardano-calculator'; +import { tokenMap } from '../../test-data'; vitest.mock('@rosen-clients/cardano-koios'); @@ -54,6 +56,7 @@ describe('CardanoCalculator', () => { */ it('should calculate the token balance using koios api', async () => { const cardanoCalculator = new CardanoCalculator( + new TokenMap(tokenMap), ['hotAddress', 'coldAddress'], 'authToken' ); @@ -93,6 +96,7 @@ describe('CardanoCalculator', () => { */ it('should calculate the token balance using koios api', async () => { const cardanoCalculator = new CardanoCalculator( + new TokenMap(tokenMap), ['hotAddress', 'coldAddress'], 'authToken' ); diff --git a/packages/asset-calculator/tests/calculator/chains/ergo-calculator.spec.ts b/packages/asset-calculator/tests/calculator/chains/ergo-calculator.spec.ts index 840e7f4b..74c85b82 100644 --- a/packages/asset-calculator/tests/calculator/chains/ergo-calculator.spec.ts +++ b/packages/asset-calculator/tests/calculator/chains/ergo-calculator.spec.ts @@ -1,8 +1,10 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { beforeEach, describe, expect, it, vitest } from 'vitest'; +import { TokenMap } from '@rosen-bridge/tokens'; import ergoExplorerClientFactory from '@rosen-clients/ergo-explorer'; import { ErgoCalculator } from '../../../lib/calculator/chains/ergo-calculator'; +import { tokenMap } from '../../test-data'; vitest.mock('@rosen-clients/ergo-explorer'); @@ -34,6 +36,7 @@ describe('ErgoCalculator', () => { */ it('should calculate the token balance using explorer api', async () => { const ergoCalculator = new ErgoCalculator( + new TokenMap(tokenMap), ['hotAddress', 'coldAddress'], 'explorerUrl' ); @@ -71,6 +74,7 @@ describe('ErgoCalculator', () => { } as any); const ergoCalculator = new ErgoCalculator( + new TokenMap(tokenMap), ['hotAddress', 'coldAddress'], 'explorerUrl' ); @@ -114,6 +118,7 @@ describe('ErgoCalculator', () => { */ it('should calculate the token balance using explorer api', async () => { const ergoCalculator = new ErgoCalculator( + new TokenMap(tokenMap), ['hotAddress', 'coldAddress'], 'explorerUrl' ); From 8e9b1ec46fa4b33320883c026dc40cd656bca2d7 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 12 Aug 2024 17:59:30 +0000 Subject: [PATCH 056/168] chore: Add changeset files. --- .changeset/dirty-deers-roll.md | 5 +++++ .changeset/dry-dolphins-enjoy.md | 5 +++++ .changeset/fluffy-geese-admire.md | 7 +++++++ .changeset/hot-berries-rule.md | 9 +++++++++ .changeset/lucky-squids-accept.md | 8 ++++++++ .changeset/ten-geckos-marry.md | 10 ++++++++++ 6 files changed, 44 insertions(+) create mode 100644 .changeset/dirty-deers-roll.md create mode 100644 .changeset/dry-dolphins-enjoy.md create mode 100644 .changeset/fluffy-geese-admire.md create mode 100644 .changeset/hot-berries-rule.md create mode 100644 .changeset/lucky-squids-accept.md create mode 100644 .changeset/ten-geckos-marry.md diff --git a/.changeset/dirty-deers-roll.md b/.changeset/dirty-deers-roll.md new file mode 100644 index 00000000..f4e8e06f --- /dev/null +++ b/.changeset/dirty-deers-roll.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': major +--- + +Update the `getMaxTransfer` server action in the networks to return a `WRAPPED-VALUE`. diff --git a/.changeset/dry-dolphins-enjoy.md b/.changeset/dry-dolphins-enjoy.md new file mode 100644 index 00000000..7c11acde --- /dev/null +++ b/.changeset/dry-dolphins-enjoy.md @@ -0,0 +1,5 @@ +--- +'@rosen-ui/asset-calculator': major +--- + +To implement decimal drop context, convert unwrapped values into wrapped values. diff --git a/.changeset/fluffy-geese-admire.md b/.changeset/fluffy-geese-admire.md new file mode 100644 index 00000000..bcb37466 --- /dev/null +++ b/.changeset/fluffy-geese-admire.md @@ -0,0 +1,7 @@ +--- +'@rosen-network/bitcoin': major +'@rosen-network/cardano': major +'@rosen-network/ergo': major +--- + +Update the input parameter of the `generateUnsignedTx` function from an `UNWRAPPED-VALUE` to a `WRAPPED-VALUE`. diff --git a/.changeset/hot-berries-rule.md b/.changeset/hot-berries-rule.md new file mode 100644 index 00000000..853de712 --- /dev/null +++ b/.changeset/hot-berries-rule.md @@ -0,0 +1,9 @@ +--- +'@rosen-ui/eternl-wallet': major +'@rosen-ui/flint-wallet': major +'@rosen-ui/lace-wallet': major +'@rosen-ui/nami-wallet': major +'@rosen-ui/xdefi-wallet': major +--- + +Modify the `transferCreator` function parameter to accept `WRAPPED-VALUE`. diff --git a/.changeset/lucky-squids-accept.md b/.changeset/lucky-squids-accept.md new file mode 100644 index 00000000..44aa9bef --- /dev/null +++ b/.changeset/lucky-squids-accept.md @@ -0,0 +1,8 @@ +--- +'@rosen-network/bitcoin': patch +'@rosen-network/cardano': patch +'@rosen-network/ergo': patch +'@rosen-bridge/rosen-app': patch +--- + +Add the tokenMap configuration to the wallet creator's setup. diff --git a/.changeset/ten-geckos-marry.md b/.changeset/ten-geckos-marry.md new file mode 100644 index 00000000..503e9fb2 --- /dev/null +++ b/.changeset/ten-geckos-marry.md @@ -0,0 +1,10 @@ +--- +'@rosen-ui/eternl-wallet': major +'@rosen-ui/flint-wallet': major +'@rosen-ui/lace-wallet': major +'@rosen-ui/nami-wallet': major +'@rosen-ui/nautilus-wallet': major +'@rosen-ui/xdefi-wallet': major +--- + +Change the output type of the `getBalance` function from an `UNWRAPPED-VALUE` to a `WRAPPED-VALUE`. From d759e373f0579a4f736c73e704cd10c1bba9ee3d Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 13 Aug 2024 08:26:54 +0000 Subject: [PATCH 057/168] chore: Revise the parameter names for transferCreator in the wallets. --- apps/rosen/app/_networks/getTokenMap.ts | 3 +++ wallets/eternl-wallet/src/transfer.ts | 12 ++++++------ wallets/flint-wallet/src/transfer.ts | 12 ++++++------ wallets/lace-wallet/src/transfer.ts | 12 ++++++------ wallets/nami-wallet/src/transfer.ts | 12 ++++++------ wallets/nautilus-wallet/src/transfer.ts | 12 ++++++------ wallets/xdefi-wallet/src/transfer.ts | 12 ++++++------ 7 files changed, 39 insertions(+), 36 deletions(-) diff --git a/apps/rosen/app/_networks/getTokenMap.ts b/apps/rosen/app/_networks/getTokenMap.ts index 793f1434..163fd20d 100644 --- a/apps/rosen/app/_networks/getTokenMap.ts +++ b/apps/rosen/app/_networks/getTokenMap.ts @@ -4,6 +4,9 @@ import { getRosenTokens } from '@/_backend/utils'; let tokenMap: TokenMap; +/** + * get a TokenMap instance using the Rosen TokenMapObject in the browser. + */ export const getTokenMap = async () => { if (tokenMap) return tokenMap; const tokens = await getRosenTokens(); diff --git a/wallets/eternl-wallet/src/transfer.ts b/wallets/eternl-wallet/src/transfer.ts index bedb16bf..450c1fce 100644 --- a/wallets/eternl-wallet/src/transfer.ts +++ b/wallets/eternl-wallet/src/transfer.ts @@ -8,19 +8,19 @@ export const transferCreator = (config: WalletCreatorConfig) => async ( token: RosenChainToken, - decimalAmount: number, + wrappedAmount: number, toChain: string, toAddress: string, - decimalBridgeFee: number, - decimalNetworkFee: number, + wrappedBridgeFee: number, + wrappedNetworkFee: number, lockAddress: string ): Promise => { const wallet = await getEternlWallet().getApi().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; - const amount = convertNumberToBigint(decimalAmount); - const bridgeFee = convertNumberToBigint(decimalBridgeFee); - const networkFee = convertNumberToBigint(decimalNetworkFee); + const amount = convertNumberToBigint(wrappedAmount); + const bridgeFee = convertNumberToBigint(wrappedBridgeFee); + const networkFee = convertNumberToBigint(wrappedNetworkFee); const changeAddressHex = await wallet.getChangeAddress(); const auxiliaryDataHex = await config.generateLockAuxiliaryData( diff --git a/wallets/flint-wallet/src/transfer.ts b/wallets/flint-wallet/src/transfer.ts index bc86896a..a36935ef 100644 --- a/wallets/flint-wallet/src/transfer.ts +++ b/wallets/flint-wallet/src/transfer.ts @@ -8,19 +8,19 @@ export const transferCreator = (config: WalletCreatorConfig) => async ( token: RosenChainToken, - decimalAmount: number, + wrappedAmount: number, toChain: string, toAddress: string, - decimalBridgeFee: number, - decimalNetworkFee: number, + wrappedBridgeFee: number, + wrappedNetworkFee: number, lockAddress: string ): Promise => { const wallet = await getFlintWallet().getApi().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; - const amount = convertNumberToBigint(decimalAmount); - const bridgeFee = convertNumberToBigint(decimalBridgeFee); - const networkFee = convertNumberToBigint(decimalNetworkFee); + const amount = convertNumberToBigint(wrappedAmount); + const bridgeFee = convertNumberToBigint(wrappedBridgeFee); + const networkFee = convertNumberToBigint(wrappedNetworkFee); const changeAddressHex = await wallet.getChangeAddress(); const auxiliaryDataHex = await config.generateLockAuxiliaryData( diff --git a/wallets/lace-wallet/src/transfer.ts b/wallets/lace-wallet/src/transfer.ts index b57583bb..35f5ba50 100644 --- a/wallets/lace-wallet/src/transfer.ts +++ b/wallets/lace-wallet/src/transfer.ts @@ -8,19 +8,19 @@ export const transferCreator = (config: WalletCreatorConfig) => async ( token: RosenChainToken, - decimalAmount: number, + wrappedAmount: number, toChain: string, toAddress: string, - decimalBridgeFee: number, - decimalNetworkFee: number, + wrappedBridgeFee: number, + wrappedNetworkFee: number, lockAddress: string ): Promise => { const wallet = await getLaceWallet().getApi().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; - const amount = convertNumberToBigint(decimalAmount); - const bridgeFee = convertNumberToBigint(decimalBridgeFee); - const networkFee = convertNumberToBigint(decimalNetworkFee); + const amount = convertNumberToBigint(wrappedAmount); + const bridgeFee = convertNumberToBigint(wrappedBridgeFee); + const networkFee = convertNumberToBigint(wrappedNetworkFee); const changeAddressHex = await wallet.getChangeAddress(); const auxiliaryDataHex = await config.generateLockAuxiliaryData( diff --git a/wallets/nami-wallet/src/transfer.ts b/wallets/nami-wallet/src/transfer.ts index 80c4e79c..8399fa70 100644 --- a/wallets/nami-wallet/src/transfer.ts +++ b/wallets/nami-wallet/src/transfer.ts @@ -8,19 +8,19 @@ export const transferCreator = (config: WalletCreatorConfig) => async ( token: RosenChainToken, - decimalAmount: number, + wrappedAmount: number, toChain: string, toAddress: string, - decimalBridgeFee: number, - decimalNetworkFee: number, + wrappedBridgeFee: number, + wrappedNetworkFee: number, lockAddress: string ): Promise => { const wallet = await getNamiWallet().getApi().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; - const amount = convertNumberToBigint(decimalAmount); - const bridgeFee = convertNumberToBigint(decimalBridgeFee); - const networkFee = convertNumberToBigint(decimalNetworkFee); + const amount = convertNumberToBigint(wrappedAmount); + const bridgeFee = convertNumberToBigint(wrappedBridgeFee); + const networkFee = convertNumberToBigint(wrappedNetworkFee); const changeAddressHex = await wallet.getChangeAddress(); const auxiliaryDataHex = await config.generateLockAuxiliaryData( diff --git a/wallets/nautilus-wallet/src/transfer.ts b/wallets/nautilus-wallet/src/transfer.ts index ef60cada..2352f8af 100644 --- a/wallets/nautilus-wallet/src/transfer.ts +++ b/wallets/nautilus-wallet/src/transfer.ts @@ -8,18 +8,18 @@ export const transferCreator = (config: WalletCreatorConfig) => async ( token: RosenChainToken, - decimalAmount: number, + wrappedAmount: number, toChain: string, toAddress: string, - decimalBridgeFee: number, - decimalNetworkFee: number, + wrappedBridgeFee: number, + wrappedNetworkFee: number, lockAddress: string ): Promise => { const wallet = await getNautilusWallet().getApi().getContext(); const tokenId = token.tokenId; - const amount = convertNumberToBigint(decimalAmount); - const bridgeFee = convertNumberToBigint(decimalBridgeFee); - const networkFee = convertNumberToBigint(decimalNetworkFee); + const amount = convertNumberToBigint(wrappedAmount); + const bridgeFee = convertNumberToBigint(wrappedBridgeFee); + const networkFee = convertNumberToBigint(wrappedNetworkFee); const changeAddress = await wallet.get_change_address(); const walletUtxos = await wallet.get_utxos(); diff --git a/wallets/xdefi-wallet/src/transfer.ts b/wallets/xdefi-wallet/src/transfer.ts index 4017a79d..fa30c6a7 100644 --- a/wallets/xdefi-wallet/src/transfer.ts +++ b/wallets/xdefi-wallet/src/transfer.ts @@ -12,16 +12,16 @@ export const transferCreator = (config: WalletCreatorConfig) => async ( token: RosenChainToken, - decimalAmount: number, + wrappedAmount: number, toChain: string, toAddress: string, - decimalBridgeFee: number, - decimalNetworkFee: number, + wrappedBridgeFee: number, + wrappedNetworkFee: number, lockAddress: string ): Promise => { - const amount = convertNumberToBigint(decimalAmount); - const bridgeFee = convertNumberToBigint(decimalBridgeFee); - const networkFee = convertNumberToBigint(decimalNetworkFee); + const amount = convertNumberToBigint(wrappedAmount); + const bridgeFee = convertNumberToBigint(wrappedBridgeFee); + const networkFee = convertNumberToBigint(wrappedNetworkFee); const userAddress: string = await new Promise((resolve, reject) => { getXdefiWallet() From 6973d244d1957e9b689d2c3da6bafa67f993ed2c Mon Sep 17 00:00:00 2001 From: Mohammad Kermani Date: Tue, 13 Aug 2024 12:27:22 +0000 Subject: [PATCH 058/168] fix(rosen-app): fix issue in assets page Show "all" as default selected network in assets page. --- .changeset/clever-carrots-rush.md | 5 +++++ apps/rosen/app/assets/page.tsx | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/clever-carrots-rush.md diff --git a/.changeset/clever-carrots-rush.md b/.changeset/clever-carrots-rush.md new file mode 100644 index 00000000..87a0064e --- /dev/null +++ b/.changeset/clever-carrots-rush.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': patch +--- + +Fix issue of "All" network item not being selected in assets page in first load diff --git a/apps/rosen/app/assets/page.tsx b/apps/rosen/app/assets/page.tsx index bb03518e..862121a1 100644 --- a/apps/rosen/app/assets/page.tsx +++ b/apps/rosen/app/assets/page.tsx @@ -156,6 +156,7 @@ export default function Page() { label="Network" fullWidth onChange={handleChangeNetwork} + value={network} > All Bitcoin From 9100ac6cc1a3ae34d2bdfbbea55b6e9188fb4d28 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 14 Aug 2024 11:21:01 +0000 Subject: [PATCH 059/168] feat: Refactor the amount value from a numeric type to a bigint type. --- apps/rosen/app/(bridge)/BridgeTransaction.tsx | 2 +- apps/rosen/app/(bridge)/page.tsx | 3 +- apps/rosen/app/_hooks/useBridgeForm.ts | 15 +++++---- apps/rosen/app/_hooks/useMaxTransfer.ts | 3 +- apps/rosen/app/_hooks/useTokenBalance.ts | 11 ++++--- apps/rosen/app/_hooks/useTransaction.ts | 8 +++-- apps/rosen/app/_hooks/useTransactionFees.ts | 31 ++++++++++--------- .../app/_networks/bitcoin/getMaxTransfer.ts | 13 +++++--- .../app/_networks/cardano/getMaxTransfer.ts | 11 ++++--- .../app/_networks/ergo/getMaxTransfer.ts | 11 ++++--- apps/rosen/app/_types/network.ts | 5 +-- apps/rosen/app/_utils/getMaxTransfer.ts | 5 +-- apps/rosen/app/_utils/index.ts | 18 ++++------- networks/bitcoin/src/generateUnsignedTx.ts | 3 +- networks/cardano/src/generateUnsignedTx.ts | 3 +- networks/ergo/src/generateUnsignedTx.ts | 3 +- packages/types/src/common.ts | 2 ++ wallets/eternl-wallet/src/getBalance.ts | 7 +++-- wallets/eternl-wallet/src/transfer.ts | 11 +++---- wallets/flint-wallet/src/getBalance.ts | 7 +++-- wallets/flint-wallet/src/transfer.ts | 11 +++---- wallets/lace-wallet/src/getBalance.ts | 7 +++-- wallets/lace-wallet/src/transfer.ts | 11 +++---- wallets/nami-wallet/src/getBalance.ts | 7 +++-- wallets/nami-wallet/src/transfer.ts | 11 +++---- wallets/nautilus-wallet/src/getBalance.ts | 7 +++-- wallets/nautilus-wallet/src/transfer.ts | 11 +++---- wallets/wallet-api/src/types/index.ts | 9 +++--- wallets/xdefi-wallet/src/getBalance.ts | 7 +++-- wallets/xdefi-wallet/src/transfer.ts | 12 +++---- 30 files changed, 137 insertions(+), 128 deletions(-) diff --git a/apps/rosen/app/(bridge)/BridgeTransaction.tsx b/apps/rosen/app/(bridge)/BridgeTransaction.tsx index f9fa45a9..9dbb6480 100644 --- a/apps/rosen/app/(bridge)/BridgeTransaction.tsx +++ b/apps/rosen/app/(bridge)/BridgeTransaction.tsx @@ -91,7 +91,7 @@ const BridgeTransaction = () => { useTransaction(); const handleFormSubmit = handleSubmit(() => { - startTransaction(+bridgeFee, +networkFee); + startTransaction(bridgeFee, networkFee); }); const renderFee = ( diff --git a/apps/rosen/app/(bridge)/page.tsx b/apps/rosen/app/(bridge)/page.tsx index 9e8a8ead..3979de1e 100644 --- a/apps/rosen/app/(bridge)/page.tsx +++ b/apps/rosen/app/(bridge)/page.tsx @@ -11,6 +11,7 @@ import { import BridgeTransaction from './BridgeTransaction'; import BridgeForm from './BridgeForm'; +import { RosenAmountValue } from '@rosen-ui/types'; const BridgeContainer = styled(Card)(({ theme }) => ({ position: 'absolute', @@ -40,7 +41,7 @@ export interface BridgeForm { target: string | null; token: string | null; walletAddress: string | null; - amount: number | null; + amount: RosenAmountValue | null; } /** diff --git a/apps/rosen/app/_hooks/useBridgeForm.ts b/apps/rosen/app/_hooks/useBridgeForm.ts index 06a39db7..03cb8d3f 100644 --- a/apps/rosen/app/_hooks/useBridgeForm.ts +++ b/apps/rosen/app/_hooks/useBridgeForm.ts @@ -14,6 +14,7 @@ import { AvailableNetworks, availableNetworks } from '@/_networks'; import { getMinTransfer } from '@/_utils/index'; import getMaxTransfer from '@/_utils/getMaxTransfer'; import { useTokenMap } from './useTokenMap'; +import { RosenAmountValue } from '@rosen-ui/types'; const validationCache = new Map(); @@ -54,6 +55,12 @@ const useBridgeForm = () => { const decimals = tokenMap.getSignificantDecimals(tokenField.value.tokenId) || 0; + const wrappedAmount = tokenMap.wrapAmount( + tokenField.value?.tokenId, + BigInt(getNonDecimalString(value, decimals)), + sourceField.value, + ).amount as RosenAmountValue; + // match any complete or incomplete decimal number const match = value.match(/^(\d+(\.(?\d+)?)?)?$/); @@ -90,9 +97,7 @@ const useBridgeForm = () => { }), ); - const isAmountLarge = - BigInt(getNonDecimalString(value, decimals)) > - BigInt(maxTransfer.toString()); + const isAmountLarge = wrappedAmount > maxTransfer; if (isAmountLarge) return 'Balance insufficient'; } @@ -102,9 +107,7 @@ const useBridgeForm = () => { targetField.value, tokensMap, ); - const isAmountSmall = - BigInt(getNonDecimalString(value, decimals)) < - BigInt(getNonDecimalString(minTransfer.toString(), decimals)); + const isAmountSmall = wrappedAmount < minTransfer; if (isAmountSmall) return 'Minimum transfer amount not respected'; return undefined; diff --git a/apps/rosen/app/_hooks/useMaxTransfer.ts b/apps/rosen/app/_hooks/useMaxTransfer.ts index c56e6cf4..7781aa88 100644 --- a/apps/rosen/app/_hooks/useMaxTransfer.ts +++ b/apps/rosen/app/_hooks/useMaxTransfer.ts @@ -6,13 +6,14 @@ import useBridgeForm from './useBridgeForm'; import useTokenBalance from './useTokenBalance'; import getMaxTransfer from '@/_utils/getMaxTransfer'; +import { RosenAmountValue } from '@rosen-ui/types'; /** * a hook version of `getMaxTransfer` util * @returns CONTAINS A WRAPPED-VALUE */ const useMaxTransfer = () => { - const [max, setMax] = useState(0); + const [max, setMax] = useState(0n); const [loading, setLoading] = useState(false); const { isLoading: isTokenBalanceLoading, amount } = useTokenBalance(); diff --git a/apps/rosen/app/_hooks/useTokenBalance.ts b/apps/rosen/app/_hooks/useTokenBalance.ts index 9b4df971..c8060614 100644 --- a/apps/rosen/app/_hooks/useTokenBalance.ts +++ b/apps/rosen/app/_hooks/useTokenBalance.ts @@ -6,11 +6,12 @@ import useBridgeForm from './useBridgeForm'; import useWallet from './useWallet'; import { SupportedWallets } from '@/_types/network'; +import { RosenAmountValue } from '@rosen-ui/types'; interface UseTokenBalance { isLoading: boolean; // THIS IS A WRAPPED-VALUE - amount: number; + amount: RosenAmountValue; token: TokenInfo | null; } @@ -21,7 +22,7 @@ interface UseTokenBalance { const useTokenBalance = () => { const [balanceState, setBalanceState] = useState({ isLoading: false, - amount: 0, + amount: 0n, token: null, }); @@ -33,17 +34,17 @@ const useTokenBalance = () => { const getAssetBalance = useCallback( async (wallet: SupportedWallets) => { - setBalanceState({ isLoading: true, amount: 0, token: null }); + setBalanceState({ isLoading: true, amount: 0n, token: null }); // THIS IS A WRAPPED-VALUE const balance = await wallet.getBalance(token); - setBalanceState({ isLoading: false, amount: balance || 0, token }); + setBalanceState({ isLoading: false, amount: balance || 0n, token }); }, [token], ); useEffect(() => { if (!token) { - setBalanceState({ isLoading: false, amount: 0, token: null }); + setBalanceState({ isLoading: false, amount: 0n, token: null }); } }, [token]); diff --git a/apps/rosen/app/_hooks/useTransaction.ts b/apps/rosen/app/_hooks/useTransaction.ts index d5258f6c..1af881e2 100644 --- a/apps/rosen/app/_hooks/useTransaction.ts +++ b/apps/rosen/app/_hooks/useTransaction.ts @@ -8,6 +8,7 @@ import useTransactionFormData from './useTransactionFormData'; import useWallet from './useWallet'; import { getNonDecimalString } from '@rosen-ui/utils'; import { useTokenMap } from './useTokenMap'; +import { RosenAmountValue } from '@rosen-ui/types'; /** * a react hook to create and sign and submit transactions @@ -25,7 +26,10 @@ export const useTransaction = () => { const { openSnackbar } = useSnackbar(); - const startTransaction = async (bridgeFee: number, networkFee: number) => { + const startTransaction = async ( + bridgeFee: RosenAmountValue, + networkFee: RosenAmountValue, + ) => { if ( tokenValue && targetValue && @@ -36,7 +40,7 @@ export const useTransaction = () => { ) { setIsSubmitting(true); try { - const amountValueWrapped = Number( + const amountValueWrapped = BigInt( tokenMap.wrapAmount( tokenValue.tokenId, BigInt( diff --git a/apps/rosen/app/_hooks/useTransactionFees.ts b/apps/rosen/app/_hooks/useTransactionFees.ts index b17e819d..8263c2c8 100644 --- a/apps/rosen/app/_hooks/useTransactionFees.ts +++ b/apps/rosen/app/_hooks/useTransactionFees.ts @@ -128,36 +128,37 @@ const useTransactionFees = ( const fees = feeInfo.current?.data?.fees; const feeRatioDivisor = fees?.feeRatioDivisor - ? Number(fees?.feeRatioDivisor) - : 1; + ? BigInt(fees?.feeRatioDivisor) + : 1n; const transactionFees = useMemo(() => { let paymentAmount = amount - ? +getNonDecimalString(amount.toString(), decimals || 0) - : 0; + ? BigInt(getNonDecimalString(amount.toString(), decimals || 0)) + : 0n; - const networkFee = fees ? Number(fees.networkFee) : 0; - const feeRatio = fees ? Number(fees?.feeRatio) : 0; + const networkFee = fees ? BigInt(fees.networkFee) : 0n; + const feeRatio = fees ? BigInt(fees?.feeRatio) : 0n; - const bridgeFeeBase = fees ? Number(fees.bridgeFee) : 0; + const bridgeFeeBase = fees ? BigInt(fees.bridgeFee) : 0n; const variableBridgeFee = fees ? (paymentAmount * feeRatio) / feeRatioDivisor - : 0; - const bridgeFee = Math.max(bridgeFeeBase, Math.ceil(variableBridgeFee)); + : 0n; + const bridgeFee = + bridgeFeeBase > variableBridgeFee ? bridgeFeeBase : variableBridgeFee; const receivingAmountValue = fees - ? +paymentAmount - (networkFee! + bridgeFee!) - : 0; + ? paymentAmount - (networkFee + bridgeFee!) + : 0n; const minTransfer = bridgeFeeBase! + networkFee!; return { - bridgeFee: bridgeFee || 0, + bridgeFee, bridgeFeeRaw: getDecimalString( bridgeFee?.toString() || '0', decimals || 0, ), - networkFee: networkFee || 0, + networkFee, networkFeeRaw: getDecimalString( networkFee?.toString() || '0', decimals || 0, @@ -171,9 +172,9 @@ const useTransactionFees = ( decimals || 0, ) : '0', - minTransfer: minTransfer ? minTransfer + 1 || 0 : 0, + minTransfer: minTransfer ? minTransfer + 1n || 0n : 0n, minTransferRaw: minTransfer - ? getDecimalString((minTransfer + 1).toString() || '0', decimals || 0) + ? getDecimalString((minTransfer + 1n).toString() || '0', decimals || 0) : '0', isLoading: pending, status: feeInfo.current, diff --git a/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts b/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts index c8575da2..23bb4133 100644 --- a/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts @@ -12,6 +12,7 @@ import { wrap } from '@/_errors'; import { BitcoinNetwork } from '@/_types/network'; import { Networks } from '@rosen-ui/constants'; import { getTokenMap } from '../getTokenMap'; +import { RosenAmountValue } from '@rosen-ui/types'; /** * get max transfer for bitcoin @@ -21,8 +22,10 @@ export const getMaxTransfer = wrap( balance, isNative, eventData, - }: Parameters[0]) => { - if (!eventData.toAddress) return 0; + }: Parameters< + BitcoinNetwork['getMaxTransfer'] + >[0]): Promise => { + if (!eventData.toAddress) return 0n; const feeRatio = await getFeeRatio(); const opRetrunDataLength = ( @@ -55,14 +58,14 @@ export const getMaxTransfer = wrap( Networks.BITCOIN, ).amount; - return balance < 0 || !isNative - ? 0 + return balance < 0n || !isNative + ? 0n : /** * We need to subtract (utxos.length + 1) from the calculated value because * of a bug in bitcoin box selection * * local:ergo/rosen-bridge/utils#204 */ - balance - Number(offset) - utxos.length - 1; + balance - offset - BigInt(utxos.length + 1); }, ); diff --git a/apps/rosen/app/_networks/cardano/getMaxTransfer.ts b/apps/rosen/app/_networks/cardano/getMaxTransfer.ts index b5c81c50..df9949ef 100644 --- a/apps/rosen/app/_networks/cardano/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/cardano/getMaxTransfer.ts @@ -7,6 +7,7 @@ import { wrap } from '@/_errors'; import { CardanoNetwork } from '@/_types/network'; import { getTokenMap } from '../getTokenMap'; +import { RosenAmountValue } from '@rosen-ui/types'; /** * get max transfer for cardano @@ -15,17 +16,19 @@ export const getMaxTransfer = wrap( async ({ balance, isNative, - }: Parameters[0]) => { + }: Parameters< + CardanoNetwork['getMaxTransfer'] + >[0]): Promise => { const tokenMap = await getTokenMap(); const feeAndMinBoxValueWrapped = tokenMap.wrapAmount( 'ada', feeAndMinBoxValue, Networks.CARDANO, ).amount; - const offsetCandidateWrapped = Number(feeAndMinBoxValueWrapped); + const offsetCandidateWrapped = feeAndMinBoxValueWrapped; const shouldApplyOffset = isNative; - const offset = shouldApplyOffset ? offsetCandidateWrapped : 0; + const offset = shouldApplyOffset ? offsetCandidateWrapped : 0n; const amount = balance - offset; - return amount < 0 ? 0 : amount; + return amount < 0n ? 0n : amount; }, ); diff --git a/apps/rosen/app/_networks/ergo/getMaxTransfer.ts b/apps/rosen/app/_networks/ergo/getMaxTransfer.ts index fa784ca6..6f5f22de 100644 --- a/apps/rosen/app/_networks/ergo/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/ergo/getMaxTransfer.ts @@ -10,6 +10,7 @@ import { wrap } from '@/_errors'; import { CardanoNetwork } from '@/_types/network'; import { getTokenMap } from '../getTokenMap'; +import { RosenAmountValue } from '@rosen-ui/types'; /** * get max transfer for ergo @@ -18,17 +19,19 @@ export const getMaxTransfer = wrap( async ({ balance, isNative, - }: Parameters[0]) => { + }: Parameters< + CardanoNetwork['getMaxTransfer'] + >[0]): Promise => { const tokenMap = await getTokenMap(); const feeAndMinBoxValueWrapped = tokenMap.wrapAmount( 'erg', ergoFee + ergoMinBoxValue, Networks.ERGO, ).amount; - const offsetCandidateWrapped = Number(feeAndMinBoxValueWrapped); + const offsetCandidateWrapped = feeAndMinBoxValueWrapped; const shouldApplyOffset = isNative; - const offset = shouldApplyOffset ? offsetCandidateWrapped : 0; + const offset = shouldApplyOffset ? offsetCandidateWrapped : 0n; const amount = balance - offset; - return amount < 0 ? 0 : amount; + return amount < 0n ? 0n : amount; }, ); diff --git a/apps/rosen/app/_types/network.ts b/apps/rosen/app/_types/network.ts index 75e2128c..734256e0 100644 --- a/apps/rosen/app/_types/network.ts +++ b/apps/rosen/app/_types/network.ts @@ -1,9 +1,10 @@ import { Wallet } from '@rosen-ui/wallet-api'; import { AvailableNetworks } from '@/_networks'; +import { RosenAmountValue } from '@rosen-ui/types'; interface GetMaxTransferParams { - balance: number; + balance: RosenAmountValue; isNative: boolean; } @@ -23,7 +24,7 @@ export interface BaseNetwork< // THIS FUNCTION WORKS WITH WRAPPED-VALUE getMaxTransfer: ( props: GetMaxTransferParams & GetMaxTransferParamsExtra, - ) => Promise; + ) => Promise; } interface BitcoinMaxTransferExtra { diff --git a/apps/rosen/app/_utils/getMaxTransfer.ts b/apps/rosen/app/_utils/getMaxTransfer.ts index 407c261d..06994252 100644 --- a/apps/rosen/app/_utils/getMaxTransfer.ts +++ b/apps/rosen/app/_utils/getMaxTransfer.ts @@ -1,4 +1,5 @@ import { BitcoinNetwork, CardanoNetwork, ErgoNetwork } from '@/_types/network'; +import { RosenAmountValue } from '@rosen-ui/types'; /** * return max transfer, considering all the context that affects it @@ -10,7 +11,7 @@ import { BitcoinNetwork, CardanoNetwork, ErgoNetwork } from '@/_types/network'; const getMaxTransfer = async ( network: ErgoNetwork | CardanoNetwork | BitcoinNetwork, tokenInfo: { - balance: number; + balance: RosenAmountValue; isNative: boolean; }, getContext: () => Promise<{ @@ -18,7 +19,7 @@ const getMaxTransfer = async ( toAddress: string; toChain: string; }>, -) => { +): Promise => { if (network.name === 'bitcoin') { const context = await getContext(); return network.getMaxTransfer({ diff --git a/apps/rosen/app/_utils/index.ts b/apps/rosen/app/_utils/index.ts index 2829fb8d..369af715 100644 --- a/apps/rosen/app/_utils/index.ts +++ b/apps/rosen/app/_utils/index.ts @@ -8,6 +8,7 @@ import { calculateFee } from '@/_actions/calculateFee'; import { Networks } from '@rosen-ui/constants'; import { AvailableNetworks } from '@/_networks'; import { unwrap } from '@/_errors'; +import { RosenAmountValue } from '@rosen-ui/types'; /** * a utility to make unique interface for accessing token name @@ -36,7 +37,7 @@ export const getMinTransfer = async ( sourceChain: AvailableNetworks, targetChain: AvailableNetworks, tokensMap: any, -) => { +): Promise => { const tokenMap = new TokenMap(tokensMap); const idKey = tokenMap.getIdKey(sourceChain); const tokens = tokenMap.search(sourceChain, { @@ -54,20 +55,13 @@ export const getMinTransfer = async ( const { fees } = JsonBigInt.parse(data); - const networkFee = fees ? Number(fees.networkFee) : 0; - const bridgeFee = fees ? Number(fees.bridgeFee) : 0; + const networkFee = fees ? BigInt(fees.networkFee) : 0n; + const bridgeFee = fees ? BigInt(fees.bridgeFee) : 0n; const minTransfer = bridgeFee + networkFee; - return minTransfer - ? getDecimalString( - (minTransfer + 1).toString() || '0', - tokenMap.getSignificantDecimals( - token[tokenMap.getIdKey(sourceChain)], - ) || 0, - ) - : '0'; + return minTransfer ? minTransfer + 1n : 0n; } catch { - return '0'; + return 0n; } }; diff --git a/networks/bitcoin/src/generateUnsignedTx.ts b/networks/bitcoin/src/generateUnsignedTx.ts index d187ca1d..04cfd64c 100644 --- a/networks/bitcoin/src/generateUnsignedTx.ts +++ b/networks/bitcoin/src/generateUnsignedTx.ts @@ -11,6 +11,7 @@ import { } from './utils'; import { TokenMap, RosenChainToken } from '@rosen-bridge/tokens'; import { Networks } from '@rosen-ui/constants'; +import { RosenAmountValue } from '@rosen-ui/types'; /** * generates bitcoin lock tx @@ -118,7 +119,7 @@ export const generateUnsignedTx = (tokenMap: TokenMap) => { return ( lockAddress: string, fromAddress: string, - wrappedAmount: bigint, + wrappedAmount: RosenAmountValue, opReturnData: string, token: RosenChainToken ) => { diff --git a/networks/cardano/src/generateUnsignedTx.ts b/networks/cardano/src/generateUnsignedTx.ts index b08c57c2..df6783f7 100644 --- a/networks/cardano/src/generateUnsignedTx.ts +++ b/networks/cardano/src/generateUnsignedTx.ts @@ -17,6 +17,7 @@ import { } from './utils'; import { TokenMap } from '@rosen-bridge/tokens'; import { Networks } from '@rosen-ui/constants'; +import { RosenAmountValue } from '@rosen-ui/types'; /** * generates a lock transaction on Cardano @@ -145,7 +146,7 @@ export const generateUnsignedTx = (tokenMap: TokenMap) => { changeAddressHex: string, policyIdHex: string, assetNameHex: string, - wrappedAmount: bigint, + wrappedAmount: RosenAmountValue, auxiliaryDataHex: string ) => { const unwrappedAmount = tokenMap.unwrapAmount( diff --git a/networks/ergo/src/generateUnsignedTx.ts b/networks/ergo/src/generateUnsignedTx.ts index 79e2e18f..cbd2727a 100644 --- a/networks/ergo/src/generateUnsignedTx.ts +++ b/networks/ergo/src/generateUnsignedTx.ts @@ -16,6 +16,7 @@ import * as wasm from 'ergo-lib-wasm-nodejs'; import { ErgoBoxProxy } from '@rosen-bridge/ergo-box-selection'; import { TokenMap, RosenChainToken } from '@rosen-bridge/tokens'; import { Networks } from '@rosen-ui/constants'; +import { RosenAmountValue } from '@rosen-ui/types'; /** * generates an unsigned lock transaction on Ergo @@ -128,7 +129,7 @@ export const generateUnsignedTx = (tokenMap: TokenMap) => { lockAddress: string, toChain: string, toAddress: string, - wrappedAmount: bigint, + wrappedAmount: RosenAmountValue, bridgeFeeString: string, networkFeeString: string, token: RosenChainToken diff --git a/packages/types/src/common.ts b/packages/types/src/common.ts index bae85f05..7c99cb4c 100644 --- a/packages/types/src/common.ts +++ b/packages/types/src/common.ts @@ -38,3 +38,5 @@ export interface MutationRequestBodyWithHeaders { [headerKey: string]: string | number; }; } + +export type RosenAmountValue = bigint; diff --git a/wallets/eternl-wallet/src/getBalance.ts b/wallets/eternl-wallet/src/getBalance.ts index 5e831420..776ef811 100644 --- a/wallets/eternl-wallet/src/getBalance.ts +++ b/wallets/eternl-wallet/src/getBalance.ts @@ -1,19 +1,20 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; import { Networks } from '@rosen-ui/constants'; +import { RosenAmountValue } from '@rosen-ui/types'; import { getEternlWallet } from './getEternlWallet'; export const getBalanceCreator = (config: WalletCreatorConfig) => - async (token: RosenChainToken): Promise => { + async (token: RosenChainToken): Promise => { const context = await getEternlWallet().getApi().enable(); const rawValue = await context.getBalance(); const balances = await config.decodeWasmValue(rawValue); const amount = balances.find((asset) => asset.policyId === token.policyId); - if (!amount) return 0; + if (!amount) return 0n; const tokenMap = await config.getTokenMap(); @@ -23,5 +24,5 @@ export const getBalanceCreator = Networks.CARDANO ).amount; - return Number(wrappedAmount); + return wrappedAmount; }; diff --git a/wallets/eternl-wallet/src/transfer.ts b/wallets/eternl-wallet/src/transfer.ts index 450c1fce..eef9f283 100644 --- a/wallets/eternl-wallet/src/transfer.ts +++ b/wallets/eternl-wallet/src/transfer.ts @@ -1,6 +1,6 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; -import { convertNumberToBigint, validateDecimalPlaces } from '@rosen-ui/utils'; +import { RosenAmountValue } from '@rosen-ui/types'; import { getEternlWallet } from './getEternlWallet'; @@ -8,19 +8,16 @@ export const transferCreator = (config: WalletCreatorConfig) => async ( token: RosenChainToken, - wrappedAmount: number, + amount: RosenAmountValue, toChain: string, toAddress: string, - wrappedBridgeFee: number, - wrappedNetworkFee: number, + bridgeFee: RosenAmountValue, + networkFee: RosenAmountValue, lockAddress: string ): Promise => { const wallet = await getEternlWallet().getApi().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; - const amount = convertNumberToBigint(wrappedAmount); - const bridgeFee = convertNumberToBigint(wrappedBridgeFee); - const networkFee = convertNumberToBigint(wrappedNetworkFee); const changeAddressHex = await wallet.getChangeAddress(); const auxiliaryDataHex = await config.generateLockAuxiliaryData( diff --git a/wallets/flint-wallet/src/getBalance.ts b/wallets/flint-wallet/src/getBalance.ts index 644dd68a..9ea3836e 100644 --- a/wallets/flint-wallet/src/getBalance.ts +++ b/wallets/flint-wallet/src/getBalance.ts @@ -1,19 +1,20 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; import { Networks } from '@rosen-ui/constants'; +import { RosenAmountValue } from '@rosen-ui/types'; import { getFlintWallet } from './getFlintWallet'; export const getBalanceCreator = (config: WalletCreatorConfig) => - async (token: RosenChainToken): Promise => { + async (token: RosenChainToken): Promise => { const context = await getFlintWallet().getApi().enable(); const rawValue = await context.getBalance(); const balances = await config.decodeWasmValue(rawValue); const amount = balances.find((asset) => asset.policyId === token.policyId); - if (!amount) return 0; + if (!amount) return 0n; const tokenMap = await config.getTokenMap(); @@ -23,5 +24,5 @@ export const getBalanceCreator = Networks.CARDANO ).amount; - return Number(wrappedAmount); + return wrappedAmount; }; diff --git a/wallets/flint-wallet/src/transfer.ts b/wallets/flint-wallet/src/transfer.ts index a36935ef..afcfd949 100644 --- a/wallets/flint-wallet/src/transfer.ts +++ b/wallets/flint-wallet/src/transfer.ts @@ -1,6 +1,6 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; -import { convertNumberToBigint, validateDecimalPlaces } from '@rosen-ui/utils'; +import { RosenAmountValue } from '@rosen-ui/types'; import { getFlintWallet } from './getFlintWallet'; @@ -8,19 +8,16 @@ export const transferCreator = (config: WalletCreatorConfig) => async ( token: RosenChainToken, - wrappedAmount: number, + amount: RosenAmountValue, toChain: string, toAddress: string, - wrappedBridgeFee: number, - wrappedNetworkFee: number, + bridgeFee: RosenAmountValue, + networkFee: RosenAmountValue, lockAddress: string ): Promise => { const wallet = await getFlintWallet().getApi().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; - const amount = convertNumberToBigint(wrappedAmount); - const bridgeFee = convertNumberToBigint(wrappedBridgeFee); - const networkFee = convertNumberToBigint(wrappedNetworkFee); const changeAddressHex = await wallet.getChangeAddress(); const auxiliaryDataHex = await config.generateLockAuxiliaryData( diff --git a/wallets/lace-wallet/src/getBalance.ts b/wallets/lace-wallet/src/getBalance.ts index e3d79006..80c7d622 100644 --- a/wallets/lace-wallet/src/getBalance.ts +++ b/wallets/lace-wallet/src/getBalance.ts @@ -1,19 +1,20 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; import { Networks } from '@rosen-ui/constants'; +import { RosenAmountValue } from '@rosen-ui/types'; import { getLaceWallet } from './getLaceWallet'; export const getBalanceCreator = (config: WalletCreatorConfig) => - async (token: RosenChainToken): Promise => { + async (token: RosenChainToken): Promise => { const context = await getLaceWallet().getApi().enable(); const rawValue = await context.getBalance(); const balances = await config.decodeWasmValue(rawValue); const amount = balances.find((asset) => asset.policyId === token.policyId); - if (!amount) return 0; + if (!amount) return 0n; const tokenMap = await config.getTokenMap(); @@ -23,5 +24,5 @@ export const getBalanceCreator = Networks.CARDANO ).amount; - return Number(wrappedAmount); + return wrappedAmount; }; diff --git a/wallets/lace-wallet/src/transfer.ts b/wallets/lace-wallet/src/transfer.ts index 35f5ba50..93e4d3c1 100644 --- a/wallets/lace-wallet/src/transfer.ts +++ b/wallets/lace-wallet/src/transfer.ts @@ -1,6 +1,6 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; -import { convertNumberToBigint, validateDecimalPlaces } from '@rosen-ui/utils'; +import { RosenAmountValue } from '@rosen-ui/types'; import { getLaceWallet } from './getLaceWallet'; @@ -8,19 +8,16 @@ export const transferCreator = (config: WalletCreatorConfig) => async ( token: RosenChainToken, - wrappedAmount: number, + amount: RosenAmountValue, toChain: string, toAddress: string, - wrappedBridgeFee: number, - wrappedNetworkFee: number, + bridgeFee: RosenAmountValue, + networkFee: RosenAmountValue, lockAddress: string ): Promise => { const wallet = await getLaceWallet().getApi().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; - const amount = convertNumberToBigint(wrappedAmount); - const bridgeFee = convertNumberToBigint(wrappedBridgeFee); - const networkFee = convertNumberToBigint(wrappedNetworkFee); const changeAddressHex = await wallet.getChangeAddress(); const auxiliaryDataHex = await config.generateLockAuxiliaryData( diff --git a/wallets/nami-wallet/src/getBalance.ts b/wallets/nami-wallet/src/getBalance.ts index 088742ec..e8d85f39 100644 --- a/wallets/nami-wallet/src/getBalance.ts +++ b/wallets/nami-wallet/src/getBalance.ts @@ -2,12 +2,13 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; import { hexToCbor } from '@rosen-ui/utils'; import { Networks } from '@rosen-ui/constants'; +import { RosenAmountValue } from '@rosen-ui/types'; import { getNamiWallet } from './getNamiWallet'; export const getBalanceCreator = (config: WalletCreatorConfig) => - async (token: RosenChainToken): Promise => { + async (token: RosenChainToken): Promise => { const context = await getNamiWallet().getApi().enable(); const rawValue = await context.getBalance(); const balances = await config.decodeWasmValue(rawValue); @@ -18,7 +19,7 @@ export const getBalanceCreator = (asset.nameHex === hexToCbor(token.assetName) || !token.policyId) ); - if (!amount) return 0; + if (!amount) return 0n; const tokenMap = await config.getTokenMap(); @@ -28,5 +29,5 @@ export const getBalanceCreator = Networks.CARDANO ).amount; - return Number(wrappedAmount); + return wrappedAmount; }; diff --git a/wallets/nami-wallet/src/transfer.ts b/wallets/nami-wallet/src/transfer.ts index 8399fa70..5ac39515 100644 --- a/wallets/nami-wallet/src/transfer.ts +++ b/wallets/nami-wallet/src/transfer.ts @@ -1,6 +1,6 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; -import { convertNumberToBigint, validateDecimalPlaces } from '@rosen-ui/utils'; +import { RosenAmountValue } from '@rosen-ui/types'; import { getNamiWallet } from './getNamiWallet'; @@ -8,19 +8,16 @@ export const transferCreator = (config: WalletCreatorConfig) => async ( token: RosenChainToken, - wrappedAmount: number, + amount: RosenAmountValue, toChain: string, toAddress: string, - wrappedBridgeFee: number, - wrappedNetworkFee: number, + bridgeFee: RosenAmountValue, + networkFee: RosenAmountValue, lockAddress: string ): Promise => { const wallet = await getNamiWallet().getApi().enable(); const policyIdHex = token.policyId; const assetNameHex = token.assetName; - const amount = convertNumberToBigint(wrappedAmount); - const bridgeFee = convertNumberToBigint(wrappedBridgeFee); - const networkFee = convertNumberToBigint(wrappedNetworkFee); const changeAddressHex = await wallet.getChangeAddress(); const auxiliaryDataHex = await config.generateLockAuxiliaryData( diff --git a/wallets/nautilus-wallet/src/getBalance.ts b/wallets/nautilus-wallet/src/getBalance.ts index 95a87570..5084fc0b 100644 --- a/wallets/nautilus-wallet/src/getBalance.ts +++ b/wallets/nautilus-wallet/src/getBalance.ts @@ -1,12 +1,13 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/ergo'; import { Networks } from '@rosen-ui/constants'; +import { RosenAmountValue } from '@rosen-ui/types'; import { getNautilusWallet } from './getNautilusWallet'; export const getBalanceCreator = (config: WalletCreatorConfig) => - async (token: RosenChainToken): Promise => { + async (token: RosenChainToken): Promise => { const context = await getNautilusWallet().getApi().getContext(); const tokenMap = await config.getTokenMap(); @@ -22,7 +23,7 @@ export const getBalanceCreator = const amount = BigInt(balance); - if (!amount) return 0; + if (!amount) return 0n; const wrappedAmount = tokenMap.wrapAmount( tokenId, @@ -30,5 +31,5 @@ export const getBalanceCreator = Networks.ERGO ).amount; - return Number(wrappedAmount); + return wrappedAmount; }; diff --git a/wallets/nautilus-wallet/src/transfer.ts b/wallets/nautilus-wallet/src/transfer.ts index 2352f8af..edbb024a 100644 --- a/wallets/nautilus-wallet/src/transfer.ts +++ b/wallets/nautilus-wallet/src/transfer.ts @@ -1,6 +1,6 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/ergo'; -import { convertNumberToBigint, validateDecimalPlaces } from '@rosen-ui/utils'; +import { RosenAmountValue } from '@rosen-ui/types'; import { getNautilusWallet } from './getNautilusWallet'; @@ -8,18 +8,15 @@ export const transferCreator = (config: WalletCreatorConfig) => async ( token: RosenChainToken, - wrappedAmount: number, + amount: RosenAmountValue, toChain: string, toAddress: string, - wrappedBridgeFee: number, - wrappedNetworkFee: number, + bridgeFee: RosenAmountValue, + networkFee: RosenAmountValue, lockAddress: string ): Promise => { const wallet = await getNautilusWallet().getApi().getContext(); const tokenId = token.tokenId; - const amount = convertNumberToBigint(wrappedAmount); - const bridgeFee = convertNumberToBigint(wrappedBridgeFee); - const networkFee = convertNumberToBigint(wrappedNetworkFee); const changeAddress = await wallet.get_change_address(); const walletUtxos = await wallet.get_utxos(); diff --git a/wallets/wallet-api/src/types/index.ts b/wallets/wallet-api/src/types/index.ts index 77e5ba33..77026baa 100644 --- a/wallets/wallet-api/src/types/index.ts +++ b/wallets/wallet-api/src/types/index.ts @@ -1,5 +1,6 @@ import { ReactNode, FC } from 'react'; import { RosenChainToken } from '@rosen-bridge/tokens'; +import { RosenAmountValue } from '@rosen-ui/types'; export enum WalletState { NOT_CONNECTED, @@ -26,14 +27,14 @@ export interface WalletBase extends WalletInfo { } export interface Wallet extends WalletBase { - readonly getBalance: (token: RosenChainToken) => Promise; + readonly getBalance: (token: RosenChainToken) => Promise; readonly transfer: ( token: RosenChainToken, - amount: number, + amount: RosenAmountValue, toChain: string, address: string, - bridgeFee: number, - networkFee: number, + bridgeFee: RosenAmountValue, + networkFee: RosenAmountValue, lockAddress: string ) => Promise; readonly getAddress: () => Promise; diff --git a/wallets/xdefi-wallet/src/getBalance.ts b/wallets/xdefi-wallet/src/getBalance.ts index 3b597279..d344ae2d 100644 --- a/wallets/xdefi-wallet/src/getBalance.ts +++ b/wallets/xdefi-wallet/src/getBalance.ts @@ -2,12 +2,13 @@ import { WalletCreatorConfig } from '@rosen-network/bitcoin'; import { AddressPurpose, BitcoinNetworkType } from 'sats-connect'; import { Networks } from '@rosen-ui/constants'; import { RosenChainToken } from '@rosen-bridge/tokens'; +import { RosenAmountValue } from '@rosen-ui/types'; import { getXdefiWallet } from './getXdefiWallet'; export const getBalanceCreator = (config: WalletCreatorConfig) => - (token: RosenChainToken): Promise => { + (token: RosenChainToken): Promise => { return new Promise((resolve, reject) => { getXdefiWallet() .getApi() @@ -27,7 +28,7 @@ export const getBalanceCreator = const address = segwitPaymentAddresses[0].address; config .getAddressBalance(address) - .then((balance) => resolve(Number(balance))) + .then((balance) => resolve(balance)) .then((balance) => config.getTokenMap().then((tokenMap) => { const wrappedAmount = tokenMap.wrapAmount( @@ -35,7 +36,7 @@ export const getBalanceCreator = BigInt(Number(balance)), Networks.BITCOIN ).amount; - resolve(Number(wrappedAmount)); + resolve(wrappedAmount); }) ) .catch((e) => reject(e)); diff --git a/wallets/xdefi-wallet/src/transfer.ts b/wallets/xdefi-wallet/src/transfer.ts index fa30c6a7..0abc0b66 100644 --- a/wallets/xdefi-wallet/src/transfer.ts +++ b/wallets/xdefi-wallet/src/transfer.ts @@ -3,8 +3,8 @@ import { SigHash, WalletCreatorConfig, } from '@rosen-network/bitcoin/dist/src/types'; -import { convertNumberToBigint, validateDecimalPlaces } from '@rosen-ui/utils'; import { AddressPurpose, BitcoinNetworkType } from 'sats-connect'; +import { RosenAmountValue } from '@rosen-ui/types'; import { getXdefiWallet } from './getXdefiWallet'; @@ -12,17 +12,13 @@ export const transferCreator = (config: WalletCreatorConfig) => async ( token: RosenChainToken, - wrappedAmount: number, + amount: RosenAmountValue, toChain: string, toAddress: string, - wrappedBridgeFee: number, - wrappedNetworkFee: number, + bridgeFee: RosenAmountValue, + networkFee: RosenAmountValue, lockAddress: string ): Promise => { - const amount = convertNumberToBigint(wrappedAmount); - const bridgeFee = convertNumberToBigint(wrappedBridgeFee); - const networkFee = convertNumberToBigint(wrappedNetworkFee); - const userAddress: string = await new Promise((resolve, reject) => { getXdefiWallet() .getApi() From 7c1667df6e02e905267c9316ea6541ddf54b05de Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 17 Aug 2024 11:19:28 +0000 Subject: [PATCH 060/168] fix: Address the issue of loading the tokenMap.json file in both the server and browser environments. --- apps/rosen/app/_backend/utils.ts | 2 -- .../app/_networks/bitcoin/getMaxTransfer.ts | 2 +- apps/rosen/app/_networks/bitcoin/index.ts | 2 +- .../app/_networks/cardano/getMaxTransfer.ts | 2 +- apps/rosen/app/_networks/cardano/index.ts | 2 +- apps/rosen/app/_networks/ergo/getMaxTransfer.ts | 2 +- apps/rosen/app/_networks/ergo/index.ts | 2 +- .../{getTokenMap.ts => getTokenMap.client.ts} | 6 +++--- apps/rosen/app/_networks/getTokenMap.server.ts | 15 +++++++++++++++ apps/rosen/app/_networks/getTokenMapObject.ts | 17 +++++++++++++++++ apps/rosen/next.config.js | 3 +++ 11 files changed, 44 insertions(+), 11 deletions(-) rename apps/rosen/app/_networks/{getTokenMap.ts => getTokenMap.client.ts} (71%) create mode 100644 apps/rosen/app/_networks/getTokenMap.server.ts create mode 100644 apps/rosen/app/_networks/getTokenMapObject.ts diff --git a/apps/rosen/app/_backend/utils.ts b/apps/rosen/app/_backend/utils.ts index 6f72dafe..4d4798ef 100644 --- a/apps/rosen/app/_backend/utils.ts +++ b/apps/rosen/app/_backend/utils.ts @@ -1,5 +1,3 @@ -'use server'; - import fs from 'fs'; import path from 'path'; diff --git a/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts b/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts index c8575da2..dee4793c 100644 --- a/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts @@ -11,7 +11,7 @@ import { import { wrap } from '@/_errors'; import { BitcoinNetwork } from '@/_types/network'; import { Networks } from '@rosen-ui/constants'; -import { getTokenMap } from '../getTokenMap'; +import { getTokenMap } from '../getTokenMap.server'; /** * get max transfer for bitcoin diff --git a/apps/rosen/app/_networks/bitcoin/index.ts b/apps/rosen/app/_networks/bitcoin/index.ts index 29d6227c..733c37ba 100644 --- a/apps/rosen/app/_networks/bitcoin/index.ts +++ b/apps/rosen/app/_networks/bitcoin/index.ts @@ -15,7 +15,7 @@ import { getAddressBalance, } from './server'; -import { getTokenMap } from '../getTokenMap'; +import { getTokenMap } from '../getTokenMap.client'; /** * the main object for Bitcoin network diff --git a/apps/rosen/app/_networks/cardano/getMaxTransfer.ts b/apps/rosen/app/_networks/cardano/getMaxTransfer.ts index b5c81c50..8a87fbc0 100644 --- a/apps/rosen/app/_networks/cardano/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/cardano/getMaxTransfer.ts @@ -6,7 +6,7 @@ import { Networks } from '@rosen-ui/constants'; import { wrap } from '@/_errors'; import { CardanoNetwork } from '@/_types/network'; -import { getTokenMap } from '../getTokenMap'; +import { getTokenMap } from '../getTokenMap.server'; /** * get max transfer for cardano diff --git a/apps/rosen/app/_networks/cardano/index.ts b/apps/rosen/app/_networks/cardano/index.ts index 4a1e7fc5..b1dc40c2 100644 --- a/apps/rosen/app/_networks/cardano/index.ts +++ b/apps/rosen/app/_networks/cardano/index.ts @@ -28,7 +28,7 @@ import getVesprWallet, { isVesprAvailable, walletInfo as vesprWalletInfo, } from '@rosen-ui/vespr-wallet'; -import { getTokenMap } from '../getTokenMap'; +import { getTokenMap } from '../getTokenMap.client'; import { getMaxTransfer } from './getMaxTransfer'; /** diff --git a/apps/rosen/app/_networks/ergo/getMaxTransfer.ts b/apps/rosen/app/_networks/ergo/getMaxTransfer.ts index fa784ca6..4472c277 100644 --- a/apps/rosen/app/_networks/ergo/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/ergo/getMaxTransfer.ts @@ -9,7 +9,7 @@ import { Networks } from '@rosen-ui/constants'; import { wrap } from '@/_errors'; import { CardanoNetwork } from '@/_types/network'; -import { getTokenMap } from '../getTokenMap'; +import { getTokenMap } from '../getTokenMap.server'; /** * get max transfer for ergo diff --git a/apps/rosen/app/_networks/ergo/index.ts b/apps/rosen/app/_networks/ergo/index.ts index 7e8779e5..3b95c98c 100644 --- a/apps/rosen/app/_networks/ergo/index.ts +++ b/apps/rosen/app/_networks/ergo/index.ts @@ -12,7 +12,7 @@ import { } from '@rosen-network/ergo/dist/src/constants'; import { generateUnsignedTx } from './server'; -import { getTokenMap } from '../getTokenMap'; +import { getTokenMap } from '../getTokenMap.client'; import { getMaxTransfer } from './getMaxTransfer'; /** diff --git a/apps/rosen/app/_networks/getTokenMap.ts b/apps/rosen/app/_networks/getTokenMap.client.ts similarity index 71% rename from apps/rosen/app/_networks/getTokenMap.ts rename to apps/rosen/app/_networks/getTokenMap.client.ts index 163fd20d..da740c4a 100644 --- a/apps/rosen/app/_networks/getTokenMap.ts +++ b/apps/rosen/app/_networks/getTokenMap.client.ts @@ -1,15 +1,15 @@ import { TokenMap } from '@rosen-bridge/tokens'; -import { getRosenTokens } from '@/_backend/utils'; +import { getTokenMapObject } from './getTokenMapObject'; let tokenMap: TokenMap; /** - * get a TokenMap instance using the Rosen TokenMapObject in the browser. + * get a TokenMap instance using the Rosen TokenMapObject in the client. */ export const getTokenMap = async () => { if (tokenMap) return tokenMap; - const tokens = await getRosenTokens(); + const tokens = await getTokenMapObject(); tokenMap = new TokenMap(tokens); return tokenMap; }; diff --git a/apps/rosen/app/_networks/getTokenMap.server.ts b/apps/rosen/app/_networks/getTokenMap.server.ts new file mode 100644 index 00000000..76863c88 --- /dev/null +++ b/apps/rosen/app/_networks/getTokenMap.server.ts @@ -0,0 +1,15 @@ +import { TokenMap } from '@rosen-bridge/tokens'; + +import { getTokenMapObject } from './getTokenMapObject'; + +let tokenMap: TokenMap; + +/** + * get a TokenMap instance using the Rosen TokenMapObject in the server. + */ +export const getTokenMap = () => { + if (tokenMap) return tokenMap; + const tokens = getTokenMapObject(); + tokenMap = new TokenMap(tokens); + return tokenMap; +}; diff --git a/apps/rosen/app/_networks/getTokenMapObject.ts b/apps/rosen/app/_networks/getTokenMapObject.ts new file mode 100644 index 00000000..50d56f12 --- /dev/null +++ b/apps/rosen/app/_networks/getTokenMapObject.ts @@ -0,0 +1,17 @@ +'use server'; + +import fs from 'fs'; +import path from 'path'; + +let tokens: any; + +export const getTokenMapObject = () => { + if (tokens) return tokens; + tokens = JSON.parse( + fs.readFileSync( + path.join(process.cwd(), 'configs', 'tokensMap.json'), + 'utf-8', + ), + ); + return tokens; +}; diff --git a/apps/rosen/next.config.js b/apps/rosen/next.config.js index 0be08142..42f3e2b3 100644 --- a/apps/rosen/next.config.js +++ b/apps/rosen/next.config.js @@ -2,6 +2,9 @@ const nextConfig = { experimental: { + outputFileTracingIncludes: { + '/': ['./configs/*'], + }, serverComponentsExternalPackages: [ 'ergo-lib-wasm-nodejs', '@emurgo/cardano-serialization-lib-nodejs', From 0ba6c11ee61f30b6e516a8731b4645166688bfb3 Mon Sep 17 00:00:00 2001 From: Hadi Fazelinia Date: Mon, 19 Aug 2024 06:43:09 +0000 Subject: [PATCH 061/168] Apply 1 suggestion(s) to 1 file(s) --- apps/rosen/app/_networks/cardano/getMaxTransfer.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/rosen/app/_networks/cardano/getMaxTransfer.ts b/apps/rosen/app/_networks/cardano/getMaxTransfer.ts index 8a87fbc0..16dbbf9f 100644 --- a/apps/rosen/app/_networks/cardano/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/cardano/getMaxTransfer.ts @@ -23,8 +23,7 @@ export const getMaxTransfer = wrap( Networks.CARDANO, ).amount; const offsetCandidateWrapped = Number(feeAndMinBoxValueWrapped); - const shouldApplyOffset = isNative; - const offset = shouldApplyOffset ? offsetCandidateWrapped : 0; + const offset = isNative ? offsetCandidateWrapped : 0; const amount = balance - offset; return amount < 0 ? 0 : amount; }, From e80aceaf35cb74895e006e86059afc50e563096e Mon Sep 17 00:00:00 2001 From: Hadi Fazelinia Date: Mon, 19 Aug 2024 06:43:25 +0000 Subject: [PATCH 062/168] Apply 1 suggestion(s) to 1 file(s) --- apps/rosen/app/_networks/ergo/getMaxTransfer.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/rosen/app/_networks/ergo/getMaxTransfer.ts b/apps/rosen/app/_networks/ergo/getMaxTransfer.ts index 4472c277..465636a2 100644 --- a/apps/rosen/app/_networks/ergo/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/ergo/getMaxTransfer.ts @@ -26,8 +26,7 @@ export const getMaxTransfer = wrap( Networks.ERGO, ).amount; const offsetCandidateWrapped = Number(feeAndMinBoxValueWrapped); - const shouldApplyOffset = isNative; - const offset = shouldApplyOffset ? offsetCandidateWrapped : 0; + const offset = isNative ? offsetCandidateWrapped : 0; const amount = balance - offset; return amount < 0 ? 0 : amount; }, From ab3e4132af111b2907db4d16eb5912a942603abb Mon Sep 17 00:00:00 2001 From: Hadi Fazelinia Date: Mon, 19 Aug 2024 06:50:22 +0000 Subject: [PATCH 063/168] Apply 1 suggestion(s) to 1 file(s) --- networks/bitcoin/unitTests/src/generateTx.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/networks/bitcoin/unitTests/src/generateTx.test.ts b/networks/bitcoin/unitTests/src/generateTx.test.ts index fd06d6c2..ba256f3f 100644 --- a/networks/bitcoin/unitTests/src/generateTx.test.ts +++ b/networks/bitcoin/unitTests/src/generateTx.test.ts @@ -84,7 +84,7 @@ describe('generateUnsignedTx', () => { }); /** - * @target generateUnsignedTx should generate lock transaction successfully + * @target generateUnsignedTx should generate lock transaction with multi decimals token map successfully * @dependencies * - utils.getAddressUtxos * - utils.getFeeRatio @@ -100,7 +100,7 @@ describe('generateUnsignedTx', () => { * - 2nd output should be to lock address with given amount * - 3rd output should be to from address with remaining BTC minus fee */ - it('should generate lock transaction successfully', async () => { + it('should generate lock transaction with multi decimals token map successfully', async () => { const lockAddress = 'bc1qkgp89fjerymm5ltg0hygnumr0m2qa7n22gyw6h'; const fromAddress = 'bc1qhuv3dhpnm0wktasd3v0kt6e4aqfqsd0uhfdu7d'; const wrappedAmount = 5000000n; From c1c67fddeedd27ae45822385978d760a7e6cb664 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 19 Aug 2024 06:56:43 +0000 Subject: [PATCH 064/168] chore: Address and resolve issues identified in the review. --- apps/rosen/app/(bridge)/BridgeForm.tsx | 4 ++-- apps/rosen/app/_hooks/useBridgeForm.ts | 2 +- apps/rosen/app/_hooks/useTransactionFees.ts | 23 +++++++-------------- apps/rosen/package.json | 2 +- package-lock.json | 8 +++---- packages/asset-calculator/package.json | 2 +- wallets/vespr-wallet/package.json | 2 +- wallets/wallet-api/package.json | 2 +- 8 files changed, 18 insertions(+), 27 deletions(-) diff --git a/apps/rosen/app/(bridge)/BridgeForm.tsx b/apps/rosen/app/(bridge)/BridgeForm.tsx index 576d96e6..dacdeac5 100644 --- a/apps/rosen/app/(bridge)/BridgeForm.tsx +++ b/apps/rosen/app/(bridge)/BridgeForm.tsx @@ -175,7 +175,7 @@ const BridgeForm = () => { const handleSelectMax = useCallback(async () => { const value = getDecimalString( max.toString(), - tokenMap.getSignificantDecimals(tokenField.value?.tokenId) ?? 0, + tokenMap.getSignificantDecimals(tokenField.value?.tokenId) || 0, ); setValue('amount', value, { @@ -201,7 +201,7 @@ const BridgeForm = () => { amount.toString(), tokenMap.getSignificantDecimals( tokenField.value.tokenId, - ) ?? 0, + ) || 0, ) }`} diff --git a/apps/rosen/app/_hooks/useBridgeForm.ts b/apps/rosen/app/_hooks/useBridgeForm.ts index 06a39db7..0fdbb7ab 100644 --- a/apps/rosen/app/_hooks/useBridgeForm.ts +++ b/apps/rosen/app/_hooks/useBridgeForm.ts @@ -63,7 +63,7 @@ const useBridgeForm = () => { // prevent user from entering more decimals than token decimals const isDecimalsLarge = - (match?.groups?.floatingDigits?.length ?? 0) > decimals; + (match?.groups?.floatingDigits?.length || 0) > decimals; if (isDecimalsLarge) return `The current token only supports ${decimals} decimals`; diff --git a/apps/rosen/app/_hooks/useTransactionFees.ts b/apps/rosen/app/_hooks/useTransactionFees.ts index b17e819d..9852808c 100644 --- a/apps/rosen/app/_hooks/useTransactionFees.ts +++ b/apps/rosen/app/_hooks/useTransactionFees.ts @@ -58,8 +58,8 @@ const useTransactionFees = ( }, [getTokenId, sourceChain, token]); const decimals = useMemo(() => { - if (!tokenId) return; - return tokenMap.getSignificantDecimals(tokenId); + if (!tokenId) return 0; + return tokenMap.getSignificantDecimals(tokenId) || 0; }, [tokenId, tokenMap]); useEffect(() => { @@ -133,7 +133,7 @@ const useTransactionFees = ( const transactionFees = useMemo(() => { let paymentAmount = amount - ? +getNonDecimalString(amount.toString(), decimals || 0) + ? +getNonDecimalString(amount.toString(), decimals) : 0; const networkFee = fees ? Number(fees.networkFee) : 0; @@ -153,27 +153,18 @@ const useTransactionFees = ( return { bridgeFee: bridgeFee || 0, - bridgeFeeRaw: getDecimalString( - bridgeFee?.toString() || '0', - decimals || 0, - ), + bridgeFeeRaw: getDecimalString(bridgeFee?.toString() || '0', decimals), networkFee: networkFee || 0, - networkFeeRaw: getDecimalString( - networkFee?.toString() || '0', - decimals || 0, - ), + networkFeeRaw: getDecimalString(networkFee?.toString() || '0', decimals), receivingAmount: fees && receivingAmountValue > 0 ? receivingAmountValue || 0 : 0, receivingAmountRaw: fees && receivingAmountValue > 0 - ? getDecimalString( - receivingAmountValue.toString() || '0', - decimals || 0, - ) + ? getDecimalString(receivingAmountValue.toString() || '0', decimals) : '0', minTransfer: minTransfer ? minTransfer + 1 || 0 : 0, minTransferRaw: minTransfer - ? getDecimalString((minTransfer + 1).toString() || '0', decimals || 0) + ? getDecimalString((minTransfer + 1).toString() || '0', decimals) : '0', isLoading: pending, status: feeInfo.current, diff --git a/apps/rosen/package.json b/apps/rosen/package.json index fc7278a9..83627b25 100644 --- a/apps/rosen/package.json +++ b/apps/rosen/package.json @@ -25,7 +25,7 @@ "@rosen-bridge/minimum-fee": "^2.0.1", "@rosen-bridge/observation-extractor": "^4.0.0", "@rosen-bridge/scanner": "^3.0.0", - "@rosen-bridge/tokens": "^1.0.0", + "@rosen-bridge/tokens": "^1.2.1", "@rosen-bridge/watcher-data-extractor": "^4.0.0", "@rosen-clients/cardano-koios": "^2.0.1", "@rosen-clients/ergo-explorer": "^1.0.2", diff --git a/package-lock.json b/package-lock.json index 8d9b8ec0..9a8cc244 100644 --- a/package-lock.json +++ b/package-lock.json @@ -91,7 +91,7 @@ "@rosen-bridge/minimum-fee": "^2.0.1", "@rosen-bridge/observation-extractor": "^4.0.0", "@rosen-bridge/scanner": "^3.0.0", - "@rosen-bridge/tokens": "^1.0.0", + "@rosen-bridge/tokens": "^1.2.1", "@rosen-bridge/watcher-data-extractor": "^4.0.0", "@rosen-clients/cardano-koios": "^2.0.1", "@rosen-clients/ergo-explorer": "^1.0.2", @@ -16302,7 +16302,7 @@ "@rosen-bridge/abstract-logger": "^1.0.0", "@rosen-bridge/extended-typeorm": "^0.0.2", "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-bridge/tokens": "^1.2.0", + "@rosen-bridge/tokens": "^1.2.1", "@rosen-clients/cardano-koios": "^2.0.1", "@rosen-clients/ergo-explorer": "^1.0.3", "axios": "^1.7.0", @@ -17206,7 +17206,7 @@ "@rosen-ui/wallet-api": "^1.0.2" }, "devDependencies": { - "@rosen-bridge/tokens": "^1.0.0", + "@rosen-bridge/tokens": "^1.2.1", "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.26.0", "eslint": "^8.16.0", @@ -17236,7 +17236,7 @@ "@rosen-ui/utils": "^0.3.0" }, "devDependencies": { - "@rosen-bridge/tokens": "^1.0.0", + "@rosen-bridge/tokens": "^1.2.1", "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.26.0", "eslint": "^8.16.0", diff --git a/packages/asset-calculator/package.json b/packages/asset-calculator/package.json index 06d37591..0fefa860 100644 --- a/packages/asset-calculator/package.json +++ b/packages/asset-calculator/package.json @@ -34,7 +34,7 @@ "@rosen-bridge/abstract-logger": "^1.0.0", "@rosen-bridge/extended-typeorm": "^0.0.2", "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-bridge/tokens": "^1.2.0", + "@rosen-bridge/tokens": "^1.2.1", "@rosen-clients/cardano-koios": "^2.0.1", "@rosen-clients/ergo-explorer": "^1.0.3", "axios": "^1.7.0", diff --git a/wallets/vespr-wallet/package.json b/wallets/vespr-wallet/package.json index 98cffa20..5854d6da 100644 --- a/wallets/vespr-wallet/package.json +++ b/wallets/vespr-wallet/package.json @@ -12,7 +12,7 @@ "type-check": "tsc --noEmit" }, "devDependencies": { - "@rosen-bridge/tokens": "^1.0.0", + "@rosen-bridge/tokens": "^1.2.1", "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.26.0", "eslint": "^8.16.0", diff --git a/wallets/wallet-api/package.json b/wallets/wallet-api/package.json index 99569a29..72d48890 100644 --- a/wallets/wallet-api/package.json +++ b/wallets/wallet-api/package.json @@ -12,7 +12,7 @@ "release": "npm run build && npm publish --access public" }, "devDependencies": { - "@rosen-bridge/tokens": "^1.0.0", + "@rosen-bridge/tokens": "^1.2.1", "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.26.0", "eslint": "^8.16.0", From d55b229881e3de9a9b13a36af7c4b2d3c41c0a78 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 19 Aug 2024 08:03:12 +0000 Subject: [PATCH 065/168] chore: Revise the useTransactionFees.ts file. --- apps/rosen/app/_hooks/useTransactionFees.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/rosen/app/_hooks/useTransactionFees.ts b/apps/rosen/app/_hooks/useTransactionFees.ts index 9852808c..57f9d526 100644 --- a/apps/rosen/app/_hooks/useTransactionFees.ts +++ b/apps/rosen/app/_hooks/useTransactionFees.ts @@ -156,8 +156,7 @@ const useTransactionFees = ( bridgeFeeRaw: getDecimalString(bridgeFee?.toString() || '0', decimals), networkFee: networkFee || 0, networkFeeRaw: getDecimalString(networkFee?.toString() || '0', decimals), - receivingAmount: - fees && receivingAmountValue > 0 ? receivingAmountValue || 0 : 0, + receivingAmount: receivingAmountValue, receivingAmountRaw: fees && receivingAmountValue > 0 ? getDecimalString(receivingAmountValue.toString() || '0', decimals) From 146464d31a97698f13649812d639324ee1f32c84 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 20 Aug 2024 08:36:45 +0000 Subject: [PATCH 066/168] fix: Fix the bug that occurs when clicking the `Max` button while fetching the getMaxTransfer value. --- apps/rosen/app/(bridge)/BridgeForm.tsx | 4 ++-- apps/rosen/app/_hooks/useMaxTransfer.ts | 8 +++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/apps/rosen/app/(bridge)/BridgeForm.tsx b/apps/rosen/app/(bridge)/BridgeForm.tsx index dacdeac5..a865e521 100644 --- a/apps/rosen/app/(bridge)/BridgeForm.tsx +++ b/apps/rosen/app/(bridge)/BridgeForm.tsx @@ -100,7 +100,7 @@ const BridgeForm = () => { const { isLoading, amount, token } = useTokenBalance(); - const { max } = useMaxTransfer(); + const { max, loading: isMaxLoading } = useMaxTransfer(); const tokenMap = useTokenMap(); const renderSelectedNetwork = (value: unknown) => { @@ -186,7 +186,7 @@ const BridgeForm = () => { const renderInputActions = () => ( <> - {tokenField.value && !!max && ( + {tokenField.value && !!max && !isMaxLoading && ( { const [max, setMax] = useState(0); - const [loading, setLoading] = useState(false); + const [loading, startTransition] = useTransition(); const { isLoading: isTokenBalanceLoading, amount } = useTokenBalance(); @@ -34,7 +34,6 @@ const useMaxTransfer = () => { return; try { - setLoading(true); const max = await getMaxTransfer( selectedNetwork, { @@ -49,11 +48,10 @@ const useMaxTransfer = () => { ); setMax(max); } finally { - setLoading(false); } }; - effect(); + startTransition(effect); }, [ addressField.value, amount, From f92db9636a97c7bcfbf022c111893869c6b36e7c Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 20 Aug 2024 09:11:30 +0000 Subject: [PATCH 067/168] fix: Update the calculation of the wrapped amount before proceeding with the wallet transfer. --- apps/rosen/app/_hooks/useTransaction.ts | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/apps/rosen/app/_hooks/useTransaction.ts b/apps/rosen/app/_hooks/useTransaction.ts index d5258f6c..3ad8488c 100644 --- a/apps/rosen/app/_hooks/useTransaction.ts +++ b/apps/rosen/app/_hooks/useTransaction.ts @@ -37,16 +37,10 @@ export const useTransaction = () => { setIsSubmitting(true); try { const amountValueWrapped = Number( - tokenMap.wrapAmount( - tokenValue.tokenId, - BigInt( - getNonDecimalString( - amountValue as string, - tokenMap.getSignificantDecimals(tokenValue.tokenId) || 0, - ), - ), - sourceValue, - ).amount, + getNonDecimalString( + amountValue as string, + tokenMap.getSignificantDecimals(tokenValue.tokenId) || 0, + ), ); const txId = await selectedWallet?.transfer( tokenValue as RosenChainToken, From 52c33e740f540f40d60a599a710e0fc722bafbc0 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 20 Aug 2024 11:26:58 +0000 Subject: [PATCH 068/168] chore: Display a zero balance when the wallet balance is zero or when the token is unsupported. --- apps/rosen/app/(bridge)/BridgeForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/rosen/app/(bridge)/BridgeForm.tsx b/apps/rosen/app/(bridge)/BridgeForm.tsx index a865e521..ce35e78b 100644 --- a/apps/rosen/app/(bridge)/BridgeForm.tsx +++ b/apps/rosen/app/(bridge)/BridgeForm.tsx @@ -186,7 +186,7 @@ const BridgeForm = () => { const renderInputActions = () => ( <> - {tokenField.value && !!max && !isMaxLoading && ( + {tokenField.value && !isMaxLoading && ( Date: Tue, 20 Aug 2024 14:52:40 +0000 Subject: [PATCH 069/168] feat: Implement cache utility to optimize performance for server actions. --- apps/rosen/app/_networks/bitcoin/server.ts | 3 ++- apps/rosen/app/_utils/cache.ts | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 apps/rosen/app/_utils/cache.ts diff --git a/apps/rosen/app/_networks/bitcoin/server.ts b/apps/rosen/app/_networks/bitcoin/server.ts index ed07de59..d4db5983 100644 --- a/apps/rosen/app/_networks/bitcoin/server.ts +++ b/apps/rosen/app/_networks/bitcoin/server.ts @@ -10,10 +10,11 @@ import { import { wrap } from '@/_errors'; import { TokenMap } from '@rosen-bridge/tokens'; import { getRosenTokens } from '@/_backend/utils'; +import { cache } from '@/_utils/cache'; export const generateOpReturnData = wrap(generateOpReturnDataCore); export const generateUnsignedTx = wrap( generateUnsignedTxCore(new TokenMap(getRosenTokens())), ); -export const getAddressBalance = wrap(getAddressBalanceCore); +export const getAddressBalance = wrap(cache(getAddressBalanceCore, 15000)); export const submitTransaction = wrap(submitTransactionCore); diff --git a/apps/rosen/app/_utils/cache.ts b/apps/rosen/app/_utils/cache.ts new file mode 100644 index 00000000..0bfd29f5 --- /dev/null +++ b/apps/rosen/app/_utils/cache.ts @@ -0,0 +1,20 @@ +const data = {} as any; + +export const cache = Promise>( + callback: T, + expiry: number, +): T => { + return (async (...args) => { + const key = args.map((arg) => arg.toString()).join(''); + + let [result, timestamp] = data[key] || [undefined, 0]; + + if (Date.now() < timestamp + expiry) return result; + + result = await callback(...args); + + data[key] = [result, Date.now()]; + + return result; + }) as T; +}; From 3855946cd8557a48b7a1fd39bda6ee18a61bb2af Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 21 Aug 2024 06:17:17 +0000 Subject: [PATCH 070/168] chore: Replace `getTokenMapObject` utility with `getRosenTokens` utility. --- apps/rosen/app/_backend/utils.ts | 2 ++ apps/rosen/app/_networks/getTokenMap.client.ts | 4 ++-- apps/rosen/app/_networks/getTokenMap.server.ts | 6 +++--- apps/rosen/app/_networks/getTokenMapObject.ts | 17 ----------------- apps/rosen/next.config.js | 4 ++++ 5 files changed, 11 insertions(+), 22 deletions(-) delete mode 100644 apps/rosen/app/_networks/getTokenMapObject.ts diff --git a/apps/rosen/app/_backend/utils.ts b/apps/rosen/app/_backend/utils.ts index 4d4798ef..6f72dafe 100644 --- a/apps/rosen/app/_backend/utils.ts +++ b/apps/rosen/app/_backend/utils.ts @@ -1,3 +1,5 @@ +'use server'; + import fs from 'fs'; import path from 'path'; diff --git a/apps/rosen/app/_networks/getTokenMap.client.ts b/apps/rosen/app/_networks/getTokenMap.client.ts index da740c4a..6cedf9a6 100644 --- a/apps/rosen/app/_networks/getTokenMap.client.ts +++ b/apps/rosen/app/_networks/getTokenMap.client.ts @@ -1,6 +1,6 @@ import { TokenMap } from '@rosen-bridge/tokens'; -import { getTokenMapObject } from './getTokenMapObject'; +import { getRosenTokens } from '@/_backend/utils'; let tokenMap: TokenMap; @@ -9,7 +9,7 @@ let tokenMap: TokenMap; */ export const getTokenMap = async () => { if (tokenMap) return tokenMap; - const tokens = await getTokenMapObject(); + const tokens = await getRosenTokens(); tokenMap = new TokenMap(tokens); return tokenMap; }; diff --git a/apps/rosen/app/_networks/getTokenMap.server.ts b/apps/rosen/app/_networks/getTokenMap.server.ts index 76863c88..dbd6cf05 100644 --- a/apps/rosen/app/_networks/getTokenMap.server.ts +++ b/apps/rosen/app/_networks/getTokenMap.server.ts @@ -1,15 +1,15 @@ import { TokenMap } from '@rosen-bridge/tokens'; -import { getTokenMapObject } from './getTokenMapObject'; +import { getRosenTokens } from '@/_backend/utils'; let tokenMap: TokenMap; /** * get a TokenMap instance using the Rosen TokenMapObject in the server. */ -export const getTokenMap = () => { +export const getTokenMap = async () => { if (tokenMap) return tokenMap; - const tokens = getTokenMapObject(); + const tokens = await getRosenTokens(); tokenMap = new TokenMap(tokens); return tokenMap; }; diff --git a/apps/rosen/app/_networks/getTokenMapObject.ts b/apps/rosen/app/_networks/getTokenMapObject.ts deleted file mode 100644 index 50d56f12..00000000 --- a/apps/rosen/app/_networks/getTokenMapObject.ts +++ /dev/null @@ -1,17 +0,0 @@ -'use server'; - -import fs from 'fs'; -import path from 'path'; - -let tokens: any; - -export const getTokenMapObject = () => { - if (tokens) return tokens; - tokens = JSON.parse( - fs.readFileSync( - path.join(process.cwd(), 'configs', 'tokensMap.json'), - 'utf-8', - ), - ); - return tokens; -}; diff --git a/apps/rosen/next.config.js b/apps/rosen/next.config.js index 42f3e2b3..cb86390a 100644 --- a/apps/rosen/next.config.js +++ b/apps/rosen/next.config.js @@ -3,6 +3,10 @@ const nextConfig = { experimental: { outputFileTracingIncludes: { + /** + * Transfer the 'configs' directory to the production build to ensure + * the 'tokensMap.json' file is accessible in the production environment. + */ '/': ['./configs/*'], }, serverComponentsExternalPackages: [ From 887bca38814f5f1093e0d2160f2e515949daf069 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 21 Aug 2024 07:15:07 +0000 Subject: [PATCH 071/168] chore: Enhance cache utilities to optimize performance. --- apps/rosen/app/_networks/bitcoin/index.ts | 3 ++- apps/rosen/app/_networks/bitcoin/server.ts | 3 +-- apps/rosen/app/_utils/cache.ts | 10 ++++------ 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/apps/rosen/app/_networks/bitcoin/index.ts b/apps/rosen/app/_networks/bitcoin/index.ts index 733c37ba..341e86a6 100644 --- a/apps/rosen/app/_networks/bitcoin/index.ts +++ b/apps/rosen/app/_networks/bitcoin/index.ts @@ -7,6 +7,7 @@ import { Networks } from '@rosen-ui/constants'; import { unwrap } from '@/_errors'; import { BitcoinNetwork as BitcoinNetworkType } from '@/_types/network'; +import { cache } from '@/_utils/cache'; import { generateOpReturnData, @@ -31,7 +32,7 @@ const BitcoinNetwork: BitcoinNetworkType = { getTokenMap, generateOpReturnData: unwrap(generateOpReturnData), generateUnsignedTx: unwrap(generateUnsignedTx), - getAddressBalance: unwrap(getAddressBalance), + getAddressBalance: cache(unwrap(getAddressBalance), 30000), submitTransaction: unwrap(submitTransaction), }), ], diff --git a/apps/rosen/app/_networks/bitcoin/server.ts b/apps/rosen/app/_networks/bitcoin/server.ts index d4db5983..ed07de59 100644 --- a/apps/rosen/app/_networks/bitcoin/server.ts +++ b/apps/rosen/app/_networks/bitcoin/server.ts @@ -10,11 +10,10 @@ import { import { wrap } from '@/_errors'; import { TokenMap } from '@rosen-bridge/tokens'; import { getRosenTokens } from '@/_backend/utils'; -import { cache } from '@/_utils/cache'; export const generateOpReturnData = wrap(generateOpReturnDataCore); export const generateUnsignedTx = wrap( generateUnsignedTxCore(new TokenMap(getRosenTokens())), ); -export const getAddressBalance = wrap(cache(getAddressBalanceCore, 15000)); +export const getAddressBalance = wrap(getAddressBalanceCore); export const submitTransaction = wrap(submitTransactionCore); diff --git a/apps/rosen/app/_utils/cache.ts b/apps/rosen/app/_utils/cache.ts index 0bfd29f5..cf7b3a28 100644 --- a/apps/rosen/app/_utils/cache.ts +++ b/apps/rosen/app/_utils/cache.ts @@ -9,12 +9,10 @@ export const cache = Promise>( let [result, timestamp] = data[key] || [undefined, 0]; - if (Date.now() < timestamp + expiry) return result; + if (Date.now() > timestamp + expiry) { + data[key] = [(result = callback(...args)), Date.now()]; + } - result = await callback(...args); - - data[key] = [result, Date.now()]; - - return result; + return await result; }) as T; }; From b972f506152356166e8d6795ab4013854dcad449 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 21 Aug 2024 10:27:25 +0000 Subject: [PATCH 072/168] chore: Resolve the issues related to maximum transfer. --- apps/rosen/app/_hooks/useMaxTransfer.ts | 2 ++ apps/rosen/app/_utils/getMaxTransfer.ts | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/rosen/app/_hooks/useMaxTransfer.ts b/apps/rosen/app/_hooks/useMaxTransfer.ts index 45fa8a3e..d10a71bc 100644 --- a/apps/rosen/app/_hooks/useMaxTransfer.ts +++ b/apps/rosen/app/_hooks/useMaxTransfer.ts @@ -33,6 +33,8 @@ const useMaxTransfer = () => { ) return; + if (!amount) return; + try { const max = await getMaxTransfer( selectedNetwork, diff --git a/apps/rosen/app/_utils/getMaxTransfer.ts b/apps/rosen/app/_utils/getMaxTransfer.ts index 407c261d..166b80b3 100644 --- a/apps/rosen/app/_utils/getMaxTransfer.ts +++ b/apps/rosen/app/_utils/getMaxTransfer.ts @@ -21,7 +21,7 @@ const getMaxTransfer = async ( ) => { if (network.name === 'bitcoin') { const context = await getContext(); - return network.getMaxTransfer({ + return await network.getMaxTransfer({ balance: tokenInfo.balance, isNative: tokenInfo.isNative, eventData: { @@ -32,7 +32,7 @@ const getMaxTransfer = async ( }); } - return network.getMaxTransfer({ + return await network.getMaxTransfer({ balance: tokenInfo.balance, isNative: tokenInfo.isNative, }); From 1fa104edc885197462a5df92794361267e2bda8e Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 21 Aug 2024 15:02:12 +0000 Subject: [PATCH 073/168] chore: Replace the address input field with the value input field. --- apps/rosen/app/(bridge)/BridgeForm.tsx | 38 +++++++++++++------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/apps/rosen/app/(bridge)/BridgeForm.tsx b/apps/rosen/app/(bridge)/BridgeForm.tsx index ce35e78b..f978daa1 100644 --- a/apps/rosen/app/(bridge)/BridgeForm.tsx +++ b/apps/rosen/app/(bridge)/BridgeForm.tsx @@ -306,25 +306,6 @@ const BridgeForm = () => { ); })} - { Only Native SegWit (P2WPKH or P2WSH) addresses are supported. )} + ); }; From e7dd7bedfc9c5fcfad32477074440e57756bd315 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Thu, 22 Aug 2024 10:47:48 +0000 Subject: [PATCH 074/168] fix: Address the error encountered while retrieving the maximum transfer. --- apps/rosen/app/_hooks/useMaxTransfer.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/rosen/app/_hooks/useMaxTransfer.ts b/apps/rosen/app/_hooks/useMaxTransfer.ts index d10a71bc..0be30f8b 100644 --- a/apps/rosen/app/_hooks/useMaxTransfer.ts +++ b/apps/rosen/app/_hooks/useMaxTransfer.ts @@ -49,8 +49,7 @@ const useMaxTransfer = () => { }), ); setMax(max); - } finally { - } + } catch {} }; startTransition(effect); From dd434aafbcf2ea02d4234c6cbce93c1856fdd559 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 24 Aug 2024 06:26:32 +0000 Subject: [PATCH 075/168] chore: Add a seperator to the cache utils. --- apps/rosen/app/_utils/cache.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/rosen/app/_utils/cache.ts b/apps/rosen/app/_utils/cache.ts index cf7b3a28..6ac7998e 100644 --- a/apps/rosen/app/_utils/cache.ts +++ b/apps/rosen/app/_utils/cache.ts @@ -5,7 +5,7 @@ export const cache = Promise>( expiry: number, ): T => { return (async (...args) => { - const key = args.map((arg) => arg.toString()).join(''); + const key = args.map((arg) => arg.toString()).join('_'); let [result, timestamp] = data[key] || [undefined, 0]; From 4245bff84ea1b65a77bed28bc0781bc204a1ab5a Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 24 Aug 2024 07:35:56 +0000 Subject: [PATCH 076/168] chore: Add changeset file. --- .changeset/itchy-cheetahs-itch.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changeset/itchy-cheetahs-itch.md diff --git a/.changeset/itchy-cheetahs-itch.md b/.changeset/itchy-cheetahs-itch.md new file mode 100644 index 00000000..7aa37556 --- /dev/null +++ b/.changeset/itchy-cheetahs-itch.md @@ -0,0 +1,7 @@ +--- +'@rosen-bridge/rosen-app': patch +--- + +- Replace the address input field with the value input field. +- Implement cache utility to optimize performance for server actions. +- Display a zero balance when the wallet balance is zero or when the token is unsupported. From 6376eb2ed9e51c98220cdbfef8833ce35efdcfb3 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 24 Aug 2024 08:03:18 +0000 Subject: [PATCH 077/168] chore: Update the bridge form. --- .changeset/itchy-cheetahs-itch.md | 4 +-- apps/rosen/app/(bridge)/BridgeForm.tsx | 44 +++++++++++++------------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/.changeset/itchy-cheetahs-itch.md b/.changeset/itchy-cheetahs-itch.md index 7aa37556..be8cd89c 100644 --- a/.changeset/itchy-cheetahs-itch.md +++ b/.changeset/itchy-cheetahs-itch.md @@ -2,6 +2,4 @@ '@rosen-bridge/rosen-app': patch --- -- Replace the address input field with the value input field. -- Implement cache utility to optimize performance for server actions. -- Display a zero balance when the wallet balance is zero or when the token is unsupported. +Implement cache utility to optimize performance for server actions and Display a zero balance when the wallet balance is zero or when the token is unsupported. diff --git a/apps/rosen/app/(bridge)/BridgeForm.tsx b/apps/rosen/app/(bridge)/BridgeForm.tsx index f978daa1..638d1b1a 100644 --- a/apps/rosen/app/(bridge)/BridgeForm.tsx +++ b/apps/rosen/app/(bridge)/BridgeForm.tsx @@ -278,6 +278,28 @@ const BridgeForm = () => { + + ) : ( + errors.walletAddress?.message?.toString() + ) + } + disabled={!targetField.value} + autoComplete="off" + {...addressField} + value={addressField.value ?? ''} + /> + {targetField.value == 'bitcoin' && ( + + Only Native SegWit (P2WPKH or P2WSH) addresses are supported. + + )} { ); })} - - ) : ( - errors.walletAddress?.message?.toString() - ) - } - disabled={!targetField.value} - autoComplete="off" - {...addressField} - value={addressField.value ?? ''} - /> - {targetField.value == 'bitcoin' && ( - - Only Native SegWit (P2WPKH or P2WSH) addresses are supported. - - )} Date: Sat, 24 Aug 2024 12:21:52 +0000 Subject: [PATCH 078/168] fix: Correct the conversion of the raw amount to the bigint type. --- apps/rosen/app/_hooks/useBridgeForm.ts | 14 +++++++------- apps/rosen/app/_hooks/useTransactionFees.ts | 8 +++++--- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/apps/rosen/app/_hooks/useBridgeForm.ts b/apps/rosen/app/_hooks/useBridgeForm.ts index b817cd55..8cf93db6 100644 --- a/apps/rosen/app/_hooks/useBridgeForm.ts +++ b/apps/rosen/app/_hooks/useBridgeForm.ts @@ -52,6 +52,13 @@ const useBridgeForm = () => { control, rules: { validate: async (value) => { + // match any complete or incomplete decimal number + const match = value.match(/^(\d+(\.(?\d+)?)?)?$/); + + // prevent user from entering invalid numbers + const isValueInvalid = !match; + if (isValueInvalid) return 'The amount is not valid'; + const decimals = tokenMap.getSignificantDecimals(tokenField.value.tokenId) || 0; @@ -61,13 +68,6 @@ const useBridgeForm = () => { sourceField.value, ).amount as RosenAmountValue; - // match any complete or incomplete decimal number - const match = value.match(/^(\d+(\.(?\d+)?)?)?$/); - - // prevent user from entering invalid numbers - const isValueInvalid = !match; - if (isValueInvalid) return 'The amount is not valid'; - // prevent user from entering more decimals than token decimals const isDecimalsLarge = (match?.groups?.floatingDigits?.length || 0) > decimals; diff --git a/apps/rosen/app/_hooks/useTransactionFees.ts b/apps/rosen/app/_hooks/useTransactionFees.ts index a21ad74c..c1cff5f8 100644 --- a/apps/rosen/app/_hooks/useTransactionFees.ts +++ b/apps/rosen/app/_hooks/useTransactionFees.ts @@ -132,9 +132,11 @@ const useTransactionFees = ( : 1n; const transactionFees = useMemo(() => { - let paymentAmount = amount - ? BigInt(getNonDecimalString(amount.toString(), decimals)) - : 0n; + let paymentAmount = 0n; + + try { + paymentAmount = BigInt(getNonDecimalString(amount!, decimals)); + } catch {} const networkFee = fees ? BigInt(fees.networkFee) : 0n; const feeRatio = fees ? BigInt(fees?.feeRatio) : 0n; From 6895477d961e2c3721475a3147499c6afc4a0ba2 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 24 Aug 2024 12:33:34 +0000 Subject: [PATCH 079/168] chore: Revise the bridge form to enhance maintainability. --- .changeset/empty-crews-cheat.md | 5 ++ apps/rosen/app/(bridge)/BridgeForm.tsx | 4 +- apps/rosen/app/(bridge)/BridgeTransaction.tsx | 47 +++------------ .../app/(bridge)/ConnectOrSubmitButton.tsx | 58 +++++++++++++++++++ apps/rosen/app/(bridge)/page.tsx | 4 +- 5 files changed, 73 insertions(+), 45 deletions(-) create mode 100644 .changeset/empty-crews-cheat.md create mode 100644 apps/rosen/app/(bridge)/ConnectOrSubmitButton.tsx diff --git a/.changeset/empty-crews-cheat.md b/.changeset/empty-crews-cheat.md new file mode 100644 index 00000000..d7e60095 --- /dev/null +++ b/.changeset/empty-crews-cheat.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': patch +--- + +Revise the bridge form to enhance maintainability. diff --git a/apps/rosen/app/(bridge)/BridgeForm.tsx b/apps/rosen/app/(bridge)/BridgeForm.tsx index 638d1b1a..89210a6e 100644 --- a/apps/rosen/app/(bridge)/BridgeForm.tsx +++ b/apps/rosen/app/(bridge)/BridgeForm.tsx @@ -79,7 +79,7 @@ const FormContainer = styled('div')(({ theme }) => ({ /** * renders the bridge main form */ -const BridgeForm = () => { +export const BridgeForm = () => { const { reset, setValue, @@ -350,5 +350,3 @@ const BridgeForm = () => { ); }; - -export default BridgeForm; diff --git a/apps/rosen/app/(bridge)/BridgeTransaction.tsx b/apps/rosen/app/(bridge)/BridgeTransaction.tsx index 9dbb6480..04d6281c 100644 --- a/apps/rosen/app/(bridge)/BridgeTransaction.tsx +++ b/apps/rosen/app/(bridge)/BridgeTransaction.tsx @@ -9,7 +9,6 @@ import { Divider, Grid, IconButton, - LoadingButton, Tooltip, Typography, styled, @@ -17,13 +16,13 @@ import { import useNetwork from '@/_hooks/useNetwork'; import { useTokensMap } from '@/_hooks/useTokensMap'; -import { useTransaction } from '@/_hooks/useTransaction'; import useTransactionFees from '@/_hooks/useTransactionFees'; import useTransactionFormData from '@/_hooks/useTransactionFormData'; import useWallet from '@/_hooks/useWallet'; import { getTokenNameAndId } from '@/_utils'; import { ChooseWalletModal } from './ChooseWalletModal'; +import { ConnectOrSubmitButton } from './ConnectOrSubmitButton'; /** * container component for asset prices @@ -46,26 +45,18 @@ const FeesContainer = styled('div')(({ theme }) => ({ * shows fees to the user and handles wallet transaction * and wallet connection */ -const BridgeTransaction = () => { +export const BridgeTransaction = () => { const [chooseWalletsModalOpen, setChooseWalletsModalOpen] = useState(false); - const { - sourceValue, - targetValue, - tokenValue, - amountValue, - formState: { isSubmitting: isFormSubmitting }, - handleSubmit, - } = useTransactionFormData(); + const { sourceValue, targetValue, tokenValue, amountValue } = + useTransactionFormData(); const rawTokenMap = useTokensMap(); const tokenMap = new TokenMap(rawTokenMap); const { status, - networkFee, networkFeeRaw, - bridgeFee, bridgeFeeRaw, receivingAmountRaw, isLoading: isLoadingFees, @@ -87,12 +78,6 @@ const BridgeTransaction = () => { const targetTokenInfo = targetTokenSearchResults?.[0]?.[targetValue]; const WalletIcon = selectedWallet?.icon; - const { startTransaction, isSubmitting: isTransactionSubmitting } = - useTransaction(); - - const handleFormSubmit = handleSubmit(() => { - startTransaction(bridgeFee, networkFee); - }); const renderFee = ( title: string, @@ -219,25 +204,9 @@ const BridgeTransaction = () => { - { - if (!selectedWallet) { - setChooseWalletsModalOpen(true); - } else { - handleFormSubmit(); - } - }} - > - {!selectedWallet ? 'CONNECT WALLET' : 'SUBMIT'} - + { ); }; - -export default BridgeTransaction; diff --git a/apps/rosen/app/(bridge)/ConnectOrSubmitButton.tsx b/apps/rosen/app/(bridge)/ConnectOrSubmitButton.tsx new file mode 100644 index 00000000..3c9b5bec --- /dev/null +++ b/apps/rosen/app/(bridge)/ConnectOrSubmitButton.tsx @@ -0,0 +1,58 @@ +import { LoadingButton } from '@rosen-bridge/ui-kit'; + +import { useTransaction } from '@/_hooks/useTransaction'; +import useTransactionFees from '@/_hooks/useTransactionFees'; +import useTransactionFormData from '@/_hooks/useTransactionFormData'; +import useWallet from '@/_hooks/useWallet'; + +interface ConnectOrSubmitButtonProps { + setChooseWalletsModalOpen: (open: boolean) => void; +} + +export const ConnectOrSubmitButton = ({ + setChooseWalletsModalOpen, +}: ConnectOrSubmitButtonProps) => { + const { + sourceValue, + targetValue, + tokenValue, + amountValue, + formState: { isSubmitting: isFormSubmitting }, + handleSubmit, + } = useTransactionFormData(); + + const { + networkFee, + bridgeFee, + isLoading: isLoadingFees, + } = useTransactionFees(sourceValue, targetValue, tokenValue, amountValue); + + const { selectedWallet } = useWallet(); + + const { startTransaction, isSubmitting: isTransactionSubmitting } = + useTransaction(); + + const handleFormSubmit = handleSubmit(() => { + startTransaction(bridgeFee, networkFee); + }); + + return ( + { + if (!selectedWallet) { + setChooseWalletsModalOpen(true); + } else { + handleFormSubmit(); + } + }} + > + {!selectedWallet ? 'CONNECT WALLET' : 'SUBMIT'} + + ); +}; diff --git a/apps/rosen/app/(bridge)/page.tsx b/apps/rosen/app/(bridge)/page.tsx index 3979de1e..8c60a9f1 100644 --- a/apps/rosen/app/(bridge)/page.tsx +++ b/apps/rosen/app/(bridge)/page.tsx @@ -9,8 +9,8 @@ import { useResponsiveValue, } from '@rosen-bridge/ui-kit'; -import BridgeTransaction from './BridgeTransaction'; -import BridgeForm from './BridgeForm'; +import { BridgeTransaction } from './BridgeTransaction'; +import { BridgeForm } from './BridgeForm'; import { RosenAmountValue } from '@rosen-ui/types'; const BridgeContainer = styled(Card)(({ theme }) => ({ From 058f0396fc97b0dfffefc551b74ba7bf1bfe7514 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 24 Aug 2024 12:56:44 +0000 Subject: [PATCH 080/168] fix: Convert amount to BigInt in useBridgeForm hook. --- apps/rosen/app/_hooks/useBridgeForm.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/rosen/app/_hooks/useBridgeForm.ts b/apps/rosen/app/_hooks/useBridgeForm.ts index 8cf93db6..5f4a8a58 100644 --- a/apps/rosen/app/_hooks/useBridgeForm.ts +++ b/apps/rosen/app/_hooks/useBridgeForm.ts @@ -62,18 +62,18 @@ const useBridgeForm = () => { const decimals = tokenMap.getSignificantDecimals(tokenField.value.tokenId) || 0; - const wrappedAmount = tokenMap.wrapAmount( - tokenField.value?.tokenId, - BigInt(getNonDecimalString(value, decimals)), - sourceField.value, - ).amount as RosenAmountValue; - // prevent user from entering more decimals than token decimals const isDecimalsLarge = (match?.groups?.floatingDigits?.length || 0) > decimals; if (isDecimalsLarge) return `The current token only supports ${decimals} decimals`; + const wrappedAmount = tokenMap.wrapAmount( + tokenField.value?.tokenId, + BigInt(getNonDecimalString(value, decimals)), + sourceField.value, + ).amount as RosenAmountValue; + if (walletGlobalContext!.state.selectedWallet) { // prevent user from entering more than token amount From a672c8e5cd602eec188ca8e767f3cb89bad243b3 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 24 Aug 2024 13:58:43 +0000 Subject: [PATCH 081/168] chore: Conceal the balance when the wallet is not connected. --- apps/rosen/app/(bridge)/BridgeForm.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/rosen/app/(bridge)/BridgeForm.tsx b/apps/rosen/app/(bridge)/BridgeForm.tsx index 638d1b1a..7d9eddc6 100644 --- a/apps/rosen/app/(bridge)/BridgeForm.tsx +++ b/apps/rosen/app/(bridge)/BridgeForm.tsx @@ -25,6 +25,7 @@ import useMaxTransfer from '@/_hooks/useMaxTransfer'; import useTokenBalance from '@/_hooks/useTokenBalance'; import useTransactionFormData from '@/_hooks/useTransactionFormData'; import { useTokenMap } from '@/_hooks/useTokenMap'; +import useWallet from '@/_hooks/useWallet'; /** * customized form input @@ -103,6 +104,8 @@ const BridgeForm = () => { const { max, loading: isMaxLoading } = useMaxTransfer(); const tokenMap = useTokenMap(); + const { selectedWallet } = useWallet(); + const renderSelectedNetwork = (value: unknown) => { const network = availableNetworks.find( (network) => network.name === value, @@ -186,7 +189,7 @@ const BridgeForm = () => { const renderInputActions = () => ( <> - {tokenField.value && !isMaxLoading && ( + {tokenField.value && !isMaxLoading && selectedWallet && ( Date: Sat, 24 Aug 2024 14:21:49 +0000 Subject: [PATCH 082/168] chore: Revise the calculation logic for the amount value in the form field. --- apps/rosen/app/_hooks/useBridgeForm.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/apps/rosen/app/_hooks/useBridgeForm.ts b/apps/rosen/app/_hooks/useBridgeForm.ts index 5f4a8a58..f8bd6a49 100644 --- a/apps/rosen/app/_hooks/useBridgeForm.ts +++ b/apps/rosen/app/_hooks/useBridgeForm.ts @@ -68,11 +68,9 @@ const useBridgeForm = () => { if (isDecimalsLarge) return `The current token only supports ${decimals} decimals`; - const wrappedAmount = tokenMap.wrapAmount( - tokenField.value?.tokenId, - BigInt(getNonDecimalString(value, decimals)), - sourceField.value, - ).amount as RosenAmountValue; + const wrappedAmount = BigInt( + getNonDecimalString(value, decimals), + ) as RosenAmountValue; if (walletGlobalContext!.state.selectedWallet) { // prevent user from entering more than token amount From b19579927d1d1db82e20e952b8b3e362fb9e39fe Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 26 Aug 2024 07:49:25 +0000 Subject: [PATCH 083/168] chore: Revise the regular expression used for validating the amount field. --- apps/rosen/app/_hooks/useBridgeForm.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/rosen/app/_hooks/useBridgeForm.ts b/apps/rosen/app/_hooks/useBridgeForm.ts index f8bd6a49..420751b0 100644 --- a/apps/rosen/app/_hooks/useBridgeForm.ts +++ b/apps/rosen/app/_hooks/useBridgeForm.ts @@ -53,7 +53,7 @@ const useBridgeForm = () => { rules: { validate: async (value) => { // match any complete or incomplete decimal number - const match = value.match(/^(\d+(\.(?\d+)?)?)?$/); + const match = value.match(/^(\d+(\.(?\d+))?)?$/); // prevent user from entering invalid numbers const isValueInvalid = !match; From 9d95e1d62a4045e4c003987a894b2c615a554f14 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 26 Aug 2024 11:29:44 +0000 Subject: [PATCH 084/168] chore: Add changeset file. --- .changeset/olive-mice-punch.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/olive-mice-punch.md diff --git a/.changeset/olive-mice-punch.md b/.changeset/olive-mice-punch.md new file mode 100644 index 00000000..b387f31d --- /dev/null +++ b/.changeset/olive-mice-punch.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': major +--- + +Transform the Rosen amount type from a numerical format to a bigint data type. From 77e481cd16cfba8f031a05f1c5d071fb791e9da9 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 28 Aug 2024 07:56:48 +0000 Subject: [PATCH 085/168] fix: Implement utility functions to facilitate the transfer of the BigInt data type between the server and client in server actions. --- .changeset/giant-donkeys-camp.md | 5 + apps/rosen/app/_actions/calculateFee.ts | 73 +++++++------- apps/rosen/app/_hooks/useTransactionFees.ts | 3 +- .../app/_networks/bitcoin/getMaxTransfer.ts | 95 ++++++++++--------- apps/rosen/app/_networks/bitcoin/index.ts | 11 ++- apps/rosen/app/_networks/bitcoin/server.ts | 9 +- .../app/_networks/cardano/getMaxTransfer.ts | 35 +++---- apps/rosen/app/_networks/cardano/index.ts | 53 +++++++---- apps/rosen/app/_networks/cardano/server.ts | 11 ++- .../app/_networks/ergo/getMaxTransfer.ts | 35 +++---- apps/rosen/app/_networks/ergo/index.ts | 5 +- apps/rosen/app/_networks/ergo/server.ts | 3 +- apps/rosen/app/_utils/index.ts | 3 +- apps/rosen/app/_utils/safeData.ts | 84 ++++++++++++++++ packages/types/src/common.ts | 1 + 15 files changed, 275 insertions(+), 151 deletions(-) create mode 100644 .changeset/giant-donkeys-camp.md create mode 100644 apps/rosen/app/_utils/safeData.ts diff --git a/.changeset/giant-donkeys-camp.md b/.changeset/giant-donkeys-camp.md new file mode 100644 index 00000000..2a415bd5 --- /dev/null +++ b/.changeset/giant-donkeys-camp.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': patch +--- + +Implement utility functions to facilitate the transfer of the BigInt data type between the server and client in server actions. diff --git a/apps/rosen/app/_actions/calculateFee.ts b/apps/rosen/app/_actions/calculateFee.ts index b67891bd..cac4ceed 100644 --- a/apps/rosen/app/_actions/calculateFee.ts +++ b/apps/rosen/app/_actions/calculateFee.ts @@ -16,6 +16,7 @@ import { Networks } from '@rosen-ui/constants'; import { ERGO_EXPLORER_URL, feeConfigTokenId } from '@/_constants'; import { AvailableNetworks } from '@/_networks'; import { wrap } from '@/_errors'; +import { toSafeData } from '@/_utils/safeData'; const GetHeight = { [Networks.CARDANO]: async () => @@ -42,42 +43,46 @@ const GetHeight = { */ export const calculateFee = wrap( - async ( - sourceNetwork: AvailableNetworks, - targetNetwork: AvailableNetworks, - tokenId: string, - nextHeightInterval: number, - ) => { - try { - const height = await GetHeight[sourceNetwork](); + toSafeData( + async ( + sourceNetwork: AvailableNetworks, + targetNetwork: AvailableNetworks, + tokenId: string, + nextHeightInterval: number, + ) => { + try { + const height = await GetHeight[sourceNetwork](); - if (!height) { - throw new Error('Cannot fetch height from the api endpoint'); - } + if (!height) { + throw new Error('Cannot fetch height from the api endpoint'); + } - const minFeeBox = new MinimumFeeBox( - tokenId, - feeConfigTokenId, - ErgoNetworkType.explorer, - ERGO_EXPLORER_URL, - ); - await minFeeBox.fetchBox(); + const minFeeBox = new MinimumFeeBox( + tokenId, + feeConfigTokenId, + ErgoNetworkType.explorer, + ERGO_EXPLORER_URL, + ); + await minFeeBox.fetchBox(); - const [fees, nextFees] = await Promise.all([ - minFeeBox.getFee(sourceNetwork, height, targetNetwork), - minFeeBox.getFee( - sourceNetwork, - height + nextHeightInterval, - targetNetwork, - ), - ]); + const [fees, nextFees] = await Promise.all([ + minFeeBox.getFee(sourceNetwork, height, targetNetwork), + minFeeBox.getFee( + sourceNetwork, + height + nextHeightInterval, + targetNetwork, + ), + ]); - return JsonBigInt.stringify({ - fees, - nextFees, - }); - } catch (error) { - throw new Error(error instanceof Error ? error.message : 'Unknown Error'); - } - }, + return JsonBigInt.stringify({ + fees, + nextFees, + }); + } catch (error) { + throw new Error( + error instanceof Error ? error.message : 'Unknown Error', + ); + } + }, + ), ); diff --git a/apps/rosen/app/_hooks/useTransactionFees.ts b/apps/rosen/app/_hooks/useTransactionFees.ts index c1cff5f8..86949274 100644 --- a/apps/rosen/app/_hooks/useTransactionFees.ts +++ b/apps/rosen/app/_hooks/useTransactionFees.ts @@ -13,6 +13,7 @@ import { calculateFee } from '@/_actions/calculateFee'; import { AvailableNetworks } from '@/_networks'; import { unwrap } from '@/_errors'; import { useTokenMap } from './useTokenMap'; +import { fromSafeData } from '@/_utils/safeData'; /** * calculates the fees for a token swap between @@ -80,7 +81,7 @@ const useTransactionFees = ( ) { startTransition(async () => { try { - const data = await unwrap(calculateFee)( + const data = await unwrap(fromSafeData(calculateFee))( sourceChain, targetChain, tokenId, diff --git a/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts b/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts index 9564f73a..bba305ca 100644 --- a/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts @@ -13,59 +13,62 @@ import { BitcoinNetwork } from '@/_types/network'; import { Networks } from '@rosen-ui/constants'; import { getTokenMap } from '../getTokenMap.server'; import { RosenAmountValue } from '@rosen-ui/types'; +import { toSafeData } from '@/_utils/safeData'; /** * get max transfer for bitcoin */ export const getMaxTransfer = wrap( - async ({ - balance, - isNative, - eventData, - }: Parameters< - BitcoinNetwork['getMaxTransfer'] - >[0]): Promise => { - if (!eventData.toAddress) return 0n; + toSafeData( + async ({ + balance, + isNative, + eventData, + }: Parameters< + BitcoinNetwork['getMaxTransfer'] + >[0]): Promise => { + if (!eventData.toAddress) return 0n; - const feeRatio = await getFeeRatio(); - const opRetrunDataLength = ( - await generateOpReturnData( - eventData.toChain, - eventData.toAddress, - // We don't care about the actual op return data and only need the length - '0', - '0', - ) - ).length; - const utxos = await getAddressUtxos(eventData.fromAddress); - const estimatedTxWeight = await estimateTxWeight( - /** - * When getting max transfer, probably all of the utxos are going to be - * spent - */ - utxos.length, - 2, - opRetrunDataLength, - ); - const estimatedFee = Math.ceil((estimatedTxWeight / 4) * feeRatio); - const minSatoshi = await getMinimumMeaningfulSatoshi(feeRatio); + const feeRatio = await getFeeRatio(); + const opRetrunDataLength = ( + await generateOpReturnData( + eventData.toChain, + eventData.toAddress, + // We don't care about the actual op return data and only need the length + '0', + '0', + ) + ).length; + const utxos = await getAddressUtxos(eventData.fromAddress); + const estimatedTxWeight = await estimateTxWeight( + /** + * When getting max transfer, probably all of the utxos are going to be + * spent + */ + utxos.length, + 2, + opRetrunDataLength, + ); + const estimatedFee = Math.ceil((estimatedTxWeight / 4) * feeRatio); + const minSatoshi = await getMinimumMeaningfulSatoshi(feeRatio); - const tokenMap = await getTokenMap(); + const tokenMap = await getTokenMap(); - const offset = tokenMap.wrapAmount( - 'btc', - BigInt(estimatedFee) + minSatoshi, - Networks.BITCOIN, - ).amount; + const offset = tokenMap.wrapAmount( + 'btc', + BigInt(estimatedFee) + minSatoshi, + Networks.BITCOIN, + ).amount; - return balance < 0n || !isNative - ? 0n - : /** - * We need to subtract (utxos.length + 1) from the calculated value because - * of a bug in bitcoin box selection - * - * local:ergo/rosen-bridge/utils#204 - */ - balance - offset - BigInt(utxos.length + 1); - }, + return balance < 0n || !isNative + ? 0n + : /** + * We need to subtract (utxos.length + 1) from the calculated value because + * of a bug in bitcoin box selection + * + * local:ergo/rosen-bridge/utils#204 + */ + balance - offset - BigInt(utxos.length + 1); + }, + ), ); diff --git a/apps/rosen/app/_networks/bitcoin/index.ts b/apps/rosen/app/_networks/bitcoin/index.ts index 341e86a6..1ec9b29d 100644 --- a/apps/rosen/app/_networks/bitcoin/index.ts +++ b/apps/rosen/app/_networks/bitcoin/index.ts @@ -17,6 +17,7 @@ import { } from './server'; import { getTokenMap } from '../getTokenMap.client'; +import { fromSafeData } from '@/_utils/safeData'; /** * the main object for Bitcoin network @@ -30,15 +31,15 @@ const BitcoinNetwork: BitcoinNetworkType = { wallets: [ xdefiWalletCreator({ getTokenMap, - generateOpReturnData: unwrap(generateOpReturnData), - generateUnsignedTx: unwrap(generateUnsignedTx), - getAddressBalance: cache(unwrap(getAddressBalance), 30000), - submitTransaction: unwrap(submitTransaction), + generateOpReturnData: unwrap(fromSafeData(generateOpReturnData)), + generateUnsignedTx: unwrap(fromSafeData(generateUnsignedTx)), + getAddressBalance: cache(unwrap(fromSafeData(getAddressBalance)), 30000), + submitTransaction: unwrap(fromSafeData(submitTransaction)), }), ], nextHeightInterval: 1, lockAddress: process.env.NEXT_PUBLIC_BITCOIN_LOCK_ADDRESS!, - getMaxTransfer: unwrap(getMaxTransfer), + getMaxTransfer: unwrap(fromSafeData(getMaxTransfer)), }; export default BitcoinNetwork; diff --git a/apps/rosen/app/_networks/bitcoin/server.ts b/apps/rosen/app/_networks/bitcoin/server.ts index ed07de59..7cb8b723 100644 --- a/apps/rosen/app/_networks/bitcoin/server.ts +++ b/apps/rosen/app/_networks/bitcoin/server.ts @@ -10,10 +10,11 @@ import { import { wrap } from '@/_errors'; import { TokenMap } from '@rosen-bridge/tokens'; import { getRosenTokens } from '@/_backend/utils'; +import { toSafeData } from '@/_utils/safeData'; -export const generateOpReturnData = wrap(generateOpReturnDataCore); +export const generateOpReturnData = wrap(toSafeData(generateOpReturnDataCore)); export const generateUnsignedTx = wrap( - generateUnsignedTxCore(new TokenMap(getRosenTokens())), + toSafeData(generateUnsignedTxCore(new TokenMap(getRosenTokens()))), ); -export const getAddressBalance = wrap(getAddressBalanceCore); -export const submitTransaction = wrap(submitTransactionCore); +export const getAddressBalance = wrap(toSafeData(getAddressBalanceCore)); +export const submitTransaction = wrap(toSafeData(submitTransactionCore)); diff --git a/apps/rosen/app/_networks/cardano/getMaxTransfer.ts b/apps/rosen/app/_networks/cardano/getMaxTransfer.ts index cceab36c..302fef46 100644 --- a/apps/rosen/app/_networks/cardano/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/cardano/getMaxTransfer.ts @@ -8,25 +8,28 @@ import { CardanoNetwork } from '@/_types/network'; import { getTokenMap } from '../getTokenMap.server'; import { RosenAmountValue } from '@rosen-ui/types'; +import { toSafeData } from '@/_utils/safeData'; /** * get max transfer for cardano */ export const getMaxTransfer = wrap( - async ({ - balance, - isNative, - }: Parameters< - CardanoNetwork['getMaxTransfer'] - >[0]): Promise => { - const tokenMap = await getTokenMap(); - const feeAndMinBoxValueWrapped = tokenMap.wrapAmount( - 'ada', - feeAndMinBoxValue, - Networks.CARDANO, - ).amount; - const offset = isNative ? feeAndMinBoxValueWrapped : 0n; - const amount = balance - offset; - return amount < 0n ? 0n : amount; - }, + toSafeData( + async ({ + balance, + isNative, + }: Parameters< + CardanoNetwork['getMaxTransfer'] + >[0]): Promise => { + const tokenMap = await getTokenMap(); + const feeAndMinBoxValueWrapped = tokenMap.wrapAmount( + 'ada', + feeAndMinBoxValue, + Networks.CARDANO, + ).amount; + const offset = isNative ? feeAndMinBoxValueWrapped : 0n; + const amount = balance - offset; + return amount < 0n ? 0n : amount; + }, + ), ); diff --git a/apps/rosen/app/_networks/cardano/index.ts b/apps/rosen/app/_networks/cardano/index.ts index b1dc40c2..c6be71b5 100644 --- a/apps/rosen/app/_networks/cardano/index.ts +++ b/apps/rosen/app/_networks/cardano/index.ts @@ -30,6 +30,7 @@ import getVesprWallet, { } from '@rosen-ui/vespr-wallet'; import { getTokenMap } from '../getTokenMap.client'; import { getMaxTransfer } from './getMaxTransfer'; +import { fromSafeData } from '@/_utils/safeData'; /** * the main object for Cardano network @@ -42,38 +43,46 @@ const CardanoNetwork: CardanoNetworkType = { wallets: compact([ eternlWalletCreator({ getTokenMap, - decodeWasmValue: unwrap(decodeWasmValue), - generateLockAuxiliaryData: unwrap(generateLockAuxiliaryData), - generateUnsignedTx: unwrap(generateUnsignedTx), - setTxWitnessSet: unwrap(setTxWitnessSet), + decodeWasmValue: unwrap(fromSafeData(decodeWasmValue)), + generateLockAuxiliaryData: unwrap( + fromSafeData(generateLockAuxiliaryData), + ), + generateUnsignedTx: unwrap(fromSafeData(generateUnsignedTx)), + setTxWitnessSet: unwrap(fromSafeData(setTxWitnessSet)), }), flintWalletCreator({ getTokenMap, - decodeWasmValue: unwrap(decodeWasmValue), - generateLockAuxiliaryData: unwrap(generateLockAuxiliaryData), - generateUnsignedTx: unwrap(generateUnsignedTx), - setTxWitnessSet: unwrap(setTxWitnessSet), + decodeWasmValue: unwrap(fromSafeData(decodeWasmValue)), + generateLockAuxiliaryData: unwrap( + fromSafeData(generateLockAuxiliaryData), + ), + generateUnsignedTx: unwrap(fromSafeData(generateUnsignedTx)), + setTxWitnessSet: unwrap(fromSafeData(setTxWitnessSet)), }), laceWalletCreator({ getTokenMap, - decodeWasmValue: unwrap(decodeWasmValue), - generateLockAuxiliaryData: unwrap(generateLockAuxiliaryData), - generateUnsignedTx: unwrap(generateUnsignedTx), - setTxWitnessSet: unwrap(setTxWitnessSet), + decodeWasmValue: unwrap(fromSafeData(decodeWasmValue)), + generateLockAuxiliaryData: unwrap( + fromSafeData(generateLockAuxiliaryData), + ), + generateUnsignedTx: unwrap(fromSafeData(generateUnsignedTx)), + setTxWitnessSet: unwrap(fromSafeData(setTxWitnessSet)), }), namiWalletCreator({ getTokenMap, - decodeWasmValue: unwrap(decodeWasmValue), - generateLockAuxiliaryData: unwrap(generateLockAuxiliaryData), - generateUnsignedTx: unwrap(generateUnsignedTx), - setTxWitnessSet: unwrap(setTxWitnessSet), + decodeWasmValue: unwrap(fromSafeData(decodeWasmValue)), + generateLockAuxiliaryData: unwrap( + fromSafeData(generateLockAuxiliaryData), + ), + generateUnsignedTx: unwrap(fromSafeData(generateUnsignedTx)), + setTxWitnessSet: unwrap(fromSafeData(setTxWitnessSet)), }), isVesprAvailable() && { ...getVesprWallet(), getBalance: async (token: RosenChainToken) => { const context = await getVesprWallet().getApi().enable(); const rawValue = await context.getBalance(); - const balances = await unwrap(decodeWasmValue)(rawValue); + const balances = await unwrap(fromSafeData(decodeWasmValue))(rawValue); const amount = balances.find( (asset) => asset.policyId === token.policyId, @@ -107,7 +116,9 @@ const CardanoNetwork: CardanoNetworkType = { ); const changeAddressHex = await wallet.getChangeAddress(); - const auxiliaryDataHex = await unwrap(generateLockAuxiliaryData)( + const auxiliaryDataHex = await unwrap( + fromSafeData(generateLockAuxiliaryData), + )( toChain, toAddress, changeAddressHex, @@ -117,7 +128,7 @@ const CardanoNetwork: CardanoNetworkType = { const walletUtxos = await wallet.getUtxos(); if (!walletUtxos) throw Error(`Failed to fetch wallet utxos`); - const unsignedTxHex = await unwrap(generateUnsignedTx)( + const unsignedTxHex = await unwrap(fromSafeData(generateUnsignedTx))( walletUtxos, lockAddress, changeAddressHex, @@ -127,7 +138,7 @@ const CardanoNetwork: CardanoNetworkType = { auxiliaryDataHex, ); - const signedTxHex = await unwrap(setTxWitnessSet)( + const signedTxHex = await unwrap(fromSafeData(setTxWitnessSet))( unsignedTxHex, await wallet.signTx(unsignedTxHex, false), ); @@ -140,7 +151,7 @@ const CardanoNetwork: CardanoNetworkType = { nextHeightInterval: 25, logo: CardanoIcon, lockAddress: process.env.NEXT_PUBLIC_CARDANO_LOCK_ADDRESS!, - getMaxTransfer: unwrap(getMaxTransfer), + getMaxTransfer: unwrap(fromSafeData(getMaxTransfer)), }; export default CardanoNetwork; diff --git a/apps/rosen/app/_networks/cardano/server.ts b/apps/rosen/app/_networks/cardano/server.ts index dc5f6bd2..2f593909 100644 --- a/apps/rosen/app/_networks/cardano/server.ts +++ b/apps/rosen/app/_networks/cardano/server.ts @@ -10,10 +10,13 @@ import { import { wrap } from '@/_errors'; import { TokenMap } from '@rosen-bridge/tokens'; import { getRosenTokens } from '@/_backend/utils'; +import { toSafeData } from '@/_utils/safeData'; -export const decodeWasmValue = wrap(decodeWasmValueCore); -export const generateLockAuxiliaryData = wrap(generateLockAuxiliaryDataCore); +export const decodeWasmValue = wrap(toSafeData(decodeWasmValueCore)); +export const generateLockAuxiliaryData = wrap( + toSafeData(generateLockAuxiliaryDataCore), +); export const generateUnsignedTx = wrap( - generateUnsignedTxCore(new TokenMap(getRosenTokens())), + toSafeData(generateUnsignedTxCore(new TokenMap(getRosenTokens()))), ); -export const setTxWitnessSet = wrap(setTxWitnessSetCore); +export const setTxWitnessSet = wrap(toSafeData(setTxWitnessSetCore)); diff --git a/apps/rosen/app/_networks/ergo/getMaxTransfer.ts b/apps/rosen/app/_networks/ergo/getMaxTransfer.ts index 9a94b311..5788874d 100644 --- a/apps/rosen/app/_networks/ergo/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/ergo/getMaxTransfer.ts @@ -11,25 +11,28 @@ import { CardanoNetwork } from '@/_types/network'; import { getTokenMap } from '../getTokenMap.server'; import { RosenAmountValue } from '@rosen-ui/types'; +import { toSafeData } from '@/_utils/safeData'; /** * get max transfer for ergo */ export const getMaxTransfer = wrap( - async ({ - balance, - isNative, - }: Parameters< - CardanoNetwork['getMaxTransfer'] - >[0]): Promise => { - const tokenMap = await getTokenMap(); - const feeAndMinBoxValueWrapped = tokenMap.wrapAmount( - 'erg', - ergoFee + ergoMinBoxValue, - Networks.ERGO, - ).amount; - const offset = isNative ? feeAndMinBoxValueWrapped : 0n; - const amount = balance - offset; - return amount < 0n ? 0n : amount; - }, + toSafeData( + async ({ + balance, + isNative, + }: Parameters< + CardanoNetwork['getMaxTransfer'] + >[0]): Promise => { + const tokenMap = await getTokenMap(); + const feeAndMinBoxValueWrapped = tokenMap.wrapAmount( + 'erg', + ergoFee + ergoMinBoxValue, + Networks.ERGO, + ).amount; + const offset = isNative ? feeAndMinBoxValueWrapped : 0n; + const amount = balance - offset; + return amount < 0n ? 0n : amount; + }, + ), ); diff --git a/apps/rosen/app/_networks/ergo/index.ts b/apps/rosen/app/_networks/ergo/index.ts index 3b95c98c..f44e2725 100644 --- a/apps/rosen/app/_networks/ergo/index.ts +++ b/apps/rosen/app/_networks/ergo/index.ts @@ -14,6 +14,7 @@ import { import { generateUnsignedTx } from './server'; import { getTokenMap } from '../getTokenMap.client'; import { getMaxTransfer } from './getMaxTransfer'; +import { fromSafeData } from '@/_utils/safeData'; /** * the main object for Ergo network @@ -26,13 +27,13 @@ const ErgoNetwork: ErgoNetworkType = { wallets: [ nautilusWalletCreator({ getTokenMap, - generateUnsignedTx: unwrap(generateUnsignedTx), + generateUnsignedTx: unwrap(fromSafeData(generateUnsignedTx)), }), ], logo: ErgoIcon, nextHeightInterval: 5, lockAddress: process.env.NEXT_PUBLIC_ERGO_LOCK_ADDRESS!, - getMaxTransfer: unwrap(getMaxTransfer), + getMaxTransfer: unwrap(fromSafeData(getMaxTransfer)), }; export default ErgoNetwork; diff --git a/apps/rosen/app/_networks/ergo/server.ts b/apps/rosen/app/_networks/ergo/server.ts index 7218a80e..25e22033 100644 --- a/apps/rosen/app/_networks/ergo/server.ts +++ b/apps/rosen/app/_networks/ergo/server.ts @@ -5,7 +5,8 @@ import { generateUnsignedTx as generateUnsignedTxCore } from '@rosen-network/erg import { wrap } from '@/_errors'; import { TokenMap } from '@rosen-bridge/tokens'; import { getRosenTokens } from '@/_backend/utils'; +import { toSafeData } from '@/_utils/safeData'; export const generateUnsignedTx = wrap( - generateUnsignedTxCore(new TokenMap(getRosenTokens())), + toSafeData(generateUnsignedTxCore(new TokenMap(getRosenTokens()))), ); diff --git a/apps/rosen/app/_utils/index.ts b/apps/rosen/app/_utils/index.ts index 369af715..a0bb7c05 100644 --- a/apps/rosen/app/_utils/index.ts +++ b/apps/rosen/app/_utils/index.ts @@ -9,6 +9,7 @@ import { Networks } from '@rosen-ui/constants'; import { AvailableNetworks } from '@/_networks'; import { unwrap } from '@/_errors'; import { RosenAmountValue } from '@rosen-ui/types'; +import { fromSafeData } from '@/_utils/safeData'; /** * a utility to make unique interface for accessing token name @@ -46,7 +47,7 @@ export const getMinTransfer = async ( const ergoTokenId = tokens[0].ergo.tokenId; try { - const data = await unwrap(calculateFee)( + const data = await unwrap(fromSafeData(calculateFee))( sourceChain, targetChain, ergoTokenId, diff --git a/apps/rosen/app/_utils/safeData.ts b/apps/rosen/app/_utils/safeData.ts new file mode 100644 index 00000000..5bd0554d --- /dev/null +++ b/apps/rosen/app/_utils/safeData.ts @@ -0,0 +1,84 @@ +type AsyncFunction = (...args: any[]) => Promise; + +type FromSafeData = ( + func: Func, +) => (...args: Parameters) => Promise>>; + +type ToSafeData = ( + func: Func, +) => (...args: Parameters) => Promise>>; + +const processDataType = ( + input: any, + convertor: (value: any, type: string) => any, +): any => { + const type = typeof input; + + if (type != 'object') return convertor(input, type); + + if (Array.isArray(input)) { + return input.map((item: any) => processDataType(item, convertor)); + } + + if (input === null) { + return convertor(input, 'null'); + } + + if (input instanceof Date) { + return convertor(input, 'date'); + } + + const result = {} as any; + + for (const [key, value] of Object.entries(input)) { + result[key] = processDataType(value, convertor); + } + + return result; +}; + +const BIGINT_KEY = 'BIGINT:'; + +const from = (input: T): T => + processDataType(input, (value, type) => { + if (type != 'string' || !value.startsWith(BIGINT_KEY)) return value; + return BigInt(value.replace(BIGINT_KEY, '')); + }); + +const to = (input: T): T => + processDataType(input, (value, type) => { + if (type != 'bigint') return value; + return BIGINT_KEY + value.toString(); + }); + +/** + * Restore the original server action that was transformed by the 'toSafeData' wrapper. + * + * @example + * ``` + * // client.ts + * import { safeSum } from './server.ts'; + * const sum = fromSafeData(safeSum); + * sum(1n, 2n); + * ``` + */ +export const fromSafeData: FromSafeData = + (func) => + async (...args) => + from(await func(...to(args))); + +/** + * Transform an asynchronous function into a new one that accepts safe-type arguments + * and converting the original function's output into a safe-type. + * + * @example + * ``` + * // server.ts + * const sum = async (a: bigint, b: bigint) => a + b; + * export const safeSum = toSafeData(sum); + * ``` + */ +export const toSafeData: ToSafeData = + (func) => + async (...args) => + to(await func(...from(args))); diff --git a/packages/types/src/common.ts b/packages/types/src/common.ts index 7c99cb4c..817c7f2d 100644 --- a/packages/types/src/common.ts +++ b/packages/types/src/common.ts @@ -39,4 +39,5 @@ export interface MutationRequestBodyWithHeaders { }; } +// This is the Rosen wrapped-value export type RosenAmountValue = bigint; From 39c65f769219529754e90cc9b846a158a3cb8f29 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 28 Aug 2024 08:27:22 +0000 Subject: [PATCH 086/168] fix: Update getBalance function in the xdefi wallet. --- wallets/xdefi-wallet/src/getBalance.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wallets/xdefi-wallet/src/getBalance.ts b/wallets/xdefi-wallet/src/getBalance.ts index d344ae2d..1b0f2e4a 100644 --- a/wallets/xdefi-wallet/src/getBalance.ts +++ b/wallets/xdefi-wallet/src/getBalance.ts @@ -28,12 +28,11 @@ export const getBalanceCreator = const address = segwitPaymentAddresses[0].address; config .getAddressBalance(address) - .then((balance) => resolve(balance)) .then((balance) => config.getTokenMap().then((tokenMap) => { const wrappedAmount = tokenMap.wrapAmount( token[tokenMap.getIdKey(Networks.BITCOIN)], - BigInt(Number(balance)), + balance, Networks.BITCOIN ).amount; resolve(wrappedAmount); From 7614118afa48031c2841de74d1427bb679526cc3 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Thu, 29 Aug 2024 09:08:17 +0000 Subject: [PATCH 087/168] chore: Revise and enhance some sections of the code. --- apps/rosen/app/(bridge)/BridgeForm.tsx | 2 +- apps/rosen/app/(bridge)/BridgeTransaction.tsx | 6 +- apps/rosen/app/App.tsx | 27 ++-- apps/rosen/app/_contexts/tokenMapProvider.tsx | 30 ---- apps/rosen/app/_hooks/useBridgeForm.ts | 39 +++-- apps/rosen/app/_hooks/useLockAddress.ts | 12 -- apps/rosen/app/_hooks/useMaxTransfer.ts | 107 +++++++------- apps/rosen/app/_hooks/useNetwork.ts | 21 ++- apps/rosen/app/_hooks/useTokenMap.ts | 22 +-- apps/rosen/app/_hooks/useTokensMap.ts | 18 --- apps/rosen/app/_hooks/useTransaction.ts | 9 +- apps/rosen/app/_hooks/useTransactionFees.ts | 7 +- apps/rosen/app/_networks/bitcoin/index.ts | 18 +-- apps/rosen/app/_networks/cardano/index.ts | 133 ++---------------- apps/rosen/app/_networks/ergo/index.ts | 17 +-- .../rosen/app/_networks/getTokenMap.client.ts | 3 +- apps/rosen/app/_utils/getMaxTransfer.ts | 42 ------ apps/rosen/app/_utils/index.ts | 8 +- apps/rosen/app/layout.tsx | 11 +- 19 files changed, 155 insertions(+), 377 deletions(-) delete mode 100644 apps/rosen/app/_contexts/tokenMapProvider.tsx delete mode 100644 apps/rosen/app/_hooks/useLockAddress.ts delete mode 100644 apps/rosen/app/_hooks/useTokensMap.ts delete mode 100644 apps/rosen/app/_utils/getMaxTransfer.ts diff --git a/apps/rosen/app/(bridge)/BridgeForm.tsx b/apps/rosen/app/(bridge)/BridgeForm.tsx index bff715e3..42170dc3 100644 --- a/apps/rosen/app/(bridge)/BridgeForm.tsx +++ b/apps/rosen/app/(bridge)/BridgeForm.tsx @@ -21,7 +21,7 @@ import useBridgeForm from '@/_hooks/useBridgeForm'; import useNetwork from '@/_hooks/useNetwork'; import { getTokenNameAndId } from '@/_utils'; -import useMaxTransfer from '@/_hooks/useMaxTransfer'; +import { useMaxTransfer } from '@/_hooks/useMaxTransfer'; import useTokenBalance from '@/_hooks/useTokenBalance'; import useTransactionFormData from '@/_hooks/useTransactionFormData'; import { useTokenMap } from '@/_hooks/useTokenMap'; diff --git a/apps/rosen/app/(bridge)/BridgeTransaction.tsx b/apps/rosen/app/(bridge)/BridgeTransaction.tsx index 04d6281c..3b7b7ff5 100644 --- a/apps/rosen/app/(bridge)/BridgeTransaction.tsx +++ b/apps/rosen/app/(bridge)/BridgeTransaction.tsx @@ -2,7 +2,6 @@ import { useState } from 'react'; -import { TokenMap } from '@rosen-bridge/tokens'; import { Alert, Avatar, @@ -15,7 +14,7 @@ import { } from '@rosen-bridge/ui-kit'; import useNetwork from '@/_hooks/useNetwork'; -import { useTokensMap } from '@/_hooks/useTokensMap'; +import { useTokenMap } from '@/_hooks/useTokenMap'; import useTransactionFees from '@/_hooks/useTransactionFees'; import useTransactionFormData from '@/_hooks/useTransactionFormData'; import useWallet from '@/_hooks/useWallet'; @@ -51,8 +50,7 @@ export const BridgeTransaction = () => { const { sourceValue, targetValue, tokenValue, amountValue } = useTransactionFormData(); - const rawTokenMap = useTokensMap(); - const tokenMap = new TokenMap(rawTokenMap); + const tokenMap = useTokenMap(); const { status, diff --git a/apps/rosen/app/App.tsx b/apps/rosen/app/App.tsx index aef55665..7169698c 100644 --- a/apps/rosen/app/App.tsx +++ b/apps/rosen/app/App.tsx @@ -1,7 +1,6 @@ 'use client'; import React from 'react'; -import { RosenTokens } from '@rosen-bridge/tokens'; /** * FIXME: import NoSsr from ui-kit @@ -16,7 +15,6 @@ import Toolbar from './Toolbar'; import ThemeProvider from '@/_theme/ThemeProvider'; import { WalletContextProvider } from './_contexts/walletContext'; -import { TokensMapProvider } from './_contexts/tokenMapProvider'; const Root = styled('div')(({ theme }) => ({ width: '100vw', @@ -61,26 +59,23 @@ const Main = styled('main')(({ theme }) => ({ interface AppProps { children?: React.ReactNode; - tokensMap: RosenTokens; } -const App = ({ children, tokensMap }: AppProps) => { +const App = ({ children }: AppProps) => { return ( - - - - -
- - {children} -
- -
-
-
+ + + +
+ + {children} +
+ +
+
diff --git a/apps/rosen/app/_contexts/tokenMapProvider.tsx b/apps/rosen/app/_contexts/tokenMapProvider.tsx deleted file mode 100644 index 7d04952a..00000000 --- a/apps/rosen/app/_contexts/tokenMapProvider.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { createContext } from 'react'; - -import { RosenTokens } from '@rosen-bridge/tokens'; - -/** - * a context to share current tokens map in all server components - */ -export const TokensMapContext = createContext( - undefined, -); - -type TokensMapProviderProps = { - children: React.ReactNode; - tokensMap: RosenTokens; -}; - -/** - * the context provider for the tokens map config - */ - -export function TokensMapProvider({ - children, - tokensMap, -}: TokensMapProviderProps) { - return ( - - {children} - - ); -} diff --git a/apps/rosen/app/_hooks/useBridgeForm.ts b/apps/rosen/app/_hooks/useBridgeForm.ts index 420751b0..ce7b2a4c 100644 --- a/apps/rosen/app/_hooks/useBridgeForm.ts +++ b/apps/rosen/app/_hooks/useBridgeForm.ts @@ -3,7 +3,6 @@ import { useController } from 'react-hook-form'; import { getNonDecimalString } from '@rosen-ui/utils'; -import { useTokensMap } from './useTokensMap'; import useTransactionFormData from './useTransactionFormData'; import { WalletContext } from '@/_contexts/walletContext'; @@ -12,7 +11,7 @@ import { validateAddress } from '@/_actions/validateAddress'; import { AvailableNetworks, availableNetworks } from '@/_networks'; import { getMinTransfer } from '@/_utils/index'; -import getMaxTransfer from '@/_utils/getMaxTransfer'; +import { Networks } from '@rosen-ui/constants'; import { useTokenMap } from './useTokenMap'; import { RosenAmountValue } from '@rosen-ui/types'; @@ -28,7 +27,6 @@ const useBridgeForm = () => { useTransactionFormData(); const tokenMap = useTokenMap(); - const tokensMap = useTokensMap(); const walletGlobalContext = useContext(WalletContext); @@ -59,6 +57,7 @@ const useBridgeForm = () => { const isValueInvalid = !match; if (isValueInvalid) return 'The amount is not valid'; + if (!tokenMap) return 'Token map config is unavailable'; const decimals = tokenMap.getSignificantDecimals(tokenField.value.tokenId) || 0; @@ -72,28 +71,27 @@ const useBridgeForm = () => { getNonDecimalString(value, decimals), ) as RosenAmountValue; - if (walletGlobalContext!.state.selectedWallet) { + if (walletGlobalContext?.state.selectedWallet) { // prevent user from entering more than token amount const selectedNetwork = availableNetworks[sourceField.value as AvailableNetworks]; - const maxTransfer = await getMaxTransfer( - selectedNetwork, - { - balance: - await walletGlobalContext!.state.selectedWallet.getBalance( - tokenField.value, - ), - isNative: tokenField.value.metaData.type === 'native', - }, - async () => ({ - fromAddress: - await walletGlobalContext!.state.selectedWallet!.getAddress(), - toAddress: addressField.value, - toChain: targetField.value, - }), - ); + const maxTransfer = await selectedNetwork.getMaxTransfer({ + balance: await walletGlobalContext.state.selectedWallet.getBalance( + tokenField.value, + ), + isNative: tokenField.value.metaData.type === 'native', + eventData: + selectedNetwork.name !== Networks.BITCOIN + ? undefined + : ({ + fromAddress: + await walletGlobalContext.state.selectedWallet!.getAddress(), + toAddress: addressField.value, + toChain: targetField.value, + } as any), + }); const isAmountLarge = wrappedAmount > maxTransfer; if (isAmountLarge) return 'Balance insufficient'; @@ -103,7 +101,6 @@ const useBridgeForm = () => { tokenField.value, sourceField.value, targetField.value, - tokensMap, ); const isAmountSmall = wrappedAmount < minTransfer; if (isAmountSmall) return 'Minimum transfer amount not respected'; diff --git a/apps/rosen/app/_hooks/useLockAddress.ts b/apps/rosen/app/_hooks/useLockAddress.ts deleted file mode 100644 index 4f147dd4..00000000 --- a/apps/rosen/app/_hooks/useLockAddress.ts +++ /dev/null @@ -1,12 +0,0 @@ -import useNetwork from './useNetwork'; - -/** - * return the lock address for currently selected network - */ -const useLockAddress = () => { - const { selectedNetwork } = useNetwork(); - - return selectedNetwork?.lockAddress ?? ''; -}; - -export default useLockAddress; diff --git a/apps/rosen/app/_hooks/useMaxTransfer.ts b/apps/rosen/app/_hooks/useMaxTransfer.ts index 872fe74d..c7782ed5 100644 --- a/apps/rosen/app/_hooks/useMaxTransfer.ts +++ b/apps/rosen/app/_hooks/useMaxTransfer.ts @@ -1,73 +1,84 @@ -import { useEffect, useState, useTransition } from 'react'; +import { useCallback, useEffect, useState, useTransition } from 'react'; + +import { RosenAmountValue } from '@rosen-ui/types'; + +import { Networks } from '@rosen-ui/constants'; import useNetwork from './useNetwork'; -import useWallet from './useWallet'; -import useBridgeForm from './useBridgeForm'; import useTokenBalance from './useTokenBalance'; - -import getMaxTransfer from '@/_utils/getMaxTransfer'; -import { RosenAmountValue } from '@rosen-ui/types'; +import useTransactionFormData from './useTransactionFormData'; +import useWallet from './useWallet'; /** - * a hook version of `getMaxTransfer` util - * @returns CONTAINS A WRAPPED-VALUE + * Manage the maximum transferable amount. */ -const useMaxTransfer = () => { +export const useMaxTransfer = () => { + const [error, setError] = useState(false); + const [max, setMax] = useState(0n); - const [loading, startTransition] = useTransition(); - const { isLoading: isTokenBalanceLoading, amount } = useTokenBalance(); + const [isTransitionLoading, startTransition] = useTransition(); + + const { targetValue, tokenValue, walletAddressValue } = + useTransactionFormData(); const { selectedNetwork } = useNetwork(); - const { targetField, tokenField, addressField } = useBridgeForm(); + const { isLoading: isTokenBalanceLoading, amount } = useTokenBalance(); const { selectedWallet } = useWallet(); - useEffect(() => { - const effect = async () => { - if ( - !selectedNetwork || - !selectedWallet || - isTokenBalanceLoading || - !tokenField.value - ) - return; - - if (!amount) return; - - try { - const max = await getMaxTransfer( - selectedNetwork, - { - balance: amount, - isNative: tokenField.value.metaData.type === 'native', - }, - async () => ({ - fromAddress: await selectedWallet.getAddress(), - toAddress: addressField.value, - toChain: targetField.value, - }), - ); - setMax(max); - } catch {} - }; - - startTransition(effect); + const loading = isTokenBalanceLoading || isTransitionLoading; + + const load = useCallback(async () => { + const skip = + !amount || + isTokenBalanceLoading || + !selectedNetwork || + !selectedWallet || + !tokenValue; + + if (skip) return; + + setError(false); + + try { + let eventData: any; + + if (selectedNetwork.name === Networks.BITCOIN) { + eventData = { + fromAddress: await selectedWallet.getAddress(), + toAddress: walletAddressValue, + toChain: targetValue, + }; + } + + const max = await selectedNetwork.getMaxTransfer({ + balance: amount, + isNative: tokenValue.metaData.type === 'native', + eventData, + }); + + setMax(max); + } catch { + setError(true); + } }, [ - addressField.value, amount, isTokenBalanceLoading, selectedNetwork, selectedWallet, - targetField.value, - tokenField.value, + targetValue, + tokenValue, + walletAddressValue, ]); + useEffect(() => startTransition(load), [load]); + return { + error, + loading, max, - loading: loading || isTokenBalanceLoading, + load, }; }; - -export default useMaxTransfer; diff --git a/apps/rosen/app/_hooks/useNetwork.ts b/apps/rosen/app/_hooks/useNetwork.ts index 0bf5e0f2..1471f5b1 100644 --- a/apps/rosen/app/_hooks/useNetwork.ts +++ b/apps/rosen/app/_hooks/useNetwork.ts @@ -1,11 +1,10 @@ -import { TokenMap } from '@rosen-bridge/tokens'; import { useMemo } from 'react'; import { Networks } from '@rosen-ui/constants'; import { AvailableNetworks, availableNetworks } from '@/_networks'; import useBridgeForm from './useBridgeForm'; -import { useTokensMap } from './useTokensMap'; +import { useTokenMap } from './useTokenMap'; type Chain = string; type SourceFieldValue = Chain & AvailableNetworks; @@ -16,21 +15,17 @@ type SourceFieldValue = Chain & AvailableNetworks; */ const useNetwork = () => { const { sourceField, targetField } = useBridgeForm(); - const tokensMapObject = useTokensMap(); - - const tokensMap = useMemo(() => { - return new TokenMap(tokensMapObject); - }, [tokensMapObject]); + const tokenMap = useTokenMap(); /** * returns the list of available network objects if a and filters out * unsupported networks */ const availableNetworkObjects = useMemo(() => { - return (tokensMap.getAllChains() as SourceFieldValue[]) + return (tokenMap.getAllChains() as SourceFieldValue[]) .filter((chain) => Object.values(Networks).includes(chain)) .map((chain) => availableNetworks[chain]); - }, [tokensMap]); + }, [tokenMap]); /** * returns the list of available target network objects if a and filters out @@ -38,11 +33,11 @@ const useNetwork = () => { */ const targetNetworks = useMemo(() => { return ( - tokensMap.getSupportedChains(sourceField.value) as SourceFieldValue[] + tokenMap.getSupportedChains(sourceField.value) as SourceFieldValue[] ) .filter((chain) => Object.values(Networks).includes(chain)) .map((chain) => availableNetworks[chain]); - }, [sourceField.value, tokensMap]); + }, [sourceField.value, tokenMap]); /** * a list of available tokens in the selected network @@ -50,8 +45,8 @@ const useNetwork = () => { const tokens = useMemo(() => { if (!targetField.value || !sourceField.value) return []; - return tokensMap.getTokens(sourceField.value, targetField.value); - }, [targetField.value, sourceField.value, tokensMap]); + return tokenMap.getTokens(sourceField.value, targetField.value); + }, [targetField.value, sourceField.value, tokenMap]); return { availableNetworks: availableNetworkObjects, diff --git a/apps/rosen/app/_hooks/useTokenMap.ts b/apps/rosen/app/_hooks/useTokenMap.ts index 5ba5a341..d2b47e41 100644 --- a/apps/rosen/app/_hooks/useTokenMap.ts +++ b/apps/rosen/app/_hooks/useTokenMap.ts @@ -1,17 +1,23 @@ -import { useMemo } from 'react'; +import { useEffect, useState, useTransition } from 'react'; + import { TokenMap } from '@rosen-bridge/tokens'; -import { useTokensMap } from './useTokensMap'; +import { getTokenMap } from '@/_networks/getTokenMap.client'; /** * return TokenMap instance */ -export const useTokenMap = () => { - const tokensMapObject = useTokensMap(); +export const useTokenMap = (): TokenMap => { + const [tokenMap, setTokenMap] = useState( + new TokenMap({ idKeys: {}, tokens: [] }), + ); - const tokenMap = useMemo(() => { - return new TokenMap(tokensMapObject); - }, [tokensMapObject]); + const [, startTransition] = useTransition(); + useEffect(() => { + startTransition(async () => { + setTokenMap(await getTokenMap()); + }); + }, []); - return tokenMap; + return tokenMap!; }; diff --git a/apps/rosen/app/_hooks/useTokensMap.ts b/apps/rosen/app/_hooks/useTokensMap.ts deleted file mode 100644 index ee4bb8d4..00000000 --- a/apps/rosen/app/_hooks/useTokensMap.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { useContext } from 'react'; - -import { TokensMapContext } from '../_contexts/tokenMapProvider'; - -/** - * access tokens map context to get bridge token map configs - */ - -export const useTokensMap = () => { - const tokensMap = useContext(TokensMapContext); - if (tokensMap === undefined) { - throw new Error( - 'useSnackbar must be used within a TokensMap Context Provider', - ); - } - - return tokensMap; -}; diff --git a/apps/rosen/app/_hooks/useTransaction.ts b/apps/rosen/app/_hooks/useTransaction.ts index a260e85e..33aa69c1 100644 --- a/apps/rosen/app/_hooks/useTransaction.ts +++ b/apps/rosen/app/_hooks/useTransaction.ts @@ -3,7 +3,7 @@ import { useState } from 'react'; import { RosenChainToken } from '@rosen-bridge/tokens'; import { useSnackbar } from '@rosen-bridge/ui-kit'; -import useLockAddress from './useLockAddress'; +import useNetwork from './useNetwork'; import useTransactionFormData from './useTransactionFormData'; import useWallet from './useWallet'; import { getNonDecimalString } from '@rosen-ui/utils'; @@ -15,14 +15,14 @@ import { RosenAmountValue } from '@rosen-ui/types'; */ export const useTransaction = () => { const tokenMap = useTokenMap(); - const { sourceValue } = useTransactionFormData(); + const { selectedNetwork } = useNetwork(); const { targetValue, tokenValue, amountValue, walletAddressValue } = useTransactionFormData(); const { selectedWallet } = useWallet(); const [isSubmitting, setIsSubmitting] = useState(false); - const lockAddress = useLockAddress(); + const lockAddress = selectedNetwork?.lockAddress ?? ''; const { openSnackbar } = useSnackbar(); @@ -36,7 +36,8 @@ export const useTransaction = () => { amountValue && walletAddressValue && bridgeFee && - networkFee + networkFee && + tokenMap ) { setIsSubmitting(true); try { diff --git a/apps/rosen/app/_hooks/useTransactionFees.ts b/apps/rosen/app/_hooks/useTransactionFees.ts index 86949274..75f9c322 100644 --- a/apps/rosen/app/_hooks/useTransactionFees.ts +++ b/apps/rosen/app/_hooks/useTransactionFees.ts @@ -1,12 +1,11 @@ import { useMemo, useEffect, useRef, useCallback, useTransition } from 'react'; -import { RosenChainToken, TokenMap } from '@rosen-bridge/tokens'; +import { RosenChainToken } from '@rosen-bridge/tokens'; import { useSnackbar } from '@rosen-bridge/ui-kit'; import JsonBigInt from '@rosen-bridge/json-bigint'; import { getNonDecimalString, getDecimalString } from '@rosen-ui/utils'; import useNetwork from './useNetwork'; -import { useTokensMap } from './useTokensMap'; import { calculateFee } from '@/_actions/calculateFee'; @@ -31,21 +30,19 @@ const useTransactionFees = ( const feeInfo = useRef(null); const tokenMap = useTokenMap(); - const tokensMap = useTokensMap(); /** * finds and returns a token id based on supported networks */ const getTokenId = useCallback( (sourceChain: string, token: RosenChainToken) => { - const tokenMap = new TokenMap(tokensMap); const idKey = tokenMap.getIdKey(sourceChain); const tokens = tokenMap.search(sourceChain, { [idKey]: token[idKey], }); return tokens[0].ergo.tokenId; }, - [tokensMap], + [tokenMap], ); /** diff --git a/apps/rosen/app/_networks/bitcoin/index.ts b/apps/rosen/app/_networks/bitcoin/index.ts index 1ec9b29d..8ef98d8a 100644 --- a/apps/rosen/app/_networks/bitcoin/index.ts +++ b/apps/rosen/app/_networks/bitcoin/index.ts @@ -19,6 +19,14 @@ import { import { getTokenMap } from '../getTokenMap.client'; import { fromSafeData } from '@/_utils/safeData'; +const config = { + getTokenMap, + generateOpReturnData: unwrap(fromSafeData(generateOpReturnData)), + generateUnsignedTx: unwrap(fromSafeData(generateUnsignedTx)), + getAddressBalance: cache(unwrap(fromSafeData(getAddressBalance)), 30000), + submitTransaction: unwrap(fromSafeData(submitTransaction)), +}; + /** * the main object for Bitcoin network * providing access to network info and wallets and network specific @@ -28,15 +36,7 @@ const BitcoinNetwork: BitcoinNetworkType = { name: Networks.BITCOIN, label: 'Bitcoin', logo: BitcoinIcon, - wallets: [ - xdefiWalletCreator({ - getTokenMap, - generateOpReturnData: unwrap(fromSafeData(generateOpReturnData)), - generateUnsignedTx: unwrap(fromSafeData(generateUnsignedTx)), - getAddressBalance: cache(unwrap(fromSafeData(getAddressBalance)), 30000), - submitTransaction: unwrap(fromSafeData(submitTransaction)), - }), - ], + wallets: [xdefiWalletCreator(config)], nextHeightInterval: 1, lockAddress: process.env.NEXT_PUBLIC_BITCOIN_LOCK_ADDRESS!, getMaxTransfer: unwrap(fromSafeData(getMaxTransfer)), diff --git a/apps/rosen/app/_networks/cardano/index.ts b/apps/rosen/app/_networks/cardano/index.ts index c6be71b5..1b6794e0 100644 --- a/apps/rosen/app/_networks/cardano/index.ts +++ b/apps/rosen/app/_networks/cardano/index.ts @@ -1,13 +1,8 @@ -import { compact } from 'lodash-es'; - -import { convertNumberToBigint, validateDecimalPlaces } from '@rosen-ui/utils'; - import { Networks } from '@rosen-ui/constants'; import { unwrap } from '@/_errors'; import { CardanoNetwork as CardanoNetworkType } from '@/_types/network'; -import { RosenChainToken } from '@rosen-bridge/tokens'; import { CardanoIcon } from '@rosen-bridge/icons'; import { eternlWalletCreator } from '@rosen-ui/eternl-wallet'; @@ -22,16 +17,18 @@ import { setTxWitnessSet, } from './server'; -import { feeAndMinBoxValue } from '@rosen-network/cardano/dist/src/constants'; - -import getVesprWallet, { - isVesprAvailable, - walletInfo as vesprWalletInfo, -} from '@rosen-ui/vespr-wallet'; import { getTokenMap } from '../getTokenMap.client'; import { getMaxTransfer } from './getMaxTransfer'; import { fromSafeData } from '@/_utils/safeData'; +const config = { + getTokenMap, + decodeWasmValue: unwrap(fromSafeData(decodeWasmValue)), + generateLockAuxiliaryData: unwrap(fromSafeData(generateLockAuxiliaryData)), + generateUnsignedTx: unwrap(fromSafeData(generateUnsignedTx)), + setTxWitnessSet: unwrap(fromSafeData(setTxWitnessSet)), +}; + /** * the main object for Cardano network * providing access to network info and wallets and network specific @@ -40,114 +37,12 @@ import { fromSafeData } from '@/_utils/safeData'; const CardanoNetwork: CardanoNetworkType = { name: Networks.CARDANO, label: 'Cardano', - wallets: compact([ - eternlWalletCreator({ - getTokenMap, - decodeWasmValue: unwrap(fromSafeData(decodeWasmValue)), - generateLockAuxiliaryData: unwrap( - fromSafeData(generateLockAuxiliaryData), - ), - generateUnsignedTx: unwrap(fromSafeData(generateUnsignedTx)), - setTxWitnessSet: unwrap(fromSafeData(setTxWitnessSet)), - }), - flintWalletCreator({ - getTokenMap, - decodeWasmValue: unwrap(fromSafeData(decodeWasmValue)), - generateLockAuxiliaryData: unwrap( - fromSafeData(generateLockAuxiliaryData), - ), - generateUnsignedTx: unwrap(fromSafeData(generateUnsignedTx)), - setTxWitnessSet: unwrap(fromSafeData(setTxWitnessSet)), - }), - laceWalletCreator({ - getTokenMap, - decodeWasmValue: unwrap(fromSafeData(decodeWasmValue)), - generateLockAuxiliaryData: unwrap( - fromSafeData(generateLockAuxiliaryData), - ), - generateUnsignedTx: unwrap(fromSafeData(generateUnsignedTx)), - setTxWitnessSet: unwrap(fromSafeData(setTxWitnessSet)), - }), - namiWalletCreator({ - getTokenMap, - decodeWasmValue: unwrap(fromSafeData(decodeWasmValue)), - generateLockAuxiliaryData: unwrap( - fromSafeData(generateLockAuxiliaryData), - ), - generateUnsignedTx: unwrap(fromSafeData(generateUnsignedTx)), - setTxWitnessSet: unwrap(fromSafeData(setTxWitnessSet)), - }), - isVesprAvailable() && { - ...getVesprWallet(), - getBalance: async (token: RosenChainToken) => { - const context = await getVesprWallet().getApi().enable(); - const rawValue = await context.getBalance(); - const balances = await unwrap(fromSafeData(decodeWasmValue))(rawValue); - - const amount = balances.find( - (asset) => asset.policyId === token.policyId, - ); - return amount ? Number(amount.quantity) : 0; - }, - transfer: async ( - token: RosenChainToken, - decimalAmount: number, - toChain: string, - toAddress: string, - decimalBridgeFee: number, - decimalNetworkFee: number, - lockAddress: string, - ) => { - validateDecimalPlaces(decimalAmount, token.decimals); - validateDecimalPlaces(decimalBridgeFee, token.decimals); - validateDecimalPlaces(decimalNetworkFee, token.decimals); - - const wallet = await getVesprWallet().getApi().enable(); - const policyIdHex = token.policyId; - const assetNameHex = token.assetName; - const amount = convertNumberToBigint( - decimalAmount * 10 ** token.decimals, - ); - const bridgeFee = convertNumberToBigint( - decimalBridgeFee * 10 ** token.decimals, - ); - const networkFee = convertNumberToBigint( - decimalNetworkFee * 10 ** token.decimals, - ); - const changeAddressHex = await wallet.getChangeAddress(); - - const auxiliaryDataHex = await unwrap( - fromSafeData(generateLockAuxiliaryData), - )( - toChain, - toAddress, - changeAddressHex, - networkFee.toString(), - bridgeFee.toString(), - ); - - const walletUtxos = await wallet.getUtxos(); - if (!walletUtxos) throw Error(`Failed to fetch wallet utxos`); - const unsignedTxHex = await unwrap(fromSafeData(generateUnsignedTx))( - walletUtxos, - lockAddress, - changeAddressHex, - policyIdHex, - assetNameHex, - amount, - auxiliaryDataHex, - ); - - const signedTxHex = await unwrap(fromSafeData(setTxWitnessSet))( - unsignedTxHex, - await wallet.signTx(unsignedTxHex, false), - ); - - const result = await wallet.submitTx(signedTxHex); - return result; - }, - }, - ]), + wallets: [ + eternlWalletCreator(config), + flintWalletCreator(config), + laceWalletCreator(config), + namiWalletCreator(config), + ], nextHeightInterval: 25, logo: CardanoIcon, lockAddress: process.env.NEXT_PUBLIC_CARDANO_LOCK_ADDRESS!, diff --git a/apps/rosen/app/_networks/ergo/index.ts b/apps/rosen/app/_networks/ergo/index.ts index f44e2725..821dcc04 100644 --- a/apps/rosen/app/_networks/ergo/index.ts +++ b/apps/rosen/app/_networks/ergo/index.ts @@ -6,16 +6,16 @@ import { unwrap } from '@/_errors'; import { ErgoNetwork as ErgoNetworkType } from '@/_types/network'; import { ErgoIcon } from '@rosen-bridge/icons'; -import { - fee as ergoFee, - minBoxValue as ergoMinBoxValue, -} from '@rosen-network/ergo/dist/src/constants'; - import { generateUnsignedTx } from './server'; import { getTokenMap } from '../getTokenMap.client'; import { getMaxTransfer } from './getMaxTransfer'; import { fromSafeData } from '@/_utils/safeData'; +const config = { + getTokenMap, + generateUnsignedTx: unwrap(fromSafeData(generateUnsignedTx)), +}; + /** * the main object for Ergo network * providing access to network info and wallets and network specific @@ -24,12 +24,7 @@ import { fromSafeData } from '@/_utils/safeData'; const ErgoNetwork: ErgoNetworkType = { name: Networks.ERGO, label: 'Ergo', - wallets: [ - nautilusWalletCreator({ - getTokenMap, - generateUnsignedTx: unwrap(fromSafeData(generateUnsignedTx)), - }), - ], + wallets: [nautilusWalletCreator(config)], logo: ErgoIcon, nextHeightInterval: 5, lockAddress: process.env.NEXT_PUBLIC_ERGO_LOCK_ADDRESS!, diff --git a/apps/rosen/app/_networks/getTokenMap.client.ts b/apps/rosen/app/_networks/getTokenMap.client.ts index 6cedf9a6..b864249e 100644 --- a/apps/rosen/app/_networks/getTokenMap.client.ts +++ b/apps/rosen/app/_networks/getTokenMap.client.ts @@ -1,6 +1,7 @@ import { TokenMap } from '@rosen-bridge/tokens'; import { getRosenTokens } from '@/_backend/utils'; +import { cache } from '@/_utils/cache'; let tokenMap: TokenMap; @@ -9,7 +10,7 @@ let tokenMap: TokenMap; */ export const getTokenMap = async () => { if (tokenMap) return tokenMap; - const tokens = await getRosenTokens(); + const tokens = await cache(getRosenTokens, 60000)(); tokenMap = new TokenMap(tokens); return tokenMap; }; diff --git a/apps/rosen/app/_utils/getMaxTransfer.ts b/apps/rosen/app/_utils/getMaxTransfer.ts deleted file mode 100644 index eba542d5..00000000 --- a/apps/rosen/app/_utils/getMaxTransfer.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { BitcoinNetwork, CardanoNetwork, ErgoNetwork } from '@/_types/network'; -import { RosenAmountValue } from '@rosen-ui/types'; - -/** - * return max transfer, considering all the context that affects it - * @param network - * @param tokenInfo CONTAINS A WRAPPED-VALUE - * @param context - * @returns THIS IS A WRAPPED-VALUE - */ -const getMaxTransfer = async ( - network: ErgoNetwork | CardanoNetwork | BitcoinNetwork, - tokenInfo: { - balance: RosenAmountValue; - isNative: boolean; - }, - getContext: () => Promise<{ - fromAddress: string; - toAddress: string; - toChain: string; - }>, -): Promise => { - if (network.name === 'bitcoin') { - const context = await getContext(); - return await network.getMaxTransfer({ - balance: tokenInfo.balance, - isNative: tokenInfo.isNative, - eventData: { - fromAddress: context.fromAddress, - toAddress: context.toAddress, - toChain: context.toChain, - }, - }); - } - - return await network.getMaxTransfer({ - balance: tokenInfo.balance, - isNative: tokenInfo.isNative, - }); -}; - -export default getMaxTransfer; diff --git a/apps/rosen/app/_utils/index.ts b/apps/rosen/app/_utils/index.ts index a0bb7c05..9d179426 100644 --- a/apps/rosen/app/_utils/index.ts +++ b/apps/rosen/app/_utils/index.ts @@ -1,7 +1,5 @@ import JsonBigInt from '@rosen-bridge/json-bigint'; -import { RosenChainToken, TokenMap } from '@rosen-bridge/tokens'; - -import { getDecimalString } from '@rosen-ui/utils'; +import { RosenChainToken } from '@rosen-bridge/tokens'; import { calculateFee } from '@/_actions/calculateFee'; @@ -10,6 +8,7 @@ import { AvailableNetworks } from '@/_networks'; import { unwrap } from '@/_errors'; import { RosenAmountValue } from '@rosen-ui/types'; import { fromSafeData } from '@/_utils/safeData'; +import { getTokenMap } from '@/_networks/getTokenMap.client'; /** * a utility to make unique interface for accessing token name @@ -37,9 +36,8 @@ export const getMinTransfer = async ( token: RosenChainToken, sourceChain: AvailableNetworks, targetChain: AvailableNetworks, - tokensMap: any, ): Promise => { - const tokenMap = new TokenMap(tokensMap); + const tokenMap = await getTokenMap(); const idKey = tokenMap.getIdKey(sourceChain); const tokens = tokenMap.search(sourceChain, { [idKey]: token[idKey], diff --git a/apps/rosen/app/layout.tsx b/apps/rosen/app/layout.tsx index 3bf91f79..572800ec 100644 --- a/apps/rosen/app/layout.tsx +++ b/apps/rosen/app/layout.tsx @@ -1,6 +1,3 @@ -import fs from 'fs'; -import path from 'path'; - import { Metadata } from 'next'; import App from './App'; @@ -10,12 +7,6 @@ export const metadata: Metadata = { }; const RootLayout = ({ children }: { children: React.ReactNode }) => { - const tokensMap = JSON.parse( - fs.readFileSync(path.resolve('./configs/tokensMap.json'), { - encoding: 'utf-8', - }), - ); - return ( /** * TODO: get `lang` from url language path segment @@ -23,7 +14,7 @@ const RootLayout = ({ children }: { children: React.ReactNode }) => { */ - {children} + {children} ); From c7656c8f3feb04fbb53c80b3522549919b0fa511 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 31 Aug 2024 09:12:34 +0000 Subject: [PATCH 088/168] feat: Update the HealthParam context to incorporate the latest API enhancements. --- .changeset/cold-trees-retire.md | 7 +++++++ apps/watcher/app/(home)/@infoWidgets/page.tsx | 8 +++++--- apps/watcher/app/_mock/mockedData.ts | 11 ++++++++++- apps/watcher/app/_types/api.ts | 5 ++++- packages/types/src/common.ts | 2 ++ .../src/components/common/HealthParamCard.tsx | 16 ++++++++++++++-- 6 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 .changeset/cold-trees-retire.md diff --git a/.changeset/cold-trees-retire.md b/.changeset/cold-trees-retire.md new file mode 100644 index 00000000..2d71444b --- /dev/null +++ b/.changeset/cold-trees-retire.md @@ -0,0 +1,7 @@ +--- +'@rosen-bridge/ui-kit': minor +'@rosen-bridge/watcher-app': minor +'@rosen-ui/types': minor +--- + +Update the HealthParam context to incorporate the latest API enhancements. diff --git a/apps/watcher/app/(home)/@infoWidgets/page.tsx b/apps/watcher/app/(home)/@infoWidgets/page.tsx index 81ad1c0f..8f48b7da 100644 --- a/apps/watcher/app/(home)/@infoWidgets/page.tsx +++ b/apps/watcher/app/(home)/@infoWidgets/page.tsx @@ -183,10 +183,10 @@ const InfoWidgets = () => { - {data?.health === 'Healthy' ? ( + {data?.health.status === 'Healthy' ? ( ) : ( @@ -195,7 +195,9 @@ const InfoWidgets = () => { } color={ data?.health - ? (healthStatusColorMap[data.health] as keyof AugmentedPalette) + ? (healthStatusColorMap[ + data.health.status + ] as keyof AugmentedPalette) : 'success' } isLoading={isInfoLoading} diff --git a/apps/watcher/app/_mock/mockedData.ts b/apps/watcher/app/_mock/mockedData.ts index 91b0dae4..2fda436f 100644 --- a/apps/watcher/app/_mock/mockedData.ts +++ b/apps/watcher/app/_mock/mockedData.ts @@ -24,7 +24,10 @@ const info: ApiInfoResponse = { rsn: 0, }, currentBalance: 150, - health: 'Unstable', + health: { + status: 'Unstable', + trialErrors: [], + }, network: 'ergo', permitsPerEvent: 1000, permitCount: { @@ -198,16 +201,19 @@ const healthStatus: ApiHealthStatusResponse = [ status: 'Unstable', lastCheck: '2023-06-26T11:15:43.189Z', id: 'error logs', + title: 'Error Logs', }, { status: 'Healthy', lastCheck: '2023-06-26T11:15:43.642Z', id: 'Wid Check', + title: 'Wid Check', }, { status: 'Healthy', lastCheck: '2023-06-26T11:15:43.509Z', id: 'Native Asset erg Check', + title: 'Native Asset erg Check', }, { status: 'Broken', @@ -215,11 +221,13 @@ const healthStatus: ApiHealthStatusResponse = [ 'Service has stopped working. [ergo-node] scanner is out of sync.\nPlease check the scanner status, [3487] blocks are created but not scanned.\n', lastCheck: '2023-06-26T11:15:43.544Z', id: 'Scanner ergo-node Sync Check', + title: 'Scanner ergo-node Sync Check', }, { status: 'Healthy', lastCheck: '2023-06-26T11:15:45.206Z', id: 'Ergo Node Sync Check', + title: 'Ergo Node Sync Check', }, { status: 'Broken', @@ -227,6 +235,7 @@ const healthStatus: ApiHealthStatusResponse = [ 'Service has stopped working. [cardano-koios] scanner is out of sync.\nPlease check the scanner status, [33283] blocks are created but not scanned.\n', lastCheck: '2023-06-26T11:15:43.553Z', id: 'Scanner cardano-koios Sync Check', + title: 'Scanner cardano-koios Sync Check', }, ]; diff --git a/apps/watcher/app/_types/api.ts b/apps/watcher/app/_types/api.ts index 524f27e2..0ebe8e1b 100644 --- a/apps/watcher/app/_types/api.ts +++ b/apps/watcher/app/_types/api.ts @@ -18,7 +18,10 @@ export interface ApiInfoResponse { active: number; total: number; }; - health: 'Healthy' | 'Unstable' | 'Broken'; + health: { + status: 'Healthy' | 'Unstable' | 'Broken'; + trialErrors: string[]; + }; address: string; rsnTokenId: string; eRsnTokenId: string; diff --git a/packages/types/src/common.ts b/packages/types/src/common.ts index bae85f05..3b4481e8 100644 --- a/packages/types/src/common.ts +++ b/packages/types/src/common.ts @@ -22,6 +22,8 @@ export interface TokenInfoWithColdAmount extends TokenInfo { export interface HealthParamInfo { id: string; + title: string; + details?: string; status: 'Healthy' | 'Unstable' | 'Broken'; lastCheck: string; description?: string; diff --git a/packages/ui-kit/src/components/common/HealthParamCard.tsx b/packages/ui-kit/src/components/common/HealthParamCard.tsx index 5d2efeb6..0e870258 100644 --- a/packages/ui-kit/src/components/common/HealthParamCard.tsx +++ b/packages/ui-kit/src/components/common/HealthParamCard.tsx @@ -6,7 +6,7 @@ import { HealthParamInfo } from '@rosen-ui/types'; import { FullCard } from '.'; import { useTheme } from '../../hooks'; -import { Button, SvgIcon, Typography } from '../base'; +import { Alert, Button, SvgIcon, Typography } from '../base'; export type HealthParamCardProps = HealthParamInfo & { handleCheckNow: () => void; @@ -15,6 +15,8 @@ export type HealthParamCardProps = HealthParamInfo & { * render a healt param card to be used in health page * * @param id + * @param title + * @param details * @param status * @param description * @param lastCheck @@ -22,6 +24,8 @@ export type HealthParamCardProps = HealthParamInfo & { */ export const HealthParamCard = ({ id, + title, + details, status, description, lastCheck, @@ -76,8 +80,16 @@ export const HealthParamCard = ({ } > - {id} + {title} {description} + {details && ( + + {details} + + )} ); }; From ff931c3d4d4c6a6b55382055fa752d38735399af Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 31 Aug 2024 13:23:45 +0330 Subject: [PATCH 089/168] fix: Update mock data test file in guard app. --- apps/guard/app/_mock/mockedData.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/guard/app/_mock/mockedData.ts b/apps/guard/app/_mock/mockedData.ts index 1312245e..60940a59 100644 --- a/apps/guard/app/_mock/mockedData.ts +++ b/apps/guard/app/_mock/mockedData.ts @@ -243,16 +243,19 @@ const healthStatus: ApiHealthStatusResponse = [ status: 'Unstable', lastCheck: '2023-06-26T11:15:43.189Z', id: 'error logs', + title: 'Error Logs', }, { status: 'Healthy', lastCheck: '2023-06-26T11:15:43.642Z', id: 'Wid Check', + title: 'Wid Check', }, { status: 'Healthy', lastCheck: '2023-06-26T11:15:43.509Z', id: 'Native Asset erg Check', + title: 'Native Asset erg Check', }, { status: 'Broken', @@ -260,11 +263,13 @@ const healthStatus: ApiHealthStatusResponse = [ 'Service has stopped working. [ergo-node] scanner is out of sync.\nPlease check the scanner status, [3487] blocks are created but not scanned.\n', lastCheck: '2023-06-26T11:15:43.544Z', id: 'Scanner ergo-node Sync Check', + title: 'Scanner ergo-node Sync Check', }, { status: 'Healthy', lastCheck: '2023-06-26T11:15:45.206Z', id: 'Ergo Node Sync Check', + title: 'Ergo Node Sync Check', }, { status: 'Broken', @@ -272,6 +277,7 @@ const healthStatus: ApiHealthStatusResponse = [ 'Service has stopped working. [cardano-koios] scanner is out of sync.\nPlease check the scanner status, [33283] blocks are created but not scanned.\n', lastCheck: '2023-06-26T11:15:43.553Z', id: 'Scanner cardano-koios Sync Check', + title: 'Scanner cardano-koios Sync Check', }, ]; From 9f86458bfd0026a92c44fb50da56a67754403df0 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 3 Sep 2024 12:53:56 +0000 Subject: [PATCH 090/168] fix: Resolve the issue by replacing the incorrect token retrieval method using policyId with a more accurate approach that retrieves the token by both nameHex and policyId. --- .changeset/plenty-chefs-behave.md | 7 +++++++ wallets/eternl-wallet/src/getBalance.ts | 7 ++++++- wallets/flint-wallet/src/getBalance.ts | 7 ++++++- wallets/lace-wallet/src/getBalance.ts | 7 ++++++- 4 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 .changeset/plenty-chefs-behave.md diff --git a/.changeset/plenty-chefs-behave.md b/.changeset/plenty-chefs-behave.md new file mode 100644 index 00000000..9aea3ce7 --- /dev/null +++ b/.changeset/plenty-chefs-behave.md @@ -0,0 +1,7 @@ +--- +'@rosen-ui/eternl-wallet': patch +'@rosen-ui/flint-wallet': patch +'@rosen-ui/lace-wallet': patch +--- + +Resolve the issue by replacing the incorrect token retrieval method using policyId with a more accurate approach that retrieves the token by both nameHex and policyId. diff --git a/wallets/eternl-wallet/src/getBalance.ts b/wallets/eternl-wallet/src/getBalance.ts index 776ef811..b81ee876 100644 --- a/wallets/eternl-wallet/src/getBalance.ts +++ b/wallets/eternl-wallet/src/getBalance.ts @@ -2,6 +2,7 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; import { Networks } from '@rosen-ui/constants'; import { RosenAmountValue } from '@rosen-ui/types'; +import { hexToCbor } from '@rosen-ui/utils'; import { getEternlWallet } from './getEternlWallet'; @@ -12,7 +13,11 @@ export const getBalanceCreator = const rawValue = await context.getBalance(); const balances = await config.decodeWasmValue(rawValue); - const amount = balances.find((asset) => asset.policyId === token.policyId); + const amount = balances.find( + (asset) => + asset.policyId === token.policyId && + (asset.nameHex === hexToCbor(token.assetName) || !token.policyId) + ); if (!amount) return 0n; diff --git a/wallets/flint-wallet/src/getBalance.ts b/wallets/flint-wallet/src/getBalance.ts index 9ea3836e..743cc85a 100644 --- a/wallets/flint-wallet/src/getBalance.ts +++ b/wallets/flint-wallet/src/getBalance.ts @@ -2,6 +2,7 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; import { Networks } from '@rosen-ui/constants'; import { RosenAmountValue } from '@rosen-ui/types'; +import { hexToCbor } from '@rosen-ui/utils'; import { getFlintWallet } from './getFlintWallet'; @@ -12,7 +13,11 @@ export const getBalanceCreator = const rawValue = await context.getBalance(); const balances = await config.decodeWasmValue(rawValue); - const amount = balances.find((asset) => asset.policyId === token.policyId); + const amount = balances.find( + (asset) => + asset.policyId === token.policyId && + (asset.nameHex === hexToCbor(token.assetName) || !token.policyId) + ); if (!amount) return 0n; diff --git a/wallets/lace-wallet/src/getBalance.ts b/wallets/lace-wallet/src/getBalance.ts index 80c7d622..933f83e7 100644 --- a/wallets/lace-wallet/src/getBalance.ts +++ b/wallets/lace-wallet/src/getBalance.ts @@ -2,6 +2,7 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; import { Networks } from '@rosen-ui/constants'; import { RosenAmountValue } from '@rosen-ui/types'; +import { hexToCbor } from '@rosen-ui/utils'; import { getLaceWallet } from './getLaceWallet'; @@ -12,7 +13,11 @@ export const getBalanceCreator = const rawValue = await context.getBalance(); const balances = await config.decodeWasmValue(rawValue); - const amount = balances.find((asset) => asset.policyId === token.policyId); + const amount = balances.find( + (asset) => + asset.policyId === token.policyId && + (asset.nameHex === hexToCbor(token.assetName) || !token.policyId) + ); if (!amount) return 0n; From 6805d91a038efb25656a22792b942e19dbc53af6 Mon Sep 17 00:00:00 2001 From: Mohammad Kermani Date: Mon, 9 Sep 2024 10:49:33 +0000 Subject: [PATCH 091/168] chore: bump watcher-app --- .changeset/cold-trees-retire.md | 7 ---- .changeset/gorgeous-pianos-remember.md | 5 --- .changeset/long-gorillas-brake.md | 2 - .changeset/modern-jokes-complain.md | 5 --- ...-dolls-fetch.md => new-cherries-attack.md} | 0 .changeset/sour-bobcats-wait.md | 5 --- .changeset/twelve-colts-hunt.md | 1 - .changeset/wet-rats-glow.md | 1 - apps/guard/package.json | 6 +-- apps/rosen/package.json | 2 +- apps/watcher/CHANGELOG.md | 17 ++++++++ apps/watcher/package.json | 8 ++-- package-lock.json | 42 +++++++++---------- package.json | 4 +- packages/types/CHANGELOG.md | 6 +++ packages/types/package.json | 2 +- packages/ui-kit/CHANGELOG.md | 12 ++++++ packages/ui-kit/package.json | 6 +-- packages/utils/CHANGELOG.md | 6 +++ packages/utils/package.json | 2 +- wallets/eternl-wallet/package.json | 2 +- wallets/flint-wallet/package.json | 2 +- wallets/lace-wallet/package.json | 2 +- wallets/nami-wallet/package.json | 2 +- wallets/nautilus-wallet/package.json | 2 +- wallets/vespr-wallet/package.json | 2 +- wallets/wallet-api/package.json | 2 +- wallets/xdefi-wallet/package.json | 2 +- 28 files changed, 86 insertions(+), 69 deletions(-) delete mode 100644 .changeset/cold-trees-retire.md delete mode 100644 .changeset/gorgeous-pianos-remember.md delete mode 100644 .changeset/long-gorillas-brake.md delete mode 100644 .changeset/modern-jokes-complain.md rename .changeset/{late-dolls-fetch.md => new-cherries-attack.md} (100%) delete mode 100644 .changeset/sour-bobcats-wait.md diff --git a/.changeset/cold-trees-retire.md b/.changeset/cold-trees-retire.md deleted file mode 100644 index 2d71444b..00000000 --- a/.changeset/cold-trees-retire.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@rosen-bridge/ui-kit': minor -'@rosen-bridge/watcher-app': minor -'@rosen-ui/types': minor ---- - -Update the HealthParam context to incorporate the latest API enhancements. diff --git a/.changeset/gorgeous-pianos-remember.md b/.changeset/gorgeous-pianos-remember.md deleted file mode 100644 index b197a638..00000000 --- a/.changeset/gorgeous-pianos-remember.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/ui-kit': minor ---- - -Implement the drawer UI component. diff --git a/.changeset/long-gorillas-brake.md b/.changeset/long-gorillas-brake.md deleted file mode 100644 index a845151c..00000000 --- a/.changeset/long-gorillas-brake.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/modern-jokes-complain.md b/.changeset/modern-jokes-complain.md deleted file mode 100644 index 35eeff9c..00000000 --- a/.changeset/modern-jokes-complain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-ui/utils': minor ---- - -Implement a utility function to retrieve the link associated with an address in the chain. diff --git a/.changeset/late-dolls-fetch.md b/.changeset/new-cherries-attack.md similarity index 100% rename from .changeset/late-dolls-fetch.md rename to .changeset/new-cherries-attack.md diff --git a/.changeset/sour-bobcats-wait.md b/.changeset/sour-bobcats-wait.md deleted file mode 100644 index 0a6f77e6..00000000 --- a/.changeset/sour-bobcats-wait.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/watcher-app': minor ---- - -Implement ERSN token integration for dashboard and revenue pages diff --git a/.changeset/twelve-colts-hunt.md b/.changeset/twelve-colts-hunt.md index e15d4c8a..b771a96e 100644 --- a/.changeset/twelve-colts-hunt.md +++ b/.changeset/twelve-colts-hunt.md @@ -1,6 +1,5 @@ --- '@rosen-bridge/rosen-service': patch -'@rosen-bridge/watcher-app': patch '@rosen-bridge/guard-app': patch '@rosen-bridge/rosen-app': patch --- diff --git a/.changeset/wet-rats-glow.md b/.changeset/wet-rats-glow.md index b4e13213..7f28c24d 100644 --- a/.changeset/wet-rats-glow.md +++ b/.changeset/wet-rats-glow.md @@ -1,5 +1,4 @@ --- -'@rosen-bridge/watcher-app': patch '@rosen-bridge/guard-app': patch --- diff --git a/apps/guard/package.json b/apps/guard/package.json index cdb55b16..473a4034 100644 --- a/apps/guard/package.json +++ b/apps/guard/package.json @@ -15,11 +15,11 @@ "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", "@rosen-bridge/icons": "^0.4.0", - "@rosen-bridge/ui-kit": "^1.1.2", + "@rosen-bridge/ui-kit": "^1.2.0", "@rosen-ui/constants": "^0.0.3", "@rosen-ui/swr-helpers": "^0.1.0", "@rosen-bridge/shared-contexts": "^0.0.1", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "moment": "^2.29.4", "next": "14.1.0", "react": "^18.2.0", @@ -31,7 +31,7 @@ }, "devDependencies": { "@rosen-ui/swr-mock": "^0.0.1", - "@rosen-ui/types": "^0.1.0", + "@rosen-ui/types": "^0.2.0", "@rosen-ui/common-hooks": "^0.1.0", "@tauri-apps/cli": "^1.4.0", "@types/moment": "^2.13.0", diff --git a/apps/rosen/package.json b/apps/rosen/package.json index 83627b25..2418a6ff 100644 --- a/apps/rosen/package.json +++ b/apps/rosen/package.json @@ -39,7 +39,7 @@ "@rosen-ui/lace-wallet": "^0.1.3", "@rosen-ui/nami-wallet": "^0.1.3", "@rosen-ui/nautilus-wallet": "^0.2.0", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "@rosen-ui/vespr-wallet": "^0.0.7", "@rosen-ui/wallet-api": "^1.0.2", "@rosen-ui/xdefi-wallet": "^0.4.0", diff --git a/apps/watcher/CHANGELOG.md b/apps/watcher/CHANGELOG.md index ec4c07d5..bb505002 100644 --- a/apps/watcher/CHANGELOG.md +++ b/apps/watcher/CHANGELOG.md @@ -1,5 +1,22 @@ # @rosen-bridge/watcher-app +## 2.3.0 + +### Minor Changes + +- Update the HealthParam context to incorporate the latest API enhancements. +- Implement ERSN token integration for dashboard and revenue pages + +### Patch Changes + +- Update README +- Fix the bug that prevents the Clear button from working correctly in the text field of the API key modal. Ensure that submitting the form does not trigger the parent forms, which would subsequently open a dialog that relies on them. +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @rosen-bridge/ui-kit@1.2.0 + - @rosen-ui/utils@0.4.0 + ## 2.2.1 ### Patch Changes diff --git a/apps/watcher/package.json b/apps/watcher/package.json index 14a3c304..1ed79c2c 100644 --- a/apps/watcher/package.json +++ b/apps/watcher/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-bridge/watcher-app", - "version": "2.2.1", + "version": "2.3.0", "private": true, "scripts": { "prettify": "prettier --write . --ignore-path ./.gitignore", @@ -16,12 +16,12 @@ "@emotion/styled": "^11.11.0", "@rosen-bridge/icons": "^0.4.0", "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-bridge/ui-kit": "^1.1.2", + "@rosen-bridge/ui-kit": "^1.2.0", "@rosen-ui/common-hooks": "^0.1.0", "@rosen-bridge/shared-contexts": "^0.0.1", "@rosen-ui/swr-helpers": "^0.1.0", "@rosen-ui/swr-mock": "^0.0.1", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "lodash-es": "^4.17.21", "moment": "^2.29.4", "next": "14.1.0", @@ -33,7 +33,7 @@ "swr": "^2.1.5" }, "devDependencies": { - "@rosen-ui/types": "^0.1.0", + "@rosen-ui/types": "^0.2.0", "@tauri-apps/cli": "^1.4.0", "@types/lodash-es": "^4.17.11", "@types/moment": "^2.13.0", diff --git a/package-lock.json b/package-lock.json index 9a8cc244..abb5c008 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,10 +31,10 @@ "@emotion/styled": "^11.11.0", "@rosen-bridge/icons": "^0.4.0", "@rosen-bridge/shared-contexts": "^0.0.1", - "@rosen-bridge/ui-kit": "^1.1.2", + "@rosen-bridge/ui-kit": "^1.2.0", "@rosen-ui/constants": "^0.0.3", "@rosen-ui/swr-helpers": "^0.1.0", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "moment": "^2.29.4", "next": "14.1.0", "react": "^18.2.0", @@ -47,7 +47,7 @@ "devDependencies": { "@rosen-ui/common-hooks": "^0.1.0", "@rosen-ui/swr-mock": "^0.0.1", - "@rosen-ui/types": "^0.1.0", + "@rosen-ui/types": "^0.2.0", "@tauri-apps/cli": "^1.4.0", "@types/moment": "^2.13.0", "@types/node": "20.2.5", @@ -105,7 +105,7 @@ "@rosen-ui/lace-wallet": "^0.1.3", "@rosen-ui/nami-wallet": "^0.1.3", "@rosen-ui/nautilus-wallet": "^0.2.0", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "@rosen-ui/vespr-wallet": "^0.0.7", "@rosen-ui/wallet-api": "^1.0.2", "@rosen-ui/xdefi-wallet": "^0.4.0", @@ -299,18 +299,18 @@ }, "apps/watcher": { "name": "@rosen-bridge/watcher-app", - "version": "2.2.1", + "version": "2.3.0", "dependencies": { "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", "@rosen-bridge/icons": "^0.4.0", "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/shared-contexts": "^0.0.1", - "@rosen-bridge/ui-kit": "^1.1.2", + "@rosen-bridge/ui-kit": "^1.2.0", "@rosen-ui/common-hooks": "^0.1.0", "@rosen-ui/swr-helpers": "^0.1.0", "@rosen-ui/swr-mock": "^0.0.1", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "lodash-es": "^4.17.21", "moment": "^2.29.4", "next": "14.1.0", @@ -322,7 +322,7 @@ "swr": "^2.1.5" }, "devDependencies": { - "@rosen-ui/types": "^0.1.0", + "@rosen-ui/types": "^0.2.0", "@tauri-apps/cli": "^1.4.0", "@types/lodash-es": "^4.17.11", "@types/moment": "^2.13.0", @@ -16923,7 +16923,7 @@ }, "packages/types": { "name": "@rosen-ui/types", - "version": "0.1.0", + "version": "0.2.0", "devDependencies": { "@mui/material": "^5.13.7", "@typescript-eslint/eslint-plugin": "^5.30.7", @@ -16950,7 +16950,7 @@ }, "packages/ui-kit": { "name": "@rosen-bridge/ui-kit", - "version": "1.1.2", + "version": "1.2.0", "license": "GPL-3.0", "dependencies": { "@mui/lab": "^5.0.0-alpha.134", @@ -16958,12 +16958,12 @@ "@rosen-bridge/icons": "^0.4.0", "@rosen-ui/constants": "^0.0.3", "@rosen-ui/swr-helpers": "^0.1.0", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "moment": "^2.29.4", "qrcode.react": "^3.1.0" }, "devDependencies": { - "@rosen-ui/types": "^0.1.0", + "@rosen-ui/types": "^0.2.0", "@types/react": "18.2.12", "@types/react-dom": "18.2.4", "@typescript-eslint/eslint-plugin": "^5.59.0", @@ -16998,7 +16998,7 @@ }, "packages/utils": { "name": "@rosen-ui/utils", - "version": "0.3.0", + "version": "0.4.0", "dependencies": { "@rosen-bridge/json-bigint": "^0.1.0", "buffer": "^6.0.3", @@ -17036,7 +17036,7 @@ "@rosen-bridge/icons": "^0.4.0", "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "@rosen-ui/wallet-api": "^1.0.2" }, "devDependencies": { @@ -17069,7 +17069,7 @@ "@rosen-bridge/icons": "^0.4.0", "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "@rosen-ui/wallet-api": "^1.0.2" }, "devDependencies": { @@ -17102,7 +17102,7 @@ "@rosen-bridge/icons": "^0.4.0", "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "@rosen-ui/wallet-api": "^1.0.2" }, "devDependencies": { @@ -17135,7 +17135,7 @@ "@rosen-bridge/icons": "^0.4.0", "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "@rosen-ui/wallet-api": "^1.0.2" }, "devDependencies": { @@ -17171,7 +17171,7 @@ }, "devDependencies": { "@rosen-bridge/tokens": "^1.2.1", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.26.0", "eslint": "^8.16.0", @@ -17202,7 +17202,7 @@ "version": "0.0.7", "dependencies": { "@rosen-bridge/icons": "^0.4.0", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "@rosen-ui/wallet-api": "^1.0.2" }, "devDependencies": { @@ -17233,7 +17233,7 @@ "name": "@rosen-ui/wallet-api", "version": "1.0.2", "dependencies": { - "@rosen-ui/utils": "^0.3.0" + "@rosen-ui/utils": "^0.4.0" }, "devDependencies": { "@rosen-bridge/tokens": "^1.2.1", @@ -17272,7 +17272,7 @@ "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/bitcoin": "^0.2.0", "@rosen-ui/constants": "^0.0.3", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "@rosen-ui/wallet-api": "^1.0.2", "sats-connect": "^1.4.1" }, diff --git a/package.json b/package.json index 912865c7..db9568f9 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,9 @@ "test:related": "NODE_OPTIONS=--loader=extensionless vitest related --run", "coverage": "npm run test -- --coverage", "version": "npx changeset version && npm i && npx changeset --empty", - "version:rosen": "npx changeset version --ignore @rosen-bridge/watcher-app --ignore @rosen-bridge/guard-app && npm i && npx changeset --empty" + "version:rosen": "npx changeset version --ignore @rosen-bridge/watcher-app --ignore @rosen-bridge/guard-app && npm i && npx changeset --empty", + "version:watcher": "npx changeset version --ignore=@rosen-bridge/rosen-service --ignore @rosen-bridge/rosen-app --ignore @rosen-bridge/guard-app --ignore @rosen-network/ergo --ignore @rosen-network/cardano --ignore @rosen-network/bitcoin --ignore @rosen-ui/eternl-wallet --ignore @rosen-ui/flint-wallet --ignore @rosen-ui/lace-wallet --ignore @rosen-ui/nami-wallet --ignore @rosen-ui/nautilus-wallet --ignore @rosen-ui/xdefi-wallet --ignore @rosen-ui/vespr-wallet --ignore @rosen-ui/asset-calculator --ignore @rosen-ui/wallet-api && npm i && npx changeset --empty", + "version:guard": "npx changeset version --ignore=@rosen-bridge/rosen-service --ignore @rosen-bridge/watcher-app --ignore @rosen-bridge/rosen-app --ignore @rosen-network/ergo --ignore @rosen-network/cardano --ignore @rosen-network/bitcoin --ignore @rosen-ui/eternl-wallet --ignore @rosen-ui/flint-wallet --ignore @rosen-ui/lace-wallet --ignore @rosen-ui/nami-wallet --ignore @rosen-ui/nautilus-wallet --ignore @rosen-ui/xdefi-wallet --ignore @rosen-ui/vespr-wallet --ignore @rosen-ui/asset-calculator --ignore @rosen-ui/wallet-api && npm i && npx changeset --empty" }, "dependencies": { "@changesets/cli": "^2.27.1" diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 501e1ad7..dd9f2d1c 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,11 @@ # @rosen-ui/types +## 0.2.0 + +### Minor Changes + +- Update the HealthParam context to incorporate the latest API enhancements. + ## 0.1.0 ### Minor Changes diff --git a/packages/types/package.json b/packages/types/package.json index 8c596530..098776e5 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-ui/types", - "version": "0.1.0", + "version": "0.2.0", "private": true, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", diff --git a/packages/ui-kit/CHANGELOG.md b/packages/ui-kit/CHANGELOG.md index 9b864e9d..89841159 100644 --- a/packages/ui-kit/CHANGELOG.md +++ b/packages/ui-kit/CHANGELOG.md @@ -1,5 +1,17 @@ # @rosen-bridge/rosen-app +## 1.2.0 + +### Minor Changes + +- Update the HealthParam context to incorporate the latest API enhancements. +- Implement the drawer UI component. + +### Patch Changes + +- Updated dependencies + - @rosen-ui/utils@0.4.0 + ## 1.1.2 ### Patch Changes diff --git a/packages/ui-kit/package.json b/packages/ui-kit/package.json index 19db244f..25048189 100644 --- a/packages/ui-kit/package.json +++ b/packages/ui-kit/package.json @@ -2,7 +2,7 @@ "name": "@rosen-bridge/ui-kit", "description": "ui kit for Rosen projects", "private": true, - "version": "1.1.2", + "version": "1.2.0", "type": "module", "files": [ "dist" @@ -32,7 +32,7 @@ "swr": "^2.1.5" }, "devDependencies": { - "@rosen-ui/types": "^0.1.0", + "@rosen-ui/types": "^0.2.0", "@types/react": "18.2.12", "@types/react-dom": "18.2.4", "@typescript-eslint/eslint-plugin": "^5.59.0", @@ -49,7 +49,7 @@ "@rosen-bridge/icons": "^0.4.0", "@rosen-ui/constants": "^0.0.3", "@rosen-ui/swr-helpers": "^0.1.0", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "moment": "^2.29.4", "qrcode.react": "^3.1.0" } diff --git a/packages/utils/CHANGELOG.md b/packages/utils/CHANGELOG.md index b0d93995..774cb4db 100644 --- a/packages/utils/CHANGELOG.md +++ b/packages/utils/CHANGELOG.md @@ -1,5 +1,11 @@ # @rosen-ui/utils +## 0.4.0 + +### Minor Changes + +- Implement a utility function to retrieve the link associated with an address in the chain. + ## 0.3.0 ### Minor Changes diff --git a/packages/utils/package.json b/packages/utils/package.json index 626a958e..115d58c1 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-ui/utils", - "version": "0.3.0", + "version": "0.4.0", "main": "dist/src/index.js", "types": "dist/src/index.d.ts", "type": "module", diff --git a/wallets/eternl-wallet/package.json b/wallets/eternl-wallet/package.json index bc9026e4..688468bf 100644 --- a/wallets/eternl-wallet/package.json +++ b/wallets/eternl-wallet/package.json @@ -23,7 +23,7 @@ "@rosen-bridge/icons": "^0.4.0", "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "@rosen-ui/wallet-api": "^1.0.2" } } diff --git a/wallets/flint-wallet/package.json b/wallets/flint-wallet/package.json index 2c71ff73..cd4deb5e 100644 --- a/wallets/flint-wallet/package.json +++ b/wallets/flint-wallet/package.json @@ -23,7 +23,7 @@ "@rosen-bridge/icons": "^0.4.0", "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "@rosen-ui/wallet-api": "^1.0.2" } } diff --git a/wallets/lace-wallet/package.json b/wallets/lace-wallet/package.json index d7215f6d..03eaee58 100644 --- a/wallets/lace-wallet/package.json +++ b/wallets/lace-wallet/package.json @@ -23,7 +23,7 @@ "@rosen-bridge/icons": "^0.4.0", "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "@rosen-ui/wallet-api": "^1.0.2" } } diff --git a/wallets/nami-wallet/package.json b/wallets/nami-wallet/package.json index 224d0474..e5e3b446 100644 --- a/wallets/nami-wallet/package.json +++ b/wallets/nami-wallet/package.json @@ -23,7 +23,7 @@ "@rosen-bridge/icons": "^0.4.0", "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "@rosen-ui/wallet-api": "^1.0.2" } } diff --git a/wallets/nautilus-wallet/package.json b/wallets/nautilus-wallet/package.json index 2a492c04..02c09c4f 100644 --- a/wallets/nautilus-wallet/package.json +++ b/wallets/nautilus-wallet/package.json @@ -13,7 +13,7 @@ }, "devDependencies": { "@rosen-bridge/tokens": "^1.2.1", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.26.0", "eslint": "^8.16.0", diff --git a/wallets/vespr-wallet/package.json b/wallets/vespr-wallet/package.json index 5854d6da..0573a8c2 100644 --- a/wallets/vespr-wallet/package.json +++ b/wallets/vespr-wallet/package.json @@ -22,7 +22,7 @@ }, "dependencies": { "@rosen-bridge/icons": "^0.4.0", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "@rosen-ui/wallet-api": "^1.0.2" } } diff --git a/wallets/wallet-api/package.json b/wallets/wallet-api/package.json index 72d48890..aeddae32 100644 --- a/wallets/wallet-api/package.json +++ b/wallets/wallet-api/package.json @@ -21,7 +21,7 @@ "typescript": "^5.0.0" }, "dependencies": { - "@rosen-ui/utils": "^0.3.0" + "@rosen-ui/utils": "^0.4.0" }, "peerDependencies": { "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0" diff --git a/wallets/xdefi-wallet/package.json b/wallets/xdefi-wallet/package.json index b298141a..2ea5c5de 100644 --- a/wallets/xdefi-wallet/package.json +++ b/wallets/xdefi-wallet/package.json @@ -26,7 +26,7 @@ "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/bitcoin": "^0.2.0", "@rosen-ui/constants": "^0.0.3", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "@rosen-ui/wallet-api": "^1.0.2", "sats-connect": "^1.4.1" } From 47a0de4a2a2285c6318969c7bc749e6fd8119c65 Mon Sep 17 00:00:00 2001 From: Mohammad Kermani Date: Mon, 9 Sep 2024 10:54:09 +0000 Subject: [PATCH 092/168] chore: add an empty changeset --- .changeset/wise-deers-talk.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changeset/wise-deers-talk.md diff --git a/.changeset/wise-deers-talk.md b/.changeset/wise-deers-talk.md new file mode 100644 index 00000000..a845151c --- /dev/null +++ b/.changeset/wise-deers-talk.md @@ -0,0 +1,2 @@ +--- +--- From dbee7ecb57d3e1429c82b74e78dde8263cb2555d Mon Sep 17 00:00:00 2001 From: Mohammad Kermani Date: Mon, 9 Sep 2024 11:08:34 +0000 Subject: [PATCH 093/168] chore(watcher-app): remove unnecessary lines from changelog --- apps/watcher/CHANGELOG.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/watcher/CHANGELOG.md b/apps/watcher/CHANGELOG.md index bb505002..22cb097b 100644 --- a/apps/watcher/CHANGELOG.md +++ b/apps/watcher/CHANGELOG.md @@ -11,8 +11,6 @@ - Update README - Fix the bug that prevents the Clear button from working correctly in the text field of the API key modal. Ensure that submitting the form does not trigger the parent forms, which would subsequently open a dialog that relies on them. -- Updated dependencies -- Updated dependencies - Updated dependencies - @rosen-bridge/ui-kit@1.2.0 - @rosen-ui/utils@0.4.0 From 3c938d55165e755ec42730c18605ec2e4964f693 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 9 Sep 2024 11:50:21 +0000 Subject: [PATCH 094/168] feat: Add Ethereum and MetaMask icons. --- .changeset/hip-students-jam.md | 5 ++++ packages/icons/src/networks/ethereum.svg | 8 ++++++ packages/icons/src/networks/index.ts | 1 + packages/icons/src/wallets/index.ts | 1 + packages/icons/src/wallets/metamask.svg | 31 ++++++++++++++++++++++++ 5 files changed, 46 insertions(+) create mode 100644 .changeset/hip-students-jam.md create mode 100644 packages/icons/src/networks/ethereum.svg create mode 100644 packages/icons/src/wallets/metamask.svg diff --git a/.changeset/hip-students-jam.md b/.changeset/hip-students-jam.md new file mode 100644 index 00000000..ddb11e86 --- /dev/null +++ b/.changeset/hip-students-jam.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/icons': minor +--- + +Add Ethereum and MetaMask icons diff --git a/packages/icons/src/networks/ethereum.svg b/packages/icons/src/networks/ethereum.svg new file mode 100644 index 00000000..bfdfa6f7 --- /dev/null +++ b/packages/icons/src/networks/ethereum.svg @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/packages/icons/src/networks/index.ts b/packages/icons/src/networks/index.ts index fc83ddc8..14359298 100644 --- a/packages/icons/src/networks/index.ts +++ b/packages/icons/src/networks/index.ts @@ -1,3 +1,4 @@ export { ReactComponent as BitcoinIcon } from './bitcoin.svg'; export { ReactComponent as CardanoIcon } from './cardano.svg'; export { ReactComponent as ErgoIcon } from './ergo.svg'; +export { ReactComponent as EthereumIcon } from './ethereum.svg'; diff --git a/packages/icons/src/wallets/index.ts b/packages/icons/src/wallets/index.ts index ff49b662..8972b7a7 100644 --- a/packages/icons/src/wallets/index.ts +++ b/packages/icons/src/wallets/index.ts @@ -2,6 +2,7 @@ export { ReactComponent as NamiIcon } from './nami.svg'; export { ReactComponent as FlintIcon } from './flint.svg'; export { ReactComponent as EternlIcon } from './eternl.svg'; export { ReactComponent as LaceIcon } from './lace.svg'; +export { ReactComponent as MetaMaskIcon } from './metamask.svg'; export { ReactComponent as NautilusIcon } from './nautilus.svg'; export { ReactComponent as VesprIcon } from './vespr.svg'; export { ReactComponent as XdefiIcon } from './xdefi.svg'; diff --git a/packages/icons/src/wallets/metamask.svg b/packages/icons/src/wallets/metamask.svg new file mode 100644 index 00000000..f2ca9a11 --- /dev/null +++ b/packages/icons/src/wallets/metamask.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From c63e861c9203ad3e2f881ffc379903e68c538988 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 9 Sep 2024 11:58:30 +0000 Subject: [PATCH 095/168] chore: Initialize the Ethereum network package. --- .changeset/dull-windows-clean.md | 5 +++++ networks/ethereum/.eslintignore | 1 + networks/ethereum/.eslintrc.json | 11 +++++++++++ networks/ethereum/CHANGELOG.md | 1 + networks/ethereum/README.md | 1 + networks/ethereum/package.json | 26 ++++++++++++++++++++++++++ networks/ethereum/src/index.ts | 2 ++ networks/ethereum/src/types.ts | 18 ++++++++++++++++++ networks/ethereum/src/utils.ts | 21 +++++++++++++++++++++ networks/ethereum/tsconfig.json | 8 ++++++++ 10 files changed, 94 insertions(+) create mode 100644 .changeset/dull-windows-clean.md create mode 100644 networks/ethereum/.eslintignore create mode 100644 networks/ethereum/.eslintrc.json create mode 100644 networks/ethereum/CHANGELOG.md create mode 100644 networks/ethereum/README.md create mode 100644 networks/ethereum/package.json create mode 100644 networks/ethereum/src/index.ts create mode 100644 networks/ethereum/src/types.ts create mode 100644 networks/ethereum/src/utils.ts create mode 100644 networks/ethereum/tsconfig.json diff --git a/.changeset/dull-windows-clean.md b/.changeset/dull-windows-clean.md new file mode 100644 index 00000000..b6d32ce8 --- /dev/null +++ b/.changeset/dull-windows-clean.md @@ -0,0 +1,5 @@ +--- +'@rosen-network/ethereum': patch +--- + +Initialize the Ethereum network package. diff --git a/networks/ethereum/.eslintignore b/networks/ethereum/.eslintignore new file mode 100644 index 00000000..1521c8b7 --- /dev/null +++ b/networks/ethereum/.eslintignore @@ -0,0 +1 @@ +dist diff --git a/networks/ethereum/.eslintrc.json b/networks/ethereum/.eslintrc.json new file mode 100644 index 00000000..6ee72696 --- /dev/null +++ b/networks/ethereum/.eslintrc.json @@ -0,0 +1,11 @@ +{ + "env": { "browser": true, "es2020": true }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "prettier" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { "ecmaVersion": "latest", "sourceType": "module" }, + "plugins": ["@typescript-eslint"] +} diff --git a/networks/ethereum/CHANGELOG.md b/networks/ethereum/CHANGELOG.md new file mode 100644 index 00000000..0fe51c22 --- /dev/null +++ b/networks/ethereum/CHANGELOG.md @@ -0,0 +1 @@ +# @rosen-network/ethereum diff --git a/networks/ethereum/README.md b/networks/ethereum/README.md new file mode 100644 index 00000000..0fe51c22 --- /dev/null +++ b/networks/ethereum/README.md @@ -0,0 +1 @@ +# @rosen-network/ethereum diff --git a/networks/ethereum/package.json b/networks/ethereum/package.json new file mode 100644 index 00000000..0511e638 --- /dev/null +++ b/networks/ethereum/package.json @@ -0,0 +1,26 @@ +{ + "name": "@rosen-network/ethereum", + "version": "0.1.0", + "private": true, + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "type": "module", + "scripts": { + "prettify": "prettier --write . --ignore-path .gitignore", + "lint": "eslint --fix . && npm run prettify", + "build": "tsc --build", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@rosen-ui/wallet-api": "^1.0.0", + "ethers": "^6.13.2" + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.26.0", + "eslint": "^8.16.0", + "eslint-config-prettier": "^9.0.0", + "prettier": "^3.0.2", + "typescript": "^5.0.0" + } +} diff --git a/networks/ethereum/src/index.ts b/networks/ethereum/src/index.ts new file mode 100644 index 00000000..6d5a6ef4 --- /dev/null +++ b/networks/ethereum/src/index.ts @@ -0,0 +1,2 @@ +export * from './types'; +export * from './utils'; diff --git a/networks/ethereum/src/types.ts b/networks/ethereum/src/types.ts new file mode 100644 index 00000000..606c8a9d --- /dev/null +++ b/networks/ethereum/src/types.ts @@ -0,0 +1,18 @@ +import { TokenMap } from '@rosen-bridge/tokens'; +import { Wallet } from '@rosen-ui/wallet-api'; + +export type WalletCreator = (config: WalletCreatorConfig) => Wallet; + +export type WalletCreatorConfig = { + getTokenMap(): Promise; +}; + +/** + * global type augmentation for wallets + */ +declare global { + let ethereum: { + isMetaMask: boolean; + _metamask: any; + }; +} diff --git a/networks/ethereum/src/utils.ts b/networks/ethereum/src/utils.ts new file mode 100644 index 00000000..b4236797 --- /dev/null +++ b/networks/ethereum/src/utils.ts @@ -0,0 +1,21 @@ +import { JsonRpcProvider } from 'ethers'; +import { isHexString } from 'ethers'; + +/** + * gets Ethereum current block height + * @returns + */ +export const getHeight = async (): Promise => { + return await new JsonRpcProvider( + process.env.ETHEREUM_BLAST_API + ).getBlockNumber(); +}; + +/** + * Verify the validity of the Ethereum address + * @param addr input address + * @returns + */ +export const isValidAddress = (addr: string) => { + return isHexString(addr); +}; diff --git a/networks/ethereum/tsconfig.json b/networks/ethereum/tsconfig.json new file mode 100644 index 00000000..23387a49 --- /dev/null +++ b/networks/ethereum/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../packages/tsconfig.novite.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "./" + }, + "include": ["src"] +} From 00698e1c35ade2c1a9706f1d253207061e980ecc Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 9 Sep 2024 12:10:21 +0000 Subject: [PATCH 096/168] feat: Implement the MetaMask wallet package. --- .changeset/eighty-olives-serve.md | 5 +++ wallets/metamask-wallet/.eslintignore | 1 + wallets/metamask-wallet/.eslintrc.json | 11 ++++++ wallets/metamask-wallet/CHANGELOG.md | 0 wallets/metamask-wallet/README.md | 3 ++ wallets/metamask-wallet/package.json | 30 +++++++++++++++ wallets/metamask-wallet/src/connectWallet.ts | 20 ++++++++++ wallets/metamask-wallet/src/getBalance.ts | 37 +++++++++++++++++++ .../metamask-wallet/src/getMetaMaskWallet.ts | 26 +++++++++++++ wallets/metamask-wallet/src/index.ts | 2 + .../src/isMetaMaskAvailable.ts | 7 ++++ .../src/metaMaskWalletCreator.ts | 17 +++++++++ .../metamask-wallet/src/metaMaskWalletInfo.ts | 9 +++++ wallets/metamask-wallet/src/transfer.ts | 19 ++++++++++ wallets/metamask-wallet/tsconfig.json | 9 +++++ 15 files changed, 196 insertions(+) create mode 100644 .changeset/eighty-olives-serve.md create mode 100644 wallets/metamask-wallet/.eslintignore create mode 100644 wallets/metamask-wallet/.eslintrc.json create mode 100644 wallets/metamask-wallet/CHANGELOG.md create mode 100644 wallets/metamask-wallet/README.md create mode 100644 wallets/metamask-wallet/package.json create mode 100644 wallets/metamask-wallet/src/connectWallet.ts create mode 100644 wallets/metamask-wallet/src/getBalance.ts create mode 100644 wallets/metamask-wallet/src/getMetaMaskWallet.ts create mode 100644 wallets/metamask-wallet/src/index.ts create mode 100644 wallets/metamask-wallet/src/isMetaMaskAvailable.ts create mode 100644 wallets/metamask-wallet/src/metaMaskWalletCreator.ts create mode 100644 wallets/metamask-wallet/src/metaMaskWalletInfo.ts create mode 100644 wallets/metamask-wallet/src/transfer.ts create mode 100644 wallets/metamask-wallet/tsconfig.json diff --git a/.changeset/eighty-olives-serve.md b/.changeset/eighty-olives-serve.md new file mode 100644 index 00000000..0dce5c86 --- /dev/null +++ b/.changeset/eighty-olives-serve.md @@ -0,0 +1,5 @@ +--- +'@rosen-ui/metamask-wallet': patch +--- + +Implement the MetaMask wallet package. diff --git a/wallets/metamask-wallet/.eslintignore b/wallets/metamask-wallet/.eslintignore new file mode 100644 index 00000000..1521c8b7 --- /dev/null +++ b/wallets/metamask-wallet/.eslintignore @@ -0,0 +1 @@ +dist diff --git a/wallets/metamask-wallet/.eslintrc.json b/wallets/metamask-wallet/.eslintrc.json new file mode 100644 index 00000000..6ee72696 --- /dev/null +++ b/wallets/metamask-wallet/.eslintrc.json @@ -0,0 +1,11 @@ +{ + "env": { "browser": true, "es2020": true }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "prettier" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { "ecmaVersion": "latest", "sourceType": "module" }, + "plugins": ["@typescript-eslint"] +} diff --git a/wallets/metamask-wallet/CHANGELOG.md b/wallets/metamask-wallet/CHANGELOG.md new file mode 100644 index 00000000..e69de29b diff --git a/wallets/metamask-wallet/README.md b/wallets/metamask-wallet/README.md new file mode 100644 index 00000000..592b1a4f --- /dev/null +++ b/wallets/metamask-wallet/README.md @@ -0,0 +1,3 @@ +# @rosen-ui/metamask-wallet + +This is a private package used inside rosen bridge-ui diff --git a/wallets/metamask-wallet/package.json b/wallets/metamask-wallet/package.json new file mode 100644 index 00000000..e18c66cf --- /dev/null +++ b/wallets/metamask-wallet/package.json @@ -0,0 +1,30 @@ +{ + "name": "@rosen-ui/metamask-wallet", + "version": "0.1.3", + "private": true, + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "type": "module", + "scripts": { + "prettify": "prettier --write . --ignore-path .gitignore", + "lint": "eslint --fix . && npm run prettify", + "build": "tsc --build", + "type-check": "tsc --noEmit" + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.26.0", + "eslint": "^8.16.0", + "eslint-config-prettier": "^9.0.0", + "prettier": "^3.0.2", + "typescript": "^5.0.0" + }, + "dependencies": { + "@metamask/sdk": "^0.28.2", + "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/tokens": "^1.2.1", + "@rosen-network/ethereum": "^0.1.0", + "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/wallet-api": "^1.0.2" + } +} diff --git a/wallets/metamask-wallet/src/connectWallet.ts b/wallets/metamask-wallet/src/connectWallet.ts new file mode 100644 index 00000000..9c7434cc --- /dev/null +++ b/wallets/metamask-wallet/src/connectWallet.ts @@ -0,0 +1,20 @@ +import { getMetaMaskWallet } from './getMetaMaskWallet'; + +/** + * handles the MetaMask wallet connection + */ + +let waiting; + +export const connectWallet = async (): Promise => { + waiting ||= getMetaMaskWallet().getApi().connect(); + + try { + await waiting; + waiting = undefined; + return true; + } catch { + waiting = undefined; + return false; + } +}; diff --git a/wallets/metamask-wallet/src/getBalance.ts b/wallets/metamask-wallet/src/getBalance.ts new file mode 100644 index 00000000..88e22659 --- /dev/null +++ b/wallets/metamask-wallet/src/getBalance.ts @@ -0,0 +1,37 @@ +import { RosenChainToken } from '@rosen-bridge/tokens'; +import { WalletCreatorConfig } from '@rosen-network/ethereum'; +import { Networks } from '@rosen-ui/constants'; +import { RosenAmountValue } from '@rosen-ui/types'; + +import { getMetaMaskWallet } from './getMetaMaskWallet'; + +export const getBalanceCreator = + (config: WalletCreatorConfig) => + async (token: RosenChainToken): Promise => { + const provider = await getMetaMaskWallet().getApi().getProvider(); + + if (!provider) return 0n; + + const accounts = await provider.request({ + method: 'eth_accounts', + }); + + if (!accounts?.length) return 0n; + + const amount = await provider.request({ + method: 'eth_getBalance', + params: [accounts[0], 'latest'], + }); + + if (!amount) return 0n; + + const tokenMap = await config.getTokenMap(); + + const wrappedAmount = tokenMap.wrapAmount( + token[tokenMap.getIdKey(Networks.ETHEREUM)], + BigInt(amount as string), + Networks.ETHEREUM + ).amount; + + return wrappedAmount; + }; diff --git a/wallets/metamask-wallet/src/getMetaMaskWallet.ts b/wallets/metamask-wallet/src/getMetaMaskWallet.ts new file mode 100644 index 00000000..f2e1b52c --- /dev/null +++ b/wallets/metamask-wallet/src/getMetaMaskWallet.ts @@ -0,0 +1,26 @@ +import { MetaMaskSDK } from '@metamask/sdk'; +import { createRawWallet } from '@rosen-ui/wallet-api'; + +import { connectWallet } from './connectWallet'; +import { metaMaskWalletInfo } from './metaMaskWalletInfo'; + +export const metaMaskSDK = new MetaMaskSDK({ + dappMetadata: { + name: 'Rosen Bridge', + }, + enableAnalytics: false, +}); + +/** + * MetaMask implementation of the Wallet + * interface to be able to interact with MetaMask wallet + */ +export const getMetaMaskWallet = () => { + return createRawWallet( + { + ...metaMaskWalletInfo, + connectWallet, + }, + () => metaMaskSDK + ); +}; diff --git a/wallets/metamask-wallet/src/index.ts b/wallets/metamask-wallet/src/index.ts new file mode 100644 index 00000000..f9520084 --- /dev/null +++ b/wallets/metamask-wallet/src/index.ts @@ -0,0 +1,2 @@ +export * from './metaMaskWalletCreator'; +export * from './metaMaskWalletInfo'; diff --git a/wallets/metamask-wallet/src/isMetaMaskAvailable.ts b/wallets/metamask-wallet/src/isMetaMaskAvailable.ts new file mode 100644 index 00000000..d66e129e --- /dev/null +++ b/wallets/metamask-wallet/src/isMetaMaskAvailable.ts @@ -0,0 +1,7 @@ +export const isMetaMaskAvailable = (): boolean => { + return ( + typeof ethereum !== 'undefined' && + ethereum.isMetaMask && + !!ethereum._metamask + ); +}; diff --git a/wallets/metamask-wallet/src/metaMaskWalletCreator.ts b/wallets/metamask-wallet/src/metaMaskWalletCreator.ts new file mode 100644 index 00000000..ab42de28 --- /dev/null +++ b/wallets/metamask-wallet/src/metaMaskWalletCreator.ts @@ -0,0 +1,17 @@ +import { WalletCreator } from '@rosen-network/ethereum'; + +import { getBalanceCreator } from './getBalance'; +import { getMetaMaskWallet } from './getMetaMaskWallet'; +import { isMetaMaskAvailable } from './isMetaMaskAvailable'; +import { transferCreator } from './transfer'; + +export const metaMaskWalletCreator: WalletCreator = (config) => { + return Object.assign({}, getMetaMaskWallet(), { + isAvailable: isMetaMaskAvailable, + getBalance: getBalanceCreator(config), + transfer: transferCreator(config), + getAddress: async () => { + throw new Error('Not implemented'); + }, + }); +}; diff --git a/wallets/metamask-wallet/src/metaMaskWalletInfo.ts b/wallets/metamask-wallet/src/metaMaskWalletInfo.ts new file mode 100644 index 00000000..8d022047 --- /dev/null +++ b/wallets/metamask-wallet/src/metaMaskWalletInfo.ts @@ -0,0 +1,9 @@ +import { MetaMaskIcon } from '@rosen-bridge/icons'; +import { WalletInfo } from '@rosen-ui/wallet-api'; + +export const metaMaskWalletInfo: WalletInfo = { + icon: MetaMaskIcon, + name: 'MetaMask', + label: 'MetaMask', + link: 'https://metamask.io/', +}; diff --git a/wallets/metamask-wallet/src/transfer.ts b/wallets/metamask-wallet/src/transfer.ts new file mode 100644 index 00000000..5ebc380d --- /dev/null +++ b/wallets/metamask-wallet/src/transfer.ts @@ -0,0 +1,19 @@ +import { RosenChainToken } from '@rosen-bridge/tokens'; +import { WalletCreatorConfig } from '@rosen-network/ethereum'; +import { RosenAmountValue } from '@rosen-ui/types'; + +import { getMetaMaskWallet } from './getMetaMaskWallet'; + +export const transferCreator = + (config: WalletCreatorConfig) => + async ( + token: RosenChainToken, + amount: RosenAmountValue, + toChain: string, + toAddress: string, + bridgeFee: RosenAmountValue, + networkFee: RosenAmountValue, + lockAddress: string + ): Promise => { + throw new Error('Hadi should consider implementing this logic'); + }; diff --git a/wallets/metamask-wallet/tsconfig.json b/wallets/metamask-wallet/tsconfig.json new file mode 100644 index 00000000..66903bfc --- /dev/null +++ b/wallets/metamask-wallet/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../packages/tsconfig.novite.json", + "compilerOptions": { + "jsx": "react-jsx", + "outDir": "dist", + "rootDir": "./" + }, + "include": ["src"] +} From 5b97501ddbf56ff7bf62fe44bfcc9c1f021f8019 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 9 Sep 2024 12:12:36 +0000 Subject: [PATCH 097/168] fix: Update the package-lock.json file --- package-lock.json | 50 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9a8cc244..f991e835 100644 --- a/package-lock.json +++ b/package-lock.json @@ -451,6 +451,36 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "networks/ethereum": { + "version": "0.1.0", + "dependencies": { + "@rosen-ui/wallet-api": "^1.0.0", + "ethers": "^6.13.2" + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.26.0", + "eslint": "^8.16.0", + "eslint-config-prettier": "^9.0.0", + "prettier": "^3.0.2", + "typescript": "^5.0.0" + } + }, + "networks/ethereum/node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "dev": true, @@ -4251,6 +4281,10 @@ "resolved": "networks/ergo", "link": true }, + "node_modules/@rosen-network/ethereum": { + "resolved": "networks/ethereum", + "link": true + }, "node_modules/@rosen-ui/asset-calculator": { "resolved": "packages/asset-calculator", "link": true @@ -8381,9 +8415,9 @@ } }, "node_modules/ethers": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.12.1.tgz", - "integrity": "sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.2.tgz", + "integrity": "sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg==", "funding": [ { "type": "individual", @@ -8401,7 +8435,7 @@ "@types/node": "18.15.13", "aes-js": "4.0.0-beta.5", "tslib": "2.4.0", - "ws": "8.5.0" + "ws": "8.17.1" }, "engines": { "node": ">=14.0.0" @@ -8429,15 +8463,15 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/ethers/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { From c758bbda5798071537c1796c464e0c60904268f1 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 9 Sep 2024 13:26:09 +0000 Subject: [PATCH 098/168] fix: Update the package-lock.json file. --- package-lock.json | 22573 ++++++++++++++++++++++++++++++-------------- 1 file changed, 15477 insertions(+), 7096 deletions(-) diff --git a/package-lock.json b/package-lock.json index f991e835..297cced0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -452,6 +452,7 @@ } }, "networks/ethereum": { + "name": "@rosen-network/ethereum", "version": "0.1.0", "dependencies": { "@rosen-ui/wallet-api": "^1.0.0", @@ -496,7 +497,6 @@ }, "node_modules/@ampproject/remapping": { "version": "2.2.1", - "dev": true, "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", @@ -546,56 +546,27 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/@babel/compat-data": { - "version": "7.23.3", - "dev": true, - "license": "MIT", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.23.3", - "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -624,39 +595,62 @@ }, "node_modules/@babel/core/node_modules/convert-source-map": { "version": "2.0.0", - "dev": true, "license": "MIT" }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.23.3", - "dev": true, - "license": "MIT", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", "dependencies": { - "@babel/types": "^7.23.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.25.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "peer": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "peer": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "dev": true, - "license": "MIT", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -666,63 +660,172 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "dev": true, - "license": "MIT", + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", + "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/traverse": "^7.25.4", + "semver": "^6.3.1" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "dev": true, - "license": "MIT", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", + "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", + "peer": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "peer": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", + "peer": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "dev": true, - "license": "MIT", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "peer": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", + "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", + "peer": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -732,52 +835,70 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "dev": true, - "license": "MIT", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "peer": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "license": "MIT", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "dev": true, - "license": "MIT", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", + "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", + "peer": true, + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { "version": "7.23.2", - "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.22.15", @@ -789,12 +910,14 @@ } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -802,7 +925,8 @@ }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { "color-convert": "^1.9.0" }, @@ -812,7 +936,8 @@ }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -824,15 +949,19 @@ }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { "node": ">=0.8.0" } }, "node_modules/@babel/parser": { - "version": "7.23.9", - "dev": true, - "license": "MIT", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "dependencies": { + "@babel/types": "^7.25.6" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -840,1651 +969,1974 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/runtime": { - "version": "7.23.2", - "license": "MIT", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", + "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", + "peer": true, "dependencies": { - "regenerator-runtime": "^0.14.0" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.3" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/template": { - "version": "7.22.15", - "dev": true, - "license": "MIT", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", + "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", + "peer": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/traverse": { - "version": "7.23.3", - "dev": true, - "license": "MIT", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", + "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", + "peer": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.3", - "@babel/types": "^7.23.3", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/types": { - "version": "7.23.9", - "license": "MIT", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "peer": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "node_modules/@blockfrost/blockfrost-js": { - "version": "5.5.0", - "license": "Apache-2.0", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", + "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", + "peer": true, "dependencies": { - "@blockfrost/openapi": "0.1.60", - "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", - "@emurgo/cip14-js": "3.0.1", - "bottleneck": "^2.19.5", - "form-data": "^4.0.0", - "got": "^11.8.6", - "json-bigint": "^1.0.0" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" }, "engines": { - "node": ">=16" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@blockfrost/blockfrost-js/node_modules/@sindresorhus/is": { - "version": "4.6.0", - "license": "MIT", + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "peer": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@blockfrost/blockfrost-js/node_modules/cacheable-request": { - "version": "7.0.4", - "license": "MIT", + "node_modules/@babel/plugin-proposal-export-default-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.7.tgz", + "integrity": "sha512-CcmFwUJ3tKhLjPdt4NP+SHMshebytF8ZTYOv5ZDpkzq2sin80Wb5vJrGt8fhPrORQCfoSa0LAxC/DW+GAC5+Hw==", + "peer": true, "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-default-from": "^7.24.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@blockfrost/blockfrost-js/node_modules/decompress-response": { - "version": "6.0.0", - "license": "MIT", + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "peer": true, "dependencies": { - "mimic-response": "^3.1.0" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@blockfrost/blockfrost-js/node_modules/get-stream": { - "version": "5.2.0", - "license": "MIT", + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "peer": true, "dependencies": { - "pump": "^3.0.0" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@blockfrost/blockfrost-js/node_modules/got": { - "version": "11.8.6", - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "peer": true, "engines": { - "node": ">=10.19.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/@blockfrost/blockfrost-js/node_modules/http-cache-semantics": { - "version": "4.1.1", - "license": "BSD-2-Clause" - }, - "node_modules/@blockfrost/blockfrost-js/node_modules/lowercase-keys": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@blockfrost/blockfrost-js/node_modules/mimic-response": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=10" + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@blockfrost/blockfrost-js/node_modules/normalize-url": { - "version": "6.1.0", - "license": "MIT", - "engines": { - "node": ">=10" + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@blockfrost/blockfrost-js/node_modules/p-cancelable": { - "version": "2.1.1", - "license": "MIT", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@blockfrost/blockfrost-js/node_modules/responselike": { - "version": "2.0.1", - "license": "MIT", + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "peer": true, "dependencies": { - "lowercase-keys": "^2.0.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@blockfrost/openapi": { - "version": "0.1.60", - "license": "MIT", + "node_modules/@babel/plugin-syntax-export-default-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.7.tgz", + "integrity": "sha512-bTPz4/635WQ9WhwsyPdxUJDVpsi/X9BMmy/8Rf/UAlOO4jSql4CxUCjWI5PiM+jG+c4LVPTScoTw80geFj9+Bw==", + "peer": true, "dependencies": { - "ajv": "^8.11.2", - "cbor": "^8.1.0", - "yaml": "^2.2.1" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@blockfrost/openapi/node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "peer": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "@babel/helper-plugin-utils": "^7.8.3" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@blockfrost/openapi/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/@blockfrost/openapi/node_modules/yaml": { - "version": "2.3.4", - "license": "ISC", + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz", + "integrity": "sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">= 14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cardano-ogmios/client": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@cardano-ogmios/client/-/client-6.3.0.tgz", - "integrity": "sha512-nWaZ76n/R+p8nxBfRCetOuoDH8o5QToL5zWhRUu9EwHDJqM/0rzvYEk9JYCikAcVlC1qt6+3CcG4nCpG0dsptw==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz", + "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==", + "peer": true, "dependencies": { - "@cardano-ogmios/schema": "6.3.0", - "@cardanosolutions/json-bigint": "^1.0.1", - "@types/json-bigint": "^1.0.1", - "bech32": "^2.0.0", - "cross-fetch": "^3.1.4", - "fastq": "^1.11.0", - "isomorphic-ws": "^4.0.1", - "nanoid": "^3.1.31", - "ts-custom-error": "^3.2.0", - "ws": "^7.4.6" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { - "node": ">=14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cardano-ogmios/schema": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@cardano-ogmios/schema/-/schema-6.3.0.tgz", - "integrity": "sha512-reM7NDYV4cgMAdFCzypoIuCVgSUfR9ztRMlk6p7k0cTeqUkbMfA83ps1FVkTDxzXxFjgM4EkhqoJyRjKIKRPQA==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", + "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, "engines": { - "node": ">=14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cardanosolutions/json-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@cardanosolutions/json-bigint/-/json-bigint-1.0.1.tgz", - "integrity": "sha512-mbYL6jtHqMFCZnTFhmkmoeDzHMBino0gMiGQnOJE7CwzZzkK2HCpH0MTBk+84QDadMEGX7iFt7uB+levm1a+bQ==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "peer": true, "dependencies": { - "bignumber.js": "^9.0.0" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cbor-extract/cbor-extract-linux-x64": { - "version": "2.2.0", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@changesets/apply-release-plan": { - "version": "7.0.0", - "license": "MIT", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "peer": true, "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/config": "^3.0.0", - "@changesets/get-version-range-type": "^0.4.0", - "@changesets/git": "^3.0.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "detect-indent": "^6.0.0", - "fs-extra": "^7.0.1", - "lodash.startcase": "^4.4.0", - "outdent": "^0.5.0", - "prettier": "^2.7.1", - "resolve-from": "^5.0.0", - "semver": "^7.5.3" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/apply-release-plan/node_modules/fs-extra": { - "version": "7.0.1", - "license": "MIT", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "peer": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/apply-release-plan/node_modules/jsonfile": { - "version": "4.0.0", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/apply-release-plan/node_modules/resolve-from": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/apply-release-plan/node_modules/universalify": { - "version": "0.1.2", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/assemble-release-plan": { - "version": "6.0.0", - "license": "MIT", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "peer": true, "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.0.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "semver": "^7.5.3" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/changelog-git": { - "version": "0.2.0", - "license": "MIT", + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "peer": true, "dependencies": { - "@changesets/types": "^6.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/cli": { - "version": "2.27.1", - "license": "MIT", + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "peer": true, "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/apply-release-plan": "^7.0.0", - "@changesets/assemble-release-plan": "^6.0.0", - "@changesets/changelog-git": "^0.2.0", - "@changesets/config": "^3.0.0", - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.0.0", - "@changesets/get-release-plan": "^4.0.0", - "@changesets/git": "^3.0.0", - "@changesets/logger": "^0.1.0", - "@changesets/pre": "^2.0.0", - "@changesets/read": "^0.6.0", - "@changesets/types": "^6.0.0", - "@changesets/write": "^0.3.0", - "@manypkg/get-packages": "^1.1.3", - "@types/semver": "^7.5.0", - "ansi-colors": "^4.1.3", - "chalk": "^2.1.0", - "ci-info": "^3.7.0", - "enquirer": "^2.3.0", - "external-editor": "^3.1.0", - "fs-extra": "^7.0.1", - "human-id": "^1.0.2", - "meow": "^6.0.0", - "outdent": "^0.5.0", - "p-limit": "^2.2.0", - "preferred-pm": "^3.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.5.3", - "spawndamnit": "^2.0.0", - "term-size": "^2.1.0", - "tty-table": "^4.1.5" + "@babel/helper-plugin-utils": "^7.8.0" }, - "bin": { - "changeset": "bin.js" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/cli/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "peer": true, "dependencies": { - "color-convert": "^1.9.0" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/cli/node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "peer": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/cli/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", + "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, "engines": { - "node": ">=0.8.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/cli/node_modules/fs-extra": { - "version": "7.0.1", - "license": "MIT", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "peer": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@changesets/cli/node_modules/jsonfile": { - "version": "4.0.0", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/cli/node_modules/p-limit": { - "version": "2.3.0", - "license": "MIT", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz", + "integrity": "sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==", + "peer": true, "dependencies": { - "p-try": "^2.0.0" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.4" }, "engines": { - "node": ">=6" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/cli/node_modules/resolve-from": { - "version": "5.0.0", - "license": "MIT", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/cli/node_modules/universalify": { - "version": "0.1.2", - "license": "MIT", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/config": { - "version": "3.0.0", - "license": "MIT", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", + "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", + "peer": true, "dependencies": { - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.0.0", - "@changesets/logger": "^0.1.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1", - "micromatch": "^4.0.2" + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/config/node_modules/fs-extra": { - "version": "7.0.1", - "license": "MIT", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz", + "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==", + "peer": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/config/node_modules/jsonfile": { - "version": "4.0.0", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "peer": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/@changesets/config/node_modules/universalify": { - "version": "0.1.2", - "license": "MIT", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", + "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.4", + "globals": "^11.1.0" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/errors": { - "version": "0.2.0", - "license": "MIT", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "peer": true, "dependencies": { - "extendable-error": "^0.1.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/get-dependents-graph": { - "version": "2.0.0", - "license": "MIT", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", + "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", + "peer": true, "dependencies": { - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "chalk": "^2.1.0", - "fs-extra": "^7.0.1", - "semver": "^7.5.3" + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/get-dependents-graph/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "peer": true, "dependencies": { - "color-convert": "^1.9.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/get-dependents-graph/node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "peer": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/get-dependents-graph/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", + "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8" + }, "engines": { - "node": ">=0.8.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@changesets/get-dependents-graph/node_modules/fs-extra": { - "version": "7.0.1", - "license": "MIT", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "peer": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/get-dependents-graph/node_modules/jsonfile": { - "version": "4.0.0", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "peer": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/get-dependents-graph/node_modules/universalify": { - "version": "0.1.2", - "license": "MIT", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/get-release-plan": { - "version": "4.0.0", - "license": "MIT", + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.2.tgz", + "integrity": "sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg==", + "peer": true, "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/assemble-release-plan": "^6.0.0", - "@changesets/config": "^3.0.0", - "@changesets/pre": "^2.0.0", - "@changesets/read": "^0.6.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-flow": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/get-version-range-type": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/@changesets/git": { - "version": "3.0.0", - "license": "MIT", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "peer": true, "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/errors": "^0.2.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "is-subdir": "^1.1.1", - "micromatch": "^4.0.2", - "spawndamnit": "^2.0.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/logger": { - "version": "0.1.0", - "license": "MIT", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", + "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", + "peer": true, "dependencies": { - "chalk": "^2.1.0" + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/logger/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "peer": true, "dependencies": { - "color-convert": "^1.9.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/logger/node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", + "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", + "peer": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/logger/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, "engines": { - "node": ">=0.8.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/parse": { - "version": "0.4.0", - "license": "MIT", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "peer": true, "dependencies": { - "@changesets/types": "^6.0.0", - "js-yaml": "^3.13.1" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/parse/node_modules/argparse": { - "version": "1.0.10", - "license": "MIT", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "peer": true, "dependencies": { - "sprintf-js": "~1.0.2" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/parse/node_modules/js-yaml": { - "version": "3.14.1", - "license": "MIT", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", + "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", + "peer": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-simple-access": "^7.24.7" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/pre": { - "version": "2.0.0", - "license": "MIT", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", + "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", + "peer": true, "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/errors": "^0.2.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1" + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/pre/node_modules/fs-extra": { - "version": "7.0.1", - "license": "MIT", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "peer": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/pre/node_modules/jsonfile": { - "version": "4.0.0", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@changesets/pre/node_modules/universalify": { - "version": "0.1.2", - "license": "MIT", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/read": { - "version": "0.6.0", - "license": "MIT", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "peer": true, "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/git": "^3.0.0", - "@changesets/logger": "^0.1.0", - "@changesets/parse": "^0.4.0", - "@changesets/types": "^6.0.0", - "chalk": "^2.1.0", - "fs-extra": "^7.0.1", - "p-filter": "^2.1.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/read/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "peer": true, "dependencies": { - "color-convert": "^1.9.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/read/node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "peer": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/read/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" + }, "engines": { - "node": ">=0.8.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/read/node_modules/fs-extra": { - "version": "7.0.1", - "license": "MIT", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "peer": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/read/node_modules/jsonfile": { - "version": "4.0.0", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", + "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/read/node_modules/universalify": { - "version": "0.1.2", - "license": "MIT", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/types": { - "version": "6.0.0", - "license": "MIT" - }, - "node_modules/@changesets/write": { - "version": "0.3.0", - "license": "MIT", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz", + "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==", + "peer": true, "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/types": "^6.0.0", - "fs-extra": "^7.0.1", - "human-id": "^1.0.2", - "prettier": "^2.7.1" + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/write/node_modules/fs-extra": { - "version": "7.0.1", - "license": "MIT", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "peer": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/write/node_modules/jsonfile": { - "version": "4.0.0", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/write/node_modules/universalify": { - "version": "0.1.2", - "license": "MIT", + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", + "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@colors/colors": { - "version": "1.6.0", - "license": "MIT", + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", + "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/types": "^7.25.2" + }, "engines": { - "node": ">=0.1.90" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "devOptional": true, - "license": "MIT", + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", + "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", + "peer": true, "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "devOptional": true, - "license": "MIT", + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", + "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", + "peer": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "license": "MIT", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "peer": true, "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/babel-plugin": { - "version": "11.11.0", - "license": "MIT", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "peer": true, "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/serialize": "^1.1.2", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/cache": { - "version": "11.11.0", - "license": "MIT", + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.4.tgz", + "integrity": "sha512-8hsyG+KUYGY0coX6KUCDancA0Vw225KJ2HJO0yCNr1vq5r+lJTleDaJf0K7iOhjw4SWhu03TMBzYTJ9krmzULQ==", + "peer": true, "dependencies": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "stylis": "4.2.0" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/hash": { - "version": "0.9.1", - "license": "MIT" + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.1", - "license": "MIT", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "peer": true, "dependencies": { - "@emotion/memoize": "^0.8.1" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "license": "MIT" - }, - "node_modules/@emotion/react": { - "version": "11.11.1", - "license": "MIT", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "peer": true, "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.2", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "hoist-non-react-statics": "^3.3.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, - "peerDependencies": { - "react": ">=16.8.0" + "engines": { + "node": ">=6.9.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/serialize": { - "version": "1.1.2", - "license": "MIT", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "peer": true, "dependencies": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", - "csstype": "^3.0.2" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/sheet": { - "version": "1.2.2", - "license": "MIT" - }, - "node_modules/@emotion/styled": { - "version": "11.11.0", - "license": "MIT", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "peer": true, "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/is-prop-valid": "^1.2.1", - "@emotion/serialize": "^1.1.2", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@emotion/react": "^11.0.0-rc.0", - "react": ">=16.8.0" + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", + "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/unitless": { - "version": "0.8.1", - "license": "MIT" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "license": "MIT", + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz", + "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { - "react": ">=16.8.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/utils": { - "version": "1.2.1", - "license": "MIT" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.3.1", - "license": "MIT" - }, - "node_modules/@emurgo/cardano-serialization-lib-browser": { - "version": "11.5.0", - "license": "MIT" - }, - "node_modules/@emurgo/cardano-serialization-lib-nodejs": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-11.5.0.tgz", - "integrity": "sha512-IlVABlRgo9XaTR1NunwZpWcxnfEv04ba2l1vkUz4S1W7Jt36F4CtffP+jPeqBZGnAe+fnUwo0XjIJC3ZTNToNQ==" - }, - "node_modules/@emurgo/cip14-js": { - "version": "3.0.1", - "license": "Apache-2.0 OR MIT", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "peer": true, "dependencies": { - "bech32": "2.0.0", - "blake2b": "2.1.3" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz", + "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==", + "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/@babel/preset-env": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.4.tgz", + "integrity": "sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==", + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.25.4", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-modules-systemjs": "^7.25.0", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.25.4", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.8", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.4", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.37.1", + "semver": "^6.3.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-flow": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.7.tgz", + "integrity": "sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-transform-flow-strip-types": "^7.24.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", + "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "node_modules/@babel/register": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz", + "integrity": "sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==", + "peer": true, + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.6", + "source-map-support": "^0.5.16" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "peer": true + }, + "node_modules/@babel/runtime": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@babel/traverse": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@blockfrost/blockfrost-js": { + "version": "5.5.0", + "license": "Apache-2.0", + "dependencies": { + "@blockfrost/openapi": "0.1.60", + "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", + "@emurgo/cip14-js": "3.0.1", + "bottleneck": "^2.19.5", + "form-data": "^4.0.0", + "got": "^11.8.6", + "json-bigint": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">=16" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@blockfrost/blockfrost-js/node_modules/@sindresorhus/is": { + "version": "4.6.0", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@blockfrost/blockfrost-js/node_modules/cacheable-request": { + "version": "7.0.4", + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@blockfrost/blockfrost-js/node_modules/decompress-response": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@blockfrost/blockfrost-js/node_modules/get-stream": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@blockfrost/blockfrost-js/node_modules/got": { + "version": "11.8.6", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } + "node_modules/@blockfrost/blockfrost-js/node_modules/http-cache-semantics": { + "version": "4.1.1", + "license": "BSD-2-Clause" }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "node_modules/@blockfrost/blockfrost-js/node_modules/lowercase-keys": { + "version": "2.0.0", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "node_modules/@blockfrost/blockfrost-js/node_modules/mimic-response": { + "version": "3.1.0", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "node_modules/@blockfrost/blockfrost-js/node_modules/normalize-url": { + "version": "6.1.0", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "node_modules/@blockfrost/blockfrost-js/node_modules/p-cancelable": { + "version": "2.1.1", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "dev": true, + "node_modules/@blockfrost/blockfrost-js/node_modules/responselike": { + "version": "2.0.1", "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "lowercase-keys": "^2.0.0" }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "dev": true, + "node_modules/@blockfrost/openapi": { + "version": "0.1.60", "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "ajv": "^8.11.2", + "cbor": "^8.1.0", + "yaml": "^2.2.1" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.23.0", - "dev": true, + "node_modules/@blockfrost/openapi/node_modules/ajv": { + "version": "8.12.0", "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/@blockfrost/openapi/node_modules/json-schema-traverse": { + "version": "1.0.0", + "license": "MIT" }, - "node_modules/@eslint/js": { - "version": "8.42.0", - "dev": true, - "license": "MIT", + "node_modules/@blockfrost/openapi/node_modules/yaml": { + "version": "2.3.4", + "license": "ISC", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 14" } }, - "node_modules/@floating-ui/core": { - "version": "1.5.0", - "license": "MIT", + "node_modules/@cardano-ogmios/client": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@cardano-ogmios/client/-/client-6.3.0.tgz", + "integrity": "sha512-nWaZ76n/R+p8nxBfRCetOuoDH8o5QToL5zWhRUu9EwHDJqM/0rzvYEk9JYCikAcVlC1qt6+3CcG4nCpG0dsptw==", "dependencies": { - "@floating-ui/utils": "^0.1.3" + "@cardano-ogmios/schema": "6.3.0", + "@cardanosolutions/json-bigint": "^1.0.1", + "@types/json-bigint": "^1.0.1", + "bech32": "^2.0.0", + "cross-fetch": "^3.1.4", + "fastq": "^1.11.0", + "isomorphic-ws": "^4.0.1", + "nanoid": "^3.1.31", + "ts-custom-error": "^3.2.0", + "ws": "^7.4.6" + }, + "engines": { + "node": ">=14" } }, - "node_modules/@floating-ui/dom": { - "version": "1.5.3", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" + "node_modules/@cardano-ogmios/schema": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@cardano-ogmios/schema/-/schema-6.3.0.tgz", + "integrity": "sha512-reM7NDYV4cgMAdFCzypoIuCVgSUfR9ztRMlk6p7k0cTeqUkbMfA83ps1FVkTDxzXxFjgM4EkhqoJyRjKIKRPQA==", + "engines": { + "node": ">=14" } }, - "node_modules/@floating-ui/react-dom": { - "version": "2.0.4", - "license": "MIT", + "node_modules/@cardanosolutions/json-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@cardanosolutions/json-bigint/-/json-bigint-1.0.1.tgz", + "integrity": "sha512-mbYL6jtHqMFCZnTFhmkmoeDzHMBino0gMiGQnOJE7CwzZzkK2HCpH0MTBk+84QDadMEGX7iFt7uB+levm1a+bQ==", "dependencies": { - "@floating-ui/dom": "^1.5.1" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "bignumber.js": "^9.0.0" } }, - "node_modules/@floating-ui/utils": { - "version": "0.1.6", - "license": "MIT" - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", + "node_modules/@cbor-extract/cbor-extract-linux-x64": { + "version": "2.2.0", + "cpu": [ + "x64" + ], "license": "MIT", - "optional": true + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@graphql-typed-document-node/core": { - "version": "3.2.0", + "node_modules/@changesets/apply-release-plan": { + "version": "7.0.0", "license": "MIT", - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "license": "BSD-3-Clause", "dependencies": { - "@hapi/hoek": "^9.0.0" + "@babel/runtime": "^7.20.1", + "@changesets/config": "^3.0.0", + "@changesets/get-version-range-type": "^0.4.0", + "@changesets/git": "^3.0.0", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "detect-indent": "^6.0.0", + "fs-extra": "^7.0.1", + "lodash.startcase": "^4.4.0", + "outdent": "^0.5.0", + "prettier": "^2.7.1", + "resolve-from": "^5.0.0", + "semver": "^7.5.3" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "dev": true, - "license": "Apache-2.0", + "node_modules/@changesets/apply-release-plan/node_modules/fs-extra": { + "version": "7.0.1", + "license": "MIT", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=6 <7 || >=8" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node_modules/@changesets/apply-release-plan/node_modules/jsonfile": { + "version": "4.0.0", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, + "node_modules/@changesets/apply-release-plan/node_modules/resolve-from": { + "version": "5.0.0", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", + "node_modules/@changesets/apply-release-plan/node_modules/universalify": { + "version": "0.1.2", "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">= 4.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", + "node_modules/@changesets/assemble-release-plan": { + "version": "6.0.0", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "@babel/runtime": "^7.20.1", + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.0.0", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "semver": "^7.5.3" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "dev": true, + "node_modules/@changesets/changelog-git": { + "version": "0.2.0", "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@changesets/types": "^6.0.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "dev": true, + "node_modules/@changesets/cli": { + "version": "2.27.1", "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/runtime": "^7.20.1", + "@changesets/apply-release-plan": "^7.0.0", + "@changesets/assemble-release-plan": "^6.0.0", + "@changesets/changelog-git": "^0.2.0", + "@changesets/config": "^3.0.0", + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.0.0", + "@changesets/get-release-plan": "^4.0.0", + "@changesets/git": "^3.0.0", + "@changesets/logger": "^0.1.0", + "@changesets/pre": "^2.0.0", + "@changesets/read": "^0.6.0", + "@changesets/types": "^6.0.0", + "@changesets/write": "^0.3.0", + "@manypkg/get-packages": "^1.1.3", + "@types/semver": "^7.5.0", + "ansi-colors": "^4.1.3", + "chalk": "^2.1.0", + "ci-info": "^3.7.0", + "enquirer": "^2.3.0", + "external-editor": "^3.1.0", + "fs-extra": "^7.0.1", + "human-id": "^1.0.2", + "meow": "^6.0.0", + "outdent": "^0.5.0", + "p-limit": "^2.2.0", + "preferred-pm": "^3.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.3", + "spawndamnit": "^2.0.0", + "term-size": "^2.1.0", + "tty-table": "^4.1.5" }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" + "bin": { + "changeset": "bin.js" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "dev": true, + "node_modules/@changesets/cli/node_modules/ansi-styles": { + "version": "3.2.1", "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@manypkg/find-root": { - "version": "1.1.0", + "node_modules/@changesets/cli/node_modules/chalk": { + "version": "2.4.2", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.5.5", - "@types/node": "^12.7.1", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@manypkg/find-root/node_modules/@types/node": { - "version": "12.20.55", - "license": "MIT" - }, - "node_modules/@manypkg/find-root/node_modules/find-up": { - "version": "4.1.0", + "node_modules/@changesets/cli/node_modules/escape-string-regexp": { + "version": "1.0.5", "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, - "node_modules/@manypkg/find-root/node_modules/fs-extra": { - "version": "8.1.0", + "node_modules/@changesets/cli/node_modules/fs-extra": { + "version": "7.0.1", "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", + "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" }, @@ -2492,24 +2944,14 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/@manypkg/find-root/node_modules/jsonfile": { + "node_modules/@changesets/cli/node_modules/jsonfile": { "version": "4.0.0", "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, - "node_modules/@manypkg/find-root/node_modules/locate-path": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@manypkg/find-root/node_modules/p-limit": { + "node_modules/@changesets/cli/node_modules/p-limit": { "version": "2.3.0", "license": "MIT", "dependencies": { @@ -2522,44 +2964,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@manypkg/find-root/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/@changesets/cli/node_modules/resolve-from": { + "version": "5.0.0", "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, "engines": { "node": ">=8" } }, - "node_modules/@manypkg/find-root/node_modules/universalify": { + "node_modules/@changesets/cli/node_modules/universalify": { "version": "0.1.2", "license": "MIT", "engines": { "node": ">= 4.0.0" } }, - "node_modules/@manypkg/get-packages": { - "version": "1.1.3", + "node_modules/@changesets/config": { + "version": "3.0.0", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.5.5", - "@changesets/types": "^4.0.1", - "@manypkg/find-root": "^1.1.0", - "fs-extra": "^8.1.0", - "globby": "^11.0.0", - "read-yaml-file": "^1.1.0" + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.0.0", + "@changesets/logger": "^0.1.0", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1", + "micromatch": "^4.0.2" } }, - "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { - "version": "4.1.0", - "license": "MIT" - }, - "node_modules/@manypkg/get-packages/node_modules/fs-extra": { - "version": "8.1.0", + "node_modules/@changesets/config/node_modules/fs-extra": { + "version": "7.0.1", "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", + "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" }, @@ -2567,6328 +3003,12679 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/@manypkg/get-packages/node_modules/jsonfile": { + "node_modules/@changesets/config/node_modules/jsonfile": { "version": "4.0.0", "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, - "node_modules/@manypkg/get-packages/node_modules/universalify": { + "node_modules/@changesets/config/node_modules/universalify": { "version": "0.1.2", "license": "MIT", "engines": { "node": ">= 4.0.0" } }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "license": "BSD-3-Clause", + "node_modules/@changesets/errors": { + "version": "0.2.0", + "license": "MIT", "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" + "extendable-error": "^0.1.5" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir": { - "version": "3.1.0", + "node_modules/@changesets/get-dependents-graph": { + "version": "2.0.0", "license": "MIT", "dependencies": { - "semver": "^6.0.0" + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "chalk": "^2.1.0", + "fs-extra": "^7.0.1", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/get-dependents-graph/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/@changesets/get-dependents-graph/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@microsoft/api-extractor": { - "version": "7.38.3", - "dev": true, + "node_modules/@changesets/get-dependents-graph/node_modules/escape-string-regexp": { + "version": "1.0.5", "license": "MIT", - "dependencies": { - "@microsoft/api-extractor-model": "7.28.2", - "@microsoft/tsdoc": "0.14.2", - "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.61.0", - "@rushstack/rig-package": "0.5.1", - "@rushstack/ts-command-line": "4.17.1", - "colors": "~1.2.1", - "lodash": "~4.17.15", - "resolve": "~1.22.1", - "semver": "~7.5.4", - "source-map": "~0.6.1", - "typescript": "~5.0.4" - }, - "bin": { - "api-extractor": "bin/api-extractor" + "engines": { + "node": ">=0.8.0" } }, - "node_modules/@microsoft/api-extractor-model": { - "version": "7.28.2", - "dev": true, + "node_modules/@changesets/get-dependents-graph/node_modules/fs-extra": { + "version": "7.0.1", "license": "MIT", "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.61.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" } }, - "node_modules/@microsoft/api-extractor/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "node_modules/@changesets/get-dependents-graph/node_modules/jsonfile": { + "version": "4.0.0", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "5.0.4", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "node_modules/@changesets/get-dependents-graph/node_modules/universalify": { + "version": "0.1.2", + "license": "MIT", "engines": { - "node": ">=12.20" + "node": ">= 4.0.0" } }, - "node_modules/@microsoft/tsdoc": { - "version": "0.14.2", - "dev": true, + "node_modules/@changesets/get-release-plan": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/assemble-release-plan": "^6.0.0", + "@changesets/config": "^3.0.0", + "@changesets/pre": "^2.0.0", + "@changesets/read": "^0.6.0", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3" + } + }, + "node_modules/@changesets/get-version-range-type": { + "version": "0.4.0", "license": "MIT" }, - "node_modules/@microsoft/tsdoc-config": { - "version": "0.16.2", - "dev": true, + "node_modules/@changesets/git": { + "version": "3.0.0", "license": "MIT", "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "ajv": "~6.12.6", - "jju": "~1.4.0", - "resolve": "~1.19.0" + "@babel/runtime": "^7.20.1", + "@changesets/errors": "^0.2.0", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "is-subdir": "^1.1.1", + "micromatch": "^4.0.2", + "spawndamnit": "^2.0.0" } }, - "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { - "version": "1.19.0", - "dev": true, + "node_modules/@changesets/logger": { + "version": "0.1.0", "license": "MIT", "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "chalk": "^2.1.0" } }, - "node_modules/@mui/base": { - "version": "5.0.0-beta.24", + "node_modules/@changesets/logger/node_modules/ansi-styles": { + "version": "3.2.1", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.2", - "@floating-ui/react-dom": "^2.0.4", - "@mui/types": "^7.2.9", - "@mui/utils": "^5.14.18", - "@popperjs/core": "^2.11.8", - "clsx": "^2.0.0", - "prop-types": "^15.8.1" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node": ">=4" } }, - "node_modules/@mui/core-downloads-tracker": { - "version": "5.14.18", + "node_modules/@changesets/logger/node_modules/chalk": { + "version": "2.4.2", "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@mui/lab": { - "version": "5.0.0-alpha.153", + "node_modules/@changesets/logger/node_modules/escape-string-regexp": { + "version": "1.0.5", "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.2", - "@mui/base": "5.0.0-beta.24", - "@mui/system": "^5.14.18", - "@mui/types": "^7.2.9", - "@mui/utils": "^5.14.18", - "clsx": "^2.0.0", - "prop-types": "^15.8.1" - }, "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@mui/material": ">=5.10.11", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } + "node": ">=0.8.0" } }, - "node_modules/@mui/material": { - "version": "5.14.18", + "node_modules/@changesets/parse": { + "version": "0.4.0", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.2", - "@mui/base": "5.0.0-beta.24", - "@mui/core-downloads-tracker": "^5.14.18", - "@mui/system": "^5.14.18", - "@mui/types": "^7.2.9", - "@mui/utils": "^5.14.18", - "@types/react-transition-group": "^4.4.8", - "clsx": "^2.0.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1", - "react-is": "^18.2.0", - "react-transition-group": "^4.4.5" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } + "@changesets/types": "^6.0.0", + "js-yaml": "^3.13.1" } }, - "node_modules/@mui/private-theming": { - "version": "5.14.18", + "node_modules/@changesets/parse/node_modules/argparse": { + "version": "1.0.10", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.2", - "@mui/utils": "^5.14.18", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "sprintf-js": "~1.0.2" } }, - "node_modules/@mui/styled-engine": { - "version": "5.14.18", + "node_modules/@changesets/parse/node_modules/js-yaml": { + "version": "3.14.1", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.2", - "@emotion/cache": "^11.11.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@mui/system": { - "version": "5.14.18", + "node_modules/@changesets/pre": { + "version": "2.0.0", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.2", - "@mui/private-theming": "^5.14.18", - "@mui/styled-engine": "^5.14.18", - "@mui/types": "^7.2.9", - "@mui/utils": "^5.14.18", - "clsx": "^2.0.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1" + "@babel/runtime": "^7.20.1", + "@changesets/errors": "^0.2.0", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1" + } + }, + "node_modules/@changesets/pre/node_modules/fs-extra": { + "version": "7.0.1", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } + "node": ">=6 <7 || >=8" } }, - "node_modules/@mui/types": { - "version": "7.2.9", + "node_modules/@changesets/pre/node_modules/jsonfile": { + "version": "4.0.0", "license": "MIT", - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@mui/utils": { - "version": "5.14.18", + "node_modules/@changesets/pre/node_modules/universalify": { + "version": "0.1.2", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@changesets/read": { + "version": "0.6.0", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.2", - "@types/prop-types": "^15.7.10", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" + "@babel/runtime": "^7.20.1", + "@changesets/git": "^3.0.0", + "@changesets/logger": "^0.1.0", + "@changesets/parse": "^0.4.0", + "@changesets/types": "^6.0.0", + "chalk": "^2.1.0", + "fs-extra": "^7.0.1", + "p-filter": "^2.1.0" + } + }, + "node_modules/@changesets/read/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" }, "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "node": ">=4" + } + }, + "node_modules/@changesets/read/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": ">=4" } }, - "node_modules/@napi-rs/snappy-linux-x64-gnu": { - "version": "7.2.2", - "cpu": [ - "x64" - ], + "node_modules/@changesets/read/node_modules/escape-string-regexp": { + "version": "1.0.5", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10" + "node": ">=0.8.0" } }, - "node_modules/@napi-rs/snappy-linux-x64-musl": { - "version": "7.2.2", - "cpu": [ - "x64" - ], + "node_modules/@changesets/read/node_modules/fs-extra": { + "version": "7.0.1", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, "engines": { - "node": ">= 10" + "node": ">=6 <7 || >=8" } }, - "node_modules/@next/env": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.1.0.tgz", - "integrity": "sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw==" + "node_modules/@changesets/read/node_modules/jsonfile": { + "version": "4.0.0", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } }, - "node_modules/@next/eslint-plugin-next": { - "version": "14.0.3", - "dev": true, + "node_modules/@changesets/read/node_modules/universalify": { + "version": "0.1.2", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@changesets/types": { + "version": "6.0.0", + "license": "MIT" + }, + "node_modules/@changesets/write": { + "version": "0.3.0", "license": "MIT", "dependencies": { - "glob": "7.1.7" + "@babel/runtime": "^7.20.1", + "@changesets/types": "^6.0.0", + "fs-extra": "^7.0.1", + "human-id": "^1.0.2", + "prettier": "^2.7.1" } }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.0.tgz", - "integrity": "sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@changesets/write/node_modules/fs-extra": { + "version": "7.0.1", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, "engines": { - "node": ">= 10" + "node": ">=6 <7 || >=8" } }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.0.tgz", - "integrity": "sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" + "node_modules/@changesets/write/node_modules/jsonfile": { + "version": "4.0.0", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.0.tgz", - "integrity": "sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], + "node_modules/@changesets/write/node_modules/universalify": { + "version": "0.1.2", + "license": "MIT", "engines": { - "node": ">= 10" + "node": ">= 4.0.0" } }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.0.tgz", - "integrity": "sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], + "node_modules/@colors/colors": { + "version": "1.6.0", + "license": "MIT", "engines": { - "node": ">= 10" + "node": ">=0.1.90" } }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz", - "integrity": "sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "license": "MIT", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.11.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.11.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "license": "MIT" + }, + "node_modules/@emurgo/cardano-serialization-lib-browser": { + "version": "11.5.0", + "license": "MIT" + }, + "node_modules/@emurgo/cardano-serialization-lib-nodejs": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-11.5.0.tgz", + "integrity": "sha512-IlVABlRgo9XaTR1NunwZpWcxnfEv04ba2l1vkUz4S1W7Jt36F4CtffP+jPeqBZGnAe+fnUwo0XjIJC3ZTNToNQ==" + }, + "node_modules/@emurgo/cip14-js": { + "version": "3.0.1", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "bech32": "2.0.0", + "blake2b": "2.1.3" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", "cpu": [ - "x64" + "ppc64" ], + "dev": true, "optional": true, "os": [ - "linux" + "aix" ], "engines": { - "node": ">= 10" + "node": ">=12" } }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.0.tgz", - "integrity": "sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==", + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", "cpu": [ - "x64" + "arm" ], + "dev": true, "optional": true, "os": [ - "linux" + "android" ], "engines": { - "node": ">= 10" + "node": ">=12" } }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.0.tgz", - "integrity": "sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==", + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ - "win32" + "android" ], "engines": { - "node": ">= 10" + "node": ">=12" } }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.0.tgz", - "integrity": "sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==", + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", "cpu": [ - "ia32" + "x64" ], + "dev": true, "optional": true, "os": [ - "win32" + "android" ], "engines": { - "node": ">= 10" + "node": ">=12" } }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.0.tgz", - "integrity": "sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", "cpu": [ - "x64" + "arm64" ], + "dev": true, "optional": true, "os": [ - "win32" + "darwin" ], "engines": { - "node": ">= 10" + "node": ">=12" } }, - "node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", - "dependencies": { - "@noble/hashes": "1.3.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@noble/curves/node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=12" } }, - "node_modules/@noble/ed25519": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-2.1.0.tgz", - "integrity": "sha512-KM4qTyXPinyCgMzeYJH/UudpdL+paJXtY3CHtHYZQtBkS8MZoPr4rOikZllIutJe0d06QDQKisyn02gxZ8TcQA==", - "funding": { - "url": "https://paulmillr.com/funding/" + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=12" } }, - "node_modules/@noble/secp256k1": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "license": "MIT", + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/@npmcli/fs": { - "version": "1.1.1", - "license": "ISC", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, "optional": true, - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "license": "MIT", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, "optional": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/@npmcli/move-file/node_modules/mkdirp": { - "version": "1.0.4", - "license": "MIT", + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, "optional": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/@octokit/app": { - "version": "13.1.8", + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@octokit/auth-app": "^4.0.13", - "@octokit/auth-unauthenticated": "^3.0.0", - "@octokit/core": "^4.0.0", - "@octokit/oauth-app": "^4.0.7", - "@octokit/plugin-paginate-rest": "^6.0.0", - "@octokit/types": "^9.0.0", - "@octokit/webhooks": "^10.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 14" + "node": ">=12" } }, - "node_modules/@octokit/auth-app": { - "version": "4.0.13", - "license": "MIT", - "dependencies": { - "@octokit/auth-oauth-app": "^5.0.0", - "@octokit/auth-oauth-user": "^2.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "deprecation": "^2.3.1", - "lru-cache": "^9.0.0", - "universal-github-app-jwt": "^1.1.1", - "universal-user-agent": "^6.0.0" - }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">= 14" + "node": ">=12" } }, - "node_modules/@octokit/auth-app/node_modules/lru-cache": { - "version": "9.1.2", - "license": "ISC", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": "14 || >=16.14" + "node": ">=12" } }, - "node_modules/@octokit/auth-oauth-app": { - "version": "5.0.6", - "license": "MIT", - "dependencies": { - "@octokit/auth-oauth-device": "^4.0.0", - "@octokit/auth-oauth-user": "^2.0.0", - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "@types/btoa-lite": "^1.0.0", - "btoa-lite": "^1.0.0", - "universal-user-agent": "^6.0.0" - }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">= 14" + "node": ">=12" } }, - "node_modules/@octokit/auth-oauth-device": { - "version": "4.0.5", - "license": "MIT", - "dependencies": { - "@octokit/oauth-methods": "^2.0.0", - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" - }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 14" + "node": ">=12" } }, - "node_modules/@octokit/auth-oauth-user": { - "version": "2.1.2", - "license": "MIT", - "dependencies": { - "@octokit/auth-oauth-device": "^4.0.0", - "@octokit/oauth-methods": "^2.0.0", - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "btoa-lite": "^1.0.0", - "universal-user-agent": "^6.0.0" - }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 14" + "node": ">=12" } }, - "node_modules/@octokit/auth-token": { - "version": "3.0.4", - "license": "MIT", + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 14" + "node": ">=12" } }, - "node_modules/@octokit/auth-unauthenticated": { - "version": "3.0.5", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, "license": "MIT", "dependencies": { - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0" + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">= 14" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@octokit/core": { - "version": "4.2.4", + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "dev": true, "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, "engines": { - "node": ">= 14" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@octokit/endpoint": { - "version": "7.0.6", + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">= 14" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@octokit/graphql": { - "version": "5.0.6", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.23.0", + "dev": true, "license": "MIT", "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" + "type-fest": "^0.20.2" }, "engines": { - "node": ">= 14" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@octokit/oauth-app": { - "version": "4.2.4", - "license": "MIT", - "dependencies": { - "@octokit/auth-oauth-app": "^5.0.0", - "@octokit/auth-oauth-user": "^2.0.0", - "@octokit/auth-unauthenticated": "^3.0.0", - "@octokit/core": "^4.0.0", - "@octokit/oauth-authorization-url": "^5.0.0", - "@octokit/oauth-methods": "^2.0.0", - "@types/aws-lambda": "^8.10.83", - "fromentries": "^1.3.1", - "universal-user-agent": "^6.0.0" - }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">= 14" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@octokit/oauth-authorization-url": { - "version": "5.0.0", + "node_modules/@eslint/js": { + "version": "8.42.0", + "dev": true, "license": "MIT", "engines": { - "node": ">= 14" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@octokit/oauth-methods": { - "version": "2.0.6", - "license": "MIT", + "node_modules/@ethereumjs/common": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-3.2.0.tgz", + "integrity": "sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==", "dependencies": { - "@octokit/oauth-authorization-url": "^5.0.0", - "@octokit/request": "^6.2.3", - "@octokit/request-error": "^3.0.3", - "@octokit/types": "^9.0.0", - "btoa-lite": "^1.0.0" + "@ethereumjs/util": "^8.1.0", + "crc-32": "^1.2.0" + } + }, + "node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "bin": { + "rlp": "bin/rlp" }, "engines": { - "node": ">= 14" + "node": ">=14" } }, - "node_modules/@octokit/openapi-types": { - "version": "18.1.1", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.1.2", - "license": "MIT", + "node_modules/@ethereumjs/tx": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-4.2.0.tgz", + "integrity": "sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==", "dependencies": { - "@octokit/tsconfig": "^1.0.2", - "@octokit/types": "^9.2.3" + "@ethereumjs/common": "^3.2.0", + "@ethereumjs/rlp": "^4.0.1", + "@ethereumjs/util": "^8.1.0", + "ethereum-cryptography": "^2.0.0" }, "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=4" + "node": ">=14" } }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "7.2.3", - "license": "MIT", + "node_modules/@ethereumjs/util": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", + "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", "dependencies": { - "@octokit/types": "^10.0.0" + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" }, "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=3" + "node": ">=14" } }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "10.0.0", + "node_modules/@floating-ui/core": { + "version": "1.5.0", "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "@floating-ui/utils": "^0.1.3" } }, - "node_modules/@octokit/plugin-retry": { - "version": "4.1.6", + "node_modules/@floating-ui/dom": { + "version": "1.5.3", "license": "MIT", "dependencies": { - "@octokit/types": "^9.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=3" + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" } }, - "node_modules/@octokit/plugin-throttling": { - "version": "5.2.3", + "node_modules/@floating-ui/react-dom": { + "version": "2.0.4", "license": "MIT", "dependencies": { - "@octokit/types": "^9.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 14" + "@floating-ui/dom": "^1.5.1" }, "peerDependencies": { - "@octokit/core": "^4.0.0" + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@octokit/request": { - "version": "6.2.8", + "node_modules/@floating-ui/utils": { + "version": "0.1.6", + "license": "MIT" + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } + "optional": true }, - "node_modules/@octokit/request-error": { - "version": "3.0.3", + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", "license": "MIT", - "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 14" + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@octokit/tsconfig": { - "version": "1.0.2", - "license": "MIT" + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "license": "BSD-3-Clause" }, - "node_modules/@octokit/types": { - "version": "9.3.2", - "license": "MIT", + "node_modules/@hapi/topo": { + "version": "5.1.0", + "license": "BSD-3-Clause", "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "@hapi/hoek": "^9.0.0" } }, - "node_modules/@octokit/webhooks": { - "version": "10.9.2", - "license": "MIT", + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@octokit/request-error": "^3.0.0", - "@octokit/webhooks-methods": "^3.0.0", - "@octokit/webhooks-types": "6.11.0", - "aggregate-error": "^3.1.0" + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">= 14" + "node": ">=10.10.0" } }, - "node_modules/@octokit/webhooks-methods": { - "version": "3.0.3", - "license": "MIT", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">= 14" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@octokit/webhooks-types": { - "version": "6.11.0", - "license": "MIT" + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "dev": true, + "license": "BSD-3-Clause" }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "license": "MIT", - "optional": true, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, "engines": { - "node": ">=14" + "node": ">=12" } }, - "node_modules/@popperjs/core": { - "version": "2.11.8", + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", "license": "MIT", + "engines": { + "node": ">=12" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "license": "BSD-3-Clause", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "license": "BSD-3-Clause" + "node_modules/@isaacs/ttlcache": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", + "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", + "peer": true, + "engines": { + "node": ">=12" + } }, - "node_modules/@rollup/pluginutils": { - "version": "5.0.5", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", "dev": true, "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/create-cache-key-function": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", + "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", + "peer": true, "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "@jest/types": "^29.6.3" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "peer": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.0.tgz", - "integrity": "sha512-jwXtxYbRt1V+CdQSy6Z+uZti7JF5irRKF8hlKfEnF/xJpcNGuuiZMBvuoYM+x9sr9iWGnzrlM0+9hvQ1kgkf1w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "peer": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@manypkg/find-root": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@types/node": "^12.7.1", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" + } + }, + "node_modules/@manypkg/find-root/node_modules/@types/node": { + "version": "12.20.55", + "license": "MIT" + }, + "node_modules/@manypkg/find-root/node_modules/find-up": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/fs-extra": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/jsonfile": { + "version": "4.0.0", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@manypkg/find-root/node_modules/locate-path": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/p-limit": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@manypkg/find-root/node_modules/p-locate": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/universalify": { + "version": "0.1.2", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@manypkg/get-packages": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@changesets/types": "^4.0.1", + "@manypkg/find-root": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "^11.0.0", + "read-yaml-file": "^1.1.0" + } + }, + "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { + "version": "4.1.0", + "license": "MIT" + }, + "node_modules/@manypkg/get-packages/node_modules/fs-extra": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/get-packages/node_modules/jsonfile": { + "version": "4.0.0", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@manypkg/get-packages/node_modules/universalify": { + "version": "0.1.2", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@metamask/json-rpc-engine": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@metamask/json-rpc-engine/-/json-rpc-engine-8.0.2.tgz", + "integrity": "sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA==", + "dependencies": { + "@metamask/rpc-errors": "^6.2.1", + "@metamask/safe-event-emitter": "^3.0.0", + "@metamask/utils": "^8.3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@metamask/json-rpc-middleware-stream": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@metamask/json-rpc-middleware-stream/-/json-rpc-middleware-stream-7.0.2.tgz", + "integrity": "sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==", + "dependencies": { + "@metamask/json-rpc-engine": "^8.0.2", + "@metamask/safe-event-emitter": "^3.0.0", + "@metamask/utils": "^8.3.0", + "readable-stream": "^3.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@metamask/json-rpc-middleware-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@metamask/object-multiplex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@metamask/object-multiplex/-/object-multiplex-2.0.0.tgz", + "integrity": "sha512-+ItrieVZie3j2LfYE0QkdW3dsEMfMEp419IGx1zyeLqjRZ14iQUPRO0H6CGgfAAoC0x6k2PfCAGRwJUA9BMrqA==", + "dependencies": { + "once": "^1.4.0", + "readable-stream": "^3.6.2" + }, + "engines": { + "node": "^16.20 || ^18.16 || >=20" + } + }, + "node_modules/@metamask/object-multiplex/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@metamask/onboarding": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@metamask/onboarding/-/onboarding-1.0.1.tgz", + "integrity": "sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==", + "dependencies": { + "bowser": "^2.9.0" + } + }, + "node_modules/@metamask/providers": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@metamask/providers/-/providers-16.1.0.tgz", + "integrity": "sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==", + "dependencies": { + "@metamask/json-rpc-engine": "^8.0.1", + "@metamask/json-rpc-middleware-stream": "^7.0.1", + "@metamask/object-multiplex": "^2.0.0", + "@metamask/rpc-errors": "^6.2.1", + "@metamask/safe-event-emitter": "^3.1.1", + "@metamask/utils": "^8.3.0", + "detect-browser": "^5.2.0", + "extension-port-stream": "^3.0.0", + "fast-deep-equal": "^3.1.3", + "is-stream": "^2.0.0", + "readable-stream": "^3.6.2", + "webextension-polyfill": "^0.10.0" + }, + "engines": { + "node": "^18.18 || >=20" + } + }, + "node_modules/@metamask/providers/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@metamask/providers/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@metamask/rpc-errors": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@metamask/rpc-errors/-/rpc-errors-6.3.1.tgz", + "integrity": "sha512-ugDY7cKjF4/yH5LtBaOIKHw/AiGGSAmzptAUEiAEGr/78LwuzcXAxmzEQfSfMIfI+f9Djr8cttq1pRJJKfTuCg==", + "dependencies": { + "@metamask/utils": "^9.0.0", + "fast-safe-stringify": "^2.0.6" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@metamask/rpc-errors/node_modules/@metamask/utils": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-9.2.1.tgz", + "integrity": "sha512-/u663aUaB6+Xe75i3Mt/1cCljm41HDYIsna5oBrwGvgkY2zH7/9k9Zjd706cxoAbxN7QgLSVAReUiGnuxCuXrQ==", + "dependencies": { + "@ethereumjs/tx": "^4.2.0", + "@metamask/superstruct": "^3.1.0", + "@noble/hashes": "^1.3.1", + "@scure/base": "^1.1.3", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "pony-cause": "^2.1.10", + "semver": "^7.5.4", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@metamask/safe-event-emitter": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-3.1.1.tgz", + "integrity": "sha512-ihb3B0T/wJm1eUuArYP4lCTSEoZsClHhuWyfo/kMX3m/odpqNcPfsz5O2A3NT7dXCAgWPGDQGPqygCpgeniKMw==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@metamask/sdk": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@metamask/sdk/-/sdk-0.28.2.tgz", + "integrity": "sha512-pylk1uJAZYyO3HcNW/TNfII3+T+Yx6qrFYaC/HmuSIuRJeXsdZuExSbNQ236iQocIy3L7JjI+GQKbv3TbN+HQQ==", + "dependencies": { + "@metamask/onboarding": "^1.0.1", + "@metamask/providers": "16.1.0", + "@metamask/sdk-communication-layer": "0.28.2", + "@metamask/sdk-install-modal-web": "0.28.1", + "@types/dom-screen-wake-lock": "^1.0.0", + "@types/uuid": "^10.0.0", + "bowser": "^2.9.0", + "cross-fetch": "^4.0.0", + "debug": "^4.3.4", + "eciesjs": "^0.3.15", + "eth-rpc-errors": "^4.0.3", + "eventemitter2": "^6.4.7", + "i18next": "23.11.5", + "i18next-browser-languagedetector": "7.1.0", + "obj-multiplex": "^1.0.0", + "pump": "^3.0.0", + "qrcode-terminal-nooctal": "^0.12.1", + "react-native-webview": "^11.26.0", + "readable-stream": "^3.6.2", + "rollup-plugin-visualizer": "^5.9.2", + "socket.io-client": "^4.5.1", + "util": "^0.12.4", + "uuid": "^8.3.2" + }, + "peerDependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@metamask/sdk-install-modal-web": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@metamask/sdk-install-modal-web/-/sdk-install-modal-web-0.28.1.tgz", + "integrity": "sha512-mHkIjWTpYQMPDMtLEEtTVXhae4pEjy7jDBfV7497L0U3VCPQrBl/giZBwA6AgKEX1emYcM2d1WRHWR9N4YhyJA==", + "dependencies": { + "qr-code-styling": "^1.6.0-rc.1" + }, + "peerDependencies": { + "i18next": "23.11.5", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-native": "*" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@metamask/sdk/node_modules/@metamask/sdk-communication-layer": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@metamask/sdk-communication-layer/-/sdk-communication-layer-0.28.2.tgz", + "integrity": "sha512-kGx6qgP482DecPILnIS38bgxIjNransR3/Jh5Lfg9BXJLaXpq/MEGrjHGnJHAqCyfRymnd5cgexHtXJvQtRWQA==", + "dependencies": { + "bufferutil": "^4.0.8", + "date-fns": "^2.29.3", + "debug": "^4.3.4", + "utf-8-validate": "^5.0.2", + "uuid": "^8.3.2" + }, + "peerDependencies": { + "cross-fetch": "^4.0.0", + "eciesjs": "^0.3.16", + "eventemitter2": "^6.4.7", + "readable-stream": "^3.6.2", + "socket.io-client": "^4.5.1" + } + }, + "node_modules/@metamask/sdk/node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/@metamask/sdk/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@metamask/sdk/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@metamask/superstruct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@metamask/superstruct/-/superstruct-3.1.0.tgz", + "integrity": "sha512-N08M56HdOgBfRKkrgCMZvQppkZGcArEop3kixNEtVbJKm6P9Cfg0YkI6X0s1g78sNrj2fWUwvJADdZuzJgFttA==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@metamask/utils": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.5.0.tgz", + "integrity": "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==", + "dependencies": { + "@ethereumjs/tx": "^4.2.0", + "@metamask/superstruct": "^3.0.0", + "@noble/hashes": "^1.3.1", + "@scure/base": "^1.1.3", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "pony-cause": "^2.1.10", + "semver": "^7.5.4", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@microsoft/api-extractor": { + "version": "7.38.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor-model": "7.28.2", + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.61.0", + "@rushstack/rig-package": "0.5.1", + "@rushstack/ts-command-line": "4.17.1", + "colors": "~1.2.1", + "lodash": "~4.17.15", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "source-map": "~0.6.1", + "typescript": "~5.0.4" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.28.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.61.0" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "5.0.4", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.14.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.16.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "0.14.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { + "version": "1.19.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.24", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@floating-ui/react-dom": "^2.0.4", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.14.18", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + } + }, + "node_modules/@mui/lab": { + "version": "5.0.0-alpha.153", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/base": "5.0.0-beta.24", + "@mui/system": "^5.14.18", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", + "clsx": "^2.0.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material": ">=5.10.11", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "5.14.18", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/base": "5.0.0-beta.24", + "@mui/core-downloads-tracker": "^5.14.18", + "@mui/system": "^5.14.18", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", + "@types/react-transition-group": "^4.4.8", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "5.14.18", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/utils": "^5.14.18", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.14.18", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.14.18", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/private-theming": "^5.14.18", + "@mui/styled-engine": "^5.14.18", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.9", + "license": "MIT", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.14.18", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@types/prop-types": "^15.7.10", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@napi-rs/snappy-linux-x64-gnu": { + "version": "7.2.2", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-linux-x64-musl": { + "version": "7.2.2", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/env": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.1.0.tgz", + "integrity": "sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw==" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "14.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "7.1.7" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.0.tgz", + "integrity": "sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.0.tgz", + "integrity": "sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.0.tgz", + "integrity": "sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.0.tgz", + "integrity": "sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz", + "integrity": "sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.0.tgz", + "integrity": "sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.0.tgz", + "integrity": "sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.0.tgz", + "integrity": "sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.0.tgz", + "integrity": "sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/ed25519": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-2.1.0.tgz", + "integrity": "sha512-KM4qTyXPinyCgMzeYJH/UudpdL+paJXtY3CHtHYZQtBkS8MZoPr4rOikZllIutJe0d06QDQKisyn02gxZ8TcQA==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "license": "ISC", + "optional": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "license": "MIT", + "optional": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@octokit/app": { + "version": "13.1.8", + "license": "MIT", + "dependencies": { + "@octokit/auth-app": "^4.0.13", + "@octokit/auth-unauthenticated": "^3.0.0", + "@octokit/core": "^4.0.0", + "@octokit/oauth-app": "^4.0.7", + "@octokit/plugin-paginate-rest": "^6.0.0", + "@octokit/types": "^9.0.0", + "@octokit/webhooks": "^10.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/auth-app": { + "version": "4.0.13", + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-app": "^5.0.0", + "@octokit/auth-oauth-user": "^2.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "deprecation": "^2.3.1", + "lru-cache": "^9.0.0", + "universal-github-app-jwt": "^1.1.1", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/auth-app/node_modules/lru-cache": { + "version": "9.1.2", + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/@octokit/auth-oauth-app": { + "version": "5.0.6", + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-device": "^4.0.0", + "@octokit/auth-oauth-user": "^2.0.0", + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "@types/btoa-lite": "^1.0.0", + "btoa-lite": "^1.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/auth-oauth-device": { + "version": "4.0.5", + "license": "MIT", + "dependencies": { + "@octokit/oauth-methods": "^2.0.0", + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/auth-oauth-user": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-device": "^4.0.0", + "@octokit/oauth-methods": "^2.0.0", + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "btoa-lite": "^1.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/auth-token": { + "version": "3.0.4", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/auth-unauthenticated": { + "version": "3.0.5", + "license": "MIT", + "dependencies": { + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/core": { + "version": "4.2.4", + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/endpoint": { + "version": "7.0.6", + "license": "MIT", + "dependencies": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/graphql": { + "version": "5.0.6", + "license": "MIT", + "dependencies": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/oauth-app": { + "version": "4.2.4", + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-app": "^5.0.0", + "@octokit/auth-oauth-user": "^2.0.0", + "@octokit/auth-unauthenticated": "^3.0.0", + "@octokit/core": "^4.0.0", + "@octokit/oauth-authorization-url": "^5.0.0", + "@octokit/oauth-methods": "^2.0.0", + "@types/aws-lambda": "^8.10.83", + "fromentries": "^1.3.1", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/oauth-authorization-url": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/oauth-methods": { + "version": "2.0.6", + "license": "MIT", + "dependencies": { + "@octokit/oauth-authorization-url": "^5.0.0", + "@octokit/request": "^6.2.3", + "@octokit/request-error": "^3.0.3", + "@octokit/types": "^9.0.0", + "btoa-lite": "^1.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "18.1.1", + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "6.1.2", + "license": "MIT", + "dependencies": { + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=4" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "7.2.3", + "license": "MIT", + "dependencies": { + "@octokit/types": "^10.0.0" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "10.0.0", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "node_modules/@octokit/plugin-retry": { + "version": "4.1.6", + "license": "MIT", + "dependencies": { + "@octokit/types": "^9.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-throttling": { + "version": "5.2.3", + "license": "MIT", + "dependencies": { + "@octokit/types": "^9.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": "^4.0.0" + } + }, + "node_modules/@octokit/request": { + "version": "6.2.8", + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/request-error": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/tsconfig": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/@octokit/types": { + "version": "9.3.2", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "node_modules/@octokit/webhooks": { + "version": "10.9.2", + "license": "MIT", + "dependencies": { + "@octokit/request-error": "^3.0.0", + "@octokit/webhooks-methods": "^3.0.0", + "@octokit/webhooks-types": "6.11.0", + "aggregate-error": "^3.1.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/webhooks-methods": { + "version": "3.0.3", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/webhooks-types": { + "version": "6.11.0", + "license": "MIT" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@react-native-community/cli": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-14.0.0.tgz", + "integrity": "sha512-KwMKJB5jsDxqOhT8CGJ55BADDAYxlYDHv5R/ASQlEcdBEZxT0zZmnL0iiq2VqzETUy+Y/Nop+XDFgqyoQm0C2w==", + "peer": true, + "dependencies": { + "@react-native-community/cli-clean": "14.0.0", + "@react-native-community/cli-config": "14.0.0", + "@react-native-community/cli-debugger-ui": "14.0.0", + "@react-native-community/cli-doctor": "14.0.0", + "@react-native-community/cli-server-api": "14.0.0", + "@react-native-community/cli-tools": "14.0.0", + "@react-native-community/cli-types": "14.0.0", + "chalk": "^4.1.2", + "commander": "^9.4.1", + "deepmerge": "^4.3.0", + "execa": "^5.0.0", + "find-up": "^5.0.0", + "fs-extra": "^8.1.0", + "graceful-fs": "^4.1.3", + "prompts": "^2.4.2", + "semver": "^7.5.2" + }, + "bin": { + "rnc-cli": "build/bin.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native-community/cli-clean": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-14.0.0.tgz", + "integrity": "sha512-kvHthZTNur/wLLx8WL5Oh+r04zzzFAX16r8xuaLhu9qGTE6Th1JevbsIuiQb5IJqD8G/uZDKgIZ2a0/lONcbJg==", + "peer": true, + "dependencies": { + "@react-native-community/cli-tools": "14.0.0", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "fast-glob": "^3.3.2" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/@react-native-community/cli-clean/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "peer": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "peer": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-config": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-14.0.0.tgz", + "integrity": "sha512-2Nr8KR+dgn1z+HLxT8piguQ1SoEzgKJnOPQKE1uakxWaRFcQ4LOXgzpIAscYwDW6jmQxdNqqbg2cRUoOS7IMtQ==", + "peer": true, + "dependencies": { + "@react-native-community/cli-tools": "14.0.0", + "chalk": "^4.1.2", + "cosmiconfig": "^9.0.0", + "deepmerge": "^4.3.0", + "fast-glob": "^3.3.2", + "joi": "^17.2.1" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/@react-native-community/cli-config/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "peer": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@react-native-community/cli-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-debugger-ui": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-14.0.0.tgz", + "integrity": "sha512-JpfzILfU7eKE9+7AMCAwNJv70H4tJGVv3ZGFqSVoK1YHg5QkVEGsHtoNW8AsqZRS6Fj4os+Fmh+r+z1L36sPmg==", + "peer": true, + "dependencies": { + "serve-static": "^1.13.1" + } + }, + "node_modules/@react-native-community/cli-doctor": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-14.0.0.tgz", + "integrity": "sha512-in6jylHjaPUaDzV+JtUblh8m9JYIHGjHOf6Xn57hrmE5Zwzwuueoe9rSMHF1P0mtDgRKrWPzAJVejElddfptWA==", + "peer": true, + "dependencies": { + "@react-native-community/cli-config": "14.0.0", + "@react-native-community/cli-platform-android": "14.0.0", + "@react-native-community/cli-platform-apple": "14.0.0", + "@react-native-community/cli-platform-ios": "14.0.0", + "@react-native-community/cli-tools": "14.0.0", + "chalk": "^4.1.2", + "command-exists": "^1.2.8", + "deepmerge": "^4.3.0", + "envinfo": "^7.13.0", + "execa": "^5.0.0", + "node-stream-zip": "^1.9.1", + "ora": "^5.4.1", + "semver": "^7.5.2", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1", + "yaml": "^2.2.1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "peer": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "peer": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/@react-native-community/cli-doctor/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "peer": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "peer": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "peer": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "peer": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "peer": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "peer": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/yaml": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@react-native-community/cli-platform-android": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-14.0.0.tgz", + "integrity": "sha512-nt7yVz3pGKQXnVa5MAk7zR+1n41kNKD3Hi2OgybH5tVShMBo7JQoL2ZVVH6/y/9wAwI/s7hXJgzf1OIP3sMq+Q==", + "peer": true, + "dependencies": { + "@react-native-community/cli-tools": "14.0.0", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "fast-glob": "^3.3.2", + "fast-xml-parser": "^4.2.4", + "logkitty": "^0.7.1" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "peer": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "peer": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-apple": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-apple/-/cli-platform-apple-14.0.0.tgz", + "integrity": "sha512-WniJL8vR4MeIsjqio2hiWWuUYUJEL3/9TDL5aXNwG68hH3tYgK3742+X9C+vRzdjTmf5IKc/a6PwLsdplFeiwQ==", + "peer": true, + "dependencies": { + "@react-native-community/cli-tools": "14.0.0", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "fast-glob": "^3.3.2", + "fast-xml-parser": "^4.2.4", + "ora": "^5.4.1" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "peer": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "peer": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "peer": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "peer": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "peer": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "peer": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "peer": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-ios": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-14.0.0.tgz", + "integrity": "sha512-8kxGv7mZ5nGMtueQDq+ndu08f0ikf3Zsqm3Ix8FY5KCXpSgP14uZloO2GlOImq/zFESij+oMhCkZJGggpWpfAw==", + "peer": true, + "dependencies": { + "@react-native-community/cli-platform-apple": "14.0.0" + } + }, + "node_modules/@react-native-community/cli-server-api": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-14.0.0.tgz", + "integrity": "sha512-A0FIsj0QCcDl1rswaVlChICoNbfN+mkrKB5e1ab5tOYeZMMyCHqvU+eFvAvXjHUlIvVI+LbqCkf4IEdQ6H/2AQ==", + "peer": true, + "dependencies": { + "@react-native-community/cli-debugger-ui": "14.0.0", + "@react-native-community/cli-tools": "14.0.0", + "compression": "^1.7.1", + "connect": "^3.6.5", + "errorhandler": "^1.5.1", + "nocache": "^3.0.1", + "pretty-format": "^26.6.2", + "serve-static": "^1.13.1", + "ws": "^6.2.3" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "peer": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/@types/yargs": { + "version": "15.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", + "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", + "peer": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/@react-native-community/cli-server-api/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "peer": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "peer": true + }, + "node_modules/@react-native-community/cli-server-api/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "peer": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/@react-native-community/cli-tools": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-14.0.0.tgz", + "integrity": "sha512-L7GX5hyYYv0ZWbAyIQKzhHuShnwDqlKYB0tqn57wa5riGCaxYuRPTK+u4qy+WRCye7+i8M4Xj6oQtSd4z0T9cA==", + "peer": true, + "dependencies": { + "appdirsjs": "^1.2.4", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "find-up": "^5.0.0", + "mime": "^2.4.1", + "open": "^6.2.0", + "ora": "^5.4.1", + "semver": "^7.5.2", + "shell-quote": "^1.7.3", + "sudo-prompt": "^9.0.0" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "peer": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "peer": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/@react-native-community/cli-tools/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "peer": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "peer": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "peer": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "peer": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "peer": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-types": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-14.0.0.tgz", + "integrity": "sha512-CMUevd1pOWqvmvutkUiyQT2lNmMHUzSW7NKc1xvHgg39NjbS58Eh2pMzIUP85IwbYNeocfYc3PH19vA/8LnQtg==", + "peer": true, + "dependencies": { + "joi": "^17.2.1" + } + }, + "node_modules/@react-native-community/cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/@react-native-community/cli/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/@react-native-community/cli/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@react-native-community/cli/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "peer": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@react-native-community/cli/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@react-native-community/cli/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "peer": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@react-native/assets-registry": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.75.2.tgz", + "integrity": "sha512-P1dLHjpUeC0AIkDHRYcx0qLMr+p92IPWL3pmczzo6T76Qa9XzruQOYy0jittxyBK91Csn6HHQ/eit8TeXW8MVw==", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/babel-plugin-codegen": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.75.2.tgz", + "integrity": "sha512-BIKVh2ZJPkzluUGgCNgpoh6NTHgX8j04FCS0Z/rTmRJ66hir/EUBl8frMFKrOy/6i4VvZEltOWB5eWfHe1AYgw==", + "peer": true, + "dependencies": { + "@react-native/codegen": "0.75.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/babel-preset": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.75.2.tgz", + "integrity": "sha512-mprpsas+WdCEMjQZnbDiAC4KKRmmLbMB+o/v4mDqKlH4Mcm7RdtP5t80MZGOVCHlceNp1uEIpXywx69DNwgbgg==", + "peer": true, + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.18.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-async-generator-functions": "^7.24.3", + "@babel/plugin-transform-async-to-generator": "^7.20.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.20.0", + "@babel/plugin-transform-flow-strip-types": "^7.20.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", + "@babel/plugin-transform-numeric-separator": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.5", + "@babel/plugin-transform-optional-catch-binding": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.5", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-regenerator": "^7.20.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "@react-native/babel-plugin-codegen": "0.75.2", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/codegen": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.75.2.tgz", + "integrity": "sha512-OkWdbtO2jTkfOXfj3ibIL27rM6LoaEuApOByU2G8X+HS6v9U87uJVJlMIRWBDmnxODzazuHwNVA2/wAmSbucaw==", + "peer": true, + "dependencies": { + "@babel/parser": "^7.20.0", + "glob": "^7.1.1", + "hermes-parser": "0.22.0", + "invariant": "^2.2.4", + "jscodeshift": "^0.14.0", + "mkdirp": "^0.5.1", + "nullthrows": "^1.1.1", + "yargs": "^17.6.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + } + }, + "node_modules/@react-native/codegen/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/@react-native/community-cli-plugin": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.75.2.tgz", + "integrity": "sha512-/tz0bzVja4FU0aAimzzQ7iYR43peaD6pzksArdrrGhlm8OvFYAQPOYSNeIQVMSarwnkNeg1naFKaeYf1o3++yA==", + "peer": true, + "dependencies": { + "@react-native-community/cli-server-api": "14.0.0-alpha.11", + "@react-native-community/cli-tools": "14.0.0-alpha.11", + "@react-native/dev-middleware": "0.75.2", + "@react-native/metro-babel-transformer": "0.75.2", + "chalk": "^4.0.0", + "execa": "^5.1.1", + "metro": "^0.80.3", + "metro-config": "^0.80.3", + "metro-core": "^0.80.3", + "node-fetch": "^2.2.0", + "querystring": "^0.2.1", + "readline": "^1.3.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "peer": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/@react-native-community/cli-debugger-ui": { + "version": "14.0.0-alpha.11", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-14.0.0-alpha.11.tgz", + "integrity": "sha512-0wCNQxhCniyjyMXgR1qXliY180y/2QbvoiYpp2MleGQADr5M1b8lgI4GoyADh5kE+kX3VL0ssjgyxpmbpCD86A==", + "peer": true, + "dependencies": { + "serve-static": "^1.13.1" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/@react-native-community/cli-server-api": { + "version": "14.0.0-alpha.11", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-14.0.0-alpha.11.tgz", + "integrity": "sha512-I7YeYI7S5wSxnQAqeG8LNqhT99FojiGIk87DU0vTp6U8hIMLcA90fUuBAyJY38AuQZ12ZJpGa8ObkhIhWzGkvg==", + "peer": true, + "dependencies": { + "@react-native-community/cli-debugger-ui": "14.0.0-alpha.11", + "@react-native-community/cli-tools": "14.0.0-alpha.11", + "compression": "^1.7.1", + "connect": "^3.6.5", + "errorhandler": "^1.5.1", + "nocache": "^3.0.1", + "pretty-format": "^26.6.2", + "serve-static": "^1.13.1", + "ws": "^6.2.3" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/@react-native-community/cli-tools": { + "version": "14.0.0-alpha.11", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-14.0.0-alpha.11.tgz", + "integrity": "sha512-HQCfVnX9aqRdKdLxmQy4fUAUo+YhNGlBV7ZjOayPbuEGWJ4RN+vSy0Cawk7epo7hXd6vKzc7P7y3HlU6Kxs7+w==", + "peer": true, + "dependencies": { + "appdirsjs": "^1.2.4", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "find-up": "^5.0.0", + "mime": "^2.4.1", + "open": "^6.2.0", + "ora": "^5.4.1", + "semver": "^7.5.2", + "shell-quote": "^1.7.3", + "sudo-prompt": "^9.0.0" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/@types/yargs": { + "version": "15.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", + "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", + "peer": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "peer": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "peer": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/@react-native/community-cli-plugin/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "peer": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "peer": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "peer": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "peer": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "peer": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "peer": true + }, + "node_modules/@react-native/community-cli-plugin/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "peer": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "peer": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/@react-native/debugger-frontend": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.75.2.tgz", + "integrity": "sha512-qIC6mrlG8RQOPaYLZQiJwqnPchAVGnHWcVDeQxPMPLkM/D5+PC8tuKWYOwgLcEau3RZlgz7QQNk31Qj2/OJG6Q==", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/dev-middleware": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.75.2.tgz", + "integrity": "sha512-fTC5m2uVjYp1XPaIJBFgscnQjPdGVsl96z/RfLgXDq0HBffyqbg29ttx6yTCx7lIa9Gdvf6nKQom+e+Oa4izSw==", + "peer": true, + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.75.2", + "chrome-launcher": "^0.15.2", + "chromium-edge-launcher": "^0.2.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "node-fetch": "^2.2.0", + "nullthrows": "^1.1.1", + "open": "^7.0.3", + "selfsigned": "^2.4.1", + "serve-static": "^1.13.1", + "ws": "^6.2.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true + }, + "node_modules/@react-native/dev-middleware/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "peer": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "peer": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/@react-native/gradle-plugin": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.75.2.tgz", + "integrity": "sha512-AELeAOCZi3B2vE6SeN+mjpZjjqzqa76yfFBB3L3f3NWiu4dm/YClTGOj+5IVRRgbt8LDuRImhDoaj7ukheXr4Q==", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/js-polyfills": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.75.2.tgz", + "integrity": "sha512-AtLd3mbiE+FXK2Ru3l2NFOXDhUvzdUsCP4qspUw0haVaO/9xzV97RVD2zz0lur2f/LmZqQ2+KXyYzr7048b5iw==", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/metro-babel-transformer": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.75.2.tgz", + "integrity": "sha512-EygglCCuOub2sZ00CSIiEekCXoGL2XbOC6ssOB47M55QKvhdPG/0WBQXvmOmiN42uZgJK99Lj749v4rB0PlPIQ==", + "peer": true, + "dependencies": { + "@babel/core": "^7.20.0", + "@react-native/babel-preset": "0.75.2", + "hermes-parser": "0.22.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/normalize-colors": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.75.2.tgz", + "integrity": "sha512-nPwWJFtsqNFS/qSG9yDOiSJ64mjG7RCP4X/HXFfyWzCM1jq49h/DYBdr+c3e7AvTKGIdy0gGT3vgaRUHZFVdUQ==", + "peer": true + }, + "node_modules/@react-native/virtualized-lists": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.75.2.tgz", + "integrity": "sha512-pD5SVCjxc8k+JdoyQ+IlulBTEqJc3S4KUKsmv5zqbNCyETB0ZUvd4Su7bp+lLF6ALxx6KKmbGk8E3LaWEjUFFQ==", + "peer": true, + "dependencies": { + "invariant": "^2.2.4", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/react": "^18.2.6", + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.0.tgz", + "integrity": "sha512-jwXtxYbRt1V+CdQSy6Z+uZti7JF5irRKF8hlKfEnF/xJpcNGuuiZMBvuoYM+x9sr9iWGnzrlM0+9hvQ1kgkf1w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] }, "node_modules/@rollup/rollup-android-arm64": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.0.tgz", "integrity": "sha512-fI9nduZhCccjzlsA/OuAwtFGWocxA4gqXGTLvOyiF8d+8o0fZUeSztixkYjcGq1fGZY3Tkq4yRvHPFxU+jdZ9Q==", "cpu": [ - "arm64" + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.0.tgz", + "integrity": "sha512-BcnSPRM76/cD2gQC+rQNGBN6GStBs2pl/FpweW8JYuz5J/IEa0Fr4AtrPv766DB/6b2MZ/AfSIOSGw3nEIP8SA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.0.tgz", + "integrity": "sha512-LDyFB9GRolGN7XI6955aFeI3wCdCUszFWumWU0deHA8VpR3nWRrjG6GtGjBrQxQKFevnUTHKCfPR4IvrW3kCgQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.0.tgz", + "integrity": "sha512-ygrGVhQP47mRh0AAD0zl6QqCbNsf0eTo+vgwkY6LunBcg0f2Jv365GXlDUECIyoXp1kKwL5WW6rsO429DBY/bA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.0.tgz", + "integrity": "sha512-x+uJ6MAYRlHGe9wi4HQjxpaKHPM3d3JjqqCkeC5gpnnI6OWovLdXTpfa8trjxPLnWKyBsSi5kne+146GAxFt4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.0.tgz", + "integrity": "sha512-nrRw8ZTQKg6+Lttwqo6a2VxR9tOroa2m91XbdQ2sUUzHoedXlsyvY1fN4xWdqz8PKmf4orDwejxXHjh7YBGUCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.0.tgz", + "integrity": "sha512-xV0d5jDb4aFu84XKr+lcUJ9y3qpIWhttO3Qev97z8DKLXR62LC3cXT/bMZXrjLF9X+P5oSmJTzAhqwUbY96PnA==", + "cpu": [ + "ppc64le" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.0.tgz", + "integrity": "sha512-SDDhBQwZX6LPRoPYjAZWyL27LbcBo7WdBFWJi5PI9RPCzU8ijzkQn7tt8NXiXRiFMJCVpkuMkBf4OxSxVMizAw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.0.tgz", + "integrity": "sha512-RxB/qez8zIDshNJDufYlTT0ZTVut5eCpAZ3bdXDU9yTxBzui3KhbGjROK2OYTTor7alM7XBhssgoO3CZ0XD3qA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.9.6", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.9.6", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.0.tgz", + "integrity": "sha512-Fq52EYb0riNHLBTAcL0cun+rRwyZ10S9vKzhGKKgeD+XbwunszSY0rVMco5KbOsTlwovP2rTOkiII/fQ4ih/zQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.0.tgz", + "integrity": "sha512-e/PBHxPdJ00O9p5Ui43+vixSgVf4NlLsmV6QneGERJ3lnjIua/kim6PRFe3iDueT1rQcgSkYP8ZBBXa/h4iPvw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.0.tgz", + "integrity": "sha512-aGg7iToJjdklmxlUlJh/PaPNa4PmqHfyRMLunbL3eaMO0gp656+q1zOKkpJ/CVe9CryJv6tAN1HDoR8cNGzkag==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rosen-bridge/abstract-extractor": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-extractor/-/abstract-extractor-0.1.0.tgz", + "integrity": "sha512-GYyPR5oAhGjrTHhS8gvNkdGCzaOYkp2FuPa8mCfl/BBMCrifmKx6n/yvDLrbhgurbOKx3MAnMJK5sLf63wAusg==", + "dependencies": { + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-clients/ergo-explorer": "^1.1.1", + "@rosen-clients/ergo-node": "^1.1.1", + "lodash-es": "^4.17.21" + }, + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rosen-bridge/abstract-extractor/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + }, + "node_modules/@rosen-bridge/abstract-logger": { + "version": "0.3.0", + "license": "GPL-3.0" + }, + "node_modules/@rosen-bridge/address-codec": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-0.2.1.tgz", + "integrity": "sha512-W7d7W0rmciMJMuq4KYh+6EeiB9dCE9RBTzu5xeFd3BLHjMnYpt1/J6vdZeXpFFySNRfxclFZwU94B5q3l6CV8Q==", + "dependencies": { + "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", + "bitcoinjs-lib": "^6.1.5", + "ergo-lib-wasm-nodejs": "^0.24.1" + }, + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rosen-bridge/bitcoin-esplora-scanner": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@rosen-bridge/bitcoin-esplora-scanner/-/bitcoin-esplora-scanner-0.1.5.tgz", + "integrity": "sha512-p6ouaCnP+jPzCkddk8IMtQIJ9XAXjc136miTeLvLDFQtis9oiYQnboNd+X46nY6BmvgN5hDa31vtKzLwNAhqKQ==", + "dependencies": { + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/scanner": "^4.0.0", + "axios": "^1.6.8" + }, + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rosen-bridge/bitcoin-esplora-scanner/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + }, + "node_modules/@rosen-bridge/bitcoin-observation-extractor": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/bitcoin-observation-extractor/-/bitcoin-observation-extractor-3.0.0.tgz", + "integrity": "sha512-w/bT36W+/0x22f7dJ2KCeF96AMMSvJ3FERcb6AB8v6c7GRwL3iHXnDDmJkj95tXrGqd1hDORJEcclDAeOlNjuQ==", + "dependencies": { + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/bitcoin-esplora-scanner": "^0.1.5", + "@rosen-bridge/bitcoin-rpc-scanner": "^0.1.1", + "@rosen-bridge/observation-extractor": "^4.4.4", + "@rosen-bridge/rosen-extractor": "^5.0.1", + "@rosen-bridge/tokens": "^1.0.0", + "typeorm": "^0.3.20" + }, + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rosen-bridge/bitcoin-observation-extractor/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + }, + "node_modules/@rosen-bridge/bitcoin-rpc-scanner": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@rosen-bridge/bitcoin-rpc-scanner/-/bitcoin-rpc-scanner-0.1.1.tgz", + "integrity": "sha512-2CplgxHedelAnHNHB/ij/0pio6uZVHinV08S2EHaF4oyH32DXiHi66beC6iwYrwvd+03TmQo+Na//h2QZtxXJA==", + "dependencies": { + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/scanner": "^4.0.0", + "axios": "^1.6.8" + }, + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rosen-bridge/bitcoin-rpc-scanner/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + }, + "node_modules/@rosen-bridge/bitcoin-utxo-selection": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/bitcoin-utxo-selection/-/bitcoin-utxo-selection-0.2.0.tgz", + "integrity": "sha512-8z/7HNXfkTcWObLrZGDf9TJHhfmodUbgrPP77RAbcJAk+K8vA7ooP8X1Vi1LRbjliO4TlIpGAwPq1hyPc9++6A==", + "dependencies": { + "@rosen-bridge/abstract-logger": "^1.0.0" + }, + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rosen-bridge/bitcoin-utxo-selection/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + }, + "node_modules/@rosen-bridge/cardano-utxo-selection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/cardano-utxo-selection/-/cardano-utxo-selection-1.1.0.tgz", + "integrity": "sha512-f9cBKy/pj2cNUmZPr8dyCil6n8BYaVDKIBJtKVmm9vThhH/8VpHuVS69INMGhsRPdTRwyqUNy8lsrlxfwjKhjw==", + "dependencies": { + "@rosen-bridge/abstract-logger": "^1.0.0" + } + }, + "node_modules/@rosen-bridge/cardano-utxo-selection/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + }, + "node_modules/@rosen-bridge/changeset-formatter": { + "version": "0.1.0", + "dev": true, + "license": "GPL-3.0", + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rosen-bridge/cli": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/cli/-/cli-0.2.0.tgz", + "integrity": "sha512-ff/Vgn0e9b+IRRa7gJyhrMJcAbGcde5jYyZi2tv667cCeJeZxFkVdTxyEpyPeGX9vjBu8m21qi0WCd0o7d/rNg==", + "dependencies": { + "@rosen-bridge/tss": "^1.2.0", + "@rosen-bridge/utils": "^0.0.1", + "blakejs": "^1.2.1", + "chalk": "^5.2.0", + "ora": "^6.3.0", + "yargs": "^17.7.2" + }, + "bin": { + "cli": "dist/bin/index.js" + } + }, + "node_modules/@rosen-bridge/ergo-box-selection": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/ergo-box-selection/-/ergo-box-selection-0.1.0.tgz", + "integrity": "sha512-TQSovVSltLqTBgqhcNTF93MofZs4pLItKch92DiGdEQcTyKRNOBfIo7qKMcR2VQu1KP71YAa3PpQkXJgdXC23A==", + "dependencies": { + "@rosen-bridge/abstract-logger": "^0.3.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@rosen-bridge/extended-typeorm": { + "version": "0.0.1", + "license": "GPL-3.0", + "dependencies": { + "async-mutex": "^0.4.0", + "typeorm": "^0.3.12" + }, + "peerDependencies": { + "sqlite3": "^5.1.6" + } + }, + "node_modules/@rosen-bridge/guard-app": { + "resolved": "apps/guard", + "link": true + }, + "node_modules/@rosen-bridge/icons": { + "resolved": "packages/icons", + "link": true + }, + "node_modules/@rosen-bridge/json-bigint": { + "version": "0.1.0", + "license": "GPL-3.0", + "dependencies": { + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@rosen-bridge/logger-interface": { + "version": "0.1.0", + "license": "GPL-3.0" + }, + "node_modules/@rosen-bridge/minimum-fee": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rosen-bridge/minimum-fee/-/minimum-fee-2.0.1.tgz", + "integrity": "sha512-PEEmemRWYv2xkARxbg51KleAJtGzetZHFANeeHa2qJdZtFisUzZmqRKOB1VCIn1AW0lDrFeY02Rd8e4QzFfPcw==", + "dependencies": { + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/json-bigint": "^0.1.0", + "@rosen-clients/ergo-explorer": "^1.1.1", + "@rosen-clients/ergo-node": "^1.1.1", + "ergo-lib-wasm-nodejs": "^0.24.1" + }, + "engines": { + "node": ">=18.16.1" + } + }, + "node_modules/@rosen-bridge/minimum-fee/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + }, + "node_modules/@rosen-bridge/observation-extractor": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@rosen-bridge/observation-extractor/-/observation-extractor-4.4.4.tgz", + "integrity": "sha512-7DM0FUY5lsANL9r8xo4qvUW1+v4wwF5ym+Ky+UzXakUmHMKPy7fx3CWxC+uPfWMfRgvio1SUTGFfE+jagLGMJA==", + "dependencies": { + "@cardano-ogmios/schema": "^6.0.3", + "@rosen-bridge/abstract-extractor": "^0.1.0", + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/rosen-extractor": "^5.0.0", + "@rosen-bridge/scanner": "^4.0.0", + "@rosen-bridge/tokens": "^1.0.0", + "blakejs": "^1.2.1", + "ergo-lib-wasm-nodejs": "^0.24.1", + "lodash-es": "^4.17.21", + "reflect-metadata": "^0.1.13", + "sqlite3": "^5.0.9", + "typeorm": "^0.3.20" + } + }, + "node_modules/@rosen-bridge/observation-extractor/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + }, + "node_modules/@rosen-bridge/rosen-app": { + "resolved": "apps/rosen", + "link": true + }, + "node_modules/@rosen-bridge/rosen-extractor": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@rosen-bridge/rosen-extractor/-/rosen-extractor-5.0.1.tgz", + "integrity": "sha512-+2i2/1fFodJSrTsaXEKOY60/lBUlpxoAxrwfW1pnxIHA5aATAOqXunk0QJJCMPiSUVhfzFa0vxZN3ZjCWROfnQ==", + "dependencies": { + "@blockfrost/blockfrost-js": "^5.4.0", + "@cardano-ogmios/schema": "^6.0.3", + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/address-codec": "^0.2.1", + "@rosen-bridge/json-bigint": "^0.1.0", + "@rosen-bridge/tokens": "^1.0.0", + "bitcoinjs-lib": "^6.1.5", + "ergo-lib-wasm-nodejs": "^0.24.1", + "ethers": "^6.11.1", + "json-bigint": "^1.0.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/@rosen-bridge/rosen-extractor/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + }, + "node_modules/@rosen-bridge/rosen-service": { + "resolved": "apps/rosen-service", + "link": true + }, + "node_modules/@rosen-bridge/scanner": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/scanner/-/scanner-4.0.0.tgz", + "integrity": "sha512-ZHFRfsv3YRyFEZY4VzEEeHRJm0bsAiocaq0HNuWOubSHydiaLra62NUfI1mdNDU+ql5c+JyE+cmv/1zm7tdPaw==", + "dependencies": { + "@apollo/client": "^3.8.7", + "@blockfrost/blockfrost-js": "^5.4.0", + "@cardano-ogmios/client": "^6.3.0", + "@cardano-ogmios/schema": "^6.3.0", + "@rosen-bridge/abstract-extractor": "^0.1.0", + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/json-bigint": "^0.1.0", + "@rosen-clients/ergo-explorer": "^1.1.1", + "@rosen-clients/ergo-node": "^1.1.1", + "await-semaphore": "^0.1.3", + "axios": "^1.6.8", + "cross-fetch": "^4.0.0", + "lodash-es": "^4.17.21", + "reflect-metadata": "^0.1.13", + "sqlite3": "^5.0.9", + "typeorm": "^0.3.20" + } + }, + "node_modules/@rosen-bridge/scanner/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + }, + "node_modules/@rosen-bridge/scanner/node_modules/cross-fetch": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/@rosen-bridge/shared-contexts": { + "resolved": "packages/shared-contexts", + "link": true + }, + "node_modules/@rosen-bridge/tokens": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rosen-bridge/tokens/-/tokens-1.2.1.tgz", + "integrity": "sha512-sWn2XMQvzLKRZTlw3mlZZWLGy81XzFEJuLu/WBPq0EyHy2eXFSOacID7uwvD+EIoldfwwraX1bv/+u3gY0gKHw==" + }, + "node_modules/@rosen-bridge/tss": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/tss/-/tss-1.2.0.tgz", + "integrity": "sha512-H6yg4ClUF+zFNilchIOt7KSi3G7LS883V52ql8PcjKHz5MZl2XIf1rRjU82i2PCg1mfPOKsAu+nU8FMLcsTNHA==", + "dependencies": { + "@noble/ed25519": "^2.0.0", + "@noble/hashes": "^1.3.1", + "@rosen-bridge/abstract-logger": "^0.3.0", + "await-semaphore": "^0.1.3", + "axios": "^1.4.0", + "blakejs": "^1.2.1", + "secp256k1": "^4.0.3" + } + }, + "node_modules/@rosen-bridge/ui-kit": { + "resolved": "packages/ui-kit", + "link": true + }, + "node_modules/@rosen-bridge/utils": { + "version": "0.0.1", + "license": "GPL-3.0", + "dependencies": { + "download": "^8.0.0", + "octokit": "^2.0.14" + } + }, + "node_modules/@rosen-bridge/watcher-app": { + "resolved": "apps/watcher", + "link": true + }, + "node_modules/@rosen-bridge/watcher-data-extractor": { + "version": "4.2.2", + "license": "GPL-3.0", + "dependencies": { + "@rosen-bridge/logger-interface": "^0.1.0", + "@rosen-bridge/scanner": "^3.2.2", + "@rosen-clients/ergo-explorer": "^1.0.3", + "@types/lodash-es": "^4.17.6", + "blakejs": "^1.2.1", + "ergo-lib-wasm-nodejs": "^0.24.1", + "json-bigint": "^1.0.0", + "lodash-es": "^4.17.21", + "pg": "^8.10.0", + "reflect-metadata": "^0.1.13", + "sqlite3": "^5.0.9", + "typeorm": "^0.3.7" + } + }, + "node_modules/@rosen-bridge/watcher-data-extractor/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + }, + "node_modules/@rosen-bridge/watcher-data-extractor/node_modules/@rosen-bridge/scanner": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@rosen-bridge/scanner/-/scanner-3.2.9.tgz", + "integrity": "sha512-+1Z+62WhDWnjLkT+ZhFsHDj264GuJL1Wbcp6uS0K3Sm8fuxdNSJj7dVlaG5o9nf0RfvWutY6GkSEIY8wiIzcCg==", + "dependencies": { + "@apollo/client": "^3.8.7", + "@blockfrost/blockfrost-js": "^5.4.0", + "@cardano-ogmios/client": "^6.3.0", + "@cardano-ogmios/schema": "^6.3.0", + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/json-bigint": "^0.1.0", + "@rosen-clients/ergo-explorer": "^1.1.1", + "@rosen-clients/ergo-node": "^1.1.1", + "await-semaphore": "^0.1.3", + "axios": "^1.6.8", + "cross-fetch": "^4.0.0", + "reflect-metadata": "^0.1.13", + "sqlite3": "^5.0.9", + "typeorm": "^0.3.20" + } + }, + "node_modules/@rosen-bridge/watcher-data-extractor/node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/@rosen-bridge/winston-logger": { + "version": "0.2.1", + "license": "GPL-3.0", + "dependencies": { + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/json-bigint": "^0.1.0", + "winston": "^3.10.0", + "winston-daily-rotate-file": "^4.7.1", + "winston-loki": "^6.0.7" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@rosen-bridge/winston-logger/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "license": "GPL-3.0" + }, + "node_modules/@rosen-clients/axios": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@rosen-clients/axios/-/axios-0.1.0.tgz", + "integrity": "sha512-pCSGorduI2naHAnYB+qwQ5hBakBPAFIPXK/LJ+Fml5xmZjFpsylnqS1K6tg3oQi1OQAVDa5uv4XsbUSqYsMtDg==", + "dependencies": { + "axios": "^1.6.8", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18.11.0" + } + }, + "node_modules/@rosen-clients/cardano-koios": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@rosen-clients/cardano-koios/-/cardano-koios-2.0.3.tgz", + "integrity": "sha512-Xd+42r7OlZH59uvJl257BEsUUeaBExGNfozq472Juj+zDTd/el2gQ3maEWR6PKrySKk20OwtzMrApyn//ModsQ==", + "dependencies": { + "@rosen-clients/axios": "^0.1.0" + } + }, + "node_modules/@rosen-clients/ergo-explorer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@rosen-clients/ergo-explorer/-/ergo-explorer-1.1.1.tgz", + "integrity": "sha512-xvDM15MhHV1HLg3e9/0fETDKs9ZFT1MT6pip1KWaLmPbCYetI88iPPcLPCaO0RwY+Iqf5qm+gHbKeroFdA+juw==", + "dependencies": { + "@rosen-clients/axios": "^0.1.0" + } + }, + "node_modules/@rosen-clients/ergo-node": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@rosen-clients/ergo-node/-/ergo-node-1.1.1.tgz", + "integrity": "sha512-o/hZByzn4PLHL3ciODZilK0oS9lV3JstTF9xwBsOGczIMfMnr/WytkGtPXQVuNJkAy9KEFsys1I1KjgjX/42iw==", + "dependencies": { + "@rosen-clients/axios": "^0.1.0" + } + }, + "node_modules/@rosen-network/bitcoin": { + "resolved": "networks/bitcoin", + "link": true + }, + "node_modules/@rosen-network/cardano": { + "resolved": "networks/cardano", + "link": true + }, + "node_modules/@rosen-network/ergo": { + "resolved": "networks/ergo", + "link": true + }, + "node_modules/@rosen-network/ethereum": { + "resolved": "networks/ethereum", + "link": true + }, + "node_modules/@rosen-ui/asset-calculator": { + "resolved": "packages/asset-calculator", + "link": true + }, + "node_modules/@rosen-ui/common-hooks": { + "resolved": "packages/common-hooks", + "link": true + }, + "node_modules/@rosen-ui/constants": { + "resolved": "packages/constants", + "link": true + }, + "node_modules/@rosen-ui/eternl-wallet": { + "resolved": "wallets/eternl-wallet", + "link": true + }, + "node_modules/@rosen-ui/flint-wallet": { + "resolved": "wallets/flint-wallet", + "link": true + }, + "node_modules/@rosen-ui/lace-wallet": { + "resolved": "wallets/lace-wallet", + "link": true + }, + "node_modules/@rosen-ui/metamask-wallet": { + "resolved": "wallets/metamask-wallet", + "link": true + }, + "node_modules/@rosen-ui/nami-wallet": { + "resolved": "wallets/nami-wallet", + "link": true + }, + "node_modules/@rosen-ui/nautilus-wallet": { + "resolved": "wallets/nautilus-wallet", + "link": true + }, + "node_modules/@rosen-ui/swr-helpers": { + "resolved": "packages/swr-helpers", + "link": true + }, + "node_modules/@rosen-ui/swr-mock": { + "resolved": "packages/swr-mock", + "link": true + }, + "node_modules/@rosen-ui/types": { + "resolved": "packages/types", + "link": true + }, + "node_modules/@rosen-ui/utils": { + "resolved": "packages/utils", + "link": true + }, + "node_modules/@rosen-ui/vespr-wallet": { + "resolved": "wallets/vespr-wallet", + "link": true + }, + "node_modules/@rosen-ui/wallet-api": { + "resolved": "wallets/wallet-api", + "link": true + }, + "node_modules/@rosen-ui/xdefi-wallet": { + "resolved": "wallets/xdefi-wallet", + "link": true + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.5.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@rushstack/node-core-library": { + "version": "3.61.0", + "dev": true, + "license": "MIT", + "dependencies": { + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "z-schema": "~5.0.2" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/universalify": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "4.17.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + } + }, + "node_modules/@rushstack/ts-command-line/node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@scure/base": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.8.tgz", + "integrity": "sha512-6CyAclxj3Nb0XT7GHK6K4zK6k2xJm6E4Ft0Ohjt4WgegiFUHEtFb2CGzmPmGBwoIhrLsqNLYfLr04Y1GePrzZg==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@sindresorhus/is": { + "version": "0.7.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "peer": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "peer": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" + }, + "node_modules/@sqltools/formatter": { + "version": "1.2.5", + "license": "MIT" + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core/node_modules/cosmiconfig": { + "version": "8.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.2", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "1.5.6", + "dev": true, + "license": "Apache-2.0 OR MIT", + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "1.5.6", + "@tauri-apps/cli-darwin-x64": "1.5.6", + "@tauri-apps/cli-linux-arm-gnueabihf": "1.5.6", + "@tauri-apps/cli-linux-arm64-gnu": "1.5.6", + "@tauri-apps/cli-linux-arm64-musl": "1.5.6", + "@tauri-apps/cli-linux-x64-gnu": "1.5.6", + "@tauri-apps/cli-linux-x64-musl": "1.5.6", + "@tauri-apps/cli-win32-arm64-msvc": "1.5.6", + "@tauri-apps/cli-win32-ia32-msvc": "1.5.6", + "@tauri-apps/cli-win32-x64-msvc": "1.5.6" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "1.5.6", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "1.5.6", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.19.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.12", + "minimatch": "^7.4.3", + "mkdirp": "^2.1.6", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "7.4.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.126", + "license": "MIT" + }, + "node_modules/@types/btoa-lite": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/config": { + "version": "0.0.41", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/dom-screen-wake-lock": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/dom-screen-wake-lock/-/dom-screen-wake-lock-1.0.3.tgz", + "integrity": "sha512-3Iten7X3Zgwvk6kh6/NRdwN7WbZ760YgFCsF5AxDifltUQzW1RaW+WRmcVtgwFzLjaNu64H+0MPJ13yRa8g3Dw==" + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "peer": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "peer": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "peer": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-bigint": { + "version": "1.0.4", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", "dev": true, - "optional": true, - "os": [ - "android" - ] + "license": "MIT" }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.0.tgz", - "integrity": "sha512-BcnSPRM76/cD2gQC+rQNGBN6GStBs2pl/FpweW8JYuz5J/IEa0Fr4AtrPv766DB/6b2MZ/AfSIOSGw3nEIP8SA==", - "cpu": [ - "arm64" - ], + "node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.5", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/lodash": { + "version": "4.14.201", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.11", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "license": "MIT" + }, + "node_modules/@types/moment": { + "version": "2.13.0", + "dev": true, + "license": "MIT", + "dependencies": { + "moment": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/node": { + "version": "20.2.5", + "license": "MIT" + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.10", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.2.12", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-copy-to-clipboard": { + "version": "5.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.9", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.6", + "license": "MIT" + }, + "node_modules/@types/secp256k1": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", + "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/semver": { + "version": "7.5.5", + "license": "MIT" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "peer": true + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "license": "MIT" + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "peer": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "peer": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", "dev": true, - "optional": true, - "os": [ - "darwin" - ] + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.0.tgz", - "integrity": "sha512-LDyFB9GRolGN7XI6955aFeI3wCdCUszFWumWU0deHA8VpR3nWRrjG6GtGjBrQxQKFevnUTHKCfPR4IvrW3kCgQ==", - "cpu": [ - "x64" - ], + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", "dev": true, - "optional": true, - "os": [ - "darwin" - ] + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.0.tgz", - "integrity": "sha512-ygrGVhQP47mRh0AAD0zl6QqCbNsf0eTo+vgwkY6LunBcg0f2Jv365GXlDUECIyoXp1kKwL5WW6rsO429DBY/bA==", - "cpu": [ - "arm" - ], + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.0.tgz", - "integrity": "sha512-x+uJ6MAYRlHGe9wi4HQjxpaKHPM3d3JjqqCkeC5gpnnI6OWovLdXTpfa8trjxPLnWKyBsSi5kne+146GAxFt4A==", - "cpu": [ - "arm64" - ], + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "license": "ISC" }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.0.tgz", - "integrity": "sha512-nrRw8ZTQKg6+Lttwqo6a2VxR9tOroa2m91XbdQ2sUUzHoedXlsyvY1fN4xWdqz8PKmf4orDwejxXHjh7YBGUCA==", - "cpu": [ - "arm64" - ], + "node_modules/@upstash/core-analytics": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@upstash/core-analytics/-/core-analytics-0.0.9.tgz", + "integrity": "sha512-9NXXxZ5y1/A/zqKLlVT7NsAWSggJfOjB0hG6Ffx29b4jbzHOiQVWB55h5+j2clT9Ib+mNPXn0iB5zN3aWLkICw==", + "dependencies": { + "@upstash/redis": "^1.28.3" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@upstash/ratelimit": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@upstash/ratelimit/-/ratelimit-1.2.1.tgz", + "integrity": "sha512-o01lV1yFS5Fzj5KONZmNyVch/Qrlj785B2ob+kStUmxn8F6xXk7IHTQqVcHE+Ce3CmT/qQIwvMxDZftyJ5wYpQ==", + "dependencies": { + "@upstash/core-analytics": "^0.0.9" + } + }, + "node_modules/@upstash/redis": { + "version": "1.31.6", + "resolved": "https://registry.npmjs.org/@upstash/redis/-/redis-1.31.6.tgz", + "integrity": "sha512-7sDQQqvVnnV+2PUVGjocITa34CULGLoWhmfSY/LtpxNYv24EsgOk9VXhmGXIyzJBcXxB614wOF6ccEN0Lr7fqQ==", + "dependencies": { + "crypto-js": "^4.2.0" + } + }, + "node_modules/@vercel/kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@vercel/kv/-/kv-2.0.0.tgz", + "integrity": "sha512-zdVrhbzZBYo5d1Hfn4bKtqCeKf0FuzW8rSHauzQVMUgv1+1JOwof2mWcBuI+YMJy8s0G0oqAUfQ7HgUDzb8EbA==", + "dependencies": { + "@upstash/redis": "^1.31.3" + }, + "engines": { + "node": ">=14.6" + } + }, + "node_modules/@vitest/coverage-istanbul": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-1.4.0.tgz", + "integrity": "sha512-39TjURYyAY6CLDx8M1RNYGoAuWicPWoofk+demJbAZROLCwUgGPgMRSg51GN+snbmQRTpSizuS9XC3cMSdQH2Q==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "debug": "^4.3.4", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-instrument": "^6.0.1", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.4", + "istanbul-reports": "^3.1.6", + "magicast": "^0.3.3", + "picocolors": "^1.0.0", + "test-exclude": "^6.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.4.0" + } }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.0.tgz", - "integrity": "sha512-xV0d5jDb4aFu84XKr+lcUJ9y3qpIWhttO3Qev97z8DKLXR62LC3cXT/bMZXrjLF9X+P5oSmJTzAhqwUbY96PnA==", - "cpu": [ - "ppc64le" - ], + "node_modules/@vitest/expect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.4.0.tgz", + "integrity": "sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@vitest/spy": "1.4.0", + "@vitest/utils": "1.4.0", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.0.tgz", - "integrity": "sha512-SDDhBQwZX6LPRoPYjAZWyL27LbcBo7WdBFWJi5PI9RPCzU8ijzkQn7tt8NXiXRiFMJCVpkuMkBf4OxSxVMizAw==", - "cpu": [ - "riscv64" - ], + "node_modules/@vitest/runner": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.4.0.tgz", + "integrity": "sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@vitest/utils": "1.4.0", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.0.tgz", - "integrity": "sha512-RxB/qez8zIDshNJDufYlTT0ZTVut5eCpAZ3bdXDU9yTxBzui3KhbGjROK2OYTTor7alM7XBhssgoO3CZ0XD3qA==", - "cpu": [ - "s390x" - ], + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.6", - "cpu": [ - "x64" - ], + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.4.0.tgz", + "integrity": "sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.6", - "cpu": [ - "x64" - ], + "node_modules/@vitest/snapshot/node_modules/magic-string": { + "version": "0.30.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.9.tgz", + "integrity": "sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.0.tgz", - "integrity": "sha512-Fq52EYb0riNHLBTAcL0cun+rRwyZ10S9vKzhGKKgeD+XbwunszSY0rVMco5KbOsTlwovP2rTOkiII/fQ4ih/zQ==", - "cpu": [ - "arm64" - ], + "node_modules/@vitest/spy": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.4.0.tgz", + "integrity": "sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.0.tgz", - "integrity": "sha512-e/PBHxPdJ00O9p5Ui43+vixSgVf4NlLsmV6QneGERJ3lnjIua/kim6PRFe3iDueT1rQcgSkYP8ZBBXa/h4iPvw==", - "cpu": [ - "ia32" - ], + "node_modules/@vitest/utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.4.0.tgz", + "integrity": "sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.0.tgz", - "integrity": "sha512-aGg7iToJjdklmxlUlJh/PaPNa4PmqHfyRMLunbL3eaMO0gp656+q1zOKkpJ/CVe9CryJv6tAN1HDoR8cNGzkag==", - "cpu": [ - "x64" - ], + "node_modules/@vitest/utils/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "@types/estree": "^1.0.0" + } }, - "node_modules/@rosen-bridge/abstract-extractor": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-extractor/-/abstract-extractor-0.1.0.tgz", - "integrity": "sha512-GYyPR5oAhGjrTHhS8gvNkdGCzaOYkp2FuPa8mCfl/BBMCrifmKx6n/yvDLrbhgurbOKx3MAnMJK5sLf63wAusg==", + "node_modules/@wry/caches": { + "version": "1.0.1", + "license": "MIT", "dependencies": { - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-clients/ergo-explorer": "^1.1.1", - "@rosen-clients/ergo-node": "^1.1.1", - "lodash-es": "^4.17.21" + "tslib": "^2.3.0" }, "engines": { - "node": ">=20.11.0" + "node": ">=8" } }, - "node_modules/@rosen-bridge/abstract-extractor/node_modules/@rosen-bridge/abstract-logger": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", - "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" - }, - "node_modules/@rosen-bridge/abstract-logger": { - "version": "0.3.0", - "license": "GPL-3.0" + "node_modules/@wry/context": { + "version": "0.7.4", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/@rosen-bridge/address-codec": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-0.2.1.tgz", - "integrity": "sha512-W7d7W0rmciMJMuq4KYh+6EeiB9dCE9RBTzu5xeFd3BLHjMnYpt1/J6vdZeXpFFySNRfxclFZwU94B5q3l6CV8Q==", + "node_modules/@wry/equality": { + "version": "0.5.7", + "license": "MIT", "dependencies": { - "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", - "bitcoinjs-lib": "^6.1.5", - "ergo-lib-wasm-nodejs": "^0.24.1" + "tslib": "^2.3.0" }, "engines": { - "node": ">=20.11.0" + "node": ">=8" } }, - "node_modules/@rosen-bridge/bitcoin-esplora-scanner": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@rosen-bridge/bitcoin-esplora-scanner/-/bitcoin-esplora-scanner-0.1.5.tgz", - "integrity": "sha512-p6ouaCnP+jPzCkddk8IMtQIJ9XAXjc136miTeLvLDFQtis9oiYQnboNd+X46nY6BmvgN5hDa31vtKzLwNAhqKQ==", + "node_modules/@wry/trie": { + "version": "0.5.0", + "license": "MIT", "dependencies": { - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/scanner": "^4.0.0", - "axios": "^1.6.8" + "tslib": "^2.3.0" }, "engines": { - "node": ">=20.11.0" + "node": ">=8" } }, - "node_modules/@rosen-bridge/bitcoin-esplora-scanner/node_modules/@rosen-bridge/abstract-logger": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", - "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + "node_modules/@yr/monotone-cubic-spline": { + "version": "1.0.3", + "license": "MIT", + "peer": true }, - "node_modules/@rosen-bridge/bitcoin-observation-extractor": { + "node_modules/abbrev": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/abort-controller": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/bitcoin-observation-extractor/-/bitcoin-observation-extractor-3.0.0.tgz", - "integrity": "sha512-w/bT36W+/0x22f7dJ2KCeF96AMMSvJ3FERcb6AB8v6c7GRwL3iHXnDDmJkj95tXrGqd1hDORJEcclDAeOlNjuQ==", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dependencies": { - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/bitcoin-esplora-scanner": "^0.1.5", - "@rosen-bridge/bitcoin-rpc-scanner": "^0.1.1", - "@rosen-bridge/observation-extractor": "^4.4.4", - "@rosen-bridge/rosen-extractor": "^5.0.1", - "@rosen-bridge/tokens": "^1.0.0", - "typeorm": "^0.3.20" + "event-target-shim": "^5.0.0" }, "engines": { - "node": ">=20.11.0" + "node": ">=6.5" } }, - "node_modules/@rosen-bridge/bitcoin-observation-extractor/node_modules/@rosen-bridge/abstract-logger": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", - "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" - }, - "node_modules/@rosen-bridge/bitcoin-rpc-scanner": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@rosen-bridge/bitcoin-rpc-scanner/-/bitcoin-rpc-scanner-0.1.1.tgz", - "integrity": "sha512-2CplgxHedelAnHNHB/ij/0pio6uZVHinV08S2EHaF4oyH32DXiHi66beC6iwYrwvd+03TmQo+Na//h2QZtxXJA==", + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "peer": true, "dependencies": { - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/scanner": "^4.0.0", - "axios": "^1.6.8" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">=20.11.0" + "node": ">= 0.6" } }, - "node_modules/@rosen-bridge/bitcoin-rpc-scanner/node_modules/@rosen-bridge/abstract-logger": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", - "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + "node_modules/acorn": { + "version": "8.11.3", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } }, - "node_modules/@rosen-bridge/bitcoin-utxo-selection": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/bitcoin-utxo-selection/-/bitcoin-utxo-selection-0.2.0.tgz", - "integrity": "sha512-8z/7HNXfkTcWObLrZGDf9TJHhfmodUbgrPP77RAbcJAk+K8vA7ooP8X1Vi1LRbjliO4TlIpGAwPq1hyPc9++6A==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "license": "MIT", + "optional": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "license": "MIT", "dependencies": { - "@rosen-bridge/abstract-logger": "^1.0.0" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, "engines": { - "node": ">=20.11.0" + "node": ">=8" } }, - "node_modules/@rosen-bridge/bitcoin-utxo-selection/node_modules/@rosen-bridge/abstract-logger": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", - "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" - }, - "node_modules/@rosen-bridge/cardano-utxo-selection": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/cardano-utxo-selection/-/cardano-utxo-selection-1.1.0.tgz", - "integrity": "sha512-f9cBKy/pj2cNUmZPr8dyCil6n8BYaVDKIBJtKVmm9vThhH/8VpHuVS69INMGhsRPdTRwyqUNy8lsrlxfwjKhjw==", + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", "dependencies": { - "@rosen-bridge/abstract-logger": "^1.0.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@rosen-bridge/cardano-utxo-selection/node_modules/@rosen-bridge/abstract-logger": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", - "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + "node_modules/anser": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", + "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", + "peer": true }, - "node_modules/@rosen-bridge/changeset-formatter": { - "version": "0.1.0", - "dev": true, - "license": "GPL-3.0", + "node_modules/ansi-colors": { + "version": "4.1.3", + "license": "MIT", "engines": { - "node": ">=20.11.0" + "node": ">=6" } }, - "node_modules/@rosen-bridge/cli": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/cli/-/cli-0.2.0.tgz", - "integrity": "sha512-ff/Vgn0e9b+IRRa7gJyhrMJcAbGcde5jYyZi2tv667cCeJeZxFkVdTxyEpyPeGX9vjBu8m21qi0WCd0o7d/rNg==", + "node_modules/ansi-escapes": { + "version": "5.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "@rosen-bridge/tss": "^1.2.0", - "@rosen-bridge/utils": "^0.0.1", - "blakejs": "^1.2.1", - "chalk": "^5.2.0", - "ora": "^6.3.0", - "yargs": "^17.7.2" + "type-fest": "^1.0.2" }, - "bin": { - "cli": "dist/bin/index.js" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@rosen-bridge/ergo-box-selection": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/ergo-box-selection/-/ergo-box-selection-0.1.0.tgz", - "integrity": "sha512-TQSovVSltLqTBgqhcNTF93MofZs4pLItKch92DiGdEQcTyKRNOBfIo7qKMcR2VQu1KP71YAa3PpQkXJgdXC23A==", + "node_modules/ansi-fragments": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", + "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", + "peer": true, "dependencies": { - "@rosen-bridge/abstract-logger": "^0.3.0" - }, + "colorette": "^1.0.7", + "slice-ansi": "^2.0.0", + "strip-ansi": "^5.0.0" + } + }, + "node_modules/ansi-fragments/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "peer": true, "engines": { - "node": ">=18.12.0" + "node": ">=6" } }, - "node_modules/@rosen-bridge/extended-typeorm": { - "version": "0.0.1", - "license": "GPL-3.0", + "node_modules/ansi-fragments/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "peer": true, "dependencies": { - "async-mutex": "^0.4.0", - "typeorm": "^0.3.12" + "color-convert": "^1.9.0" }, - "peerDependencies": { - "sqlite3": "^5.1.6" + "engines": { + "node": ">=4" } }, - "node_modules/@rosen-bridge/guard-app": { - "resolved": "apps/guard", - "link": true + "node_modules/ansi-fragments/node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "peer": true }, - "node_modules/@rosen-bridge/icons": { - "resolved": "packages/icons", - "link": true + "node_modules/ansi-fragments/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "peer": true, + "engines": { + "node": ">=4" + } }, - "node_modules/@rosen-bridge/json-bigint": { - "version": "0.1.0", - "license": "GPL-3.0", + "node_modules/ansi-fragments/node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "peer": true, "dependencies": { - "json-bigint": "^1.0.0" + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" }, "engines": { - "node": ">=18.12.0" + "node": ">=6" } }, - "node_modules/@rosen-bridge/logger-interface": { - "version": "0.1.0", - "license": "GPL-3.0" - }, - "node_modules/@rosen-bridge/minimum-fee": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rosen-bridge/minimum-fee/-/minimum-fee-2.0.1.tgz", - "integrity": "sha512-PEEmemRWYv2xkARxbg51KleAJtGzetZHFANeeHa2qJdZtFisUzZmqRKOB1VCIn1AW0lDrFeY02Rd8e4QzFfPcw==", + "node_modules/ansi-fragments/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "peer": true, "dependencies": { - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-clients/ergo-explorer": "^1.1.1", - "@rosen-clients/ergo-node": "^1.1.1", - "ergo-lib-wasm-nodejs": "^0.24.1" + "ansi-regex": "^4.1.0" }, "engines": { - "node": ">=18.16.1" + "node": ">=6" } }, - "node_modules/@rosen-bridge/minimum-fee/node_modules/@rosen-bridge/abstract-logger": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", - "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" - }, - "node_modules/@rosen-bridge/observation-extractor": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@rosen-bridge/observation-extractor/-/observation-extractor-4.4.4.tgz", - "integrity": "sha512-7DM0FUY5lsANL9r8xo4qvUW1+v4wwF5ym+Ky+UzXakUmHMKPy7fx3CWxC+uPfWMfRgvio1SUTGFfE+jagLGMJA==", - "dependencies": { - "@cardano-ogmios/schema": "^6.0.3", - "@rosen-bridge/abstract-extractor": "^0.1.0", - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/rosen-extractor": "^5.0.0", - "@rosen-bridge/scanner": "^4.0.0", - "@rosen-bridge/tokens": "^1.0.0", - "blakejs": "^1.2.1", - "ergo-lib-wasm-nodejs": "^0.24.1", - "lodash-es": "^4.17.21", - "reflect-metadata": "^0.1.13", - "sqlite3": "^5.0.9", - "typeorm": "^0.3.20" + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/@rosen-bridge/observation-extractor/node_modules/@rosen-bridge/abstract-logger": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", - "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + "node_modules/ansi-styles": { + "version": "6.2.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "node_modules/@rosen-bridge/rosen-app": { - "resolved": "apps/rosen", - "link": true + "node_modules/any-promise": { + "version": "1.3.0", + "license": "MIT" }, - "node_modules/@rosen-bridge/rosen-extractor": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@rosen-bridge/rosen-extractor/-/rosen-extractor-5.0.1.tgz", - "integrity": "sha512-+2i2/1fFodJSrTsaXEKOY60/lBUlpxoAxrwfW1pnxIHA5aATAOqXunk0QJJCMPiSUVhfzFa0vxZN3ZjCWROfnQ==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "peer": true, "dependencies": { - "@blockfrost/blockfrost-js": "^5.4.0", - "@cardano-ogmios/schema": "^6.0.3", - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/address-codec": "^0.2.1", - "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-bridge/tokens": "^1.0.0", - "bitcoinjs-lib": "^6.1.5", - "ergo-lib-wasm-nodejs": "^0.24.1", - "ethers": "^6.11.1", - "json-bigint": "^1.0.0", - "lodash-es": "^4.17.21" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@rosen-bridge/rosen-extractor/node_modules/@rosen-bridge/abstract-logger": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", - "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" - }, - "node_modules/@rosen-bridge/rosen-service": { - "resolved": "apps/rosen-service", - "link": true - }, - "node_modules/@rosen-bridge/scanner": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/scanner/-/scanner-4.0.0.tgz", - "integrity": "sha512-ZHFRfsv3YRyFEZY4VzEEeHRJm0bsAiocaq0HNuWOubSHydiaLra62NUfI1mdNDU+ql5c+JyE+cmv/1zm7tdPaw==", + "node_modules/apexcharts": { + "version": "3.44.0", + "license": "MIT", + "peer": true, "dependencies": { - "@apollo/client": "^3.8.7", - "@blockfrost/blockfrost-js": "^5.4.0", - "@cardano-ogmios/client": "^6.3.0", - "@cardano-ogmios/schema": "^6.3.0", - "@rosen-bridge/abstract-extractor": "^0.1.0", - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-clients/ergo-explorer": "^1.1.1", - "@rosen-clients/ergo-node": "^1.1.1", - "await-semaphore": "^0.1.3", - "axios": "^1.6.8", - "cross-fetch": "^4.0.0", - "lodash-es": "^4.17.21", - "reflect-metadata": "^0.1.13", - "sqlite3": "^5.0.9", - "typeorm": "^0.3.20" + "@yr/monotone-cubic-spline": "^1.0.3", + "svg.draggable.js": "^2.2.2", + "svg.easing.js": "^2.0.0", + "svg.filter.js": "^2.0.2", + "svg.pathmorphing.js": "^0.1.3", + "svg.resize.js": "^1.4.3", + "svg.select.js": "^3.0.1" } }, - "node_modules/@rosen-bridge/scanner/node_modules/@rosen-bridge/abstract-logger": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", - "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + "node_modules/app-root-path": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } }, - "node_modules/@rosen-bridge/scanner/node_modules/cross-fetch": { + "node_modules/appdirsjs": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz", + "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==", + "peer": true + }, + "node_modules/aproba": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/archive-type": { "version": "4.0.0", "license": "MIT", "dependencies": { - "node-fetch": "^2.6.12" + "file-type": "^4.2.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@rosen-bridge/shared-contexts": { - "resolved": "packages/shared-contexts", - "link": true - }, - "node_modules/@rosen-bridge/tokens": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rosen-bridge/tokens/-/tokens-1.2.1.tgz", - "integrity": "sha512-sWn2XMQvzLKRZTlw3mlZZWLGy81XzFEJuLu/WBPq0EyHy2eXFSOacID7uwvD+EIoldfwwraX1bv/+u3gY0gKHw==" - }, - "node_modules/@rosen-bridge/tss": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/tss/-/tss-1.2.0.tgz", - "integrity": "sha512-H6yg4ClUF+zFNilchIOt7KSi3G7LS883V52ql8PcjKHz5MZl2XIf1rRjU82i2PCg1mfPOKsAu+nU8FMLcsTNHA==", - "dependencies": { - "@noble/ed25519": "^2.0.0", - "@noble/hashes": "^1.3.1", - "@rosen-bridge/abstract-logger": "^0.3.0", - "await-semaphore": "^0.1.3", - "axios": "^1.4.0", - "blakejs": "^1.2.1", - "secp256k1": "^4.0.3" + "node_modules/archive-type/node_modules/file-type": { + "version": "4.4.0", + "license": "MIT", + "engines": { + "node": ">=4" } }, - "node_modules/@rosen-bridge/ui-kit": { - "resolved": "packages/ui-kit", - "link": true - }, - "node_modules/@rosen-bridge/utils": { - "version": "0.0.1", - "license": "GPL-3.0", + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "license": "ISC", "dependencies": { - "download": "^8.0.0", - "octokit": "^2.0.14" + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@rosen-bridge/watcher-app": { - "resolved": "apps/watcher", - "link": true - }, - "node_modules/@rosen-bridge/watcher-data-extractor": { - "version": "4.2.2", - "license": "GPL-3.0", + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", "dependencies": { - "@rosen-bridge/logger-interface": "^0.1.0", - "@rosen-bridge/scanner": "^3.2.2", - "@rosen-clients/ergo-explorer": "^1.0.3", - "@types/lodash-es": "^4.17.6", - "blakejs": "^1.2.1", - "ergo-lib-wasm-nodejs": "^0.24.1", - "json-bigint": "^1.0.0", - "lodash-es": "^4.17.21", - "pg": "^8.10.0", - "reflect-metadata": "^0.1.13", - "sqlite3": "^5.0.9", - "typeorm": "^0.3.7" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/@rosen-bridge/watcher-data-extractor/node_modules/@rosen-bridge/abstract-logger": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", - "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + "node_modules/arg": { + "version": "4.1.3", + "devOptional": true, + "license": "MIT" }, - "node_modules/@rosen-bridge/watcher-data-extractor/node_modules/@rosen-bridge/scanner": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@rosen-bridge/scanner/-/scanner-3.2.9.tgz", - "integrity": "sha512-+1Z+62WhDWnjLkT+ZhFsHDj264GuJL1Wbcp6uS0K3Sm8fuxdNSJj7dVlaG5o9nf0RfvWutY6GkSEIY8wiIzcCg==", + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.0", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@apollo/client": "^3.8.7", - "@blockfrost/blockfrost-js": "^5.4.0", - "@cardano-ogmios/client": "^6.3.0", - "@cardano-ogmios/schema": "^6.3.0", - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-clients/ergo-explorer": "^1.1.1", - "@rosen-clients/ergo-node": "^1.1.1", - "await-semaphore": "^0.1.3", - "axios": "^1.6.8", - "cross-fetch": "^4.0.0", - "reflect-metadata": "^0.1.13", - "sqlite3": "^5.0.9", - "typeorm": "^0.3.20" + "dequal": "^2.0.3" } }, - "node_modules/@rosen-bridge/watcher-data-extractor/node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "node-fetch": "^2.6.12" + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@rosen-bridge/winston-logger": { - "version": "0.2.1", - "license": "GPL-3.0", + "node_modules/array-includes": { + "version": "3.1.7", + "dev": true, + "license": "MIT", "dependencies": { - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/json-bigint": "^0.1.0", - "winston": "^3.10.0", - "winston-daily-rotate-file": "^4.7.1", - "winston-loki": "^6.0.7" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" }, "engines": { - "node": ">=18.12.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@rosen-bridge/winston-logger/node_modules/@rosen-bridge/abstract-logger": { - "version": "1.0.0", - "license": "GPL-3.0" + "node_modules/array-union": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/@rosen-clients/axios": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@rosen-clients/axios/-/axios-0.1.0.tgz", - "integrity": "sha512-pCSGorduI2naHAnYB+qwQ5hBakBPAFIPXK/LJ+Fml5xmZjFpsylnqS1K6tg3oQi1OQAVDa5uv4XsbUSqYsMtDg==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "dev": true, + "license": "MIT", "dependencies": { - "axios": "^1.6.8", - "json-bigint": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" }, "engines": { - "node": ">=18.11.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@rosen-clients/cardano-koios": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rosen-clients/cardano-koios/-/cardano-koios-2.0.3.tgz", - "integrity": "sha512-Xd+42r7OlZH59uvJl257BEsUUeaBExGNfozq472Juj+zDTd/el2gQ3maEWR6PKrySKk20OwtzMrApyn//ModsQ==", + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "license": "MIT", "dependencies": { - "@rosen-clients/axios": "^0.1.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@rosen-clients/ergo-explorer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@rosen-clients/ergo-explorer/-/ergo-explorer-1.1.1.tgz", - "integrity": "sha512-xvDM15MhHV1HLg3e9/0fETDKs9ZFT1MT6pip1KWaLmPbCYetI88iPPcLPCaO0RwY+Iqf5qm+gHbKeroFdA+juw==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "dev": true, + "license": "MIT", "dependencies": { - "@rosen-clients/axios": "^0.1.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@rosen-clients/ergo-node": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@rosen-clients/ergo-node/-/ergo-node-1.1.1.tgz", - "integrity": "sha512-o/hZByzn4PLHL3ciODZilK0oS9lV3JstTF9xwBsOGczIMfMnr/WytkGtPXQVuNJkAy9KEFsys1I1KjgjX/42iw==", + "node_modules/array.prototype.tosorted": { + "version": "1.1.2", + "dev": true, + "license": "MIT", "dependencies": { - "@rosen-clients/axios": "^0.1.0" - } - }, - "node_modules/@rosen-network/bitcoin": { - "resolved": "networks/bitcoin", - "link": true - }, - "node_modules/@rosen-network/cardano": { - "resolved": "networks/cardano", - "link": true - }, - "node_modules/@rosen-network/ergo": { - "resolved": "networks/ergo", - "link": true - }, - "node_modules/@rosen-network/ethereum": { - "resolved": "networks/ethereum", - "link": true - }, - "node_modules/@rosen-ui/asset-calculator": { - "resolved": "packages/asset-calculator", - "link": true - }, - "node_modules/@rosen-ui/common-hooks": { - "resolved": "packages/common-hooks", - "link": true - }, - "node_modules/@rosen-ui/constants": { - "resolved": "packages/constants", - "link": true - }, - "node_modules/@rosen-ui/eternl-wallet": { - "resolved": "wallets/eternl-wallet", - "link": true + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + } }, - "node_modules/@rosen-ui/flint-wallet": { - "resolved": "wallets/flint-wallet", - "link": true + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/@rosen-ui/lace-wallet": { - "resolved": "wallets/lace-wallet", - "link": true + "node_modules/arrify": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/@rosen-ui/nami-wallet": { - "resolved": "wallets/nami-wallet", - "link": true + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "peer": true }, - "node_modules/@rosen-ui/nautilus-wallet": { - "resolved": "wallets/nautilus-wallet", - "link": true + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } }, - "node_modules/@rosen-ui/swr-helpers": { - "resolved": "packages/swr-helpers", - "link": true + "node_modules/ast-types": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", + "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", + "peer": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/@rosen-ui/swr-mock": { - "resolved": "packages/swr-mock", - "link": true + "node_modules/ast-types-flow": { + "version": "0.0.8", + "dev": true, + "license": "MIT" }, - "node_modules/@rosen-ui/types": { - "resolved": "packages/types", - "link": true + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "peer": true, + "engines": { + "node": ">=4" + } }, - "node_modules/@rosen-ui/utils": { - "resolved": "packages/utils", - "link": true + "node_modules/async": { + "version": "3.2.5", + "license": "MIT" }, - "node_modules/@rosen-ui/vespr-wallet": { - "resolved": "wallets/vespr-wallet", - "link": true + "node_modules/async-exit-hook": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } }, - "node_modules/@rosen-ui/wallet-api": { - "resolved": "wallets/wallet-api", - "link": true + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "peer": true }, - "node_modules/@rosen-ui/xdefi-wallet": { - "resolved": "wallets/xdefi-wallet", - "link": true + "node_modules/async-mutex": { + "version": "0.4.0", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.5.1", + "node_modules/asynciterator.prototype": { + "version": "1.0.0", "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", "license": "MIT" }, - "node_modules/@rushstack/node-core-library": { - "version": "3.61.0", - "dev": true, + "node_modules/available-typed-arrays": { + "version": "1.0.5", "license": "MIT", - "dependencies": { - "colors": "~1.2.1", - "fs-extra": "~7.0.1", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.22.1", - "semver": "~7.5.4", - "z-schema": "~5.0.2" - }, - "peerDependencies": { - "@types/node": "*" + "engines": { + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { - "version": "7.0.1", + "node_modules/await-semaphore": { + "version": "0.1.3", + "license": "MIT" + }, + "node_modules/axe-core": { + "version": "4.7.0", "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, + "license": "MPL-2.0", "engines": { - "node": ">=6 <7 || >=8" + "node": ">=4" } }, - "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/@rushstack/node-core-library/node_modules/universalify": { - "version": "0.1.2", + "node_modules/axobject-query": { + "version": "3.2.1", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", + "peer": true, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=10", + "npm": ">=6" } }, - "node_modules/@rushstack/rig-package": { - "version": "0.5.1", - "dev": true, - "license": "MIT", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "peer": true, "dependencies": { - "resolve": "~1.22.1", - "strip-json-comments": "~3.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@rushstack/ts-command-line": { - "version": "4.17.1", - "dev": true, - "license": "MIT", + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "peer": true, "dependencies": { - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "colors": "~1.2.1", - "string-argv": "~0.3.1" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@rushstack/ts-command-line/node_modules/argparse": { - "version": "1.0.10", - "dev": true, - "license": "MIT", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "peer": true, "dependencies": { - "sprintf-js": "~1.0.2" + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "license": "BSD-3-Clause", + "node_modules/babel-plugin-transform-flow-enums": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", + "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", + "peer": true, "dependencies": { - "@hapi/hoek": "^9.0.0" + "@babel/plugin-syntax-flow": "^7.12.1" } }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "license": "BSD-3-Clause" + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base-x": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "node_modules/@sideway/pinpoint": { + "node_modules/bech32": { "version": "2.0.0", - "license": "BSD-3-Clause" + "license": "MIT" }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "node_modules/before-after-hook": { + "version": "2.2.3", + "license": "Apache-2.0" }, - "node_modules/@sindresorhus/is": { - "version": "0.7.0", + "node_modules/better-path-resolve": { + "version": "1.0.0", "license": "MIT", + "dependencies": { + "is-windows": "^1.0.0" + }, "engines": { "node": ">=4" } }, - "node_modules/@sqltools/formatter": { - "version": "1.2.5", - "license": "MIT" - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "dev": true, + "node_modules/bignumber.js": { + "version": "9.1.2", "license": "MIT", "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "*" } }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "dev": true, - "license": "MIT", + "node_modules/bip174": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bip174/-/bip174-2.1.1.tgz", + "integrity": "sha512-mdFV5+/v0XyNYXjBS6CQPLo9ekCx4gtKZFnJm5PMto7Fs9hTTDpkkzOB7/FtluRI6JbUUAu+snTYfJRgHLZbZQ==", "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8.0.0" } }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node_modules/bitcoinjs-lib": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.1.6.tgz", + "integrity": "sha512-Fk8+Vc+e2rMoDU5gXkW9tD+313rhkm5h6N9HfZxXvYU9LedttVvmXKTgd9k5rsQJjkSfsv6XRM8uhJv94SrvcA==", + "dependencies": { + "@noble/hashes": "^1.2.0", + "bech32": "^2.0.0", + "bip174": "^2.1.1", + "bs58check": "^3.0.1", + "typeforce": "^1.11.3", + "varuint-bitcoin": "^1.1.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "dev": true, - "license": "MIT", "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8.0.0" } }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "dev": true, + "node_modules/bl": { + "version": "5.1.0", "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "dev": true, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">= 6" } }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/blake2b": { + "version": "2.1.3", + "license": "ISC", + "dependencies": { + "blake2b-wasm": "^1.1.0", + "nanoassert": "^1.0.0" } }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "dev": true, + "node_modules/blake2b-wasm": { + "version": "1.1.7", "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "dependencies": { + "nanoassert": "^1.0.0" } }, - "node_modules/@svgr/babel-preset": { - "version": "8.1.0", - "dev": true, + "node_modules/blakejs": { + "version": "1.2.1", + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/bottleneck": { + "version": "2.19.5", + "license": "MIT" + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", "license": "MIT", "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@svgr/core": { - "version": "8.1.0", - "dev": true, + "node_modules/braces": { + "version": "3.0.2", "license": "MIT", "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" + "fill-range": "^7.0.1" }, "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=8" } }, - "node_modules/@svgr/core/node_modules/cosmiconfig": { - "version": "8.3.6", - "dev": true, + "node_modules/breakword": { + "version": "1.0.6", "license": "MIT", "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "wcwidth": "^1.0.1" } }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "dev": true, - "license": "MIT", + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, - "engines": { - "node": ">=14" + "bin": { + "browserslist": "cli.js" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", - "dev": true, - "license": "MIT", + "node_modules/bs58": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" + "base-x": "^4.0.0" } }, - "node_modules/@swc/helpers": { - "version": "0.5.2", - "license": "Apache-2.0", + "node_modules/bs58check": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-3.0.1.tgz", + "integrity": "sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==", "dependencies": { - "tslib": "^2.4.0" + "@noble/hashes": "^1.2.0", + "bs58": "^5.0.0" } }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "license": "MIT", + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "peer": true, "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" + "node-int64": "^0.4.0" } }, - "node_modules/@tauri-apps/cli": { - "version": "1.5.6", - "dev": true, - "license": "Apache-2.0 OR MIT", + "node_modules/btoa": { + "version": "1.2.1", + "license": "(MIT OR Apache-2.0)", "bin": { - "tauri": "tauri.js" + "btoa": "bin/btoa.js" }, "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/tauri" - }, - "optionalDependencies": { - "@tauri-apps/cli-darwin-arm64": "1.5.6", - "@tauri-apps/cli-darwin-x64": "1.5.6", - "@tauri-apps/cli-linux-arm-gnueabihf": "1.5.6", - "@tauri-apps/cli-linux-arm64-gnu": "1.5.6", - "@tauri-apps/cli-linux-arm64-musl": "1.5.6", - "@tauri-apps/cli-linux-x64-gnu": "1.5.6", - "@tauri-apps/cli-linux-x64-musl": "1.5.6", - "@tauri-apps/cli-win32-arm64-msvc": "1.5.6", - "@tauri-apps/cli-win32-ia32-msvc": "1.5.6", - "@tauri-apps/cli-win32-x64-msvc": "1.5.6" + "node": ">= 0.4.0" } }, - "node_modules/@tauri-apps/cli-linux-x64-gnu": { - "version": "1.5.6", - "cpu": [ - "x64" + "node_modules/btoa-lite": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/buffer": { + "version": "6.0.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } ], - "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/@tauri-apps/cli-linux-x64-musl": { - "version": "1.5.6", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/buffer-alloc": { + "version": "1.2.0", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", "license": "MIT", - "optional": true, "engines": { - "node": ">= 6" + "node": "*" } }, - "node_modules/@ts-morph/common": { - "version": "0.19.0", - "dev": true, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "peer": true + }, + "node_modules/buffer-writer": { + "version": "2.0.0", "license": "MIT", - "dependencies": { - "fast-glob": "^3.2.12", - "minimatch": "^7.4.3", - "mkdirp": "^2.1.6", - "path-browserify": "^1.0.1" + "engines": { + "node": ">=4" } }, - "node_modules/@ts-morph/common/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", + "node_modules/bufferutil": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", + "hasInstallScript": true, "dependencies": { - "balanced-match": "^1.0.0" + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" } }, - "node_modules/@ts-morph/common/node_modules/minimatch": { - "version": "7.4.6", - "dev": true, - "license": "ISC", + "node_modules/busboy": { + "version": "1.6.0", "dependencies": { - "brace-expansion": "^2.0.1" + "streamsearch": "^1.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10.16.0" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@types/argparse": { - "version": "1.0.38", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/aws-lambda": { - "version": "8.10.126", - "license": "MIT" - }, - "node_modules/@types/btoa-lite": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "peer": true, + "engines": { + "node": ">= 0.8" } }, - "node_modules/@types/config": { - "version": "0.0.41", + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=8" + } }, - "node_modules/@types/estree": { - "version": "1.0.5", - "dev": true, - "license": "MIT" + "node_modules/cacache": { + "version": "15.3.0", + "license": "ISC", + "optional": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "license": "MIT" + "node_modules/cacache/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/@types/json-bigint": { + "node_modules/cacache/node_modules/mkdirp": { "version": "1.0.4", - "license": "MIT" + "license": "MIT", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "dev": true, - "license": "MIT" + "node_modules/cacache/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC", + "optional": true }, - "node_modules/@types/json5": { - "version": "0.0.29", - "dev": true, - "license": "MIT" + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.5", + "node_modules/cacheable-request": { + "version": "2.1.4", "license": "MIT", "dependencies": { - "@types/node": "*" + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" } }, - "node_modules/@types/keyv": { - "version": "3.1.4", + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "3.0.0", "license": "MIT", - "dependencies": { - "@types/node": "*" + "engines": { + "node": ">=4" } }, - "node_modules/@types/lodash": { - "version": "4.14.201", + "node_modules/cacheable-request/node_modules/json-buffer": { + "version": "3.0.0", "license": "MIT" }, - "node_modules/@types/lodash-es": { - "version": "4.17.11", + "node_modules/cacheable-request/node_modules/keyv": { + "version": "3.0.0", "license": "MIT", "dependencies": { - "@types/lodash": "*" + "json-buffer": "3.0.0" } }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "license": "MIT" + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/@types/moment": { - "version": "2.13.0", - "dev": true, + "node_modules/call-bind": { + "version": "1.0.5", "license": "MIT", "dependencies": { - "moment": "*" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@types/node": { - "version": "20.2.5", - "license": "MIT" - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "license": "MIT" - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "license": "MIT" + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "peer": true, + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/@types/prop-types": { - "version": "15.7.10", - "license": "MIT" + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "peer": true, + "engines": { + "node": ">=4" + } }, - "node_modules/@types/react": { - "version": "18.2.12", - "license": "MIT", + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "peer": true, "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@types/react-copy-to-clipboard": { - "version": "5.0.7", - "dev": true, + "node_modules/callsites": { + "version": "3.1.0", "license": "MIT", - "dependencies": { - "@types/react": "*" + "engines": { + "node": ">=6" } }, - "node_modules/@types/react-dom": { - "version": "18.2.4", - "dev": true, + "node_modules/camelcase": { + "version": "6.3.0", "license": "MIT", - "dependencies": { - "@types/react": "*" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/react-transition-group": { - "version": "4.4.9", + "node_modules/camelcase-keys": { + "version": "6.2.2", "license": "MIT", "dependencies": { - "@types/react": "*" + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/responselike": { - "version": "1.0.3", + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", "license": "MIT", - "dependencies": { - "@types/node": "*" + "engines": { + "node": ">=6" } }, - "node_modules/@types/scheduler": { - "version": "0.16.6", - "license": "MIT" - }, - "node_modules/@types/semver": { - "version": "7.5.5", - "license": "MIT" + "node_modules/camelcase-keys/node_modules/quick-lru": { + "version": "4.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "license": "MIT" + "node_modules/caniuse-lite": { + "version": "1.0.30001659", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001659.tgz", + "integrity": "sha512-Qxxyfv3RdHAfJcXelgf0hU4DFUVXBGTjqrBUZLUh8AtlGnsDo+CnncYtTd95+ZKfnANUOzxyIQCuU/UeBZBYoA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "node_modules/cbor": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "nofilter": "^3.1.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=12.19" + } + }, + "node_modules/cbor-extract": { + "version": "2.2.0", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.1.1" }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "bin": { + "download-cbor-prebuilds": "bin/download-prebuilds.js" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "optionalDependencies": { + "@cbor-extract/cbor-extract-darwin-arm64": "2.2.0", + "@cbor-extract/cbor-extract-darwin-x64": "2.2.0", + "@cbor-extract/cbor-extract-linux-arm": "2.2.0", + "@cbor-extract/cbor-extract-linux-arm64": "2.2.0", + "@cbor-extract/cbor-extract-linux-x64": "2.2.0", + "@cbor-extract/cbor-extract-win32-x64": "2.2.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", + "node_modules/cbor-x": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/cbor-x/-/cbor-x-1.5.9.tgz", + "integrity": "sha512-OEI5rEu3MeR0WWNUXuIGkxmbXVhABP+VtgAXzm48c9ulkrsvxshjjk94XSOGphyAKeNGLPfAxxzEtgQ6rEVpYQ==", + "optionalDependencies": { + "cbor-extract": "^2.2.0" + } + }, + "node_modules/chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=4" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "dev": true, + "node_modules/chalk": { + "version": "5.3.0", "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", + "node_modules/chardet": { + "version": "0.7.0", + "license": "MIT" + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" + "get-func-name": "^2.0.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "*" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-launcher": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", + "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", + "peer": true, + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "bin": { + "print-chrome-path": "bin/print-chrome-path.js" }, - "peerDependencies": { - "eslint": "*" + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/chromium-edge-launcher": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", + "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", + "peer": true, + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0", + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "node_modules/chromium-edge-launcher/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "peer": true, + "bin": { + "mkdirp": "bin/cmd.js" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" } + ], + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "dev": true, + "node_modules/clean-stack": { + "version": "2.2.0", "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/cli-cursor": { + "version": "4.0.0", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "restore-cursor": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "license": "ISC", + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" } }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "dev": true, + "node_modules/cli-highlight/node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "color-convert": "^2.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "dev": true, + "node_modules/cli-highlight/node_modules/chalk": { + "version": "4.1.2", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/cliui": { + "version": "7.0.4", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, - "node_modules/@upstash/core-analytics": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@upstash/core-analytics/-/core-analytics-0.0.9.tgz", - "integrity": "sha512-9NXXxZ5y1/A/zqKLlVT7NsAWSggJfOjB0hG6Ffx29b4jbzHOiQVWB55h5+j2clT9Ib+mNPXn0iB5zN3aWLkICw==", + "node_modules/cli-highlight/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", "dependencies": { - "@upstash/redis": "^1.28.3" + "color-name": "~1.1.4" }, "engines": { - "node": ">=16.0.0" + "node": ">=7.0.0" } }, - "node_modules/@upstash/ratelimit": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@upstash/ratelimit/-/ratelimit-1.2.1.tgz", - "integrity": "sha512-o01lV1yFS5Fzj5KONZmNyVch/Qrlj785B2ob+kStUmxn8F6xXk7IHTQqVcHE+Ce3CmT/qQIwvMxDZftyJ5wYpQ==", - "dependencies": { - "@upstash/core-analytics": "^0.0.9" + "node_modules/cli-highlight/node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/cli-highlight/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/cli-highlight/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/@upstash/redis": { - "version": "1.31.6", - "resolved": "https://registry.npmjs.org/@upstash/redis/-/redis-1.31.6.tgz", - "integrity": "sha512-7sDQQqvVnnV+2PUVGjocITa34CULGLoWhmfSY/LtpxNYv24EsgOk9VXhmGXIyzJBcXxB614wOF6ccEN0Lr7fqQ==", - "dependencies": { - "crypto-js": "^4.2.0" + "node_modules/cli-highlight/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/@vercel/kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@vercel/kv/-/kv-2.0.0.tgz", - "integrity": "sha512-zdVrhbzZBYo5d1Hfn4bKtqCeKf0FuzW8rSHauzQVMUgv1+1JOwof2mWcBuI+YMJy8s0G0oqAUfQ7HgUDzb8EbA==", + "node_modules/cli-highlight/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", "dependencies": { - "@upstash/redis": "^1.31.3" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=14.6" + "node": ">=8" } }, - "node_modules/@vitest/coverage-istanbul": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-1.4.0.tgz", - "integrity": "sha512-39TjURYyAY6CLDx8M1RNYGoAuWicPWoofk+demJbAZROLCwUgGPgMRSg51GN+snbmQRTpSizuS9XC3cMSdQH2Q==", - "dev": true, + "node_modules/cli-highlight/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", "dependencies": { - "debug": "^4.3.4", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-instrument": "^6.0.1", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.4", - "istanbul-reports": "^3.1.6", - "magicast": "^0.3.3", - "picocolors": "^1.0.0", - "test-exclude": "^6.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "has-flag": "^4.0.0" }, - "peerDependencies": { - "vitest": "1.4.0" + "engines": { + "node": ">=8" } }, - "node_modules/@vitest/expect": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.4.0.tgz", - "integrity": "sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==", - "dev": true, + "node_modules/cli-highlight/node_modules/wrap-ansi": { + "version": "7.0.0", + "license": "MIT", "dependencies": { - "@vitest/spy": "1.4.0", - "@vitest/utils": "1.4.0", - "chai": "^4.3.10" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@vitest/runner": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.4.0.tgz", - "integrity": "sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==", - "dev": true, + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "license": "MIT", "dependencies": { - "@vitest/utils": "1.4.0", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=10" } }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, + "node_modules/cli-highlight/node_modules/yargs-parser": { + "version": "20.2.9", + "license": "ISC", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, + "node_modules/cli-spinners": { + "version": "2.9.1", + "license": "MIT", "engines": { - "node": ">=12.20" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@vitest/snapshot": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.4.0.tgz", - "integrity": "sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==", + "node_modules/cli-truncate": { + "version": "3.1.0", "dev": true, + "license": "MIT", "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@vitest/snapshot/node_modules/magic-string": { - "version": "0.30.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.9.tgz", - "integrity": "sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==", - "dev": true, + "node_modules/client-only": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "license": "ISC", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { "node": ">=12" } }, - "node_modules/@vitest/spy": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.4.0.tgz", - "integrity": "sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==", - "dev": true, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", "dependencies": { - "tinyspy": "^2.2.0" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@vitest/utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.4.0.tgz", - "integrity": "sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==", - "dev": true, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" + "color-name": "~1.1.4" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@vitest/utils/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@wry/caches": { - "version": "1.0.1", + "node_modules/clone": { + "version": "1.0.4", "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "peer": true, "dependencies": { - "tslib": "^2.3.0" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/@wry/context": { - "version": "0.7.4", - "license": "MIT", + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "peer": true, "dependencies": { - "tslib": "^2.3.0" + "isobject": "^3.0.1" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/@wry/equality": { - "version": "0.5.7", + "node_modules/clone-response": { + "version": "1.0.2", "license": "MIT", "dependencies": { - "tslib": "^2.3.0" - }, + "mimic-response": "^1.0.0" + } + }, + "node_modules/clsx": { + "version": "2.0.0", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/@wry/trie": { - "version": "0.5.0", + "node_modules/code-block-writer": { + "version": "12.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/color": { + "version": "3.2.1", "license": "MIT", "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": ">=8" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, - "node_modules/@yr/monotone-cubic-spline": { - "version": "1.0.3", + "node_modules/color-convert": { + "version": "1.9.3", "license": "MIT", - "peer": true + "dependencies": { + "color-name": "1.1.3" + } }, - "node_modules/abbrev": { - "version": "1.1.1", - "license": "ISC" + "node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" }, - "node_modules/acorn": { - "version": "8.11.3", - "devOptional": true, + "node_modules/color-string": { + "version": "1.9.1", "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "license": "ISC", "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "color-support": "bin.js" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", + "node_modules/colorette": { + "version": "2.0.20", "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } + "license": "MIT" }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "devOptional": true, + "node_modules/colors": { + "version": "1.2.5", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.4.0" + "node": ">=0.1.90" } }, - "node_modules/aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + "node_modules/colorspace": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } }, - "node_modules/agent-base": { - "version": "6.0.2", + "node_modules/combined-stream": { + "version": "1.0.8", "license": "MIT", "dependencies": { - "debug": "4" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 0.8" } }, - "node_modules/agentkeepalive": { - "version": "4.5.0", + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", + "peer": true + }, + "node_modules/commander": { + "version": "11.0.0", + "dev": true, "license": "MIT", - "optional": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "peer": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "peer": true, "dependencies": { - "humanize-ms": "^1.2.1" + "mime-db": ">= 1.43.0 < 2" }, "engines": { - "node": ">= 8.0.0" + "node": ">= 0.6" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "license": "MIT", + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "peer": true, "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "license": "MIT", + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "ms": "2.0.0" } }, - "node_modules/ansi-colors": { - "version": "4.1.3", + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "peer": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/config": { + "version": "3.3.9", "license": "MIT", + "dependencies": { + "json5": "^2.2.3" + }, "engines": { - "node": ">=6" + "node": ">= 10.0.0" } }, - "node_modules/ansi-escapes": { - "version": "5.0.0", - "dev": true, - "license": "MIT", + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "peer": true, "dependencies": { - "type-fest": "^1.0.2" + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.10.0" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/ansi-styles": { - "version": "6.2.1", + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "license": "ISC" + }, + "node_modules/content-disposition": { + "version": "0.5.4", "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "safe-buffer": "5.2.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">= 0.6" } }, - "node_modules/any-promise": { - "version": "1.3.0", + "node_modules/convert-source-map": { + "version": "1.9.0", "license": "MIT" }, - "node_modules/apexcharts": { - "version": "3.44.0", + "node_modules/copy-to-clipboard": { + "version": "3.3.3", "license": "MIT", - "peer": true, "dependencies": { - "@yr/monotone-cubic-spline": "^1.0.3", - "svg.draggable.js": "^2.2.2", - "svg.easing.js": "^2.0.0", - "svg.filter.js": "^2.0.2", - "svg.pathmorphing.js": "^0.1.3", - "svg.resize.js": "^1.4.3", - "svg.select.js": "^3.0.1" + "toggle-selection": "^1.0.6" } }, - "node_modules/app-root-path": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">= 6.0.0" + "node_modules/core-js-compat": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "peer": true, + "dependencies": { + "browserslist": "^4.23.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/aproba": { - "version": "2.0.0", - "license": "ISC" + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" }, - "node_modules/archive-type": { - "version": "4.0.0", + "node_modules/cosmiconfig": { + "version": "7.1.0", "license": "MIT", "dependencies": { - "file-type": "^4.2.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/archive-type/node_modules/file-type": { - "version": "4.4.0", - "license": "MIT", + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, "engines": { - "node": ">=4" + "node": ">=0.8" } }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "license": "ISC", + "node_modules/create-require": { + "version": "1.1.1", + "devOptional": true, + "license": "MIT" + }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.2", + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, + "node_modules/csstype": { + "version": "3.1.2", + "license": "MIT" + }, + "node_modules/csv": { + "version": "5.5.3", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "csv-generate": "^3.4.3", + "csv-parse": "^4.16.3", + "csv-stringify": "^5.6.5", + "stream-transform": "^2.1.3" }, "engines": { - "node": ">= 6" + "node": ">= 0.1.90" } }, - "node_modules/arg": { - "version": "4.1.3", - "devOptional": true, + "node_modules/csv-generate": { + "version": "3.4.3", "license": "MIT" }, - "node_modules/argparse": { - "version": "2.0.1", - "dev": true, - "license": "Python-2.0" + "node_modules/csv-parse": { + "version": "4.16.3", + "license": "MIT" }, - "node_modules/aria-query": { - "version": "5.3.0", + "node_modules/csv-stringify": { + "version": "5.6.5", + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } + "license": "BSD-2-Clause" }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "license": "MIT", + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/date-fns" } }, - "node_modules/array-includes": { - "version": "3.1.7", - "dev": true, + "node_modules/dayjs": { + "version": "1.11.10", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.4", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" + "ms": "2.1.2" }, "engines": { - "node": ">= 0.4" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/array-union": { - "version": "2.1.0", + "node_modules/decamelize": { + "version": "1.2.0", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "dev": true, + "node_modules/decamelize-keys": { + "version": "1.1.1", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "dev": true, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress": { + "version": "4.2.1", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "dev": true, + "node_modules/decompress-response": { + "version": "3.3.0", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", + "node_modules/decompress-tar": { + "version": "4.1.1", "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/arrify": { - "version": "1.0.1", + "node_modules/decompress-tar/node_modules/file-type": { + "version": "5.2.0", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, + "node_modules/decompress-tarbz2": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, "engines": { - "node": "*" + "node": ">=4" } }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "dev": true, - "license": "MIT" - }, - "node_modules/async": { - "version": "3.2.5", - "license": "MIT" - }, - "node_modules/async-exit-hook": { - "version": "2.0.1", + "node_modules/decompress-tarbz2/node_modules/file-type": { + "version": "6.2.0", "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": ">=4" } }, - "node_modules/async-mutex": { - "version": "0.4.0", + "node_modules/decompress-targz": { + "version": "4.1.1", "license": "MIT", "dependencies": { - "tslib": "^2.4.0" + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "dev": true, + "node_modules/decompress-targz/node_modules/file-type": { + "version": "5.2.0", "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" + "engines": { + "node": ">=4" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", + "node_modules/decompress-unzip": { + "version": "4.0.1", "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/await-semaphore": { - "version": "0.1.3", - "license": "MIT" - }, - "node_modules/axe-core": { - "version": "4.7.0", - "dev": true, - "license": "MPL-2.0", "engines": { "node": ">=4" } }, - "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axobject-query": { - "version": "3.2.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" + "node_modules/decompress-unzip/node_modules/file-type": { + "version": "3.9.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", + "node_modules/decompress-unzip/node_modules/get-stream": { + "version": "2.3.1", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" }, "engines": { - "node": ">=10", - "npm": ">=6" + "node": ">=0.10.0" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/base-x": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", - "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/bech32": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "license": "Apache-2.0" + "node_modules/decompress-unzip/node_modules/pify": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/better-path-resolve": { - "version": "1.0.0", + "node_modules/decompress/node_modules/make-dir": { + "version": "1.3.0", "license": "MIT", "dependencies": { - "is-windows": "^1.0.0" + "pify": "^3.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/bignumber.js": { - "version": "9.1.2", + "node_modules/decompress/node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", "license": "MIT", "engines": { - "node": "*" + "node": ">=4" } }, - "node_modules/bip174": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bip174/-/bip174-2.1.1.tgz", - "integrity": "sha512-mdFV5+/v0XyNYXjBS6CQPLo9ekCx4gtKZFnJm5PMto7Fs9hTTDpkkzOB7/FtluRI6JbUUAu+snTYfJRgHLZbZQ==", + "node_modules/decompress/node_modules/pify": { + "version": "2.3.0", + "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/bitcoinjs-lib": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.1.6.tgz", - "integrity": "sha512-Fk8+Vc+e2rMoDU5gXkW9tD+313rhkm5h6N9HfZxXvYU9LedttVvmXKTgd9k5rsQJjkSfsv6XRM8uhJv94SrvcA==", + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, "dependencies": { - "@noble/hashes": "^1.2.0", - "bech32": "^2.0.0", - "bip174": "^2.1.1", - "bs58check": "^3.0.1", - "typeforce": "^1.11.3", - "varuint-bitcoin": "^1.1.2" + "type-detect": "^4.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=6" } }, - "node_modules/bl": { - "version": "5.1.0", + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", "license": "MIT", "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", + "node_modules/defer-to-connect": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" }, "engines": { - "node": ">= 6" + "node": ">= 0.4" } }, - "node_modules/blake2b": { - "version": "2.1.3", - "license": "ISC", - "dependencies": { - "blake2b-wasm": "^1.1.0", - "nanoassert": "^1.0.0" + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" } }, - "node_modules/blake2b-wasm": { - "version": "1.1.7", + "node_modules/define-properties": { + "version": "1.2.1", "license": "MIT", "dependencies": { - "nanoassert": "^1.0.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/blakejs": { - "version": "1.2.1", + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", "license": "MIT" }, - "node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "node_modules/denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==", + "peer": true }, - "node_modules/bottleneck": { - "version": "2.19.5", - "license": "MIT" + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "peer": true, + "engines": { + "node": ">= 0.8" + } }, - "node_modules/brace-expansion": { - "version": "1.1.11", + "node_modules/deprecation": { + "version": "2.3.1", + "license": "ISC" + }, + "node_modules/dequal": { + "version": "2.0.3", + "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=6" } }, - "node_modules/braces": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "peer": true, "engines": { - "node": ">=8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/breakword": { - "version": "1.0.6", + "node_modules/detect-browser": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz", + "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==" + }, + "node_modules/detect-indent": { + "version": "6.1.0", "license": "MIT", - "dependencies": { - "wcwidth": "^1.0.1" + "engines": { + "node": ">=8" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + "node_modules/detect-libc": { + "version": "2.0.2", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } }, - "node_modules/browserslist": { - "version": "4.22.1", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, + "node_modules/diff": { + "version": "4.0.2", + "devOptional": true, + "license": "BSD-3-Clause", "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=0.3.1" } }, - "node_modules/bs58": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", - "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", - "dependencies": { - "base-x": "^4.0.0" + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/bs58check": { + "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-3.0.1.tgz", - "integrity": "sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==", + "license": "MIT", "dependencies": { - "@noble/hashes": "^1.2.0", - "bs58": "^5.0.0" + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/btoa": { - "version": "1.2.1", - "license": "(MIT OR Apache-2.0)", - "bin": { - "btoa": "bin/btoa.js" + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" }, "engines": { - "node": ">= 0.4.0" + "node": ">=6.0.0" } }, - "node_modules/btoa-lite": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/dom-helpers": { + "version": "5.2.1", "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" } }, - "node_modules/buffer-alloc": { - "version": "1.2.0", + "node_modules/dot-case": { + "version": "3.0.4", + "dev": true, "license": "MIT", "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "license": "MIT" + "node_modules/dotenv": { + "version": "16.3.1", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", + "node_modules/download": { + "version": "8.0.0", "license": "MIT", + "dependencies": { + "archive-type": "^4.0.0", + "content-disposition": "^0.5.2", + "decompress": "^4.2.1", + "ext-name": "^5.0.0", + "file-type": "^11.1.0", + "filenamify": "^3.0.0", + "get-stream": "^4.1.0", + "got": "^8.3.1", + "make-dir": "^2.1.0", + "p-event": "^2.1.0", + "pify": "^4.0.1" + }, "engines": { - "node": "*" + "node": ">=10" } }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", + "node_modules/duplexer3": { + "version": "0.1.5", "license": "BSD-3-Clause" }, - "node_modules/buffer-fill": { - "version": "1.0.0", + "node_modules/eastasianwidth": { + "version": "0.2.0", "license": "MIT" }, - "node_modules/buffer-writer": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" } }, - "node_modules/busboy": { - "version": "1.6.0", + "node_modules/eciesjs": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.3.20.tgz", + "integrity": "sha512-Rz5AB8v9+xmMdS/R7RzWPe/R8DP5QfyrkA6ce4umJopoB5su2H2aDy/GcgIfwhmCwxnBkqGf/PbGzmKcGtIgGA==", "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" + "@types/secp256k1": "^4.0.6", + "futoin-hkdf": "^1.5.3", + "secp256k1": "^5.0.0" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/eciesjs/node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" }, - "node_modules/cacache": { - "version": "15.3.0", - "license": "ISC", - "optional": true, + "node_modules/eciesjs/node_modules/secp256k1": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-5.0.0.tgz", + "integrity": "sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==", + "hasInstallScript": true, "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "elliptic": "^6.5.4", + "node-addon-api": "^5.0.0", + "node-gyp-build": "^4.2.0" }, "engines": { - "node": ">= 10" + "node": ">=14.0.0" } }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "optional": true, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "peer": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.18", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.18.tgz", + "integrity": "sha512-1OfuVACu+zKlmjsNdcJuVQuVE61sZOLbNM4JAQ1Rvh6EOj0/EUKhMJjRH73InPlXSh8HIJk1cVZ8pyOV/FMdUQ==" + }, + "node_modules/elliptic": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", + "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", "dependencies": { - "yallist": "^4.0.0" - }, + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/enabled": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "peer": true, "engines": { - "node": ">=10" + "node": ">= 0.8" } }, - "node_modules/cacache/node_modules/mkdirp": { - "version": "1.0.4", + "node_modules/encoding": { + "version": "0.1.13", "license": "MIT", "optional": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" + "dependencies": { + "iconv-lite": "^0.6.2" } }, - "node_modules/cacache/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC", - "optional": true - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", + "node_modules/end-of-stream": { + "version": "1.4.4", "license": "MIT", - "engines": { - "node": ">=10.6.0" + "dependencies": { + "once": "^1.4.0" } }, - "node_modules/cacheable-request": { - "version": "2.1.4", - "license": "MIT", + "node_modules/engine.io-client": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.4.tgz", + "integrity": "sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==", "dependencies": { - "clone-response": "1.0.2", - "get-stream": "3.0.0", - "http-cache-semantics": "3.8.1", - "keyv": "3.0.0", - "lowercase-keys": "1.0.0", - "normalize-url": "2.0.1", - "responselike": "1.0.2" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.0.0" } }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "3.0.0", - "license": "MIT", + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "engines": { - "node": ">=4" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/cacheable-request/node_modules/json-buffer": { - "version": "3.0.0", - "license": "MIT" + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "engines": { + "node": ">=10.0.0" + } }, - "node_modules/cacheable-request/node_modules/keyv": { - "version": "3.0.0", + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "dev": true, "license": "MIT", "dependencies": { - "json-buffer": "3.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" } }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "1.0.0", + "node_modules/enquirer": { + "version": "2.4.1", "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8.6" } }, - "node_modules/call-bind": { - "version": "1.0.5", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "node_modules/entities": { + "version": "4.5.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/callsites": { - "version": "3.1.0", + "node_modules/env-paths": { + "version": "2.2.1", "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" + "node_modules/envinfo": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", + "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", + "peer": true, + "bin": { + "envinfo": "dist/cli.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" } }, - "node_modules/camelcase-keys": { - "version": "6.2.2", + "node_modules/ergo-lib-wasm-nodejs": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/ergo-lib-wasm-nodejs/-/ergo-lib-wasm-nodejs-0.24.1.tgz", + "integrity": "sha512-S80/psMHAmsKndrrL7IAYT5TJD1YnHlTpqWr/oAaO0yGafjRxIB5MxX4GDxZhDem+hu44O8Nl/e0ieG/SytUtg==" + }, + "node_modules/err-code": { + "version": "2.0.3", + "license": "MIT", + "optional": true + }, + "node_modules/error-ex": { + "version": "1.3.2", "license": "MIT", "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "is-arrayish": "^0.2.1" } }, - "node_modules/camelcase-keys/node_modules/camelcase": { - "version": "5.3.1", - "license": "MIT", - "engines": { - "node": ">=6" + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "peer": true, + "dependencies": { + "stackframe": "^1.3.4" } }, - "node_modules/camelcase-keys/node_modules/quick-lru": { - "version": "4.0.1", - "license": "MIT", + "node_modules/errorhandler": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", + "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", + "peer": true, + "dependencies": { + "accepts": "~1.3.7", + "escape-html": "~1.0.3" + }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001606", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz", - "integrity": "sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/cbor": { - "version": "8.1.0", + "node_modules/es-abstract": { + "version": "1.22.3", "license": "MIT", "dependencies": { - "nofilter": "^3.1.0" + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" }, "engines": { - "node": ">=12.19" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cbor-extract": { - "version": "2.2.0", - "hasInstallScript": true, + "node_modules/es-iterator-helpers": { + "version": "1.0.15", + "dev": true, + "license": "MIT", + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.2", "license": "MIT", - "optional": true, "dependencies": { - "node-gyp-build-optional-packages": "5.1.1" - }, - "bin": { - "download-cbor-prebuilds": "bin/download-prebuilds.js" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, - "optionalDependencies": { - "@cbor-extract/cbor-extract-darwin-arm64": "2.2.0", - "@cbor-extract/cbor-extract-darwin-x64": "2.2.0", - "@cbor-extract/cbor-extract-linux-arm": "2.2.0", - "@cbor-extract/cbor-extract-linux-arm64": "2.2.0", - "@cbor-extract/cbor-extract-linux-x64": "2.2.0", - "@cbor-extract/cbor-extract-win32-x64": "2.2.0" + "engines": { + "node": ">= 0.4" } }, - "node_modules/cbor-x": { - "version": "1.5.9", - "resolved": "https://registry.npmjs.org/cbor-x/-/cbor-x-1.5.9.tgz", - "integrity": "sha512-OEI5rEu3MeR0WWNUXuIGkxmbXVhABP+VtgAXzm48c9ulkrsvxshjjk94XSOGphyAKeNGLPfAxxzEtgQ6rEVpYQ==", - "optionalDependencies": { - "cbor-extract": "^2.2.0" + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" } }, - "node_modules/chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", - "dev": true, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "license": "MIT", "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/chalk": { - "version": "5.3.0", + "node_modules/esbuild": { + "version": "0.18.20", + "dev": true, + "hasInstallScript": true, "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=12" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" } }, - "node_modules/chardet": { - "version": "0.7.0", - "license": "MIT" - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "*" + "node": ">=12" } }, - "node_modules/chownr": { - "version": "2.0.0", - "license": "ISC", + "node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/ci-info": { - "version": "3.9.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } + "node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" ], - "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "license": "MIT", + "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/cli-cursor": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "restore-cursor": "^4.0.0" - }, + "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/cli-highlight": { - "version": "2.1.11", - "license": "ISC", - "dependencies": { - "chalk": "^4.0.0", - "highlight.js": "^10.7.1", - "mz": "^2.4.0", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^6.0.0", - "yargs": "^16.0.0" - }, - "bin": { - "highlight": "bin/highlight" - }, + "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" + "node": ">=12" } }, - "node_modules/cli-highlight/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, + "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=12" } }, - "node_modules/cli-highlight/node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=12" } }, - "node_modules/cli-highlight/node_modules/cliui": { - "version": "7.0.4", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/cli-highlight/node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, + "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=7.0.0" + "node": ">=12" } }, - "node_modules/cli-highlight/node_modules/color-name": { - "version": "1.1.4", - "license": "MIT" - }, - "node_modules/cli-highlight/node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "node_modules/cli-highlight/node_modules/has-flag": { - "version": "4.0.0", - "license": "MIT", + "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/cli-highlight/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", + "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/cli-highlight/node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, + "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/cli-highlight/node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/cli-highlight/node_modules/wrap-ansi": { - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=12" } }, - "node_modules/cli-highlight/node_modules/yargs": { - "version": "16.2.0", - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, + "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/cli-highlight/node_modules/yargs-parser": { - "version": "20.2.9", - "license": "ISC", + "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/cli-spinners": { - "version": "2.9.1", - "license": "MIT", + "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/cli-truncate": { - "version": "3.1.0", + "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/client-only": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/cliui": { - "version": "8.0.1", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, + "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">=12" } }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, + "node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=12" } }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "engines": { - "node": ">=7.0.0" + "node": ">=6" } }, - "node_modules/cliui/node_modules/color-name": { - "version": "1.1.4", - "license": "MIT" - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "peer": true }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", + "node_modules/escape-string-regexp": { + "version": "4.0.0", "license": "MIT", "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "node": ">=10" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", + "node_modules/eslint": { + "version": "8.42.0", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.42.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "node": ">=0.8" + "url": "https://opencollective.com/eslint" } }, - "node_modules/clone-response": { - "version": "1.0.2", + "node_modules/eslint-config-next": { + "version": "13.4.4", + "dev": true, "license": "MIT", "dependencies": { - "mimic-response": "^1.0.0" + "@next/eslint-plugin-next": "13.4.4", + "@rushstack/eslint-patch": "^1.1.3", + "@typescript-eslint/parser": "^5.42.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.31.7", + "eslint-plugin-react-hooks": "^4.5.0" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/clsx": { - "version": "2.0.0", + "node_modules/eslint-config-next/node_modules/@next/eslint-plugin-next": { + "version": "13.4.4", + "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "glob": "7.1.7" } }, - "node_modules/code-block-writer": { - "version": "12.0.0", + "node_modules/eslint-config-prettier": { + "version": "9.1.0", "dev": true, - "license": "MIT" - }, - "node_modules/color": { - "version": "3.2.1", "license": "MIT", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/color-convert": { - "version": "1.9.3", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "dev": true, "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "dev": true, "license": "MIT", "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "ms": "^2.1.1" } }, - "node_modules/color-support": { - "version": "1.1.3", + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "dev": true, "license": "ISC", - "bin": { - "color-support": "bin.js" + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" } }, - "node_modules/colorette": { - "version": "2.0.20", - "dev": true, - "license": "MIT" - }, - "node_modules/colors": { - "version": "1.2.5", + "node_modules/eslint-module-utils": { + "version": "2.8.0", "dev": true, "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, "engines": { - "node": ">=0.1.90" + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/colorspace": { - "version": "1.1.4", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, "license": "MIT", "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" + "ms": "^2.1.1" } }, - "node_modules/combined-stream": { - "version": "1.0.8", + "node_modules/eslint-plugin-import": { + "version": "2.29.0", + "dev": true, "license": "MIT", "dependencies": { - "delayed-stream": "~1.0.0" + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" }, "engines": { - "node": ">= 0.8" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, - "node_modules/commander": { - "version": "11.0.0", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", "dev": true, "license": "MIT", - "engines": { - "node": ">=16" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/config": { - "version": "3.3.9", - "license": "MIT", + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "json5": "^2.2.3" + "esutils": "^2.0.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=0.10.0" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "license": "ISC" + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/content-disposition": { - "version": "0.5.4", + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.8.0", + "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "5.2.1" + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" }, "engines": { - "node": ">= 0.6" + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, - "node_modules/copy-to-clipboard": { - "version": "3.3.3", + "node_modules/eslint-plugin-react": { + "version": "7.33.2", + "dev": true, "license": "MIT", "dependencies": { - "toggle-selection": "^1.0.6" + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "dev": true, "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, "engines": { "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, - "node_modules/create-require": { - "version": "1.1.1", - "devOptional": true, - "license": "MIT" - }, - "node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "dependencies": { - "node-fetch": "^2.6.12" + "node_modules/eslint-plugin-react-refresh": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=7" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "license": "MIT", + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "esutils": "^2.0.2" }, "engines": { - "node": ">= 8" + "node": ">=0.10.0" } }, - "node_modules/crypto-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" - }, - "node_modules/csstype": { - "version": "3.1.2", - "license": "MIT" - }, - "node_modules/csv": { - "version": "5.5.3", + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "dev": true, "license": "MIT", "dependencies": { - "csv-generate": "^3.4.3", - "csv-parse": "^4.16.3", - "csv-stringify": "^5.6.5", - "stream-transform": "^2.1.3" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">= 0.1.90" + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/csv-generate": { - "version": "3.4.3", - "license": "MIT" - }, - "node_modules/csv-parse": { - "version": "4.16.3", - "license": "MIT" - }, - "node_modules/csv-stringify": { - "version": "5.6.5", - "license": "MIT" - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/dayjs": { - "version": "1.11.10", - "license": "MIT" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/debug": { - "version": "4.3.4", - "license": "MIT", + "node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "ms": "2.1.2" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8.0.0" } }, - "node_modules/decamelize": { - "version": "1.2.0", - "license": "MIT", + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=0.10.0" + "node": ">=4.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/decamelize-keys": { - "version": "1.1.1", + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, "license": "MIT", "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/decode-uri-component": { - "version": "0.2.2", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=0.10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/decompress": { - "version": "4.2.1", + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, "license": "MIT", "dependencies": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=4" + "node": ">=7.0.0" } }, - "node_modules/decompress-response": { - "version": "3.3.0", - "license": "MIT", + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "mimic-response": "^1.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/decompress-tar": { - "version": "4.1.1", + "node_modules/eslint/node_modules/globals": { + "version": "13.23.0", + "dev": true, "license": "MIT", "dependencies": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decompress-tar/node_modules/file-type": { - "version": "5.2.0", + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/decompress-tarbz2": { - "version": "4.1.1", + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, "license": "MIT", "dependencies": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/decompress-tarbz2/node_modules/file-type": { - "version": "6.2.0", - "license": "MIT", + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decompress-targz": { - "version": "4.1.1", - "license": "MIT", + "node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-targz/node_modules/file-type": { - "version": "5.2.0", - "license": "MIT", - "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/decompress-unzip": { + "node_modules/esprima": { "version": "4.0.1", - "license": "MIT", - "dependencies": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { "node": ">=4" } }, - "node_modules/decompress-unzip/node_modules/file-type": { - "version": "3.9.0", - "license": "MIT", + "node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, - "node_modules/decompress-unzip/node_modules/get-stream": { - "version": "2.3.1", - "license": "MIT", + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0" } }, - "node_modules/decompress-unzip/node_modules/pify": { - "version": "2.3.0", - "license": "MIT", + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=0.10.0" + "node": ">=4.0" } }, - "node_modules/decompress/node_modules/make-dir": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } + "node_modules/estree-walker": { + "version": "2.0.2", + "dev": true, + "license": "MIT" }, - "node_modules/decompress/node_modules/make-dir/node_modules/pify": { - "version": "3.0.0", - "license": "MIT", + "node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/decompress/node_modules/pify": { - "version": "2.3.0", - "license": "MIT", + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, + "node_modules/eth-rpc-errors": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz", + "integrity": "sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==", "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" + "fast-safe-stringify": "^2.0.6" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "dev": true, - "license": "MIT" + "node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } }, - "node_modules/defaults": { - "version": "1.0.4", - "license": "MIT", + "node_modules/ethereum-cryptography/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dependencies": { - "clone": "^1.0.2" + "@noble/hashes": "1.4.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=10" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/define-data-property": { - "version": "1.1.1", - "license": "MIT", + "node_modules/ethers": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.2.tgz", + "integrity": "sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.17.1" }, "engines": { - "node": ">= 0.4" + "node": ">=14.0.0" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, + "node_modules/ethers/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", "engines": { - "node": ">= 0.4" + "node": ">= 16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/delegates": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/deprecation": { - "version": "2.3.1", - "license": "ISC" + "node_modules/ethers/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" }, - "node_modules/dequal": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "node_modules/ethers/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, - "node_modules/detect-indent": { - "version": "6.1.0", - "license": "MIT", + "node_modules/ethers/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "engines": { - "node": ">=8" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/detect-libc": { - "version": "2.0.2", - "license": "Apache-2.0", + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/diff": { - "version": "4.0.2", - "devOptional": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } + "node_modules/eventemitter2": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "node_modules/eventemitter3": { + "version": "5.0.1", "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } + "license": "MIT" }, - "node_modules/dir-glob": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "engines": { - "node": ">=8" + "node": ">=0.8.x" } }, - "node_modules/doctrine": { - "version": "3.0.0", + "node_modules/execa": { + "version": "7.2.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">=6.0.0" + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/dom-helpers": { - "version": "5.2.1", + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dot-case": { - "version": "3.0.4", + "node_modules/execa/node_modules/is-stream": { + "version": "3.0.0", "dev": true, "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dotenv": { - "version": "16.3.1", - "license": "BSD-2-Clause", "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/download": { - "version": "8.0.0", + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "peer": true + }, + "node_modules/ext-list": { + "version": "2.2.2", "license": "MIT", "dependencies": { - "archive-type": "^4.0.0", - "content-disposition": "^0.5.2", - "decompress": "^4.2.1", - "ext-name": "^5.0.0", - "file-type": "^11.1.0", - "filenamify": "^3.0.0", - "get-stream": "^4.1.0", - "got": "^8.3.1", - "make-dir": "^2.1.0", - "p-event": "^2.1.0", - "pify": "^4.0.1" + "mime-db": "^1.28.0" }, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/duplexer3": { - "version": "0.1.5", - "license": "BSD-3-Clause" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "license": "MIT" - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "license": "Apache-2.0", + "node_modules/ext-name": { + "version": "5.0.0", + "license": "MIT", "dependencies": { - "safe-buffer": "^5.0.1" + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/electron-to-chromium": { - "version": "1.4.588", - "dev": true, - "license": "ISC" + "node_modules/extendable-error": { + "version": "0.1.7", + "license": "MIT" }, - "node_modules/elliptic": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", - "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", + "node_modules/extension-port-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/extension-port-stream/-/extension-port-stream-3.0.0.tgz", + "integrity": "sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==", "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" + "readable-stream": "^3.6.2 || ^4.4.2", + "webextension-polyfill": ">=0.10.0 <1.0" + }, + "engines": { + "node": ">=12.0.0" } }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "license": "MIT" - }, - "node_modules/enabled": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/encoding": { - "version": "0.1.13", - "license": "MIT", - "optional": true, + "node_modules/extension-port-stream/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dependencies": { - "iconv-lite": "^0.6.2" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "license": "MIT", + "node_modules/extension-port-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { - "once": "^1.4.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/enhanced-resolve": { - "version": "5.15.0", + "node_modules/extensionless": { + "version": "1.9.6", "dev": true, + "license": "MIT" + }, + "node_modules/external-editor": { + "version": "3.1.0", "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" }, "engines": { - "node": ">=10.13.0" + "node": ">=4" } }, - "node_modules/enquirer": { - "version": "2.4.1", + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", "license": "MIT", "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=8.6" + "node": ">=0.10.0" } }, - "node_modules/entities": { - "version": "4.5.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "engines": { + "node": ">=8.6.0" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "license": "MIT", - "optional": true, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "node_modules/ergo-lib-wasm-nodejs": { - "version": "0.24.1", - "resolved": "https://registry.npmjs.org/ergo-lib-wasm-nodejs/-/ergo-lib-wasm-nodejs-0.24.1.tgz", - "integrity": "sha512-S80/psMHAmsKndrrL7IAYT5TJD1YnHlTpqWr/oAaO0yGafjRxIB5MxX4GDxZhDem+hu44O8Nl/e0ieG/SytUtg==" + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" }, - "node_modules/err-code": { - "version": "2.0.3", - "license": "MIT", - "optional": true + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" }, - "node_modules/error-ex": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, - "node_modules/es-abstract": { - "version": "1.22.3", - "license": "MIT", + "node_modules/fast-xml-parser": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz", + "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "peer": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "strnum": "^1.0.5" }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "fxparser": "src/cli/cli.js" } }, - "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "dev": true, - "license": "MIT", + "node_modules/fastq": { + "version": "1.15.0", + "license": "ISC", "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" + "reusify": "^1.0.4" } }, - "node_modules/es-set-tostringtag": { + "node_modules/fb-watchman": { "version": "2.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "peer": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" + "bser": "2.1.1" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", + "node_modules/fd-slicer": { + "version": "1.1.0", "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "pend": "~1.2.0" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", + "node_modules/fecha": { + "version": "4.2.3", + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/esbuild": { - "version": "0.18.20", - "dev": true, - "hasInstallScript": true, + "node_modules/file-stream-rotator": { + "version": "0.6.1", "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" + "dependencies": { + "moment": "^2.29.1" } }, - "node_modules/esbuild/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/file-type": { + "version": "11.1.0", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/esbuild/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/esbuild/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/filenamify": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/fill-range": { + "version": "7.0.1", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "peer": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "peer": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "peer": true, + "dependencies": { + "locate-path": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "peer": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "peer": true, + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">=12" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "peer": true, + "dependencies": { + "p-limit": "^2.0.0" + }, "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "peer": true, "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "peer": true, + "dependencies": { + "find-up": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/find-root": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "node_modules/find-yarn-workspace-root2": { + "version": "1.2.16", + "license": "Apache-2.0", + "dependencies": { + "micromatch": "^4.0.2", + "pkg-dir": "^4.2.0" } }, - "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], + "node_modules/flat-cache": { + "version": "3.2.0", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, "engines": { - "node": ">=12" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], + "node_modules/flatted": { + "version": "3.2.9", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "license": "ISC" + }, + "node_modules/flow-enums-runtime": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", + "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", + "peer": true + }, + "node_modules/flow-parser": { + "version": "0.245.2", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.245.2.tgz", + "integrity": "sha512-FU4yuqC1j2IeWWicpzG0YJrXHJgKjK/AU8QKK/7MvQaNhcoGisDoE7FJLGCtbvnifzsgDWdm9/jtTF7Mp+PJXQ==", + "peer": true, "engines": { - "node": ">=12" + "node": ">=0.4.0" } }, - "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" + "node_modules/fn.name": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } ], "engines": { - "node": ">=12" + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "node_modules/for-each": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" } }, - "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "node_modules/foreground-child": { + "version": "3.1.1", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, "engines": { - "node": ">=12" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/esbuild/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "license": "ISC", "engines": { - "node": ">=12" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/escalade": { - "version": "3.1.1", + "node_modules/form-data": { + "version": "4.0.0", "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "license": "MIT", + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "peer": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/eslint": { - "version": "8.42.0", + "node_modules/from2": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "10.1.0", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.42.0", - "@humanwhocodes/config-array": "^0.11.10", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, - "bin": { - "eslint": "bin/eslint.js" + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-config-next": { - "version": "13.4.4", - "dev": true, + "node_modules/function.prototype.name": { + "version": "1.1.6", "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "13.4.4", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "^4.5.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", - "typescript": ">=3.3.1" + "engines": { + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-config-next/node_modules/@next/eslint-plugin-next": { - "version": "13.4.4", - "dev": true, + "node_modules/functions-have-names": { + "version": "1.2.3", "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/futoin-hkdf": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.5.3.tgz", + "integrity": "sha512-SewY5KdMpaoCeh7jachEWFsh1nNlaDjNHZXWqL5IGwtpEYHTgkr2+AMCgNwKWkcc0wpSYrZfR7he4WdmHFtDxQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "license": "ISC", "dependencies": { - "glob": "7.1.7" + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" } }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "dev": true, + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/gauge/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "dev": true, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", "license": "MIT", "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "dev": true, + "node_modules/gensync": { + "version": "1.0.0-beta.2", "license": "MIT", - "dependencies": { - "ms": "^2.1.1" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "dev": true, + "node_modules/get-caller-file": { + "version": "2.0.5", "license": "ISC", - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" - }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "node": "*" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "dev": true, + "node_modules/get-intrinsic": { + "version": "1.2.2", "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-import": { - "version": "2.29.0", - "dev": true, + "node_modules/get-stream": { + "version": "4.1.0", "license": "MIT", "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "pump": "^3.0.0" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "node": ">=6" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "dev": true, + "node_modules/get-symbol-description": { + "version": "1.0.0", "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", + "node_modules/get-tsconfig": { + "version": "4.7.2", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "resolve-pkg-maps": "^1.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "dev": true, + "node_modules/glob": { + "version": "7.1.7", "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "dev": true, - "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=4.0" + "node": "*" }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint-plugin-react": { - "version": "7.33.2", + "node_modules/glob-parent": { + "version": "6.0.2", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "node": ">=10.13.0" } }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "dev": true, + "node_modules/globals": { + "version": "11.12.0", "license": "MIT", "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + "node": ">=4" } }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.3.5", - "dev": true, + "node_modules/globalthis": { + "version": "1.0.3", "license": "MIT", - "peerDependencies": { - "eslint": ">=7" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", "dependencies": { - "esutils": "^2.0.2" + "define-properties": "^1.1.3" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "dev": true, + "node_modules/globby": { + "version": "11.1.0", "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/gopd": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/got": { + "version": "8.3.2", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/got/node_modules/get-stream": { + "version": "3.0.0", + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">=4" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", + "node_modules/got/node_modules/pify": { + "version": "3.0.0", + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=4" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "license": "MIT" + }, + "node_modules/graphemer": { + "version": "1.4.0", "dev": true, + "license": "MIT" + }, + "node_modules/graphql": { + "version": "16.8.1", + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/graphql-tag": { + "version": "2.12.6", "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "tslib": "^2.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, + "peerDependencies": { + "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "license": "MIT", "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "dev": true, + "node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "get-intrinsic": "^1.2.2" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, + "node_modules/has-symbol-support-x": { + "version": "1.4.2", "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": "*" } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" + "node_modules/has-symbols": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/has-to-string-tag-x": { + "version": "1.4.1", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "has-symbol-support-x": "^1.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "*" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.23.0", - "dev": true, + "node_modules/has-tostringtag": { + "version": "1.0.0", "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/has-unicode": { + "version": "2.0.1", + "license": "ISC" + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, + "node_modules/hasown": { + "version": "2.0.0", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "function-bind": "^1.1.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", + "node_modules/hermes-estree": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.22.0.tgz", + "integrity": "sha512-FLBt5X9OfA8BERUdc6aZS36Xz3rRuB0Y/mfocSADWEJfomc1xfene33GdyAmtTkKTBXTN/EgAy+rjTKkkZJHlw==", + "peer": true + }, + "node_modules/hermes-parser": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.22.0.tgz", + "integrity": "sha512-gn5RfZiEXCsIWsFGsKiykekktUoh0PdFWYocXsUdZIyWSckT6UIyPcyyUIPSR3kpnELWeK3n3ztAse7Mat6PSA==", + "peer": true, + "dependencies": { + "hermes-estree": "0.22.0" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "license": "BSD-3-Clause", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/espree": { - "version": "9.6.1", + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "license": "ISC" + }, + "node_modules/html-escaper": { + "version": "2.0.2", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT" + }, + "node_modules/http-cache-semantics": { + "version": "3.8.1", + "license": "BSD-2-Clause" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "peer": true, "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 0.8" } }, - "node_modules/esprima": { + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { "version": "4.0.1", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "license": "MIT", + "optional": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/esquery": { - "version": "1.5.0", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/http2-wrapper": { + "version": "1.0.3", + "license": "MIT", "dependencies": { - "estraverse": "^5.1.0" + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" }, "engines": { - "node": ">=0.10" + "node": ">=10.19.0" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=4.0" + "node": ">= 6" } }, - "node_modules/estraverse": { - "version": "5.3.0", + "node_modules/human-id": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "4.3.1", "dev": true, - "license": "BSD-2-Clause", + "license": "Apache-2.0", "engines": { - "node": ">=4.0" + "node": ">=14.18.0" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "dev": true, - "license": "MIT" + "node_modules/humanize-ms": { + "version": "1.2.1", + "license": "MIT", + "optional": true, + "dependencies": { + "ms": "^2.0.0" + } }, - "node_modules/esutils": { - "version": "2.0.3", + "node_modules/husky": { + "version": "8.0.3", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "bin": { + "husky": "lib/bin.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" } }, - "node_modules/ethers": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.2.tgz", - "integrity": "sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg==", + "node_modules/i18next": { + "version": "23.11.5", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.5.tgz", + "integrity": "sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==", "funding": [ { "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" + "url": "https://locize.com" }, { "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" } ], "dependencies": { - "@adraffy/ens-normalize": "1.10.1", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.17.1" - }, - "engines": { - "node": ">=14.0.0" + "@babel/runtime": "^7.23.2" } }, - "node_modules/ethers/node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node_modules/i18next-browser-languagedetector": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.1.0.tgz", + "integrity": "sha512-cr2k7u1XJJ4HTOjM9GyOMtbOA47RtUoWRAtt52z43r3AoMs2StYKyjS3URPhzHaf+mn10hY9dZWamga5WPQjhA==", + "dependencies": { + "@babel/runtime": "^7.19.4" } }, - "node_modules/ethers/node_modules/@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" - }, - "node_modules/ethers/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/ethers/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "node_modules/iconv-lite": { + "version": "0.6.3", + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "utf-8-validate": { - "optional": true + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "dev": true, - "license": "MIT" + ], + "license": "BSD-3-Clause" }, - "node_modules/execa": { - "version": "7.2.0", - "dev": true, + "node_modules/ignore": { + "version": "5.3.0", "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "peer": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" + "queue": "6.0.2" }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + "bin": { + "image-size": "bin/image-size.js" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "engines": { + "node": ">=16.x" } }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", - "dev": true, + "node_modules/import-fresh": { + "version": "3.3.0", "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/execa/node_modules/is-stream": { - "version": "3.0.0", + "node_modules/import-lazy": { + "version": "4.0.0", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/ext-list": { - "version": "2.2.2", + "node_modules/imurmurhash": { + "version": "0.1.4", "license": "MIT", - "dependencies": { - "mime-db": "^1.28.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.19" } }, - "node_modules/ext-name": { - "version": "5.0.0", + "node_modules/indent-string": { + "version": "4.0.0", "license": "MIT", - "dependencies": { - "ext-list": "^2.0.0", - "sort-keys-length": "^1.0.0" - }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/extendable-error": { - "version": "0.1.7", - "license": "MIT" - }, - "node_modules/extensionless": { - "version": "1.9.6", - "dev": true, - "license": "MIT" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } + "node_modules/infer-owner": { + "version": "1.0.4", + "license": "ISC", + "optional": true }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", - "license": "MIT", + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "license": "MIT" + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" }, - "node_modules/fast-glob": { - "version": "3.3.2", + "node_modules/internal-slot": { + "version": "1.0.6", "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" }, "engines": { - "node": ">=8.6.0" + "node": ">= 0.4" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "license": "ISC", + "node_modules/into-stream": { + "version": "3.1.0", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" }, "engines": { - "node": ">= 6" + "node": ">=4" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.15.0", - "license": "ISC", + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dependencies": { - "reusify": "^1.0.4" + "loose-envify": "^1.0.0" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", + "node_modules/ip": { + "version": "2.0.0", "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fecha": { - "version": "4.2.3", - "license": "MIT" + "optional": true }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "dev": true, - "license": "MIT", + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dependencies": { - "flat-cache": "^3.0.4" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/file-stream-rotator": { - "version": "0.6.1", + "node_modules/is-array-buffer": { + "version": "3.0.2", "license": "MIT", "dependencies": { - "moment": "^2.29.1" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/file-type": { - "version": "11.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } + "node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" }, - "node_modules/filename-reserved-regex": { + "node_modules/is-async-function": { "version": "2.0.0", + "dev": true, "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/filenamify": { - "version": "3.0.0", + "node_modules/is-bigint": { + "version": "1.0.4", "license": "MIT", "dependencies": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.0", - "trim-repeated": "^1.0.0" + "has-bigints": "^1.0.1" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fill-range": { - "version": "7.0.1", + "node_modules/is-boolean-object": { + "version": "1.1.2", "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/find-root": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/find-up": { - "version": "5.0.0", + "node_modules/is-callable": { + "version": "1.2.7", "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/find-yarn-workspace-root2": { - "version": "1.2.16", - "license": "Apache-2.0", + "node_modules/is-core-module": { + "version": "2.13.1", + "license": "MIT", "dependencies": { - "micromatch": "^4.0.2", - "pkg-dir": "^4.2.0" + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/flat-cache": { - "version": "3.2.0", - "dev": true, + "node_modules/is-date-object": { + "version": "1.0.5", "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/flatted": { - "version": "3.2.9", - "dev": true, - "license": "ISC" - }, - "node_modules/fn.name": { - "version": "1.1.0", - "license": "MIT" + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, "engines": { - "node": ">=4.0" + "node": ">=8" }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/for-each": { - "version": "0.3.3", + "node_modules/is-extglob": { + "version": "2.1.1", "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/foreground-child": { - "version": "3.1.1", - "license": "ISC", + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" + "call-bind": "^1.0.2" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "license": "ISC", + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=14" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/form-data": { - "version": "4.0.0", + "node_modules/is-generator-function": { + "version": "1.0.10", "license": "MIT", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">= 6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/from2": { - "version": "2.3.0", + "node_modules/is-glob": { + "version": "4.0.3", "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/fromentries": { - "version": "1.3.2", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, + "node_modules/is-interactive": { + "version": "2.0.0", "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, "engines": { "node": ">=12" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" }, - "engines": { - "node": ">= 8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "license": "ISC" + "node_modules/is-lambda": { + "version": "1.0.1", + "license": "MIT", + "optional": true }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/is-map": { + "version": "2.0.2", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/function-bind": { - "version": "1.1.2", + "node_modules/is-natural-number": { + "version": "4.0.1", + "license": "MIT" + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/function.prototype.name": { - "version": "1.1.6", + "node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -8897,107 +15684,86 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functions-have-names": { - "version": "1.2.3", + "node_modules/is-object": { + "version": "1.0.2", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "3.0.2", - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/gauge/node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", + "node_modules/is-plain-obj": { + "version": "1.1.0", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", + "node_modules/is-plain-object": { + "version": "5.0.0", "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "dev": true, + "node_modules/is-regex": { + "version": "1.1.4", "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "license": "ISC", + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "license": "MIT", "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=0.10.0" } }, - "node_modules/get-func-name": { + "node_modules/is-set": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, - "engines": { - "node": "*" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-intrinsic": { - "version": "1.2.2", + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", "license": "MIT", "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-stream": { - "version": "4.1.0", + "node_modules/is-stream": { + "version": "1.1.0", "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", + "node_modules/is-string": { + "version": "1.0.7", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -9006,59 +15772,34 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-tsconfig": { - "version": "4.7.2", - "dev": true, + "node_modules/is-subdir": { + "version": "1.2.0", "license": "MIT", "dependencies": { - "resolve-pkg-maps": "^1.0.0" + "better-path-resolve": "1.0.0" }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "engines": { + "node": ">=4" } }, - "node_modules/glob": { - "version": "7.1.7", - "license": "ISC", + "node_modules/is-symbol": { + "version": "1.0.4", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "has-symbols": "^1.0.2" }, "engines": { - "node": "*" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globalthis": { - "version": "1.0.3", + "node_modules/is-typed-array": { + "version": "1.1.12", "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -9067,1651 +15808,2141 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", + "node_modules/is-unicode-supported": { + "version": "1.3.0", "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gopd": { - "version": "1.0.1", + "node_modules/is-weakmap": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.3" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/got": { - "version": "8.3.2", + "node_modules/is-weakset": { + "version": "2.0.2", + "dev": true, "license": "MIT", "dependencies": { - "@sindresorhus/is": "^0.7.0", - "cacheable-request": "^2.1.1", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "into-stream": "^3.1.0", - "is-retry-allowed": "^1.1.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "mimic-response": "^1.0.0", - "p-cancelable": "^0.4.0", - "p-timeout": "^2.0.1", - "pify": "^3.0.0", - "safe-buffer": "^5.1.1", - "timed-out": "^4.0.1", - "url-parse-lax": "^3.0.0", - "url-to-options": "^1.0.1" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/got/node_modules/get-stream": { - "version": "3.0.0", + "node_modules/is-windows": { + "version": "1.0.2", "license": "MIT", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/got/node_modules/pify": { - "version": "3.0.0", - "license": "MIT", + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "license": "ISC" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", + "node_modules/isarray": { + "version": "1.0.0", "license": "MIT" }, - "node_modules/graphemer": { - "version": "1.4.0", - "dev": true, - "license": "MIT" + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" }, - "node_modules/graphql": { - "version": "16.8.1", - "license": "MIT", + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "peer": true, "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + "node": ">=0.10.0" } }, - "node_modules/graphql-tag": { - "version": "2.12.6", - "license": "MIT", + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.1", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "tslib": "^2.1.0" + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, "engines": { "node": ">=10" - }, - "peerDependencies": { - "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "license": "MIT", + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=6" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/has-flag": { - "version": "3.0.0", + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.2" + "semver": "^7.5.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-symbol-support-x": { - "version": "1.4.2", + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "license": "MIT", - "engines": { - "node": ">= 0.4" + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.4.tgz", + "integrity": "sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=10" } }, - "node_modules/has-to-string-tag-x": { - "version": "1.4.1", - "license": "MIT", + "node_modules/istanbul-reports": { + "version": "3.1.6", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "has-symbol-support-x": "^1.4.1" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/has-tostringtag": { + "node_modules/isurl": { "version": "1.0.0", "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 4" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "license": "ISC" + "node_modules/iterator.prototype": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "node_modules/jackspeak": { + "version": "2.3.6", + "license": "BlueOak-1.0.0", "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/hasown": { - "version": "2.0.0", - "license": "MIT", + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "peer": true, "dependencies": { - "function-bind": "^1.1.2" + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/highlight.js": { - "version": "10.7.3", - "license": "BSD-3-Clause", + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "peer": true, "engines": { - "node": "*" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "peer": true, "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "license": "BSD-3-Clause", + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, "dependencies": { - "react-is": "^16.7.0" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "license": "ISC" + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "dev": true, - "license": "MIT" + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true }, - "node_modules/http-cache-semantics": { - "version": "3.8.1", - "license": "BSD-2-Clause" + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "license": "MIT", - "optional": true, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "license": "MIT", + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "peer": true, "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=10.19.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "license": "MIT", + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "peer": true, "dependencies": { - "agent-base": "6", - "debug": "4" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/human-id": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/human-signals": { - "version": "4.3.1", - "dev": true, - "license": "Apache-2.0", + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=14.18.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "license": "MIT", - "optional": true, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/husky": { - "version": "8.0.3", - "dev": true, - "license": "MIT", - "bin": { - "husky": "lib/bin.js" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/typicode" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "license": "MIT", - "optional": true, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true }, - "node_modules/ignore": { - "version": "5.3.0", - "license": "MIT", + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, "engines": { - "node": ">= 4" + "node": ">=8" } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "license": "MIT", + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "dev": true, - "license": "MIT", + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "devOptional": true, - "license": "MIT", + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=0.8.19" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "license": "MIT", + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=8" + "node": ">=7.0.0" } }, - "node_modules/infer-owner": { - "version": "1.0.4", - "license": "ISC", - "optional": true + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true }, - "node_modules/inflight": { - "version": "1.0.6", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" } }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "node_modules/internal-slot": { - "version": "1.0.6", - "license": "MIT", + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/into-stream": { - "version": "3.1.0", - "license": "MIT", + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "peer": true, "dependencies": { - "from2": "^2.1.1", - "p-is-promise": "^1.1.0" + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/ip": { - "version": "2.0.0", - "license": "MIT", - "optional": true + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "license": "MIT", + "node_modules/jju": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/joi": { + "version": "17.11.0", + "license": "BSD-3-Clause", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", + "node_modules/js-tokens": { + "version": "4.0.0", "license": "MIT" }, - "node_modules/is-async-function": { - "version": "2.0.0", - "dev": true, + "node_modules/js-yaml": { + "version": "4.1.0", "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "argparse": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/is-bigint": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/jsc-android": { + "version": "250231.0.0", + "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz", + "integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==", + "peer": true }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "license": "MIT", + "node_modules/jsc-safe-url": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", + "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", + "peer": true + }, + "node_modules/jscodeshift": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz", + "integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==", + "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "@babel/core": "^7.13.16", + "@babel/parser": "^7.13.16", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.12", + "@babel/plugin-transform-modules-commonjs": "^7.13.8", + "@babel/preset-flow": "^7.13.13", + "@babel/preset-typescript": "^7.13.0", + "@babel/register": "^7.13.16", + "babel-core": "^7.0.0-bridge.0", + "chalk": "^4.1.2", + "flow-parser": "0.*", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "neo-async": "^2.5.0", + "node-dir": "^0.1.17", + "recast": "^0.21.0", + "temp": "^0.8.4", + "write-file-atomic": "^2.3.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "license": "MIT", - "engines": { - "node": ">= 0.4" + "bin": { + "jscodeshift": "bin/jscodeshift.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/preset-env": "^7.1.6" } }, - "node_modules/is-core-module": { - "version": "2.13.1", - "license": "MIT", + "node_modules/jscodeshift/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, "dependencies": { - "hasown": "^2.0.0" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "license": "MIT", + "node_modules/jscodeshift/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "dev": true, - "license": "MIT", + "node_modules/jscodeshift/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, "dependencies": { - "call-bind": "^1.0.2" + "color-name": "~1.1.4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=7.0.0" } }, - "node_modules/is-fullwidth-code-point": { + "node_modules/jscodeshift/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/jscodeshift/node_modules/has-flag": { "version": "4.0.0", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "license": "MIT", + "node_modules/jscodeshift/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/is-glob": { - "version": "4.0.3", + "node_modules/jsesc": { + "version": "2.5.2", "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/is-interactive": { - "version": "2.0.0", + "node_modules/json-bigint": { + "version": "1.0.0", "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "bignumber.js": "^9.0.0" } }, - "node_modules/is-lambda": { - "version": "1.0.1", - "license": "MIT", - "optional": true + "node_modules/json-buffer": { + "version": "3.0.1", + "license": "MIT" }, - "node_modules/is-map": { - "version": "2.0.2", + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "peer": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, - "node_modules/is-natural-number": { - "version": "4.0.1", + "node_modules/jsonc-parser": { + "version": "3.2.1", + "dev": true, "license": "MIT" }, - "node_modules/is-negative-zero": { - "version": "2.0.2", + "node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "universalify": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/is-number": { - "version": "7.0.0", + "node_modules/jsontokens": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsontokens/-/jsontokens-4.0.1.tgz", + "integrity": "sha512-+MO415LEN6M+3FGsRz4wU20g7N2JA+2j9d9+pGaNJHviG4L8N0qzavGyENw6fJqsq9CcrHOIL6iWX5yeTZ86+Q==", + "dependencies": { + "@noble/hashes": "^1.1.2", + "@noble/secp256k1": "^1.6.3", + "base64-js": "^1.5.1" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, "engines": { - "node": ">=0.12.0" + "node": ">=12", + "npm": ">=6" } }, - "node_modules/is-number-object": { - "version": "1.0.7", + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4.0" } }, - "node_modules/is-object": { - "version": "1.0.2", + "node_modules/jwa": { + "version": "1.4.1", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "dev": true, + "node_modules/jws": { + "version": "3.2.2", "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/is-plain-obj": { - "version": "1.1.0", + "node_modules/keyv": { + "version": "4.5.4", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", + "node_modules/kleur": { + "version": "4.1.5", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/is-regex": { - "version": "1.1.4", + "node_modules/kolorist": { + "version": "1.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/kuler": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "language-subtag-registry": "^0.3.20" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10" } }, - "node_modules/is-retry-allowed": { - "version": "1.2.0", + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" + } + }, + "node_modules/lighthouse-logger": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", + "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", + "peer": true, + "dependencies": { + "debug": "^2.6.9", + "marky": "^1.2.2" + } + }, + "node_modules/lighthouse-logger/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/is-set": { - "version": "2.0.2", + "node_modules/lighthouse-logger/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true + }, + "node_modules/lilconfig": { + "version": "2.1.0", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=10" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", + "node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/lint-staged": { + "version": "13.3.0", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "chalk": "5.3.0", + "commander": "11.0.0", + "debug": "4.3.4", + "execa": "7.2.0", + "lilconfig": "2.1.0", + "listr2": "6.6.1", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/lint-staged" } }, - "node_modules/is-stream": { - "version": "1.1.0", - "license": "MIT", + "node_modules/lint-staged/node_modules/yaml": { + "version": "2.3.1", + "dev": true, + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": ">= 14" } }, - "node_modules/is-string": { - "version": "1.0.7", + "node_modules/listr2": { + "version": "6.6.1", + "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "cli-truncate": "^3.1.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^5.0.1", + "rfdc": "^1.3.0", + "wrap-ansi": "^8.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } } }, - "node_modules/is-subdir": { - "version": "1.2.0", + "node_modules/load-yaml-file": { + "version": "0.2.0", "license": "MIT", "dependencies": { - "better-path-resolve": "1.0.0" + "graceful-fs": "^4.1.5", + "js-yaml": "^3.13.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/is-symbol": { - "version": "1.0.4", + "node_modules/load-yaml-file/node_modules/argparse": { + "version": "1.0.10", "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "sprintf-js": "~1.0.2" + } + }, + "node_modules/load-yaml-file/node_modules/js-yaml": { + "version": "3.14.1", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/is-typed-array": { - "version": "1.1.12", + "node_modules/local-pkg": { + "version": "0.5.0", + "dev": true, "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.11" + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/is-unicode-supported": { - "version": "1.3.0", + "node_modules/locate-path": { + "version": "6.0.0", "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-weakmap": { - "version": "2.0.1", + "node_modules/lodash": { + "version": "4.17.21", "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/is-weakref": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/lodash-es": { + "version": "4.17.21", + "license": "MIT" }, - "node_modules/is-weakset": { - "version": "2.0.2", + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "peer": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/is-windows": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "node_modules/lodash.includes": { + "version": "4.3.0", + "license": "MIT" }, - "node_modules/isarray": { - "version": "1.0.0", + "node_modules/lodash.isboolean": { + "version": "3.0.3", "license": "MIT" }, - "node_modules/isexe": { - "version": "2.0.0", - "license": "ISC" + "node_modules/lodash.isequal": { + "version": "4.5.0", + "dev": true, + "license": "MIT" }, - "node_modules/isomorphic-ws": { + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "license": "MIT" + }, + "node_modules/lodash.isstring": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "peerDependencies": { - "ws": "*" - } + "license": "MIT" }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", + "node_modules/lodash.merge": { + "version": "4.6.2", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } + "node_modules/lodash.once": { + "version": "4.1.1", + "license": "MIT" }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } + "node_modules/lodash.startcase": { + "version": "4.4.0", + "license": "MIT" }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "peer": true }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "dev": true, + "node_modules/log-symbols": { + "version": "5.1.0", "license": "MIT", "dependencies": { - "semver": "^7.5.3" + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/log-update": { + "version": "5.0.1", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.4.tgz", - "integrity": "sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==", + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/istanbul-reports": { - "version": "3.1.6", + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/isurl": { - "version": "1.0.0", + "node_modules/logform": { + "version": "2.6.0", "license": "MIT", "dependencies": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" }, "engines": { - "node": ">= 4" + "node": ">= 12.0.0" } }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "dev": true, - "license": "MIT", + "node_modules/logkitty": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", + "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", + "peer": true, "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "ansi-fragments": "^0.2.1", + "dayjs": "^1.8.15", + "yargs": "^15.1.0" + }, + "bin": { + "logkitty": "bin/logkitty.js" } }, - "node_modules/jackspeak": { - "version": "2.3.6", - "license": "BlueOak-1.0.0", + "node_modules/logkitty/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, "dependencies": { - "@isaacs/cliui": "^8.0.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=14" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jju": { - "version": "1.4.0", - "dev": true, - "license": "MIT" + "node_modules/logkitty/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "peer": true, + "engines": { + "node": ">=6" + } }, - "node_modules/joi": { - "version": "17.11.0", - "license": "BSD-3-Clause", + "node_modules/logkitty/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "peer": true, "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" + "node_modules/logkitty/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } }, - "node_modules/js-yaml": { + "node_modules/logkitty/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/logkitty/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "peer": true + }, + "node_modules/logkitty/node_modules/find-up": { "version": "4.1.0", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "peer": true, "dependencies": { - "argparse": "^2.0.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=8" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, + "node_modules/logkitty/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "peer": true, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/json-bigint": { - "version": "1.0.0", - "license": "MIT", + "node_modules/logkitty/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "peer": true, "dependencies": { - "bignumber.js": "^9.0.0" + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" + "node_modules/logkitty/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "peer": true, + "dependencies": { + "p-try": "^2.0.0" }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jsonc-parser": { - "version": "3.2.1", - "dev": true, - "license": "MIT" + "node_modules/logkitty/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "peer": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/jsonfile": { - "version": "6.1.0", - "dev": true, - "license": "MIT", + "node_modules/logkitty/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "peer": true, "dependencies": { - "universalify": "^2.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=8" } }, - "node_modules/jsontokens": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsontokens/-/jsontokens-4.0.1.tgz", - "integrity": "sha512-+MO415LEN6M+3FGsRz4wU20g7N2JA+2j9d9+pGaNJHviG4L8N0qzavGyENw6fJqsq9CcrHOIL6iWX5yeTZ86+Q==", + "node_modules/logkitty/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "peer": true, "dependencies": { - "@noble/hashes": "^1.1.2", - "@noble/secp256k1": "^1.6.3", - "base64-js": "^1.5.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "license": "MIT", + "node_modules/logkitty/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "peer": true + }, + "node_modules/logkitty/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "peer": true, "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" }, "engines": { - "node": ">=12", - "npm": ">=6" + "node": ">=8" } }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "dev": true, - "license": "MIT", + "node_modules/logkitty/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "peer": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" }, "engines": { - "node": ">=4.0" + "node": ">=6" } }, - "node_modules/jwa": { - "version": "1.4.1", + "node_modules/long": { + "version": "5.2.3", + "license": "Apache-2.0" + }, + "node_modules/loose-envify": { + "version": "1.4.0", "license": "MIT", "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/jws": { - "version": "3.2.2", - "license": "MIT", + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" + "get-func-name": "^2.0.1" } }, - "node_modules/keyv": { - "version": "4.5.4", + "node_modules/lower-case": { + "version": "2.0.2", + "dev": true, "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "tslib": "^2.0.3" } }, - "node_modules/kind-of": { - "version": "6.0.3", + "node_modules/lowercase-keys": { + "version": "1.0.1", "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/kleur": { - "version": "4.1.5", + "node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.29.0", + "dev": true, "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/kolorist": { - "version": "1.8.0", + "node_modules/magicast": { + "version": "0.3.3", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "source-map-js": "^1.0.2" + } }, - "node_modules/kuler": { - "version": "2.0.0", - "license": "MIT" + "node_modules/make-dir": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "dev": true, - "license": "CC0-1.0" + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } }, - "node_modules/language-tags": { - "version": "1.0.9", - "dev": true, - "license": "MIT", + "node_modules/make-error": { + "version": "1.3.6", + "devOptional": true, + "license": "ISC" + }, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "license": "ISC", + "optional": true, "dependencies": { - "language-subtag-registry": "^0.3.20" + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" }, "engines": { - "node": ">=0.10" + "node": ">= 10" } }, - "node_modules/levn": { - "version": "0.4.1", - "dev": true, - "license": "MIT", + "node_modules/make-fetch-happen/node_modules/http-cache-semantics": { + "version": "4.1.1", + "license": "BSD-2-Clause", + "optional": true + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "optional": true, "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" } }, - "node_modules/lilconfig": { - "version": "2.1.0", - "dev": true, + "node_modules/make-fetch-happen/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC", + "optional": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "peer": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "license": "MIT" + "node_modules/marky": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", + "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", + "peer": true }, - "node_modules/lint-staged": { - "version": "13.3.0", - "dev": true, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "peer": true + }, + "node_modules/meow": { + "version": "6.1.1", "license": "MIT", "dependencies": { - "chalk": "5.3.0", - "commander": "11.0.0", - "debug": "4.3.4", - "execa": "7.2.0", - "lilconfig": "2.1.0", - "listr2": "6.6.1", - "micromatch": "4.0.5", - "pidtree": "0.6.0", - "string-argv": "0.3.2", - "yaml": "2.3.1" + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "^4.0.2", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" }, - "bin": { - "lint-staged": "bin/lint-staged.js" + "engines": { + "node": ">=8" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/camelcase": { + "version": "5.3.1", + "license": "MIT", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=6" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.13.1", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/lint-staged" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lint-staged/node_modules/yaml": { - "version": "2.3.1", - "dev": true, + "node_modules/meow/node_modules/yargs-parser": { + "version": "18.1.3", "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", "engines": { - "node": ">= 14" + "node": ">= 8" } }, - "node_modules/listr2": { - "version": "6.6.1", - "dev": true, - "license": "MIT", + "node_modules/metro": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.80.12.tgz", + "integrity": "sha512-1UsH5FzJd9quUsD1qY+zUG4JY3jo3YEMxbMYH9jT6NK3j4iORhlwTK8fYTfAUBhDKjgLfKjAh7aoazNE23oIRA==", + "peer": true, "dependencies": { - "cli-truncate": "^3.1.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^5.0.1", - "rfdc": "^1.3.0", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=16.0.0" + "@babel/code-frame": "^7.0.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/parser": "^7.20.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "accepts": "^1.3.7", + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "denodeify": "^1.2.1", + "error-stack-parser": "^2.0.6", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "hermes-parser": "0.23.1", + "image-size": "^1.0.2", + "invariant": "^2.2.4", + "jest-worker": "^29.6.3", + "jsc-safe-url": "^0.2.2", + "lodash.throttle": "^4.1.1", + "metro-babel-transformer": "0.80.12", + "metro-cache": "0.80.12", + "metro-cache-key": "0.80.12", + "metro-config": "0.80.12", + "metro-core": "0.80.12", + "metro-file-map": "0.80.12", + "metro-resolver": "0.80.12", + "metro-runtime": "0.80.12", + "metro-source-map": "0.80.12", + "metro-symbolicate": "0.80.12", + "metro-transform-plugins": "0.80.12", + "metro-transform-worker": "0.80.12", + "mime-types": "^2.1.27", + "nullthrows": "^1.1.1", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "strip-ansi": "^6.0.0", + "throat": "^5.0.0", + "ws": "^7.5.10", + "yargs": "^17.6.2" }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" + "bin": { + "metro": "src/cli.js" }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } + "engines": { + "node": ">=18" } }, - "node_modules/load-yaml-file": { - "version": "0.2.0", - "license": "MIT", + "node_modules/metro-babel-transformer": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.80.12.tgz", + "integrity": "sha512-YZziRs0MgA3pzCkkvOoQRXjIoVjvrpi/yRlJnObyIvMP6lFdtyG4nUGIwGY9VXnBvxmXD6mPY2e+NSw6JAyiRg==", + "peer": true, "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.13.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" + "@babel/core": "^7.20.0", + "flow-enums-runtime": "^0.0.6", + "hermes-parser": "0.23.1", + "nullthrows": "^1.1.1" }, "engines": { - "node": ">=6" + "node": ">=18" } }, - "node_modules/load-yaml-file/node_modules/argparse": { - "version": "1.0.10", - "license": "MIT", + "node_modules/metro-babel-transformer/node_modules/hermes-estree": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.23.1.tgz", + "integrity": "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==", + "peer": true + }, + "node_modules/metro-babel-transformer/node_modules/hermes-parser": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.23.1.tgz", + "integrity": "sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==", + "peer": true, "dependencies": { - "sprintf-js": "~1.0.2" + "hermes-estree": "0.23.1" } }, - "node_modules/load-yaml-file/node_modules/js-yaml": { - "version": "3.14.1", - "license": "MIT", + "node_modules/metro-cache": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.80.12.tgz", + "integrity": "sha512-p5kNHh2KJ0pbQI/H7ZBPCEwkyNcSz7OUkslzsiIWBMPQGFJ/xArMwkV7I+GJcWh+b4m6zbLxE5fk6fqbVK1xGA==", + "peer": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "exponential-backoff": "^3.1.1", + "flow-enums-runtime": "^0.0.6", + "metro-core": "0.80.12" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=18" } }, - "node_modules/local-pkg": { - "version": "0.5.0", - "dev": true, - "license": "MIT", + "node_modules/metro-cache-key": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.80.12.tgz", + "integrity": "sha512-o4BspKnugg/pE45ei0LGHVuBJXwRgruW7oSFAeSZvBKA/sGr0UhOGY3uycOgWInnS3v5yTTfiBA9lHlNRhsvGA==", + "peer": true, "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" + "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "node": ">=18" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "license": "MIT", + "node_modules/metro-config": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.80.12.tgz", + "integrity": "sha512-4rwOWwrhm62LjB12ytiuR5NgK1ZBNr24/He8mqCsC+HXZ+ATbrewLNztzbAZHtFsrxP4D4GLTGgh96pCpYLSAQ==", + "peer": true, "dependencies": { - "p-locate": "^5.0.0" + "connect": "^3.6.5", + "cosmiconfig": "^5.0.5", + "flow-enums-runtime": "^0.0.6", + "jest-validate": "^29.6.3", + "metro": "0.80.12", + "metro-cache": "0.80.12", + "metro-core": "0.80.12", + "metro-runtime": "0.80.12" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/lodash": { - "version": "4.17.21", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "license": "MIT" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "license": "MIT" - }, - "node_modules/lodash.startcase": { - "version": "4.4.0", - "license": "MIT" + "node_modules/metro-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } }, - "node_modules/log-symbols": { - "version": "5.1.0", - "license": "MIT", + "node_modules/metro-config/node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "peer": true, "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/log-update": { - "version": "5.0.1", - "dev": true, - "license": "MIT", + "node_modules/metro-config/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "peer": true, "dependencies": { - "ansi-escapes": "^5.0.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^5.0.0", - "strip-ansi": "^7.0.1", - "wrap-ansi": "^8.0.1" + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "node_modules/metro-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", + "node_modules/metro-config/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "peer": true, "dependencies": { - "ansi-regex": "^6.0.1" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=4" } }, - "node_modules/logform": { - "version": "2.6.0", - "license": "MIT", - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, + "node_modules/metro-config/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "peer": true, "engines": { - "node": ">= 12.0.0" + "node": ">=4" } }, - "node_modules/long": { - "version": "5.2.3", - "license": "Apache-2.0" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", + "node_modules/metro-core": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.80.12.tgz", + "integrity": "sha512-QqdJ/yAK+IpPs2HU/h5v2pKEdANBagSsc6DRSjnwSyJsCoHlmyJKCaCJ7KhWGx+N4OHxh37hoA8fc2CuZbx0Fw==", + "peer": true, "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "flow-enums-runtime": "^0.0.6", + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.80.12" }, - "bin": { - "loose-envify": "cli.js" + "engines": { + "node": ">=18" } }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, + "node_modules/metro-file-map": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.80.12.tgz", + "integrity": "sha512-sYdemWSlk66bWzW2wp79kcPMzwuG32x1ZF3otI0QZTmrnTaaTiGyhE66P1z6KR4n2Eu5QXiABa6EWbAQv0r8bw==", + "peer": true, "dependencies": { - "get-func-name": "^2.0.1" + "anymatch": "^3.0.3", + "debug": "^2.2.0", + "fb-watchman": "^2.0.0", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "invariant": "^2.2.4", + "jest-worker": "^29.6.3", + "micromatch": "^4.0.4", + "node-abort-controller": "^3.1.1", + "nullthrows": "^1.1.1", + "walker": "^1.0.7" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/lower-case": { - "version": "2.0.2", - "dev": true, - "license": "MIT", + "node_modules/metro-file-map/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, "dependencies": { - "tslib": "^2.0.3" + "ms": "2.0.0" } }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "node_modules/metro-file-map/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true }, - "node_modules/lru-cache": { - "version": "5.1.1", - "dev": true, - "license": "ISC", + "node_modules/metro-minify-terser": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.80.12.tgz", + "integrity": "sha512-muWzUw3y5k+9083ZoX9VaJLWEV2Jcgi+Oan0Mmb/fBNMPqP9xVDuy4pOMn/HOiGndgfh/MK7s4bsjkyLJKMnXQ==", + "peer": true, "dependencies": { - "yallist": "^3.0.2" + "flow-enums-runtime": "^0.0.6", + "terser": "^5.15.0" + }, + "engines": { + "node": ">=18" } }, - "node_modules/magic-string": { - "version": "0.29.0", - "dev": true, - "license": "MIT", + "node_modules/metro-resolver": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.80.12.tgz", + "integrity": "sha512-PR24gYRZnYHM3xT9pg6BdbrGbM/Cu1TcyIFBVlAk7qDAuHkUNQ1nMzWumWs+kwSvtd9eZGzHoucGJpTUEeLZAw==", + "peer": true, "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/magicast": { - "version": "0.3.3", - "dev": true, - "license": "MIT", + "node_modules/metro-runtime": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.80.12.tgz", + "integrity": "sha512-LIx7+92p5rpI0i6iB4S4GBvvLxStNt6fF0oPMaUd1Weku7jZdfkCZzmrtDD9CSQ6EPb0T9NUZoyXIxlBa3wOCw==", + "peer": true, "dependencies": { - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", - "source-map-js": "^1.0.2" + "@babel/runtime": "^7.25.0", + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=18" } }, - "node_modules/make-dir": { - "version": "2.1.0", - "license": "MIT", + "node_modules/metro-source-map": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.80.12.tgz", + "integrity": "sha512-o+AXmE7hpvM8r8MKsx7TI21/eerYYy2DCDkWfoBkv+jNkl61khvDHlQn0cXZa6lrcNZiZkl9oHSMcwLLIrFmpw==", + "peer": true, "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-symbolicate": "0.80.12", + "nullthrows": "^1.1.1", + "ob1": "0.80.12", + "source-map": "^0.5.6", + "vlq": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">=18" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", - "license": "ISC", + "node_modules/metro-symbolicate": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.80.12.tgz", + "integrity": "sha512-/dIpNdHksXkGHZXARZpL7doUzHqSNxgQ8+kQGxwpJuHnDhGkENxB5PS2QBaTDdEcmyTMjS53CN1rl9n1gR6fmw==", + "peer": true, + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-source-map": "0.80.12", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + }, "bin": { - "semver": "bin/semver" + "metro-symbolicate": "src/index.js" + }, + "engines": { + "node": ">=18" } }, - "node_modules/make-error": { - "version": "1.3.6", - "devOptional": true, - "license": "ISC" - }, - "node_modules/make-fetch-happen": { - "version": "9.1.0", - "license": "ISC", - "optional": true, + "node_modules/metro-transform-plugins": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.80.12.tgz", + "integrity": "sha512-WQWp00AcZvXuQdbjQbx1LzFR31IInlkCDYJNRs6gtEtAyhwpMMlL2KcHmdY+wjDO9RPcliZ+Xl1riOuBecVlPA==", + "peer": true, "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.20.0", + "flow-enums-runtime": "^0.0.6", + "nullthrows": "^1.1.1" }, "engines": { - "node": ">= 10" + "node": ">=18" } }, - "node_modules/make-fetch-happen/node_modules/http-cache-semantics": { - "version": "4.1.1", - "license": "BSD-2-Clause", - "optional": true - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "optional": true, + "node_modules/metro-transform-worker": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.80.12.tgz", + "integrity": "sha512-KAPFN1y3eVqEbKLx1I8WOarHPqDMUa8WelWxaJCNKO/yHCP26zELeqTJvhsQup+8uwB6EYi/sp0b6TGoh6lOEA==", + "peer": true, "dependencies": { - "yallist": "^4.0.0" + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/parser": "^7.20.0", + "@babel/types": "^7.20.0", + "flow-enums-runtime": "^0.0.6", + "metro": "0.80.12", + "metro-babel-transformer": "0.80.12", + "metro-cache": "0.80.12", + "metro-cache-key": "0.80.12", + "metro-minify-terser": "0.80.12", + "metro-source-map": "0.80.12", + "metro-transform-plugins": "0.80.12", + "nullthrows": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/make-fetch-happen/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC", - "optional": true - }, - "node_modules/map-obj": { + "node_modules/metro/node_modules/ansi-styles": { "version": "4.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/meow": { - "version": "6.1.1", - "license": "MIT", + "node_modules/metro/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "^4.0.2", - "normalize-package-data": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/meow/node_modules/camelcase": { - "version": "5.3.1", - "license": "MIT", + "node_modules/metro/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "peer": true + }, + "node_modules/metro/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=6" + "node": ">=7.0.0" } }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.13.1", - "license": "(MIT OR CC0-1.0)", + "node_modules/metro/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/metro/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/metro/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/meow/node_modules/yargs-parser": { - "version": "18.1.3", - "license": "ISC", + "node_modules/metro/node_modules/hermes-estree": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.23.1.tgz", + "integrity": "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==", + "peer": true + }, + "node_modules/metro/node_modules/hermes-parser": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.23.1.tgz", + "integrity": "sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==", + "peer": true, "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" + "hermes-estree": "0.23.1" } }, - "node_modules/merge-stream": { + "node_modules/metro/node_modules/ms": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true }, - "node_modules/merge2": { - "version": "1.4.1", - "license": "MIT", + "node_modules/metro/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">= 8" + "node": ">=8" + } + }, + "node_modules/metro/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "peer": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, + "node_modules/micro-ftch": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", + "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==" + }, "node_modules/micromatch": { "version": "4.0.5", "license": "MIT", @@ -10723,6 +17954,18 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "peer": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/mime-db": { "version": "1.52.0", "license": "MIT", @@ -10787,7 +18030,6 @@ }, "node_modules/minimist": { "version": "1.2.8", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10978,11 +18220,16 @@ "node_modules/negotiator": { "version": "0.6.3", "license": "MIT", - "optional": true, "engines": { "node": ">= 0.6" } }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "peer": true + }, "node_modules/next": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/next/-/next-14.1.0.tgz", @@ -11037,10 +18284,37 @@ "tslib": "^2.0.3" } }, + "node_modules/nocache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz", + "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==", + "peer": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "peer": true + }, "node_modules/node-addon-api": { "version": "4.3.0", "license": "MIT" }, + "node_modules/node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", + "peer": true, + "dependencies": { + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.10.5" + } + }, "node_modules/node-fetch": { "version": "2.7.0", "license": "MIT", @@ -11059,6 +18333,15 @@ } } }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "peer": true, + "engines": { + "node": ">= 6.13.0" + } + }, "node_modules/node-gyp": { "version": "8.4.1", "license": "MIT", @@ -11188,10 +18471,29 @@ "node": ">=8" } }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "peer": true + }, "node_modules/node-releases": { - "version": "2.0.13", - "dev": true, - "license": "MIT" + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + }, + "node_modules/node-stream-zip": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", + "peer": true, + "engines": { + "node": ">=0.12.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/antelle" + } }, "node_modules/nofilter": { "version": "3.1.0", @@ -11230,6 +18532,15 @@ "semver": "bin/semver" } }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/normalize-url": { "version": "2.0.1", "license": "MIT", @@ -11277,6 +18588,34 @@ "set-blocking": "^2.0.0" } }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "peer": true + }, + "node_modules/ob1": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.12.tgz", + "integrity": "sha512-VMArClVT6LkhUGpnuEoBuyjG9rzUyEzg4PDkav6wK1cLhOK02gPCYFxoiB4mqVnrMhDpIzJcrGNAMVi9P+hXrw==", + "peer": true, + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/obj-multiplex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/obj-multiplex/-/obj-multiplex-1.0.0.tgz", + "integrity": "sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==", + "dependencies": { + "end-of-stream": "^1.4.0", + "once": "^1.4.0", + "readable-stream": "^2.3.3" + } + }, "node_modules/object-assign": { "version": "4.1.1", "license": "MIT", @@ -11407,6 +18746,27 @@ "node": ">= 14" } }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "peer": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "license": "ISC", @@ -11435,6 +18795,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "peer": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/open/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/optimism": { "version": "0.18.0", "license": "MIT", @@ -11676,6 +19057,15 @@ "version": "6.0.1", "license": "MIT" }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-browserify": { "version": "1.0.1", "dev": true, @@ -11835,8 +19225,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "license": "ISC" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -11883,6 +19274,15 @@ "node": ">=0.10.0" } }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "peer": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/pkg-dir": { "version": "4.2.0", "license": "MIT", @@ -11947,6 +19347,14 @@ "pathe": "^1.1.0" } }, + "node_modules/pony-cause": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.11.tgz", + "integrity": "sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/postcss": { "version": "8.4.31", "funding": [ @@ -12049,7 +19457,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -12063,7 +19470,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, "engines": { "node": ">=10" }, @@ -12083,6 +19489,15 @@ "version": "2.0.1", "license": "MIT" }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "peer": true, + "dependencies": { + "asap": "~2.0.6" + } + }, "node_modules/promise-inflight": { "version": "1.0.1", "license": "ISC", @@ -12100,6 +19515,28 @@ "node": ">=10" } }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "peer": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/prop-types": { "version": "15.8.1", "license": "MIT", @@ -12158,6 +19595,27 @@ "node": ">=6" } }, + "node_modules/qr-code-styling": { + "version": "1.6.0-rc.1", + "resolved": "https://registry.npmjs.org/qr-code-styling/-/qr-code-styling-1.6.0-rc.1.tgz", + "integrity": "sha512-ModRIiW6oUnsP18QzrRYZSc/CFKFKIdj7pUs57AEVH20ajlglRpN3HukjHk0UbNMTlKGuaYl7Gt6/O5Gg2NU2Q==", + "dependencies": { + "qrcode-generator": "^1.4.3" + } + }, + "node_modules/qrcode-generator": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/qrcode-generator/-/qrcode-generator-1.4.4.tgz", + "integrity": "sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==" + }, + "node_modules/qrcode-terminal-nooctal": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/qrcode-terminal-nooctal/-/qrcode-terminal-nooctal-0.12.1.tgz", + "integrity": "sha512-jy/kkD0iIMDjTucB+5T6KBsnirlhegDH47vHgrj5MejchSQmi/EAMM0xMFeePgV9CJkkAapNakpVUWYgHvtdKg==", + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, "node_modules/qrcode.react": { "version": "3.1.0", "license": "ISC", @@ -12165,107 +19623,388 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/query-string": { - "version": "5.1.1", - "license": "MIT", + "node_modules/query-string": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "peer": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "peer": true, + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/react": { + "version": "18.2.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-apexcharts": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "apexcharts": "^3.41.0", + "react": ">=0.13" + } + }, + "node_modules/react-copy-to-clipboard": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "copy-to-clipboard": "^3.3.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": "^15.3.0 || 16 || 17 || 18" + } + }, + "node_modules/react-devtools-core": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-5.3.1.tgz", + "integrity": "sha512-7FSb9meX0btdBQLwdFOwt6bGqvRPabmVMMslv8fgoSPqXyuGpgQe36kx8gR86XPw7aV1yVouTp6fyZ0EH+NfUw==", + "peer": true, + "dependencies": { + "shell-quote": "^1.6.1", + "ws": "^7" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-hook-form": { + "version": "7.48.2", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "license": "MIT" + }, + "node_modules/react-native": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.75.2.tgz", + "integrity": "sha512-pP+Yswd/EurzAlKizytRrid9LJaPJzuNldc+o5t01md2VLHym8V7FWH2z9omFKtFTer8ERg0fAhG1fpd0Qq6bQ==", + "peer": true, + "dependencies": { + "@jest/create-cache-key-function": "^29.6.3", + "@react-native-community/cli": "14.0.0", + "@react-native-community/cli-platform-android": "14.0.0", + "@react-native-community/cli-platform-ios": "14.0.0", + "@react-native/assets-registry": "0.75.2", + "@react-native/codegen": "0.75.2", + "@react-native/community-cli-plugin": "0.75.2", + "@react-native/gradle-plugin": "0.75.2", + "@react-native/js-polyfills": "0.75.2", + "@react-native/normalize-colors": "0.75.2", + "@react-native/virtualized-lists": "0.75.2", + "abort-controller": "^3.0.0", + "anser": "^1.4.9", + "ansi-regex": "^5.0.0", + "base64-js": "^1.5.1", + "chalk": "^4.0.0", + "event-target-shim": "^5.0.1", + "flow-enums-runtime": "^0.0.6", + "glob": "^7.1.1", + "invariant": "^2.2.4", + "jest-environment-node": "^29.6.3", + "jsc-android": "^250231.0.0", + "memoize-one": "^5.0.0", + "metro-runtime": "^0.80.3", + "metro-source-map": "^0.80.3", + "mkdirp": "^0.5.1", + "nullthrows": "^1.1.1", + "pretty-format": "^26.5.2", + "promise": "^8.3.0", + "react-devtools-core": "^5.3.1", + "react-refresh": "^0.14.0", + "regenerator-runtime": "^0.13.2", + "scheduler": "0.24.0-canary-efb381bbf-20230505", + "semver": "^7.1.3", + "stacktrace-parser": "^0.1.10", + "whatwg-fetch": "^3.0.0", + "ws": "^6.2.2", + "yargs": "^17.6.2" + }, + "bin": { + "react-native": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/react": "^18.2.6", + "react": "^18.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-native-webview": { + "version": "11.26.1", + "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.26.1.tgz", + "integrity": "sha512-hC7BkxOpf+z0UKhxFSFTPAM4shQzYmZHoELa6/8a/MspcjEP7ukYKpuSUTLDywQditT8yI9idfcKvfZDKQExGw==", + "dependencies": { + "escape-string-regexp": "2.0.0", + "invariant": "2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-webview/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "peer": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/react-native/node_modules/@types/yargs": { + "version": "15.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", + "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", + "peer": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/react-native/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/react-native/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/react-native/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, "dependencies": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" + "node_modules/react-native/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true }, - "node_modules/quick-lru": { - "version": "5.1.1", - "license": "MIT", + "node_modules/react-native/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, "engines": { - "node": ">=10" + "node": ">=8" + } + }, + "node_modules/react-native/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "peer": true, + "dependencies": { + "minimist": "^1.2.6" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/react": { - "version": "18.2.0", - "license": "MIT", + "node_modules/react-native/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "peer": true, "dependencies": { - "loose-envify": "^1.1.0" + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10" } }, - "node_modules/react-apexcharts": { - "version": "1.4.1", - "license": "MIT", + "node_modules/react-native/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "peer": true + }, + "node_modules/react-native/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "peer": true + }, + "node_modules/react-native/node_modules/scheduler": { + "version": "0.24.0-canary-efb381bbf-20230505", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz", + "integrity": "sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==", + "peer": true, "dependencies": { - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "apexcharts": "^3.41.0", - "react": ">=0.13" + "loose-envify": "^1.1.0" } }, - "node_modules/react-copy-to-clipboard": { - "version": "5.1.0", - "license": "MIT", + "node_modules/react-native/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, "dependencies": { - "copy-to-clipboard": "^3.3.1", - "prop-types": "^15.8.1" + "has-flag": "^4.0.0" }, - "peerDependencies": { - "react": "^15.3.0 || 16 || 17 || 18" + "engines": { + "node": ">=8" } }, - "node_modules/react-dom": { - "version": "18.2.0", - "license": "MIT", + "node_modules/react-native/node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "peer": true, "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" + "async-limiter": "~1.0.0" } }, - "node_modules/react-hook-form": { - "version": "7.48.2", - "license": "MIT", + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "peer": true, "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18" + "node": ">=0.10.0" } }, - "node_modules/react-is": { - "version": "18.2.0", - "license": "MIT" - }, "node_modules/react-transition-group": { "version": "4.4.5", "license": "BSD-3-Clause", @@ -12414,6 +20153,36 @@ "version": "5.1.2", "license": "MIT" }, + "node_modules/readline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==", + "peer": true + }, + "node_modules/recast": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz", + "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==", + "peer": true, + "dependencies": { + "ast-types": "0.15.2", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/recast/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/redent": { "version": "3.0.0", "license": "MIT", @@ -12448,10 +20217,37 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "peer": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "peer": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.0", "license": "MIT" }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, "node_modules/regexp.prototype.flags": { "version": "1.5.1", "license": "MIT", @@ -12467,6 +20263,44 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "peer": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "peer": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, "node_modules/require-directory": { "version": "2.1.1", "license": "MIT", @@ -12603,7 +20437,7 @@ }, "node_modules/rollup": { "version": "3.29.4", - "dev": true, + "devOptional": true, "license": "MIT", "bin": { "rollup": "dist/bin/rollup" @@ -12616,6 +20450,55 @@ "fsevents": "~2.3.2" } }, + "node_modules/rollup-plugin-visualizer": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.12.0.tgz", + "integrity": "sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==", + "dependencies": { + "open": "^8.4.0", + "picomatch": "^2.3.1", + "source-map": "^0.7.4", + "yargs": "^17.5.1" + }, + "bin": { + "rollup-plugin-visualizer": "dist/bin/cli.js" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "rollup": "2.x || 3.x || 4.x" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "funding": [ @@ -12749,6 +20632,19 @@ "version": "2.20.3", "license": "MIT" }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "peer": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/semver": { "version": "7.5.4", "license": "ISC", @@ -12759,23 +20655,125 @@ "semver": "bin/semver.js" }, "engines": { - "node": ">=10" + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "peer": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "peer": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "peer": true + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "peer": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "peer": true, + "engines": { + "node": ">= 0.8" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", + "node_modules/serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "peer": true, "dependencies": { - "yallist": "^4.0.0" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" }, "engines": { - "node": ">=10" + "node": ">= 0.8.0" } }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, "node_modules/set-blocking": { "version": "2.0.0", "license": "ISC" @@ -12805,6 +20803,12 @@ "node": ">= 0.4" } }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "peer": true + }, "node_modules/sha.js": { "version": "2.4.11", "license": "(MIT AND BSD-3-Clause)", @@ -12816,6 +20820,18 @@ "sha.js": "bin.js" } }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "peer": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "license": "MIT", @@ -12833,6 +20849,15 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/side-channel": { "version": "1.0.4", "license": "MIT", @@ -12865,6 +20890,12 @@ "version": "0.3.2", "license": "MIT" }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "peer": true + }, "node_modules/slash": { "version": "3.0.0", "license": "MIT", @@ -13107,6 +21138,32 @@ "@napi-rs/snappy-win32-x64-msvc": "7.2.2" } }, + "node_modules/socket.io-client": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz", + "integrity": "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/socks": { "version": "2.7.1", "license": "MIT", @@ -13178,6 +21235,25 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/spawndamnit": { "version": "2.0.0", "license": "MIT", @@ -13308,11 +21384,68 @@ "node": "*" } }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "peer": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/stackback": { "version": "0.0.2", "dev": true, "license": "MIT" }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "peer": true + }, + "node_modules/stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "peer": true, + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stacktrace-parser/node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/std-env": { "version": "3.7.0", "dev": true, @@ -13592,6 +21725,12 @@ "node": ">=0.8.0" } }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "peer": true + }, "node_modules/styled-jsx": { "version": "5.1.1", "license": "MIT", @@ -13617,6 +21756,12 @@ "version": "4.2.0", "license": "MIT" }, + "node_modules/sudo-prompt": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", + "peer": true + }, "node_modules/supports-color": { "version": "5.5.0", "license": "MIT", @@ -13811,6 +21956,31 @@ "version": "4.0.0", "license": "ISC" }, + "node_modules/temp": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", + "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", + "peer": true, + "dependencies": { + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/term-size": { "version": "2.2.1", "license": "MIT", @@ -13821,6 +21991,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/terser": { + "version": "5.32.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.32.0.tgz", + "integrity": "sha512-v3Gtw3IzpBJ0ugkxEX8U0W6+TnPKRRCWGh1jC/iM/e3Ki5+qvO1L1EAZ56bZasc64aXHwRHNIQEzm6//i5cemQ==", + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "peer": true + }, "node_modules/test-exclude": { "version": "6.0.0", "dev": true, @@ -13860,10 +22054,26 @@ "node": ">=0.8" } }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "peer": true + }, "node_modules/through": { "version": "2.3.8", "license": "MIT" }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "peer": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, "node_modules/timed-out": { "version": "4.0.1", "license": "MIT", @@ -13903,6 +22113,12 @@ "node": ">=0.6.0" } }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "peer": true + }, "node_modules/to-buffer": { "version": "1.1.1", "license": "MIT" @@ -13928,6 +22144,15 @@ "version": "1.0.6", "license": "MIT" }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "peer": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/tr46": { "version": "0.0.3", "license": "MIT" @@ -14180,7 +22405,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, "engines": { "node": ">=4" } @@ -14537,6 +22761,46 @@ "dev": true, "license": "MIT" }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "peer": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/unique-filename": { "version": "1.1.1", "license": "ISC", @@ -14573,9 +22837,19 @@ "node": ">= 10.0.0" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "dev": true, + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", @@ -14590,10 +22864,9 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -14637,6 +22910,18 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", @@ -14653,6 +22938,15 @@ "version": "1.0.2", "license": "MIT" }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "peer": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "9.0.1", "funding": [ @@ -14693,6 +22987,15 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/vite": { "version": "4.5.0", "dev": true, @@ -15800,6 +24103,21 @@ } } }, + "node_modules/vlq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", + "peer": true + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "peer": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, "node_modules/wcwidth": { "version": "1.0.1", "license": "MIT", @@ -15807,10 +24125,21 @@ "defaults": "^1.0.3" } }, + "node_modules/webextension-polyfill": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz", + "integrity": "sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==" + }, "node_modules/webidl-conversions": { "version": "3.0.1", "license": "BSD-2-Clause" }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "peer": true + }, "node_modules/whatwg-url": { "version": "5.0.0", "license": "MIT", @@ -16171,6 +24500,17 @@ "version": "1.0.2", "license": "ISC" }, + "node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, "node_modules/ws": { "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", @@ -16191,6 +24531,14 @@ } } }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/xtend": { "version": "4.0.2", "license": "MIT", @@ -16207,7 +24555,6 @@ }, "node_modules/yallist": { "version": "3.1.1", - "dev": true, "license": "ISC" }, "node_modules/yaml": { @@ -17162,6 +25509,40 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "wallets/metamask-wallet": { + "version": "0.1.3", + "dependencies": { + "@metamask/sdk": "^0.28.2", + "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/tokens": "^1.2.1", + "@rosen-network/ethereum": "^0.1.0", + "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/wallet-api": "^1.0.2" + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.26.0", + "eslint": "^8.16.0", + "eslint-config-prettier": "^9.0.0", + "prettier": "^3.0.2", + "typescript": "^5.0.0" + } + }, + "wallets/metamask-wallet/node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "wallets/nami-wallet": { "name": "@rosen-ui/nami-wallet", "version": "0.1.3", From 78950a55c7c9fa71ad3b2bf690e64e782678107b Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 9 Sep 2024 13:29:55 +0000 Subject: [PATCH 099/168] feat: Integrate the MetaMask wallet package into the Rosen app. --- .changeset/perfect-eels-push.md | 5 +++ apps/rosen/app/_actions/calculateFee.ts | 2 ++ apps/rosen/app/_actions/validateAddress.ts | 9 +++-- .../app/_networks/ethereum/getMaxTransfer.ts | 33 +++++++++++++++++++ apps/rosen/app/_networks/ethereum/index.ts | 33 +++++++++++++++++++ apps/rosen/app/_networks/ethereum/server.ts | 6 ++++ apps/rosen/app/_networks/index.ts | 7 ++-- apps/rosen/app/_types/network.ts | 1 + apps/rosen/app/_utils/getMaxTransfer.ts | 9 +++-- apps/rosen/app/_utils/index.ts | 9 ++++- build.sh | 1 + 11 files changed, 106 insertions(+), 9 deletions(-) create mode 100644 .changeset/perfect-eels-push.md create mode 100644 apps/rosen/app/_networks/ethereum/getMaxTransfer.ts create mode 100644 apps/rosen/app/_networks/ethereum/index.ts create mode 100644 apps/rosen/app/_networks/ethereum/server.ts diff --git a/.changeset/perfect-eels-push.md b/.changeset/perfect-eels-push.md new file mode 100644 index 00000000..9261c3d1 --- /dev/null +++ b/.changeset/perfect-eels-push.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': minor +--- + +Integrate the MetaMask wallet package into the Rosen app. diff --git a/apps/rosen/app/_actions/calculateFee.ts b/apps/rosen/app/_actions/calculateFee.ts index cac4ceed..2003f4f1 100644 --- a/apps/rosen/app/_actions/calculateFee.ts +++ b/apps/rosen/app/_actions/calculateFee.ts @@ -4,6 +4,7 @@ import JsonBigInt from '@rosen-bridge/json-bigint'; import { ErgoNetworkType, MinimumFeeBox } from '@rosen-bridge/minimum-fee'; import cardanoKoiosClientFactory from '@rosen-clients/cardano-koios'; import ergoExplorerClientFactory from '@rosen-clients/ergo-explorer'; +import { getHeight as ethereumGetHeight } from '@rosen-network/ethereum'; const cardanoKoiosClient = cardanoKoiosClientFactory( process.env.CARDANO_KOIOS_API!, @@ -19,6 +20,7 @@ import { wrap } from '@/_errors'; import { toSafeData } from '@/_utils/safeData'; const GetHeight = { + [Networks.ETHEREUM]: ethereumGetHeight, [Networks.CARDANO]: async () => (await cardanoKoiosClient.getTip())[0].block_no, [Networks.ERGO]: async () => diff --git a/apps/rosen/app/_actions/validateAddress.ts b/apps/rosen/app/_actions/validateAddress.ts index 0b6962fe..ce06114e 100644 --- a/apps/rosen/app/_actions/validateAddress.ts +++ b/apps/rosen/app/_actions/validateAddress.ts @@ -5,7 +5,8 @@ import { Networks } from '@rosen-ui/constants'; import * as wasm from '@emurgo/cardano-serialization-lib-nodejs'; import { AvailableNetworks } from '@/_networks'; -import { isValidAddress } from '@rosen-network/bitcoin'; +import { isValidAddress as isBitcoinValidAddress } from '@rosen-network/bitcoin'; +import { isValidAddress as isEthereumValidAddress } from '@rosen-network/ethereum'; import { withValidation } from '@/_validation'; import { wrap } from '@/_errors'; import Joi from 'joi'; @@ -25,7 +26,11 @@ const validateAddressCore = async ( } else if (chain === Networks.CARDANO) { wasm.Address.from_bech32(walletAddress); } else if (chain == Networks.BITCOIN) { - if (!isValidAddress(walletAddress)) { + if (!isBitcoinValidAddress(walletAddress)) { + throw new Error(); + } + } else if (chain == Networks.ETHEREUM) { + if (!isEthereumValidAddress(walletAddress)) { throw new Error(); } } diff --git a/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts b/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts new file mode 100644 index 00000000..cb748916 --- /dev/null +++ b/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts @@ -0,0 +1,33 @@ +'use server'; + +import { Networks } from '@rosen-ui/constants'; + +import { wrap } from '@/_errors'; +import { EthereumNetwork } from '@/_types/network'; + +import { getTokenMap } from '../getTokenMap.server'; +import { RosenAmountValue } from '@rosen-ui/types'; +import { toSafeData } from '@/_utils/safeData'; + +/** + * get max transfer for ethereum + */ +export const getMaxTransfer = wrap( + toSafeData( + async ({ + balance, + isNative, + }: Parameters< + EthereumNetwork['getMaxTransfer'] + >[0]): Promise => { + // TODO: This code is expected to be completed by Hadi. + const tokenMap = await getTokenMap(); + const amount = tokenMap.wrapAmount( + 'eth', + balance, + Networks.ETHEREUM, + ).amount; + return amount; + }, + ), +); diff --git a/apps/rosen/app/_networks/ethereum/index.ts b/apps/rosen/app/_networks/ethereum/index.ts new file mode 100644 index 00000000..01b41532 --- /dev/null +++ b/apps/rosen/app/_networks/ethereum/index.ts @@ -0,0 +1,33 @@ +import { metaMaskWalletCreator } from '@rosen-ui/metamask-wallet'; + +import { Networks } from '@rosen-ui/constants'; + +import { unwrap } from '@/_errors'; +import { EthereumNetwork as EthereumNetworkType } from '@/_types/network'; +import { EthereumIcon } from '@rosen-bridge/icons'; + +import {} from './server'; +import { getMaxTransfer } from './getMaxTransfer'; +import { fromSafeData } from '@/_utils/safeData'; +import { getTokenMap } from '../getTokenMap.client'; + +/** + * the main object for Ethereum network + * providing access to network info and wallets and network specific + * functionality + */ +const EthereumNetwork: EthereumNetworkType = { + name: Networks.ETHEREUM, + label: 'Ethereum', + wallets: [ + metaMaskWalletCreator({ + getTokenMap, + }), + ], + logo: EthereumIcon, + nextHeightInterval: 0, + lockAddress: process.env.NEXT_PUBLIC_ETHEREUM_LOCK_ADDRESS!, + getMaxTransfer: unwrap(fromSafeData(getMaxTransfer)), +}; + +export default EthereumNetwork; diff --git a/apps/rosen/app/_networks/ethereum/server.ts b/apps/rosen/app/_networks/ethereum/server.ts new file mode 100644 index 00000000..21b456fa --- /dev/null +++ b/apps/rosen/app/_networks/ethereum/server.ts @@ -0,0 +1,6 @@ +'use server'; + +import { wrap } from '@/_errors'; +import { toSafeData } from '@/_utils/safeData'; + +// export const decodeWasmValue = wrap(toSafeData()); diff --git a/apps/rosen/app/_networks/index.ts b/apps/rosen/app/_networks/index.ts index e2ca55ad..3436c175 100644 --- a/apps/rosen/app/_networks/index.ts +++ b/apps/rosen/app/_networks/index.ts @@ -1,16 +1,15 @@ import BitcoinNetwork from './bitcoin'; import CardanoNetwork from './cardano'; import ErgoNetwork from './ergo'; +import EthereumNetwork from './ethereum'; import { Networks } from '@rosen-ui/constants'; export const availableNetworks = { [Networks.ERGO]: ErgoNetwork, + [Networks.ETHEREUM]: EthereumNetwork, [Networks.CARDANO]: CardanoNetwork, [Networks.BITCOIN]: BitcoinNetwork, } as const; -export type AvailableNetworks = Exclude< - (typeof Networks)[keyof typeof Networks], - 'ethereum' ->; +export type AvailableNetworks = (typeof Networks)[keyof typeof Networks]; diff --git a/apps/rosen/app/_types/network.ts b/apps/rosen/app/_types/network.ts index 734256e0..75038fa3 100644 --- a/apps/rosen/app/_types/network.ts +++ b/apps/rosen/app/_types/network.ts @@ -35,6 +35,7 @@ interface BitcoinMaxTransferExtra { }; } +export interface EthereumNetwork extends BaseNetwork<'ethereum'> {} export interface ErgoNetwork extends BaseNetwork<'ergo'> {} export interface CardanoNetwork extends BaseNetwork<'cardano'> {} export interface BitcoinNetwork diff --git a/apps/rosen/app/_utils/getMaxTransfer.ts b/apps/rosen/app/_utils/getMaxTransfer.ts index eba542d5..97190eb7 100644 --- a/apps/rosen/app/_utils/getMaxTransfer.ts +++ b/apps/rosen/app/_utils/getMaxTransfer.ts @@ -1,4 +1,9 @@ -import { BitcoinNetwork, CardanoNetwork, ErgoNetwork } from '@/_types/network'; +import { + BitcoinNetwork, + CardanoNetwork, + ErgoNetwork, + EthereumNetwork, +} from '@/_types/network'; import { RosenAmountValue } from '@rosen-ui/types'; /** @@ -9,7 +14,7 @@ import { RosenAmountValue } from '@rosen-ui/types'; * @returns THIS IS A WRAPPED-VALUE */ const getMaxTransfer = async ( - network: ErgoNetwork | CardanoNetwork | BitcoinNetwork, + network: ErgoNetwork | CardanoNetwork | BitcoinNetwork | EthereumNetwork, tokenInfo: { balance: RosenAmountValue; isNative: boolean; diff --git a/apps/rosen/app/_utils/index.ts b/apps/rosen/app/_utils/index.ts index a0bb7c05..81dbbb29 100644 --- a/apps/rosen/app/_utils/index.ts +++ b/apps/rosen/app/_utils/index.ts @@ -18,7 +18,14 @@ export const getTokenNameAndId = ( token: RosenChainToken, network: AvailableNetworks, ) => { - if ([Networks.ERGO, Networks.CARDANO, Networks.BITCOIN].includes(network)) { + if ( + [ + Networks.ERGO, + Networks.ETHEREUM, + Networks.CARDANO, + Networks.BITCOIN, + ].includes(network) + ) { return { tokenName: token.name, tokenId: token.tokenId, diff --git a/build.sh b/build.sh index 97c2390d..dacbb709 100755 --- a/build.sh +++ b/build.sh @@ -17,6 +17,7 @@ npm run build --workspace networks/cardano npm run build --workspace networks/ergo npm run build --workspace wallets/nami-wallet npm run build --workspace wallets/lace-wallet +npm run build --workspace wallets/metamask-wallet npm run build --workspace wallets/eternl-wallet npm run build --workspace wallets/flint-wallet npm run build --workspace wallets/vespr-wallet From ea23e901433e4ba803800fce176847a003532efb Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 9 Sep 2024 13:59:05 +0000 Subject: [PATCH 100/168] fix: Update the package-lock.json file. --- package-lock.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package-lock.json b/package-lock.json index 297cced0..224f1e5c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25510,6 +25510,7 @@ } }, "wallets/metamask-wallet": { + "name": "@rosen-ui/metamask-wallet", "version": "0.1.3", "dependencies": { "@metamask/sdk": "^0.28.2", From 4bc444dbd009e0553954240d3d289b971d484297 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 9 Sep 2024 14:07:58 +0000 Subject: [PATCH 101/168] fix: Update the build.sh file --- build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sh b/build.sh index 97c2390d..dacbb709 100755 --- a/build.sh +++ b/build.sh @@ -17,6 +17,7 @@ npm run build --workspace networks/cardano npm run build --workspace networks/ergo npm run build --workspace wallets/nami-wallet npm run build --workspace wallets/lace-wallet +npm run build --workspace wallets/metamask-wallet npm run build --workspace wallets/eternl-wallet npm run build --workspace wallets/flint-wallet npm run build --workspace wallets/vespr-wallet From bea4956d8cd231d12578a7714026e5ab7219c8ee Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 10 Sep 2024 07:39:58 +0000 Subject: [PATCH 102/168] chore: Format Ethereum and MetaMask svg icons. --- packages/icons/src/networks/ethereum.svg | 15 ++-- packages/icons/src/wallets/metamask.svg | 92 ++++++++++++++++-------- 2 files changed, 70 insertions(+), 37 deletions(-) diff --git a/packages/icons/src/networks/ethereum.svg b/packages/icons/src/networks/ethereum.svg index bfdfa6f7..d96ff6e1 100644 --- a/packages/icons/src/networks/ethereum.svg +++ b/packages/icons/src/networks/ethereum.svg @@ -1,8 +1,7 @@ - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/packages/icons/src/wallets/metamask.svg b/packages/icons/src/wallets/metamask.svg index f2ca9a11..823cd5fb 100644 --- a/packages/icons/src/wallets/metamask.svg +++ b/packages/icons/src/wallets/metamask.svg @@ -1,31 +1,65 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From b4dabc766e045dba96d2a7664738c7b32798b1e2 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 10 Sep 2024 08:03:36 +0000 Subject: [PATCH 103/168] chore: Update svg files. --- packages/icons/src/networks/ethereum.svg | 2 +- packages/icons/src/wallets/metamask.svg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/icons/src/networks/ethereum.svg b/packages/icons/src/networks/ethereum.svg index d96ff6e1..1fde3792 100644 --- a/packages/icons/src/networks/ethereum.svg +++ b/packages/icons/src/networks/ethereum.svg @@ -4,4 +4,4 @@ - \ No newline at end of file + diff --git a/packages/icons/src/wallets/metamask.svg b/packages/icons/src/wallets/metamask.svg index 823cd5fb..b717b9a8 100644 --- a/packages/icons/src/wallets/metamask.svg +++ b/packages/icons/src/wallets/metamask.svg @@ -62,4 +62,4 @@ - \ No newline at end of file + From 66b849bb9133e395572e72200356fd23653c88a2 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 10 Sep 2024 08:14:30 +0000 Subject: [PATCH 104/168] fix: Add build command for the ethereum network in build.sh --- build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sh b/build.sh index dacbb709..851849bb 100755 --- a/build.sh +++ b/build.sh @@ -15,6 +15,7 @@ npm run build --workspace wallets/wallet-api npm run build --workspace networks/bitcoin npm run build --workspace networks/cardano npm run build --workspace networks/ergo +npm run build --workspace networks/ethereum npm run build --workspace wallets/nami-wallet npm run build --workspace wallets/lace-wallet npm run build --workspace wallets/metamask-wallet From ea9045d474532be36d4b31fb75ec4f2fd0adab0e Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 11 Sep 2024 11:30:27 +0000 Subject: [PATCH 105/168] chore: Update the Ethereum network package --- build.sh | 1 + networks/ethereum/src/types.ts | 10 ---------- networks/ethereum/src/utils.ts | 5 ++--- package-lock.json | 1 + 4 files changed, 4 insertions(+), 13 deletions(-) diff --git a/build.sh b/build.sh index 97c2390d..e3d6977f 100755 --- a/build.sh +++ b/build.sh @@ -15,6 +15,7 @@ npm run build --workspace wallets/wallet-api npm run build --workspace networks/bitcoin npm run build --workspace networks/cardano npm run build --workspace networks/ergo +npm run build --workspace networks/ethereum npm run build --workspace wallets/nami-wallet npm run build --workspace wallets/lace-wallet npm run build --workspace wallets/eternl-wallet diff --git a/networks/ethereum/src/types.ts b/networks/ethereum/src/types.ts index 606c8a9d..b758c136 100644 --- a/networks/ethereum/src/types.ts +++ b/networks/ethereum/src/types.ts @@ -6,13 +6,3 @@ export type WalletCreator = (config: WalletCreatorConfig) => Wallet; export type WalletCreatorConfig = { getTokenMap(): Promise; }; - -/** - * global type augmentation for wallets - */ -declare global { - let ethereum: { - isMetaMask: boolean; - _metamask: any; - }; -} diff --git a/networks/ethereum/src/utils.ts b/networks/ethereum/src/utils.ts index b4236797..055a2b2d 100644 --- a/networks/ethereum/src/utils.ts +++ b/networks/ethereum/src/utils.ts @@ -1,5 +1,4 @@ -import { JsonRpcProvider } from 'ethers'; -import { isHexString } from 'ethers'; +import { isAddress, JsonRpcProvider } from 'ethers'; /** * gets Ethereum current block height @@ -17,5 +16,5 @@ export const getHeight = async (): Promise => { * @returns */ export const isValidAddress = (addr: string) => { - return isHexString(addr); + return isAddress(addr); }; diff --git a/package-lock.json b/package-lock.json index f991e835..bbb5198e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -452,6 +452,7 @@ } }, "networks/ethereum": { + "name": "@rosen-network/ethereum", "version": "0.1.0", "dependencies": { "@rosen-ui/wallet-api": "^1.0.0", From abeb7d0c1ddf60ed2d98f58e333f94a27c72a0c7 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 11 Sep 2024 12:07:22 +0000 Subject: [PATCH 106/168] chore: Update the MetaMask wallet --- wallets/metamask-wallet/src/getBalance.ts | 4 ++-- wallets/metamask-wallet/src/isMetaMaskAvailable.ts | 10 ++++++++++ wallets/metamask-wallet/src/transfer.ts | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/wallets/metamask-wallet/src/getBalance.ts b/wallets/metamask-wallet/src/getBalance.ts index 88e22659..ce4cd104 100644 --- a/wallets/metamask-wallet/src/getBalance.ts +++ b/wallets/metamask-wallet/src/getBalance.ts @@ -18,7 +18,7 @@ export const getBalanceCreator = if (!accounts?.length) return 0n; - const amount = await provider.request({ + const amount = await provider.request({ method: 'eth_getBalance', params: [accounts[0], 'latest'], }); @@ -29,7 +29,7 @@ export const getBalanceCreator = const wrappedAmount = tokenMap.wrapAmount( token[tokenMap.getIdKey(Networks.ETHEREUM)], - BigInt(amount as string), + BigInt(amount), Networks.ETHEREUM ).amount; diff --git a/wallets/metamask-wallet/src/isMetaMaskAvailable.ts b/wallets/metamask-wallet/src/isMetaMaskAvailable.ts index d66e129e..8786623e 100644 --- a/wallets/metamask-wallet/src/isMetaMaskAvailable.ts +++ b/wallets/metamask-wallet/src/isMetaMaskAvailable.ts @@ -1,3 +1,13 @@ +/** + * global type augmentation for the wallet + */ +declare global { + let ethereum: { + isMetaMask: boolean; + _metamask: any; + }; +} + export const isMetaMaskAvailable = (): boolean => { return ( typeof ethereum !== 'undefined' && diff --git a/wallets/metamask-wallet/src/transfer.ts b/wallets/metamask-wallet/src/transfer.ts index 5ebc380d..0df8bf44 100644 --- a/wallets/metamask-wallet/src/transfer.ts +++ b/wallets/metamask-wallet/src/transfer.ts @@ -15,5 +15,5 @@ export const transferCreator = networkFee: RosenAmountValue, lockAddress: string ): Promise => { - throw new Error('Hadi should consider implementing this logic'); + throw new Error('Not Implemented'); }; From a1cc17670ce792408cbfffaff918ef4dcd2bf386 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 14 Sep 2024 14:08:36 +0000 Subject: [PATCH 107/168] chore: Update ethereum network in the Rosen App. --- apps/rosen/app/_actions/validateAddress.ts | 8 ++++---- apps/rosen/app/_networks/ethereum/getMaxTransfer.ts | 5 ++++- apps/rosen/app/_networks/ethereum/index.ts | 1 - apps/rosen/app/_networks/ethereum/server.ts | 5 ----- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/apps/rosen/app/_actions/validateAddress.ts b/apps/rosen/app/_actions/validateAddress.ts index ce06114e..0dfc4d6c 100644 --- a/apps/rosen/app/_actions/validateAddress.ts +++ b/apps/rosen/app/_actions/validateAddress.ts @@ -5,8 +5,8 @@ import { Networks } from '@rosen-ui/constants'; import * as wasm from '@emurgo/cardano-serialization-lib-nodejs'; import { AvailableNetworks } from '@/_networks'; -import { isValidAddress as isBitcoinValidAddress } from '@rosen-network/bitcoin'; -import { isValidAddress as isEthereumValidAddress } from '@rosen-network/ethereum'; +import { isValidAddress as isValidBitcoinAddress } from '@rosen-network/bitcoin'; +import { isValidAddress as isValidEthereumAddress } from '@rosen-network/ethereum'; import { withValidation } from '@/_validation'; import { wrap } from '@/_errors'; import Joi from 'joi'; @@ -26,11 +26,11 @@ const validateAddressCore = async ( } else if (chain === Networks.CARDANO) { wasm.Address.from_bech32(walletAddress); } else if (chain == Networks.BITCOIN) { - if (!isBitcoinValidAddress(walletAddress)) { + if (!isValidBitcoinAddress(walletAddress)) { throw new Error(); } } else if (chain == Networks.ETHEREUM) { - if (!isEthereumValidAddress(walletAddress)) { + if (!isValidEthereumAddress(walletAddress)) { throw new Error(); } } diff --git a/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts b/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts index cb748916..6c7c4636 100644 --- a/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts @@ -20,7 +20,10 @@ export const getMaxTransfer = wrap( }: Parameters< EthereumNetwork['getMaxTransfer'] >[0]): Promise => { - // TODO: This code is expected to be completed by Hadi. + /** + * TODO: This code is expected to be fully complete + * local:ergo/rosen-bridge/ui#352 + */ const tokenMap = await getTokenMap(); const amount = tokenMap.wrapAmount( 'eth', diff --git a/apps/rosen/app/_networks/ethereum/index.ts b/apps/rosen/app/_networks/ethereum/index.ts index 01b41532..a25231c6 100644 --- a/apps/rosen/app/_networks/ethereum/index.ts +++ b/apps/rosen/app/_networks/ethereum/index.ts @@ -6,7 +6,6 @@ import { unwrap } from '@/_errors'; import { EthereumNetwork as EthereumNetworkType } from '@/_types/network'; import { EthereumIcon } from '@rosen-bridge/icons'; -import {} from './server'; import { getMaxTransfer } from './getMaxTransfer'; import { fromSafeData } from '@/_utils/safeData'; import { getTokenMap } from '../getTokenMap.client'; diff --git a/apps/rosen/app/_networks/ethereum/server.ts b/apps/rosen/app/_networks/ethereum/server.ts index 21b456fa..ada524a4 100644 --- a/apps/rosen/app/_networks/ethereum/server.ts +++ b/apps/rosen/app/_networks/ethereum/server.ts @@ -1,6 +1 @@ 'use server'; - -import { wrap } from '@/_errors'; -import { toSafeData } from '@/_utils/safeData'; - -// export const decodeWasmValue = wrap(toSafeData()); From 3c3934d716b8aacdd06e047d7bbeb41c03c2627d Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sun, 15 Sep 2024 06:39:49 +0000 Subject: [PATCH 108/168] fix: Update the MetaMask wallet package version --- package-lock.json | 2 +- wallets/metamask-wallet/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 224f1e5c..7cc3a20e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25511,7 +25511,7 @@ }, "wallets/metamask-wallet": { "name": "@rosen-ui/metamask-wallet", - "version": "0.1.3", + "version": "0.1.0", "dependencies": { "@metamask/sdk": "^0.28.2", "@rosen-bridge/icons": "^0.4.0", diff --git a/wallets/metamask-wallet/package.json b/wallets/metamask-wallet/package.json index e18c66cf..7c9359ac 100644 --- a/wallets/metamask-wallet/package.json +++ b/wallets/metamask-wallet/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-ui/metamask-wallet", - "version": "0.1.3", + "version": "0.1.0", "private": true, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", From 851f36c2d6920b37cddbac2fc10923f74ee98dd8 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sun, 15 Sep 2024 13:20:00 +0000 Subject: [PATCH 109/168] fix: Update the version of utils in metamask wallet --- package-lock.json | 2 +- wallets/metamask-wallet/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index d99103b0..6cba576c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25517,7 +25517,7 @@ "@rosen-bridge/icons": "^0.4.0", "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/ethereum": "^0.1.0", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "@rosen-ui/wallet-api": "^1.0.2" }, "devDependencies": { diff --git a/wallets/metamask-wallet/package.json b/wallets/metamask-wallet/package.json index 7c9359ac..7a0d31ee 100644 --- a/wallets/metamask-wallet/package.json +++ b/wallets/metamask-wallet/package.json @@ -24,7 +24,7 @@ "@rosen-bridge/icons": "^0.4.0", "@rosen-bridge/tokens": "^1.2.1", "@rosen-network/ethereum": "^0.1.0", - "@rosen-ui/utils": "^0.3.0", + "@rosen-ui/utils": "^0.4.0", "@rosen-ui/wallet-api": "^1.0.2" } } From 6a5640818cad4b430a2a5bd4f04f99adde53b465 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sun, 15 Sep 2024 13:31:11 +0000 Subject: [PATCH 110/168] fix: Add changeset --- .changeset/nice-moons-study.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/nice-moons-study.md diff --git a/.changeset/nice-moons-study.md b/.changeset/nice-moons-study.md new file mode 100644 index 00000000..fe248e46 --- /dev/null +++ b/.changeset/nice-moons-study.md @@ -0,0 +1,5 @@ +--- +'@rosen-ui/metamask-wallet': patch +--- + +Upgrade the @rosen-ui/utils package from version 0.3.0 to 0.4.0 From 2299d02247bbf5d96095b68ecc0dc5673204e943 Mon Sep 17 00:00:00 2001 From: HFazelinia Date: Mon, 16 Sep 2024 13:53:09 +0330 Subject: [PATCH 111/168] integrate ethereum tx generation logic --- apps/rosen/app/_networks/ethereum/index.ts | 3 + apps/rosen/app/_networks/ethereum/server.ts | 15 ++++ networks/bitcoin/package.json | 2 +- networks/ethereum/package.json | 2 + networks/ethereum/src/constants.ts | 32 +++++++++ networks/ethereum/src/generateTxParameters.ts | 69 +++++++++++++++++++ networks/ethereum/src/index.ts | 2 + networks/ethereum/src/types.ts | 4 ++ networks/ethereum/src/utils.ts | 41 +++++++++++ package-lock.json | 33 ++++++++- wallets/metamask-wallet/src/transfer.ts | 39 ++++++++++- wallets/xdefi-wallet/package.json | 1 - 12 files changed, 238 insertions(+), 5 deletions(-) create mode 100644 networks/ethereum/src/constants.ts create mode 100644 networks/ethereum/src/generateTxParameters.ts diff --git a/apps/rosen/app/_networks/ethereum/index.ts b/apps/rosen/app/_networks/ethereum/index.ts index a25231c6..dd16dae6 100644 --- a/apps/rosen/app/_networks/ethereum/index.ts +++ b/apps/rosen/app/_networks/ethereum/index.ts @@ -9,6 +9,7 @@ import { EthereumIcon } from '@rosen-bridge/icons'; import { getMaxTransfer } from './getMaxTransfer'; import { fromSafeData } from '@/_utils/safeData'; import { getTokenMap } from '../getTokenMap.client'; +import { generateLockData, generateTxParameters } from './server'; /** * the main object for Ethereum network @@ -21,6 +22,8 @@ const EthereumNetwork: EthereumNetworkType = { wallets: [ metaMaskWalletCreator({ getTokenMap, + generateLockData: unwrap(generateLockData), + generateTxParameters: unwrap(fromSafeData(generateTxParameters)), }), ], logo: EthereumIcon, diff --git a/apps/rosen/app/_networks/ethereum/server.ts b/apps/rosen/app/_networks/ethereum/server.ts index ada524a4..14a36eba 100644 --- a/apps/rosen/app/_networks/ethereum/server.ts +++ b/apps/rosen/app/_networks/ethereum/server.ts @@ -1 +1,16 @@ 'use server'; + +import { + generateLockData as generateLockDataCore, + generateTxParameters as generateTxParametersCore, +} from '@rosen-network/ethereum'; + +import { wrap } from '@/_errors'; +import { TokenMap } from '@rosen-bridge/tokens'; +import { getRosenTokens } from '@/_backend/utils'; +import { toSafeData } from '@/_utils/safeData'; + +export const generateLockData = wrap(generateLockDataCore); +export const generateTxParameters = wrap( + toSafeData(generateTxParametersCore(new TokenMap(getRosenTokens()))), +); diff --git a/networks/bitcoin/package.json b/networks/bitcoin/package.json index 8044b0f1..911c5a9c 100644 --- a/networks/bitcoin/package.json +++ b/networks/bitcoin/package.json @@ -13,7 +13,7 @@ "test": "vitest" }, "dependencies": { - "@rosen-bridge/address-codec": "^0.2.1", + "@rosen-bridge/address-codec": "^0.3.0", "@rosen-bridge/bitcoin-utxo-selection": "^0.2.0", "@rosen-ui/constants": "^0.0.3", "@rosen-ui/wallet-api": "^1.0.2", diff --git a/networks/ethereum/package.json b/networks/ethereum/package.json index 0511e638..dfab87b1 100644 --- a/networks/ethereum/package.json +++ b/networks/ethereum/package.json @@ -12,6 +12,8 @@ "type-check": "tsc --noEmit" }, "dependencies": { + "@rosen-bridge/address-codec": "^0.3.0", + "@rosen-bridge/tokens": "^1.2.1", "@rosen-ui/wallet-api": "^1.0.0", "ethers": "^6.13.2" }, diff --git a/networks/ethereum/src/constants.ts b/networks/ethereum/src/constants.ts new file mode 100644 index 00000000..007fc374 --- /dev/null +++ b/networks/ethereum/src/constants.ts @@ -0,0 +1,32 @@ +import { Networks } from '@rosen-ui/constants'; +import { InterfaceAbi } from 'ethers'; + +export const ETH = 'eth'; + +export const SUPPORTED_CHAINS = [ + Networks.ERGO, + Networks.CARDANO, + Networks.BITCOIN, + Networks.ETHEREUM, +] as const; + +export const transferABI: InterfaceAbi = [ + { + constant: false, + inputs: [ + { + name: '_to', + type: 'address', + }, + { + name: '_value', + type: 'uint256', + }, + ], + name: 'transfer', + outputs: [], + payable: false, + stateMutability: 'nonpayable', + type: 'function', + }, +]; diff --git a/networks/ethereum/src/generateTxParameters.ts b/networks/ethereum/src/generateTxParameters.ts new file mode 100644 index 00000000..fded4e6c --- /dev/null +++ b/networks/ethereum/src/generateTxParameters.ts @@ -0,0 +1,69 @@ +import { RosenAmountValue } from '@rosen-ui/types'; +import { TokenMap, RosenChainToken } from '@rosen-bridge/tokens'; +import { Networks } from '@rosen-ui/constants'; +import { ETH, transferABI } from './constants'; +import { Contract } from 'ethers'; + +/** + * generates ethereum lock tx + * @param tokenId + * @param lockAddress + * @param fromAddress + * @param amount + * @param rosenData + * @returns + */ +export const generateTxParametersCore = async ( + tokenId: string, + lockAddress: string, + fromAddress: string, + amount: RosenAmountValue, + rosenData: string +) => { + let transactionParameters; + if (tokenId === ETH) { + transactionParameters = { + to: lockAddress, + from: fromAddress, + data: '0x' + rosenData, + }; + } else { + const contract = new Contract(tokenId, transferABI, undefined); + const data = contract.interface.encodeFunctionData('transfer', [ + lockAddress, + amount.toString(), + ]); + + transactionParameters = { + to: tokenId, + from: fromAddress, + data: data + rosenData, + }; + } + + return transactionParameters; +}; + +export const generateTxParameters = (tokenMap: TokenMap) => { + return ( + tokenId: string, + lockAddress: string, + fromAddress: string, + wrappedAmount: RosenAmountValue, + rosenData: string, + token: RosenChainToken + ) => { + const unwrappedAmount = tokenMap.unwrapAmount( + token[tokenMap.getIdKey(Networks.ETHEREUM)], + wrappedAmount, + Networks.ETHEREUM + ).amount; + return generateTxParametersCore( + tokenId, + lockAddress, + fromAddress, + unwrappedAmount, + rosenData + ); + }; +}; diff --git a/networks/ethereum/src/index.ts b/networks/ethereum/src/index.ts index 6d5a6ef4..584557bb 100644 --- a/networks/ethereum/src/index.ts +++ b/networks/ethereum/src/index.ts @@ -1,2 +1,4 @@ +export * from './constants'; +export * from './generateTxParameters'; export * from './types'; export * from './utils'; diff --git a/networks/ethereum/src/types.ts b/networks/ethereum/src/types.ts index b758c136..7781ce8c 100644 --- a/networks/ethereum/src/types.ts +++ b/networks/ethereum/src/types.ts @@ -1,8 +1,12 @@ import { TokenMap } from '@rosen-bridge/tokens'; import { Wallet } from '@rosen-ui/wallet-api'; +import { generateLockData } from './utils'; +import { generateTxParameters } from './generateTxParameters'; export type WalletCreator = (config: WalletCreatorConfig) => Wallet; export type WalletCreatorConfig = { getTokenMap(): Promise; + generateLockData: typeof generateLockData; + generateTxParameters: ReturnType; }; diff --git a/networks/ethereum/src/utils.ts b/networks/ethereum/src/utils.ts index 055a2b2d..6eee19cc 100644 --- a/networks/ethereum/src/utils.ts +++ b/networks/ethereum/src/utils.ts @@ -1,4 +1,45 @@ import { isAddress, JsonRpcProvider } from 'ethers'; +import { SUPPORTED_CHAINS } from './constants'; +import { encodeAddress } from '@rosen-bridge/address-codec'; + +/** + * generates metadata for lock transaction + * @param toChain + * @param toAddress + * @param fromAddress + * @param networkFee + * @param bridgeFee + * @returns + */ +export const generateLockData = async ( + toChain: string, + toAddress: string, + networkFee: string, + bridgeFee: string +): Promise => { + // parse toChain + const toChainCode = SUPPORTED_CHAINS.indexOf( + toChain as (typeof SUPPORTED_CHAINS)[number] + ); + if (toChainCode === -1) throw Error(`invalid toChain [${toChain}]`); + const toChainHex = toChainCode.toString(16).padStart(2, '0'); + + // parse bridgeFee + const bridgeFeeHex = BigInt(bridgeFee).toString(16).padStart(16, '0'); + + // parse networkFee + const networkFeeHex = BigInt(networkFee).toString(16).padStart(16, '0'); + + // parse toAddress + const addressHex = encodeAddress(toChain, toAddress); + const addressLengthCode = (addressHex.length / 2) + .toString(16) + .padStart(2, '0'); + + return Promise.resolve( + toChainHex + bridgeFeeHex + networkFeeHex + addressLengthCode + addressHex + ); +}; /** * gets Ethereum current block height diff --git a/package-lock.json b/package-lock.json index 6cba576c..0cb845e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -355,7 +355,7 @@ "name": "@rosen-network/bitcoin", "version": "0.2.0", "dependencies": { - "@rosen-bridge/address-codec": "^0.2.1", + "@rosen-bridge/address-codec": "^0.3.0", "@rosen-bridge/bitcoin-utxo-selection": "^0.2.0", "@rosen-ui/constants": "^0.0.3", "@rosen-ui/wallet-api": "^1.0.2", @@ -371,6 +371,20 @@ "typescript": "^5.0.0" } }, + "networks/bitcoin/node_modules/@rosen-bridge/address-codec": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-0.3.0.tgz", + "integrity": "sha512-qH8kOKuAStVbXoeAWmMuGD9CQTYGCE4nFAAS1NEi11eZV1nK97/mXQgjIpPHNGKJxkuPpmsGVoZxbaZakSCE5g==", + "dependencies": { + "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", + "bitcoinjs-lib": "^6.1.5", + "ergo-lib-wasm-nodejs": "^0.24.1", + "ethers": "^6.13.2" + }, + "engines": { + "node": ">=20.11.0" + } + }, "networks/bitcoin/node_modules/prettier": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", @@ -455,6 +469,8 @@ "name": "@rosen-network/ethereum", "version": "0.1.0", "dependencies": { + "@rosen-bridge/address-codec": "^0.3.0", + "@rosen-bridge/tokens": "^1.2.1", "@rosen-ui/wallet-api": "^1.0.0", "ethers": "^6.13.2" }, @@ -467,6 +483,20 @@ "typescript": "^5.0.0" } }, + "networks/ethereum/node_modules/@rosen-bridge/address-codec": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-0.3.0.tgz", + "integrity": "sha512-qH8kOKuAStVbXoeAWmMuGD9CQTYGCE4nFAAS1NEi11eZV1nK97/mXQgjIpPHNGKJxkuPpmsGVoZxbaZakSCE5g==", + "dependencies": { + "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", + "bitcoinjs-lib": "^6.1.5", + "ergo-lib-wasm-nodejs": "^0.24.1", + "ethers": "^6.13.2" + }, + "engines": { + "node": ">=20.11.0" + } + }, "networks/ethereum/node_modules/prettier": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", @@ -25682,7 +25712,6 @@ "name": "@rosen-ui/xdefi-wallet", "version": "0.4.0", "dependencies": { - "@rosen-bridge/address-codec": "^0.2.1", "@rosen-bridge/bitcoin-utxo-selection": "^0.2.0", "@rosen-bridge/icons": "^0.4.0", "@rosen-bridge/tokens": "^1.2.1", diff --git a/wallets/metamask-wallet/src/transfer.ts b/wallets/metamask-wallet/src/transfer.ts index 0df8bf44..2f2f9588 100644 --- a/wallets/metamask-wallet/src/transfer.ts +++ b/wallets/metamask-wallet/src/transfer.ts @@ -3,6 +3,7 @@ import { WalletCreatorConfig } from '@rosen-network/ethereum'; import { RosenAmountValue } from '@rosen-ui/types'; import { getMetaMaskWallet } from './getMetaMaskWallet'; +import { Networks } from '@rosen-ui/constants'; export const transferCreator = (config: WalletCreatorConfig) => @@ -15,5 +16,41 @@ export const transferCreator = networkFee: RosenAmountValue, lockAddress: string ): Promise => { - throw new Error('Not Implemented'); + const provider = getMetaMaskWallet().getApi().getProvider(); + + if (!provider) throw Error(`Failed to interact with metamask`); + + const accounts = await provider.request({ + method: 'eth_accounts', + }); + + if (!accounts?.length) + throw Error(`Failed to fetch accounts from metamask`); + if (!accounts[0]) + throw Error(`Failed to get address of first account from metamask`); + + const rosenData = await config.generateLockData( + toChain, + toAddress, + networkFee.toString(), + bridgeFee.toString() + ); + + const tokenMap = await config.getTokenMap(); + const tokenId = token[tokenMap.getIdKey(Networks.ETHEREUM)]; + + const transactionParameters = await config.generateTxParameters( + tokenId, + lockAddress, + accounts[0], + amount, + rosenData, + token + ); + const result = await provider.request({ + method: 'eth_sendTransaction', + params: [transactionParameters], + }); + + return result ?? ''; }; diff --git a/wallets/xdefi-wallet/package.json b/wallets/xdefi-wallet/package.json index 2ea5c5de..c2db3d38 100644 --- a/wallets/xdefi-wallet/package.json +++ b/wallets/xdefi-wallet/package.json @@ -20,7 +20,6 @@ "typescript": "^5.0.0" }, "dependencies": { - "@rosen-bridge/address-codec": "^0.2.1", "@rosen-bridge/bitcoin-utxo-selection": "^0.2.0", "@rosen-bridge/icons": "^0.4.0", "@rosen-bridge/tokens": "^1.2.1", From bf109dbd077b77212a51b854f8f33bf6d5d9444a Mon Sep 17 00:00:00 2001 From: HFazelinia Date: Mon, 16 Sep 2024 14:35:39 +0330 Subject: [PATCH 112/168] implement getMaxTransfer for Ethereum --- .../app/_networks/ethereum/getMaxTransfer.ts | 15 ++++++++------- networks/ethereum/src/constants.ts | 1 + networks/ethereum/src/generateTxParameters.ts | 1 + networks/ethereum/src/utils.ts | 10 +++++++++- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts b/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts index 6c7c4636..c7a59a8e 100644 --- a/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts @@ -8,6 +8,7 @@ import { EthereumNetwork } from '@/_types/network'; import { getTokenMap } from '../getTokenMap.server'; import { RosenAmountValue } from '@rosen-ui/types'; import { toSafeData } from '@/_utils/safeData'; +import { ETH_TRANSFER_GAS, getFeeData } from '@rosen-network/ethereum'; /** * get max transfer for ethereum @@ -20,17 +21,17 @@ export const getMaxTransfer = wrap( }: Parameters< EthereumNetwork['getMaxTransfer'] >[0]): Promise => { - /** - * TODO: This code is expected to be fully complete - * local:ergo/rosen-bridge/ui#352 - */ + const feeData = await getFeeData(); + if (!feeData.gasPrice) throw Error(`gas price is null`); + const estimatedFee = feeData.gasPrice * ETH_TRANSFER_GAS; const tokenMap = await getTokenMap(); - const amount = tokenMap.wrapAmount( + + const wrappedFee = tokenMap.wrapAmount( 'eth', - balance, + estimatedFee, Networks.ETHEREUM, ).amount; - return amount; + return balance - wrappedFee; }, ), ); diff --git a/networks/ethereum/src/constants.ts b/networks/ethereum/src/constants.ts index 007fc374..29ce1149 100644 --- a/networks/ethereum/src/constants.ts +++ b/networks/ethereum/src/constants.ts @@ -2,6 +2,7 @@ import { Networks } from '@rosen-ui/constants'; import { InterfaceAbi } from 'ethers'; export const ETH = 'eth'; +export const ETH_TRANSFER_GAS = 21000n; export const SUPPORTED_CHAINS = [ Networks.ERGO, diff --git a/networks/ethereum/src/generateTxParameters.ts b/networks/ethereum/src/generateTxParameters.ts index fded4e6c..575a5185 100644 --- a/networks/ethereum/src/generateTxParameters.ts +++ b/networks/ethereum/src/generateTxParameters.ts @@ -26,6 +26,7 @@ export const generateTxParametersCore = async ( to: lockAddress, from: fromAddress, data: '0x' + rosenData, + value: amount, }; } else { const contract = new Contract(tokenId, transferABI, undefined); diff --git a/networks/ethereum/src/utils.ts b/networks/ethereum/src/utils.ts index 6eee19cc..07d77b8c 100644 --- a/networks/ethereum/src/utils.ts +++ b/networks/ethereum/src/utils.ts @@ -1,4 +1,4 @@ -import { isAddress, JsonRpcProvider } from 'ethers'; +import { FeeData, isAddress, JsonRpcProvider } from 'ethers'; import { SUPPORTED_CHAINS } from './constants'; import { encodeAddress } from '@rosen-bridge/address-codec'; @@ -51,6 +51,14 @@ export const getHeight = async (): Promise => { ).getBlockNumber(); }; +/** + * gets Ethereum fee data + * @returns + */ +export const getFeeData = async (): Promise => { + return await new JsonRpcProvider(process.env.ETHEREUM_BLAST_API).getFeeData(); +}; + /** * Verify the validity of the Ethereum address * @param addr input address From 178b5c717dd139981acd3231374738075c76093c Mon Sep 17 00:00:00 2001 From: HFazelinia Date: Mon, 16 Sep 2024 16:12:32 +0330 Subject: [PATCH 113/168] fix transactionParameters format in Ethereum --- networks/ethereum/src/generateTxParameters.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/networks/ethereum/src/generateTxParameters.ts b/networks/ethereum/src/generateTxParameters.ts index 575a5185..be8f141f 100644 --- a/networks/ethereum/src/generateTxParameters.ts +++ b/networks/ethereum/src/generateTxParameters.ts @@ -26,7 +26,7 @@ export const generateTxParametersCore = async ( to: lockAddress, from: fromAddress, data: '0x' + rosenData, - value: amount, + value: amount.toString(16), }; } else { const contract = new Contract(tokenId, transferABI, undefined); From 50b8978be7940465fa7d3743d58c9c3c6b8ad2b0 Mon Sep 17 00:00:00 2001 From: HFazelinia Date: Mon, 16 Sep 2024 17:09:38 +0330 Subject: [PATCH 114/168] add changelogs --- .changeset/cyan-years-bake.md | 5 +++++ .changeset/flat-foxes-change.md | 5 +++++ .changeset/modern-coins-love.md | 5 +++++ 3 files changed, 15 insertions(+) create mode 100644 .changeset/cyan-years-bake.md create mode 100644 .changeset/flat-foxes-change.md create mode 100644 .changeset/modern-coins-love.md diff --git a/.changeset/cyan-years-bake.md b/.changeset/cyan-years-bake.md new file mode 100644 index 00000000..abbab015 --- /dev/null +++ b/.changeset/cyan-years-bake.md @@ -0,0 +1,5 @@ +--- +'@rosen-network/bitcoin': patch +--- + +update address-codec package diff --git a/.changeset/flat-foxes-change.md b/.changeset/flat-foxes-change.md new file mode 100644 index 00000000..29465e51 --- /dev/null +++ b/.changeset/flat-foxes-change.md @@ -0,0 +1,5 @@ +--- +'@rosen-ui/xdefi-wallet': patch +--- + +remove redundant package dependency diff --git a/.changeset/modern-coins-love.md b/.changeset/modern-coins-love.md new file mode 100644 index 00000000..7b971ea0 --- /dev/null +++ b/.changeset/modern-coins-love.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': major +--- + +integrate Ethereum From f1b52d88d06747b72b35106aa931b1975d5205e1 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 16 Sep 2024 14:54:16 +0000 Subject: [PATCH 115/168] feat: Update the ApiInfoResponse interface to incorporate the latest API enhancements --- .changeset/empty-emus-battle.md | 5 +++++ apps/guard/app/(dashboard)/@infoWidgets/HealthWidget.tsx | 4 ++-- apps/guard/app/_mock/mockedData.ts | 5 ++++- apps/guard/app/_types/api.ts | 5 ++++- 4 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 .changeset/empty-emus-battle.md diff --git a/.changeset/empty-emus-battle.md b/.changeset/empty-emus-battle.md new file mode 100644 index 00000000..0a71d543 --- /dev/null +++ b/.changeset/empty-emus-battle.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/guard-app': minor +--- + +Update the ApiInfoResponse interface to incorporate the latest API enhancements. diff --git a/apps/guard/app/(dashboard)/@infoWidgets/HealthWidget.tsx b/apps/guard/app/(dashboard)/@infoWidgets/HealthWidget.tsx index 46bc4037..86d5ce35 100644 --- a/apps/guard/app/(dashboard)/@infoWidgets/HealthWidget.tsx +++ b/apps/guard/app/(dashboard)/@infoWidgets/HealthWidget.tsx @@ -47,7 +47,7 @@ const HealthWidget = () => { @@ -60,7 +60,7 @@ const HealthWidget = () => { Health is - {info.health} + {info.health.status} ) )} diff --git a/apps/guard/app/_mock/mockedData.ts b/apps/guard/app/_mock/mockedData.ts index 60940a59..61ea6b38 100644 --- a/apps/guard/app/_mock/mockedData.ts +++ b/apps/guard/app/_mock/mockedData.ts @@ -18,7 +18,10 @@ import { } from '@/_types/api'; const info: ApiInfoResponse = { - health: 'Unstable', + health: { + status: 'Unstable', + trialErrors: [], + }, balances: { hot: [ { diff --git a/apps/guard/app/_types/api.ts b/apps/guard/app/_types/api.ts index a4a06408..0350dbcc 100644 --- a/apps/guard/app/_types/api.ts +++ b/apps/guard/app/_types/api.ts @@ -14,7 +14,10 @@ export interface TokenInfoWithAddress { } export interface ApiInfoResponse { - health: 'Healthy' | 'Unstable' | 'Broken'; + health: { + status: 'Healthy' | 'Unstable' | 'Broken'; + trialErrors: string[]; + }; rsnTokenId: string; balances: { hot: TokenInfoWithAddress[]; From 68f5240514a3e227c75a754b175988033866303a Mon Sep 17 00:00:00 2001 From: HFazelinia Date: Tue, 17 Sep 2024 19:41:22 +0330 Subject: [PATCH 116/168] minor improvement --- networks/ethereum/src/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/networks/ethereum/src/utils.ts b/networks/ethereum/src/utils.ts index 07d77b8c..97346dbe 100644 --- a/networks/ethereum/src/utils.ts +++ b/networks/ethereum/src/utils.ts @@ -36,7 +36,7 @@ export const generateLockData = async ( .toString(16) .padStart(2, '0'); - return Promise.resolve( + return ( toChainHex + bridgeFeeHex + networkFeeHex + addressLengthCode + addressHex ); }; From 455517cad8daab299efad445c3536c29419604f1 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 21 Sep 2024 12:42:36 +0330 Subject: [PATCH 117/168] chore: Revert the getMaxTransfer utils --- apps/rosen/app/_hooks/useBridgeForm.ts | 33 +++++++++--------- apps/rosen/app/_hooks/useMaxTransfer.ts | 21 +++++++---- apps/rosen/app/_utils/getMaxTransfer.ts | 46 +++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 22 deletions(-) create mode 100644 apps/rosen/app/_utils/getMaxTransfer.ts diff --git a/apps/rosen/app/_hooks/useBridgeForm.ts b/apps/rosen/app/_hooks/useBridgeForm.ts index ce7b2a4c..82547ba0 100644 --- a/apps/rosen/app/_hooks/useBridgeForm.ts +++ b/apps/rosen/app/_hooks/useBridgeForm.ts @@ -11,7 +11,7 @@ import { validateAddress } from '@/_actions/validateAddress'; import { AvailableNetworks, availableNetworks } from '@/_networks'; import { getMinTransfer } from '@/_utils/index'; -import { Networks } from '@rosen-ui/constants'; +import { getMaxTransfer } from '@/_utils/getMaxTransfer'; import { useTokenMap } from './useTokenMap'; import { RosenAmountValue } from '@rosen-ui/types'; @@ -77,21 +77,22 @@ const useBridgeForm = () => { const selectedNetwork = availableNetworks[sourceField.value as AvailableNetworks]; - const maxTransfer = await selectedNetwork.getMaxTransfer({ - balance: await walletGlobalContext.state.selectedWallet.getBalance( - tokenField.value, - ), - isNative: tokenField.value.metaData.type === 'native', - eventData: - selectedNetwork.name !== Networks.BITCOIN - ? undefined - : ({ - fromAddress: - await walletGlobalContext.state.selectedWallet!.getAddress(), - toAddress: addressField.value, - toChain: targetField.value, - } as any), - }); + const maxTransfer = await getMaxTransfer( + selectedNetwork, + { + balance: + await walletGlobalContext!.state.selectedWallet.getBalance( + tokenField.value, + ), + isNative: tokenField.value.metaData.type === 'native', + }, + async () => ({ + fromAddress: + await walletGlobalContext!.state.selectedWallet!.getAddress(), + toAddress: addressField.value, + toChain: targetField.value, + }), + ); const isAmountLarge = wrappedAmount > maxTransfer; if (isAmountLarge) return 'Balance insufficient'; diff --git a/apps/rosen/app/_hooks/useMaxTransfer.ts b/apps/rosen/app/_hooks/useMaxTransfer.ts index c7782ed5..2c22a5a7 100644 --- a/apps/rosen/app/_hooks/useMaxTransfer.ts +++ b/apps/rosen/app/_hooks/useMaxTransfer.ts @@ -6,11 +6,13 @@ import { Networks } from '@rosen-ui/constants'; import useNetwork from './useNetwork'; import useTokenBalance from './useTokenBalance'; +import { getMaxTransfer } from '@/_utils/getMaxTransfer'; import useTransactionFormData from './useTransactionFormData'; import useWallet from './useWallet'; /** - * Manage the maximum transferable amount. + * a hook version of `getMaxTransfer` util + * @returns CONTAINS A WRAPPED-VALUE */ export const useMaxTransfer = () => { const [error, setError] = useState(false); @@ -53,11 +55,18 @@ export const useMaxTransfer = () => { }; } - const max = await selectedNetwork.getMaxTransfer({ - balance: amount, - isNative: tokenValue.metaData.type === 'native', - eventData, - }); + const max = await getMaxTransfer( + selectedNetwork, + { + balance: amount, + isNative: tokenValue.metaData.type === 'native', + }, + async () => ({ + fromAddress: await selectedWallet.getAddress(), + toAddress: walletAddressValue, + toChain: targetValue, + }), + ); setMax(max); } catch { diff --git a/apps/rosen/app/_utils/getMaxTransfer.ts b/apps/rosen/app/_utils/getMaxTransfer.ts new file mode 100644 index 00000000..66b79452 --- /dev/null +++ b/apps/rosen/app/_utils/getMaxTransfer.ts @@ -0,0 +1,46 @@ +import { + BitcoinNetwork, + CardanoNetwork, + ErgoNetwork, + EthereumNetwork, +} from '@/_types/network'; +import { Networks } from '@rosen-ui/constants'; +import { RosenAmountValue } from '@rosen-ui/types'; + +/** + * return max transfer, considering all the context that affects it + * @param network + * @param tokenInfo CONTAINS A WRAPPED-VALUE + * @param context + * @returns THIS IS A WRAPPED-VALUE + */ +export const getMaxTransfer = async ( + network: ErgoNetwork | CardanoNetwork | BitcoinNetwork | EthereumNetwork, + tokenInfo: { + balance: RosenAmountValue; + isNative: boolean; + }, + getContext: () => Promise<{ + fromAddress: string; + toAddress: string; + toChain: string; + }>, +): Promise => { + if (network.name === Networks.BITCOIN) { + const context = await getContext(); + return await network.getMaxTransfer({ + balance: tokenInfo.balance, + isNative: tokenInfo.isNative, + eventData: { + fromAddress: context.fromAddress, + toAddress: context.toAddress, + toChain: context.toChain, + }, + }); + } + + return await network.getMaxTransfer({ + balance: tokenInfo.balance, + isNative: tokenInfo.isNative, + }); +}; From 58af26480c1050b714b435403be3054e07bd39b9 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sun, 22 Sep 2024 12:18:54 +0000 Subject: [PATCH 118/168] fix: Strengthen type safety and enforce robust typing for Chain and Network types --- .changeset/flat-ligers-compete.md | 23 ++++++++++++++ .../@actions/SendForSigningForm.tsx | 14 +++++---- apps/guard/app/(dashboard)/@tokens/page.tsx | 8 +++-- apps/guard/app/_mock/mockedData.ts | 29 +++++++++--------- apps/guard/app/_types/api.ts | 15 +++++----- apps/guard/app/events/TableRow.tsx | 5 ++-- apps/guard/app/history/TableRow.tsx | 8 +++-- apps/guard/app/revenues/TableRow.tsx | 8 +++-- apps/guard/package.json | 4 +-- apps/rosen/app/(bridge)/BridgeForm.tsx | 3 +- apps/rosen/app/(bridge)/BridgeTransaction.tsx | 2 +- apps/rosen/app/(bridge)/ChooseWalletModal.tsx | 3 +- apps/rosen/app/_actions/calculateFee.ts | 16 +++++----- apps/rosen/app/_actions/validateAddress.ts | 19 +++++------- apps/rosen/app/_backend/assets/repository.ts | 3 +- .../app/_backend/events/event-service.ts | 8 +++-- apps/rosen/app/_hooks/useBridgeForm.ts | 8 ++--- apps/rosen/app/_hooks/useMaxTransfer.ts | 4 +-- apps/rosen/app/_hooks/useNetwork.ts | 20 +++++-------- apps/rosen/app/_hooks/useTransactionFees.ts | 8 ++--- .../app/_hooks/useTransactionFormData.ts | 5 ++-- .../app/_networks/bitcoin/getMaxTransfer.ts | 4 +-- apps/rosen/app/_networks/bitcoin/index.ts | 6 ++-- .../app/_networks/cardano/getMaxTransfer.ts | 4 +-- apps/rosen/app/_networks/cardano/index.ts | 6 ++-- .../app/_networks/ergo/getMaxTransfer.ts | 4 +-- apps/rosen/app/_networks/ergo/index.ts | 6 ++-- .../app/_networks/ethereum/getMaxTransfer.ts | 4 +-- apps/rosen/app/_networks/ethereum/index.ts | 6 ++-- apps/rosen/app/_networks/index.ts | 12 ++++---- apps/rosen/app/_types/network.ts | 7 ++--- apps/rosen/app/_utils/getMaxTransfer.ts | 8 ++--- apps/rosen/app/_utils/index.ts | 23 ++++---------- apps/rosen/app/api/v1/assets/validations.ts | 6 ++-- apps/rosen/app/assets/TableRow.tsx | 4 ++- apps/rosen/app/assets/page.tsx | 26 +++++++++------- apps/rosen/app/events/TableRow.tsx | 13 ++++---- apps/rosen/unitTests/utils/index.test.ts | 6 ++-- apps/watcher/app/_mock/mockedData.ts | 15 +++++----- apps/watcher/app/_types/api.ts | 13 ++++---- apps/watcher/package.json | 3 +- build.sh | 2 +- networks/bitcoin/src/constants.ts | 8 ----- networks/bitcoin/src/generateUnsignedTx.ts | 6 ++-- networks/bitcoin/src/utils.ts | 9 +++--- .../bitcoin/unitTests/src/generateTx.test.ts | 3 +- networks/bitcoin/unitTests/src/utils.test.ts | 7 +++-- networks/cardano/src/generateUnsignedTx.ts | 4 +-- networks/cardano/src/utils.ts | 3 +- networks/ergo/src/generateUnsignedTx.ts | 12 ++++---- networks/ergo/src/utils.ts | 3 +- networks/ethereum/src/constants.ts | 8 ----- networks/ethereum/src/generateTxParameters.ts | 6 ++-- networks/ethereum/src/utils.ts | 9 +++--- package-lock.json | 6 ++++ .../asset-calculator/lib/asset-calculator.ts | 27 +++++++++-------- .../lib/calculator/abstract-calculator.ts | 3 +- .../calculator/chains/bitcoin-calculator.ts | 4 ++- .../calculator/chains/cardano-calculator.ts | 4 ++- .../lib/calculator/chains/ergo-calculator.ts | 4 ++- packages/asset-calculator/lib/constants.ts | 3 -- .../bridgedAsset/BridgedAssetEntity.ts | 3 +- .../bridgedAsset/BridgedAssetModel.ts | 5 ++-- .../lib/database/token/TokenEntity.ts | 3 +- packages/asset-calculator/package.json | 1 + .../tests/asset-calculator.spec.ts | 30 +++++++++---------- .../tests/database/test-data.ts | 10 ++++--- packages/constants/src/index.ts | 17 +++++++++-- packages/types/package.json | 3 ++ packages/types/src/common.ts | 4 +++ packages/utils/src/getAddressUrl.ts | 14 +++++---- packages/utils/src/getTokenUrl.ts | 14 +++++---- packages/utils/src/getTxUrl.ts | 14 +++++---- wallets/eternl-wallet/src/getBalance.ts | 6 ++-- wallets/eternl-wallet/src/transfer.ts | 4 +-- wallets/flint-wallet/src/getBalance.ts | 6 ++-- wallets/flint-wallet/src/transfer.ts | 4 +-- wallets/lace-wallet/src/getBalance.ts | 6 ++-- wallets/lace-wallet/src/transfer.ts | 4 +-- wallets/metamask-wallet/src/getBalance.ts | 6 ++-- wallets/metamask-wallet/src/transfer.ts | 8 ++--- wallets/nami-wallet/src/getBalance.ts | 6 ++-- wallets/nami-wallet/src/transfer.ts | 4 +-- wallets/nautilus-wallet/src/getBalance.ts | 6 ++-- wallets/nautilus-wallet/src/transfer.ts | 4 +-- wallets/wallet-api/package.json | 1 + wallets/wallet-api/src/types/index.ts | 4 +-- wallets/xdefi-wallet/src/getBalance.ts | 6 ++-- wallets/xdefi-wallet/src/transfer.ts | 4 +-- 89 files changed, 400 insertions(+), 317 deletions(-) create mode 100644 .changeset/flat-ligers-compete.md delete mode 100644 packages/asset-calculator/lib/constants.ts diff --git a/.changeset/flat-ligers-compete.md b/.changeset/flat-ligers-compete.md new file mode 100644 index 00000000..b345fd71 --- /dev/null +++ b/.changeset/flat-ligers-compete.md @@ -0,0 +1,23 @@ +--- +'@rosen-ui/asset-calculator': patch +'@rosen-ui/metamask-wallet': patch +'@rosen-ui/nautilus-wallet': patch +'@rosen-ui/eternl-wallet': patch +'@rosen-ui/flint-wallet': patch +'@rosen-ui/xdefi-wallet': patch +'@rosen-ui/lace-wallet': patch +'@rosen-ui/nami-wallet': patch +'@rosen-ui/constants': patch +'@rosen-ui/wallet-api': patch +'@rosen-network/ethereum': patch +'@rosen-network/bitcoin': patch +'@rosen-network/cardano': patch +'@rosen-ui/types': patch +'@rosen-ui/utils': patch +'@rosen-network/ergo': patch +'@rosen-bridge/watcher-app': patch +'@rosen-bridge/guard-app': patch +'@rosen-bridge/rosen-app': patch +--- + +Strengthen type safety and enforce robust typing for Chain and Network types diff --git a/apps/guard/app/(dashboard)/@actions/SendForSigningForm.tsx b/apps/guard/app/(dashboard)/@actions/SendForSigningForm.tsx index 7b305563..ad8bfbe4 100644 --- a/apps/guard/app/(dashboard)/@actions/SendForSigningForm.tsx +++ b/apps/guard/app/(dashboard)/@actions/SendForSigningForm.tsx @@ -23,13 +23,15 @@ import { useApiKey } from '@rosen-bridge/shared-contexts'; import { ApiSignRequestBody, ApiSignResponse } from '@/_types/api'; import ApiKeyModal from '@/_modals/ApiKeyModal'; +import { NETWORK_LABELS, NETWORKS } from '@rosen-ui/constants'; +import { Network } from '@rosen-ui/types'; const AlertIcon = styled(Alert)((theme) => ({ fill: theme.palette.primary.main, })); interface Form { - chain: string; + chain: Network; txJson: string; requiredSign: number; overwrite?: boolean; @@ -57,7 +59,7 @@ const SendForSigningForm = () => { const { handleSubmit, register, reset, formState } = useForm({ defaultValues: { txJson: '', - chain: '', + chain: '' as Network, requiredSign: 10, overwrite: undefined, }, @@ -130,9 +132,11 @@ const SendForSigningForm = () => { sx={{ mb: 2 }} fullWidth > - Ergo - Cardano - Bitcoin + {Object.keys(NETWORKS).map((key) => ( + + {NETWORK_LABELS[key as keyof typeof NETWORKS]} + + ))} { const { data: ergoTokens, isLoading: isErogTokensLoading } = - useSWR(['/assets', { chain: 'ergo' }], fetcher); + useSWR( + ['/assets', { chain: NETWORKS.ERGO }], + fetcher, + ); const { data: cardanoTokens, isLoading: isCardanoTokensLoading } = useSWR( - ['/assets', { chain: 'cardano' }], + ['/assets', { chain: NETWORKS.CARDANO }], fetcher, ); diff --git a/apps/guard/app/_mock/mockedData.ts b/apps/guard/app/_mock/mockedData.ts index 61ea6b38..55085be3 100644 --- a/apps/guard/app/_mock/mockedData.ts +++ b/apps/guard/app/_mock/mockedData.ts @@ -1,6 +1,7 @@ import moment from 'moment'; import { SWRConfigProps } from '@rosen-ui/swr-mock'; +import { NETWORKS } from '@rosen-ui/constants'; import { ChartPeriod } from '@rosen-ui/types'; import { @@ -26,7 +27,7 @@ const info: ApiInfoResponse = { hot: [ { address: '3WvuxxkcM5gRhfktbKTn3Wvux1xkcM5gRhTn1WfktbGoSqpW', - chain: 'Ergo', + chain: NETWORKS.ERGO, balance: { amount: 100 * 1e9, decimals: 9, @@ -38,7 +39,7 @@ const info: ApiInfoResponse = { { address: 'addr1qyrgyu3x5vqul78qa2g9q8l62xxnnfyz64qawwelltuzagdhs2e6xhe9mn0j9xzhf3f63vd0ulm58820qp7s3q0ql92swdh27a', - chain: 'Cardano', + chain: NETWORKS.CARDANO, balance: { amount: 500 * 1e6, decimals: 6, @@ -51,7 +52,7 @@ const info: ApiInfoResponse = { cold: [ { address: '3WvuxxkcM5gRhfktbKTn3Wvux1xkcM5gRhTn1WfktbGoSqpW', - chain: 'Ergo', + chain: NETWORKS.ERGO, balance: { amount: 300 * 1e9, decimals: 9, @@ -63,7 +64,7 @@ const info: ApiInfoResponse = { { address: 'addr1qyrgyu3x5vqul78qa2g9q8l62xxnnfyz64qawwelltuzagdhs2e6xhe9mn0j9xzhf3f63vd0ulm58820qp7s3q0ql92swdh27a', - chain: 'Cardano', + chain: NETWORKS.CARDANO, balance: { amount: 1500 * 1e6, decimals: 6, @@ -213,14 +214,14 @@ const assets = [ tokenId: '2162efc108a0aeba2c040a3a29b1e8573dc6b6d746d33e5fe9cf9ccc1796f630', amount: 10000, decimals: 2, - chain: 'ergo', + chain: NETWORKS.ERGO, isNativeToken: false, }, { tokenId: '91e9086194cd9144a1661c5820dd53869afd1711d4c5a305b568a452e86f81b1', amount: 2, decimals: 0, - chain: 'ergo', + chain: NETWORKS.ERGO, isNativeToken: false, }, { @@ -228,7 +229,7 @@ const assets = [ tokenId: 'c6cce2d65182c2e4343d942000263b75d103e6d56fea08ded6dfc25548c2d34d', amount: 200, decimals: 1, - chain: 'ergo', + chain: NETWORKS.ERGO, isNativeToken: false, }, { @@ -236,7 +237,7 @@ const assets = [ tokenId: '6c1526b2a5ef010edb622719d9d7fbde8437a39543547c3effbe72ad33504cf1', amount: 20, decimals: 5, - chain: 'cardano', + chain: NETWORKS.CARDANO, isNativeToken: false, }, ]; @@ -290,8 +291,8 @@ const generateHistoryEventRecords = ( return new Array(numberOfRecords).fill(null).map((data, index) => ({ eventId: `${Math.floor(Date.now() * Math.random())}`, txId: `${Math.floor(Date.now() * Math.random())}`, - fromChain: 'Chain A', - toChain: 'Chain B', + fromChain: NETWORKS.ERGO, + toChain: NETWORKS.CARDANO, fromAddress: '3WvuxxkcM5gRhfktbKTn3Wvux', toAddress: '3WvuxxkcM5gRhfktbKTn3Wvux', bridgeFee: '0.2', @@ -316,8 +317,8 @@ const generateOngoingEventRecords = ( return new Array(numberOfRecords).fill(null).map((data, index) => ({ eventId: `${Math.floor(Date.now() * Math.random())}`, txId: `${Math.floor(Date.now() * Math.random())}`, - fromChain: 'Chain A', - toChain: 'Chain B', + fromChain: NETWORKS.ERGO, + toChain: NETWORKS.CARDANO, fromAddress: '3WvuxxkcM5gRhfktbKTn3Wvux', toAddress: '3WvuxxkcM5gRhfktbKTn3Wvux', bridgeFee: '0.2', @@ -343,8 +344,8 @@ const generateRevenueRecords = (numberOfRecords: number) => { '85baefff2eb9e45b04f8b4e6265e866773db6db5f9e8e30ce2cae1aa263b90f7', eventId: '85baefff2eb9e45b04f8b4e6265e866773db6db5f9e8e30ce2cae1aa263b90f7', lockHeight: 100, - fromChain: 'Chain A', - toChain: 'Chain B', + fromChain: NETWORKS.ERGO, + toChain: NETWORKS.CARDANO, fromAddress: '3WvuxxkcM5gRhfktbKTn3Wvux', toAddress: '3WvuxxkcM5gRhfktbKTn3Wvux', amount: '0.1', diff --git a/apps/guard/app/_types/api.ts b/apps/guard/app/_types/api.ts index 0350dbcc..7e14ed18 100644 --- a/apps/guard/app/_types/api.ts +++ b/apps/guard/app/_types/api.ts @@ -5,11 +5,12 @@ import { Paginated, TokenInfoWithColdAmount, MutationRequestBodyWithHeaders, + Network, } from '@rosen-ui/types'; export interface TokenInfoWithAddress { address: string; - chain: string; + chain: Network; balance: TokenInfo; } @@ -27,7 +28,7 @@ export interface ApiInfoResponse { } export interface GuardTokenInfo extends TokenInfoWithColdAmount { - chain: string; + chain: Network; } interface GuardTokenChartData extends Omit { @@ -36,7 +37,7 @@ interface GuardTokenChartData extends Omit { export type ApiRevenueChartResponse = GuardTokenChartData[]; export interface ApiSignRequestBodyData { - chain: string; + chain: Network; txJson: string; requiredSign: number; overwrite?: boolean; @@ -55,8 +56,8 @@ export type ApiHealthStatusResponse = HealthParamInfo[]; export interface EventBase { eventId: string; - fromChain: string; - toChain: string; + fromChain: Network; + toChain: Network; fromAddress: string; toAddress: string; bridgeFee: string; @@ -83,8 +84,8 @@ export interface Revenue { rewardTxId: string; eventId: string; lockHeight: number; - fromChain: string; - toChain: string; + fromChain: Network; + toChain: Network; fromAddress: string; toAddress: string; bridgeFee: string; diff --git a/apps/guard/app/events/TableRow.tsx b/apps/guard/app/events/TableRow.tsx index c898422f..37343fa1 100644 --- a/apps/guard/app/events/TableRow.tsx +++ b/apps/guard/app/events/TableRow.tsx @@ -13,6 +13,7 @@ import { AngleDown, AngleUp } from '@rosen-bridge/icons'; import { getDecimalString, getTxURL } from '@rosen-ui/utils'; import { OngoingEvent } from '@/_types/api'; +import { NETWORKS } from '@rosen-ui/constants'; interface RowProps extends OngoingEvent { isLoading?: boolean; @@ -136,7 +137,7 @@ export const MobileRow: FC = (props) => { Trigger TX Id - + @@ -227,7 +228,7 @@ export const TabletRow: FC = (props) => {
= (props) => { Reward TX Id - + @@ -227,7 +231,7 @@ export const TabletRow: FC = (props) => { = (props) => { Reward TX Id - + @@ -273,7 +277,7 @@ export const TabletRow: FC = (props) => { { {...addressField} value={addressField.value ?? ''} /> - {targetField.value == 'bitcoin' && ( + {targetField.value == NETWORKS.BITCOIN && ( Only Native SegWit (P2WPKH or P2WSH) addresses are supported. diff --git a/apps/rosen/app/(bridge)/BridgeTransaction.tsx b/apps/rosen/app/(bridge)/BridgeTransaction.tsx index 3b7b7ff5..a96e31f0 100644 --- a/apps/rosen/app/(bridge)/BridgeTransaction.tsx +++ b/apps/rosen/app/(bridge)/BridgeTransaction.tsx @@ -209,7 +209,7 @@ export const BridgeTransaction = () => { setChooseWalletsModalOpen(false)} wallets={wallets || []} diff --git a/apps/rosen/app/(bridge)/ChooseWalletModal.tsx b/apps/rosen/app/(bridge)/ChooseWalletModal.tsx index ea7e6791..f1592025 100644 --- a/apps/rosen/app/(bridge)/ChooseWalletModal.tsx +++ b/apps/rosen/app/(bridge)/ChooseWalletModal.tsx @@ -8,6 +8,7 @@ import { Tooltip, Typography, } from '@rosen-bridge/ui-kit'; +import { Network } from '@rosen-ui/types'; import { Wallet } from '@rosen-ui/wallet-api'; import { useEffect, useState } from 'react'; @@ -15,7 +16,7 @@ interface ChooseWalletModalProps { open: boolean; handleClose: () => void; setSelectedWallet: ((wallet: Wallet) => Promise) | undefined; - chainName: string; + chainName?: Network; wallets: Wallet[]; } diff --git a/apps/rosen/app/_actions/calculateFee.ts b/apps/rosen/app/_actions/calculateFee.ts index 2003f4f1..51616718 100644 --- a/apps/rosen/app/_actions/calculateFee.ts +++ b/apps/rosen/app/_actions/calculateFee.ts @@ -13,19 +13,19 @@ const ergoExplorerClient = ergoExplorerClientFactory( process.env.ERGO_EXPLORER_API!, ); -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS } from '@rosen-ui/constants'; import { ERGO_EXPLORER_URL, feeConfigTokenId } from '@/_constants'; -import { AvailableNetworks } from '@/_networks'; +import { Network } from '@rosen-ui/types'; import { wrap } from '@/_errors'; import { toSafeData } from '@/_utils/safeData'; const GetHeight = { - [Networks.ETHEREUM]: ethereumGetHeight, - [Networks.CARDANO]: async () => + [NETWORKS.ETHEREUM]: ethereumGetHeight, + [NETWORKS.CARDANO]: async () => (await cardanoKoiosClient.getTip())[0].block_no, - [Networks.ERGO]: async () => + [NETWORKS.ERGO]: async () => Number((await ergoExplorerClient.v1.getApiV1Networkstate()).height), - [Networks.BITCOIN]: async (): Promise => { + [NETWORKS.BITCOIN]: async (): Promise => { const response = await fetch( `${process.env.BITCOIN_ESPLORA_API}/api/blocks/tip/height`, ); @@ -47,8 +47,8 @@ const GetHeight = { export const calculateFee = wrap( toSafeData( async ( - sourceNetwork: AvailableNetworks, - targetNetwork: AvailableNetworks, + sourceNetwork: Network, + targetNetwork: Network, tokenId: string, nextHeightInterval: number, ) => { diff --git a/apps/rosen/app/_actions/validateAddress.ts b/apps/rosen/app/_actions/validateAddress.ts index 0dfc4d6c..b47df334 100644 --- a/apps/rosen/app/_actions/validateAddress.ts +++ b/apps/rosen/app/_actions/validateAddress.ts @@ -1,10 +1,10 @@ 'use server'; import { Address } from 'ergo-lib-wasm-nodejs'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS, NETWORK_VALUES } from '@rosen-ui/constants'; import * as wasm from '@emurgo/cardano-serialization-lib-nodejs'; -import { AvailableNetworks } from '@/_networks'; +import { Network } from '@rosen-ui/types'; import { isValidAddress as isValidBitcoinAddress } from '@rosen-network/bitcoin'; import { isValidAddress as isValidEthereumAddress } from '@rosen-network/ethereum'; import { withValidation } from '@/_validation'; @@ -16,20 +16,17 @@ import Joi from 'joi'; * @param walletAddress - wallet address to verify * @returns the validation results for the passed address */ -const validateAddressCore = async ( - chain: AvailableNetworks, - walletAddress: string, -) => { +const validateAddressCore = async (chain: Network, walletAddress: string) => { try { - if (chain === Networks.ERGO) { + if (chain === NETWORKS.ERGO) { Address.from_base58(walletAddress); - } else if (chain === Networks.CARDANO) { + } else if (chain === NETWORKS.CARDANO) { wasm.Address.from_bech32(walletAddress); - } else if (chain == Networks.BITCOIN) { + } else if (chain == NETWORKS.BITCOIN) { if (!isValidBitcoinAddress(walletAddress)) { throw new Error(); } - } else if (chain == Networks.ETHEREUM) { + } else if (chain == NETWORKS.ETHEREUM) { if (!isValidEthereumAddress(walletAddress)) { throw new Error(); } @@ -45,7 +42,7 @@ type Schema = Parameters; const schema = Joi.array().ordered( Joi.string() .required() - .valid(...Object.values(Networks)), + .valid(...NETWORK_VALUES), Joi.string().required(), ); diff --git a/apps/rosen/app/_backend/assets/repository.ts b/apps/rosen/app/_backend/assets/repository.ts index 363554cc..4b996a98 100644 --- a/apps/rosen/app/_backend/assets/repository.ts +++ b/apps/rosen/app/_backend/assets/repository.ts @@ -7,6 +7,7 @@ import { import NotFoundError from '@/_errors/NotFoundError'; import dataSource from '../dataSource'; +import { Network } from '@rosen-ui/types'; const bridgedAssetRepository = dataSource.getRepository(BridgedAssetEntity); const lockedAssetRepository = dataSource.getRepository(LockedAssetEntity); @@ -19,7 +20,7 @@ export interface Asset { isNative: boolean; bridged: string; lockedPerAddress?: Array<{ amount: number; address: string }>; - chain: string; + chain: Network; } export type AssetFilters = Partial>; diff --git a/apps/rosen/app/_backend/events/event-service.ts b/apps/rosen/app/_backend/events/event-service.ts index 9cd4afec..764d11c3 100644 --- a/apps/rosen/app/_backend/events/event-service.ts +++ b/apps/rosen/app/_backend/events/event-service.ts @@ -1,4 +1,5 @@ import { TokenMap } from '@rosen-bridge/tokens'; +import { Network } from '@rosen-ui/types'; import { getRosenTokens } from '@/_backend/utils'; @@ -13,7 +14,7 @@ const tokenMap = new TokenMap(getRosenTokens()); * @param tokenId * @param chain */ -const getFullTokenData = (tokenId: string, chain: string) => { +const getFullTokenData = (tokenId: string, chain: Network) => { try { const token = tokenMap.search(chain, { [tokenMap.getIdKey(chain)]: tokenId, @@ -47,7 +48,10 @@ const getEventsWithFullTokenData = async (offset: number, limit: number) => { total: events.total, items: events.items.map(({ sourceChainTokenId, ...item }) => ({ ...item, - lockToken: getFullTokenData(sourceChainTokenId, item.fromChain), + lockToken: getFullTokenData( + sourceChainTokenId, + item.fromChain as Network, + ), })), }; }; diff --git a/apps/rosen/app/_hooks/useBridgeForm.ts b/apps/rosen/app/_hooks/useBridgeForm.ts index 82547ba0..8b002d76 100644 --- a/apps/rosen/app/_hooks/useBridgeForm.ts +++ b/apps/rosen/app/_hooks/useBridgeForm.ts @@ -9,11 +9,11 @@ import { WalletContext } from '@/_contexts/walletContext'; import { validateAddress } from '@/_actions/validateAddress'; -import { AvailableNetworks, availableNetworks } from '@/_networks'; +import { availableNetworks } from '@/_networks'; import { getMinTransfer } from '@/_utils/index'; import { getMaxTransfer } from '@/_utils/getMaxTransfer'; import { useTokenMap } from './useTokenMap'; -import { RosenAmountValue } from '@rosen-ui/types'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; const validationCache = new Map(); @@ -75,7 +75,7 @@ const useBridgeForm = () => { // prevent user from entering more than token amount const selectedNetwork = - availableNetworks[sourceField.value as AvailableNetworks]; + availableNetworks[sourceField.value as Network]; const maxTransfer = await getMaxTransfer( selectedNetwork, @@ -90,7 +90,7 @@ const useBridgeForm = () => { fromAddress: await walletGlobalContext!.state.selectedWallet!.getAddress(), toAddress: addressField.value, - toChain: targetField.value, + toChain: targetField.value as Network, }), ); diff --git a/apps/rosen/app/_hooks/useMaxTransfer.ts b/apps/rosen/app/_hooks/useMaxTransfer.ts index 2c22a5a7..ff6d6bde 100644 --- a/apps/rosen/app/_hooks/useMaxTransfer.ts +++ b/apps/rosen/app/_hooks/useMaxTransfer.ts @@ -2,7 +2,7 @@ import { useCallback, useEffect, useState, useTransition } from 'react'; import { RosenAmountValue } from '@rosen-ui/types'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS } from '@rosen-ui/constants'; import useNetwork from './useNetwork'; import useTokenBalance from './useTokenBalance'; @@ -47,7 +47,7 @@ export const useMaxTransfer = () => { try { let eventData: any; - if (selectedNetwork.name === Networks.BITCOIN) { + if (selectedNetwork.name === NETWORKS.BITCOIN) { eventData = { fromAddress: await selectedWallet.getAddress(), toAddress: walletAddressValue, diff --git a/apps/rosen/app/_hooks/useNetwork.ts b/apps/rosen/app/_hooks/useNetwork.ts index 1471f5b1..22d842d7 100644 --- a/apps/rosen/app/_hooks/useNetwork.ts +++ b/apps/rosen/app/_hooks/useNetwork.ts @@ -1,13 +1,11 @@ import { useMemo } from 'react'; -import { Networks } from '@rosen-ui/constants'; -import { AvailableNetworks, availableNetworks } from '@/_networks'; +import { NETWORK_VALUES } from '@rosen-ui/constants'; +import { availableNetworks } from '@/_networks'; import useBridgeForm from './useBridgeForm'; import { useTokenMap } from './useTokenMap'; - -type Chain = string; -type SourceFieldValue = Chain & AvailableNetworks; +import { Network } from '@rosen-ui/types'; /** * handles network related operations and provide list of @@ -22,8 +20,8 @@ const useNetwork = () => { * unsupported networks */ const availableNetworkObjects = useMemo(() => { - return (tokenMap.getAllChains() as SourceFieldValue[]) - .filter((chain) => Object.values(Networks).includes(chain)) + return (tokenMap.getAllChains() as Network[]) + .filter((chain) => NETWORK_VALUES.includes(chain)) .map((chain) => availableNetworks[chain]); }, [tokenMap]); @@ -32,10 +30,8 @@ const useNetwork = () => { * unsupported networks */ const targetNetworks = useMemo(() => { - return ( - tokenMap.getSupportedChains(sourceField.value) as SourceFieldValue[] - ) - .filter((chain) => Object.values(Networks).includes(chain)) + return (tokenMap.getSupportedChains(sourceField.value) as Network[]) + .filter((chain) => NETWORK_VALUES.includes(chain)) .map((chain) => availableNetworks[chain]); }, [sourceField.value, tokenMap]); @@ -51,7 +47,7 @@ const useNetwork = () => { return { availableNetworks: availableNetworkObjects, selectedNetwork: sourceField.value - ? availableNetworks[sourceField.value as SourceFieldValue] + ? availableNetworks[sourceField.value as Network] : null, targetNetworks: targetNetworks, tokens, diff --git a/apps/rosen/app/_hooks/useTransactionFees.ts b/apps/rosen/app/_hooks/useTransactionFees.ts index 75f9c322..3e736b9c 100644 --- a/apps/rosen/app/_hooks/useTransactionFees.ts +++ b/apps/rosen/app/_hooks/useTransactionFees.ts @@ -9,7 +9,7 @@ import useNetwork from './useNetwork'; import { calculateFee } from '@/_actions/calculateFee'; -import { AvailableNetworks } from '@/_networks'; +import { Network } from '@rosen-ui/types'; import { unwrap } from '@/_errors'; import { useTokenMap } from './useTokenMap'; import { fromSafeData } from '@/_utils/safeData'; @@ -19,8 +19,8 @@ import { fromSafeData } from '@/_utils/safeData'; * two networks */ const useTransactionFees = ( - sourceChain: AvailableNetworks | null, - targetChain: AvailableNetworks | null, + sourceChain: Network | null, + targetChain: Network | null, token: RosenChainToken | null, amount: string | null, ) => { @@ -35,7 +35,7 @@ const useTransactionFees = ( * finds and returns a token id based on supported networks */ const getTokenId = useCallback( - (sourceChain: string, token: RosenChainToken) => { + (sourceChain: Network, token: RosenChainToken) => { const idKey = tokenMap.getIdKey(sourceChain); const tokens = tokenMap.search(sourceChain, { [idKey]: token[idKey], diff --git a/apps/rosen/app/_hooks/useTransactionFormData.ts b/apps/rosen/app/_hooks/useTransactionFormData.ts index 484a97bc..4a20d0ff 100644 --- a/apps/rosen/app/_hooks/useTransactionFormData.ts +++ b/apps/rosen/app/_hooks/useTransactionFormData.ts @@ -1,6 +1,7 @@ import { useWatch, useFormContext, FieldValues } from 'react-hook-form'; import type { BridgeForm } from '@/(bridge)/page'; +import { Network } from '@rosen-ui/types'; /** * provide access to the bridge form context and current form values @@ -9,8 +10,8 @@ import type { BridgeForm } from '@/(bridge)/page'; const useTransactionFormData = () => { const { control, ...rest } = useFormContext(); - const sourceValue = useWatch({ control, name: 'source' }); - const targetValue = useWatch({ control, name: 'target' }); + const sourceValue = useWatch({ control, name: 'source' }) as Network; + const targetValue = useWatch({ control, name: 'target' }) as Network; const tokenValue = useWatch({ control, name: 'token' }); const amountValue = useWatch({ control, name: 'amount' }); const walletAddressValue = useWatch({ control, name: 'walletAddress' }); diff --git a/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts b/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts index bba305ca..3aad9790 100644 --- a/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts @@ -10,7 +10,7 @@ import { import { wrap } from '@/_errors'; import { BitcoinNetwork } from '@/_types/network'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS } from '@rosen-ui/constants'; import { getTokenMap } from '../getTokenMap.server'; import { RosenAmountValue } from '@rosen-ui/types'; import { toSafeData } from '@/_utils/safeData'; @@ -57,7 +57,7 @@ export const getMaxTransfer = wrap( const offset = tokenMap.wrapAmount( 'btc', BigInt(estimatedFee) + minSatoshi, - Networks.BITCOIN, + NETWORKS.BITCOIN, ).amount; return balance < 0n || !isNative diff --git a/apps/rosen/app/_networks/bitcoin/index.ts b/apps/rosen/app/_networks/bitcoin/index.ts index 8ef98d8a..292428bf 100644 --- a/apps/rosen/app/_networks/bitcoin/index.ts +++ b/apps/rosen/app/_networks/bitcoin/index.ts @@ -3,7 +3,7 @@ import { xdefiWalletCreator } from '@rosen-ui/xdefi-wallet'; import { getMaxTransfer } from './getMaxTransfer'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORK_LABELS, NETWORKS } from '@rosen-ui/constants'; import { unwrap } from '@/_errors'; import { BitcoinNetwork as BitcoinNetworkType } from '@/_types/network'; @@ -33,8 +33,8 @@ const config = { * functionality */ const BitcoinNetwork: BitcoinNetworkType = { - name: Networks.BITCOIN, - label: 'Bitcoin', + name: NETWORKS.BITCOIN, + label: NETWORK_LABELS.BITCOIN, logo: BitcoinIcon, wallets: [xdefiWalletCreator(config)], nextHeightInterval: 1, diff --git a/apps/rosen/app/_networks/cardano/getMaxTransfer.ts b/apps/rosen/app/_networks/cardano/getMaxTransfer.ts index 302fef46..16f01122 100644 --- a/apps/rosen/app/_networks/cardano/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/cardano/getMaxTransfer.ts @@ -1,7 +1,7 @@ 'use server'; import { feeAndMinBoxValue } from '@rosen-network/cardano/dist/src/constants'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS } from '@rosen-ui/constants'; import { wrap } from '@/_errors'; import { CardanoNetwork } from '@/_types/network'; @@ -25,7 +25,7 @@ export const getMaxTransfer = wrap( const feeAndMinBoxValueWrapped = tokenMap.wrapAmount( 'ada', feeAndMinBoxValue, - Networks.CARDANO, + NETWORKS.CARDANO, ).amount; const offset = isNative ? feeAndMinBoxValueWrapped : 0n; const amount = balance - offset; diff --git a/apps/rosen/app/_networks/cardano/index.ts b/apps/rosen/app/_networks/cardano/index.ts index 1b6794e0..00c25259 100644 --- a/apps/rosen/app/_networks/cardano/index.ts +++ b/apps/rosen/app/_networks/cardano/index.ts @@ -1,4 +1,4 @@ -import { Networks } from '@rosen-ui/constants'; +import { NETWORK_LABELS, NETWORKS } from '@rosen-ui/constants'; import { unwrap } from '@/_errors'; import { CardanoNetwork as CardanoNetworkType } from '@/_types/network'; @@ -35,8 +35,8 @@ const config = { * functionality */ const CardanoNetwork: CardanoNetworkType = { - name: Networks.CARDANO, - label: 'Cardano', + name: NETWORKS.CARDANO, + label: NETWORK_LABELS.CARDANO, wallets: [ eternlWalletCreator(config), flintWalletCreator(config), diff --git a/apps/rosen/app/_networks/ergo/getMaxTransfer.ts b/apps/rosen/app/_networks/ergo/getMaxTransfer.ts index 5788874d..92f4bc69 100644 --- a/apps/rosen/app/_networks/ergo/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/ergo/getMaxTransfer.ts @@ -4,7 +4,7 @@ import { fee as ergoFee, minBoxValue as ergoMinBoxValue, } from '@rosen-network/ergo/dist/src/constants'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS } from '@rosen-ui/constants'; import { wrap } from '@/_errors'; import { CardanoNetwork } from '@/_types/network'; @@ -28,7 +28,7 @@ export const getMaxTransfer = wrap( const feeAndMinBoxValueWrapped = tokenMap.wrapAmount( 'erg', ergoFee + ergoMinBoxValue, - Networks.ERGO, + NETWORKS.ERGO, ).amount; const offset = isNative ? feeAndMinBoxValueWrapped : 0n; const amount = balance - offset; diff --git a/apps/rosen/app/_networks/ergo/index.ts b/apps/rosen/app/_networks/ergo/index.ts index 821dcc04..c51932c7 100644 --- a/apps/rosen/app/_networks/ergo/index.ts +++ b/apps/rosen/app/_networks/ergo/index.ts @@ -1,6 +1,6 @@ import { nautilusWalletCreator } from '@rosen-ui/nautilus-wallet'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORK_LABELS, NETWORKS } from '@rosen-ui/constants'; import { unwrap } from '@/_errors'; import { ErgoNetwork as ErgoNetworkType } from '@/_types/network'; @@ -22,8 +22,8 @@ const config = { * functionality */ const ErgoNetwork: ErgoNetworkType = { - name: Networks.ERGO, - label: 'Ergo', + name: NETWORKS.ERGO, + label: NETWORK_LABELS.ERGO, wallets: [nautilusWalletCreator(config)], logo: ErgoIcon, nextHeightInterval: 5, diff --git a/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts b/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts index c7a59a8e..29143d75 100644 --- a/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts @@ -1,6 +1,6 @@ 'use server'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS } from '@rosen-ui/constants'; import { wrap } from '@/_errors'; import { EthereumNetwork } from '@/_types/network'; @@ -29,7 +29,7 @@ export const getMaxTransfer = wrap( const wrappedFee = tokenMap.wrapAmount( 'eth', estimatedFee, - Networks.ETHEREUM, + NETWORKS.ETHEREUM, ).amount; return balance - wrappedFee; }, diff --git a/apps/rosen/app/_networks/ethereum/index.ts b/apps/rosen/app/_networks/ethereum/index.ts index dd16dae6..479613be 100644 --- a/apps/rosen/app/_networks/ethereum/index.ts +++ b/apps/rosen/app/_networks/ethereum/index.ts @@ -1,6 +1,6 @@ import { metaMaskWalletCreator } from '@rosen-ui/metamask-wallet'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORK_LABELS, NETWORKS } from '@rosen-ui/constants'; import { unwrap } from '@/_errors'; import { EthereumNetwork as EthereumNetworkType } from '@/_types/network'; @@ -17,8 +17,8 @@ import { generateLockData, generateTxParameters } from './server'; * functionality */ const EthereumNetwork: EthereumNetworkType = { - name: Networks.ETHEREUM, - label: 'Ethereum', + name: NETWORKS.ETHEREUM, + label: NETWORK_LABELS.ETHEREUM, wallets: [ metaMaskWalletCreator({ getTokenMap, diff --git a/apps/rosen/app/_networks/index.ts b/apps/rosen/app/_networks/index.ts index 3436c175..4a5104cf 100644 --- a/apps/rosen/app/_networks/index.ts +++ b/apps/rosen/app/_networks/index.ts @@ -3,13 +3,11 @@ import CardanoNetwork from './cardano'; import ErgoNetwork from './ergo'; import EthereumNetwork from './ethereum'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS } from '@rosen-ui/constants'; export const availableNetworks = { - [Networks.ERGO]: ErgoNetwork, - [Networks.ETHEREUM]: EthereumNetwork, - [Networks.CARDANO]: CardanoNetwork, - [Networks.BITCOIN]: BitcoinNetwork, + [NETWORKS.ERGO]: ErgoNetwork, + [NETWORKS.ETHEREUM]: EthereumNetwork, + [NETWORKS.CARDANO]: CardanoNetwork, + [NETWORKS.BITCOIN]: BitcoinNetwork, } as const; - -export type AvailableNetworks = (typeof Networks)[keyof typeof Networks]; diff --git a/apps/rosen/app/_types/network.ts b/apps/rosen/app/_types/network.ts index 75038fa3..7d7ee34f 100644 --- a/apps/rosen/app/_types/network.ts +++ b/apps/rosen/app/_types/network.ts @@ -1,7 +1,6 @@ import { Wallet } from '@rosen-ui/wallet-api'; -import { AvailableNetworks } from '@/_networks'; -import { RosenAmountValue } from '@rosen-ui/types'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; interface GetMaxTransferParams { balance: RosenAmountValue; @@ -12,7 +11,7 @@ interface GetMaxTransferParams { * the main network interface for all supported networks */ export interface BaseNetwork< - NetworkName extends AvailableNetworks, + NetworkName extends Network, GetMaxTransferParamsExtra = {}, > { name: NetworkName; @@ -29,7 +28,7 @@ export interface BaseNetwork< interface BitcoinMaxTransferExtra { eventData: { - toChain: string; + toChain: Network; fromAddress: string; toAddress: string; }; diff --git a/apps/rosen/app/_utils/getMaxTransfer.ts b/apps/rosen/app/_utils/getMaxTransfer.ts index 66b79452..527a4148 100644 --- a/apps/rosen/app/_utils/getMaxTransfer.ts +++ b/apps/rosen/app/_utils/getMaxTransfer.ts @@ -4,8 +4,8 @@ import { ErgoNetwork, EthereumNetwork, } from '@/_types/network'; -import { Networks } from '@rosen-ui/constants'; -import { RosenAmountValue } from '@rosen-ui/types'; +import { NETWORKS } from '@rosen-ui/constants'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; /** * return max transfer, considering all the context that affects it @@ -23,10 +23,10 @@ export const getMaxTransfer = async ( getContext: () => Promise<{ fromAddress: string; toAddress: string; - toChain: string; + toChain: Network; }>, ): Promise => { - if (network.name === Networks.BITCOIN) { + if (network.name === NETWORKS.BITCOIN) { const context = await getContext(); return await network.getMaxTransfer({ balance: tokenInfo.balance, diff --git a/apps/rosen/app/_utils/index.ts b/apps/rosen/app/_utils/index.ts index 2a4f3f33..d85d559e 100644 --- a/apps/rosen/app/_utils/index.ts +++ b/apps/rosen/app/_utils/index.ts @@ -3,28 +3,17 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { calculateFee } from '@/_actions/calculateFee'; -import { Networks } from '@rosen-ui/constants'; -import { AvailableNetworks } from '@/_networks'; +import { NETWORK_VALUES } from '@rosen-ui/constants'; import { unwrap } from '@/_errors'; -import { RosenAmountValue } from '@rosen-ui/types'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; import { fromSafeData } from '@/_utils/safeData'; import { getTokenMap } from '@/_networks/getTokenMap.client'; /** * a utility to make unique interface for accessing token name */ -export const getTokenNameAndId = ( - token: RosenChainToken, - network: AvailableNetworks, -) => { - if ( - [ - Networks.ERGO, - Networks.ETHEREUM, - Networks.CARDANO, - Networks.BITCOIN, - ].includes(network) - ) { +export const getTokenNameAndId = (token: RosenChainToken, network: Network) => { + if (NETWORK_VALUES.includes(network)) { return { tokenName: token.name, tokenId: token.tokenId, @@ -41,8 +30,8 @@ export const getTokenNameAndId = ( */ export const getMinTransfer = async ( token: RosenChainToken, - sourceChain: AvailableNetworks, - targetChain: AvailableNetworks, + sourceChain: Network, + targetChain: Network, ): Promise => { const tokenMap = await getTokenMap(); const idKey = tokenMap.getIdKey(sourceChain); diff --git a/apps/rosen/app/api/v1/assets/validations.ts b/apps/rosen/app/api/v1/assets/validations.ts index 2d3b9fec..0bf339c3 100644 --- a/apps/rosen/app/api/v1/assets/validations.ts +++ b/apps/rosen/app/api/v1/assets/validations.ts @@ -1,12 +1,14 @@ import { NextRequest } from 'next/server'; import Joi from 'joi'; +import { NETWORK_VALUES } from '@rosen-ui/constants'; +import { Network } from '@rosen-ui/types'; interface GETQueryParams { offset: number; limit: number; id?: string; name?: string; - chain?: 'ergo' | 'cardano' | 'bitcoin'; + chain?: Network; } const getQueryParamsSchema = Joi.object().keys({ @@ -14,7 +16,7 @@ const getQueryParamsSchema = Joi.object().keys({ limit: Joi.number().min(0).max(100).default(20), id: Joi.string(), name: Joi.string(), - chain: Joi.string().valid('ergo', 'cardano', 'bitcoin'), + chain: Joi.string().valid(...NETWORK_VALUES), }); /** diff --git a/apps/rosen/app/assets/TableRow.tsx b/apps/rosen/app/assets/TableRow.tsx index daba816c..5d67891f 100644 --- a/apps/rosen/app/assets/TableRow.tsx +++ b/apps/rosen/app/assets/TableRow.tsx @@ -28,6 +28,7 @@ import { getTokenUrl, getTxURL, } from '@rosen-ui/utils'; +import { NETWORKS } from '@rosen-ui/constants'; interface RowProps extends Assets { isLoading?: boolean; @@ -37,6 +38,7 @@ const LOCK_ADDRESSES = [ process.env.NEXT_PUBLIC_ERGO_LOCK_ADDRESS, process.env.NEXT_PUBLIC_CARDANO_LOCK_ADDRESS, process.env.NEXT_PUBLIC_BITCOIN_LOCK_ADDRESS, + process.env.NEXT_PUBLIC_ETHEREUM_LOCK_ADDRESS, ]; export const mobileHeader = [ @@ -234,7 +236,7 @@ export const TabletRow: FC = (props) => { !row.isNative && getTokenUrl( row.chain, - row.chain == 'cardano' ? row.id.replace('.', '') : row.id, + row.chain == NETWORKS.CARDANO ? row.id.replace('.', '') : row.id, ); return ( diff --git a/apps/rosen/app/assets/page.tsx b/apps/rosen/app/assets/page.tsx index 862121a1..44d61f82 100644 --- a/apps/rosen/app/assets/page.tsx +++ b/apps/rosen/app/assets/page.tsx @@ -21,16 +21,15 @@ import { ApiAssetsResponse, Assets } from '@/_types/api'; import { MobileRow, TabletRow, mobileHeader, tabletHeader } from './TableRow'; import TableSkeleton from './TableSkeleton'; +import { NETWORK_LABELS, NETWORKS } from '@rosen-ui/constants'; +import { Network } from '@rosen-ui/types'; -const getKey = (chain: string) => (offset: number, limit: number) => { - return [ - '/v1/assets', - { offset, limit, chain: chain == 'all' ? undefined : chain }, - ]; +const getKey = (chain?: Network) => (offset: number, limit: number) => { + return ['/v1/assets', { offset, limit, chain }]; }; export default function Page() { - const [network, setNetwork] = useState('all'); + const [network, setNetwork] = useState(); const { data, @@ -45,7 +44,7 @@ export default function Page() { } = useTableDataPagination(getKey(network)); const handleChangeNetwork = (event: any) => { - setNetwork(event.target.value as string); + setNetwork(event.target.value as Network); }; const handleChangePage = useCallback( @@ -158,10 +157,15 @@ export default function Page() { onChange={handleChangeNetwork} value={network} > - All - Bitcoin - Cardano - Ergo + All + {Object.keys(NETWORKS).map((key) => ( + + {NETWORK_LABELS[key as keyof typeof NETWORKS]} + + ))} diff --git a/apps/rosen/app/events/TableRow.tsx b/apps/rosen/app/events/TableRow.tsx index e6f4eb10..451f1309 100644 --- a/apps/rosen/app/events/TableRow.tsx +++ b/apps/rosen/app/events/TableRow.tsx @@ -13,6 +13,7 @@ import { import { AngleDown, AngleUp } from '@rosen-bridge/icons'; +import { Network } from '@rosen-ui/types'; import { getDecimalString, getTxURL } from '@rosen-ui/utils'; import { Event } from '@/_types/api'; @@ -135,7 +136,7 @@ export const MobileRow: FC = (props) => { setExpand((prevState) => !prevState); }; - const txUrl = getTxURL(row.fromChain, row.sourceTxId); + const txUrl = getTxURL(row.fromChain as Network, row.sourceTxId); return ( <> @@ -162,11 +163,11 @@ export const MobileRow: FC = (props) => { Chain - {upperFirst(row.fromChain)} + {upperFirst(row.fromChain as Network)} - {upperFirst(row.toChain)} + {upperFirst(row.toChain as Network)} @@ -245,7 +246,7 @@ export const MobileRow: FC = (props) => { export const TabletRow: FC = (props) => { const { isLoading, ...row } = props; - const txUrl = getTxURL(row.fromChain, row.sourceTxId); + const txUrl = getTxURL(row.fromChain as Network, row.sourceTxId); return ( @@ -267,11 +268,11 @@ export const TabletRow: FC = (props) => { )} - {upperFirst(row.fromChain)} + {upperFirst(row.fromChain as Network)} - {upperFirst(row.toChain)} + {upperFirst(row.toChain as Network)} {row.height} diff --git a/apps/rosen/unitTests/utils/index.test.ts b/apps/rosen/unitTests/utils/index.test.ts index d68e34c2..7e0d451f 100644 --- a/apps/rosen/unitTests/utils/index.test.ts +++ b/apps/rosen/unitTests/utils/index.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from 'vitest'; import { getTokenNameAndId } from '@/_utils'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS, NETWORK_VALUES } from '@rosen-ui/constants'; describe('getTokenNameAndId', () => { /** @@ -20,12 +20,12 @@ describe('getTokenNameAndId', () => { * - it should return an object that contains a tokeId and tokenName */ it('it should return an objet containing the token name and token id given different networks', () => { - Object.values(Networks).forEach((network, index) => { + NETWORK_VALUES.forEach((network, index) => { /** * TODO: remove it after fixing the typing in network * local:ergo/rosen-bridge/ui#311 */ - if (network == Networks.ETHEREUM) return; + if (network == NETWORKS.ETHEREUM) return; const testToken = { name: 'test-' + network, diff --git a/apps/watcher/app/_mock/mockedData.ts b/apps/watcher/app/_mock/mockedData.ts index 2fda436f..f921343d 100644 --- a/apps/watcher/app/_mock/mockedData.ts +++ b/apps/watcher/app/_mock/mockedData.ts @@ -1,5 +1,6 @@ import moment from 'moment'; +import { NETWORKS } from '@rosen-ui/constants'; import { SWRConfigProps } from '@rosen-ui/swr-mock'; import { ChartPeriod } from '@rosen-ui/types'; @@ -28,7 +29,7 @@ const info: ApiInfoResponse = { status: 'Unstable', trialErrors: [], }, - network: 'ergo', + network: NETWORKS.ERGO, permitsPerEvent: 1000, permitCount: { active: 20, @@ -255,8 +256,8 @@ const permitReturn: ApiPermitReturnResponse = { const generateObservationRecords = (numberOfRecords: number) => { return new Array(numberOfRecords).fill(null).map((data, index) => ({ id: index, - fromChain: 'Chain A', - toChain: 'Chain B', + fromChain: NETWORKS.ERGO, + toChain: NETWORKS.CARDANO, fromAddress: '3WvuxxkcM5gRhfktbKTn3Wvux', toAddress: '3WvuxxkcM5gRhfktbKTn3Wvux', height: 10, @@ -289,8 +290,8 @@ const generateEventRecords = (numberOfRecords: number): Event[] => { boxSerialized: '{}', block: 'Block Text', height: 10, - fromChain: 'Chain A', - toChain: 'Chain B', + fromChain: NETWORKS.ERGO, + toChain: NETWORKS.CARDANO, fromAddress: '3WvuxxkcM5gRhfktbKTn3Wvux', toAddress: '3WvuxxkcM5gRhfktbKTn3Wvux', amount: '100', @@ -321,8 +322,8 @@ const generateRevenueRecords = (numberOfRecords: number) => { '95baefff2eb9e45b04f8b4e6265e866773db6db5f9e8e30ce2cae1aa263b90f7', eventId: '85baefff2eb9e45b04f8b4e6265e866773db6db5f9e8e30ce2cae1aa263b90f7', lockHeight: 100, - fromChain: 'Chain A', - toChain: 'Chain B', + fromChain: NETWORKS.ERGO, + toChain: NETWORKS.CARDANO, fromAddress: '3WvuxxkcM5gRhfktbKTn3Wvux', toAddress: '3WvuxxkcM5gRhfktbKTn3Wvux', amount: '0.1', diff --git a/apps/watcher/app/_types/api.ts b/apps/watcher/app/_types/api.ts index 0ebe8e1b..1f0112df 100644 --- a/apps/watcher/app/_types/api.ts +++ b/apps/watcher/app/_types/api.ts @@ -4,6 +4,7 @@ import { TokenChartData, TokenInfo, MutationRequestBodyWithHeaders, + Network, } from '@rosen-ui/types'; export interface ApiInfoResponse { @@ -72,8 +73,8 @@ export interface ApiPermitReturnResponse { export interface Observation { id: number; - fromChain: string; - toChain: string; + fromChain: Network; + toChain: Network; fromAddress: string; toAddress: string; height: number; @@ -97,8 +98,8 @@ export interface Revenue { permitTxId: string; eventId: string; lockHeight: number; - fromChain: string; - toChain: string; + fromChain: Network; + toChain: Network; fromAddress: string; toAddress: string; amount: string; @@ -123,8 +124,8 @@ export interface Event { boxSerialized: string; block: string; height: number; - fromChain: string; - toChain: string; + fromChain: Network; + toChain: Network; fromAddress: string; toAddress: string; amount: string; diff --git a/apps/watcher/package.json b/apps/watcher/package.json index 1ed79c2c..35308ada 100644 --- a/apps/watcher/package.json +++ b/apps/watcher/package.json @@ -16,9 +16,10 @@ "@emotion/styled": "^11.11.0", "@rosen-bridge/icons": "^0.4.0", "@rosen-bridge/json-bigint": "^0.1.0", + "@rosen-bridge/shared-contexts": "^0.0.1", "@rosen-bridge/ui-kit": "^1.2.0", "@rosen-ui/common-hooks": "^0.1.0", - "@rosen-bridge/shared-contexts": "^0.0.1", + "@rosen-ui/constants": "^0.0.3", "@rosen-ui/swr-helpers": "^0.1.0", "@rosen-ui/swr-mock": "^0.0.1", "@rosen-ui/utils": "^0.4.0", diff --git a/build.sh b/build.sh index 851849bb..f6d64ff1 100755 --- a/build.sh +++ b/build.sh @@ -6,9 +6,9 @@ echo "building monorepo packages..." -npm run build --workspace packages/utils npm run build --workspace packages/constants npm run build --workspace packages/types +npm run build --workspace packages/utils npm run build --workspace packages/shared-contexts npm run build --workspace packages --if-present npm run build --workspace wallets/wallet-api diff --git a/networks/bitcoin/src/constants.ts b/networks/bitcoin/src/constants.ts index 74d1de1e..766458be 100644 --- a/networks/bitcoin/src/constants.ts +++ b/networks/bitcoin/src/constants.ts @@ -1,11 +1,3 @@ -import { Networks } from '@rosen-ui/constants'; - export const CONFIRMATION_TARGET = 6; export const SEGWIT_INPUT_WEIGHT_UNIT = 272; export const SEGWIT_OUTPUT_WEIGHT_UNIT = 124; -export const SUPPORTED_CHAINS = [ - Networks.ERGO, - Networks.CARDANO, - Networks.BITCOIN, - Networks.ETHEREUM, -] as const; diff --git a/networks/bitcoin/src/generateUnsignedTx.ts b/networks/bitcoin/src/generateUnsignedTx.ts index 04cfd64c..11ad4e24 100644 --- a/networks/bitcoin/src/generateUnsignedTx.ts +++ b/networks/bitcoin/src/generateUnsignedTx.ts @@ -10,7 +10,7 @@ import { getMinimumMeaningfulSatoshi, } from './utils'; import { TokenMap, RosenChainToken } from '@rosen-bridge/tokens'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS } from '@rosen-ui/constants'; import { RosenAmountValue } from '@rosen-ui/types'; /** @@ -124,9 +124,9 @@ export const generateUnsignedTx = (tokenMap: TokenMap) => { token: RosenChainToken ) => { const unwrappedAmount = tokenMap.unwrapAmount( - token[tokenMap.getIdKey(Networks.BITCOIN)], + token[tokenMap.getIdKey(NETWORKS.BITCOIN)], wrappedAmount, - Networks.BITCOIN + NETWORKS.BITCOIN ).amount; return generateUnsignedTxCore( lockAddress, diff --git a/networks/bitcoin/src/utils.ts b/networks/bitcoin/src/utils.ts index 65fc7b11..4c8456f2 100644 --- a/networks/bitcoin/src/utils.ts +++ b/networks/bitcoin/src/utils.ts @@ -1,12 +1,13 @@ import { encodeAddress } from '@rosen-bridge/address-codec'; import Axios from 'axios'; import { Psbt, address } from 'bitcoinjs-lib'; +import { NETWORK_VALUES } from '@rosen-ui/constants'; +import { Network } from '@rosen-ui/types'; import { CONFIRMATION_TARGET, SEGWIT_INPUT_WEIGHT_UNIT, SEGWIT_OUTPUT_WEIGHT_UNIT, - SUPPORTED_CHAINS, } from './constants'; import type { BitcoinUtxo, EsploraAddress, EsploraUtxo } from './types'; @@ -21,14 +22,14 @@ import type { BitcoinUtxo, EsploraAddress, EsploraUtxo } from './types'; * @returns */ export const generateOpReturnData = async ( - toChain: string, + toChain: Network, toAddress: string, networkFee: string, bridgeFee: string ): Promise => { // parse toChain - const toChainCode = SUPPORTED_CHAINS.indexOf( - toChain as (typeof SUPPORTED_CHAINS)[number] + const toChainCode = NETWORK_VALUES.indexOf( + toChain as (typeof NETWORK_VALUES)[number] ); if (toChainCode === -1) throw Error(`invalid toChain [${toChain}]`); const toChainHex = toChainCode.toString(16).padStart(2, '0'); diff --git a/networks/bitcoin/unitTests/src/generateTx.test.ts b/networks/bitcoin/unitTests/src/generateTx.test.ts index ba256f3f..29bffe2c 100644 --- a/networks/bitcoin/unitTests/src/generateTx.test.ts +++ b/networks/bitcoin/unitTests/src/generateTx.test.ts @@ -3,6 +3,7 @@ import { Psbt } from 'bitcoinjs-lib'; import { generateUnsignedTx } from '../../src'; import { testTokenMap, multiDecimalTokenMap } from '../test-data'; import { TokenMap } from '@rosen-bridge/tokens'; +import { Network } from '@rosen-ui/types'; const testData = await vi.hoisted(async () => await import('./testData')); @@ -110,7 +111,7 @@ describe('generateUnsignedTx', () => { const tokenMap = new TokenMap(multiDecimalTokenMap); - const chain = tokenMap.getAllChains()[0]; + const chain = tokenMap.getAllChains()[0] as Network; const token = tokenMap.search(chain, {})[0][chain]; diff --git a/networks/bitcoin/unitTests/src/utils.test.ts b/networks/bitcoin/unitTests/src/utils.test.ts index 86d220bc..e4b56f33 100644 --- a/networks/bitcoin/unitTests/src/utils.test.ts +++ b/networks/bitcoin/unitTests/src/utils.test.ts @@ -1,4 +1,5 @@ -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS } from '@rosen-ui/constants'; +import { Network } from '@rosen-ui/types'; import { describe, expect, it } from 'vitest'; import { generateOpReturnData } from '../../src'; @@ -19,7 +20,7 @@ describe('generateOpReturnData', () => { * - remaining bytes should be encoded given address */ it('should generate OP_RETURN data successfully', async () => { - const toChain = Networks.ERGO; + const toChain = NETWORKS.ERGO; const toAddress = '9iMjQx8PzwBKXRvsFUJFJAPoy31znfEeBUGz8DRkcnJX4rJYjVd'; const bridgeFee = '1968503938'; const networkFee = '9842520'; @@ -52,7 +53,7 @@ describe('generateOpReturnData', () => { * - it should return Error */ it('should throw error when toChain is not supported', async () => { - const toChain = 'invalid-chain'; + const toChain = 'invalid-chain' as Network; const toAddress = '9iMjQx8PzwBKXRvsFUJFJAPoy31znfEeBUGz8DRkcnJX4rJYjVd'; const bridgeFee = '1968503938'; const networkFee = '9842520'; diff --git a/networks/cardano/src/generateUnsignedTx.ts b/networks/cardano/src/generateUnsignedTx.ts index df6783f7..9c31ab16 100644 --- a/networks/cardano/src/generateUnsignedTx.ts +++ b/networks/cardano/src/generateUnsignedTx.ts @@ -16,7 +16,7 @@ import { walletUtxoToCardanoUtxo, } from './utils'; import { TokenMap } from '@rosen-bridge/tokens'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS } from '@rosen-ui/constants'; import { RosenAmountValue } from '@rosen-ui/types'; /** @@ -152,7 +152,7 @@ export const generateUnsignedTx = (tokenMap: TokenMap) => { const unwrappedAmount = tokenMap.unwrapAmount( `${policyIdHex}.${assetNameHex}`, wrappedAmount, - Networks.CARDANO + NETWORKS.CARDANO ).amount; return generateUnsignedTxCore( walletUtxos, diff --git a/networks/cardano/src/utils.ts b/networks/cardano/src/utils.ts index d0a6189f..93f4d665 100644 --- a/networks/cardano/src/utils.ts +++ b/networks/cardano/src/utils.ts @@ -6,6 +6,7 @@ import { TokenInfo, } from '@rosen-bridge/cardano-utxo-selection'; import cardanoKoiosClientFactory from '@rosen-clients/cardano-koios'; +import { Network } from '@rosen-ui/types'; import { decodeWasmValue as decodeWasmValueCore } from '@rosen-ui/wallet-api'; import { CardanoProtocolParams } from './types'; @@ -79,7 +80,7 @@ export const getTxBuilderConfig = ( * @returns */ export const generateLockAuxiliaryData = async ( - toChain: string, + toChain: Network, toAddress: string, fromAddressHex: string, networkFee: string, diff --git a/networks/ergo/src/generateUnsignedTx.ts b/networks/ergo/src/generateUnsignedTx.ts index cbd2727a..8ce15871 100644 --- a/networks/ergo/src/generateUnsignedTx.ts +++ b/networks/ergo/src/generateUnsignedTx.ts @@ -15,8 +15,8 @@ import { import * as wasm from 'ergo-lib-wasm-nodejs'; import { ErgoBoxProxy } from '@rosen-bridge/ergo-box-selection'; import { TokenMap, RosenChainToken } from '@rosen-bridge/tokens'; -import { Networks } from '@rosen-ui/constants'; -import { RosenAmountValue } from '@rosen-ui/types'; +import { NETWORKS } from '@rosen-ui/constants'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; /** * generates an unsigned lock transaction on Ergo @@ -35,7 +35,7 @@ const generateUnsignedTxCore = async ( changeAddress: string, walletUtxos: ErgoBoxProxy[], lockAddress: string, - toChain: string, + toChain: Network, toAddress: string, tokenId: string, amountString: string, @@ -127,18 +127,18 @@ export const generateUnsignedTx = (tokenMap: TokenMap) => { changeAddress: string, walletUtxos: ErgoBoxProxy[], lockAddress: string, - toChain: string, + toChain: Network, toAddress: string, wrappedAmount: RosenAmountValue, bridgeFeeString: string, networkFeeString: string, token: RosenChainToken ) => { - const tokenId = token[tokenMap.getIdKey(Networks.ERGO)]; + const tokenId = token[tokenMap.getIdKey(NETWORKS.ERGO)]; const unwrappedAmount = tokenMap.unwrapAmount( tokenId, wrappedAmount, - Networks.ERGO + NETWORKS.ERGO ).amount; return generateUnsignedTxCore( changeAddress, diff --git a/networks/ergo/src/utils.ts b/networks/ergo/src/utils.ts index 8cf50354..1e247d01 100644 --- a/networks/ergo/src/utils.ts +++ b/networks/ergo/src/utils.ts @@ -3,6 +3,7 @@ import { minBoxValue } from './constants'; import { AssetBalance, BoxInfo, CoveringBoxes, TokenInfo } from './types'; import { ErgoBoxProxy } from '@rosen-ui/wallet-api'; import ergoExplorerClientFactory from '@rosen-clients/ergo-explorer'; +import { Network } from '@rosen-ui/types'; /** * gets Ergo current block height @@ -32,7 +33,7 @@ export const createLockBox = ( height: number, tokenId: string, amount: bigint, - toChain: string, + toChain: Network, toAddress: string, fromAddress: string, bridgeFee: bigint, diff --git a/networks/ethereum/src/constants.ts b/networks/ethereum/src/constants.ts index 29ce1149..e7f78487 100644 --- a/networks/ethereum/src/constants.ts +++ b/networks/ethereum/src/constants.ts @@ -1,16 +1,8 @@ -import { Networks } from '@rosen-ui/constants'; import { InterfaceAbi } from 'ethers'; export const ETH = 'eth'; export const ETH_TRANSFER_GAS = 21000n; -export const SUPPORTED_CHAINS = [ - Networks.ERGO, - Networks.CARDANO, - Networks.BITCOIN, - Networks.ETHEREUM, -] as const; - export const transferABI: InterfaceAbi = [ { constant: false, diff --git a/networks/ethereum/src/generateTxParameters.ts b/networks/ethereum/src/generateTxParameters.ts index be8f141f..ed2923b7 100644 --- a/networks/ethereum/src/generateTxParameters.ts +++ b/networks/ethereum/src/generateTxParameters.ts @@ -1,6 +1,6 @@ import { RosenAmountValue } from '@rosen-ui/types'; import { TokenMap, RosenChainToken } from '@rosen-bridge/tokens'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS } from '@rosen-ui/constants'; import { ETH, transferABI } from './constants'; import { Contract } from 'ethers'; @@ -55,9 +55,9 @@ export const generateTxParameters = (tokenMap: TokenMap) => { token: RosenChainToken ) => { const unwrappedAmount = tokenMap.unwrapAmount( - token[tokenMap.getIdKey(Networks.ETHEREUM)], + token[tokenMap.getIdKey(NETWORKS.ETHEREUM)], wrappedAmount, - Networks.ETHEREUM + NETWORKS.ETHEREUM ).amount; return generateTxParametersCore( tokenId, diff --git a/networks/ethereum/src/utils.ts b/networks/ethereum/src/utils.ts index 97346dbe..5813aa73 100644 --- a/networks/ethereum/src/utils.ts +++ b/networks/ethereum/src/utils.ts @@ -1,6 +1,7 @@ import { FeeData, isAddress, JsonRpcProvider } from 'ethers'; -import { SUPPORTED_CHAINS } from './constants'; +import { NETWORK_VALUES } from '@rosen-ui/constants'; import { encodeAddress } from '@rosen-bridge/address-codec'; +import { Network } from '@rosen-ui/types'; /** * generates metadata for lock transaction @@ -12,14 +13,14 @@ import { encodeAddress } from '@rosen-bridge/address-codec'; * @returns */ export const generateLockData = async ( - toChain: string, + toChain: Network, toAddress: string, networkFee: string, bridgeFee: string ): Promise => { // parse toChain - const toChainCode = SUPPORTED_CHAINS.indexOf( - toChain as (typeof SUPPORTED_CHAINS)[number] + const toChainCode = NETWORK_VALUES.indexOf( + toChain as (typeof NETWORK_VALUES)[number] ); if (toChainCode === -1) throw Error(`invalid toChain [${toChain}]`); const toChainHex = toChainCode.toString(16).padStart(2, '0'); diff --git a/package-lock.json b/package-lock.json index 0cb845e7..d44d8212 100644 --- a/package-lock.json +++ b/package-lock.json @@ -308,6 +308,7 @@ "@rosen-bridge/shared-contexts": "^0.0.1", "@rosen-bridge/ui-kit": "^1.2.0", "@rosen-ui/common-hooks": "^0.1.0", + "@rosen-ui/constants": "^0.0.3", "@rosen-ui/swr-helpers": "^0.1.0", "@rosen-ui/swr-mock": "^0.0.1", "@rosen-ui/utils": "^0.4.0", @@ -24716,6 +24717,7 @@ "@rosen-bridge/tokens": "^1.2.1", "@rosen-clients/cardano-koios": "^2.0.1", "@rosen-clients/ergo-explorer": "^1.0.3", + "@rosen-ui/types": "^0.2.0", "axios": "^1.7.0", "lodash-es": "^4.17.21", "typeorm": "^0.3.20" @@ -25335,6 +25337,9 @@ "packages/types": { "name": "@rosen-ui/types", "version": "0.2.0", + "dependencies": { + "@rosen-ui/constants": "^0.0.3" + }, "devDependencies": { "@mui/material": "^5.13.7", "@typescript-eslint/eslint-plugin": "^5.30.7", @@ -25679,6 +25684,7 @@ "name": "@rosen-ui/wallet-api", "version": "1.0.2", "dependencies": { + "@rosen-ui/types": "^0.2.0", "@rosen-ui/utils": "^0.4.0" }, "devDependencies": { diff --git a/packages/asset-calculator/lib/asset-calculator.ts b/packages/asset-calculator/lib/asset-calculator.ts index 32722519..9d20a0f2 100644 --- a/packages/asset-calculator/lib/asset-calculator.ts +++ b/packages/asset-calculator/lib/asset-calculator.ts @@ -18,7 +18,8 @@ import { CardanoCalculatorInterface, ErgoCalculatorInterface, } from './interfaces'; -import { BITCOIN_CHAIN, CARDANO_CHAIN, ERGO_CHAIN } from './constants'; +import { NETWORKS } from '@rosen-ui/constants'; +import { Network } from '@rosen-ui/types'; import { BridgedAssetModel } from './database/bridgedAsset/BridgedAssetModel'; import { TokenModel } from './database/token/TokenModel'; import AbstractCalculator from './calculator/abstract-calculator'; @@ -60,9 +61,9 @@ class AssetCalculator { bitcoinCalculator.esploraUrl, logger ); - this.calculatorMap.set(ERGO_CHAIN, ergoAssetCalculator); - this.calculatorMap.set(CARDANO_CHAIN, cardanoAssetCalculator); - this.calculatorMap.set(BITCOIN_CHAIN, bitcoinAssetCalculator); + this.calculatorMap.set(NETWORKS.ERGO, ergoAssetCalculator); + this.calculatorMap.set(NETWORKS.CARDANO, cardanoAssetCalculator); + this.calculatorMap.set(NETWORKS.BITCOIN, bitcoinAssetCalculator); this.bridgedAssetModel = new BridgedAssetModel(dataSource, logger); this.lockedAssetModel = new LockedAssetModel(dataSource, logger); this.tokenModel = new TokenModel(dataSource, logger); @@ -75,7 +76,7 @@ class AssetCalculator { */ private getTokenIdOnResidentChain = ( token: RosenChainToken, - residencyChain: string + residencyChain: Network ): string => { const chainIdKey = this.tokens.getIdKey(residencyChain); @@ -90,8 +91,8 @@ class AssetCalculator { */ private getTokenDataForChain = ( residentToken: RosenChainToken, - residencyChain: string, - chain: string + residencyChain: Network, + chain: Network ) => { const chainIdKey = this.tokens.getIdKey(residencyChain); const tokenDataOnAllChains = this.tokens.search(residencyChain, { @@ -110,8 +111,8 @@ class AssetCalculator { */ private calculateEmissionForChain = async ( token: RosenChainToken, - chain: string, - residencyChain: string + chain: Network, + residencyChain: Network ): Promise => { const calculator = this.calculatorMap.get(chain); @@ -141,7 +142,7 @@ class AssetCalculator { */ private calculateLocked = async ( token: RosenChainToken, - residencyChain: string + residencyChain: Network ) => { const calculator = this.calculatorMap.get(residencyChain); @@ -192,7 +193,7 @@ class AssetCalculator { const allCurrentLockedAssets: Partial[] = []; const allCurrentTokens = []; - const residencyChains = this.tokens.getAllChains(); + const residencyChains = this.tokens.getAllChains() as Network[]; for (const residencyChain of residencyChains) { const chainIdKey = this.tokens.getIdKey(residencyChain); @@ -205,7 +206,9 @@ class AssetCalculator { )}` ); - const chains = this.tokens.getSupportedChains(residencyChain); + const chains = this.tokens.getSupportedChains( + residencyChain + ) as Network[]; for (const nativeResidentToken of nativeResidentTokens) { const newToken = { diff --git a/packages/asset-calculator/lib/calculator/abstract-calculator.ts b/packages/asset-calculator/lib/calculator/abstract-calculator.ts index 793f9c75..82aff192 100644 --- a/packages/asset-calculator/lib/calculator/abstract-calculator.ts +++ b/packages/asset-calculator/lib/calculator/abstract-calculator.ts @@ -1,8 +1,9 @@ import { RosenChainToken, TokenMap } from '@rosen-bridge/tokens'; import { AbstractLogger, DummyLogger } from '@rosen-bridge/abstract-logger'; +import { Network } from '@rosen-ui/types'; export default abstract class AbstractCalculator { - abstract readonly chain: string; + abstract readonly chain: Network; constructor( protected readonly addresses: string[], diff --git a/packages/asset-calculator/lib/calculator/chains/bitcoin-calculator.ts b/packages/asset-calculator/lib/calculator/chains/bitcoin-calculator.ts index 6dcb121e..dff97940 100644 --- a/packages/asset-calculator/lib/calculator/chains/bitcoin-calculator.ts +++ b/packages/asset-calculator/lib/calculator/chains/bitcoin-calculator.ts @@ -3,6 +3,8 @@ import AbstractCalculator from '../abstract-calculator'; import { AbstractLogger } from '@rosen-bridge/abstract-logger'; import axios, { AxiosInstance } from 'axios'; import { zipWith } from 'lodash-es'; +import { NETWORKS } from '@rosen-ui/constants'; +import { Network } from '@rosen-ui/types'; /** * This type only contains the part of the type that is required here @@ -15,7 +17,7 @@ interface PartialEsploraAddress { } export class BitcoinCalculator extends AbstractCalculator { - readonly chain: string = 'bitcoin'; + readonly chain: Network = NETWORKS.BITCOIN; protected client: AxiosInstance; diff --git a/packages/asset-calculator/lib/calculator/chains/cardano-calculator.ts b/packages/asset-calculator/lib/calculator/chains/cardano-calculator.ts index 7981de83..a249acd6 100644 --- a/packages/asset-calculator/lib/calculator/chains/cardano-calculator.ts +++ b/packages/asset-calculator/lib/calculator/chains/cardano-calculator.ts @@ -3,9 +3,11 @@ import { AbstractLogger } from '@rosen-bridge/abstract-logger'; import cardanoKoiosClientFactory from '@rosen-clients/cardano-koios'; import AbstractCalculator from '../abstract-calculator'; +import { NETWORKS } from '@rosen-ui/constants'; +import { Network } from '@rosen-ui/types'; export class CardanoCalculator extends AbstractCalculator { - readonly chain: string = 'cardano'; + readonly chain: Network = NETWORKS.CARDANO; private koiosApi; diff --git a/packages/asset-calculator/lib/calculator/chains/ergo-calculator.ts b/packages/asset-calculator/lib/calculator/chains/ergo-calculator.ts index 810112bb..1d593999 100644 --- a/packages/asset-calculator/lib/calculator/chains/ergo-calculator.ts +++ b/packages/asset-calculator/lib/calculator/chains/ergo-calculator.ts @@ -5,9 +5,11 @@ import ergoExplorerClientFactory from '@rosen-clients/ergo-explorer'; import AbstractCalculator from '../abstract-calculator'; import { Balance } from '@rosen-clients/ergo-explorer/dist/src/v1/types'; import { zipWith } from 'lodash-es'; +import { NETWORKS } from '@rosen-ui/constants'; +import { Network } from '@rosen-ui/types'; export class ErgoCalculator extends AbstractCalculator { - readonly chain: string = 'ergo'; + readonly chain: Network = NETWORKS.ERGO; private explorerApi; diff --git a/packages/asset-calculator/lib/constants.ts b/packages/asset-calculator/lib/constants.ts deleted file mode 100644 index a5e00e6f..00000000 --- a/packages/asset-calculator/lib/constants.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const BITCOIN_CHAIN = 'bitcoin'; -export const CARDANO_CHAIN = 'cardano'; -export const ERGO_CHAIN = 'ergo'; diff --git a/packages/asset-calculator/lib/database/bridgedAsset/BridgedAssetEntity.ts b/packages/asset-calculator/lib/database/bridgedAsset/BridgedAssetEntity.ts index 3f2d730f..d5766d7d 100644 --- a/packages/asset-calculator/lib/database/bridgedAsset/BridgedAssetEntity.ts +++ b/packages/asset-calculator/lib/database/bridgedAsset/BridgedAssetEntity.ts @@ -1,4 +1,5 @@ import { BigIntValueTransformer } from '@rosen-bridge/extended-typeorm'; +import { Network } from '@rosen-ui/types'; import { Column, Entity, ManyToOne, PrimaryColumn } from 'typeorm'; import { TokenEntity } from '../token/TokenEntity'; @@ -9,7 +10,7 @@ export class BridgedAssetEntity { amount: bigint; @PrimaryColumn('varchar') - chain: string; + chain: Network; /** * In order to create a foreign key primary column, we need to include the diff --git a/packages/asset-calculator/lib/database/bridgedAsset/BridgedAssetModel.ts b/packages/asset-calculator/lib/database/bridgedAsset/BridgedAssetModel.ts index 47fa20a7..863c5e8d 100644 --- a/packages/asset-calculator/lib/database/bridgedAsset/BridgedAssetModel.ts +++ b/packages/asset-calculator/lib/database/bridgedAsset/BridgedAssetModel.ts @@ -1,5 +1,6 @@ import { AbstractLogger, DummyLogger } from '@rosen-bridge/abstract-logger'; import JsonBigInt from '@rosen-bridge/json-bigint'; +import { Network } from '@rosen-ui/types'; import { DataSource, Repository } from 'typeorm'; import { BridgedAssetEntity } from './BridgedAssetEntity'; @@ -28,7 +29,7 @@ class BridgedAssetModel { * Return all stored asset primary keys (tokenId+chain combination) */ getAllStoredAssets = async (): Promise< - { tokenId: string; chain: string }[] + { tokenId: string; chain: Network }[] > => { return ( await this.bridgedAssetRepository.find({ select: ['chain', 'tokenId'] }) @@ -39,7 +40,7 @@ class BridgedAssetModel { * Remove old unused assets from the database * @param assetIds */ - removeAssets = async (assets: { tokenId: string; chain: string }[]) => { + removeAssets = async (assets: { tokenId: string; chain: Network }[]) => { await Promise.all( assets.map(async (asset) => this.bridgedAssetRepository.delete({ diff --git a/packages/asset-calculator/lib/database/token/TokenEntity.ts b/packages/asset-calculator/lib/database/token/TokenEntity.ts index fbc43096..eb0a9620 100644 --- a/packages/asset-calculator/lib/database/token/TokenEntity.ts +++ b/packages/asset-calculator/lib/database/token/TokenEntity.ts @@ -1,3 +1,4 @@ +import { Network } from '@rosen-ui/types'; import { Column, Entity, PrimaryColumn } from 'typeorm'; @Entity('token_entity') @@ -15,5 +16,5 @@ export class TokenEntity { isNative: boolean; @Column('varchar') - chain: string; + chain: Network; } diff --git a/packages/asset-calculator/package.json b/packages/asset-calculator/package.json index 0fefa860..0c26347c 100644 --- a/packages/asset-calculator/package.json +++ b/packages/asset-calculator/package.json @@ -37,6 +37,7 @@ "@rosen-bridge/tokens": "^1.2.1", "@rosen-clients/cardano-koios": "^2.0.1", "@rosen-clients/ergo-explorer": "^1.0.3", + "@rosen-ui/types": "^0.2.0", "axios": "^1.7.0", "lodash-es": "^4.17.21", "typeorm": "^0.3.20" diff --git a/packages/asset-calculator/tests/asset-calculator.spec.ts b/packages/asset-calculator/tests/asset-calculator.spec.ts index 9c8497d5..723070b8 100644 --- a/packages/asset-calculator/tests/asset-calculator.spec.ts +++ b/packages/asset-calculator/tests/asset-calculator.spec.ts @@ -1,8 +1,8 @@ +import { NETWORKS } from '@rosen-ui/constants'; import { beforeEach, describe, expect, it, vitest } from 'vitest'; import { AssetCalculator } from '../lib'; import { tokenMap } from './test-data'; import { initDatabase } from './database/bridgedAsset/BridgedAssetModel.mock'; -import { CARDANO_CHAIN, ERGO_CHAIN } from '../lib/constants'; import AbstractCalculator from '../lib/calculator/abstract-calculator'; import { bridgedAssets, lockedAssets, tokens } from './database/test-data'; @@ -42,12 +42,12 @@ describe('AssetCalculator', () => { totalSupply: () => Promise.resolve(1000n), totalBalance: () => Promise.resolve(900n), } as unknown as AbstractCalculator; - const map = new Map([[CARDANO_CHAIN, calculator]]); + const map = new Map([[NETWORKS.CARDANO, calculator]]); assetCalculator['calculatorMap'] = map; const totalLocked = await assetCalculator['calculateEmissionForChain']( tokenMap.tokens[0].ergo, - CARDANO_CHAIN, - ERGO_CHAIN + NETWORKS.CARDANO, + NETWORKS.ERGO ); expect(totalLocked).to.equal(100n); }); @@ -68,12 +68,12 @@ describe('AssetCalculator', () => { totalSupply: () => Promise.resolve(1900n), totalBalance: () => Promise.resolve(900n), } as unknown as AbstractCalculator; - const map = new Map([[ERGO_CHAIN, calculator]]); + const map = new Map([[NETWORKS.ERGO, calculator]]); assetCalculator['calculatorMap'] = map; const totalLocked = await assetCalculator['calculateEmissionForChain']( tokenMap.tokens[2].cardano, - ERGO_CHAIN, - CARDANO_CHAIN + NETWORKS.ERGO, + NETWORKS.CARDANO ); expect(totalLocked).to.equal(1000n); }); @@ -117,11 +117,11 @@ describe('AssetCalculator', () => { getLockedAmountsPerAddress: () => Promise.resolve([{ address: 'hotAddr', amount: 1000n }]), } as unknown as AbstractCalculator; - const map = new Map([[ERGO_CHAIN, calculator]]); + const map = new Map([[NETWORKS.ERGO, calculator]]); assetCalculator['calculatorMap'] = map; const totalLocked = await assetCalculator['calculateLocked']( tokenMap.tokens[0].ergo, - ERGO_CHAIN + NETWORKS.ERGO ); expect(totalLocked[0].address).to.equal('hotAddr'); expect(totalLocked[0].amount).to.equal(1000n); @@ -208,9 +208,9 @@ describe('AssetCalculator', () => { ) ).toEqual( [ - { tokenId: tokenMap.tokens[0].ergo.tokenId, chain: 'cardano' }, - { tokenId: tokenMap.tokens[1].ergo.tokenId, chain: 'cardano' }, - { tokenId: tokenMap.tokens[2].cardano.tokenId, chain: 'ergo' }, + { tokenId: tokenMap.tokens[0].ergo.tokenId, chain: NETWORKS.CARDANO }, + { tokenId: tokenMap.tokens[1].ergo.tokenId, chain: NETWORKS.CARDANO }, + { tokenId: tokenMap.tokens[2].cardano.tokenId, chain: NETWORKS.ERGO }, ].sort((a, b) => a.tokenId.localeCompare(b.tokenId)) ); expect( @@ -320,9 +320,9 @@ describe('AssetCalculator', () => { ) ).toEqual( [ - { tokenId: tokenMap.tokens[0].ergo.tokenId, chain: 'cardano' }, - { tokenId: tokenMap.tokens[1].ergo.tokenId, chain: 'cardano' }, - { tokenId: tokenMap.tokens[2].cardano.tokenId, chain: 'ergo' }, + { tokenId: tokenMap.tokens[0].ergo.tokenId, chain: NETWORKS.CARDANO }, + { tokenId: tokenMap.tokens[1].ergo.tokenId, chain: NETWORKS.CARDANO }, + { tokenId: tokenMap.tokens[2].cardano.tokenId, chain: NETWORKS.ERGO }, ].sort((a, b) => a.tokenId.localeCompare(b.tokenId)) ); expect( diff --git a/packages/asset-calculator/tests/database/test-data.ts b/packages/asset-calculator/tests/database/test-data.ts index 87522fa8..8826a3c9 100644 --- a/packages/asset-calculator/tests/database/test-data.ts +++ b/packages/asset-calculator/tests/database/test-data.ts @@ -1,17 +1,19 @@ +import { NETWORKS } from '@rosen-ui/constants'; + import { LockedAssetEntity, TokenEntity } from '../../lib'; import { BridgedAssetEntity } from '../../lib/database/bridgedAsset/BridgedAssetEntity'; const tokens: TokenEntity[] = [ { id: 'erg', - chain: 'ergo', + chain: NETWORKS.ERGO, decimal: 9, isNative: true, name: 'ERG', }, { id: 'ada', - chain: 'cardano', + chain: NETWORKS.CARDANO, decimal: 6, isNative: true, name: 'ADA', @@ -23,14 +25,14 @@ const bridgedAssets: BridgedAssetEntity[] = [ token: tokens[0], tokenId: tokens[0].id, amount: 100n, - chain: 'Bitcoin', + chain: NETWORKS.BITCOIN, bridgedTokenId: `123${tokens[0].id}`, }, { token: tokens[0], tokenId: tokens[0].id, amount: 200n, - chain: 'Cardano', + chain: NETWORKS.CARDANO, bridgedTokenId: `123${tokens[0].id}`, }, ]; diff --git a/packages/constants/src/index.ts b/packages/constants/src/index.ts index b8bb78ad..eaed04b4 100644 --- a/packages/constants/src/index.ts +++ b/packages/constants/src/index.ts @@ -8,9 +8,22 @@ export const TOKEN_NAME_PLACEHOLDER = 'unnamed token'; export const HEALTH_DATA_REFRESH_INTERVAL = 60000; -export const Networks = { +export const NETWORKS = { ERGO: 'ergo', - ETHEREUM: 'ethereum', CARDANO: 'cardano', BITCOIN: 'bitcoin', + ETHEREUM: 'ethereum', +} as const; + +/** + * The order should be Ergo, Cardano, Bitcoin, Ethereum. + * This sequence should be consistently used as the SUPPORTED_CHAINS. + */ +export const NETWORK_VALUES = Object.values(NETWORKS); + +export const NETWORK_LABELS: { [key in keyof typeof NETWORKS]: string } = { + ERGO: 'Ergo', + CARDANO: 'Cardano', + BITCOIN: 'Bitcoin', + ETHEREUM: 'Ethereum', } as const; diff --git a/packages/types/package.json b/packages/types/package.json index 098776e5..07f44f4a 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -19,5 +19,8 @@ "eslint-config-prettier": "^9.0.0", "prettier": "^3.0.2", "typescript": "^5.0.0" + }, + "dependencies": { + "@rosen-ui/constants": "^0.0.3" } } diff --git a/packages/types/src/common.ts b/packages/types/src/common.ts index ea72ee2a..0f639021 100644 --- a/packages/types/src/common.ts +++ b/packages/types/src/common.ts @@ -1,3 +1,5 @@ +import { NETWORKS } from '@rosen-ui/constants'; + export type ChartPeriod = 'week' | 'month' | 'year'; export interface TokenChartData { @@ -43,3 +45,5 @@ export interface MutationRequestBodyWithHeaders { // This is the Rosen wrapped-value export type RosenAmountValue = bigint; + +export type Network = (typeof NETWORKS)[keyof typeof NETWORKS]; diff --git a/packages/utils/src/getAddressUrl.ts b/packages/utils/src/getAddressUrl.ts index e7bfe7a2..9ea0e565 100644 --- a/packages/utils/src/getAddressUrl.ts +++ b/packages/utils/src/getAddressUrl.ts @@ -1,10 +1,14 @@ -const baseAddressURLs = { - ergo: 'https://explorer.ergoplatform.com/en/addresses', - cardano: 'https://cardanoscan.io/address', - bitcoin: 'https://mempool.space/address', +import { NETWORKS } from '@rosen-ui/constants'; +import { Network } from '@rosen-ui/types'; + +const baseAddressURLs: { [key in Network]: string } = { + [NETWORKS.ERGO]: 'https://explorer.ergoplatform.com/en/addresses', + [NETWORKS.CARDANO]: 'https://cardanoscan.io/address', + [NETWORKS.BITCOIN]: 'https://mempool.space/address', + [NETWORKS.ETHEREUM]: '', }; -export const getAddressUrl = (network: string, address?: string) => { +export const getAddressUrl = (network: Network, address?: string) => { const baseURL = baseAddressURLs[network as keyof typeof baseAddressURLs]; if (!baseURL || !address) return null; diff --git a/packages/utils/src/getTokenUrl.ts b/packages/utils/src/getTokenUrl.ts index 81c7dfc7..07b46b8c 100644 --- a/packages/utils/src/getTokenUrl.ts +++ b/packages/utils/src/getTokenUrl.ts @@ -1,10 +1,14 @@ -const baseTokenURLs = { - ergo: 'https://explorer.ergoplatform.com/en/token', - cardano: 'https://cardanoscan.io/token', - bitcoin: '', +import { NETWORKS } from '@rosen-ui/constants'; +import { Network } from '@rosen-ui/types'; + +const baseTokenURLs: { [key in Network]: string } = { + [NETWORKS.ERGO]: 'https://explorer.ergoplatform.com/en/token', + [NETWORKS.CARDANO]: 'https://cardanoscan.io/token', + [NETWORKS.BITCOIN]: '', + [NETWORKS.ETHEREUM]: '', }; -export const getTokenUrl = (network: string, tokenId?: string) => { +export const getTokenUrl = (network: Network, tokenId?: string) => { const baseURL = baseTokenURLs[network as keyof typeof baseTokenURLs]; if (!baseURL || !tokenId) return null; diff --git a/packages/utils/src/getTxUrl.ts b/packages/utils/src/getTxUrl.ts index d43c50f2..2b4b25c5 100644 --- a/packages/utils/src/getTxUrl.ts +++ b/packages/utils/src/getTxUrl.ts @@ -1,3 +1,6 @@ +import { NETWORKS } from '@rosen-ui/constants'; +import { Network } from '@rosen-ui/types'; + /** * TODO: This util is temporary and its logic should be moved to individual * network packages @@ -5,13 +8,14 @@ * local:ergo/rosen-bridge/ui#296 */ -const baseTxURLs = { - ergo: 'https://explorer.ergoplatform.com/transactions', - cardano: 'https://cardanoscan.io/transaction', - bitcoin: 'https://mempool.space/tx', +const baseTxURLs: { [key in Network]: string } = { + [NETWORKS.ERGO]: 'https://explorer.ergoplatform.com/transactions', + [NETWORKS.CARDANO]: 'https://cardanoscan.io/transaction', + [NETWORKS.BITCOIN]: 'https://mempool.space/tx', + [NETWORKS.ETHEREUM]: '', }; -export const getTxURL = (network: string, tx: string) => { +export const getTxURL = (network: Network, tx: string) => { const baseURL = baseTxURLs[network as keyof typeof baseTxURLs]; if (!baseURL) return null; diff --git a/wallets/eternl-wallet/src/getBalance.ts b/wallets/eternl-wallet/src/getBalance.ts index b81ee876..dd85e99b 100644 --- a/wallets/eternl-wallet/src/getBalance.ts +++ b/wallets/eternl-wallet/src/getBalance.ts @@ -1,6 +1,6 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS } from '@rosen-ui/constants'; import { RosenAmountValue } from '@rosen-ui/types'; import { hexToCbor } from '@rosen-ui/utils'; @@ -24,9 +24,9 @@ export const getBalanceCreator = const tokenMap = await config.getTokenMap(); const wrappedAmount = tokenMap.wrapAmount( - token[tokenMap.getIdKey(Networks.CARDANO)], + token[tokenMap.getIdKey(NETWORKS.CARDANO)], amount.quantity, - Networks.CARDANO + NETWORKS.CARDANO ).amount; return wrappedAmount; diff --git a/wallets/eternl-wallet/src/transfer.ts b/wallets/eternl-wallet/src/transfer.ts index eef9f283..0fbe1324 100644 --- a/wallets/eternl-wallet/src/transfer.ts +++ b/wallets/eternl-wallet/src/transfer.ts @@ -1,6 +1,6 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; -import { RosenAmountValue } from '@rosen-ui/types'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; import { getEternlWallet } from './getEternlWallet'; @@ -9,7 +9,7 @@ export const transferCreator = async ( token: RosenChainToken, amount: RosenAmountValue, - toChain: string, + toChain: Network, toAddress: string, bridgeFee: RosenAmountValue, networkFee: RosenAmountValue, diff --git a/wallets/flint-wallet/src/getBalance.ts b/wallets/flint-wallet/src/getBalance.ts index 743cc85a..63f05992 100644 --- a/wallets/flint-wallet/src/getBalance.ts +++ b/wallets/flint-wallet/src/getBalance.ts @@ -1,6 +1,6 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS } from '@rosen-ui/constants'; import { RosenAmountValue } from '@rosen-ui/types'; import { hexToCbor } from '@rosen-ui/utils'; @@ -24,9 +24,9 @@ export const getBalanceCreator = const tokenMap = await config.getTokenMap(); const wrappedAmount = tokenMap.wrapAmount( - token[tokenMap.getIdKey(Networks.CARDANO)], + token[tokenMap.getIdKey(NETWORKS.CARDANO)], amount.quantity, - Networks.CARDANO + NETWORKS.CARDANO ).amount; return wrappedAmount; diff --git a/wallets/flint-wallet/src/transfer.ts b/wallets/flint-wallet/src/transfer.ts index afcfd949..c1b876fe 100644 --- a/wallets/flint-wallet/src/transfer.ts +++ b/wallets/flint-wallet/src/transfer.ts @@ -1,6 +1,6 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; -import { RosenAmountValue } from '@rosen-ui/types'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; import { getFlintWallet } from './getFlintWallet'; @@ -9,7 +9,7 @@ export const transferCreator = async ( token: RosenChainToken, amount: RosenAmountValue, - toChain: string, + toChain: Network, toAddress: string, bridgeFee: RosenAmountValue, networkFee: RosenAmountValue, diff --git a/wallets/lace-wallet/src/getBalance.ts b/wallets/lace-wallet/src/getBalance.ts index 933f83e7..0a33b5c2 100644 --- a/wallets/lace-wallet/src/getBalance.ts +++ b/wallets/lace-wallet/src/getBalance.ts @@ -1,6 +1,6 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS } from '@rosen-ui/constants'; import { RosenAmountValue } from '@rosen-ui/types'; import { hexToCbor } from '@rosen-ui/utils'; @@ -24,9 +24,9 @@ export const getBalanceCreator = const tokenMap = await config.getTokenMap(); const wrappedAmount = tokenMap.wrapAmount( - token[tokenMap.getIdKey(Networks.CARDANO)], + token[tokenMap.getIdKey(NETWORKS.CARDANO)], amount.quantity, - Networks.CARDANO + NETWORKS.CARDANO ).amount; return wrappedAmount; diff --git a/wallets/lace-wallet/src/transfer.ts b/wallets/lace-wallet/src/transfer.ts index 93e4d3c1..5d06d42e 100644 --- a/wallets/lace-wallet/src/transfer.ts +++ b/wallets/lace-wallet/src/transfer.ts @@ -1,6 +1,6 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; -import { RosenAmountValue } from '@rosen-ui/types'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; import { getLaceWallet } from './getLaceWallet'; @@ -9,7 +9,7 @@ export const transferCreator = async ( token: RosenChainToken, amount: RosenAmountValue, - toChain: string, + toChain: Network, toAddress: string, bridgeFee: RosenAmountValue, networkFee: RosenAmountValue, diff --git a/wallets/metamask-wallet/src/getBalance.ts b/wallets/metamask-wallet/src/getBalance.ts index ce4cd104..b8e2cb77 100644 --- a/wallets/metamask-wallet/src/getBalance.ts +++ b/wallets/metamask-wallet/src/getBalance.ts @@ -1,6 +1,6 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/ethereum'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS } from '@rosen-ui/constants'; import { RosenAmountValue } from '@rosen-ui/types'; import { getMetaMaskWallet } from './getMetaMaskWallet'; @@ -28,9 +28,9 @@ export const getBalanceCreator = const tokenMap = await config.getTokenMap(); const wrappedAmount = tokenMap.wrapAmount( - token[tokenMap.getIdKey(Networks.ETHEREUM)], + token[tokenMap.getIdKey(NETWORKS.ETHEREUM)], BigInt(amount), - Networks.ETHEREUM + NETWORKS.ETHEREUM ).amount; return wrappedAmount; diff --git a/wallets/metamask-wallet/src/transfer.ts b/wallets/metamask-wallet/src/transfer.ts index 2f2f9588..6730317d 100644 --- a/wallets/metamask-wallet/src/transfer.ts +++ b/wallets/metamask-wallet/src/transfer.ts @@ -1,16 +1,16 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/ethereum'; -import { RosenAmountValue } from '@rosen-ui/types'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; import { getMetaMaskWallet } from './getMetaMaskWallet'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS } from '@rosen-ui/constants'; export const transferCreator = (config: WalletCreatorConfig) => async ( token: RosenChainToken, amount: RosenAmountValue, - toChain: string, + toChain: Network, toAddress: string, bridgeFee: RosenAmountValue, networkFee: RosenAmountValue, @@ -37,7 +37,7 @@ export const transferCreator = ); const tokenMap = await config.getTokenMap(); - const tokenId = token[tokenMap.getIdKey(Networks.ETHEREUM)]; + const tokenId = token[tokenMap.getIdKey(NETWORKS.ETHEREUM)]; const transactionParameters = await config.generateTxParameters( tokenId, diff --git a/wallets/nami-wallet/src/getBalance.ts b/wallets/nami-wallet/src/getBalance.ts index e8d85f39..100e9178 100644 --- a/wallets/nami-wallet/src/getBalance.ts +++ b/wallets/nami-wallet/src/getBalance.ts @@ -1,7 +1,7 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; import { hexToCbor } from '@rosen-ui/utils'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS } from '@rosen-ui/constants'; import { RosenAmountValue } from '@rosen-ui/types'; import { getNamiWallet } from './getNamiWallet'; @@ -24,9 +24,9 @@ export const getBalanceCreator = const tokenMap = await config.getTokenMap(); const wrappedAmount = tokenMap.wrapAmount( - token[tokenMap.getIdKey(Networks.CARDANO)], + token[tokenMap.getIdKey(NETWORKS.CARDANO)], amount.quantity, - Networks.CARDANO + NETWORKS.CARDANO ).amount; return wrappedAmount; diff --git a/wallets/nami-wallet/src/transfer.ts b/wallets/nami-wallet/src/transfer.ts index 5ac39515..b3657623 100644 --- a/wallets/nami-wallet/src/transfer.ts +++ b/wallets/nami-wallet/src/transfer.ts @@ -1,6 +1,6 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/cardano'; -import { RosenAmountValue } from '@rosen-ui/types'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; import { getNamiWallet } from './getNamiWallet'; @@ -9,7 +9,7 @@ export const transferCreator = async ( token: RosenChainToken, amount: RosenAmountValue, - toChain: string, + toChain: Network, toAddress: string, bridgeFee: RosenAmountValue, networkFee: RosenAmountValue, diff --git a/wallets/nautilus-wallet/src/getBalance.ts b/wallets/nautilus-wallet/src/getBalance.ts index 5084fc0b..e796ab96 100644 --- a/wallets/nautilus-wallet/src/getBalance.ts +++ b/wallets/nautilus-wallet/src/getBalance.ts @@ -1,6 +1,6 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/ergo'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS } from '@rosen-ui/constants'; import { RosenAmountValue } from '@rosen-ui/types'; import { getNautilusWallet } from './getNautilusWallet'; @@ -12,7 +12,7 @@ export const getBalanceCreator = const tokenMap = await config.getTokenMap(); - const tokenId = token[tokenMap.getIdKey(Networks.ERGO)]; + const tokenId = token[tokenMap.getIdKey(NETWORKS.ERGO)]; /** * The following condition is required because nautilus only accepts * uppercase ERG as tokenId for the erg native token @@ -28,7 +28,7 @@ export const getBalanceCreator = const wrappedAmount = tokenMap.wrapAmount( tokenId, amount, - Networks.ERGO + NETWORKS.ERGO ).amount; return wrappedAmount; diff --git a/wallets/nautilus-wallet/src/transfer.ts b/wallets/nautilus-wallet/src/transfer.ts index edbb024a..cdb10084 100644 --- a/wallets/nautilus-wallet/src/transfer.ts +++ b/wallets/nautilus-wallet/src/transfer.ts @@ -1,6 +1,6 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/ergo'; -import { RosenAmountValue } from '@rosen-ui/types'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; import { getNautilusWallet } from './getNautilusWallet'; @@ -9,7 +9,7 @@ export const transferCreator = async ( token: RosenChainToken, amount: RosenAmountValue, - toChain: string, + toChain: Network, toAddress: string, bridgeFee: RosenAmountValue, networkFee: RosenAmountValue, diff --git a/wallets/wallet-api/package.json b/wallets/wallet-api/package.json index aeddae32..622162ec 100644 --- a/wallets/wallet-api/package.json +++ b/wallets/wallet-api/package.json @@ -21,6 +21,7 @@ "typescript": "^5.0.0" }, "dependencies": { + "@rosen-ui/types": "^0.2.0", "@rosen-ui/utils": "^0.4.0" }, "peerDependencies": { diff --git a/wallets/wallet-api/src/types/index.ts b/wallets/wallet-api/src/types/index.ts index 77026baa..5375e5c8 100644 --- a/wallets/wallet-api/src/types/index.ts +++ b/wallets/wallet-api/src/types/index.ts @@ -1,6 +1,6 @@ import { ReactNode, FC } from 'react'; import { RosenChainToken } from '@rosen-bridge/tokens'; -import { RosenAmountValue } from '@rosen-ui/types'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; export enum WalletState { NOT_CONNECTED, @@ -31,7 +31,7 @@ export interface Wallet extends WalletBase { readonly transfer: ( token: RosenChainToken, amount: RosenAmountValue, - toChain: string, + toChain: Network, address: string, bridgeFee: RosenAmountValue, networkFee: RosenAmountValue, diff --git a/wallets/xdefi-wallet/src/getBalance.ts b/wallets/xdefi-wallet/src/getBalance.ts index 1b0f2e4a..0b3723a7 100644 --- a/wallets/xdefi-wallet/src/getBalance.ts +++ b/wallets/xdefi-wallet/src/getBalance.ts @@ -1,6 +1,6 @@ import { WalletCreatorConfig } from '@rosen-network/bitcoin'; import { AddressPurpose, BitcoinNetworkType } from 'sats-connect'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORKS } from '@rosen-ui/constants'; import { RosenChainToken } from '@rosen-bridge/tokens'; import { RosenAmountValue } from '@rosen-ui/types'; @@ -31,9 +31,9 @@ export const getBalanceCreator = .then((balance) => config.getTokenMap().then((tokenMap) => { const wrappedAmount = tokenMap.wrapAmount( - token[tokenMap.getIdKey(Networks.BITCOIN)], + token[tokenMap.getIdKey(NETWORKS.BITCOIN)], balance, - Networks.BITCOIN + NETWORKS.BITCOIN ).amount; resolve(wrappedAmount); }) diff --git a/wallets/xdefi-wallet/src/transfer.ts b/wallets/xdefi-wallet/src/transfer.ts index 0abc0b66..5fd56211 100644 --- a/wallets/xdefi-wallet/src/transfer.ts +++ b/wallets/xdefi-wallet/src/transfer.ts @@ -4,7 +4,7 @@ import { WalletCreatorConfig, } from '@rosen-network/bitcoin/dist/src/types'; import { AddressPurpose, BitcoinNetworkType } from 'sats-connect'; -import { RosenAmountValue } from '@rosen-ui/types'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; import { getXdefiWallet } from './getXdefiWallet'; @@ -13,7 +13,7 @@ export const transferCreator = async ( token: RosenChainToken, amount: RosenAmountValue, - toChain: string, + toChain: Network, toAddress: string, bridgeFee: RosenAmountValue, networkFee: RosenAmountValue, From e04318b410a3d2ce751820be8f58675210a096ac Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sun, 22 Sep 2024 12:40:17 +0000 Subject: [PATCH 119/168] fix: Revise the network selection types on the assets page --- apps/rosen/app/assets/page.tsx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/apps/rosen/app/assets/page.tsx b/apps/rosen/app/assets/page.tsx index 44d61f82..1ee41497 100644 --- a/apps/rosen/app/assets/page.tsx +++ b/apps/rosen/app/assets/page.tsx @@ -24,12 +24,15 @@ import TableSkeleton from './TableSkeleton'; import { NETWORK_LABELS, NETWORKS } from '@rosen-ui/constants'; import { Network } from '@rosen-ui/types'; -const getKey = (chain?: Network) => (offset: number, limit: number) => { - return ['/v1/assets', { offset, limit, chain }]; +const getKey = (chain: Network | 'all') => (offset: number, limit: number) => { + return [ + '/v1/assets', + { offset, limit, chain: chain == 'all' ? undefined : chain }, + ]; }; export default function Page() { - const [network, setNetwork] = useState(); + const [network, setNetwork] = useState('all'); const { data, @@ -44,7 +47,7 @@ export default function Page() { } = useTableDataPagination(getKey(network)); const handleChangeNetwork = (event: any) => { - setNetwork(event.target.value as Network); + setNetwork(event.target.value); }; const handleChangePage = useCallback( @@ -157,7 +160,7 @@ export default function Page() { onChange={handleChangeNetwork} value={network} > - All + All {Object.keys(NETWORKS).map((key) => ( Date: Sun, 22 Sep 2024 13:32:25 +0000 Subject: [PATCH 120/168] chore: Enhance the validation process for the target addresses --- .changeset/cold-shoes-talk.md | 5 +++++ apps/rosen/app/_actions/validateAddress.ts | 26 ++-------------------- apps/rosen/package.json | 1 + package-lock.json | 15 +++++++++++++ 4 files changed, 23 insertions(+), 24 deletions(-) create mode 100644 .changeset/cold-shoes-talk.md diff --git a/.changeset/cold-shoes-talk.md b/.changeset/cold-shoes-talk.md new file mode 100644 index 00000000..39b0ffd7 --- /dev/null +++ b/.changeset/cold-shoes-talk.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': patch +--- + +Refine and strengthen the validation process for network addresses to ensure greater accuracy and reliability. diff --git a/apps/rosen/app/_actions/validateAddress.ts b/apps/rosen/app/_actions/validateAddress.ts index 0dfc4d6c..56e2591b 100644 --- a/apps/rosen/app/_actions/validateAddress.ts +++ b/apps/rosen/app/_actions/validateAddress.ts @@ -1,15 +1,12 @@ 'use server'; -import { Address } from 'ergo-lib-wasm-nodejs'; import { Networks } from '@rosen-ui/constants'; -import * as wasm from '@emurgo/cardano-serialization-lib-nodejs'; import { AvailableNetworks } from '@/_networks'; -import { isValidAddress as isValidBitcoinAddress } from '@rosen-network/bitcoin'; -import { isValidAddress as isValidEthereumAddress } from '@rosen-network/ethereum'; import { withValidation } from '@/_validation'; import { wrap } from '@/_errors'; import Joi from 'joi'; +import { validateAddress as validate } from '@rosen-bridge/address-codec'; /** * server action to verify the wallet addresses @@ -19,26 +16,7 @@ import Joi from 'joi'; const validateAddressCore = async ( chain: AvailableNetworks, walletAddress: string, -) => { - try { - if (chain === Networks.ERGO) { - Address.from_base58(walletAddress); - } else if (chain === Networks.CARDANO) { - wasm.Address.from_bech32(walletAddress); - } else if (chain == Networks.BITCOIN) { - if (!isValidBitcoinAddress(walletAddress)) { - throw new Error(); - } - } else if (chain == Networks.ETHEREUM) { - if (!isValidEthereumAddress(walletAddress)) { - throw new Error(); - } - } - return true; - } catch { - return false; - } -}; +) => validate(chain, walletAddress); type Schema = Parameters; diff --git a/apps/rosen/package.json b/apps/rosen/package.json index 2418a6ff..48b19141 100644 --- a/apps/rosen/package.json +++ b/apps/rosen/package.json @@ -16,6 +16,7 @@ "dependencies": { "@emurgo/cardano-serialization-lib-browser": "^11.5.0", "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", + "@rosen-bridge/address-codec": "^0.3.0", "@rosen-bridge/bitcoin-utxo-selection": "^0.2.0", "@rosen-bridge/cardano-utxo-selection": "^1.0.0", "@rosen-bridge/cli": "^0.2.0", diff --git a/package-lock.json b/package-lock.json index 0cb845e7..d3bb2306 100644 --- a/package-lock.json +++ b/package-lock.json @@ -82,6 +82,7 @@ "dependencies": { "@emurgo/cardano-serialization-lib-browser": "^11.5.0", "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", + "@rosen-bridge/address-codec": "^0.3.0", "@rosen-bridge/bitcoin-utxo-selection": "^0.2.0", "@rosen-bridge/cardano-utxo-selection": "^1.0.0", "@rosen-bridge/cli": "^0.2.0", @@ -224,6 +225,20 @@ "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" }, + "apps/rosen/node_modules/@rosen-bridge/address-codec": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-0.3.0.tgz", + "integrity": "sha512-qH8kOKuAStVbXoeAWmMuGD9CQTYGCE4nFAAS1NEi11eZV1nK97/mXQgjIpPHNGKJxkuPpmsGVoZxbaZakSCE5g==", + "dependencies": { + "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", + "bitcoinjs-lib": "^6.1.5", + "ergo-lib-wasm-nodejs": "^0.24.1", + "ethers": "^6.13.2" + }, + "engines": { + "node": ">=20.11.0" + } + }, "apps/rosen/node_modules/@rosen-bridge/scanner": { "version": "3.2.9", "resolved": "https://registry.npmjs.org/@rosen-bridge/scanner/-/scanner-3.2.9.tgz", From 08eaed74c703dc095c5fd3567754373b0dc02ab0 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 23 Sep 2024 12:55:04 +0000 Subject: [PATCH 121/168] chore: Revise the typing of the target/source value fields --- apps/rosen/app/(bridge)/BridgeTransaction.tsx | 6 ++++-- apps/rosen/app/_backend/events/event-service.ts | 4 ++++ apps/rosen/app/_hooks/useMaxTransfer.ts | 1 + apps/rosen/app/_hooks/useTransactionFormData.ts | 4 ++-- apps/rosen/app/events/TableRow.tsx | 8 ++++++++ packages/constants/src/index.ts | 6 +++++- 6 files changed, 24 insertions(+), 5 deletions(-) diff --git a/apps/rosen/app/(bridge)/BridgeTransaction.tsx b/apps/rosen/app/(bridge)/BridgeTransaction.tsx index a96e31f0..4b08f830 100644 --- a/apps/rosen/app/(bridge)/BridgeTransaction.tsx +++ b/apps/rosen/app/(bridge)/BridgeTransaction.tsx @@ -64,7 +64,8 @@ export const BridgeTransaction = () => { const { selectedNetwork } = useNetwork(); - const tokenInfo = tokenValue && getTokenNameAndId(tokenValue, sourceValue); + const tokenInfo = + tokenValue && sourceValue && getTokenNameAndId(tokenValue, sourceValue); const idKey = sourceValue && tokenMap.getIdKey(sourceValue); const targetTokenSearchResults = @@ -73,7 +74,8 @@ export const BridgeTransaction = () => { tokenMap.search(sourceValue, { [idKey]: tokenValue[idKey], }); - const targetTokenInfo = targetTokenSearchResults?.[0]?.[targetValue]; + const targetTokenInfo = + targetValue && targetTokenSearchResults?.[0]?.[targetValue]; const WalletIcon = selectedWallet?.icon; diff --git a/apps/rosen/app/_backend/events/event-service.ts b/apps/rosen/app/_backend/events/event-service.ts index 764d11c3..81395500 100644 --- a/apps/rosen/app/_backend/events/event-service.ts +++ b/apps/rosen/app/_backend/events/event-service.ts @@ -50,6 +50,10 @@ const getEventsWithFullTokenData = async (offset: number, limit: number) => { ...item, lockToken: getFullTokenData( sourceChainTokenId, + /** + * TODO: remove the type assertion after addressing this issue + * https://git.ergopool.io/ergo/rosen-bridge/scanner/-/issues/132 + */ item.fromChain as Network, ), })), diff --git a/apps/rosen/app/_hooks/useMaxTransfer.ts b/apps/rosen/app/_hooks/useMaxTransfer.ts index ff6d6bde..fed579ed 100644 --- a/apps/rosen/app/_hooks/useMaxTransfer.ts +++ b/apps/rosen/app/_hooks/useMaxTransfer.ts @@ -38,6 +38,7 @@ export const useMaxTransfer = () => { isTokenBalanceLoading || !selectedNetwork || !selectedWallet || + !targetValue || !tokenValue; if (skip) return; diff --git a/apps/rosen/app/_hooks/useTransactionFormData.ts b/apps/rosen/app/_hooks/useTransactionFormData.ts index 4a20d0ff..fe10b8cf 100644 --- a/apps/rosen/app/_hooks/useTransactionFormData.ts +++ b/apps/rosen/app/_hooks/useTransactionFormData.ts @@ -10,8 +10,8 @@ import { Network } from '@rosen-ui/types'; const useTransactionFormData = () => { const { control, ...rest } = useFormContext(); - const sourceValue = useWatch({ control, name: 'source' }) as Network; - const targetValue = useWatch({ control, name: 'target' }) as Network; + const sourceValue = useWatch({ control, name: 'source' }) as Network | null; + const targetValue = useWatch({ control, name: 'target' }) as Network | null; const tokenValue = useWatch({ control, name: 'token' }); const amountValue = useWatch({ control, name: 'amount' }); const walletAddressValue = useWatch({ control, name: 'walletAddress' }); diff --git a/apps/rosen/app/events/TableRow.tsx b/apps/rosen/app/events/TableRow.tsx index 451f1309..ec32b432 100644 --- a/apps/rosen/app/events/TableRow.tsx +++ b/apps/rosen/app/events/TableRow.tsx @@ -136,6 +136,10 @@ export const MobileRow: FC = (props) => { setExpand((prevState) => !prevState); }; + /** + * TODO: remove the type assertion after addressing this issue + * https://git.ergopool.io/ergo/rosen-bridge/scanner/-/issues/132 + */ const txUrl = getTxURL(row.fromChain as Network, row.sourceTxId); return ( @@ -246,6 +250,10 @@ export const MobileRow: FC = (props) => { export const TabletRow: FC = (props) => { const { isLoading, ...row } = props; + /** + * TODO: remove the type assertion after addressing this issue + * https://git.ergopool.io/ergo/rosen-bridge/scanner/-/issues/132 + */ const txUrl = getTxURL(row.fromChain as Network, row.sourceTxId); return ( diff --git a/packages/constants/src/index.ts b/packages/constants/src/index.ts index eaed04b4..07a5740e 100644 --- a/packages/constants/src/index.ts +++ b/packages/constants/src/index.ts @@ -8,6 +8,10 @@ export const TOKEN_NAME_PLACEHOLDER = 'unnamed token'; export const HEALTH_DATA_REFRESH_INTERVAL = 60000; +/** + * The order should be Ergo, Cardano, Bitcoin, Ethereum. + * This sequence should be consistently used as the SUPPORTED_CHAINS. + */ export const NETWORKS = { ERGO: 'ergo', CARDANO: 'cardano', @@ -26,4 +30,4 @@ export const NETWORK_LABELS: { [key in keyof typeof NETWORKS]: string } = { CARDANO: 'Cardano', BITCOIN: 'Bitcoin', ETHEREUM: 'Ethereum', -} as const; +}; From 5e418d56aac1f57f6e83603af479edfec6734ca8 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 23 Sep 2024 13:11:54 +0000 Subject: [PATCH 122/168] chore: Enhance the validation process for the target addresses --- .changeset/cold-shoes-talk.md | 5 +++++ apps/rosen/app/_actions/validateAddress.ts | 26 ++-------------------- apps/rosen/app/_hooks/useBridgeForm.ts | 4 +++- apps/rosen/app/_hooks/useNetwork.ts | 4 ++++ apps/rosen/app/_hooks/useTransaction.ts | 7 +++--- apps/rosen/app/_networks/bitcoin/index.ts | 1 + apps/rosen/app/_networks/cardano/index.ts | 1 + apps/rosen/app/_networks/ergo/index.ts | 1 + apps/rosen/app/_networks/ethereum/index.ts | 1 + apps/rosen/app/_types/network.ts | 1 + apps/rosen/package.json | 1 + package-lock.json | 15 +++++++++++++ 12 files changed, 39 insertions(+), 28 deletions(-) create mode 100644 .changeset/cold-shoes-talk.md diff --git a/.changeset/cold-shoes-talk.md b/.changeset/cold-shoes-talk.md new file mode 100644 index 00000000..39b0ffd7 --- /dev/null +++ b/.changeset/cold-shoes-talk.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': patch +--- + +Refine and strengthen the validation process for network addresses to ensure greater accuracy and reliability. diff --git a/apps/rosen/app/_actions/validateAddress.ts b/apps/rosen/app/_actions/validateAddress.ts index 0dfc4d6c..56e2591b 100644 --- a/apps/rosen/app/_actions/validateAddress.ts +++ b/apps/rosen/app/_actions/validateAddress.ts @@ -1,15 +1,12 @@ 'use server'; -import { Address } from 'ergo-lib-wasm-nodejs'; import { Networks } from '@rosen-ui/constants'; -import * as wasm from '@emurgo/cardano-serialization-lib-nodejs'; import { AvailableNetworks } from '@/_networks'; -import { isValidAddress as isValidBitcoinAddress } from '@rosen-network/bitcoin'; -import { isValidAddress as isValidEthereumAddress } from '@rosen-network/ethereum'; import { withValidation } from '@/_validation'; import { wrap } from '@/_errors'; import Joi from 'joi'; +import { validateAddress as validate } from '@rosen-bridge/address-codec'; /** * server action to verify the wallet addresses @@ -19,26 +16,7 @@ import Joi from 'joi'; const validateAddressCore = async ( chain: AvailableNetworks, walletAddress: string, -) => { - try { - if (chain === Networks.ERGO) { - Address.from_base58(walletAddress); - } else if (chain === Networks.CARDANO) { - wasm.Address.from_bech32(walletAddress); - } else if (chain == Networks.BITCOIN) { - if (!isValidBitcoinAddress(walletAddress)) { - throw new Error(); - } - } else if (chain == Networks.ETHEREUM) { - if (!isValidEthereumAddress(walletAddress)) { - throw new Error(); - } - } - return true; - } catch { - return false; - } -}; +) => validate(chain, walletAddress); type Schema = Parameters; diff --git a/apps/rosen/app/_hooks/useBridgeForm.ts b/apps/rosen/app/_hooks/useBridgeForm.ts index 82547ba0..8ea2fee9 100644 --- a/apps/rosen/app/_hooks/useBridgeForm.ts +++ b/apps/rosen/app/_hooks/useBridgeForm.ts @@ -128,7 +128,9 @@ const useBridgeForm = () => { const validationResult = await validateAddress( targetField.value, - value, + availableNetworks[ + targetField.value as AvailableNetworks + ].toSafeAddress(value), ); const message = validationResult ? undefined : 'Invalid Address'; diff --git a/apps/rosen/app/_hooks/useNetwork.ts b/apps/rosen/app/_hooks/useNetwork.ts index 1471f5b1..a08498ed 100644 --- a/apps/rosen/app/_hooks/useNetwork.ts +++ b/apps/rosen/app/_hooks/useNetwork.ts @@ -8,6 +8,7 @@ import { useTokenMap } from './useTokenMap'; type Chain = string; type SourceFieldValue = Chain & AvailableNetworks; +type TargetFieldValue = Chain & AvailableNetworks; /** * handles network related operations and provide list of @@ -55,6 +56,9 @@ const useNetwork = () => { : null, targetNetworks: targetNetworks, tokens, + selectedTargetNetwork: targetField.value + ? availableNetworks[targetField.value as TargetFieldValue] + : null, }; }; diff --git a/apps/rosen/app/_hooks/useTransaction.ts b/apps/rosen/app/_hooks/useTransaction.ts index 33aa69c1..6cd299ee 100644 --- a/apps/rosen/app/_hooks/useTransaction.ts +++ b/apps/rosen/app/_hooks/useTransaction.ts @@ -15,7 +15,7 @@ import { RosenAmountValue } from '@rosen-ui/types'; */ export const useTransaction = () => { const tokenMap = useTokenMap(); - const { selectedNetwork } = useNetwork(); + const { selectedNetwork, selectedTargetNetwork } = useNetwork(); const { targetValue, tokenValue, amountValue, walletAddressValue } = useTransactionFormData(); @@ -37,7 +37,8 @@ export const useTransaction = () => { walletAddressValue && bridgeFee && networkFee && - tokenMap + tokenMap && + selectedTargetNetwork ) { setIsSubmitting(true); try { @@ -51,7 +52,7 @@ export const useTransaction = () => { tokenValue as RosenChainToken, amountValueWrapped, targetValue, - walletAddressValue, + selectedTargetNetwork.toSafeAddress(walletAddressValue), bridgeFee, networkFee, lockAddress, diff --git a/apps/rosen/app/_networks/bitcoin/index.ts b/apps/rosen/app/_networks/bitcoin/index.ts index 8ef98d8a..a5df43da 100644 --- a/apps/rosen/app/_networks/bitcoin/index.ts +++ b/apps/rosen/app/_networks/bitcoin/index.ts @@ -40,6 +40,7 @@ const BitcoinNetwork: BitcoinNetworkType = { nextHeightInterval: 1, lockAddress: process.env.NEXT_PUBLIC_BITCOIN_LOCK_ADDRESS!, getMaxTransfer: unwrap(fromSafeData(getMaxTransfer)), + toSafeAddress: (address) => address, }; export default BitcoinNetwork; diff --git a/apps/rosen/app/_networks/cardano/index.ts b/apps/rosen/app/_networks/cardano/index.ts index 1b6794e0..337aa823 100644 --- a/apps/rosen/app/_networks/cardano/index.ts +++ b/apps/rosen/app/_networks/cardano/index.ts @@ -47,6 +47,7 @@ const CardanoNetwork: CardanoNetworkType = { logo: CardanoIcon, lockAddress: process.env.NEXT_PUBLIC_CARDANO_LOCK_ADDRESS!, getMaxTransfer: unwrap(fromSafeData(getMaxTransfer)), + toSafeAddress: (address) => address, }; export default CardanoNetwork; diff --git a/apps/rosen/app/_networks/ergo/index.ts b/apps/rosen/app/_networks/ergo/index.ts index 821dcc04..83778b99 100644 --- a/apps/rosen/app/_networks/ergo/index.ts +++ b/apps/rosen/app/_networks/ergo/index.ts @@ -29,6 +29,7 @@ const ErgoNetwork: ErgoNetworkType = { nextHeightInterval: 5, lockAddress: process.env.NEXT_PUBLIC_ERGO_LOCK_ADDRESS!, getMaxTransfer: unwrap(fromSafeData(getMaxTransfer)), + toSafeAddress: (address) => address, }; export default ErgoNetwork; diff --git a/apps/rosen/app/_networks/ethereum/index.ts b/apps/rosen/app/_networks/ethereum/index.ts index dd16dae6..30a1b6f3 100644 --- a/apps/rosen/app/_networks/ethereum/index.ts +++ b/apps/rosen/app/_networks/ethereum/index.ts @@ -30,6 +30,7 @@ const EthereumNetwork: EthereumNetworkType = { nextHeightInterval: 0, lockAddress: process.env.NEXT_PUBLIC_ETHEREUM_LOCK_ADDRESS!, getMaxTransfer: unwrap(fromSafeData(getMaxTransfer)), + toSafeAddress: (address) => address.toLowerCase(), }; export default EthereumNetwork; diff --git a/apps/rosen/app/_types/network.ts b/apps/rosen/app/_types/network.ts index 75038fa3..82d43664 100644 --- a/apps/rosen/app/_types/network.ts +++ b/apps/rosen/app/_types/network.ts @@ -25,6 +25,7 @@ export interface BaseNetwork< getMaxTransfer: ( props: GetMaxTransferParams & GetMaxTransferParamsExtra, ) => Promise; + toSafeAddress: (address: string) => string; } interface BitcoinMaxTransferExtra { diff --git a/apps/rosen/package.json b/apps/rosen/package.json index 2418a6ff..48b19141 100644 --- a/apps/rosen/package.json +++ b/apps/rosen/package.json @@ -16,6 +16,7 @@ "dependencies": { "@emurgo/cardano-serialization-lib-browser": "^11.5.0", "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", + "@rosen-bridge/address-codec": "^0.3.0", "@rosen-bridge/bitcoin-utxo-selection": "^0.2.0", "@rosen-bridge/cardano-utxo-selection": "^1.0.0", "@rosen-bridge/cli": "^0.2.0", diff --git a/package-lock.json b/package-lock.json index 0cb845e7..d3bb2306 100644 --- a/package-lock.json +++ b/package-lock.json @@ -82,6 +82,7 @@ "dependencies": { "@emurgo/cardano-serialization-lib-browser": "^11.5.0", "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", + "@rosen-bridge/address-codec": "^0.3.0", "@rosen-bridge/bitcoin-utxo-selection": "^0.2.0", "@rosen-bridge/cardano-utxo-selection": "^1.0.0", "@rosen-bridge/cli": "^0.2.0", @@ -224,6 +225,20 @@ "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" }, + "apps/rosen/node_modules/@rosen-bridge/address-codec": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-0.3.0.tgz", + "integrity": "sha512-qH8kOKuAStVbXoeAWmMuGD9CQTYGCE4nFAAS1NEi11eZV1nK97/mXQgjIpPHNGKJxkuPpmsGVoZxbaZakSCE5g==", + "dependencies": { + "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", + "bitcoinjs-lib": "^6.1.5", + "ergo-lib-wasm-nodejs": "^0.24.1", + "ethers": "^6.13.2" + }, + "engines": { + "node": ">=20.11.0" + } + }, "apps/rosen/node_modules/@rosen-bridge/scanner": { "version": "3.2.9", "resolved": "https://registry.npmjs.org/@rosen-bridge/scanner/-/scanner-3.2.9.tgz", From 93d56eb653a2f6b3c1c14a52eb0c3d1d20d0f6ed Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 24 Sep 2024 07:44:57 +0000 Subject: [PATCH 123/168] chore: Update the event type to convert the chains type into a strongly typed format --- apps/rosen/app/_backend/events/event-repository.ts | 3 +++ apps/rosen/app/_backend/events/event-service.ts | 9 +-------- apps/rosen/app/events/TableRow.tsx | 12 ++---------- 3 files changed, 6 insertions(+), 18 deletions(-) diff --git a/apps/rosen/app/_backend/events/event-repository.ts b/apps/rosen/app/_backend/events/event-repository.ts index 6a01e5a4..32138100 100644 --- a/apps/rosen/app/_backend/events/event-repository.ts +++ b/apps/rosen/app/_backend/events/event-repository.ts @@ -1,6 +1,7 @@ import { ObservationEntity } from '@rosen-bridge/observation-extractor'; import { BlockEntity } from '@rosen-bridge/scanner'; import { EventTriggerEntity } from '@rosen-bridge/watcher-data-extractor'; +import { Network } from '@rosen-ui/types'; import dataSource from '../dataSource'; @@ -13,6 +14,8 @@ interface EventWithTotal extends Omit { timestamp: number; total: number; status: 'fraud' | 'processing' | 'successful'; + fromChain: Network; + toChain: Network; } /** diff --git a/apps/rosen/app/_backend/events/event-service.ts b/apps/rosen/app/_backend/events/event-service.ts index 81395500..d8af31a6 100644 --- a/apps/rosen/app/_backend/events/event-service.ts +++ b/apps/rosen/app/_backend/events/event-service.ts @@ -48,14 +48,7 @@ const getEventsWithFullTokenData = async (offset: number, limit: number) => { total: events.total, items: events.items.map(({ sourceChainTokenId, ...item }) => ({ ...item, - lockToken: getFullTokenData( - sourceChainTokenId, - /** - * TODO: remove the type assertion after addressing this issue - * https://git.ergopool.io/ergo/rosen-bridge/scanner/-/issues/132 - */ - item.fromChain as Network, - ), + lockToken: getFullTokenData(sourceChainTokenId, item.fromChain), })), }; }; diff --git a/apps/rosen/app/events/TableRow.tsx b/apps/rosen/app/events/TableRow.tsx index ec32b432..abe2be3b 100644 --- a/apps/rosen/app/events/TableRow.tsx +++ b/apps/rosen/app/events/TableRow.tsx @@ -136,11 +136,7 @@ export const MobileRow: FC = (props) => { setExpand((prevState) => !prevState); }; - /** - * TODO: remove the type assertion after addressing this issue - * https://git.ergopool.io/ergo/rosen-bridge/scanner/-/issues/132 - */ - const txUrl = getTxURL(row.fromChain as Network, row.sourceTxId); + const txUrl = getTxURL(row.fromChain, row.sourceTxId); return ( <> @@ -250,11 +246,7 @@ export const MobileRow: FC = (props) => { export const TabletRow: FC = (props) => { const { isLoading, ...row } = props; - /** - * TODO: remove the type assertion after addressing this issue - * https://git.ergopool.io/ergo/rosen-bridge/scanner/-/issues/132 - */ - const txUrl = getTxURL(row.fromChain as Network, row.sourceTxId); + const txUrl = getTxURL(row.fromChain, row.sourceTxId); return ( From cac135745fd89600663ffdb96f4e0902a2ad84e5 Mon Sep 17 00:00:00 2001 From: "fateme.r" Date: Tue, 24 Sep 2024 17:13:18 +0330 Subject: [PATCH 124/168] Add evm asset calculator and ethereum interface --- package-lock.json | 1 + .../asset-calculator/lib/asset-calculator.ts | 19 +++- .../lib/calculator/chains/evm-calculator.ts | 105 ++++++++++++++++++ packages/asset-calculator/lib/constants.ts | 63 +++++++++++ packages/asset-calculator/lib/interfaces.ts | 6 + packages/asset-calculator/package.json | 1 + .../tests/asset-calculator.spec.ts | 4 + 7 files changed, 198 insertions(+), 1 deletion(-) create mode 100644 packages/asset-calculator/lib/calculator/chains/evm-calculator.ts diff --git a/package-lock.json b/package-lock.json index 0cb845e7..2bf3344a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24717,6 +24717,7 @@ "@rosen-clients/cardano-koios": "^2.0.1", "@rosen-clients/ergo-explorer": "^1.0.3", "axios": "^1.7.0", + "ethers": "^6.13.2", "lodash-es": "^4.17.21", "typeorm": "^0.3.20" }, diff --git a/packages/asset-calculator/lib/asset-calculator.ts b/packages/asset-calculator/lib/asset-calculator.ts index 32722519..7e34e258 100644 --- a/packages/asset-calculator/lib/asset-calculator.ts +++ b/packages/asset-calculator/lib/asset-calculator.ts @@ -17,13 +17,20 @@ import { BitcoinCalculatorInterface, CardanoCalculatorInterface, ErgoCalculatorInterface, + EthereumCalculatorInterface, } from './interfaces'; -import { BITCOIN_CHAIN, CARDANO_CHAIN, ERGO_CHAIN } from './constants'; +import { + BITCOIN_CHAIN, + CARDANO_CHAIN, + ERGO_CHAIN, + ETHEREUM_CHAIN, +} from './constants'; import { BridgedAssetModel } from './database/bridgedAsset/BridgedAssetModel'; import { TokenModel } from './database/token/TokenModel'; import AbstractCalculator from './calculator/abstract-calculator'; import { LockedAssetModel } from './database/lockedAsset/LockedAssetModel'; import { LockedAssetEntity } from './database/lockedAsset/LockedAssetEntity'; +import { EvmCalculator } from './calculator/chains/evm-calculator'; class AssetCalculator { protected readonly tokens: TokenMap; @@ -37,6 +44,7 @@ class AssetCalculator { ergoCalculator: ErgoCalculatorInterface, cardanoCalculator: CardanoCalculatorInterface, bitcoinCalculator: BitcoinCalculatorInterface, + ethereumCalculator: EthereumCalculatorInterface, dataSource: DataSource, protected readonly logger: AbstractLogger = new DummyLogger() ) { @@ -60,9 +68,18 @@ class AssetCalculator { bitcoinCalculator.esploraUrl, logger ); + const ethereumAssetCalculator = new EvmCalculator( + ETHEREUM_CHAIN, + this.tokens, + ethereumCalculator.addresses, + ethereumCalculator.rpcUrl, + ethereumCalculator.authToken, + logger + ); this.calculatorMap.set(ERGO_CHAIN, ergoAssetCalculator); this.calculatorMap.set(CARDANO_CHAIN, cardanoAssetCalculator); this.calculatorMap.set(BITCOIN_CHAIN, bitcoinAssetCalculator); + this.calculatorMap.set(ETHEREUM_CHAIN, ethereumAssetCalculator); this.bridgedAssetModel = new BridgedAssetModel(dataSource, logger); this.lockedAssetModel = new LockedAssetModel(dataSource, logger); this.tokenModel = new TokenModel(dataSource, logger); diff --git a/packages/asset-calculator/lib/calculator/chains/evm-calculator.ts b/packages/asset-calculator/lib/calculator/chains/evm-calculator.ts new file mode 100644 index 00000000..fb4bd208 --- /dev/null +++ b/packages/asset-calculator/lib/calculator/chains/evm-calculator.ts @@ -0,0 +1,105 @@ +import AbstractCalculator from '../abstract-calculator'; +import { PartialERC20ABI } from '../../constants'; + +import { NATIVE_TOKEN, RosenChainToken, TokenMap } from '@rosen-bridge/tokens'; +import { AbstractLogger } from '@rosen-bridge/abstract-logger'; +import { zipWith } from 'lodash-es'; +import { ethers, JsonRpcProvider } from 'ethers'; + +export class EvmCalculator extends AbstractCalculator { + readonly chain; + private readonly provider: JsonRpcProvider; + + constructor( + chain: string, + tokenMap: TokenMap, + addresses: string[], + url: string, + authToken?: string, + logger?: AbstractLogger + ) { + super(addresses, logger, tokenMap); + this.chain = chain; + this.provider = authToken + ? new JsonRpcProvider(`${url}/${authToken}`) + : new JsonRpcProvider(`${url}`); + } + + /** + * @param token Evm chain token info + * @returns total supply of the token in the Evm chain + */ + totalRawSupply = async (token: RosenChainToken): Promise => { + const contract = new ethers.Contract( + token[this.idKey], + PartialERC20ABI, + this.provider + ); + const totalSupply = await contract.totalSupply(); + if (totalSupply) { + this.logger.debug( + `Total supply of token [${token[this.idKey]}] is [${totalSupply}]` + ); + return totalSupply; + } + throw Error( + `Total supply of token [${token[this.idKey]}] is not calculable` + ); + }; + + /** + * @param token Evm chain token info + * @returns total balance in hot and cold wallets + */ + totalRawBalance = async (token: RosenChainToken): Promise => { + let tokenBalance = 0n; + const contract = new ethers.Contract( + token[this.idKey], + PartialERC20ABI, + this.provider + ); + for (const address of this.addresses) { + const balance = await contract.balanceOf(address); + this.logger.debug( + `Balance of token [${ + token[this.idKey] + }] in address [${address}] is [${balance}]` + ); + tokenBalance += balance; + } + this.logger.debug( + `Total balance of token [${token[this.idKey]}] is [${tokenBalance}]` + ); + return tokenBalance; + }; + + /** + * returns locked amounts of a specific token for different addresses + * @param token + */ + getRawLockedAmountsPerAddress = async (token: RosenChainToken) => { + let tokenBalances: bigint[] = []; + for (const address of this.addresses) { + let balance = 0n; + if (token.metaData.type == NATIVE_TOKEN) { + balance = await this.provider.getBalance(address); + } else { + const contract = new ethers.Contract( + token[this.idKey], + PartialERC20ABI, + this.provider + ); + balance = await contract.balanceOf(address); + } + this.logger.debug( + `balance of token [${token.name}] for address [${address}] is [${balance}]` + ); + tokenBalances.push(balance); + } + + return zipWith(this.addresses, tokenBalances, (address, amount) => ({ + address, + amount, + })).filter((amountPerAddress) => amountPerAddress.amount); + }; +} diff --git a/packages/asset-calculator/lib/constants.ts b/packages/asset-calculator/lib/constants.ts index a5e00e6f..48315c31 100644 --- a/packages/asset-calculator/lib/constants.ts +++ b/packages/asset-calculator/lib/constants.ts @@ -1,3 +1,66 @@ +import { InterfaceAbi } from 'ethers'; + export const BITCOIN_CHAIN = 'bitcoin'; export const CARDANO_CHAIN = 'cardano'; export const ERGO_CHAIN = 'ergo'; +export const ETHEREUM_CHAIN = 'ethereum'; + +export const PartialERC20ABI: InterfaceAbi = [ + { + constant: true, + inputs: [], + name: 'name', + outputs: [ + { + name: '', + type: 'string', + }, + ], + payable: false, + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'decimals', + outputs: [ + { + name: '', + type: 'uint8', + }, + ], + payable: false, + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: '_owner', + type: 'address', + }, + ], + name: 'balanceOf', + outputs: [ + { + name: 'balance', + type: 'uint256', + }, + ], + payable: false, + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'totalSupply', + outputs: [ + { + name: '', + type: 'uint256', + }, + ], + payable: false, + type: 'function', + }, +]; diff --git a/packages/asset-calculator/lib/interfaces.ts b/packages/asset-calculator/lib/interfaces.ts index 0963f75b..b0a4f507 100644 --- a/packages/asset-calculator/lib/interfaces.ts +++ b/packages/asset-calculator/lib/interfaces.ts @@ -10,6 +10,11 @@ interface BitcoinCalculatorInterface extends CalculatorInterface { esploraUrl?: string; } +interface EthereumCalculatorInterface extends CalculatorInterface { + rpcUrl: string; + authToken?: string; +} + interface CalculatorInterface { addresses: string[]; } @@ -18,4 +23,5 @@ export { ErgoCalculatorInterface, CardanoCalculatorInterface, BitcoinCalculatorInterface, + EthereumCalculatorInterface, }; diff --git a/packages/asset-calculator/package.json b/packages/asset-calculator/package.json index 0fefa860..d60fcfa1 100644 --- a/packages/asset-calculator/package.json +++ b/packages/asset-calculator/package.json @@ -38,6 +38,7 @@ "@rosen-clients/cardano-koios": "^2.0.1", "@rosen-clients/ergo-explorer": "^1.0.3", "axios": "^1.7.0", + "ethers": "^6.13.2", "lodash-es": "^4.17.21", "typeorm": "^0.3.20" } diff --git a/packages/asset-calculator/tests/asset-calculator.spec.ts b/packages/asset-calculator/tests/asset-calculator.spec.ts index 9c8497d5..aa3119e6 100644 --- a/packages/asset-calculator/tests/asset-calculator.spec.ts +++ b/packages/asset-calculator/tests/asset-calculator.spec.ts @@ -22,6 +22,7 @@ describe('AssetCalculator', () => { }, { addresses: ['hotAddr', 'coldAddr'], koiosUrl: 'koiosUrl' }, { addresses: ['hotAddr', 'coldAddr'], esploraUrl: 'esploraUrl' }, + { addresses: ['hotAddr', 'coldAddr'], rpcUrl: 'rpcUrl' }, dataSource ); }); @@ -94,6 +95,7 @@ describe('AssetCalculator', () => { }, { addresses: ['hotAddr', 'coldAddr'], koiosUrl: 'koiosUrl' }, { addresses: ['hotAddr', 'coldAddr'], esploraUrl: 'esploraUrl' }, + { addresses: ['hotAddr', 'coldAddr'], rpcUrl: 'rpcUrl' }, dataSource ); }); @@ -160,6 +162,7 @@ describe('AssetCalculator', () => { { addresses: ['Addr'], explorerUrl: 'explorerUrl' }, { addresses: ['Addr'], koiosUrl: 'koiosUrl' }, { addresses: ['Addr'], esploraUrl: 'esploraUrl' }, + { addresses: ['Addr'], rpcUrl: 'rpcUrl' }, dataSource ); assetCalculator['calculateEmissionForChain'] = () => @@ -261,6 +264,7 @@ describe('AssetCalculator', () => { { addresses: ['Addr'], explorerUrl: 'explorerUrl' }, { addresses: ['Addr'], koiosUrl: 'koiosUrl' }, { addresses: ['Addr'], esploraUrl: 'esploraUrl' }, + { addresses: ['Addr'], rpcUrl: 'rpcUrl' }, dataSource ); await assetCalculator['tokenModel']['tokenRepository'].insert(tokens); From ee4fb44ecec1e62d23ba3897fdf49aa636acb54e Mon Sep 17 00:00:00 2001 From: "fateme.r" Date: Tue, 24 Sep 2024 17:15:26 +0330 Subject: [PATCH 125/168] Fix thrown error for unsupported tokens on some chains --- packages/asset-calculator/lib/asset-calculator.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/asset-calculator/lib/asset-calculator.ts b/packages/asset-calculator/lib/asset-calculator.ts index 7e34e258..5233ee67 100644 --- a/packages/asset-calculator/lib/asset-calculator.ts +++ b/packages/asset-calculator/lib/asset-calculator.ts @@ -136,6 +136,10 @@ class AssetCalculator { throw Error(`Chain [${chain}] is not supported in asset calculator`); const chainToken = this.getTokenDataForChain(token, residencyChain, chain); + if (!chainToken) { + this.logger.debug(`Token ${token.name} is not supported in ${chain}`); + return 0n; + } const emission = (await calculator.totalSupply(chainToken)) - (await calculator.totalBalance(chainToken)); @@ -271,8 +275,14 @@ class AssetCalculator { residencyChain ); this.logger.debug( - `Asset [${nativeResidentToken[chainIdKey]}] total locked amount is [${emission}]` + `Asset [${nativeResidentToken[chainIdKey]}] total emitted amount is [${emission}]` ); + if (!emission) { + this.logger.debug( + `Total emitted amount of asset ${nativeResidentToken.name} on ${chain} is zero. skipping bridged asset update.` + ); + continue; + } const tokenDataOnAllChains = this.tokens.search(residencyChain, { [chainIdKey]: newToken.id, From f9e0030ba89dfd58283c232b8cb0701511bb25e0 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 24 Sep 2024 15:57:45 +0000 Subject: [PATCH 126/168] chore: Enhance the Guard and Watcher app to incorporate the latest updates in API functionality and design --- .changeset/giant-trains-roll.md | 5 ++ .changeset/kind-jobs-scream.md | 6 +++ .changeset/pink-spies-lie.md | 5 ++ .changeset/shaggy-pens-hide.md | 5 ++ .changeset/young-radios-clap.md | 5 ++ .../(dashboard)/@infoWidgets/HealthWidget.tsx | 20 +++++++- apps/guard/app/_mock/mockedData.ts | 4 ++ apps/guard/app/health/page.tsx | 49 ++++++++++++++----- .../(home)/@infoWidgets/InfoWidgetCard.tsx | 23 +++++++-- apps/watcher/app/(home)/@infoWidgets/page.tsx | 1 + apps/watcher/app/_mock/mockedData.ts | 4 ++ apps/watcher/app/health/page.tsx | 49 ++++++++++++++----- packages/icons/src/icons/shield-question.svg | 3 ++ packages/icons/src/index.ts | 1 + packages/swr-helpers/src/fetcher.ts | 7 ++- packages/types/src/common.ts | 6 ++- .../src/components/common/HealthParamCard.tsx | 49 ++++++++++++++++--- 17 files changed, 201 insertions(+), 41 deletions(-) create mode 100644 .changeset/giant-trains-roll.md create mode 100644 .changeset/kind-jobs-scream.md create mode 100644 .changeset/pink-spies-lie.md create mode 100644 .changeset/shaggy-pens-hide.md create mode 100644 .changeset/young-radios-clap.md create mode 100644 packages/icons/src/icons/shield-question.svg diff --git a/.changeset/giant-trains-roll.md b/.changeset/giant-trains-roll.md new file mode 100644 index 00000000..3f9aea3f --- /dev/null +++ b/.changeset/giant-trains-roll.md @@ -0,0 +1,5 @@ +--- +'@rosen-ui/types': minor +--- + +Revise the HealthParamInfo model to align with the latest API updates diff --git a/.changeset/kind-jobs-scream.md b/.changeset/kind-jobs-scream.md new file mode 100644 index 00000000..64678036 --- /dev/null +++ b/.changeset/kind-jobs-scream.md @@ -0,0 +1,6 @@ +--- +'@rosen-bridge/watcher-app': minor +'@rosen-bridge/guard-app': minor +--- + +Enhance the app to incorporate the latest updates in API functionality and design diff --git a/.changeset/pink-spies-lie.md b/.changeset/pink-spies-lie.md new file mode 100644 index 00000000..f1ffda2e --- /dev/null +++ b/.changeset/pink-spies-lie.md @@ -0,0 +1,5 @@ +--- +'@rosen-ui/swr-helpers': minor +--- + +Implement support for the PUT method in the fetcher utilities diff --git a/.changeset/shaggy-pens-hide.md b/.changeset/shaggy-pens-hide.md new file mode 100644 index 00000000..e226c939 --- /dev/null +++ b/.changeset/shaggy-pens-hide.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/ui-kit': minor +--- + +Enhance the HealthParamCard component to accommodate emerging requirements diff --git a/.changeset/young-radios-clap.md b/.changeset/young-radios-clap.md new file mode 100644 index 00000000..3248bb59 --- /dev/null +++ b/.changeset/young-radios-clap.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/icons': minor +--- + +Add the ShieldQuestion icon diff --git a/apps/guard/app/(dashboard)/@infoWidgets/HealthWidget.tsx b/apps/guard/app/(dashboard)/@infoWidgets/HealthWidget.tsx index 86d5ce35..4e2599af 100644 --- a/apps/guard/app/(dashboard)/@infoWidgets/HealthWidget.tsx +++ b/apps/guard/app/(dashboard)/@infoWidgets/HealthWidget.tsx @@ -1,8 +1,14 @@ import React from 'react'; import useSWR from 'swr'; -import { ShieldCheck } from '@rosen-bridge/icons'; -import { Card, CircularProgress, SvgIcon, styled } from '@rosen-bridge/ui-kit'; +import { Alert, ShieldCheck } from '@rosen-bridge/icons'; +import { + Card, + CircularProgress, + SvgIcon, + Tooltip, + styled, +} from '@rosen-bridge/ui-kit'; import { healthStatusColorMap } from '@rosen-ui/constants'; import { fetcher } from '@rosen-ui/swr-helpers'; import { AugmentedPalette } from '@rosen-ui/types'; @@ -34,6 +40,9 @@ const HealthWidgetBase = styled(Card)( marginLeft: theme.spacing(2), marginRight: theme.spacing(1), }, + '& strong': { + flexGrow: 1, + }, }), ); @@ -61,6 +70,13 @@ const HealthWidget = () => { Health is {info.health.status} + {!!info.health.trialErrors.length && ( + + + + + + )} ) )} diff --git a/apps/guard/app/_mock/mockedData.ts b/apps/guard/app/_mock/mockedData.ts index 61ea6b38..91e5ad19 100644 --- a/apps/guard/app/_mock/mockedData.ts +++ b/apps/guard/app/_mock/mockedData.ts @@ -244,18 +244,21 @@ const assets = [ const healthStatus: ApiHealthStatusResponse = [ { status: 'Unstable', + description: 'Error Logs Description', lastCheck: '2023-06-26T11:15:43.189Z', id: 'error logs', title: 'Error Logs', }, { status: 'Healthy', + description: 'Wid Check Description', lastCheck: '2023-06-26T11:15:43.642Z', id: 'Wid Check', title: 'Wid Check', }, { status: 'Healthy', + description: 'Native Asset erg Check Description', lastCheck: '2023-06-26T11:15:43.509Z', id: 'Native Asset erg Check', title: 'Native Asset erg Check', @@ -270,6 +273,7 @@ const healthStatus: ApiHealthStatusResponse = [ }, { status: 'Healthy', + description: 'Ergo Node Sync Check Description', lastCheck: '2023-06-26T11:15:45.206Z', id: 'Ergo Node Sync Check', title: 'Ergo Node Sync Check', diff --git a/apps/guard/app/health/page.tsx b/apps/guard/app/health/page.tsx index 430618b3..60d4b9e1 100644 --- a/apps/guard/app/health/page.tsx +++ b/apps/guard/app/health/page.tsx @@ -1,6 +1,6 @@ 'use client'; -import { useCallback } from 'react'; +import { useCallback, useState } from 'react'; import useSWR from 'swr'; import { @@ -17,6 +17,8 @@ import { ApiHealthStatusResponse } from '@/_types/api'; import { HEALTH_DATA_REFRESH_INTERVAL } from '@rosen-ui/constants'; const Health = () => { + const [checking, setChecking] = useState([]); + const { data, isLoading, mutate } = useSWR( '/health/status', fetcher, @@ -34,20 +36,42 @@ const Health = () => { */ const handleCheckNow = useCallback( async (paramId: string) => { - const newHealthParamInfo: HealthParamInfo = await fetcher( - `/health/parameter/${paramId}`, - ); + setChecking((checking) => checking.concat(paramId)); - const healthParamIndex = data!.findIndex( - (healthParam) => healthParam.id === paramId, - ); - openSnackbar(paramId + ' status updated', 'info'); + let newHealthParamInfo: HealthParamInfo; - mutate([ - ...data!.slice(0, healthParamIndex), - newHealthParamInfo, - ...data!.slice(healthParamIndex + 1), + const currentHealthParamInfo: HealthParamInfo = await fetcher([ + `/health/parameter/${paramId}`, + undefined, + 'put', ]); + + const trying = async () => { + newHealthParamInfo = await fetcher(`/health/parameter/${paramId}`); + + if ( + currentHealthParamInfo.lastCheck === newHealthParamInfo.lastCheck && + currentHealthParamInfo.lastTrialErrorTime === + newHealthParamInfo.lastTrialErrorTime + ) { + return void setTimeout(trying, 5000); + } + + setChecking((checking) => checking.filter((item) => item != paramId)); + + const healthParamIndex = data!.findIndex( + (healthParam) => healthParam.id === paramId, + ); + openSnackbar(paramId + ' status updated', 'info'); + + mutate([ + ...data!.slice(0, healthParamIndex), + newHealthParamInfo, + ...data!.slice(healthParamIndex + 1), + ]); + }; + + await trying(); }, [data, mutate, openSnackbar], ); @@ -73,6 +97,7 @@ const Health = () => { handleCheckNow(item.id)} /> diff --git a/apps/watcher/app/(home)/@infoWidgets/InfoWidgetCard.tsx b/apps/watcher/app/(home)/@infoWidgets/InfoWidgetCard.tsx index 5a73a8e7..56365d6e 100644 --- a/apps/watcher/app/(home)/@infoWidgets/InfoWidgetCard.tsx +++ b/apps/watcher/app/(home)/@infoWidgets/InfoWidgetCard.tsx @@ -4,10 +4,13 @@ import { Box, Card, CircularProgress, + SvgIcon, + Tooltip, Typography, styled, } from '@rosen-bridge/ui-kit'; import { AugmentedPalette } from '@rosen-ui/types'; +import { Alert } from '@rosen-bridge/icons'; interface InfoWidgetCardBaseProps { widgetColor: keyof AugmentedPalette; @@ -44,6 +47,9 @@ const InfoWidgetCardBase = styled(Card)( fontSize: theme.typography.h6.fontSize, fontWeight: 'bold', lineHeight: 1, + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', '& span': { fontSize: '60%', fontWeight: 'normal', @@ -67,6 +73,7 @@ interface InfoWidgetCardProps { title: string; unit?: string; value: string; + warning?: string; } /** * render an info widget card containing data @@ -85,6 +92,7 @@ const InfoWidgetCard = ({ title, unit, value, + warning, }: InfoWidgetCardProps) => { return ( @@ -96,9 +104,18 @@ const InfoWidgetCard = ({ ) : ( - {value} -   - {unit} +
+ {value} +   + {unit}dsds +
+ {warning && ( + + + + + + )}
)} {title} diff --git a/apps/watcher/app/(home)/@infoWidgets/page.tsx b/apps/watcher/app/(home)/@infoWidgets/page.tsx index 8f48b7da..b26f0df7 100644 --- a/apps/watcher/app/(home)/@infoWidgets/page.tsx +++ b/apps/watcher/app/(home)/@infoWidgets/page.tsx @@ -201,6 +201,7 @@ const InfoWidgets = () => { : 'success' } isLoading={isInfoLoading} + warning={data?.health.trialErrors.join('. ')} /> diff --git a/apps/watcher/app/_mock/mockedData.ts b/apps/watcher/app/_mock/mockedData.ts index 2fda436f..cd95a0ec 100644 --- a/apps/watcher/app/_mock/mockedData.ts +++ b/apps/watcher/app/_mock/mockedData.ts @@ -199,18 +199,21 @@ const revenueChart = { const healthStatus: ApiHealthStatusResponse = [ { status: 'Unstable', + description: 'Error Logs Description', lastCheck: '2023-06-26T11:15:43.189Z', id: 'error logs', title: 'Error Logs', }, { status: 'Healthy', + description: 'Wid Check Description', lastCheck: '2023-06-26T11:15:43.642Z', id: 'Wid Check', title: 'Wid Check', }, { status: 'Healthy', + description: 'Native Asset erg Check Description', lastCheck: '2023-06-26T11:15:43.509Z', id: 'Native Asset erg Check', title: 'Native Asset erg Check', @@ -225,6 +228,7 @@ const healthStatus: ApiHealthStatusResponse = [ }, { status: 'Healthy', + description: 'Ergo Node Sync Check Description', lastCheck: '2023-06-26T11:15:45.206Z', id: 'Ergo Node Sync Check', title: 'Ergo Node Sync Check', diff --git a/apps/watcher/app/health/page.tsx b/apps/watcher/app/health/page.tsx index 430618b3..60d4b9e1 100644 --- a/apps/watcher/app/health/page.tsx +++ b/apps/watcher/app/health/page.tsx @@ -1,6 +1,6 @@ 'use client'; -import { useCallback } from 'react'; +import { useCallback, useState } from 'react'; import useSWR from 'swr'; import { @@ -17,6 +17,8 @@ import { ApiHealthStatusResponse } from '@/_types/api'; import { HEALTH_DATA_REFRESH_INTERVAL } from '@rosen-ui/constants'; const Health = () => { + const [checking, setChecking] = useState([]); + const { data, isLoading, mutate } = useSWR( '/health/status', fetcher, @@ -34,20 +36,42 @@ const Health = () => { */ const handleCheckNow = useCallback( async (paramId: string) => { - const newHealthParamInfo: HealthParamInfo = await fetcher( - `/health/parameter/${paramId}`, - ); + setChecking((checking) => checking.concat(paramId)); - const healthParamIndex = data!.findIndex( - (healthParam) => healthParam.id === paramId, - ); - openSnackbar(paramId + ' status updated', 'info'); + let newHealthParamInfo: HealthParamInfo; - mutate([ - ...data!.slice(0, healthParamIndex), - newHealthParamInfo, - ...data!.slice(healthParamIndex + 1), + const currentHealthParamInfo: HealthParamInfo = await fetcher([ + `/health/parameter/${paramId}`, + undefined, + 'put', ]); + + const trying = async () => { + newHealthParamInfo = await fetcher(`/health/parameter/${paramId}`); + + if ( + currentHealthParamInfo.lastCheck === newHealthParamInfo.lastCheck && + currentHealthParamInfo.lastTrialErrorTime === + newHealthParamInfo.lastTrialErrorTime + ) { + return void setTimeout(trying, 5000); + } + + setChecking((checking) => checking.filter((item) => item != paramId)); + + const healthParamIndex = data!.findIndex( + (healthParam) => healthParam.id === paramId, + ); + openSnackbar(paramId + ' status updated', 'info'); + + mutate([ + ...data!.slice(0, healthParamIndex), + newHealthParamInfo, + ...data!.slice(healthParamIndex + 1), + ]); + }; + + await trying(); }, [data, mutate, openSnackbar], ); @@ -73,6 +97,7 @@ const Health = () => { handleCheckNow(item.id)} /> diff --git a/packages/icons/src/icons/shield-question.svg b/packages/icons/src/icons/shield-question.svg new file mode 100644 index 00000000..8a444e2e --- /dev/null +++ b/packages/icons/src/icons/shield-question.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/icons/src/index.ts b/packages/icons/src/index.ts index 501cd562..97fca35f 100644 --- a/packages/icons/src/index.ts +++ b/packages/icons/src/index.ts @@ -32,6 +32,7 @@ export { ReactComponent as Setting } from './icons/setting.svg'; export { ReactComponent as Share } from './icons/share.svg'; export { ReactComponent as ShieldCheck } from './icons/shield-check.svg'; export { ReactComponent as ShieldExclamation } from './icons/shield-exclamation.svg'; +export { ReactComponent as ShieldQuestion } from './icons/shield-question.svg'; export { ReactComponent as SquareShape } from './icons/square-shape.svg'; export { ReactComponent as StopCircle } from './icons/stop-circle.svg'; export { ReactComponent as Sun } from './icons/sun.svg'; diff --git a/packages/swr-helpers/src/fetcher.ts b/packages/swr-helpers/src/fetcher.ts index 907734a7..e20433d4 100644 --- a/packages/swr-helpers/src/fetcher.ts +++ b/packages/swr-helpers/src/fetcher.ts @@ -12,9 +12,12 @@ axios.defaults.baseURL = '/api'; * @param params */ const fetcher = async ( - key: [url: string, params?: Record] | string + key: + | [url: string, params?: Record, method?: 'get' | 'put'] + | string ) => { - const response = await axios.get(typeof key === 'string' ? key : key[0], { + const method = (typeof key !== 'string' && key[2]) || 'get'; + const response = await axios[method](typeof key === 'string' ? key : key[0], { params: typeof key === 'string' ? undefined : key[1], /** * FIXME: Transform response to handle bigint values diff --git a/packages/types/src/common.ts b/packages/types/src/common.ts index ea72ee2a..2cfc1f81 100644 --- a/packages/types/src/common.ts +++ b/packages/types/src/common.ts @@ -25,8 +25,10 @@ export interface HealthParamInfo { title: string; details?: string; status: 'Healthy' | 'Unstable' | 'Broken'; - lastCheck: string; - description?: string; + lastCheck?: string; + description: string; + lastTrialErrorMessage?: string; + lastTrialErrorTime?: string; } export interface Paginated { diff --git a/packages/ui-kit/src/components/common/HealthParamCard.tsx b/packages/ui-kit/src/components/common/HealthParamCard.tsx index 0e870258..04103442 100644 --- a/packages/ui-kit/src/components/common/HealthParamCard.tsx +++ b/packages/ui-kit/src/components/common/HealthParamCard.tsx @@ -1,14 +1,20 @@ import moment from 'moment'; import { useMemo } from 'react'; -import { ShieldCheck, ShieldExclamation } from '@rosen-bridge/icons'; +import { + Alert as AlertIcon, + ShieldCheck, + ShieldExclamation, + ShieldQuestion, +} from '@rosen-bridge/icons'; import { HealthParamInfo } from '@rosen-ui/types'; import { FullCard } from '.'; import { useTheme } from '../../hooks'; -import { Alert, Button, SvgIcon, Typography } from '../base'; +import { Alert, Button, SvgIcon, Tooltip, Typography } from '../base'; export type HealthParamCardProps = HealthParamInfo & { + checking?: boolean; handleCheckNow: () => void; }; /** @@ -29,11 +35,15 @@ export const HealthParamCard = ({ status, description, lastCheck, + lastTrialErrorMessage, + lastTrialErrorTime, + checking, handleCheckNow, }: HealthParamCardProps) => { const theme = useTheme(); const color = useMemo(() => { + if (!lastCheck) return 'warning'; switch (status) { case 'Healthy': return 'success'; @@ -42,23 +52,44 @@ export const HealthParamCard = ({ default: return 'error'; } - }, [status]); + }, [lastCheck, status]); + + const Icon = useMemo(() => { + if (!lastCheck) return ShieldQuestion; + if (status === 'Healthy') return ShieldCheck; + return ShieldExclamation; + }, [lastCheck, status]); return ( + {lastCheck ? status : 'Unknown'} + {lastTrialErrorTime && ( + + + + + + )} + + ), avatar: ( - {status === 'Healthy' ? : } + ), sx: { color: `${color}.${ theme.palette.mode === 'light' ? 'dark' : 'light' }`, - '& span': { color: 'inherit' }, + '& span': { + color: 'inherit', + display: 'flex', + justifyContent: 'space-between', + }, }, }} contentProps={{ @@ -69,14 +100,16 @@ export const HealthParamCard = ({ {/* Note that "Check now" feature only works with a real watcher instance and its functionality cannot be mocked now */} - (Last check: {moment(lastCheck).format('DD/MM/YYYY HH:mm:ss')}) + {lastCheck && + `(Last check: ${moment(lastCheck).format('DD/MM/YYYY HH:mm:ss')})`} } > From c47bbff04889141192eca43e980e9bf15e2224fd Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 25 Sep 2024 08:43:42 +0000 Subject: [PATCH 127/168] chore: Enhance the sidebar to display the contract version and the tokens map version --- apps/guard/app/SideBar.tsx | 55 +++++++++++++++++++--------- apps/guard/app/_mock/mockedData.ts | 5 +++ apps/guard/app/_types/api.ts | 5 +++ apps/watcher/app/SideBar.tsx | 27 ++++++++++++++ apps/watcher/app/_mock/mockedData.ts | 5 +++ apps/watcher/app/_types/api.ts | 5 +++ 6 files changed, 85 insertions(+), 17 deletions(-) diff --git a/apps/guard/app/SideBar.tsx b/apps/guard/app/SideBar.tsx index 69db2230..45fece67 100644 --- a/apps/guard/app/SideBar.tsx +++ b/apps/guard/app/SideBar.tsx @@ -122,23 +122,17 @@ const SideBar = () => { - { - - {!isLoading ? ( - - Guard v{info?.version ?? '?'} - - ) : ( - - - - )} - - } + + {!isLoading ? ( + + Guard v{info?.version ?? '?'} + + ) : ( + + + + )} + { UI v{packageJson.version} + + {!isLoading ? ( + + Contract v{info?.versions?.contract ?? '?'} + + ) : ( + + + + )} + + {!isLoading && + info?.versions?.contract !== info?.versions?.tokensMap && ( + + + Tokens v{info?.versions?.tokensMap ?? '?'} + + + )} ); diff --git a/apps/guard/app/_mock/mockedData.ts b/apps/guard/app/_mock/mockedData.ts index c5eb9e83..5358fb41 100644 --- a/apps/guard/app/_mock/mockedData.ts +++ b/apps/guard/app/_mock/mockedData.ts @@ -78,6 +78,11 @@ const info: ApiInfoResponse = { rsnTokenId: '85baefff2eb9e45b04f8b4e6265e866773db6db5f9e8e30ce2cae1aa263b90gg', version: '2.5.1', + versions: { + app: '', + contract: '', + tokensMap: '', + }, }; const revenueChartWeekly: ApiRevenueChartResponse = [ diff --git a/apps/guard/app/_types/api.ts b/apps/guard/app/_types/api.ts index 7e14ed18..405b3a8b 100644 --- a/apps/guard/app/_types/api.ts +++ b/apps/guard/app/_types/api.ts @@ -25,6 +25,11 @@ export interface ApiInfoResponse { cold: TokenInfoWithAddress[]; }; version: string; + versions: { + app: string; + contract: string; + tokensMap: string; + }; } export interface GuardTokenInfo extends TokenInfoWithColdAmount { diff --git a/apps/watcher/app/SideBar.tsx b/apps/watcher/app/SideBar.tsx index 23b42ee6..8f87c2ad 100644 --- a/apps/watcher/app/SideBar.tsx +++ b/apps/watcher/app/SideBar.tsx @@ -135,6 +135,33 @@ const SideBar = () => { UI v{packageJson.version} + + {!isLoading ? ( + + Contract v{info?.versions?.contract ?? '?'} + + ) : ( + + + + )} + + {!isLoading && + info?.versions?.contract !== info?.versions?.tokensMap && ( + + + Tokens v{info?.versions?.tokensMap ?? '?'} + + + )} ); diff --git a/apps/watcher/app/_mock/mockedData.ts b/apps/watcher/app/_mock/mockedData.ts index f1b6292e..e5e4ef70 100644 --- a/apps/watcher/app/_mock/mockedData.ts +++ b/apps/watcher/app/_mock/mockedData.ts @@ -40,6 +40,11 @@ const info: ApiInfoResponse = { eRsnTokenId: '6c1526b2a5ef010edb622719d9d7fbde8437a39543547c3effbe72ad33504cf2', version: '2.5.1', + versions: { + app: '', + contract: '', + tokensMap: '', + }, }; const addressAssets: ApiAddressAssetsResponse = { diff --git a/apps/watcher/app/_types/api.ts b/apps/watcher/app/_types/api.ts index 1f0112df..4ef06730 100644 --- a/apps/watcher/app/_types/api.ts +++ b/apps/watcher/app/_types/api.ts @@ -27,6 +27,11 @@ export interface ApiInfoResponse { rsnTokenId: string; eRsnTokenId: string; version: string; + versions: { + app: string; + contract: string; + tokensMap: string; + }; } export type ApiAddressAssetsResponse = Paginated; From 82227c29d9fbae84f1c7988406d3effd91c3a1e9 Mon Sep 17 00:00:00 2001 From: "fateme.r" Date: Wed, 25 Sep 2024 12:18:45 +0330 Subject: [PATCH 128/168] Fix chain type in evm calculator --- .../asset-calculator/lib/calculator/chains/evm-calculator.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/asset-calculator/lib/calculator/chains/evm-calculator.ts b/packages/asset-calculator/lib/calculator/chains/evm-calculator.ts index fb4bd208..6a44149b 100644 --- a/packages/asset-calculator/lib/calculator/chains/evm-calculator.ts +++ b/packages/asset-calculator/lib/calculator/chains/evm-calculator.ts @@ -5,13 +5,14 @@ import { NATIVE_TOKEN, RosenChainToken, TokenMap } from '@rosen-bridge/tokens'; import { AbstractLogger } from '@rosen-bridge/abstract-logger'; import { zipWith } from 'lodash-es'; import { ethers, JsonRpcProvider } from 'ethers'; +import { Network } from '@rosen-ui/types'; export class EvmCalculator extends AbstractCalculator { - readonly chain; + readonly chain: Network; private readonly provider: JsonRpcProvider; constructor( - chain: string, + chain: Network, tokenMap: TokenMap, addresses: string[], url: string, From 3f470b9cdb64d226f1d896399c898a51b0bef882 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Wed, 25 Sep 2024 10:09:07 +0000 Subject: [PATCH 129/168] chore: Fix some desgin issues in gaurd and watcher --- .../app/(dashboard)/@infoWidgets/HealthWidget.tsx | 8 +++++++- .../app/(home)/@infoWidgets/InfoWidgetCard.tsx | 6 ++++-- apps/watcher/app/(home)/@infoWidgets/page.tsx | 2 +- packages/icons/src/icons/shield-question.svg | 2 +- .../ui-kit/src/components/common/HealthParamCard.tsx | 11 ++++++----- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/apps/guard/app/(dashboard)/@infoWidgets/HealthWidget.tsx b/apps/guard/app/(dashboard)/@infoWidgets/HealthWidget.tsx index 4e2599af..12541ce7 100644 --- a/apps/guard/app/(dashboard)/@infoWidgets/HealthWidget.tsx +++ b/apps/guard/app/(dashboard)/@infoWidgets/HealthWidget.tsx @@ -71,7 +71,13 @@ const HealthWidget = () => { Health is {info.health.status} {!!info.health.trialErrors.length && ( - + + {info.health.trialErrors.join('\n')} + + } + > diff --git a/apps/watcher/app/(home)/@infoWidgets/InfoWidgetCard.tsx b/apps/watcher/app/(home)/@infoWidgets/InfoWidgetCard.tsx index 56365d6e..1a12ab33 100644 --- a/apps/watcher/app/(home)/@infoWidgets/InfoWidgetCard.tsx +++ b/apps/watcher/app/(home)/@infoWidgets/InfoWidgetCard.tsx @@ -107,10 +107,12 @@ const InfoWidgetCard = ({
{value}   - {unit}dsds + {unit}
{warning && ( - + {warning}} + > diff --git a/apps/watcher/app/(home)/@infoWidgets/page.tsx b/apps/watcher/app/(home)/@infoWidgets/page.tsx index b26f0df7..30d9aef1 100644 --- a/apps/watcher/app/(home)/@infoWidgets/page.tsx +++ b/apps/watcher/app/(home)/@infoWidgets/page.tsx @@ -201,7 +201,7 @@ const InfoWidgets = () => { : 'success' } isLoading={isInfoLoading} - warning={data?.health.trialErrors.join('. ')} + warning={data?.health.trialErrors.join('\n')} /> diff --git a/packages/icons/src/icons/shield-question.svg b/packages/icons/src/icons/shield-question.svg index 8a444e2e..4da48c35 100644 --- a/packages/icons/src/icons/shield-question.svg +++ b/packages/icons/src/icons/shield-question.svg @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/packages/ui-kit/src/components/common/HealthParamCard.tsx b/packages/ui-kit/src/components/common/HealthParamCard.tsx index 04103442..2a6f1265 100644 --- a/packages/ui-kit/src/components/common/HealthParamCard.tsx +++ b/packages/ui-kit/src/components/common/HealthParamCard.tsx @@ -11,7 +11,7 @@ import { HealthParamInfo } from '@rosen-ui/types'; import { FullCard } from '.'; import { useTheme } from '../../hooks'; -import { Alert, Button, SvgIcon, Tooltip, Typography } from '../base'; +import { Alert, LoadingButton, SvgIcon, Tooltip, Typography } from '../base'; export type HealthParamCardProps = HealthParamInfo & { checking?: boolean; @@ -43,7 +43,7 @@ export const HealthParamCard = ({ const theme = useTheme(); const color = useMemo(() => { - if (!lastCheck) return 'warning'; + if (!lastCheck) return 'primary'; switch (status) { case 'Healthy': return 'success'; @@ -99,15 +99,16 @@ export const HealthParamCard = ({ {/* Note that "Check now" feature only works with a real watcher instance and its functionality cannot be mocked now */} - + {lastCheck && `(Last check: ${moment(lastCheck).format('DD/MM/YYYY HH:mm:ss')})`} From 6e70f5237df65f087ce1a1acb0dcb78ba2707cd1 Mon Sep 17 00:00:00 2001 From: "fateme.r" Date: Wed, 25 Sep 2024 14:22:57 +0330 Subject: [PATCH 130/168] fix asset calculator instance inputs --- apps/rosen-service/src/calculator/calculator-service.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/rosen-service/src/calculator/calculator-service.ts b/apps/rosen-service/src/calculator/calculator-service.ts index a9c9121a..2f4a1425 100644 --- a/apps/rosen-service/src/calculator/calculator-service.ts +++ b/apps/rosen-service/src/calculator/calculator-service.ts @@ -60,6 +60,10 @@ const start = async () => { addresses: config.calculator.addresses.bitcoin, esploraUrl: config.bitcoin.esploraUrl, }, + { + addresses: [], + rpcUrl: '', + }, dataSource, logger ); From 04d3bf9f49deceef5241268d72404aed15f94617 Mon Sep 17 00:00:00 2001 From: "fateme.r" Date: Wed, 25 Sep 2024 15:44:15 +0330 Subject: [PATCH 131/168] Add changeset --- .changeset/spicy-bees-obey.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/spicy-bees-obey.md diff --git a/.changeset/spicy-bees-obey.md b/.changeset/spicy-bees-obey.md new file mode 100644 index 00000000..cdbb1ad8 --- /dev/null +++ b/.changeset/spicy-bees-obey.md @@ -0,0 +1,5 @@ +--- +'@rosen-ui/asset-calculator': minor +--- + +Add evm asset calculator and ethereum calculator interface From 4ae4c3bdce335b5280777b85cce9dada7455e0e7 Mon Sep 17 00:00:00 2001 From: HFazelinia Date: Wed, 25 Sep 2024 16:16:31 +0330 Subject: [PATCH 132/168] integrate ethereum scanner and extractor into rosen-service --- .changeset/funny-jokes-sort.md | 5 + apps/rosen-service/config/default.yaml | 11 + apps/rosen-service/package.json | 12 +- apps/rosen-service/src/configs.ts | 16 + apps/rosen-service/src/constants.ts | 2 + .../event-trigger/event-trigger-service.ts | 13 + .../src/observation/chains/ethereum.ts | 44 ++ .../src/observation/observation-service.ts | 2 + .../src/scanner/chains/ethereum.ts | 58 +++ .../src/scanner/scanner-service.ts | 14 +- package-lock.json | 395 +++++++++++++++--- 11 files changed, 494 insertions(+), 78 deletions(-) create mode 100644 .changeset/funny-jokes-sort.md create mode 100644 apps/rosen-service/src/observation/chains/ethereum.ts create mode 100644 apps/rosen-service/src/scanner/chains/ethereum.ts diff --git a/.changeset/funny-jokes-sort.md b/.changeset/funny-jokes-sort.md new file mode 100644 index 00000000..f898ee54 --- /dev/null +++ b/.changeset/funny-jokes-sort.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-service': major +--- + +initialize Ethereum scanner and Extractor diff --git a/apps/rosen-service/config/default.yaml b/apps/rosen-service/config/default.yaml index c6a2ef3b..ed221461 100644 --- a/apps/rosen-service/config/default.yaml +++ b/apps/rosen-service/config/default.yaml @@ -32,6 +32,17 @@ bitcoin: rwt: initialHeight: esploraUrl: https://blockstream.info +ethereum: + addresses: + lock: + eventTrigger: + permit: + fraud: + tokens: + rwt: + initialHeight: + rpcUrl: https://eth-mainnet.public.blastapi.io + rpcAuthToken: postgres: url: # postgresql://username:password@host:port/databasename logging: false diff --git a/apps/rosen-service/package.json b/apps/rosen-service/package.json index 180a505c..ad38214e 100644 --- a/apps/rosen-service/package.json +++ b/apps/rosen-service/package.json @@ -17,12 +17,14 @@ "get-config": "npx @rosen-bridge/cli download-assets --chain-type mainnet --out config --include-prereleases" }, "dependencies": { - "@rosen-bridge/bitcoin-esplora-scanner": "^0.1.5", - "@rosen-bridge/bitcoin-observation-extractor": "^3.0.0", + "@rosen-bridge/bitcoin-esplora-scanner": "^0.1.14", + "@rosen-bridge/bitcoin-observation-extractor": "^4.0.7", + "@rosen-bridge/evm-observation-extractor": "^3.0.5", + "@rosen-bridge/evm-rpc-scanner": "^1.0.4", "@rosen-bridge/extended-typeorm": "^0.0.3", - "@rosen-bridge/observation-extractor": "^4.4.4", - "@rosen-bridge/scanner": "^4.0.0", - "@rosen-bridge/watcher-data-extractor": "^6.0.0", + "@rosen-bridge/observation-extractor": "^5.0.7", + "@rosen-bridge/scanner": "^4.1.3", + "@rosen-bridge/watcher-data-extractor": "^8.0.2", "@rosen-bridge/winston-logger": "^0.2.1", "@rosen-ui/asset-calculator": "^1.0.1", "config": "^3.3.7" diff --git a/apps/rosen-service/src/configs.ts b/apps/rosen-service/src/configs.ts index 36cebd5e..6fc38628 100644 --- a/apps/rosen-service/src/configs.ts +++ b/apps/rosen-service/src/configs.ts @@ -52,6 +52,22 @@ const getConfig = () => { }, esploraUrl: nodeConfig.get('bitcoin.esploraUrl'), }, + ethereum: { + addresses: { + lock: nodeConfig.get('ethereum.addresses.lock'), + eventTrigger: nodeConfig.get( + 'ethereum.addresses.eventTrigger' + ), + permit: nodeConfig.get('ethereum.addresses.permit'), + fraud: nodeConfig.get('ethereum.addresses.fraud'), + }, + initialHeight: nodeConfig.get('ethereum.initialHeight'), + tokens: { + rwt: nodeConfig.get('ethereum.tokens.rwt'), + }, + rpcUrl: nodeConfig.get('ethereum.rpcUrl'), + rpcAuthToken: nodeConfig.get('ethereum.rpcAuthToken'), + }, postgres: { url: nodeConfig.get('postgres.url'), logging: nodeConfig.get('postgres.logging'), diff --git a/apps/rosen-service/src/constants.ts b/apps/rosen-service/src/constants.ts index 751e33e9..77be0b9b 100644 --- a/apps/rosen-service/src/constants.ts +++ b/apps/rosen-service/src/constants.ts @@ -3,8 +3,10 @@ export const SCANNER_API_TIMEOUT = 10_000; export const ERGO_SCANNER_INTERVAL = 2 * 60 * 1000; export const CARDANO_SCANNER_INTERVAL = 30 * 1000; export const BITCOIN_SCANNER_INTERVAL = 10 * 60 * 1000; +export const ETHEREUM_SCANNER_INTERVAL = 60 * 1000; export const ASSET_CALCULATOR_INTERVAL = 30 * 1000; export const ERGO_SCANNER_LOGGER_NAME = 'ergo-scanner'; export const CARDANO_SCANNER_LOGGER_NAME = 'cardano-scanner'; export const BITCOIN_SCANNER_LOGGER_NAME = 'bitcoin-scanner'; +export const ETHEREUM_SCANNER_LOGGER_NAME = 'ethereum-scanner'; diff --git a/apps/rosen-service/src/event-trigger/event-trigger-service.ts b/apps/rosen-service/src/event-trigger/event-trigger-service.ts index 73e6370a..c7167ee3 100644 --- a/apps/rosen-service/src/event-trigger/event-trigger-service.ts +++ b/apps/rosen-service/src/event-trigger/event-trigger-service.ts @@ -16,6 +16,8 @@ const cardanoEventTriggerExtractorLogger = WinstonLogger.getInstance().getLogger('cardano-event-trigger-extractor'); const bitcoinEventTriggerExtractorLogger = WinstonLogger.getInstance().getLogger('bitcoin-event-trigger-extractor'); +const ethereumEventTriggerExtractorLogger = + WinstonLogger.getInstance().getLogger('ethereum-event-trigger-extractor'); /** * register event trigger extractors for all chains @@ -50,10 +52,20 @@ export const registerExtractors = (scanner: ErgoScanner) => { configs.bitcoin.addresses.fraud, bitcoinEventTriggerExtractorLogger ); + const ethereumEventTriggerExtractor = new EventTriggerExtractor( + 'ethereum-extractor', + dataSource, + configs.ethereum.addresses.eventTrigger, + configs.ethereum.tokens.rwt, + configs.ethereum.addresses.permit, + configs.ethereum.addresses.fraud, + ethereumEventTriggerExtractorLogger + ); scanner.registerExtractor(ergoEventTriggerExtractor); scanner.registerExtractor(cardanoEventTriggerExtractor); scanner.registerExtractor(bitcoinEventTriggerExtractor); + scanner.registerExtractor(ethereumEventTriggerExtractor); logger.debug('event trigger extractors registered', { scannerName: scanner.name(), @@ -61,6 +73,7 @@ export const registerExtractors = (scanner: ErgoScanner) => { ergoEventTriggerExtractor.getId(), cardanoEventTriggerExtractor.getId(), bitcoinEventTriggerExtractor.getId(), + ethereumEventTriggerExtractor.getId(), ], }); } catch (error) { diff --git a/apps/rosen-service/src/observation/chains/ethereum.ts b/apps/rosen-service/src/observation/chains/ethereum.ts new file mode 100644 index 00000000..1f733c59 --- /dev/null +++ b/apps/rosen-service/src/observation/chains/ethereum.ts @@ -0,0 +1,44 @@ +import { EthereumRpcObservationExtractor } from '@rosen-bridge/evm-observation-extractor'; +import WinstonLogger from '@rosen-bridge/winston-logger'; + +import { getRosenTokens } from '../../utils'; + +import config from '../../configs'; + +import dataSource from '../../data-source'; + +import AppError from '../../errors/AppError'; +import { EvmRpcScanner } from '@rosen-bridge/evm-rpc-scanner'; + +const logger = WinstonLogger.getInstance().getLogger(import.meta.url); + +/** + * register an observation extractor for the provided scanner + * @param scanner + */ +export const registerEthereumExtractor = (scanner: EvmRpcScanner) => { + try { + const observationExtractor = new EthereumRpcObservationExtractor( + config.ethereum.addresses.lock, + dataSource, + getRosenTokens(), + logger + ); + + scanner.registerExtractor(observationExtractor); + + logger.debug('ethereum observation extractor registered', { + scannerName: scanner.name(), + }); + } catch (error) { + throw new AppError( + `cannot create or register ethereum observation extractor due to error: ${error}`, + false, + 'error', + error instanceof Error ? error.stack : undefined, + { + scannerName: scanner.name(), + } + ); + } +}; diff --git a/apps/rosen-service/src/observation/observation-service.ts b/apps/rosen-service/src/observation/observation-service.ts index d8132e4d..58d3ec6e 100644 --- a/apps/rosen-service/src/observation/observation-service.ts +++ b/apps/rosen-service/src/observation/observation-service.ts @@ -1,11 +1,13 @@ import { registerBitcoinExtractor } from './chains/bitcoin'; import { registerCardanoExtractor } from './chains/cardano'; import { registerErgoExtractor } from './chains/ergo'; +import { registerEthereumExtractor } from './chains/ethereum'; const observationService = { registerBitcoinExtractor, registerCardanoExtractor, registerErgoExtractor, + registerEthereumExtractor, }; export default observationService; diff --git a/apps/rosen-service/src/scanner/chains/ethereum.ts b/apps/rosen-service/src/scanner/chains/ethereum.ts new file mode 100644 index 00000000..d3cfeeac --- /dev/null +++ b/apps/rosen-service/src/scanner/chains/ethereum.ts @@ -0,0 +1,58 @@ +import { EvmRpcScanner } from '@rosen-bridge/evm-rpc-scanner'; +import WinstonLogger from '@rosen-bridge/winston-logger'; + +import dataSource from '../../data-source'; + +import { startScanner } from '../scanner-utils'; + +import observationService from '../../observation/observation-service'; + +import config from '../../configs'; + +import { + ETHEREUM_SCANNER_INTERVAL, + ETHEREUM_SCANNER_LOGGER_NAME, + SCANNER_API_TIMEOUT, +} from '../../constants'; + +import AppError from '../../errors/AppError'; + +const logger = WinstonLogger.getInstance().getLogger(import.meta.url); +const scannerLogger = WinstonLogger.getInstance().getLogger( + ETHEREUM_SCANNER_LOGGER_NAME +); + +/** + * create a ethereum scanner, initializing it and calling its update method + * periodically + */ +export const startEthereumScanner = async () => { + try { + const scanner = new EvmRpcScanner( + 'ethereum', + { + RpcUrl: config.ethereum.rpcUrl, + dataSource, + initialHeight: config.ethereum.initialHeight, + timeout: SCANNER_API_TIMEOUT, + }, + scannerLogger, + config.ethereum.rpcAuthToken + ); + + observationService.registerEthereumExtractor(scanner); + + await startScanner(scanner, import.meta.url, ETHEREUM_SCANNER_INTERVAL); + + logger.debug('ethereum scanner started'); + + return scanner; + } catch (error) { + throw new AppError( + `cannot create or start ethereum scanner due to error: ${error}`, + false, + 'error', + error instanceof Error ? error.stack : undefined + ); + } +}; diff --git a/apps/rosen-service/src/scanner/scanner-service.ts b/apps/rosen-service/src/scanner/scanner-service.ts index 8ac009fb..ef65bdf0 100644 --- a/apps/rosen-service/src/scanner/scanner-service.ts +++ b/apps/rosen-service/src/scanner/scanner-service.ts @@ -3,6 +3,7 @@ import WinstonLogger from '@rosen-bridge/winston-logger/dist/WinstonLogger'; import { startBitcoinScanner } from './chains/bitcoin'; import { startCardanoScanner } from './chains/cardano'; import { startErgoScanner } from './chains/ergo'; +import { startEthereumScanner } from './chains/ethereum'; import { handleError } from '../utils'; @@ -13,17 +14,20 @@ const logger = WinstonLogger.getInstance().getLogger(import.meta.url); */ const start = async () => { try { - const [ergoScanner, cardanoScanner, bitcoinScanner] = await Promise.all([ - startErgoScanner(), - startCardanoScanner(), - startBitcoinScanner(), - ]); + const [ergoScanner, cardanoScanner, bitcoinScanner, ethereumScanner] = + await Promise.all([ + startErgoScanner(), + startCardanoScanner(), + startBitcoinScanner(), + startEthereumScanner(), + ]); logger.debug('all scanners started and their extractors registered', { scannerNames: [ ergoScanner.name(), cardanoScanner.name(), bitcoinScanner.name(), + ethereumScanner.name(), ], }); } catch (error) { diff --git a/package-lock.json b/package-lock.json index 01f662b5..9f97b469 100644 --- a/package-lock.json +++ b/package-lock.json @@ -142,12 +142,14 @@ "version": "1.1.0", "license": "GPL-3.0", "dependencies": { - "@rosen-bridge/bitcoin-esplora-scanner": "^0.1.5", - "@rosen-bridge/bitcoin-observation-extractor": "^3.0.0", + "@rosen-bridge/bitcoin-esplora-scanner": "^0.1.14", + "@rosen-bridge/bitcoin-observation-extractor": "^4.0.7", + "@rosen-bridge/evm-observation-extractor": "^3.0.5", + "@rosen-bridge/evm-rpc-scanner": "^1.0.4", "@rosen-bridge/extended-typeorm": "^0.0.3", - "@rosen-bridge/observation-extractor": "^4.4.4", - "@rosen-bridge/scanner": "^4.0.0", - "@rosen-bridge/watcher-data-extractor": "^6.0.0", + "@rosen-bridge/observation-extractor": "^5.0.7", + "@rosen-bridge/scanner": "^4.1.3", + "@rosen-bridge/watcher-data-extractor": "^8.0.2", "@rosen-bridge/winston-logger": "^0.2.1", "@rosen-ui/asset-calculator": "^1.0.1", "config": "^3.3.7" @@ -160,11 +162,42 @@ "typescript": "^5.0.0" } }, + "apps/rosen-service/node_modules/@rosen-bridge/abstract-extractor": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-extractor/-/abstract-extractor-0.3.0.tgz", + "integrity": "sha512-Ty2CRgNKc0JzHbiDUfYxQy53fDNALJiQgsDYBapZGSTfqgl8wPm3yQytp7cpIDBwfgQGD3Y2wE+UEwRgjwQNbA==", + "license": "GPL-3.0", + "dependencies": { + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/json-bigint": "^0.1.0", + "@rosen-clients/ergo-explorer": "^1.1.2", + "@rosen-clients/ergo-node": "^1.1.1", + "lodash-es": "^4.17.21" + }, + "engines": { + "node": ">=20.11.0" + } + }, "apps/rosen-service/node_modules/@rosen-bridge/abstract-logger": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" }, + "apps/rosen-service/node_modules/@rosen-bridge/address-codec": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-0.3.0.tgz", + "integrity": "sha512-qH8kOKuAStVbXoeAWmMuGD9CQTYGCE4nFAAS1NEi11eZV1nK97/mXQgjIpPHNGKJxkuPpmsGVoZxbaZakSCE5g==", + "license": "GPL-3.0", + "dependencies": { + "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", + "bitcoinjs-lib": "^6.1.5", + "ergo-lib-wasm-nodejs": "^0.24.1", + "ethers": "^6.13.2" + }, + "engines": { + "node": ">=20.11.0" + } + }, "apps/rosen-service/node_modules/@rosen-bridge/extended-typeorm": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/@rosen-bridge/extended-typeorm/-/extended-typeorm-0.0.3.tgz", @@ -177,16 +210,57 @@ "sqlite3": "^5.1.6" } }, + "apps/rosen-service/node_modules/@rosen-bridge/observation-extractor": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@rosen-bridge/observation-extractor/-/observation-extractor-5.0.7.tgz", + "integrity": "sha512-CLMwnmfVrgY3YgbW6ZKHM4ySu9DEvbtTQYhq23NWLCTVUNEJmsCEe48Rx1gZjeqSKMP0Mc/gnVj58Vopj2dPYA==", + "license": "GPL-3.0", + "dependencies": { + "@cardano-ogmios/schema": "^6.6.1", + "@rosen-bridge/abstract-extractor": "^0.3.0", + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/rosen-extractor": "^6.2.0", + "@rosen-bridge/scanner": "^4.1.3", + "@rosen-bridge/tokens": "^1.2.0", + "blakejs": "^1.2.1", + "ergo-lib-wasm-nodejs": "^0.24.1", + "lodash-es": "^4.17.21", + "reflect-metadata": "^0.1.13", + "sqlite3": "^5.0.9", + "typeorm": "^0.3.20" + } + }, + "apps/rosen-service/node_modules/@rosen-bridge/rosen-extractor": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/rosen-extractor/-/rosen-extractor-6.2.0.tgz", + "integrity": "sha512-cKQaJn3QuhrhEqTaosN9aKgBAuepwyFuehvH+br8lmdmtn1IiCsBFzzCJpXW5lm+Uluq0/yijvkelTNVEuVbfQ==", + "license": "GPL-3.0", + "dependencies": { + "@blockfrost/blockfrost-js": "^5.4.0", + "@cardano-ogmios/schema": "^6.0.3", + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/address-codec": "^0.3.0", + "@rosen-bridge/json-bigint": "^0.1.0", + "@rosen-bridge/tokens": "^1.2.1", + "bitcoinjs-lib": "^6.1.5", + "ergo-lib-wasm-nodejs": "^0.24.1", + "ethers": "^6.11.1", + "json-bigint": "^1.0.0", + "lodash-es": "^4.17.21" + } + }, "apps/rosen-service/node_modules/@rosen-bridge/watcher-data-extractor": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/watcher-data-extractor/-/watcher-data-extractor-6.0.0.tgz", - "integrity": "sha512-8LVgFWNuhp/xi3TR2kMVAQgPVsfab1T7sL9gwv/ZtIiSDTaoqmAIrM6KwUeaXiS+2p+Rme4Iwq9Ecb7B/DvBbA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@rosen-bridge/watcher-data-extractor/-/watcher-data-extractor-8.0.2.tgz", + "integrity": "sha512-pnpSbuqgCVEecCZDZrL6TthMrXPWkgpXOC5pnWFYNyjOyYlymxCrCEhW15L8hahmRPyy2LfH0TMd0LGQNmeRzg==", + "license": "GPL-3.0", "dependencies": { - "@rosen-bridge/abstract-extractor": "^0.1.0", + "@rosen-bridge/abstract-extractor": "^0.3.0", "@rosen-bridge/abstract-logger": "^1.0.0", "@rosen-bridge/extended-typeorm": "^0.0.3", "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-bridge/scanner": "^4.0.0", + "@rosen-bridge/scanner": "^4.1.3", + "@rosen-bridge/tokens": "^1.2.1", "@rosen-clients/ergo-explorer": "^1.1.1", "@types/lodash-es": "^4.17.6", "blakejs": "^1.2.1", @@ -2791,11 +2865,12 @@ } }, "node_modules/@cardano-ogmios/client": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@cardano-ogmios/client/-/client-6.3.0.tgz", - "integrity": "sha512-nWaZ76n/R+p8nxBfRCetOuoDH8o5QToL5zWhRUu9EwHDJqM/0rzvYEk9JYCikAcVlC1qt6+3CcG4nCpG0dsptw==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@cardano-ogmios/client/-/client-6.8.0.tgz", + "integrity": "sha512-12DmFZKXR4F+nn2U2vTNXka2zal/l20XfU3UimLTT9HPD0NTrNKxBE3rzmKIsDTB40EvyB5lPLc6xyO3ODffQA==", + "license": "MPL-2.0", "dependencies": { - "@cardano-ogmios/schema": "6.3.0", + "@cardano-ogmios/schema": "6.8.0", "@cardanosolutions/json-bigint": "^1.0.1", "@types/json-bigint": "^1.0.1", "bech32": "^2.0.0", @@ -2804,16 +2879,17 @@ "isomorphic-ws": "^4.0.1", "nanoid": "^3.1.31", "ts-custom-error": "^3.2.0", - "ws": "^7.4.6" + "ws": "^7.5.10" }, "engines": { "node": ">=14" } }, "node_modules/@cardano-ogmios/schema": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@cardano-ogmios/schema/-/schema-6.3.0.tgz", - "integrity": "sha512-reM7NDYV4cgMAdFCzypoIuCVgSUfR9ztRMlk6p7k0cTeqUkbMfA83ps1FVkTDxzXxFjgM4EkhqoJyRjKIKRPQA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@cardano-ogmios/schema/-/schema-6.8.0.tgz", + "integrity": "sha512-U5uyO1nNa/rNMArtr8c44teeXJRqVdU62/KVzldrtfqFEoK4Oy6B0GcDcwREGdWlwtnyMkGvpu04+w/mWs0C5g==", + "license": "MPL-2.0", "engines": { "node": ">=14" } @@ -8658,12 +8734,13 @@ } }, "node_modules/@rosen-bridge/bitcoin-esplora-scanner": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@rosen-bridge/bitcoin-esplora-scanner/-/bitcoin-esplora-scanner-0.1.5.tgz", - "integrity": "sha512-p6ouaCnP+jPzCkddk8IMtQIJ9XAXjc136miTeLvLDFQtis9oiYQnboNd+X46nY6BmvgN5hDa31vtKzLwNAhqKQ==", + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/@rosen-bridge/bitcoin-esplora-scanner/-/bitcoin-esplora-scanner-0.1.14.tgz", + "integrity": "sha512-CV74VNVn7tPph0KPxQq0JiBtbI2RDTHUXbg2dUi98hiafFbRIF1bSw6sNWAEfI00RmNR20q7kgD7a7nO2HOiLw==", + "license": "GPL-3.0", "dependencies": { "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/scanner": "^4.0.0", + "@rosen-bridge/scanner": "^4.1.3", "axios": "^1.6.8" }, "engines": { @@ -8676,34 +8753,106 @@ "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" }, "node_modules/@rosen-bridge/bitcoin-observation-extractor": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/bitcoin-observation-extractor/-/bitcoin-observation-extractor-3.0.0.tgz", - "integrity": "sha512-w/bT36W+/0x22f7dJ2KCeF96AMMSvJ3FERcb6AB8v6c7GRwL3iHXnDDmJkj95tXrGqd1hDORJEcclDAeOlNjuQ==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@rosen-bridge/bitcoin-observation-extractor/-/bitcoin-observation-extractor-4.0.7.tgz", + "integrity": "sha512-mtQfx5utzCcjLR9spz07kZ+IoFscsTIJnlzEHlS8cVsZHTUejhbH4co4ceDdqsx7RYePty7XJ4TYLNObS6N8lg==", + "license": "GPL-3.0", "dependencies": { "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/bitcoin-esplora-scanner": "^0.1.5", - "@rosen-bridge/bitcoin-rpc-scanner": "^0.1.1", - "@rosen-bridge/observation-extractor": "^4.4.4", - "@rosen-bridge/rosen-extractor": "^5.0.1", - "@rosen-bridge/tokens": "^1.0.0", + "@rosen-bridge/bitcoin-esplora-scanner": "^0.1.14", + "@rosen-bridge/bitcoin-rpc-scanner": "^0.2.8", + "@rosen-bridge/observation-extractor": "^5.0.7", + "@rosen-bridge/rosen-extractor": "^6.2.0", + "@rosen-bridge/tokens": "^1.2.0", "typeorm": "^0.3.20" }, "engines": { "node": ">=20.11.0" } }, + "node_modules/@rosen-bridge/bitcoin-observation-extractor/node_modules/@rosen-bridge/abstract-extractor": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-extractor/-/abstract-extractor-0.3.0.tgz", + "integrity": "sha512-Ty2CRgNKc0JzHbiDUfYxQy53fDNALJiQgsDYBapZGSTfqgl8wPm3yQytp7cpIDBwfgQGD3Y2wE+UEwRgjwQNbA==", + "license": "GPL-3.0", + "dependencies": { + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/json-bigint": "^0.1.0", + "@rosen-clients/ergo-explorer": "^1.1.2", + "@rosen-clients/ergo-node": "^1.1.1", + "lodash-es": "^4.17.21" + }, + "engines": { + "node": ">=20.11.0" + } + }, "node_modules/@rosen-bridge/bitcoin-observation-extractor/node_modules/@rosen-bridge/abstract-logger": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" }, + "node_modules/@rosen-bridge/bitcoin-observation-extractor/node_modules/@rosen-bridge/address-codec": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-0.3.0.tgz", + "integrity": "sha512-qH8kOKuAStVbXoeAWmMuGD9CQTYGCE4nFAAS1NEi11eZV1nK97/mXQgjIpPHNGKJxkuPpmsGVoZxbaZakSCE5g==", + "license": "GPL-3.0", + "dependencies": { + "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", + "bitcoinjs-lib": "^6.1.5", + "ergo-lib-wasm-nodejs": "^0.24.1", + "ethers": "^6.13.2" + }, + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rosen-bridge/bitcoin-observation-extractor/node_modules/@rosen-bridge/observation-extractor": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@rosen-bridge/observation-extractor/-/observation-extractor-5.0.7.tgz", + "integrity": "sha512-CLMwnmfVrgY3YgbW6ZKHM4ySu9DEvbtTQYhq23NWLCTVUNEJmsCEe48Rx1gZjeqSKMP0Mc/gnVj58Vopj2dPYA==", + "license": "GPL-3.0", + "dependencies": { + "@cardano-ogmios/schema": "^6.6.1", + "@rosen-bridge/abstract-extractor": "^0.3.0", + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/rosen-extractor": "^6.2.0", + "@rosen-bridge/scanner": "^4.1.3", + "@rosen-bridge/tokens": "^1.2.0", + "blakejs": "^1.2.1", + "ergo-lib-wasm-nodejs": "^0.24.1", + "lodash-es": "^4.17.21", + "reflect-metadata": "^0.1.13", + "sqlite3": "^5.0.9", + "typeorm": "^0.3.20" + } + }, + "node_modules/@rosen-bridge/bitcoin-observation-extractor/node_modules/@rosen-bridge/rosen-extractor": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/rosen-extractor/-/rosen-extractor-6.2.0.tgz", + "integrity": "sha512-cKQaJn3QuhrhEqTaosN9aKgBAuepwyFuehvH+br8lmdmtn1IiCsBFzzCJpXW5lm+Uluq0/yijvkelTNVEuVbfQ==", + "license": "GPL-3.0", + "dependencies": { + "@blockfrost/blockfrost-js": "^5.4.0", + "@cardano-ogmios/schema": "^6.0.3", + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/address-codec": "^0.3.0", + "@rosen-bridge/json-bigint": "^0.1.0", + "@rosen-bridge/tokens": "^1.2.1", + "bitcoinjs-lib": "^6.1.5", + "ergo-lib-wasm-nodejs": "^0.24.1", + "ethers": "^6.11.1", + "json-bigint": "^1.0.0", + "lodash-es": "^4.17.21" + } + }, "node_modules/@rosen-bridge/bitcoin-rpc-scanner": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@rosen-bridge/bitcoin-rpc-scanner/-/bitcoin-rpc-scanner-0.1.1.tgz", - "integrity": "sha512-2CplgxHedelAnHNHB/ij/0pio6uZVHinV08S2EHaF4oyH32DXiHi66beC6iwYrwvd+03TmQo+Na//h2QZtxXJA==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@rosen-bridge/bitcoin-rpc-scanner/-/bitcoin-rpc-scanner-0.2.8.tgz", + "integrity": "sha512-pOpa6ytcsqOGXkTdqwR6kmWycqAx4QWLaU4UWGpWSozJ2QrKXTXwfwb67uEuSiFL4g2zvqSJ2pSRQwaUdkBx1g==", + "license": "GPL-3.0", "dependencies": { "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/scanner": "^4.0.0", + "@rosen-bridge/scanner": "^4.1.3", "axios": "^1.6.8" }, "engines": { @@ -8713,7 +8862,8 @@ "node_modules/@rosen-bridge/bitcoin-rpc-scanner/node_modules/@rosen-bridge/abstract-logger": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", - "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==", + "license": "GPL-3.0" }, "node_modules/@rosen-bridge/bitcoin-utxo-selection": { "version": "0.2.0", @@ -8779,6 +8929,117 @@ "node": ">=18.12.0" } }, + "node_modules/@rosen-bridge/evm-observation-extractor": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@rosen-bridge/evm-observation-extractor/-/evm-observation-extractor-3.0.5.tgz", + "integrity": "sha512-WJZdAKJHMtWXWXDDgo3Q3hZDZZxFWfSr8SuKDSvmIaOOxuCZ3VbKxHJlnOmz4LtxgncXK3YT0fdNqzQ1sOne9Q==", + "license": "GPL-3.0", + "dependencies": { + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/evm-rpc-scanner": "^1.0.4", + "@rosen-bridge/observation-extractor": "^5.0.7", + "@rosen-bridge/rosen-extractor": "^6.2.0", + "@rosen-bridge/tokens": "^1.2.0", + "blakejs": "^1.2.1", + "ethers": "^6.11.0" + }, + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rosen-bridge/evm-observation-extractor/node_modules/@rosen-bridge/abstract-extractor": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-extractor/-/abstract-extractor-0.3.0.tgz", + "integrity": "sha512-Ty2CRgNKc0JzHbiDUfYxQy53fDNALJiQgsDYBapZGSTfqgl8wPm3yQytp7cpIDBwfgQGD3Y2wE+UEwRgjwQNbA==", + "license": "GPL-3.0", + "dependencies": { + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/json-bigint": "^0.1.0", + "@rosen-clients/ergo-explorer": "^1.1.2", + "@rosen-clients/ergo-node": "^1.1.1", + "lodash-es": "^4.17.21" + }, + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rosen-bridge/evm-observation-extractor/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==", + "license": "GPL-3.0" + }, + "node_modules/@rosen-bridge/evm-observation-extractor/node_modules/@rosen-bridge/address-codec": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-0.3.0.tgz", + "integrity": "sha512-qH8kOKuAStVbXoeAWmMuGD9CQTYGCE4nFAAS1NEi11eZV1nK97/mXQgjIpPHNGKJxkuPpmsGVoZxbaZakSCE5g==", + "license": "GPL-3.0", + "dependencies": { + "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", + "bitcoinjs-lib": "^6.1.5", + "ergo-lib-wasm-nodejs": "^0.24.1", + "ethers": "^6.13.2" + }, + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rosen-bridge/evm-observation-extractor/node_modules/@rosen-bridge/observation-extractor": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@rosen-bridge/observation-extractor/-/observation-extractor-5.0.7.tgz", + "integrity": "sha512-CLMwnmfVrgY3YgbW6ZKHM4ySu9DEvbtTQYhq23NWLCTVUNEJmsCEe48Rx1gZjeqSKMP0Mc/gnVj58Vopj2dPYA==", + "license": "GPL-3.0", + "dependencies": { + "@cardano-ogmios/schema": "^6.6.1", + "@rosen-bridge/abstract-extractor": "^0.3.0", + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/rosen-extractor": "^6.2.0", + "@rosen-bridge/scanner": "^4.1.3", + "@rosen-bridge/tokens": "^1.2.0", + "blakejs": "^1.2.1", + "ergo-lib-wasm-nodejs": "^0.24.1", + "lodash-es": "^4.17.21", + "reflect-metadata": "^0.1.13", + "sqlite3": "^5.0.9", + "typeorm": "^0.3.20" + } + }, + "node_modules/@rosen-bridge/evm-observation-extractor/node_modules/@rosen-bridge/rosen-extractor": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/rosen-extractor/-/rosen-extractor-6.2.0.tgz", + "integrity": "sha512-cKQaJn3QuhrhEqTaosN9aKgBAuepwyFuehvH+br8lmdmtn1IiCsBFzzCJpXW5lm+Uluq0/yijvkelTNVEuVbfQ==", + "license": "GPL-3.0", + "dependencies": { + "@blockfrost/blockfrost-js": "^5.4.0", + "@cardano-ogmios/schema": "^6.0.3", + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/address-codec": "^0.3.0", + "@rosen-bridge/json-bigint": "^0.1.0", + "@rosen-bridge/tokens": "^1.2.1", + "bitcoinjs-lib": "^6.1.5", + "ergo-lib-wasm-nodejs": "^0.24.1", + "ethers": "^6.11.1", + "json-bigint": "^1.0.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/@rosen-bridge/evm-rpc-scanner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@rosen-bridge/evm-rpc-scanner/-/evm-rpc-scanner-1.0.4.tgz", + "integrity": "sha512-IrMrpK51SJkgUT7QY/nfjb/1U4t9yh1C/x+eZeFe2vRlLN+kX9NUtYHwGCY3Qfnfd+zpFrbRQQ0ooG7C70H5FA==", + "license": "GPL-3.0", + "dependencies": { + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/scanner": "^4.1.3", + "ethers": "^6.11.0" + } + }, + "node_modules/@rosen-bridge/evm-rpc-scanner/node_modules/@rosen-bridge/abstract-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", + "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==", + "license": "GPL-3.0" + }, "node_modules/@rosen-bridge/extended-typeorm": { "version": "0.0.1", "license": "GPL-3.0", @@ -8888,15 +9149,16 @@ "link": true }, "node_modules/@rosen-bridge/scanner": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/scanner/-/scanner-4.0.0.tgz", - "integrity": "sha512-ZHFRfsv3YRyFEZY4VzEEeHRJm0bsAiocaq0HNuWOubSHydiaLra62NUfI1mdNDU+ql5c+JyE+cmv/1zm7tdPaw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@rosen-bridge/scanner/-/scanner-4.1.3.tgz", + "integrity": "sha512-21o0zu54XtGpXuvApgXlAb/9AV3XBt/kb5nJT1c5pLG1MlrMbjcpPXW6kEsdI/M+XP+Hpr7//y9TRotipKh1Ug==", + "license": "GPL-3.0", "dependencies": { "@apollo/client": "^3.8.7", "@blockfrost/blockfrost-js": "^5.4.0", - "@cardano-ogmios/client": "^6.3.0", - "@cardano-ogmios/schema": "^6.3.0", - "@rosen-bridge/abstract-extractor": "^0.1.0", + "@cardano-ogmios/client": "^6.6.1", + "@cardano-ogmios/schema": "^6.6.1", + "@rosen-bridge/abstract-extractor": "^0.3.0", "@rosen-bridge/abstract-logger": "^1.0.0", "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-clients/ergo-explorer": "^1.1.1", @@ -8910,6 +9172,22 @@ "typeorm": "^0.3.20" } }, + "node_modules/@rosen-bridge/scanner/node_modules/@rosen-bridge/abstract-extractor": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-extractor/-/abstract-extractor-0.3.0.tgz", + "integrity": "sha512-Ty2CRgNKc0JzHbiDUfYxQy53fDNALJiQgsDYBapZGSTfqgl8wPm3yQytp7cpIDBwfgQGD3Y2wE+UEwRgjwQNbA==", + "license": "GPL-3.0", + "dependencies": { + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/json-bigint": "^0.1.0", + "@rosen-clients/ergo-explorer": "^1.1.2", + "@rosen-clients/ergo-node": "^1.1.1", + "lodash-es": "^4.17.21" + }, + "engines": { + "node": ">=20.11.0" + } + }, "node_modules/@rosen-bridge/scanner/node_modules/@rosen-bridge/abstract-logger": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", @@ -9052,9 +9330,10 @@ } }, "node_modules/@rosen-clients/ergo-explorer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@rosen-clients/ergo-explorer/-/ergo-explorer-1.1.1.tgz", - "integrity": "sha512-xvDM15MhHV1HLg3e9/0fETDKs9ZFT1MT6pip1KWaLmPbCYetI88iPPcLPCaO0RwY+Iqf5qm+gHbKeroFdA+juw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rosen-clients/ergo-explorer/-/ergo-explorer-1.1.2.tgz", + "integrity": "sha512-GHTBgGZlPbiHfpJs0X/2v+9Ern5hlDaNIHNAgse2iDDvOu1jdpDpY+bpnHtWiLcUKJWUfV2RjBnBxpHMyHAUKQ==", + "license": "GPL-3.0", "dependencies": { "@rosen-clients/axios": "^0.1.0" } @@ -17963,27 +18242,6 @@ "node": ">=8" } }, - "node_modules/metro/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "peer": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/micro-ftch": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", @@ -24558,9 +24816,10 @@ } }, "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", "engines": { "node": ">=8.3.0" }, From 4ae3ec7f0e41e0cf96d6ccf7acda5f9225ab9b67 Mon Sep 17 00:00:00 2001 From: vorujack Date: Thu, 26 Sep 2024 10:59:54 +0330 Subject: [PATCH 133/168] update asset calculator addresses in rosen service --- apps/rosen-service/config/default.yaml | 2 ++ apps/rosen-service/src/calculator/calculator-service.ts | 5 +++-- apps/rosen-service/src/configs.ts | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/rosen-service/config/default.yaml b/apps/rosen-service/config/default.yaml index ed221461..5ceb3190 100644 --- a/apps/rosen-service/config/default.yaml +++ b/apps/rosen-service/config/default.yaml @@ -51,3 +51,5 @@ calculator: addresses: ergo: [] cardano: [] + bitcoin: [] + ethereum: [] diff --git a/apps/rosen-service/src/calculator/calculator-service.ts b/apps/rosen-service/src/calculator/calculator-service.ts index 2f4a1425..f36abc38 100644 --- a/apps/rosen-service/src/calculator/calculator-service.ts +++ b/apps/rosen-service/src/calculator/calculator-service.ts @@ -61,8 +61,9 @@ const start = async () => { esploraUrl: config.bitcoin.esploraUrl, }, { - addresses: [], - rpcUrl: '', + addresses: config.calculator.addresses.ethereum, + rpcUrl: config.ethereum.rpcUrl, + authToken: config.ethereum.rpcAuthToken ?? undefined, }, dataSource, logger diff --git a/apps/rosen-service/src/configs.ts b/apps/rosen-service/src/configs.ts index 6fc38628..72fc5f6b 100644 --- a/apps/rosen-service/src/configs.ts +++ b/apps/rosen-service/src/configs.ts @@ -78,6 +78,7 @@ const getConfig = () => { ergo: nodeConfig.get('calculator.addresses.ergo'), cardano: nodeConfig.get('calculator.addresses.cardano'), bitcoin: nodeConfig.get('calculator.addresses.bitcoin'), + ethereum: nodeConfig.get('calculator.addresses.ethereum'), }, }, }; From ec45a3848f1e4d76a74bcd77fe66bccf41a0d4e3 Mon Sep 17 00:00:00 2001 From: "fateme.r" Date: Thu, 26 Sep 2024 13:17:18 +0330 Subject: [PATCH 134/168] optional auth token in config --- .changeset/bright-trees-share.md | 2 ++ apps/rosen-service/config/default.yaml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 .changeset/bright-trees-share.md diff --git a/.changeset/bright-trees-share.md b/.changeset/bright-trees-share.md new file mode 100644 index 00000000..a845151c --- /dev/null +++ b/.changeset/bright-trees-share.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/apps/rosen-service/config/default.yaml b/apps/rosen-service/config/default.yaml index 5ceb3190..9092892c 100644 --- a/apps/rosen-service/config/default.yaml +++ b/apps/rosen-service/config/default.yaml @@ -42,7 +42,7 @@ ethereum: rwt: initialHeight: rpcUrl: https://eth-mainnet.public.blastapi.io - rpcAuthToken: + # rpcAuthToken: postgres: url: # postgresql://username:password@host:port/databasename logging: false From e93a07dae0cb01bc5cbdaa8a3b186a0742c20de3 Mon Sep 17 00:00:00 2001 From: "fateme.r" Date: Thu, 26 Sep 2024 13:46:36 +0330 Subject: [PATCH 135/168] check the ethereum rpc auth token path in config --- .../src/calculator/calculator-service.ts | 2 +- apps/rosen-service/src/configs.ts | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/rosen-service/src/calculator/calculator-service.ts b/apps/rosen-service/src/calculator/calculator-service.ts index f36abc38..14a130ce 100644 --- a/apps/rosen-service/src/calculator/calculator-service.ts +++ b/apps/rosen-service/src/calculator/calculator-service.ts @@ -63,7 +63,7 @@ const start = async () => { { addresses: config.calculator.addresses.ethereum, rpcUrl: config.ethereum.rpcUrl, - authToken: config.ethereum.rpcAuthToken ?? undefined, + authToken: config.ethereum.rpcAuthToken, }, dataSource, logger diff --git a/apps/rosen-service/src/configs.ts b/apps/rosen-service/src/configs.ts index 72fc5f6b..107b2b12 100644 --- a/apps/rosen-service/src/configs.ts +++ b/apps/rosen-service/src/configs.ts @@ -4,6 +4,15 @@ import { TransportOptions } from '@rosen-bridge/winston-logger'; import AppError from './errors/AppError'; +/** + * Checks the config path and return the configuration if it exists + * @param path + * @returns + */ +const getOptionalString = (path: string): string | undefined => { + return nodeConfig.has(path) ? nodeConfig.get(path) : undefined; +}; + const getConfig = () => { try { return { @@ -66,7 +75,7 @@ const getConfig = () => { rwt: nodeConfig.get('ethereum.tokens.rwt'), }, rpcUrl: nodeConfig.get('ethereum.rpcUrl'), - rpcAuthToken: nodeConfig.get('ethereum.rpcAuthToken'), + rpcAuthToken: getOptionalString('ethereum.rpcAuthToken'), }, postgres: { url: nodeConfig.get('postgres.url'), From 26be514ef67f75b8322ed95286b65bdf3fc1715a Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 28 Sep 2024 07:38:55 +0000 Subject: [PATCH 136/168] chore: Adjust the color of the health parameter component and resolve various issues in the guard and watcher functionalities --- apps/guard/app/health/page.tsx | 4 +- apps/watcher/app/health/page.tsx | 4 +- .../src/components/common/HealthParamCard.tsx | 42 +++++++++++++++---- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/apps/guard/app/health/page.tsx b/apps/guard/app/health/page.tsx index 60d4b9e1..51cc0839 100644 --- a/apps/guard/app/health/page.tsx +++ b/apps/guard/app/health/page.tsx @@ -54,7 +54,7 @@ const Health = () => { currentHealthParamInfo.lastTrialErrorTime === newHealthParamInfo.lastTrialErrorTime ) { - return void setTimeout(trying, 5000); + return void setTimeout(trying, 1000); } setChecking((checking) => checking.filter((item) => item != paramId)); @@ -62,7 +62,7 @@ const Health = () => { const healthParamIndex = data!.findIndex( (healthParam) => healthParam.id === paramId, ); - openSnackbar(paramId + ' status updated', 'info'); + openSnackbar(currentHealthParamInfo.title + ' status updated', 'info'); mutate([ ...data!.slice(0, healthParamIndex), diff --git a/apps/watcher/app/health/page.tsx b/apps/watcher/app/health/page.tsx index 60d4b9e1..51cc0839 100644 --- a/apps/watcher/app/health/page.tsx +++ b/apps/watcher/app/health/page.tsx @@ -54,7 +54,7 @@ const Health = () => { currentHealthParamInfo.lastTrialErrorTime === newHealthParamInfo.lastTrialErrorTime ) { - return void setTimeout(trying, 5000); + return void setTimeout(trying, 1000); } setChecking((checking) => checking.filter((item) => item != paramId)); @@ -62,7 +62,7 @@ const Health = () => { const healthParamIndex = data!.findIndex( (healthParam) => healthParam.id === paramId, ); - openSnackbar(paramId + ' status updated', 'info'); + openSnackbar(currentHealthParamInfo.title + ' status updated', 'info'); mutate([ ...data!.slice(0, healthParamIndex), diff --git a/packages/ui-kit/src/components/common/HealthParamCard.tsx b/packages/ui-kit/src/components/common/HealthParamCard.tsx index 2a6f1265..82383f32 100644 --- a/packages/ui-kit/src/components/common/HealthParamCard.tsx +++ b/packages/ui-kit/src/components/common/HealthParamCard.tsx @@ -43,7 +43,6 @@ export const HealthParamCard = ({ const theme = useTheme(); const color = useMemo(() => { - if (!lastCheck) return 'primary'; switch (status) { case 'Healthy': return 'success'; @@ -52,7 +51,30 @@ export const HealthParamCard = ({ default: return 'error'; } - }, [lastCheck, status]); + }, [status]); + + const colors = useMemo(() => { + if (lastCheck) { + return { + cardBackground: `${color}.${theme.palette.mode}`, + cardColor: `${color}.${ + theme.palette.mode === 'light' ? 'dark' : 'light' + }`, + button: color, + alertBackground: `${color}.main`, + alert: `${color}.light`, + }; + } else { + return { + cardBackground: + theme.palette.grey[theme.palette.mode == 'light' ? 200 : 800], + cardColor: 'inherit', + button: 'inherit', + alertBackground: 'inherit', + alert: 'inherit', + }; + } + }, [color, lastCheck, theme]); const Icon = useMemo(() => { if (!lastCheck) return ShieldQuestion; @@ -62,7 +84,7 @@ export const HealthParamCard = ({ return ( @@ -82,9 +104,7 @@ export const HealthParamCard = ({ ), sx: { - color: `${color}.${ - theme.palette.mode === 'light' ? 'dark' : 'light' - }`, + color: colors.cardColor, '& span': { color: 'inherit', display: 'flex', @@ -103,9 +123,8 @@ export const HealthParamCard = ({ loading={checking} size="small" variant="text" - sx={{ fontSize: 'inherit' }} + sx={{ color: colors.button, fontSize: 'inherit' }} onClick={handleCheckNow} - color={color} > {checking ? 'Checking' : 'Check now'} @@ -119,7 +138,12 @@ export const HealthParamCard = ({ {details && ( {details} From 72b2e6dadc03f419d42f7bf3bbf0edafbd0965f6 Mon Sep 17 00:00:00 2001 From: "fateme.r" Date: Sat, 28 Sep 2024 16:54:32 +0330 Subject: [PATCH 137/168] fix observation entity no metadata error - update scanner related packages in other projects --- .changeset/warm-moons-hunt.md | 5 + apps/rosen/package.json | 8 +- package-lock.json | 473 ++++------------------------------ 3 files changed, 56 insertions(+), 430 deletions(-) create mode 100644 .changeset/warm-moons-hunt.md diff --git a/.changeset/warm-moons-hunt.md b/.changeset/warm-moons-hunt.md new file mode 100644 index 00000000..c8c7b4e9 --- /dev/null +++ b/.changeset/warm-moons-hunt.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-service': patch +--- + +Fix observation entity no metadata error diff --git a/apps/rosen/package.json b/apps/rosen/package.json index 48b19141..9154fb08 100644 --- a/apps/rosen/package.json +++ b/apps/rosen/package.json @@ -21,13 +21,13 @@ "@rosen-bridge/cardano-utxo-selection": "^1.0.0", "@rosen-bridge/cli": "^0.2.0", "@rosen-bridge/ergo-box-selection": "^0.1.0", - "@rosen-bridge/extended-typeorm": "^0.0.1", + "@rosen-bridge/extended-typeorm": "^0.0.3", "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/minimum-fee": "^2.0.1", - "@rosen-bridge/observation-extractor": "^4.0.0", - "@rosen-bridge/scanner": "^3.0.0", + "@rosen-bridge/observation-extractor": "^5.0.7", + "@rosen-bridge/scanner": "^4.1.3", "@rosen-bridge/tokens": "^1.2.1", - "@rosen-bridge/watcher-data-extractor": "^4.0.0", + "@rosen-bridge/watcher-data-extractor": "^8.0.2", "@rosen-clients/cardano-koios": "^2.0.1", "@rosen-clients/ergo-explorer": "^1.0.2", "@rosen-network/bitcoin": "^0.2.0", diff --git a/package-lock.json b/package-lock.json index 9f97b469..4971331c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -87,13 +87,13 @@ "@rosen-bridge/cardano-utxo-selection": "^1.0.0", "@rosen-bridge/cli": "^0.2.0", "@rosen-bridge/ergo-box-selection": "^0.1.0", - "@rosen-bridge/extended-typeorm": "^0.0.1", + "@rosen-bridge/extended-typeorm": "^0.0.3", "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/minimum-fee": "^2.0.1", - "@rosen-bridge/observation-extractor": "^4.0.0", - "@rosen-bridge/scanner": "^3.0.0", + "@rosen-bridge/observation-extractor": "^5.0.7", + "@rosen-bridge/scanner": "^4.1.3", "@rosen-bridge/tokens": "^1.2.1", - "@rosen-bridge/watcher-data-extractor": "^4.0.0", + "@rosen-bridge/watcher-data-extractor": "^8.0.2", "@rosen-clients/cardano-koios": "^2.0.1", "@rosen-clients/ergo-explorer": "^1.0.2", "@rosen-network/bitcoin": "^0.2.0", @@ -162,117 +162,6 @@ "typescript": "^5.0.0" } }, - "apps/rosen-service/node_modules/@rosen-bridge/abstract-extractor": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-extractor/-/abstract-extractor-0.3.0.tgz", - "integrity": "sha512-Ty2CRgNKc0JzHbiDUfYxQy53fDNALJiQgsDYBapZGSTfqgl8wPm3yQytp7cpIDBwfgQGD3Y2wE+UEwRgjwQNbA==", - "license": "GPL-3.0", - "dependencies": { - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-clients/ergo-explorer": "^1.1.2", - "@rosen-clients/ergo-node": "^1.1.1", - "lodash-es": "^4.17.21" - }, - "engines": { - "node": ">=20.11.0" - } - }, - "apps/rosen-service/node_modules/@rosen-bridge/abstract-logger": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", - "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" - }, - "apps/rosen-service/node_modules/@rosen-bridge/address-codec": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-0.3.0.tgz", - "integrity": "sha512-qH8kOKuAStVbXoeAWmMuGD9CQTYGCE4nFAAS1NEi11eZV1nK97/mXQgjIpPHNGKJxkuPpmsGVoZxbaZakSCE5g==", - "license": "GPL-3.0", - "dependencies": { - "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", - "bitcoinjs-lib": "^6.1.5", - "ergo-lib-wasm-nodejs": "^0.24.1", - "ethers": "^6.13.2" - }, - "engines": { - "node": ">=20.11.0" - } - }, - "apps/rosen-service/node_modules/@rosen-bridge/extended-typeorm": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@rosen-bridge/extended-typeorm/-/extended-typeorm-0.0.3.tgz", - "integrity": "sha512-YJakXDzvWsV4LnhguPccXaKjFWjVGiyasoDgnXNMF68WGfbCr4+fT7SJD9O4ASM9cmhKPN3zSjJN6EqdwUTdXw==", - "dependencies": { - "async-mutex": "^0.4.0", - "typeorm": "^0.3.20" - }, - "peerDependencies": { - "sqlite3": "^5.1.6" - } - }, - "apps/rosen-service/node_modules/@rosen-bridge/observation-extractor": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@rosen-bridge/observation-extractor/-/observation-extractor-5.0.7.tgz", - "integrity": "sha512-CLMwnmfVrgY3YgbW6ZKHM4ySu9DEvbtTQYhq23NWLCTVUNEJmsCEe48Rx1gZjeqSKMP0Mc/gnVj58Vopj2dPYA==", - "license": "GPL-3.0", - "dependencies": { - "@cardano-ogmios/schema": "^6.6.1", - "@rosen-bridge/abstract-extractor": "^0.3.0", - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/rosen-extractor": "^6.2.0", - "@rosen-bridge/scanner": "^4.1.3", - "@rosen-bridge/tokens": "^1.2.0", - "blakejs": "^1.2.1", - "ergo-lib-wasm-nodejs": "^0.24.1", - "lodash-es": "^4.17.21", - "reflect-metadata": "^0.1.13", - "sqlite3": "^5.0.9", - "typeorm": "^0.3.20" - } - }, - "apps/rosen-service/node_modules/@rosen-bridge/rosen-extractor": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/rosen-extractor/-/rosen-extractor-6.2.0.tgz", - "integrity": "sha512-cKQaJn3QuhrhEqTaosN9aKgBAuepwyFuehvH+br8lmdmtn1IiCsBFzzCJpXW5lm+Uluq0/yijvkelTNVEuVbfQ==", - "license": "GPL-3.0", - "dependencies": { - "@blockfrost/blockfrost-js": "^5.4.0", - "@cardano-ogmios/schema": "^6.0.3", - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/address-codec": "^0.3.0", - "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-bridge/tokens": "^1.2.1", - "bitcoinjs-lib": "^6.1.5", - "ergo-lib-wasm-nodejs": "^0.24.1", - "ethers": "^6.11.1", - "json-bigint": "^1.0.0", - "lodash-es": "^4.17.21" - } - }, - "apps/rosen-service/node_modules/@rosen-bridge/watcher-data-extractor": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@rosen-bridge/watcher-data-extractor/-/watcher-data-extractor-8.0.2.tgz", - "integrity": "sha512-pnpSbuqgCVEecCZDZrL6TthMrXPWkgpXOC5pnWFYNyjOyYlymxCrCEhW15L8hahmRPyy2LfH0TMd0LGQNmeRzg==", - "license": "GPL-3.0", - "dependencies": { - "@rosen-bridge/abstract-extractor": "^0.3.0", - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/extended-typeorm": "^0.0.3", - "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-bridge/scanner": "^4.1.3", - "@rosen-bridge/tokens": "^1.2.1", - "@rosen-clients/ergo-explorer": "^1.1.1", - "@types/lodash-es": "^4.17.6", - "blakejs": "^1.2.1", - "ergo-lib-wasm-nodejs": "^0.24.1", - "json-bigint": "^1.0.0", - "lodash-es": "^4.17.21", - "pg": "^8.10.0", - "reflect-metadata": "^0.1.13", - "sqlite3": "^5.0.9", - "typeorm": "^0.3.20" - } - }, "apps/rosen-service/node_modules/@types/node": { "version": "18.19.1", "dev": true, @@ -294,59 +183,11 @@ "node": ">=6" } }, - "apps/rosen/node_modules/@rosen-bridge/abstract-logger": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", - "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" - }, - "apps/rosen/node_modules/@rosen-bridge/address-codec": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-0.3.0.tgz", - "integrity": "sha512-qH8kOKuAStVbXoeAWmMuGD9CQTYGCE4nFAAS1NEi11eZV1nK97/mXQgjIpPHNGKJxkuPpmsGVoZxbaZakSCE5g==", - "dependencies": { - "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", - "bitcoinjs-lib": "^6.1.5", - "ergo-lib-wasm-nodejs": "^0.24.1", - "ethers": "^6.13.2" - }, - "engines": { - "node": ">=20.11.0" - } - }, - "apps/rosen/node_modules/@rosen-bridge/scanner": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@rosen-bridge/scanner/-/scanner-3.2.9.tgz", - "integrity": "sha512-+1Z+62WhDWnjLkT+ZhFsHDj264GuJL1Wbcp6uS0K3Sm8fuxdNSJj7dVlaG5o9nf0RfvWutY6GkSEIY8wiIzcCg==", - "dependencies": { - "@apollo/client": "^3.8.7", - "@blockfrost/blockfrost-js": "^5.4.0", - "@cardano-ogmios/client": "^6.3.0", - "@cardano-ogmios/schema": "^6.3.0", - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-clients/ergo-explorer": "^1.1.1", - "@rosen-clients/ergo-node": "^1.1.1", - "await-semaphore": "^0.1.3", - "axios": "^1.6.8", - "cross-fetch": "^4.0.0", - "reflect-metadata": "^0.1.13", - "sqlite3": "^5.0.9", - "typeorm": "^0.3.20" - } - }, "apps/rosen/node_modules/@types/node": { "version": "20.5.7", "dev": true, "license": "MIT" }, - "apps/rosen/node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, "apps/rosen/node_modules/eslint-config-next": { "version": "14.0.3", "dev": true, @@ -461,20 +302,6 @@ "typescript": "^5.0.0" } }, - "networks/bitcoin/node_modules/@rosen-bridge/address-codec": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-0.3.0.tgz", - "integrity": "sha512-qH8kOKuAStVbXoeAWmMuGD9CQTYGCE4nFAAS1NEi11eZV1nK97/mXQgjIpPHNGKJxkuPpmsGVoZxbaZakSCE5g==", - "dependencies": { - "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", - "bitcoinjs-lib": "^6.1.5", - "ergo-lib-wasm-nodejs": "^0.24.1", - "ethers": "^6.13.2" - }, - "engines": { - "node": ">=20.11.0" - } - }, "networks/bitcoin/node_modules/prettier": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", @@ -573,20 +400,6 @@ "typescript": "^5.0.0" } }, - "networks/ethereum/node_modules/@rosen-bridge/address-codec": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-0.3.0.tgz", - "integrity": "sha512-qH8kOKuAStVbXoeAWmMuGD9CQTYGCE4nFAAS1NEi11eZV1nK97/mXQgjIpPHNGKJxkuPpmsGVoZxbaZakSCE5g==", - "dependencies": { - "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", - "bitcoinjs-lib": "^6.1.5", - "ergo-lib-wasm-nodejs": "^0.24.1", - "ethers": "^6.13.2" - }, - "engines": { - "node": ">=20.11.0" - } - }, "networks/ethereum/node_modules/prettier": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", @@ -8698,12 +8511,13 @@ ] }, "node_modules/@rosen-bridge/abstract-extractor": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-extractor/-/abstract-extractor-0.1.0.tgz", - "integrity": "sha512-GYyPR5oAhGjrTHhS8gvNkdGCzaOYkp2FuPa8mCfl/BBMCrifmKx6n/yvDLrbhgurbOKx3MAnMJK5sLf63wAusg==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-extractor/-/abstract-extractor-0.3.0.tgz", + "integrity": "sha512-Ty2CRgNKc0JzHbiDUfYxQy53fDNALJiQgsDYBapZGSTfqgl8wPm3yQytp7cpIDBwfgQGD3Y2wE+UEwRgjwQNbA==", "dependencies": { "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-clients/ergo-explorer": "^1.1.1", + "@rosen-bridge/json-bigint": "^0.1.0", + "@rosen-clients/ergo-explorer": "^1.1.2", "@rosen-clients/ergo-node": "^1.1.1", "lodash-es": "^4.17.21" }, @@ -8721,13 +8535,14 @@ "license": "GPL-3.0" }, "node_modules/@rosen-bridge/address-codec": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-0.2.1.tgz", - "integrity": "sha512-W7d7W0rmciMJMuq4KYh+6EeiB9dCE9RBTzu5xeFd3BLHjMnYpt1/J6vdZeXpFFySNRfxclFZwU94B5q3l6CV8Q==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-0.3.0.tgz", + "integrity": "sha512-qH8kOKuAStVbXoeAWmMuGD9CQTYGCE4nFAAS1NEi11eZV1nK97/mXQgjIpPHNGKJxkuPpmsGVoZxbaZakSCE5g==", "dependencies": { "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", "bitcoinjs-lib": "^6.1.5", - "ergo-lib-wasm-nodejs": "^0.24.1" + "ergo-lib-wasm-nodejs": "^0.24.1", + "ethers": "^6.13.2" }, "engines": { "node": ">=20.11.0" @@ -8770,81 +8585,11 @@ "node": ">=20.11.0" } }, - "node_modules/@rosen-bridge/bitcoin-observation-extractor/node_modules/@rosen-bridge/abstract-extractor": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-extractor/-/abstract-extractor-0.3.0.tgz", - "integrity": "sha512-Ty2CRgNKc0JzHbiDUfYxQy53fDNALJiQgsDYBapZGSTfqgl8wPm3yQytp7cpIDBwfgQGD3Y2wE+UEwRgjwQNbA==", - "license": "GPL-3.0", - "dependencies": { - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-clients/ergo-explorer": "^1.1.2", - "@rosen-clients/ergo-node": "^1.1.1", - "lodash-es": "^4.17.21" - }, - "engines": { - "node": ">=20.11.0" - } - }, "node_modules/@rosen-bridge/bitcoin-observation-extractor/node_modules/@rosen-bridge/abstract-logger": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" }, - "node_modules/@rosen-bridge/bitcoin-observation-extractor/node_modules/@rosen-bridge/address-codec": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-0.3.0.tgz", - "integrity": "sha512-qH8kOKuAStVbXoeAWmMuGD9CQTYGCE4nFAAS1NEi11eZV1nK97/mXQgjIpPHNGKJxkuPpmsGVoZxbaZakSCE5g==", - "license": "GPL-3.0", - "dependencies": { - "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", - "bitcoinjs-lib": "^6.1.5", - "ergo-lib-wasm-nodejs": "^0.24.1", - "ethers": "^6.13.2" - }, - "engines": { - "node": ">=20.11.0" - } - }, - "node_modules/@rosen-bridge/bitcoin-observation-extractor/node_modules/@rosen-bridge/observation-extractor": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@rosen-bridge/observation-extractor/-/observation-extractor-5.0.7.tgz", - "integrity": "sha512-CLMwnmfVrgY3YgbW6ZKHM4ySu9DEvbtTQYhq23NWLCTVUNEJmsCEe48Rx1gZjeqSKMP0Mc/gnVj58Vopj2dPYA==", - "license": "GPL-3.0", - "dependencies": { - "@cardano-ogmios/schema": "^6.6.1", - "@rosen-bridge/abstract-extractor": "^0.3.0", - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/rosen-extractor": "^6.2.0", - "@rosen-bridge/scanner": "^4.1.3", - "@rosen-bridge/tokens": "^1.2.0", - "blakejs": "^1.2.1", - "ergo-lib-wasm-nodejs": "^0.24.1", - "lodash-es": "^4.17.21", - "reflect-metadata": "^0.1.13", - "sqlite3": "^5.0.9", - "typeorm": "^0.3.20" - } - }, - "node_modules/@rosen-bridge/bitcoin-observation-extractor/node_modules/@rosen-bridge/rosen-extractor": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/rosen-extractor/-/rosen-extractor-6.2.0.tgz", - "integrity": "sha512-cKQaJn3QuhrhEqTaosN9aKgBAuepwyFuehvH+br8lmdmtn1IiCsBFzzCJpXW5lm+Uluq0/yijvkelTNVEuVbfQ==", - "license": "GPL-3.0", - "dependencies": { - "@blockfrost/blockfrost-js": "^5.4.0", - "@cardano-ogmios/schema": "^6.0.3", - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/address-codec": "^0.3.0", - "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-bridge/tokens": "^1.2.1", - "bitcoinjs-lib": "^6.1.5", - "ergo-lib-wasm-nodejs": "^0.24.1", - "ethers": "^6.11.1", - "json-bigint": "^1.0.0", - "lodash-es": "^4.17.21" - } - }, "node_modules/@rosen-bridge/bitcoin-rpc-scanner": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/@rosen-bridge/bitcoin-rpc-scanner/-/bitcoin-rpc-scanner-0.2.8.tgz", @@ -8947,82 +8692,12 @@ "node": ">=20.11.0" } }, - "node_modules/@rosen-bridge/evm-observation-extractor/node_modules/@rosen-bridge/abstract-extractor": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-extractor/-/abstract-extractor-0.3.0.tgz", - "integrity": "sha512-Ty2CRgNKc0JzHbiDUfYxQy53fDNALJiQgsDYBapZGSTfqgl8wPm3yQytp7cpIDBwfgQGD3Y2wE+UEwRgjwQNbA==", - "license": "GPL-3.0", - "dependencies": { - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-clients/ergo-explorer": "^1.1.2", - "@rosen-clients/ergo-node": "^1.1.1", - "lodash-es": "^4.17.21" - }, - "engines": { - "node": ">=20.11.0" - } - }, "node_modules/@rosen-bridge/evm-observation-extractor/node_modules/@rosen-bridge/abstract-logger": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==", "license": "GPL-3.0" }, - "node_modules/@rosen-bridge/evm-observation-extractor/node_modules/@rosen-bridge/address-codec": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-0.3.0.tgz", - "integrity": "sha512-qH8kOKuAStVbXoeAWmMuGD9CQTYGCE4nFAAS1NEi11eZV1nK97/mXQgjIpPHNGKJxkuPpmsGVoZxbaZakSCE5g==", - "license": "GPL-3.0", - "dependencies": { - "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", - "bitcoinjs-lib": "^6.1.5", - "ergo-lib-wasm-nodejs": "^0.24.1", - "ethers": "^6.13.2" - }, - "engines": { - "node": ">=20.11.0" - } - }, - "node_modules/@rosen-bridge/evm-observation-extractor/node_modules/@rosen-bridge/observation-extractor": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@rosen-bridge/observation-extractor/-/observation-extractor-5.0.7.tgz", - "integrity": "sha512-CLMwnmfVrgY3YgbW6ZKHM4ySu9DEvbtTQYhq23NWLCTVUNEJmsCEe48Rx1gZjeqSKMP0Mc/gnVj58Vopj2dPYA==", - "license": "GPL-3.0", - "dependencies": { - "@cardano-ogmios/schema": "^6.6.1", - "@rosen-bridge/abstract-extractor": "^0.3.0", - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/rosen-extractor": "^6.2.0", - "@rosen-bridge/scanner": "^4.1.3", - "@rosen-bridge/tokens": "^1.2.0", - "blakejs": "^1.2.1", - "ergo-lib-wasm-nodejs": "^0.24.1", - "lodash-es": "^4.17.21", - "reflect-metadata": "^0.1.13", - "sqlite3": "^5.0.9", - "typeorm": "^0.3.20" - } - }, - "node_modules/@rosen-bridge/evm-observation-extractor/node_modules/@rosen-bridge/rosen-extractor": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/rosen-extractor/-/rosen-extractor-6.2.0.tgz", - "integrity": "sha512-cKQaJn3QuhrhEqTaosN9aKgBAuepwyFuehvH+br8lmdmtn1IiCsBFzzCJpXW5lm+Uluq0/yijvkelTNVEuVbfQ==", - "license": "GPL-3.0", - "dependencies": { - "@blockfrost/blockfrost-js": "^5.4.0", - "@cardano-ogmios/schema": "^6.0.3", - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/address-codec": "^0.3.0", - "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-bridge/tokens": "^1.2.1", - "bitcoinjs-lib": "^6.1.5", - "ergo-lib-wasm-nodejs": "^0.24.1", - "ethers": "^6.11.1", - "json-bigint": "^1.0.0", - "lodash-es": "^4.17.21" - } - }, "node_modules/@rosen-bridge/evm-rpc-scanner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@rosen-bridge/evm-rpc-scanner/-/evm-rpc-scanner-1.0.4.tgz", @@ -9041,11 +8716,12 @@ "license": "GPL-3.0" }, "node_modules/@rosen-bridge/extended-typeorm": { - "version": "0.0.1", - "license": "GPL-3.0", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@rosen-bridge/extended-typeorm/-/extended-typeorm-0.0.3.tgz", + "integrity": "sha512-YJakXDzvWsV4LnhguPccXaKjFWjVGiyasoDgnXNMF68WGfbCr4+fT7SJD9O4ASM9cmhKPN3zSjJN6EqdwUTdXw==", "dependencies": { "async-mutex": "^0.4.0", - "typeorm": "^0.3.12" + "typeorm": "^0.3.20" }, "peerDependencies": { "sqlite3": "^5.1.6" @@ -9069,10 +8745,6 @@ "node": ">=18.12.0" } }, - "node_modules/@rosen-bridge/logger-interface": { - "version": "0.1.0", - "license": "GPL-3.0" - }, "node_modules/@rosen-bridge/minimum-fee": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@rosen-bridge/minimum-fee/-/minimum-fee-2.0.1.tgz", @@ -9094,16 +8766,16 @@ "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" }, "node_modules/@rosen-bridge/observation-extractor": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@rosen-bridge/observation-extractor/-/observation-extractor-4.4.4.tgz", - "integrity": "sha512-7DM0FUY5lsANL9r8xo4qvUW1+v4wwF5ym+Ky+UzXakUmHMKPy7fx3CWxC+uPfWMfRgvio1SUTGFfE+jagLGMJA==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@rosen-bridge/observation-extractor/-/observation-extractor-5.0.7.tgz", + "integrity": "sha512-CLMwnmfVrgY3YgbW6ZKHM4ySu9DEvbtTQYhq23NWLCTVUNEJmsCEe48Rx1gZjeqSKMP0Mc/gnVj58Vopj2dPYA==", "dependencies": { - "@cardano-ogmios/schema": "^6.0.3", - "@rosen-bridge/abstract-extractor": "^0.1.0", + "@cardano-ogmios/schema": "^6.6.1", + "@rosen-bridge/abstract-extractor": "^0.3.0", "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/rosen-extractor": "^5.0.0", - "@rosen-bridge/scanner": "^4.0.0", - "@rosen-bridge/tokens": "^1.0.0", + "@rosen-bridge/rosen-extractor": "^6.2.0", + "@rosen-bridge/scanner": "^4.1.3", + "@rosen-bridge/tokens": "^1.2.0", "blakejs": "^1.2.1", "ergo-lib-wasm-nodejs": "^0.24.1", "lodash-es": "^4.17.21", @@ -9122,16 +8794,16 @@ "link": true }, "node_modules/@rosen-bridge/rosen-extractor": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@rosen-bridge/rosen-extractor/-/rosen-extractor-5.0.1.tgz", - "integrity": "sha512-+2i2/1fFodJSrTsaXEKOY60/lBUlpxoAxrwfW1pnxIHA5aATAOqXunk0QJJCMPiSUVhfzFa0vxZN3ZjCWROfnQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/rosen-extractor/-/rosen-extractor-6.2.0.tgz", + "integrity": "sha512-cKQaJn3QuhrhEqTaosN9aKgBAuepwyFuehvH+br8lmdmtn1IiCsBFzzCJpXW5lm+Uluq0/yijvkelTNVEuVbfQ==", "dependencies": { "@blockfrost/blockfrost-js": "^5.4.0", "@cardano-ogmios/schema": "^6.0.3", "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/address-codec": "^0.2.1", + "@rosen-bridge/address-codec": "^0.3.0", "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-bridge/tokens": "^1.0.0", + "@rosen-bridge/tokens": "^1.2.1", "bitcoinjs-lib": "^6.1.5", "ergo-lib-wasm-nodejs": "^0.24.1", "ethers": "^6.11.1", @@ -9172,22 +8844,6 @@ "typeorm": "^0.3.20" } }, - "node_modules/@rosen-bridge/scanner/node_modules/@rosen-bridge/abstract-extractor": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-extractor/-/abstract-extractor-0.3.0.tgz", - "integrity": "sha512-Ty2CRgNKc0JzHbiDUfYxQy53fDNALJiQgsDYBapZGSTfqgl8wPm3yQytp7cpIDBwfgQGD3Y2wE+UEwRgjwQNbA==", - "license": "GPL-3.0", - "dependencies": { - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-clients/ergo-explorer": "^1.1.2", - "@rosen-clients/ergo-node": "^1.1.1", - "lodash-es": "^4.17.21" - }, - "engines": { - "node": ">=20.11.0" - } - }, "node_modules/@rosen-bridge/scanner/node_modules/@rosen-bridge/abstract-logger": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", @@ -9240,12 +8896,17 @@ "link": true }, "node_modules/@rosen-bridge/watcher-data-extractor": { - "version": "4.2.2", - "license": "GPL-3.0", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@rosen-bridge/watcher-data-extractor/-/watcher-data-extractor-8.0.2.tgz", + "integrity": "sha512-pnpSbuqgCVEecCZDZrL6TthMrXPWkgpXOC5pnWFYNyjOyYlymxCrCEhW15L8hahmRPyy2LfH0TMd0LGQNmeRzg==", "dependencies": { - "@rosen-bridge/logger-interface": "^0.1.0", - "@rosen-bridge/scanner": "^3.2.2", - "@rosen-clients/ergo-explorer": "^1.0.3", + "@rosen-bridge/abstract-extractor": "^0.3.0", + "@rosen-bridge/abstract-logger": "^1.0.0", + "@rosen-bridge/extended-typeorm": "^0.0.3", + "@rosen-bridge/json-bigint": "^0.1.0", + "@rosen-bridge/scanner": "^4.1.3", + "@rosen-bridge/tokens": "^1.2.1", + "@rosen-clients/ergo-explorer": "^1.1.1", "@types/lodash-es": "^4.17.6", "blakejs": "^1.2.1", "ergo-lib-wasm-nodejs": "^0.24.1", @@ -9254,7 +8915,7 @@ "pg": "^8.10.0", "reflect-metadata": "^0.1.13", "sqlite3": "^5.0.9", - "typeorm": "^0.3.7" + "typeorm": "^0.3.20" } }, "node_modules/@rosen-bridge/watcher-data-extractor/node_modules/@rosen-bridge/abstract-logger": { @@ -9262,35 +8923,6 @@ "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" }, - "node_modules/@rosen-bridge/watcher-data-extractor/node_modules/@rosen-bridge/scanner": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@rosen-bridge/scanner/-/scanner-3.2.9.tgz", - "integrity": "sha512-+1Z+62WhDWnjLkT+ZhFsHDj264GuJL1Wbcp6uS0K3Sm8fuxdNSJj7dVlaG5o9nf0RfvWutY6GkSEIY8wiIzcCg==", - "dependencies": { - "@apollo/client": "^3.8.7", - "@blockfrost/blockfrost-js": "^5.4.0", - "@cardano-ogmios/client": "^6.3.0", - "@cardano-ogmios/schema": "^6.3.0", - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/json-bigint": "^0.1.0", - "@rosen-clients/ergo-explorer": "^1.1.1", - "@rosen-clients/ergo-node": "^1.1.1", - "await-semaphore": "^0.1.3", - "axios": "^1.6.8", - "cross-fetch": "^4.0.0", - "reflect-metadata": "^0.1.13", - "sqlite3": "^5.0.9", - "typeorm": "^0.3.20" - } - }, - "node_modules/@rosen-bridge/watcher-data-extractor/node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, "node_modules/@rosen-bridge/winston-logger": { "version": "0.2.1", "license": "GPL-3.0", @@ -22801,7 +22433,7 @@ "dotenv": "^16.0.3", "glob": "^10.3.10", "mkdirp": "^2.1.3", - "reflect-metadata": "^0.2.1", + "reflect-metadata": "^0.2.2", "sha.js": "^2.4.11", "tslib": "^2.5.0", "uuid": "^9.0.0", @@ -22987,7 +22619,7 @@ } }, "node_modules/typeorm/node_modules/reflect-metadata": { - "version": "0.2.1", + "version": "0.2.2", "license": "Apache-2.0" }, "node_modules/typeorm/node_modules/supports-color": { @@ -24986,11 +24618,11 @@ "license": "GPL-3.0", "dependencies": { "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/extended-typeorm": "^0.0.2", + "@rosen-bridge/extended-typeorm": "^0.0.3", "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/tokens": "^1.2.1", - "@rosen-clients/cardano-koios": "^2.0.1", - "@rosen-clients/ergo-explorer": "^1.0.3", + "@rosen-clients/cardano-koios": "^2.0.3", + "@rosen-clients/ergo-explorer": "^1.1.2", "@rosen-ui/types": "^0.2.0", "axios": "^1.7.0", "ethers": "^6.13.2", @@ -25024,17 +24656,6 @@ "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" }, - "packages/asset-calculator/node_modules/@rosen-bridge/extended-typeorm": { - "version": "0.0.2", - "license": "GPL-3.0", - "dependencies": { - "async-mutex": "^0.4.0", - "typeorm": "^0.3.12" - }, - "peerDependencies": { - "sqlite3": "^5.1.6" - } - }, "packages/asset-calculator/node_modules/@types/node": { "version": "20.11.16", "dev": true, From 12cf41d88206915435add870335583f5449f7d09 Mon Sep 17 00:00:00 2001 From: "fateme.r" Date: Sat, 28 Sep 2024 16:55:04 +0330 Subject: [PATCH 138/168] Fix asset calculator logs and update client packages --- packages/asset-calculator/lib/asset-calculator.ts | 12 +++++++++--- .../lib/calculator/chains/ergo-calculator.ts | 6 ++++-- packages/asset-calculator/package.json | 6 +++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/asset-calculator/lib/asset-calculator.ts b/packages/asset-calculator/lib/asset-calculator.ts index 1bc510dd..cb221076 100644 --- a/packages/asset-calculator/lib/asset-calculator.ts +++ b/packages/asset-calculator/lib/asset-calculator.ts @@ -193,16 +193,22 @@ class AssetCalculator { const allStoredBridgedAssets = await this.bridgedAssetModel.getAllStoredAssets(); this.logger.debug( - `All current stored bridge assets are ${allStoredBridgedAssets}` + `All current stored bridge assets are ${JsonBigInt.stringify( + allStoredBridgedAssets + )}` ); const allStoredLockedAssets = await this.lockedAssetModel.getAllStoredAssets(); this.logger.debug( - `All current stored locked assets are ${allStoredBridgedAssets}` + `All current stored locked assets are ${JsonBigInt.stringify( + allStoredBridgedAssets + )}` ); const allStoredTokens = await this.tokenModel.getAllStoredTokens(); this.logger.debug( - `All current stored tokens are ${allStoredBridgedAssets}` + `All current stored tokens are ${JsonBigInt.stringify( + allStoredBridgedAssets + )}` ); const allCurrentBridgedAssets = []; diff --git a/packages/asset-calculator/lib/calculator/chains/ergo-calculator.ts b/packages/asset-calculator/lib/calculator/chains/ergo-calculator.ts index 1d593999..931d11b2 100644 --- a/packages/asset-calculator/lib/calculator/chains/ergo-calculator.ts +++ b/packages/asset-calculator/lib/calculator/chains/ergo-calculator.ts @@ -53,11 +53,13 @@ export class ErgoCalculator extends AbstractCalculator { balance.tokens!.filter((asset) => asset.tokenId == token.tokenId)[0] ?.amount ?? 0n; this.logger.debug( - `Balance of token [${token}] in address [${address}] is [${addressTokenBalance}]` + `Balance of token [${token.name}] in address [${address}] is [${addressTokenBalance}]` ); tokenBalance += addressTokenBalance; } - this.logger.debug(`Total balance of token [${token}] is [${tokenBalance}]`); + this.logger.debug( + `Total balance of token [${token.name}] is [${tokenBalance}]` + ); return tokenBalance; }; diff --git a/packages/asset-calculator/package.json b/packages/asset-calculator/package.json index dd6cd926..71885c4d 100644 --- a/packages/asset-calculator/package.json +++ b/packages/asset-calculator/package.json @@ -32,11 +32,11 @@ }, "dependencies": { "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/extended-typeorm": "^0.0.2", + "@rosen-bridge/extended-typeorm": "^0.0.3", "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/tokens": "^1.2.1", - "@rosen-clients/cardano-koios": "^2.0.1", - "@rosen-clients/ergo-explorer": "^1.0.3", + "@rosen-clients/cardano-koios": "^2.0.3", + "@rosen-clients/ergo-explorer": "^1.1.2", "@rosen-ui/types": "^0.2.0", "axios": "^1.7.0", "ethers": "^6.13.2", From fd497d7beafdfc88c3731e53752588bb8327989e Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 28 Sep 2024 13:41:31 +0000 Subject: [PATCH 139/168] fix: Address the issue related to retrieving the token balance in Ethereum --- networks/ethereum/src/constants.ts | 47 +++++++++++++++++++++++ wallets/metamask-wallet/src/getBalance.ts | 30 ++++++++++++--- 2 files changed, 71 insertions(+), 6 deletions(-) diff --git a/networks/ethereum/src/constants.ts b/networks/ethereum/src/constants.ts index e7f78487..25889678 100644 --- a/networks/ethereum/src/constants.ts +++ b/networks/ethereum/src/constants.ts @@ -23,3 +23,50 @@ export const transferABI: InterfaceAbi = [ type: 'function', }, ]; + +export const tokenABI = [ + { + constant: true, + inputs: [], + name: 'name', + outputs: [ + { + name: '', + type: 'string', + }, + ], + payable: false, + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'decimals', + outputs: [ + { + name: '', + type: 'uint8', + }, + ], + payable: false, + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: '_owner', + type: 'address', + }, + ], + name: 'balanceOf', + outputs: [ + { + name: 'balance', + type: 'uint256', + }, + ], + payable: false, + type: 'function', + }, +]; diff --git a/wallets/metamask-wallet/src/getBalance.ts b/wallets/metamask-wallet/src/getBalance.ts index b8e2cb77..08d098a6 100644 --- a/wallets/metamask-wallet/src/getBalance.ts +++ b/wallets/metamask-wallet/src/getBalance.ts @@ -1,7 +1,9 @@ import { RosenChainToken } from '@rosen-bridge/tokens'; import { WalletCreatorConfig } from '@rosen-network/ethereum'; +import { tokenABI } from '@rosen-network/ethereum/dist/src/constants'; import { NETWORKS } from '@rosen-ui/constants'; import { RosenAmountValue } from '@rosen-ui/types'; +import { BrowserProvider, Contract } from 'ethers'; import { getMetaMaskWallet } from './getMetaMaskWallet'; @@ -18,14 +20,30 @@ export const getBalanceCreator = if (!accounts?.length) return 0n; - const amount = await provider.request({ - method: 'eth_getBalance', - params: [accounts[0], 'latest'], - }); + const tokenMap = await config.getTokenMap(); - if (!amount) return 0n; + const tokenId = token[tokenMap.getIdKey(NETWORKS.ETHEREUM)]; - const tokenMap = await config.getTokenMap(); + let amount; + + if (tokenId == 'eth') { + amount = await provider.request({ + method: 'eth_getBalance', + params: [accounts[0], 'latest'], + }); + } else { + const browserProvider = new BrowserProvider(window.ethereum!); + + const contract = new Contract( + tokenId, + tokenABI, + await browserProvider.getSigner() + ); + + amount = await contract.balanceOf(accounts[0]); + } + + if (!amount) return 0n; const wrappedAmount = tokenMap.wrapAmount( token[tokenMap.getIdKey(NETWORKS.ETHEREUM)], From d169a89bf8e145324ab57ca8b0cda99ff6e8dc46 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 28 Sep 2024 13:52:55 +0000 Subject: [PATCH 140/168] fix: Add changeset file --- .changeset/neat-donkeys-pump.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/neat-donkeys-pump.md diff --git a/.changeset/neat-donkeys-pump.md b/.changeset/neat-donkeys-pump.md new file mode 100644 index 00000000..b37287c9 --- /dev/null +++ b/.changeset/neat-donkeys-pump.md @@ -0,0 +1,6 @@ +--- +'@rosen-ui/metamask-wallet': patch +'@rosen-network/ethereum': patch +--- + +Address the issue related to retrieving the token balance in Ethereum From 1cba92b5b0d5e4ad296de15e93622ae79132ca1c Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sun, 29 Sep 2024 08:23:09 +0000 Subject: [PATCH 141/168] fix: Fix the error handling for the validateAddress function --- .changeset/loud-pets-lay.md | 5 +++++ apps/rosen/app/_hooks/useBridgeForm.ts | 29 ++++++++++---------------- 2 files changed, 16 insertions(+), 18 deletions(-) create mode 100644 .changeset/loud-pets-lay.md diff --git a/.changeset/loud-pets-lay.md b/.changeset/loud-pets-lay.md new file mode 100644 index 00000000..8c62d8ca --- /dev/null +++ b/.changeset/loud-pets-lay.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': patch +--- + +Improve the error handling for the validateAddress function and implement result caching using centralized cache utilities diff --git a/apps/rosen/app/_hooks/useBridgeForm.ts b/apps/rosen/app/_hooks/useBridgeForm.ts index fe2518a1..991dab40 100644 --- a/apps/rosen/app/_hooks/useBridgeForm.ts +++ b/apps/rosen/app/_hooks/useBridgeForm.ts @@ -14,8 +14,8 @@ import { getMinTransfer } from '@/_utils/index'; import { getMaxTransfer } from '@/_utils/getMaxTransfer'; import { useTokenMap } from './useTokenMap'; import { Network, RosenAmountValue } from '@rosen-ui/types'; - -const validationCache = new Map(); +import { unwrap } from '@/_errors'; +import { cache } from '@/_utils/cache'; /** * handles the form field registrations and form state changes @@ -119,23 +119,16 @@ const useBridgeForm = () => { if (!value) { return 'Address cannot be empty'; } - - const cacheKey = `${targetField.value}__${value}`; - - if (validationCache.has(cacheKey)) { - return validationCache.get(cacheKey); + try { + await cache(unwrap(validateAddress), 60 * 60 * 1000)( + targetField.value as Network, + availableNetworks[targetField.value as Network].toSafeAddress( + value, + ), + ); + } catch { + return 'Invalid Address'; } - - const validationResult = await validateAddress( - targetField.value, - availableNetworks[targetField.value as Network].toSafeAddress(value), - ); - - const message = validationResult ? undefined : 'Invalid Address'; - - validationCache.set(cacheKey, message); - - return message; }, }, }); From 3b0e3e1f742323d74f9568f61c48124975ef3766 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sun, 29 Sep 2024 09:28:29 +0000 Subject: [PATCH 142/168] chore: Update the getTxUrl util --- packages/utils/src/getTxUrl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/utils/src/getTxUrl.ts b/packages/utils/src/getTxUrl.ts index 2b4b25c5..2e1dd427 100644 --- a/packages/utils/src/getTxUrl.ts +++ b/packages/utils/src/getTxUrl.ts @@ -12,7 +12,7 @@ const baseTxURLs: { [key in Network]: string } = { [NETWORKS.ERGO]: 'https://explorer.ergoplatform.com/transactions', [NETWORKS.CARDANO]: 'https://cardanoscan.io/transaction', [NETWORKS.BITCOIN]: 'https://mempool.space/tx', - [NETWORKS.ETHEREUM]: '', + [NETWORKS.ETHEREUM]: 'https://etherscan.io/tx', }; export const getTxURL = (network: Network, tx: string) => { From eedc05fe79e9db1a793215bea079df32ad3982d9 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sun, 29 Sep 2024 13:52:09 +0000 Subject: [PATCH 143/168] chore: Update getAddressUrl and getTokenUrl utils to support ethereum --- apps/rosen/app/_networks/ergo/getMaxTransfer.ts | 4 ++-- packages/utils/src/getAddressUrl.ts | 2 +- packages/utils/src/getTokenUrl.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/rosen/app/_networks/ergo/getMaxTransfer.ts b/apps/rosen/app/_networks/ergo/getMaxTransfer.ts index 92f4bc69..ce5c7ef0 100644 --- a/apps/rosen/app/_networks/ergo/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/ergo/getMaxTransfer.ts @@ -7,7 +7,7 @@ import { import { NETWORKS } from '@rosen-ui/constants'; import { wrap } from '@/_errors'; -import { CardanoNetwork } from '@/_types/network'; +import { ErgoNetwork } from '@/_types/network'; import { getTokenMap } from '../getTokenMap.server'; import { RosenAmountValue } from '@rosen-ui/types'; @@ -22,7 +22,7 @@ export const getMaxTransfer = wrap( balance, isNative, }: Parameters< - CardanoNetwork['getMaxTransfer'] + ErgoNetwork['getMaxTransfer'] >[0]): Promise => { const tokenMap = await getTokenMap(); const feeAndMinBoxValueWrapped = tokenMap.wrapAmount( diff --git a/packages/utils/src/getAddressUrl.ts b/packages/utils/src/getAddressUrl.ts index 9ea0e565..d18b67ed 100644 --- a/packages/utils/src/getAddressUrl.ts +++ b/packages/utils/src/getAddressUrl.ts @@ -5,7 +5,7 @@ const baseAddressURLs: { [key in Network]: string } = { [NETWORKS.ERGO]: 'https://explorer.ergoplatform.com/en/addresses', [NETWORKS.CARDANO]: 'https://cardanoscan.io/address', [NETWORKS.BITCOIN]: 'https://mempool.space/address', - [NETWORKS.ETHEREUM]: '', + [NETWORKS.ETHEREUM]: 'https://etherscan.io/address', }; export const getAddressUrl = (network: Network, address?: string) => { diff --git a/packages/utils/src/getTokenUrl.ts b/packages/utils/src/getTokenUrl.ts index 07b46b8c..22e30743 100644 --- a/packages/utils/src/getTokenUrl.ts +++ b/packages/utils/src/getTokenUrl.ts @@ -5,7 +5,7 @@ const baseTokenURLs: { [key in Network]: string } = { [NETWORKS.ERGO]: 'https://explorer.ergoplatform.com/en/token', [NETWORKS.CARDANO]: 'https://cardanoscan.io/token', [NETWORKS.BITCOIN]: '', - [NETWORKS.ETHEREUM]: '', + [NETWORKS.ETHEREUM]: 'https://etherscan.io/token', }; export const getTokenUrl = (network: Network, tokenId?: string) => { From e69060e2aac236e56b2c10b4a7790dd9671dd1b8 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 30 Sep 2024 07:50:27 +0000 Subject: [PATCH 144/168] fix: Update the getMaxTransfer util in ethereum --- apps/rosen/app/_networks/ethereum/getMaxTransfer.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts b/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts index 29143d75..f843b1a2 100644 --- a/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts @@ -31,7 +31,9 @@ export const getMaxTransfer = wrap( estimatedFee, NETWORKS.ETHEREUM, ).amount; - return balance - wrappedFee; + const offset = isNative ? wrappedFee : 0n; + const amount = balance - offset; + return amount < 0n ? 0n : amount; }, ), ); From edfdc12465e33e79f1b4e05c708acbb830fa0be6 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 30 Sep 2024 09:14:28 +0000 Subject: [PATCH 145/168] fix: Fix the bridged null-checking property within the Assets Repository Service --- .changeset/thick-icons-bake.md | 3 +++ apps/rosen/app/_backend/assets/repository.ts | 2 +- apps/rosen/app/assets/TableRow.tsx | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 .changeset/thick-icons-bake.md diff --git a/.changeset/thick-icons-bake.md b/.changeset/thick-icons-bake.md new file mode 100644 index 00000000..55ebf183 --- /dev/null +++ b/.changeset/thick-icons-bake.md @@ -0,0 +1,3 @@ +--- +'@rosen-bridge/rosen-app': patch +--- diff --git a/apps/rosen/app/_backend/assets/repository.ts b/apps/rosen/app/_backend/assets/repository.ts index 4b996a98..0a4bdc7c 100644 --- a/apps/rosen/app/_backend/assets/repository.ts +++ b/apps/rosen/app/_backend/assets/repository.ts @@ -18,7 +18,7 @@ export interface Asset { name: string; decimal: number; isNative: boolean; - bridged: string; + bridged: string | null; lockedPerAddress?: Array<{ amount: number; address: string }>; chain: Network; } diff --git a/apps/rosen/app/assets/TableRow.tsx b/apps/rosen/app/assets/TableRow.tsx index 5d67891f..a2e04054 100644 --- a/apps/rosen/app/assets/TableRow.tsx +++ b/apps/rosen/app/assets/TableRow.tsx @@ -180,7 +180,7 @@ export const MobileRow: FC = (props) => { Bridged
- {getDecimalString(row.bridged.toString(), row.decimal)} + {getDecimalString(row.bridged || '0', row.decimal)} @@ -297,7 +297,7 @@ export const TabletRow: FC = (props) => {
- {getDecimalString(row.bridged, row.decimal)} + {getDecimalString(row.bridged || '0', row.decimal)} Date: Mon, 30 Sep 2024 10:14:40 +0000 Subject: [PATCH 146/168] fix: Address the issue related to retrieving the app version property from the API --- .changeset/lazy-points-rescue.md | 6 ++++++ apps/guard/app/SideBar.tsx | 2 +- apps/guard/app/_mock/mockedData.ts | 1 - apps/guard/app/_types/api.ts | 1 - apps/watcher/app/SideBar.tsx | 2 +- apps/watcher/app/_mock/mockedData.ts | 1 - apps/watcher/app/_types/api.ts | 1 - 7 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 .changeset/lazy-points-rescue.md diff --git a/.changeset/lazy-points-rescue.md b/.changeset/lazy-points-rescue.md new file mode 100644 index 00000000..eabf1912 --- /dev/null +++ b/.changeset/lazy-points-rescue.md @@ -0,0 +1,6 @@ +--- +'@rosen-bridge/watcher-app': patch +'@rosen-bridge/guard-app': patch +--- + +Address the issue related to retrieving the app version property from the API diff --git a/apps/guard/app/SideBar.tsx b/apps/guard/app/SideBar.tsx index 45fece67..d097338c 100644 --- a/apps/guard/app/SideBar.tsx +++ b/apps/guard/app/SideBar.tsx @@ -125,7 +125,7 @@ const SideBar = () => { {!isLoading ? ( - Guard v{info?.version ?? '?'} + Guard v{info?.versions?.app ?? '?'} ) : ( diff --git a/apps/guard/app/_mock/mockedData.ts b/apps/guard/app/_mock/mockedData.ts index 5358fb41..41782aa9 100644 --- a/apps/guard/app/_mock/mockedData.ts +++ b/apps/guard/app/_mock/mockedData.ts @@ -77,7 +77,6 @@ const info: ApiInfoResponse = { }, rsnTokenId: '85baefff2eb9e45b04f8b4e6265e866773db6db5f9e8e30ce2cae1aa263b90gg', - version: '2.5.1', versions: { app: '', contract: '', diff --git a/apps/guard/app/_types/api.ts b/apps/guard/app/_types/api.ts index 405b3a8b..4e249e75 100644 --- a/apps/guard/app/_types/api.ts +++ b/apps/guard/app/_types/api.ts @@ -24,7 +24,6 @@ export interface ApiInfoResponse { hot: TokenInfoWithAddress[]; cold: TokenInfoWithAddress[]; }; - version: string; versions: { app: string; contract: string; diff --git a/apps/watcher/app/SideBar.tsx b/apps/watcher/app/SideBar.tsx index 8f87c2ad..c7d6223a 100644 --- a/apps/watcher/app/SideBar.tsx +++ b/apps/watcher/app/SideBar.tsx @@ -117,7 +117,7 @@ const SideBar = () => { variant="body2" color="textPrimary" > - Watcher v{info?.version ?? '?'} + Watcher v{info?.versions?.app ?? '?'} ) : ( diff --git a/apps/watcher/app/_mock/mockedData.ts b/apps/watcher/app/_mock/mockedData.ts index e5e4ef70..eea5aa6f 100644 --- a/apps/watcher/app/_mock/mockedData.ts +++ b/apps/watcher/app/_mock/mockedData.ts @@ -39,7 +39,6 @@ const info: ApiInfoResponse = { '6c1526b2a5ef010edb622719d9d7fbde8437a39543547c3effbe72ad33504cf1', eRsnTokenId: '6c1526b2a5ef010edb622719d9d7fbde8437a39543547c3effbe72ad33504cf2', - version: '2.5.1', versions: { app: '', contract: '', diff --git a/apps/watcher/app/_types/api.ts b/apps/watcher/app/_types/api.ts index 4ef06730..ac65fd43 100644 --- a/apps/watcher/app/_types/api.ts +++ b/apps/watcher/app/_types/api.ts @@ -26,7 +26,6 @@ export interface ApiInfoResponse { address: string; rsnTokenId: string; eRsnTokenId: string; - version: string; versions: { app: string; contract: string; From efcceb7cf666975d52878eae819ba8e008baffe6 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 30 Sep 2024 13:06:58 +0000 Subject: [PATCH 147/168] feat: Add a token list for the Ethereum network --- .changeset/cool-feet-scream.md | 5 +++++ .changeset/long-worms-look.md | 5 +++++ apps/guard/app/(dashboard)/@tokens/page.tsx | 17 +++++++++++++++-- .../common/tokensCard/TokenListItem.tsx | 15 +++++++-------- 4 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 .changeset/cool-feet-scream.md create mode 100644 .changeset/long-worms-look.md diff --git a/.changeset/cool-feet-scream.md b/.changeset/cool-feet-scream.md new file mode 100644 index 00000000..29cbc8f4 --- /dev/null +++ b/.changeset/cool-feet-scream.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/ui-kit': patch +--- + +Revise the font-size of the hot and cold amounts in the TokenListItem component. diff --git a/.changeset/long-worms-look.md b/.changeset/long-worms-look.md new file mode 100644 index 00000000..9ba91b86 --- /dev/null +++ b/.changeset/long-worms-look.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/guard-app': minor +--- + +Integrate a token list for the Ethereum network into the dashboard. diff --git a/apps/guard/app/(dashboard)/@tokens/page.tsx b/apps/guard/app/(dashboard)/@tokens/page.tsx index 15d2afa9..912294f9 100644 --- a/apps/guard/app/(dashboard)/@tokens/page.tsx +++ b/apps/guard/app/(dashboard)/@tokens/page.tsx @@ -21,22 +21,35 @@ const Tokens = () => { fetcher, ); + const { data: ethereumTokens, isLoading: isEthereumTokensLoading } = + useSWR( + ['/assets', { chain: NETWORKS.ETHEREUM }], + fetcher, + ); + return ( <> - + - + + + + ); }; diff --git a/packages/ui-kit/src/components/common/tokensCard/TokenListItem.tsx b/packages/ui-kit/src/components/common/tokensCard/TokenListItem.tsx index 47d20c60..60e91418 100644 --- a/packages/ui-kit/src/components/common/tokensCard/TokenListItem.tsx +++ b/packages/ui-kit/src/components/common/tokensCard/TokenListItem.tsx @@ -48,22 +48,21 @@ export const TokenListItem = ({ + {nameOrPlaceholder} - {getDecimalString(value, decimals)} - + + {getDecimalString(value, decimals)} + + {coldValue !== undefined && '🔥'} {coldValue && ( <> - + {' '} / {getDecimalString(coldValue, decimals)} - - {' '} - ❄️ - + ❄️ )} From 166eddbb06f03cf6f3366593c785cb09ebcd4a32 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 1 Oct 2024 10:17:09 +0000 Subject: [PATCH 148/168] fix: Fix the Events page in the Rosen app to ensure accurate display of amounts and fees with the correct decimal places --- .changeset/yellow-tools-add.md | 5 +++ .../app/_backend/events/event-service.ts | 2 ++ apps/rosen/app/events/TableRow.tsx | 31 ++++++++++++++----- 3 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 .changeset/yellow-tools-add.md diff --git a/.changeset/yellow-tools-add.md b/.changeset/yellow-tools-add.md new file mode 100644 index 00000000..1646ad80 --- /dev/null +++ b/.changeset/yellow-tools-add.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': patch +--- + +Fix the Events page in the Rosen app to ensure accurate display of amounts and fees with the correct decimal places diff --git a/apps/rosen/app/_backend/events/event-service.ts b/apps/rosen/app/_backend/events/event-service.ts index d8af31a6..8e5f9228 100644 --- a/apps/rosen/app/_backend/events/event-service.ts +++ b/apps/rosen/app/_backend/events/event-service.ts @@ -24,6 +24,7 @@ const getFullTokenData = (tokenId: string, chain: Network) => { tokenId: tokenId, name: token[0]?.[chain].name ?? UNSUPPORTED_TOKEN_NAME, decimals: token[0]?.[chain].decimals ?? 0, + significantDecimals: tokenMap.getSignificantDecimals(tokenId) || 0, isNativeToken: token[0]?.[chain].metaData.type === 'native', }; } catch { @@ -31,6 +32,7 @@ const getFullTokenData = (tokenId: string, chain: Network) => { tokenId: tokenId, name: UNSUPPORTED_TOKEN_NAME, decimals: 0, + significantDecimals: 0, isNativeToken: false, }; } diff --git a/apps/rosen/app/events/TableRow.tsx b/apps/rosen/app/events/TableRow.tsx index abe2be3b..482f7a1f 100644 --- a/apps/rosen/app/events/TableRow.tsx +++ b/apps/rosen/app/events/TableRow.tsx @@ -191,7 +191,10 @@ export const MobileRow: FC = (props) => { Amount - {getDecimalString(row.amount.toString(), row.lockToken.decimals)} + {getDecimalString( + row.amount.toString(), + row.lockToken.significantDecimals, + )} @@ -199,7 +202,7 @@ export const MobileRow: FC = (props) => { {getDecimalString( row.bridgeFee.toString(), - row.lockToken.decimals, + row.lockToken.significantDecimals, )} @@ -208,7 +211,7 @@ export const MobileRow: FC = (props) => { {getDecimalString( row.networkFee.toString(), - row.lockToken.decimals, + row.lockToken.significantDecimals, )} @@ -247,7 +250,12 @@ export const TabletRow: FC = (props) => { const { isLoading, ...row } = props; const txUrl = getTxURL(row.fromChain, row.sourceTxId); - + console.log( + 2222, + row.amount, + row.lockToken.name, + row.lockToken.significantDecimals, + ); return ( @@ -284,13 +292,22 @@ export const TabletRow: FC = (props) => { {row.lockToken.name} - {getDecimalString(row.amount.toString(), row.lockToken.decimals)} + {getDecimalString( + row.amount.toString(), + row.lockToken.significantDecimals, + )} - {getDecimalString(row.bridgeFee.toString(), row.lockToken.decimals)} + {getDecimalString( + row.bridgeFee.toString(), + row.lockToken.significantDecimals, + )} - {getDecimalString(row.networkFee.toString(), row.lockToken.decimals)} + {getDecimalString( + row.networkFee.toString(), + row.lockToken.significantDecimals, + )} {moment(row.timestamp * 1000).fromNow()} From bf2acd4a5d1b2327aa0e67fa15cfdce82fad90ff Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 1 Oct 2024 10:29:42 +0000 Subject: [PATCH 149/168] Update TableRow.tsx --- apps/rosen/app/events/TableRow.tsx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/apps/rosen/app/events/TableRow.tsx b/apps/rosen/app/events/TableRow.tsx index 482f7a1f..ae91ab3a 100644 --- a/apps/rosen/app/events/TableRow.tsx +++ b/apps/rosen/app/events/TableRow.tsx @@ -250,12 +250,7 @@ export const TabletRow: FC = (props) => { const { isLoading, ...row } = props; const txUrl = getTxURL(row.fromChain, row.sourceTxId); - console.log( - 2222, - row.amount, - row.lockToken.name, - row.lockToken.significantDecimals, - ); + return ( From ee52ed4cbf231c2aa90c249170981385b49aa7bb Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 1 Oct 2024 14:12:07 +0000 Subject: [PATCH 150/168] fix: Remove the unnecessary 'decimals' property from the event service --- apps/rosen/app/_backend/events/event-service.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/rosen/app/_backend/events/event-service.ts b/apps/rosen/app/_backend/events/event-service.ts index 8e5f9228..b5daa76d 100644 --- a/apps/rosen/app/_backend/events/event-service.ts +++ b/apps/rosen/app/_backend/events/event-service.ts @@ -23,7 +23,6 @@ const getFullTokenData = (tokenId: string, chain: Network) => { return { tokenId: tokenId, name: token[0]?.[chain].name ?? UNSUPPORTED_TOKEN_NAME, - decimals: token[0]?.[chain].decimals ?? 0, significantDecimals: tokenMap.getSignificantDecimals(tokenId) || 0, isNativeToken: token[0]?.[chain].metaData.type === 'native', }; @@ -31,7 +30,6 @@ const getFullTokenData = (tokenId: string, chain: Network) => { return { tokenId: tokenId, name: UNSUPPORTED_TOKEN_NAME, - decimals: 0, significantDecimals: 0, isNativeToken: false, }; From 7e2e23b92b3a7d1e8705c849efa6dba39786e9af Mon Sep 17 00:00:00 2001 From: "fateme.r" Date: Sat, 5 Oct 2024 11:04:23 +0330 Subject: [PATCH 151/168] Fix scanner initialization bug --- .changeset/great-steaks-yawn.md | 5 +++++ .../rosen-service/src/scanner/scanner-utils.ts | 18 +----------------- 2 files changed, 6 insertions(+), 17 deletions(-) create mode 100644 .changeset/great-steaks-yawn.md diff --git a/.changeset/great-steaks-yawn.md b/.changeset/great-steaks-yawn.md new file mode 100644 index 00000000..1fcbc9e0 --- /dev/null +++ b/.changeset/great-steaks-yawn.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-service': patch +--- + +Fix scanner initialization bug diff --git a/apps/rosen-service/src/scanner/scanner-utils.ts b/apps/rosen-service/src/scanner/scanner-utils.ts index 05bd24f6..4808f2fe 100644 --- a/apps/rosen-service/src/scanner/scanner-utils.ts +++ b/apps/rosen-service/src/scanner/scanner-utils.ts @@ -11,7 +11,7 @@ import AppError from '../errors/AppError'; * @param loggerFileName * @param updateInterval */ -const startScannerUpdateJob = ( +export const startScanner = ( scanner: GeneralScanner, loggerFileName: string, updateInterval: number @@ -45,19 +45,3 @@ const startScannerUpdateJob = ( interval: updateInterval, }); }; - -/** - * start a scanner, initializing it and calling its update method periodically - * @param scanner - * @param loggerFileName - * @param updateInterval - */ -export const startScanner = async ( - scanner: GeneralScanner, - loggerFileName: string, - updateInterval: number -) => { - await scanner.initialize(); - - startScannerUpdateJob(scanner, loggerFileName, updateInterval); -}; From 913fdf24f4b65c16011e64767b986cb16d33b555 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sun, 6 Oct 2024 09:18:53 +0000 Subject: [PATCH 152/168] fix: Sort the results of the query on the assets repository service by the name property --- .changeset/few-rats-compete.md | 5 +++++ apps/rosen/app/_backend/assets/repository.ts | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/few-rats-compete.md diff --git a/.changeset/few-rats-compete.md b/.changeset/few-rats-compete.md new file mode 100644 index 00000000..62250382 --- /dev/null +++ b/.changeset/few-rats-compete.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': patch +--- + +Sort the results of the query on the assets repository service by the name property diff --git a/apps/rosen/app/_backend/assets/repository.ts b/apps/rosen/app/_backend/assets/repository.ts index 0a4bdc7c..22c56c19 100644 --- a/apps/rosen/app/_backend/assets/repository.ts +++ b/apps/rosen/app/_backend/assets/repository.ts @@ -109,6 +109,7 @@ export const getAllAssets = async ( 'count(*) over() AS total', ]) .where(filters) + .orderBy('name', 'ASC') .offset(offset) .limit(limit) .getRawMany(); From d7498cd071ee22785bb9242bca1cddfa4ec818c6 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sun, 6 Oct 2024 14:37:53 +0000 Subject: [PATCH 153/168] fix: Fix the external token link within the assets page --- .changeset/cyan-tips-suffer.md | 5 +++++ apps/rosen/app/assets/TableRow.tsx | 11 ++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 .changeset/cyan-tips-suffer.md diff --git a/.changeset/cyan-tips-suffer.md b/.changeset/cyan-tips-suffer.md new file mode 100644 index 00000000..ceac8d1a --- /dev/null +++ b/.changeset/cyan-tips-suffer.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': patch +--- + +Fix the external token link within the assets page diff --git a/apps/rosen/app/assets/TableRow.tsx b/apps/rosen/app/assets/TableRow.tsx index a2e04054..eb5700fa 100644 --- a/apps/rosen/app/assets/TableRow.tsx +++ b/apps/rosen/app/assets/TableRow.tsx @@ -339,7 +339,12 @@ export const TabletRow: FC = (props) => { {data.bridged.map((item) => { - const txUrl = getTxURL(item.chain, item.birdgedTokenId); + const tokenUrl = getTokenUrl( + item.chain, + item.chain == NETWORKS.CARDANO + ? item.birdgedTokenId.replace('.', '') + : item.birdgedTokenId, + ); return ( = (props) => { gap={1} > - {txUrl && ( - + {tokenUrl && ( + Date: Mon, 7 Oct 2024 09:04:56 +0000 Subject: [PATCH 154/168] fix: Address the issue concerning the display of hot, cold, and locked amount values on the assets page --- .changeset/fresh-chairs-move.md | 5 +++++ apps/rosen/app/_backend/assets/services.ts | 23 +++++++++++++++++----- apps/rosen/app/assets/TableRow.tsx | 12 ++++++++--- 3 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 .changeset/fresh-chairs-move.md diff --git a/.changeset/fresh-chairs-move.md b/.changeset/fresh-chairs-move.md new file mode 100644 index 00000000..8d702c71 --- /dev/null +++ b/.changeset/fresh-chairs-move.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': patch +--- + +Address the issue concerning the display of hot, cold, and locked amount values on the assets page diff --git a/apps/rosen/app/_backend/assets/services.ts b/apps/rosen/app/_backend/assets/services.ts index 44f57b8a..cb13e008 100644 --- a/apps/rosen/app/_backend/assets/services.ts +++ b/apps/rosen/app/_backend/assets/services.ts @@ -1,9 +1,15 @@ +import { TokenMap } from '@rosen-bridge/tokens'; + +import { getRosenTokens } from '@/_backend/utils'; + import { AssetFilters, getAsset as repositoryGetAsset, getAllAssets as repositoryGetAllAssets, } from './repository'; +const tokenMap = new TokenMap(getRosenTokens()); + /** * return asset details * @param offset @@ -21,7 +27,7 @@ export const getAsset = async (id: string) => { bridged: assetDetails.bridged.map((bridgedItem) => ({ chain: bridgedItem.chain, amount: bridgedItem.amount.toString(), - birdgedTokenId: bridgedItem.bridgedTokenId + birdgedTokenId: bridgedItem.bridgedTokenId, })), }; }; @@ -40,9 +46,16 @@ export const getAllAssets = async ( return { total: assets.total, - items: assets.items.map((asset) => ({ - ...asset, - id: asset.isNative ? asset.name : asset.id, - })), + items: assets.items.map((asset) => { + const id = asset.isNative ? asset.name : asset.id; + + const significantDecimals = tokenMap.getSignificantDecimals(id) || 0; + + return { + ...asset, + id, + significantDecimals, + }; + }), }; }; diff --git a/apps/rosen/app/assets/TableRow.tsx b/apps/rosen/app/assets/TableRow.tsx index a2e04054..d2aa16b6 100644 --- a/apps/rosen/app/assets/TableRow.tsx +++ b/apps/rosen/app/assets/TableRow.tsx @@ -265,13 +265,16 @@ export const TabletRow: FC = (props) => { {getDecimalString( ((hot?.amount || 0) + (cold?.amount || 0)).toString(), - row.decimal, + row.significantDecimals, )} - {getDecimalString(hot?.amount.toString() || '0', row.decimal)} + {getDecimalString( + hot?.amount.toString() || '0', + row.significantDecimals, + )} {hotUrl && ( @@ -285,7 +288,10 @@ export const TabletRow: FC = (props) => { - {getDecimalString(cold?.amount.toString() || '0', row.decimal)} + {getDecimalString( + cold?.amount.toString() || '0', + row.significantDecimals, + )} {coldUrl && ( From 0ec894d4371d194ad3baf58bd6425f0a7561ec74 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 7 Oct 2024 10:28:22 +0000 Subject: [PATCH 155/168] chore: Enhance the generateUnsignedTx utility functions within the networks package --- .changeset/angry-flies-march.md | 8 + networks/bitcoin/src/generateUnsignedTx.ts | 198 +++++++-------- networks/cardano/src/generateUnsignedTx.ts | 229 ++++++++---------- networks/ergo/src/generateUnsignedTx.ts | 190 ++++++--------- networks/ethereum/src/generateTxParameters.ts | 75 +++--- 5 files changed, 307 insertions(+), 393 deletions(-) create mode 100644 .changeset/angry-flies-march.md diff --git a/.changeset/angry-flies-march.md b/.changeset/angry-flies-march.md new file mode 100644 index 00000000..31632311 --- /dev/null +++ b/.changeset/angry-flies-march.md @@ -0,0 +1,8 @@ +--- +'@rosen-network/ethereum': patch +'@rosen-network/bitcoin': patch +'@rosen-network/cardano': patch +'@rosen-network/ergo': patch +--- + +Enhance the generateUnsignedTx utility functions within the networks package diff --git a/networks/bitcoin/src/generateUnsignedTx.ts b/networks/bitcoin/src/generateUnsignedTx.ts index 11ad4e24..b3725e71 100644 --- a/networks/bitcoin/src/generateUnsignedTx.ts +++ b/networks/bitcoin/src/generateUnsignedTx.ts @@ -15,124 +15,108 @@ import { RosenAmountValue } from '@rosen-ui/types'; /** * generates bitcoin lock tx - * @param lockAddress - * @param fromAddress - * @param amount - * @param opReturnData + * @param tokenMap * @returns */ -const generateUnsignedTxCore = async ( - lockAddress: string, - fromAddress: string, - amount: bigint, - opReturnData: string -): Promise => { - // generate txBuilder - const psbt = new Psbt(); - - // generate OP_RETURN box - const opReturnPayment = payments.embed({ - data: [Buffer.from(opReturnData, 'hex')], - }); - psbt.addOutput({ - script: opReturnPayment.output!, - value: 0, - }); - - // generate lock box - const lockPayment = payments.p2wpkh({ - address: lockAddress, - }); - psbt.addOutput({ - script: lockPayment.output!, - value: Number(amount), - }); - - // estimate tx weight without considering inputs - // 0 inputs, 2 outputs, 1 for feeRatio to get weights only, multiply by 4 to convert vSize to weight unit - let estimatedTxWeight = estimateTxWeight(0, 2, opReturnData.length); - - // fetch inputs - const utxoIterator = (await getAddressUtxos(fromAddress)).values(); - const feeRatio = await getFeeRatio(); - const minSatoshi = getMinimumMeaningfulSatoshi(feeRatio); - const coveredBoxes = await selectBitcoinUtxos( - amount + minSatoshi, - [], - new Map(), - utxoIterator, - minSatoshi, - SEGWIT_INPUT_WEIGHT_UNIT, - estimatedTxWeight, - feeRatio - ); - if (!coveredBoxes.covered) { - throw new Error( - `Available boxes didn't cover required assets. BTC: ${ - amount + minSatoshi - }` - ); - } - - // add inputs - const fromAddressScript = address.toOutputScript(fromAddress); - coveredBoxes.boxes.forEach((box) => { - psbt.addInput({ - hash: box.txId, - index: box.index, - witnessUtxo: { - script: fromAddressScript, - value: Number(box.value), - }, - }); - }); - - // calculate input boxes assets - let remainingBtc = - coveredBoxes.boxes.reduce((a, b) => a + b.value, 0n) - amount; - - // create change output - estimatedTxWeight = estimateTxWeight( - psbt.txInputs.length, - 2, - opReturnData.length - ); - const estimatedFee = BigInt( - Math.ceil( - (estimatedTxWeight / 4) * // estimate tx weight and convert to virtual size - feeRatio - ) - ); - remainingBtc -= estimatedFee; - psbt.addOutput({ - script: fromAddressScript, - value: Number(remainingBtc), - }); - - return { - psbt: psbt.toBase64(), - inputSize: psbt.inputCount, - }; -}; - -export const generateUnsignedTx = (tokenMap: TokenMap) => { - return ( +export const generateUnsignedTx = + (tokenMap: TokenMap) => + async ( lockAddress: string, fromAddress: string, wrappedAmount: RosenAmountValue, opReturnData: string, token: RosenChainToken - ) => { + ): Promise => { const unwrappedAmount = tokenMap.unwrapAmount( token[tokenMap.getIdKey(NETWORKS.BITCOIN)], wrappedAmount, NETWORKS.BITCOIN ).amount; - return generateUnsignedTxCore( - lockAddress, - fromAddress, - unwrappedAmount, - opReturnData + + // generate txBuilder + const psbt = new Psbt(); + + // generate OP_RETURN box + const opReturnPayment = payments.embed({ + data: [Buffer.from(opReturnData, 'hex')], + }); + psbt.addOutput({ + script: opReturnPayment.output!, + value: 0, + }); + + // generate lock box + const lockPayment = payments.p2wpkh({ + address: lockAddress, + }); + psbt.addOutput({ + script: lockPayment.output!, + value: Number(unwrappedAmount), + }); + + // estimate tx weight without considering inputs + // 0 inputs, 2 outputs, 1 for feeRatio to get weights only, multiply by 4 to convert vSize to weight unit + let estimatedTxWeight = estimateTxWeight(0, 2, opReturnData.length); + + // fetch inputs + const utxoIterator = (await getAddressUtxos(fromAddress)).values(); + const feeRatio = await getFeeRatio(); + const minSatoshi = getMinimumMeaningfulSatoshi(feeRatio); + const coveredBoxes = await selectBitcoinUtxos( + unwrappedAmount + minSatoshi, + [], + new Map(), + utxoIterator, + minSatoshi, + SEGWIT_INPUT_WEIGHT_UNIT, + estimatedTxWeight, + feeRatio + ); + if (!coveredBoxes.covered) { + throw new Error( + `Available boxes didn't cover required assets. BTC: ${ + unwrappedAmount + minSatoshi + }` + ); + } + + // add inputs + const fromAddressScript = address.toOutputScript(fromAddress); + coveredBoxes.boxes.forEach((box) => { + psbt.addInput({ + hash: box.txId, + index: box.index, + witnessUtxo: { + script: fromAddressScript, + value: Number(box.value), + }, + }); + }); + + // calculate input boxes assets + let remainingBtc = + coveredBoxes.boxes.reduce((a, b) => a + b.value, 0n) - unwrappedAmount; + + // create change output + estimatedTxWeight = estimateTxWeight( + psbt.txInputs.length, + 2, + opReturnData.length ); + const estimatedFee = BigInt( + Math.ceil( + (estimatedTxWeight / 4) * // estimate tx weight and convert to virtual size + feeRatio + ) + ); + remainingBtc -= estimatedFee; + psbt.addOutput({ + script: fromAddressScript, + value: Number(remainingBtc), + }); + + return { + psbt: psbt.toBase64(), + inputSize: psbt.inputCount, + }; }; -}; diff --git a/networks/cardano/src/generateUnsignedTx.ts b/networks/cardano/src/generateUnsignedTx.ts index 9c31ab16..6b0d3919 100644 --- a/networks/cardano/src/generateUnsignedTx.ts +++ b/networks/cardano/src/generateUnsignedTx.ts @@ -21,126 +21,12 @@ import { RosenAmountValue } from '@rosen-ui/types'; /** * generates a lock transaction on Cardano - * @param wallet - * @param lockAddress - * @param changeAddressHex - * @param policyIdHex - * @param assetNameHex - * @param amount - * @param auxiliaryData - * @returns hex representation of the unsigned tx + * @param tokenMap + * @returns a function that provides the hex representation of the unsigned tx upon invocation */ -const generateUnsignedTxCore = async ( - walletUtxos: string[], - lockAddress: string, - changeAddressHex: string, - policyIdHex: string, - assetNameHex: string, - amountString: string, - auxiliaryDataHex: string -): Promise => { - const amount = BigInt(amountString); - - // converts hex address to bech32 address - const changeAddress = wasm.Address.from_hex(changeAddressHex).to_bech32(); - - const auxiliaryData = wasm.AuxiliaryData.from_hex(auxiliaryDataHex); - // generate txBuilder - const protocolParams = await getCardanoProtocolParams(); - const txBuilder = wasm.TransactionBuilder.new( - getTxBuilderConfig(protocolParams) - ); - - // generate lock box - const lockAssets: AssetBalance = { - nativeToken: 0n, - tokens: [], - }; - if (policyIdHex === ADA_POLICY_ID) { - // lock ADA - lockAssets.nativeToken = amount; - } else { - // lock asset - lockAssets.tokens.push({ - id: `${policyIdHex}.${assetNameHex}`, - value: amount, - }); - } - const lockBox = generateOutputBox( - lockAssets, - lockAddress, - protocolParams.coins_per_utxo_size - ); - - // add lock box to tx and calculate required assets to get input boxes - lockAssets.nativeToken = BigInt(lockBox.amount().coin().to_str()); - const requiredAssets: AssetBalance = structuredClone(lockAssets); - txBuilder.add_output(lockBox); - - const utxos = await Promise.all(walletUtxos.map(walletUtxoToCardanoUtxo)); - // add required ADA estimation for tx fee and change box - requiredAssets.nativeToken += feeAndMinBoxValue; - // get input boxes, THIS FUNCTION WORKS WITH UNWRAPPED-VALUE - const inputs = await selectCardanoUtxos( - requiredAssets, - [], - new Map(), - utxos.values() - ); - if (!inputs.covered) throw Error(`Not enough assets`); - let inputAssets: AssetBalance = { - nativeToken: 0n, - tokens: [], - }; - // add input boxes to transaction - inputs.boxes.forEach((utxo) => { - inputAssets = sumAssetBalance(inputAssets, getUtxoAssets(utxo)); - txBuilder.add_input( - wasm.Address.from_bech32(utxo.address), - wasm.TransactionInput.new( - wasm.TransactionHash.from_hex(utxo.txId), - utxo.index - ), - lockBox.amount() - ); - }); - - // set temp fee and auxiliary data - txBuilder.set_fee(txBuilder.min_fee()); - txBuilder.set_auxiliary_data(auxiliaryData); - - // calculate change box assets and transaction fee - const changeAssets = subtractAssetBalance(inputAssets, lockAssets); - const tempChangeBox = generateOutputBox( - changeAssets, - changeAddress, - protocolParams.coins_per_utxo_size - ); - const fee = txBuilder - .min_fee() - .checked_add(txBuilder.fee_for_output(tempChangeBox)); - changeAssets.nativeToken -= BigInt(fee.to_str()); - const changeBox = generateOutputBox( - changeAssets, - changeAddress, - protocolParams.coins_per_utxo_size - ); - txBuilder.add_output(changeBox); - - // set tx fee - txBuilder.set_fee(fee); - - // build transaction - const txBody = txBuilder.build(); - - // build unsigned transaction object - const witnessSet = wasm.TransactionWitnessSet.new(); - const tx = wasm.Transaction.new(txBody, witnessSet, auxiliaryData); - return tx.to_hex(); -}; - -export const generateUnsignedTx = (tokenMap: TokenMap) => { - return ( +export const generateUnsignedTx = + (tokenMap: TokenMap) => + async ( walletUtxos: string[], lockAddress: string, changeAddressHex: string, @@ -148,20 +34,107 @@ export const generateUnsignedTx = (tokenMap: TokenMap) => { assetNameHex: string, wrappedAmount: RosenAmountValue, auxiliaryDataHex: string - ) => { + ): Promise => { const unwrappedAmount = tokenMap.unwrapAmount( `${policyIdHex}.${assetNameHex}`, wrappedAmount, NETWORKS.CARDANO ).amount; - return generateUnsignedTxCore( - walletUtxos, + + // converts hex address to bech32 address + const changeAddress = wasm.Address.from_hex(changeAddressHex).to_bech32(); + + const auxiliaryData = wasm.AuxiliaryData.from_hex(auxiliaryDataHex); + // generate txBuilder + const protocolParams = await getCardanoProtocolParams(); + const txBuilder = wasm.TransactionBuilder.new( + getTxBuilderConfig(protocolParams) + ); + + // generate lock box + const lockAssets: AssetBalance = { + nativeToken: 0n, + tokens: [], + }; + if (policyIdHex === ADA_POLICY_ID) { + // lock ADA + lockAssets.nativeToken = unwrappedAmount; + } else { + // lock asset + lockAssets.tokens.push({ + id: `${policyIdHex}.${assetNameHex}`, + value: unwrappedAmount, + }); + } + const lockBox = generateOutputBox( + lockAssets, lockAddress, - changeAddressHex, - policyIdHex, - assetNameHex, - unwrappedAmount.toString(), - auxiliaryDataHex + protocolParams.coins_per_utxo_size ); + + // add lock box to tx and calculate required assets to get input boxes + lockAssets.nativeToken = BigInt(lockBox.amount().coin().to_str()); + const requiredAssets: AssetBalance = structuredClone(lockAssets); + txBuilder.add_output(lockBox); + + const utxos = await Promise.all(walletUtxos.map(walletUtxoToCardanoUtxo)); + // add required ADA estimation for tx fee and change box + requiredAssets.nativeToken += feeAndMinBoxValue; + // get input boxes, THIS FUNCTION WORKS WITH UNWRAPPED-VALUE + const inputs = await selectCardanoUtxos( + requiredAssets, + [], + new Map(), + utxos.values() + ); + if (!inputs.covered) throw Error(`Not enough assets`); + let inputAssets: AssetBalance = { + nativeToken: 0n, + tokens: [], + }; + // add input boxes to transaction + inputs.boxes.forEach((utxo) => { + inputAssets = sumAssetBalance(inputAssets, getUtxoAssets(utxo)); + txBuilder.add_input( + wasm.Address.from_bech32(utxo.address), + wasm.TransactionInput.new( + wasm.TransactionHash.from_hex(utxo.txId), + utxo.index + ), + lockBox.amount() + ); + }); + + // set temp fee and auxiliary data + txBuilder.set_fee(txBuilder.min_fee()); + txBuilder.set_auxiliary_data(auxiliaryData); + + // calculate change box assets and transaction fee + const changeAssets = subtractAssetBalance(inputAssets, lockAssets); + const tempChangeBox = generateOutputBox( + changeAssets, + changeAddress, + protocolParams.coins_per_utxo_size + ); + const fee = txBuilder + .min_fee() + .checked_add(txBuilder.fee_for_output(tempChangeBox)); + changeAssets.nativeToken -= BigInt(fee.to_str()); + const changeBox = generateOutputBox( + changeAssets, + changeAddress, + protocolParams.coins_per_utxo_size + ); + txBuilder.add_output(changeBox); + + // set tx fee + txBuilder.set_fee(fee); + + // build transaction + const txBody = txBuilder.build(); + + // build unsigned transaction object + const witnessSet = wasm.TransactionWitnessSet.new(); + const tx = wasm.Transaction.new(txBody, witnessSet, auxiliaryData); + return tx.to_hex(); }; -}; diff --git a/networks/ergo/src/generateUnsignedTx.ts b/networks/ergo/src/generateUnsignedTx.ts index 8ce15871..ffdbac37 100644 --- a/networks/ergo/src/generateUnsignedTx.ts +++ b/networks/ergo/src/generateUnsignedTx.ts @@ -20,110 +20,12 @@ import { Network, RosenAmountValue } from '@rosen-ui/types'; /** * generates an unsigned lock transaction on Ergo - * @param changeAddress - * @param walletUtxos - * @param lockAddress - * @param toChain - * @param toAddress - * @param tokenId - * @param amount - * @param bridgeFee - * @param networkFee + * @param tokenMap * @returns */ -const generateUnsignedTxCore = async ( - changeAddress: string, - walletUtxos: ErgoBoxProxy[], - lockAddress: string, - toChain: Network, - toAddress: string, - tokenId: string, - amountString: string, - bridgeFeeString: string, - networkFeeString: string -): Promise => { - const height = await getHeight(); - - const amount = BigInt(amountString); - const bridgeFee = BigInt(bridgeFeeString); - const networkFee = BigInt(networkFeeString); - - // generate lock box - const lockAssets: AssetBalance = { - nativeToken: minBoxValue, - tokens: [], - }; - if (tokenId === 'erg') { - /** - * TODO: fix ergo native token name - * local:ergo/rosen-bridge/ui#100 - */ - lockAssets.nativeToken = amount; - } else { - // lock token - lockAssets.tokens.push({ id: tokenId, value: amount }); - } - const lockBox = createLockBox( - lockAddress, - height, - tokenId, - amount, - toChain, - toAddress, - changeAddress, - bridgeFee, - networkFee - ); - // calculate required assets to get input boxes - const requiredAssets = sumAssetBalance(lockAssets, { - nativeToken: minBoxValue + fee, - tokens: [], - }); - - // get input boxes - const inputs = await getCoveringBoxes( - requiredAssets, - [], - new Map(), - walletUtxos.values() - ); - if (!inputs.covered) throw Error(`Not enough assets`); - let inputAssets: AssetBalance = { - nativeToken: 0n, - tokens: [], - }; - // add input boxes to transaction - const unsignedInputs = new wasm.UnsignedInputs(); - inputs.boxes.forEach((box) => { - unsignedInputs.add( - wasm.UnsignedInput.from_box_id(wasm.BoxId.from_str(box.boxId)) - ); - inputAssets = sumAssetBalance(inputAssets, getBoxAssets(box)); - }); - - // calculate change box assets and transaction fee - const changeAssets = subtractAssetBalance(inputAssets, lockAssets); - changeAssets.nativeToken -= fee; - const changeBox = createChangeBox(changeAddress, height, changeAssets); - const feeBox = wasm.ErgoBoxCandidate.new_miner_fee_box( - wasm.BoxValue.from_i64(wasm.I64.from_str(fee.toString())), - height - ); - - const txOutputs = new wasm.ErgoBoxCandidates(lockBox); - txOutputs.add(changeBox); - txOutputs.add(feeBox); - - const unsignedTx = new wasm.UnsignedTransaction( - unsignedInputs, - new wasm.DataInputs(), - txOutputs - ); - return unsignedTransactionToProxy(unsignedTx, inputs.boxes); -}; - -export const generateUnsignedTx = (tokenMap: TokenMap) => { - return ( +export const generateUnsignedTx = + (tokenMap: TokenMap) => + async ( changeAddress: string, walletUtxos: ErgoBoxProxy[], lockAddress: string, @@ -133,23 +35,89 @@ export const generateUnsignedTx = (tokenMap: TokenMap) => { bridgeFeeString: string, networkFeeString: string, token: RosenChainToken - ) => { + ): Promise => { const tokenId = token[tokenMap.getIdKey(NETWORKS.ERGO)]; const unwrappedAmount = tokenMap.unwrapAmount( tokenId, wrappedAmount, NETWORKS.ERGO ).amount; - return generateUnsignedTxCore( - changeAddress, - walletUtxos, + + const height = await getHeight(); + + const bridgeFee = BigInt(bridgeFeeString); + const networkFee = BigInt(networkFeeString); + + // generate lock box + const lockAssets: AssetBalance = { + nativeToken: minBoxValue, + tokens: [], + }; + if (tokenId === 'erg') { + /** + * TODO: fix ergo native token name + * local:ergo/rosen-bridge/ui#100 + */ + lockAssets.nativeToken = unwrappedAmount; + } else { + // lock token + lockAssets.tokens.push({ id: tokenId, value: unwrappedAmount }); + } + const lockBox = createLockBox( lockAddress, + height, + tokenId, + unwrappedAmount, toChain, toAddress, - tokenId, - unwrappedAmount.toString(), - bridgeFeeString, - networkFeeString + changeAddress, + bridgeFee, + networkFee + ); + // calculate required assets to get input boxes + const requiredAssets = sumAssetBalance(lockAssets, { + nativeToken: minBoxValue + fee, + tokens: [], + }); + + // get input boxes + const inputs = await getCoveringBoxes( + requiredAssets, + [], + new Map(), + walletUtxos.values() + ); + if (!inputs.covered) throw Error(`Not enough assets`); + let inputAssets: AssetBalance = { + nativeToken: 0n, + tokens: [], + }; + // add input boxes to transaction + const unsignedInputs = new wasm.UnsignedInputs(); + inputs.boxes.forEach((box) => { + unsignedInputs.add( + wasm.UnsignedInput.from_box_id(wasm.BoxId.from_str(box.boxId)) + ); + inputAssets = sumAssetBalance(inputAssets, getBoxAssets(box)); + }); + + // calculate change box assets and transaction fee + const changeAssets = subtractAssetBalance(inputAssets, lockAssets); + changeAssets.nativeToken -= fee; + const changeBox = createChangeBox(changeAddress, height, changeAssets); + const feeBox = wasm.ErgoBoxCandidate.new_miner_fee_box( + wasm.BoxValue.from_i64(wasm.I64.from_str(fee.toString())), + height + ); + + const txOutputs = new wasm.ErgoBoxCandidates(lockBox); + txOutputs.add(changeBox); + txOutputs.add(feeBox); + + const unsignedTx = new wasm.UnsignedTransaction( + unsignedInputs, + new wasm.DataInputs(), + txOutputs ); + return unsignedTransactionToProxy(unsignedTx, inputs.boxes); }; -}; diff --git a/networks/ethereum/src/generateTxParameters.ts b/networks/ethereum/src/generateTxParameters.ts index ed2923b7..936d5a2e 100644 --- a/networks/ethereum/src/generateTxParameters.ts +++ b/networks/ethereum/src/generateTxParameters.ts @@ -6,47 +6,12 @@ import { Contract } from 'ethers'; /** * generates ethereum lock tx - * @param tokenId - * @param lockAddress - * @param fromAddress - * @param amount - * @param rosenData + * @param tokenMap * @returns */ -export const generateTxParametersCore = async ( - tokenId: string, - lockAddress: string, - fromAddress: string, - amount: RosenAmountValue, - rosenData: string -) => { - let transactionParameters; - if (tokenId === ETH) { - transactionParameters = { - to: lockAddress, - from: fromAddress, - data: '0x' + rosenData, - value: amount.toString(16), - }; - } else { - const contract = new Contract(tokenId, transferABI, undefined); - const data = contract.interface.encodeFunctionData('transfer', [ - lockAddress, - amount.toString(), - ]); - - transactionParameters = { - to: tokenId, - from: fromAddress, - data: data + rosenData, - }; - } - - return transactionParameters; -}; - -export const generateTxParameters = (tokenMap: TokenMap) => { - return ( +export const generateTxParameters = + (tokenMap: TokenMap) => + async ( tokenId: string, lockAddress: string, fromAddress: string, @@ -59,12 +24,28 @@ export const generateTxParameters = (tokenMap: TokenMap) => { wrappedAmount, NETWORKS.ETHEREUM ).amount; - return generateTxParametersCore( - tokenId, - lockAddress, - fromAddress, - unwrappedAmount, - rosenData - ); + + let transactionParameters; + if (tokenId === ETH) { + transactionParameters = { + to: lockAddress, + from: fromAddress, + data: '0x' + rosenData, + value: unwrappedAmount.toString(16), + }; + } else { + const contract = new Contract(tokenId, transferABI, undefined); + const data = contract.interface.encodeFunctionData('transfer', [ + lockAddress, + unwrappedAmount.toString(), + ]); + + transactionParameters = { + to: tokenId, + from: fromAddress, + data: data + rosenData, + }; + } + + return transactionParameters; }; -}; From 7bec3c707f7259ba8fd1ab46809cc593fe931c0d Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 7 Oct 2024 13:31:21 +0000 Subject: [PATCH 156/168] feat: Enhance the sidebar component to accept child elements as specific props --- .changeset/fresh-crews-think.md | 6 + apps/rosen/app/App.tsx | 2 +- apps/rosen/app/SideBar.tsx | 151 ++++++------------ .../ui-kit/src/components/common/AppBar.tsx | 95 +++++++++-- .../components/common/NavigationButton.tsx | 16 +- 5 files changed, 155 insertions(+), 115 deletions(-) create mode 100644 .changeset/fresh-crews-think.md diff --git a/.changeset/fresh-crews-think.md b/.changeset/fresh-crews-think.md new file mode 100644 index 00000000..e63c365b --- /dev/null +++ b/.changeset/fresh-crews-think.md @@ -0,0 +1,6 @@ +--- +'@rosen-bridge/ui-kit': minor +'@rosen-bridge/rosen-app': minor +--- + +Improve the sidebar component to accept child elements as specific props, enhancing maintainability and enabling future implementation of responsive design diff --git a/apps/rosen/app/App.tsx b/apps/rosen/app/App.tsx index 7169698c..9baaa9d1 100644 --- a/apps/rosen/app/App.tsx +++ b/apps/rosen/app/App.tsx @@ -10,7 +10,7 @@ import { NoSsr } from '@mui/material'; import { styled, AppSnackbar, SnackbarProvider } from '@rosen-bridge/ui-kit'; -import SideBar from './SideBar'; +import { SideBar } from './SideBar'; import Toolbar from './Toolbar'; import ThemeProvider from '@/_theme/ThemeProvider'; diff --git a/apps/rosen/app/SideBar.tsx b/apps/rosen/app/SideBar.tsx index 177831d9..f6dd4c04 100644 --- a/apps/rosen/app/SideBar.tsx +++ b/apps/rosen/app/SideBar.tsx @@ -8,117 +8,66 @@ import { Exchange, Headphones, } from '@rosen-bridge/icons'; -import { - AppBar, - AppLogo, - Badge, - Grid, - NavigationButton, - SvgIcon, - Typography, -} from '@rosen-bridge/ui-kit'; +import { AppBar, AppLogo } from '@rosen-bridge/ui-kit'; import packageJson from '../package.json'; /** * render sidebar log and navigaiton buttons */ -const SideBar = () => { +export const SideBar = () => { const pathname = usePathname(); const router = useRouter(); return ( - - - - - - - - - - } - onClick={() => - router.push('/' as Parameters[0]) - } - isActive={pathname === '/'} - /> - - - - - - } - onClick={() => router.push('/events')} - isActive={pathname === '/events'} - /> - - - - - - - - } - onClick={() => router.push('/assets')} - isActive={pathname.startsWith('/assets')} - /> - - - - - - } - onClick={() => router.push('/support')} - isActive={pathname.startsWith('/support')} - disabled - /> - - - - - - } - onClick={() => router.push('/dashboard')} - isActive={pathname.startsWith('/dashboard')} - disabled - /> - - - - - UI v{packageJson.version} - - - + + + + } + versions={[ + { + title: 'UI', + value: packageJson.version, + }, + ]} + routes={[ + { + label: 'Bridge', + path: '/', + disabled: false, + icon: , + }, + { + label: 'Events', + path: '/events', + disabled: false, + icon: , + }, + { + label: 'Assets', + path: '/assets', + disabled: false, + icon: , + badge: 'Beta', + }, + { + label: 'Support', + path: '/support', + disabled: true, + icon: , + }, + { + label: 'Dashboard', + path: '/dashboard', + disabled: true, + icon: , + }, + ]} + isActive={(route) => pathname === route.path} + onNavigate={(route) => router.push(route.path)} + /> ); }; - -export default SideBar; diff --git a/packages/ui-kit/src/components/common/AppBar.tsx b/packages/ui-kit/src/components/common/AppBar.tsx index 1146e4ab..d5c463df 100644 --- a/packages/ui-kit/src/components/common/AppBar.tsx +++ b/packages/ui-kit/src/components/common/AppBar.tsx @@ -1,17 +1,36 @@ -import { Box } from '../base'; +import { FC, ReactNode } from 'react'; import { styled } from '../../styling'; +import { Box, CircularProgress, Grid, Typography } from '../base'; +import { NavigationButton } from './NavigationButton'; -/** - * renders a appBar wrapper - * this component set the appBar size and orientation in different screen sizes - * - * @property {ReactNode} children - should be the list of react elements that need to be in the toolbar - */ +interface AppBarProps { + children?: ReactNode; + logo?: ReactNode; + routes?: Route[]; + versions?: Version[]; + isActive?: (route: Route) => boolean; + onNavigate?: (route: Route) => void; +} + +interface Route { + badge?: string; + disabled?: boolean; + icon: ReactNode; + label: string; + path: string; +} + +interface Version { + important?: boolean; + title: string; + value: string; +} -export const AppBar = styled(Box)(({ theme }) => ({ - padding: theme.spacing(2), - flexBasis: 112, +const Root = styled(Box)(({ theme }) => ({ + padding: theme.spacing(2) + ' 0', + flexBasis: 116, + flexShrink: 0, display: 'flex', flexDirection: 'column', alignItems: 'center', @@ -21,3 +40,59 @@ export const AppBar = styled(Box)(({ theme }) => ({ flexDirection: 'row', }, })); + +/** + * renders a appBar wrapper + * this component set the appBar size and orientation in different screen sizes + */ +export const AppBar: FC = (props) => { + const { children, logo, routes, versions, isActive, onNavigate } = props; + return ( + + {children} + {logo} + {routes && ( + + {routes.map((route) => ( + + onNavigate?.(route)} + /> + + ))} + + )} + {versions && + versions.map((version) => ( + + {version.value && ( + + {version.title} v{version.value} + + )} + {!version.value && ( + + + + )} + + ))} + + ); +}; diff --git a/packages/ui-kit/src/components/common/NavigationButton.tsx b/packages/ui-kit/src/components/common/NavigationButton.tsx index aaed384f..c8393d60 100644 --- a/packages/ui-kit/src/components/common/NavigationButton.tsx +++ b/packages/ui-kit/src/components/common/NavigationButton.tsx @@ -1,5 +1,5 @@ import { EventHandler, FC, ReactNode, SyntheticEvent } from 'react'; -import { Button } from '../base'; +import { Badge, Button, SvgIcon } from '../base'; import { useIsMobile } from '../../hooks'; @@ -58,6 +58,7 @@ interface NavButtonProps { onClick: EventHandler; isActive?: boolean; disabled?: boolean; + badge?: string; } /** @@ -71,15 +72,24 @@ interface NavButtonProps { */ export const NavigationButton: FC = (props) => { - const { label, icon, isActive, onClick, disabled } = props; + const { badge, label, icon, isActive, onClick, disabled } = props; const isMobile = useIsMobile(); + let startIcon = {icon}; + + if (badge) + startIcon = ( + + {startIcon} + + ); + return ( From 382bacbfd1e51ad1cdb6e91742429150bf8da62b Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 12 Oct 2024 11:09:32 +0330 Subject: [PATCH 157/168] feat: Enhance the theme provider logic within the Rosen app --- .changeset/dull-penguins-fold.md | 5 + .changeset/tall-rules-tickle.md | 5 + apps/rosen/app/App.tsx | 39 +-- apps/rosen/app/Toolbar.tsx | 10 +- apps/rosen/app/ToolbarActions.tsx | 30 --- apps/rosen/app/_theme/ThemeProvider.tsx | 249 ------------------ apps/rosen/app/_theme/theme.tsx | 229 ++++++++++++++++ package-lock.json | 1 + packages/ui-kit/package.json | 1 + .../ui-kit/src/Providers/ThemeProvider.tsx | 53 +++- .../common/ToolbarThemeTogglerAction.tsx | 21 ++ .../ui-kit/src/components/common/index.ts | 1 + packages/ui-kit/src/hooks/index.ts | 1 + packages/ui-kit/src/hooks/useThemeToggler.ts | 5 + 14 files changed, 344 insertions(+), 306 deletions(-) create mode 100644 .changeset/dull-penguins-fold.md create mode 100644 .changeset/tall-rules-tickle.md delete mode 100644 apps/rosen/app/ToolbarActions.tsx delete mode 100644 apps/rosen/app/_theme/ThemeProvider.tsx create mode 100644 apps/rosen/app/_theme/theme.tsx create mode 100644 packages/ui-kit/src/components/common/ToolbarThemeTogglerAction.tsx create mode 100644 packages/ui-kit/src/hooks/useThemeToggler.ts diff --git a/.changeset/dull-penguins-fold.md b/.changeset/dull-penguins-fold.md new file mode 100644 index 00000000..eeba23e3 --- /dev/null +++ b/.changeset/dull-penguins-fold.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': minor +--- + +Revise the theme provider code to incorporate the latest updates from the design system diff --git a/.changeset/tall-rules-tickle.md b/.changeset/tall-rules-tickle.md new file mode 100644 index 00000000..e6cec827 --- /dev/null +++ b/.changeset/tall-rules-tickle.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/ui-kit': minor +--- + +Enhance the design system by adding the ToolbarThemeTogglerAction component, introducing a useThemeToggler hook, and updating the ThemeProvider to support overarching logic diff --git a/apps/rosen/app/App.tsx b/apps/rosen/app/App.tsx index 9baaa9d1..c3c670bf 100644 --- a/apps/rosen/app/App.tsx +++ b/apps/rosen/app/App.tsx @@ -8,12 +8,18 @@ import React from 'react'; */ import { NoSsr } from '@mui/material'; -import { styled, AppSnackbar, SnackbarProvider } from '@rosen-bridge/ui-kit'; +import { + styled, + AppSnackbar, + SnackbarProvider, + CssBaseline, + ThemeProvider, +} from '@rosen-bridge/ui-kit'; import { SideBar } from './SideBar'; import Toolbar from './Toolbar'; -import ThemeProvider from '@/_theme/ThemeProvider'; +import { theme } from '@/_theme/theme'; import { WalletContextProvider } from './_contexts/walletContext'; const Root = styled('div')(({ theme }) => ({ @@ -64,19 +70,22 @@ interface AppProps { const App = ({ children }: AppProps) => { return ( - - - - - -
- - {children} -
- -
-
-
+ + <> + + + + + +
+ + {children} +
+ +
+
+
+
); diff --git a/apps/rosen/app/Toolbar.tsx b/apps/rosen/app/Toolbar.tsx index 6d67f15d..2c79aa5f 100644 --- a/apps/rosen/app/Toolbar.tsx +++ b/apps/rosen/app/Toolbar.tsx @@ -1,9 +1,10 @@ import { useSelectedLayoutSegment } from 'next/navigation'; import React from 'react'; -import { Toolbar as UiKitToolbar } from '@rosen-bridge/ui-kit'; - -import ToolbarActions from './ToolbarActions'; +import { + ToolbarThemeTogglerAction, + Toolbar as UiKitToolbar, +} from '@rosen-bridge/ui-kit'; const pageTitleMap: Record = { '(bridge)': 'Rosen Bridge', @@ -22,8 +23,7 @@ const Toolbar = () => { return ( } - isCentered + toolbarActions={} /> ); }; diff --git a/apps/rosen/app/ToolbarActions.tsx b/apps/rosen/app/ToolbarActions.tsx deleted file mode 100644 index de261322..00000000 --- a/apps/rosen/app/ToolbarActions.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import React, { useContext } from 'react'; - -import { Moon, Sun } from '@rosen-bridge/icons'; -import { IconButton, SvgIcon, useIsDarkMode } from '@rosen-bridge/ui-kit'; - -import { ColorModeContext } from '@/_theme/ThemeProvider'; - -/** - * render some toolbar actions - */ -const ToolbarActions = () => { - const colorMode = useContext(ColorModeContext); - const isDarkMode = useIsDarkMode(); - - return ( - - {isDarkMode ? ( - - - - ) : ( - - - - )} - - ); -}; - -export default ToolbarActions; diff --git a/apps/rosen/app/_theme/ThemeProvider.tsx b/apps/rosen/app/_theme/ThemeProvider.tsx deleted file mode 100644 index 3c1fce2d..00000000 --- a/apps/rosen/app/_theme/ThemeProvider.tsx +++ /dev/null @@ -1,249 +0,0 @@ -import React, { createContext, useMemo, useState } from 'react'; - -import { - CssBaseline, - ThemeProvider as UiKitThemeProvider, - createTheme, - useMediaQuery, -} from '@rosen-bridge/ui-kit'; -import { useLocalStorageManager } from '@rosen-ui/common-hooks'; - -export const ColorModeContext = createContext({ toggle: () => {} }); - -export interface AppThemeProps { - children: React.ReactNode; -} - -type ColorModes = 'light' | 'dark'; - -declare module '@mui/material/styles' { - interface TypeBackground { - root: string; - content: string; - paper: string; - header: string; - shadow: string; - input: string; - } - - interface TypePaletteGradient { - baseOrange: string; - lightOrange: string; - lightDarkBackground: string; - baseDarkBackground: string; - darkBackgroundMid: string; - darkBackgroundMain: string; - } - - interface Palette { - gradient: TypePaletteGradient; - background: TypeBackground; - } - interface PaletteOptions { - gradient?: Partial; - background?: Partial; - } -} - -/** - * provide theme and color mode - */ -const ThemeProvider = ({ children }: AppThemeProps) => { - const localStorageManager = useLocalStorageManager(); - - const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)', { - noSsr: true, - }); - - const preferredColorMode = prefersDarkMode ? 'dark' : 'light'; - - const [mode, setMode] = useState<'light' | 'dark'>( - localStorageManager.get('colorMode') || preferredColorMode, - ); - - const colorMode = useMemo( - () => ({ - toggle: () => { - const newColorMode = mode === 'light' ? 'dark' : 'light'; - setMode(newColorMode); - localStorageManager.set('colorMode', newColorMode); - }, - }), - [localStorageManager, mode], - ); - - const theme = useMemo(() => { - const baseTheme = createTheme({ - palette: { - mode, - primary: { - light: '#d3e1f0', - main: '#396da3', - dark: '#25476a', - contrastText: '#fff', - }, - secondary: { - light: '#ffcd38', - main: '#ffc107', - dark: '#b28704', - contrastText: '#1A1A1A', - }, - gradient: { - baseOrange: '#fc7b41', - lightOrange: '#e2844a', - lightDarkBackground: '#52617e', - baseDarkBackground: '#164b7d', - darkBackgroundMid: '#4a626e', - darkBackgroundMain: '#1e2130', - }, - ...(mode === 'light' - ? { - background: { - root: '#1A1A1A', - content: 'rgba(247, 247, 247, 0.9)', - paper: 'rgb(247, 247, 247)', - header: '#E1E1E1', - shadow: 'rgba(0, 0, 0, 0.2)', - input: '#fff', - }, - info: { - light: '#f1f5ff', - main: '#5873de', - dark: '#384d78', - contrastText: '#fff', - }, - } - : { - background: { - root: '#0D1721', - content: '#2f3a48', - paper: 'rgb(26, 32, 41)', - header: '#253041', - shadow: 'rgba(0, 0, 0, 0.2)', - input: 'rgb(40, 49, 63)', - }, - info: { - light: '#9cbdd9', - main: '#2c396f', - dark: '#132236', - contrastText: '#fff', - }, - }), - }, - shape: { - borderRadius: 16, - }, - breakpoints: { - values: { - mobile: 0, - tablet: 640, - laptop: 1024, - desktop: 1200, - }, - }, - }); - - return createTheme(baseTheme, { - typography: { - h1: { - fontSize: '1.5rem', - fontWeight: 'bold', - color: - mode === 'light' - ? baseTheme.palette.primary.dark - : baseTheme.palette.primary.light, - }, - h2: { - fontSize: '1.5rem', - }, - h3: { - fontSize: '1.5rem', - }, - h5: { - fontSize: '1rem', - }, - body: { - fontSize: '1rem', - }, - body2: { - fontSize: '0.75rem', - color: baseTheme.palette.text.secondary, - }, - subtitle2: { - fontSize: '0.625rem', - [baseTheme.breakpoints.down('tablet')]: { - fontSize: '0.5625rem', - }, - }, - }, - components: { - MuiCard: { - defaultProps: { - elevation: 0, - }, - }, - MuiCardHeader: { - styleOverrides: { - title: { - fontSize: '1rem', - fontWeight: 'bold', - }, - }, - }, - MuiButton: { - styleOverrides: { - textPrimary: { - color: - mode === 'light' - ? baseTheme.palette.primary.main - : baseTheme.palette.primary.light, - }, - }, - }, - MuiLoadingButton: { - defaultProps: { - variant: 'contained', - }, - }, - MuiTextField: { - defaultProps: { - fullWidth: true, - }, - }, - MuiSnackbar: { - defaultProps: { - anchorOrigin: { vertical: 'bottom', horizontal: 'center' }, - }, - }, - MuiAlert: { - styleOverrides: { - root: { - fontSize: '0.9rem', - }, - filledSuccess: { - color: baseTheme.palette.success.dark, - backgroundColor: baseTheme.palette.success.light, - }, - filledError: { - color: baseTheme.palette.error.dark, - backgroundColor: baseTheme.palette.error.light, - }, - }, - }, - }, - }); - }, [mode]); - - return ( - - - <> - - {children} - - - - ); -}; - -export default ThemeProvider; diff --git a/apps/rosen/app/_theme/theme.tsx b/apps/rosen/app/_theme/theme.tsx new file mode 100644 index 00000000..73f3de1d --- /dev/null +++ b/apps/rosen/app/_theme/theme.tsx @@ -0,0 +1,229 @@ +import { Theme } from '@mui/material'; +import { createTheme } from '@rosen-bridge/ui-kit'; + +declare module '@mui/material/styles' { + interface TypeBackground { + root: string; + content: string; + paper: string; + header: string; + shadow: string; + input: string; + } + + interface TypePaletteGradient { + baseOrange: string; + lightOrange: string; + lightDarkBackground: string; + baseDarkBackground: string; + darkBackgroundMid: string; + darkBackgroundMain: string; + } + + interface Palette { + gradient: TypePaletteGradient; + background: TypeBackground; + } + interface PaletteOptions { + gradient?: Partial; + background?: Partial; + } +} + +const light = createTheme({ + palette: { + mode: 'light', + primary: { + light: '#d3e1f0', + main: '#396da3', + dark: '#25476a', + contrastText: '#fff', + }, + secondary: { + light: '#ffcd38', + main: '#ffc107', + dark: '#b28704', + contrastText: '#1A1A1A', + }, + gradient: { + baseOrange: '#fc7b41', + lightOrange: '#e2844a', + lightDarkBackground: '#52617e', + baseDarkBackground: '#164b7d', + darkBackgroundMid: '#4a626e', + darkBackgroundMain: '#1e2130', + }, + background: { + root: '#1A1A1A', + content: 'rgba(247, 247, 247, 0.9)', + paper: 'rgb(247, 247, 247)', + header: '#E1E1E1', + shadow: 'rgba(0, 0, 0, 0.2)', + input: '#fff', + }, + info: { + light: '#f1f5ff', + main: '#5873de', + dark: '#384d78', + contrastText: '#fff', + }, + }, + shape: { + borderRadius: 16, + }, + breakpoints: { + values: { + mobile: 0, + tablet: 640, + laptop: 1024, + desktop: 1200, + }, + }, +}); + +const dark = createTheme({ + palette: { + mode: 'dark', + primary: { + light: '#d3e1f0', + main: '#396da3', + dark: '#25476a', + contrastText: '#fff', + }, + secondary: { + light: '#ffcd38', + main: '#ffc107', + dark: '#b28704', + contrastText: '#1A1A1A', + }, + gradient: { + baseOrange: '#fc7b41', + lightOrange: '#e2844a', + lightDarkBackground: '#52617e', + baseDarkBackground: '#164b7d', + darkBackgroundMid: '#4a626e', + darkBackgroundMain: '#1e2130', + }, + background: { + root: '#0D1721', + content: '#2f3a48', + paper: 'rgb(26, 32, 41)', + header: '#253041', + shadow: 'rgba(0, 0, 0, 0.2)', + input: 'rgb(40, 49, 63)', + }, + info: { + light: '#9cbdd9', + main: '#2c396f', + dark: '#132236', + contrastText: '#fff', + }, + }, + shape: { + borderRadius: 16, + }, + breakpoints: { + values: { + mobile: 0, + tablet: 640, + laptop: 1024, + desktop: 1200, + }, + }, +}); + +const create = (baseTheme: Theme) => + createTheme(baseTheme, { + typography: { + h1: { + fontSize: '1.5rem', + fontWeight: 'bold', + color: + baseTheme.palette.mode === 'light' + ? baseTheme.palette.primary.dark + : baseTheme.palette.primary.light, + }, + h2: { + fontSize: '1.5rem', + }, + h3: { + fontSize: '1.5rem', + }, + h5: { + fontSize: '1rem', + }, + body: { + fontSize: '1rem', + }, + body2: { + fontSize: '0.75rem', + color: baseTheme.palette.text.secondary, + }, + subtitle2: { + fontSize: '0.625rem', + [baseTheme.breakpoints.down('tablet')]: { + fontSize: '0.5625rem', + }, + }, + }, + components: { + MuiCard: { + defaultProps: { + elevation: 0, + }, + }, + MuiCardHeader: { + styleOverrides: { + title: { + fontSize: '1rem', + fontWeight: 'bold', + }, + }, + }, + MuiButton: { + styleOverrides: { + textPrimary: { + color: + baseTheme.palette.mode === 'light' + ? baseTheme.palette.primary.main + : baseTheme.palette.primary.light, + }, + }, + }, + MuiLoadingButton: { + defaultProps: { + variant: 'contained', + }, + }, + MuiTextField: { + defaultProps: { + fullWidth: true, + }, + }, + MuiSnackbar: { + defaultProps: { + anchorOrigin: { vertical: 'bottom', horizontal: 'center' }, + }, + }, + MuiAlert: { + styleOverrides: { + root: { + fontSize: '0.9rem', + }, + filledSuccess: { + color: baseTheme.palette.success.dark, + backgroundColor: baseTheme.palette.success.light, + }, + filledError: { + color: baseTheme.palette.error.dark, + backgroundColor: baseTheme.palette.error.light, + }, + }, + }, + }, + }); + +export const theme = { + light: create(light), + dark: create(dark), +}; diff --git a/package-lock.json b/package-lock.json index 4971331c..a324f358 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25268,6 +25268,7 @@ "@mui/lab": "^5.0.0-alpha.134", "@mui/material": "^5.13.4", "@rosen-bridge/icons": "^0.4.0", + "@rosen-ui/common-hooks": "^0.1.0", "@rosen-ui/constants": "^0.0.3", "@rosen-ui/swr-helpers": "^0.1.0", "@rosen-ui/utils": "^0.4.0", diff --git a/packages/ui-kit/package.json b/packages/ui-kit/package.json index 25048189..6209a31d 100644 --- a/packages/ui-kit/package.json +++ b/packages/ui-kit/package.json @@ -47,6 +47,7 @@ "@mui/lab": "^5.0.0-alpha.134", "@mui/material": "^5.13.4", "@rosen-bridge/icons": "^0.4.0", + "@rosen-ui/common-hooks": "^0.1.0", "@rosen-ui/constants": "^0.0.3", "@rosen-ui/swr-helpers": "^0.1.0", "@rosen-ui/utils": "^0.4.0", diff --git a/packages/ui-kit/src/Providers/ThemeProvider.tsx b/packages/ui-kit/src/Providers/ThemeProvider.tsx index 9e80f080..42e7f1ba 100644 --- a/packages/ui-kit/src/Providers/ThemeProvider.tsx +++ b/packages/ui-kit/src/Providers/ThemeProvider.tsx @@ -1,14 +1,53 @@ -import { Theme } from '@mui/material'; +import { Theme, useMediaQuery } from '@mui/material'; import { ThemeProvider as MuiThemeProvider } from '@mui/material/styles'; +import { useLocalStorageManager } from '@rosen-ui/common-hooks'; +import { createContext, useState } from 'react'; -interface ThemeProviderProps { +export const ThemeTogglerContext = createContext({ + mode: 'light', + toggle: () => {}, +}); + +export interface ThemeProviderProps { children: JSX.Element; - theme: Theme; + theme: + | Theme + | { + light: Theme; + dark: Theme; + }; } -export const ThemeProvider = ({ children, theme }: ThemeProviderProps) => ( - {children} -); +export const ThemeProvider = ({ + children, + theme: input, +}: ThemeProviderProps) => { + const localStorageManager = useLocalStorageManager(); + + const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)', { + noSsr: true, + }); + + const preferredMode = prefersDarkMode ? 'dark' : 'light'; + + const [mode, setMode] = useState<'light' | 'dark'>( + localStorageManager.get<'light' | 'dark'>('colorMode') || preferredMode, + ); + + const theme: Theme = + 'light' in input && 'dark' in input ? input[mode] : input; + + const toggle = () => { + const nextMode = mode === 'light' ? 'dark' : 'light'; + setMode(nextMode); + localStorageManager.set('colorMode', nextMode); + }; + + return ( + + {children} + + ); +}; -export type { ThemeProviderProps }; export default ThemeProvider; diff --git a/packages/ui-kit/src/components/common/ToolbarThemeTogglerAction.tsx b/packages/ui-kit/src/components/common/ToolbarThemeTogglerAction.tsx new file mode 100644 index 00000000..be34b6a4 --- /dev/null +++ b/packages/ui-kit/src/components/common/ToolbarThemeTogglerAction.tsx @@ -0,0 +1,21 @@ +import { Moon, Sun } from '@rosen-bridge/icons'; +import { useIsDarkMode, useThemeToggler } from '../../hooks'; +import { IconButton, SvgIcon } from '../base'; + +export const ToolbarThemeTogglerAction = () => { + const isDarkMode = useIsDarkMode(); + const themeToggler = useThemeToggler(); + return ( + + {isDarkMode ? ( + + + + ) : ( + + + + )} + + ); +}; diff --git a/packages/ui-kit/src/components/common/index.ts b/packages/ui-kit/src/components/common/index.ts index b6ac2062..5206d771 100644 --- a/packages/ui-kit/src/components/common/index.ts +++ b/packages/ui-kit/src/components/common/index.ts @@ -14,3 +14,4 @@ export * from './SubmitButton'; export * from './TokensCard'; export * from './Toolbar'; export * from './AppSnackbar'; +export * from './ToolbarThemeTogglerAction'; diff --git a/packages/ui-kit/src/hooks/index.ts b/packages/ui-kit/src/hooks/index.ts index 73a08f07..bdaeca31 100644 --- a/packages/ui-kit/src/hooks/index.ts +++ b/packages/ui-kit/src/hooks/index.ts @@ -5,3 +5,4 @@ export * from './useIsDarkMode'; export * from './useResponsiveValue'; export * from './useTablePagination'; export * from './useSnackbar'; +export * from './useThemeToggler'; diff --git a/packages/ui-kit/src/hooks/useThemeToggler.ts b/packages/ui-kit/src/hooks/useThemeToggler.ts new file mode 100644 index 00000000..1a56d3b9 --- /dev/null +++ b/packages/ui-kit/src/hooks/useThemeToggler.ts @@ -0,0 +1,5 @@ +import { useContext } from 'react'; + +import { ThemeTogglerContext } from '../Providers'; + +export const useThemeToggler = () => useContext(ThemeTogglerContext); From ab41fa75ba7ef41d52d9d0716b56da77ea169025 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 12 Oct 2024 12:04:55 +0330 Subject: [PATCH 158/168] fix: Resolve the lint error in the ThemeProvider --- packages/ui-kit/src/Providers/ThemeProvider.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/ui-kit/src/Providers/ThemeProvider.tsx b/packages/ui-kit/src/Providers/ThemeProvider.tsx index 42e7f1ba..39c941c5 100644 --- a/packages/ui-kit/src/Providers/ThemeProvider.tsx +++ b/packages/ui-kit/src/Providers/ThemeProvider.tsx @@ -5,6 +5,7 @@ import { createContext, useState } from 'react'; export const ThemeTogglerContext = createContext({ mode: 'light', + // eslint-disable-next-line @typescript-eslint/no-empty-function toggle: () => {}, }); From 1624a857ba4349dd11adc691b4bcdd425d57feff Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 12 Oct 2024 12:15:37 +0330 Subject: [PATCH 159/168] fix: Revert the isCentered property in the Rosen app toolbar --- apps/rosen/app/Toolbar.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/rosen/app/Toolbar.tsx b/apps/rosen/app/Toolbar.tsx index 2c79aa5f..a1d4a1be 100644 --- a/apps/rosen/app/Toolbar.tsx +++ b/apps/rosen/app/Toolbar.tsx @@ -24,6 +24,7 @@ const Toolbar = () => { } + isCentered /> ); }; From 8122ad4a8d08699a3c89ecf04bb81398346d97ce Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Sat, 12 Oct 2024 14:22:57 +0330 Subject: [PATCH 160/168] fix: Resolve the bug impacting the display of balances on the assets page and prevent the toggling of table rows after clicking on an external link --- .changeset/four-lions-shave.md | 2 ++ apps/rosen/app/_backend/assets/services.ts | 15 ++++---------- apps/rosen/app/assets/TableRow.tsx | 24 ++++++++++++++++++---- 3 files changed, 26 insertions(+), 15 deletions(-) create mode 100644 .changeset/four-lions-shave.md diff --git a/.changeset/four-lions-shave.md b/.changeset/four-lions-shave.md new file mode 100644 index 00000000..a845151c --- /dev/null +++ b/.changeset/four-lions-shave.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/apps/rosen/app/_backend/assets/services.ts b/apps/rosen/app/_backend/assets/services.ts index cb13e008..1a0a9935 100644 --- a/apps/rosen/app/_backend/assets/services.ts +++ b/apps/rosen/app/_backend/assets/services.ts @@ -46,16 +46,9 @@ export const getAllAssets = async ( return { total: assets.total, - items: assets.items.map((asset) => { - const id = asset.isNative ? asset.name : asset.id; - - const significantDecimals = tokenMap.getSignificantDecimals(id) || 0; - - return { - ...asset, - id, - significantDecimals, - }; - }), + items: assets.items.map((asset) => ({ + ...asset, + significantDecimals: tokenMap.getSignificantDecimals(asset.id) || 0, + })), }; }; diff --git a/apps/rosen/app/assets/TableRow.tsx b/apps/rosen/app/assets/TableRow.tsx index 03c85612..ac65836e 100644 --- a/apps/rosen/app/assets/TableRow.tsx +++ b/apps/rosen/app/assets/TableRow.tsx @@ -253,7 +253,11 @@ export const TabletRow: FC = (props) => { {row.name} {tokenUrl && ( - + event.stopPropagation()} + > @@ -277,7 +281,11 @@ export const TabletRow: FC = (props) => { )} {hotUrl && ( - + event.stopPropagation()} + > @@ -294,7 +302,11 @@ export const TabletRow: FC = (props) => { )} {coldUrl && ( - + event.stopPropagation()} + > @@ -368,7 +380,11 @@ export const TabletRow: FC = (props) => { > {tokenUrl && ( - + event.stopPropagation()} + > Date: Sat, 12 Oct 2024 13:24:51 +0000 Subject: [PATCH 161/168] chore: Refine the Rosen app code to enhance its maintainability --- .changeset/quiet-jokes-marry.md | 5 +++++ apps/rosen/app/_actions/calculateFee.ts | 5 ++--- apps/rosen/app/_backend/assets/repository.ts | 2 ++ apps/rosen/app/_backend/events/index.ts | 1 + .../events/{event-repository.ts => repository.ts} | 2 ++ .../events/{event-service.ts => services.ts} | 13 +++++-------- .../initialize-datasource-if-needed.ts | 2 +- apps/rosen/app/_constants/index.ts | 3 --- apps/rosen/app/_contexts/walletContext.tsx | 6 +++--- apps/rosen/app/_hooks/useTokenBalance.ts | 4 ++-- apps/rosen/app/_hooks/useWallet.ts | 14 ++++++-------- apps/rosen/app/_types/api.ts | 4 ++-- apps/rosen/app/_types/network.ts | 2 -- apps/rosen/app/api/v1/assets/detail/[id]/route.ts | 2 -- apps/rosen/app/api/v1/assets/route.ts | 1 - apps/rosen/app/api/v1/events/route.ts | 6 ++---- 16 files changed, 33 insertions(+), 39 deletions(-) create mode 100644 .changeset/quiet-jokes-marry.md create mode 100644 apps/rosen/app/_backend/events/index.ts rename apps/rosen/app/_backend/events/{event-repository.ts => repository.ts} (98%) rename apps/rosen/app/_backend/events/{event-service.ts => services.ts} (85%) rename apps/rosen/app/{api/v1 => _backend}/initialize-datasource-if-needed.ts (68%) delete mode 100644 apps/rosen/app/_constants/index.ts diff --git a/.changeset/quiet-jokes-marry.md b/.changeset/quiet-jokes-marry.md new file mode 100644 index 00000000..780e3c90 --- /dev/null +++ b/.changeset/quiet-jokes-marry.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': patch +--- + +Refined Rosen app code for better maintainability by unifying environment variable access, reviewing database service code in assets and events, and enhancing type usage throughout the application. diff --git a/apps/rosen/app/_actions/calculateFee.ts b/apps/rosen/app/_actions/calculateFee.ts index 51616718..749d8961 100644 --- a/apps/rosen/app/_actions/calculateFee.ts +++ b/apps/rosen/app/_actions/calculateFee.ts @@ -14,7 +14,6 @@ const ergoExplorerClient = ergoExplorerClientFactory( ); import { NETWORKS } from '@rosen-ui/constants'; -import { ERGO_EXPLORER_URL, feeConfigTokenId } from '@/_constants'; import { Network } from '@rosen-ui/types'; import { wrap } from '@/_errors'; import { toSafeData } from '@/_utils/safeData'; @@ -61,9 +60,9 @@ export const calculateFee = wrap( const minFeeBox = new MinimumFeeBox( tokenId, - feeConfigTokenId, + process.env.NEXT_PUBLIC_FEE_CONFIG_TOKEN_ID!, ErgoNetworkType.explorer, - ERGO_EXPLORER_URL, + process.env.ERGO_EXPLORER_API!, ); await minFeeBox.fetchBox(); diff --git a/apps/rosen/app/_backend/assets/repository.ts b/apps/rosen/app/_backend/assets/repository.ts index 22c56c19..c27885b3 100644 --- a/apps/rosen/app/_backend/assets/repository.ts +++ b/apps/rosen/app/_backend/assets/repository.ts @@ -9,6 +9,8 @@ import NotFoundError from '@/_errors/NotFoundError'; import dataSource from '../dataSource'; import { Network } from '@rosen-ui/types'; +import '../initialize-datasource-if-needed'; + const bridgedAssetRepository = dataSource.getRepository(BridgedAssetEntity); const lockedAssetRepository = dataSource.getRepository(LockedAssetEntity); const tokenRepository = dataSource.getRepository(TokenEntity); diff --git a/apps/rosen/app/_backend/events/index.ts b/apps/rosen/app/_backend/events/index.ts new file mode 100644 index 00000000..e371345e --- /dev/null +++ b/apps/rosen/app/_backend/events/index.ts @@ -0,0 +1 @@ +export * from './services'; diff --git a/apps/rosen/app/_backend/events/event-repository.ts b/apps/rosen/app/_backend/events/repository.ts similarity index 98% rename from apps/rosen/app/_backend/events/event-repository.ts rename to apps/rosen/app/_backend/events/repository.ts index 32138100..69569190 100644 --- a/apps/rosen/app/_backend/events/event-repository.ts +++ b/apps/rosen/app/_backend/events/repository.ts @@ -5,6 +5,8 @@ import { Network } from '@rosen-ui/types'; import dataSource from '../dataSource'; +import '../initialize-datasource-if-needed'; + const blockRepository = dataSource.getRepository(BlockEntity); const eventTriggerRepository = dataSource.getRepository(EventTriggerEntity); const observationRepository = dataSource.getRepository(ObservationEntity); diff --git a/apps/rosen/app/_backend/events/event-service.ts b/apps/rosen/app/_backend/events/services.ts similarity index 85% rename from apps/rosen/app/_backend/events/event-service.ts rename to apps/rosen/app/_backend/events/services.ts index b5daa76d..f2a165e5 100644 --- a/apps/rosen/app/_backend/events/event-service.ts +++ b/apps/rosen/app/_backend/events/services.ts @@ -3,7 +3,7 @@ import { Network } from '@rosen-ui/types'; import { getRosenTokens } from '@/_backend/utils'; -import { getEvents } from './event-repository'; +import { getEvents } from './repository'; import { UNSUPPORTED_TOKEN_NAME } from '../constants'; @@ -41,7 +41,10 @@ const getFullTokenData = (tokenId: string, chain: Network) => { * @param offset * @param limit */ -const getEventsWithFullTokenData = async (offset: number, limit: number) => { +export const getEventsWithFullTokenData = async ( + offset: number, + limit: number, +) => { const events = await getEvents(offset, limit); return { @@ -52,9 +55,3 @@ const getEventsWithFullTokenData = async (offset: number, limit: number) => { })), }; }; - -const eventService = { - getEventsWithFullTokenData, -}; - -export default eventService; diff --git a/apps/rosen/app/api/v1/initialize-datasource-if-needed.ts b/apps/rosen/app/_backend/initialize-datasource-if-needed.ts similarity index 68% rename from apps/rosen/app/api/v1/initialize-datasource-if-needed.ts rename to apps/rosen/app/_backend/initialize-datasource-if-needed.ts index 208f85a2..1f3a5e36 100644 --- a/apps/rosen/app/api/v1/initialize-datasource-if-needed.ts +++ b/apps/rosen/app/_backend/initialize-datasource-if-needed.ts @@ -1,4 +1,4 @@ -import dataSource from '@/_backend/dataSource'; +import dataSource from './dataSource'; if (!dataSource.isInitialized) { await dataSource.initialize(); diff --git a/apps/rosen/app/_constants/index.ts b/apps/rosen/app/_constants/index.ts deleted file mode 100644 index 5fa2a708..00000000 --- a/apps/rosen/app/_constants/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const feeConfigTokenId = process.env.NEXT_PUBLIC_FEE_CONFIG_TOKEN_ID!; - -export const ERGO_EXPLORER_URL = 'https://api.ergoplatform.com/'; diff --git a/apps/rosen/app/_contexts/walletContext.tsx b/apps/rosen/app/_contexts/walletContext.tsx index ede507a3..cffc5c26 100644 --- a/apps/rosen/app/_contexts/walletContext.tsx +++ b/apps/rosen/app/_contexts/walletContext.tsx @@ -1,16 +1,16 @@ import { useReducer, createContext } from 'react'; -import { SupportedWallets } from '@/_types/network'; +import { Wallet } from '@rosen-ui/wallet-api'; type Action = | { type: 'set'; - wallet: SupportedWallets; + wallet: Wallet; } | { type: 'remove' }; type Dispatch = (action: Action) => void; -type State = { selectedWallet: SupportedWallets | null }; +type State = { selectedWallet: Wallet | null }; /** * a context to make wallet state available to all the diff --git a/apps/rosen/app/_hooks/useTokenBalance.ts b/apps/rosen/app/_hooks/useTokenBalance.ts index c8060614..26992075 100644 --- a/apps/rosen/app/_hooks/useTokenBalance.ts +++ b/apps/rosen/app/_hooks/useTokenBalance.ts @@ -5,7 +5,7 @@ import { TokenInfo } from '@rosen-ui/types'; import useBridgeForm from './useBridgeForm'; import useWallet from './useWallet'; -import { SupportedWallets } from '@/_types/network'; +import { Wallet } from '@rosen-ui/wallet-api'; import { RosenAmountValue } from '@rosen-ui/types'; interface UseTokenBalance { @@ -33,7 +33,7 @@ const useTokenBalance = () => { const token = tokenField.value; const getAssetBalance = useCallback( - async (wallet: SupportedWallets) => { + async (wallet: Wallet) => { setBalanceState({ isLoading: true, amount: 0n, token: null }); // THIS IS A WRAPPED-VALUE const balance = await wallet.getBalance(token); diff --git a/apps/rosen/app/_hooks/useWallet.ts b/apps/rosen/app/_hooks/useWallet.ts index 78c30d41..f2c01dcc 100644 --- a/apps/rosen/app/_hooks/useWallet.ts +++ b/apps/rosen/app/_hooks/useWallet.ts @@ -1,13 +1,11 @@ import { useEffect, useContext, useCallback, useRef } from 'react'; -import { WalletBase } from '@rosen-ui/wallet-api'; +import { Wallet, WalletBase } from '@rosen-ui/wallet-api'; import { useLocalStorageManager } from '@rosen-ui/common-hooks'; import useNetwork from './useNetwork'; import { WalletContext } from '@/_contexts/walletContext'; -import { SupportedWallets } from '@/_types/network'; - interface WalletDescriptor { readonly name: string; readonly expDate: string; @@ -40,14 +38,14 @@ const useWallet = () => { * and return the wallet object if it finds a match */ const getWallet = useCallback( - (name: string): SupportedWallets => { - let wallet: SupportedWallets | undefined; + (name: string): Wallet => { + let wallet: Wallet | undefined; wallet = ( selectedNetwork ? selectedNetwork.wallets.filter((wallet) => wallet.isAvailable()) : [] - ).find((w: SupportedWallets) => w.name === name); + ).find((w: Wallet) => w.name === name); if (!wallet) { throw new Error(`unsupported wallet with name ${name}`); } @@ -61,7 +59,7 @@ const useWallet = () => { * searches in local storage for already selected wallets and * returns the wallet object if it finds match */ - const getCurrentWallet = useCallback((): SupportedWallets | undefined => { + const getCurrentWallet = useCallback((): Wallet | undefined => { const currentWalletDescriptor = selectedNetwork && get(selectedNetwork?.name); @@ -79,7 +77,7 @@ const useWallet = () => { * calls the connection callbacks */ const setSelectedWallet = useCallback( - async (wallet: SupportedWallets) => { + async (wallet: Wallet) => { const prevWallet = getCurrentWallet(); const status = await wallet.connectWallet(); diff --git a/apps/rosen/app/_types/api.ts b/apps/rosen/app/_types/api.ts index 2ee5d9fc..b5721a93 100644 --- a/apps/rosen/app/_types/api.ts +++ b/apps/rosen/app/_types/api.ts @@ -1,8 +1,8 @@ import { getAsset, getAllAssets } from '@/_backend/assets'; -import eventService from '@/_backend/events/event-service'; +import { getEventsWithFullTokenData } from '@/_backend/events'; export type ApiEventResponse = Awaited< - ReturnType + ReturnType >; type ArrayElement = T extends (infer Element)[] ? Element : never; export type Event = ArrayElement; diff --git a/apps/rosen/app/_types/network.ts b/apps/rosen/app/_types/network.ts index edbe0e7a..fe932bd6 100644 --- a/apps/rosen/app/_types/network.ts +++ b/apps/rosen/app/_types/network.ts @@ -40,5 +40,3 @@ export interface ErgoNetwork extends BaseNetwork<'ergo'> {} export interface CardanoNetwork extends BaseNetwork<'cardano'> {} export interface BitcoinNetwork extends BaseNetwork<'bitcoin', BitcoinMaxTransferExtra> {} - -export type SupportedWallets = Wallet; diff --git a/apps/rosen/app/api/v1/assets/detail/[id]/route.ts b/apps/rosen/app/api/v1/assets/detail/[id]/route.ts index de49c3f0..b1438109 100644 --- a/apps/rosen/app/api/v1/assets/detail/[id]/route.ts +++ b/apps/rosen/app/api/v1/assets/detail/[id]/route.ts @@ -4,6 +4,4 @@ import withValidation from '../../../withValidation'; import { validateGet } from './validations'; -import '../../../initialize-datasource-if-needed'; - export const GET = withValidation(validateGet, (value) => getAsset(value.id)); diff --git a/apps/rosen/app/api/v1/assets/route.ts b/apps/rosen/app/api/v1/assets/route.ts index 1489a722..93164ded 100644 --- a/apps/rosen/app/api/v1/assets/route.ts +++ b/apps/rosen/app/api/v1/assets/route.ts @@ -2,7 +2,6 @@ import { pick } from 'lodash-es'; import { getAllAssets } from '@/_backend/assets'; -import '../initialize-datasource-if-needed'; import withValidation from '../withValidation'; import { validateGet } from './validations'; diff --git a/apps/rosen/app/api/v1/events/route.ts b/apps/rosen/app/api/v1/events/route.ts index 46d003ce..95c2eb1f 100644 --- a/apps/rosen/app/api/v1/events/route.ts +++ b/apps/rosen/app/api/v1/events/route.ts @@ -1,11 +1,9 @@ -import eventService from '@/_backend/events/event-service'; +import { getEventsWithFullTokenData } from '@/_backend/events'; import withValidation from '../withValidation'; import EventsValidations from './validations'; -import '../initialize-datasource-if-needed'; - export const GET = withValidation(EventsValidations.GET, (value) => - eventService.getEventsWithFullTokenData(value.offset, value.limit), + getEventsWithFullTokenData(value.offset, value.limit), ); From 3cdf73150556b641fdb8f16f8febc19df20732a6 Mon Sep 17 00:00:00 2001 From: ALI-HUP Date: Mon, 14 Oct 2024 12:14:19 +0330 Subject: [PATCH 162/168] fix: Add .env to .gitignore in all UI packages --- .changeset/lemon-trains-agree.md | 7 +++++++ apps/guard/.gitignore | 1 + apps/rosen/.gitignore | 1 + apps/watcher/.gitignore | 1 + 4 files changed, 10 insertions(+) create mode 100644 .changeset/lemon-trains-agree.md diff --git a/.changeset/lemon-trains-agree.md b/.changeset/lemon-trains-agree.md new file mode 100644 index 00000000..1ee5622e --- /dev/null +++ b/.changeset/lemon-trains-agree.md @@ -0,0 +1,7 @@ +--- +'@rosen-bridge/guard-app': patch +'@rosen-bridge/rosen-app': patch +'@rosen-bridge/watcher-app': patch +--- + +Disregarding the inclusion of the .env file in all UI applications. diff --git a/apps/guard/.gitignore b/apps/guard/.gitignore index 8f322f0d..45c1abce 100644 --- a/apps/guard/.gitignore +++ b/apps/guard/.gitignore @@ -26,6 +26,7 @@ yarn-error.log* # local env files .env*.local +.env # vercel .vercel diff --git a/apps/rosen/.gitignore b/apps/rosen/.gitignore index 4e9ada2b..646a5c20 100644 --- a/apps/rosen/.gitignore +++ b/apps/rosen/.gitignore @@ -26,6 +26,7 @@ yarn-error.log* # local env files .env*.local +.env # vercel .vercel diff --git a/apps/watcher/.gitignore b/apps/watcher/.gitignore index a2f79128..c0a3aa5e 100644 --- a/apps/watcher/.gitignore +++ b/apps/watcher/.gitignore @@ -26,6 +26,7 @@ yarn-error.log* # local env files .env*.local +.env # vercel .vercel From 088b5c2d8575b7bcefd50ee1d8945a6fed088f84 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 14 Oct 2024 09:40:32 +0000 Subject: [PATCH 163/168] feat: Revise the theme provider to align with the latest updates in the design system --- .changeset/dull-penguins-fold.md | 2 + apps/guard/app/App.tsx | 53 ++-- apps/guard/app/Toolbar.tsx | 14 +- apps/guard/app/ToolbarActions.tsx | 34 --- apps/guard/app/_theme/ThemeProvider.tsx | 298 ------------------ apps/guard/app/_theme/theme.ts | 261 ++++++++++++++++ apps/watcher/app/Toolbar.tsx | 14 +- apps/watcher/app/ToolbarActions.tsx | 34 --- apps/watcher/app/_theme/ThemeProvider.tsx | 351 ---------------------- apps/watcher/app/_theme/theme.ts | 314 +++++++++++++++++++ apps/watcher/app/layout.tsx | 53 ++-- 11 files changed, 661 insertions(+), 767 deletions(-) delete mode 100644 apps/guard/app/ToolbarActions.tsx delete mode 100644 apps/guard/app/_theme/ThemeProvider.tsx create mode 100644 apps/guard/app/_theme/theme.ts delete mode 100644 apps/watcher/app/ToolbarActions.tsx delete mode 100644 apps/watcher/app/_theme/ThemeProvider.tsx create mode 100644 apps/watcher/app/_theme/theme.ts diff --git a/.changeset/dull-penguins-fold.md b/.changeset/dull-penguins-fold.md index eeba23e3..1176e8b6 100644 --- a/.changeset/dull-penguins-fold.md +++ b/.changeset/dull-penguins-fold.md @@ -1,5 +1,7 @@ --- +'@rosen-bridge/guard-app': minor '@rosen-bridge/rosen-app': minor +'@rosen-bridge/watcher-app': minor --- Revise the theme provider code to incorporate the latest updates from the design system diff --git a/apps/guard/app/App.tsx b/apps/guard/app/App.tsx index f174a67f..5e835329 100644 --- a/apps/guard/app/App.tsx +++ b/apps/guard/app/App.tsx @@ -3,13 +3,19 @@ import React from 'react'; import { NoSsr } from '@mui/material'; -import { styled, SnackbarProvider, AppSnackbar } from '@rosen-bridge/ui-kit'; +import { + styled, + SnackbarProvider, + AppSnackbar, + CssBaseline, + ThemeProvider, +} from '@rosen-bridge/ui-kit'; import SWRConfig from '@rosen-ui/swr-mock'; import SideBar from './SideBar'; import Toolbar from './Toolbar'; -import ThemeProvider from '@/_theme/ThemeProvider'; +import { theme } from '@/_theme/theme'; import { ApiKeyContextProvider } from '@rosen-bridge/shared-contexts'; @@ -62,26 +68,29 @@ interface AppProps { const App = ({ children }: AppProps) => { return ( - - - - - - -
- - {children} - -
-
-
-
-
+ + <> + + + + + + +
+ + {children} + +
+
+
+
+
+
); diff --git a/apps/guard/app/Toolbar.tsx b/apps/guard/app/Toolbar.tsx index 0d384d33..0d0455cf 100644 --- a/apps/guard/app/Toolbar.tsx +++ b/apps/guard/app/Toolbar.tsx @@ -1,9 +1,12 @@ import { useSelectedLayoutSegment } from 'next/navigation'; import React from 'react'; -import { Toolbar as UiKitToolbar } from '@rosen-bridge/ui-kit'; +import { + ToolbarThemeTogglerAction, + Toolbar as UiKitToolbar, +} from '@rosen-bridge/ui-kit'; -import ToolbarActions from './ToolbarActions'; +import ApiKeyModal from './_modals/ApiKeyModal'; const pageTitleMap: Record = { '(dashboard)': 'Dashboard', @@ -23,7 +26,12 @@ const Toolbar = () => { return ( } + toolbarActions={ + <> + + + + } /> ); }; diff --git a/apps/guard/app/ToolbarActions.tsx b/apps/guard/app/ToolbarActions.tsx deleted file mode 100644 index b1f73506..00000000 --- a/apps/guard/app/ToolbarActions.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import React, { useContext } from 'react'; - -import { Moon, Sun } from '@rosen-bridge/icons'; -import { IconButton, SvgIcon, useIsDarkMode } from '@rosen-bridge/ui-kit'; - -import { ColorModeContext } from '@/_theme/ThemeProvider'; -import ApiKeyModal from './_modals/ApiKeyModal'; - -/** - * render some toolbar actions - */ -const ToolbarActions = () => { - const colorMode = useContext(ColorModeContext); - const isDarkMode = useIsDarkMode(); - - return ( - <> - - - {isDarkMode ? ( - - - - ) : ( - - - - )} - - - ); -}; - -export default ToolbarActions; diff --git a/apps/guard/app/_theme/ThemeProvider.tsx b/apps/guard/app/_theme/ThemeProvider.tsx deleted file mode 100644 index 99082304..00000000 --- a/apps/guard/app/_theme/ThemeProvider.tsx +++ /dev/null @@ -1,298 +0,0 @@ -import React, { createContext, useMemo, useState } from 'react'; - -import { - CssBaseline, - ThemeProvider as UiKitThemeProvider, - createTheme, - useMediaQuery, -} from '@rosen-bridge/ui-kit'; -import { useLocalStorageManager } from '@rosen-ui/common-hooks'; - -export const ColorModeContext = createContext({ toggle: () => {} }); - -export interface AppThemeProps { - children: React.ReactNode; -} - -type ColorModes = 'light' | 'dark'; - -/** - * provide theme and color mode - */ -const ThemeProvider = ({ children }: AppThemeProps) => { - const localStorageManager = useLocalStorageManager(); - - const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)', { - noSsr: true, - }); - - const preferredColorMode = prefersDarkMode ? 'dark' : 'light'; - - const [mode, setMode] = useState( - localStorageManager.get('colorMode') || preferredColorMode, - ); - - const colorMode = useMemo( - () => ({ - toggle: () => { - const newColorMode = mode === 'light' ? 'dark' : 'light'; - setMode(newColorMode); - localStorageManager.set('colorMode', newColorMode); - }, - }), - [localStorageManager, mode], - ); - - const theme = useMemo(() => { - let theme = createTheme({ - palette: { - mode, - ...(mode === 'light' - ? { - primary: { - light: '#6cac9c', - main: '#6cac9c', - dark: '#438070', - contrastText: '#fff', - }, - secondary: { - light: '#ffd8d2', - main: '#fa9384', - dark: '#e36b77', - contrastText: '#fff', - }, - info: { - light: '#f1f5ff', - main: '#5873de', - dark: '#384d78', - contrastText: '#fff', - }, - success: { - light: '#d9eeeb', - main: '#008f7a', - dark: '#006666', - contrastText: '#fff', - }, - warning: { - light: '#fff9e2', - main: '#c89d09', - dark: '#8f6f00', - contrastText: '#fff', - }, - error: { - light: '#eed9d9', - main: '#cf1717', - dark: '#8f0000', - contrastText: '#fff', - }, - background: { - default: '#f7f7f7', - paper: '#fff', - shadow: '#00000033', - }, - } - : { - primary: { - light: '#6cac9c', - main: '#6cac9c', - dark: '#6cac9c', - contrastText: '#fff', - }, - secondary: { - light: '#fa9384', - main: '#71353b', - dark: '#71353b', - contrastText: '#fff', - }, - info: { - light: '#bdccff', - main: '#2c396f', - dark: '#132236', - contrastText: '#fff', - }, - success: { - light: '#d9eeeb', - main: '#008f7a', - dark: '#184c4c', - contrastText: '#fff', - }, - warning: { - light: '#fff9e2', - main: '#c89d09', - dark: '#5a4b1d', - contrastText: '#fff', - }, - error: { - light: '#eed9d9', - main: '#cf1717', - dark: '#431616', - contrastText: '#fff', - }, - background: { - default: '#1a2f4b', - paper: '#28475c', - shadow: '#00000033', - }, - }), - }, - shape: { - borderRadius: 16, - }, - breakpoints: { - values: { - mobile: 0, - tablet: 640, - laptop: 1024, - desktop: 1200, - }, - }, - }); - return createTheme(theme, { - typography: { - h1: { - fontSize: '1.5rem', - fontWeight: 'bold', - color: - mode === 'light' - ? theme.palette.info.dark - : theme.palette.info.light, - }, - h2: { - fontSize: '1.5rem', - }, - h5: { - fontSize: '1rem', - }, - body: { - fontSize: '1rem', - }, - body2: { - fontSize: '0.75rem', - color: theme.palette.text.secondary, - }, - subtitle2: { - fontSize: '0.625rem', - [theme.breakpoints.down('tablet')]: { - fontSize: '0.5625rem', - }, - }, - }, - components: { - MuiCard: { - defaultProps: { - elevation: 0, - }, - }, - MuiCardHeader: { - styleOverrides: { - title: { - fontSize: '1rem', - fontWeight: 'bold', - }, - }, - }, - MuiLoadingButton: { - defaultProps: { - variant: 'contained', - }, - }, - MuiTextField: { - defaultProps: { - fullWidth: true, - }, - }, - MuiPagination: { - defaultProps: { - color: 'primary', - }, - }, - MuiTableContainer: { - styleOverrides: { - root: { - backgroundColor: theme.palette.background.paper, - borderRadius: theme.shape.borderRadius, - [theme.breakpoints.up('tablet')]: { - padding: theme.spacing(0, 2), - }, - }, - }, - }, - MuiTable: { - styleOverrides: { - root: { - tableLayout: 'fixed', - }, - }, - }, - MuiTableBody: { - styleOverrides: { - root: { - '& tr.shaded': { - backgroundColor: - mode === 'light' - ? theme.palette.info.light - : theme.palette.info.dark + '22', - }, - }, - }, - }, - MuiTableCell: { - styleOverrides: { - root: { - borderWidth: 0, - }, - body: { - [theme.breakpoints.down('tablet')]: { - verticalAlign: 'top', - '&:not(.MuiTableCell-paddingNone)': { - padding: theme.spacing(1), - }, - '&:first-of-type': { - color: theme.palette.text.secondary, - }, - }, - }, - head: { - padding: theme.spacing(1, 2), - backgroundColor: theme.palette.info.dark, - color: theme.palette.info.contrastText, - whiteSpace: 'noWrap', - [theme.breakpoints.up('tablet')]: { - '&:nth-of-type(1)': { - borderBottomLeftRadius: theme.shape.borderRadius / 2, - }, - '&:nth-last-of-type(1)': { - borderBottomRightRadius: theme.shape.borderRadius / 2, - }, - }, - [theme.breakpoints.down('tablet')]: { - '&:nth-of-type(1)': { - borderTopLeftRadius: theme.shape.borderRadius / 2, - }, - '&:nth-last-of-type(1)': { - borderTopRightRadius: theme.shape.borderRadius / 2, - }, - }, - }, - footer: { - borderTop: `1px solid ${theme.palette.divider}`, - }, - }, - }, - }, - }); - }, [mode]); - - return ( - - - <> - - {children} - - - - ); -}; - -export default ThemeProvider; diff --git a/apps/guard/app/_theme/theme.ts b/apps/guard/app/_theme/theme.ts new file mode 100644 index 00000000..9e3a4bfa --- /dev/null +++ b/apps/guard/app/_theme/theme.ts @@ -0,0 +1,261 @@ +import { Theme } from '@mui/material'; +import { createTheme } from '@rosen-bridge/ui-kit'; + +declare module '@mui/material/styles' {} + +const light = createTheme({ + palette: { + mode: 'light', + primary: { + light: '#6cac9c', + main: '#6cac9c', + dark: '#438070', + contrastText: '#fff', + }, + secondary: { + light: '#ffd8d2', + main: '#fa9384', + dark: '#e36b77', + contrastText: '#fff', + }, + info: { + light: '#f1f5ff', + main: '#5873de', + dark: '#384d78', + contrastText: '#fff', + }, + success: { + light: '#d9eeeb', + main: '#008f7a', + dark: '#006666', + contrastText: '#fff', + }, + warning: { + light: '#fff9e2', + main: '#c89d09', + dark: '#8f6f00', + contrastText: '#fff', + }, + error: { + light: '#eed9d9', + main: '#cf1717', + dark: '#8f0000', + contrastText: '#fff', + }, + background: { + default: '#f7f7f7', + paper: '#fff', + shadow: '#00000033', + }, + }, + shape: { + borderRadius: 16, + }, + breakpoints: { + values: { + mobile: 0, + tablet: 640, + laptop: 1024, + desktop: 1200, + }, + }, +}); + +const dark = createTheme({ + palette: { + mode: 'dark', + primary: { + light: '#6cac9c', + main: '#6cac9c', + dark: '#6cac9c', + contrastText: '#fff', + }, + secondary: { + light: '#fa9384', + main: '#71353b', + dark: '#71353b', + contrastText: '#fff', + }, + info: { + light: '#bdccff', + main: '#2c396f', + dark: '#132236', + contrastText: '#fff', + }, + success: { + light: '#d9eeeb', + main: '#008f7a', + dark: '#184c4c', + contrastText: '#fff', + }, + warning: { + light: '#fff9e2', + main: '#c89d09', + dark: '#5a4b1d', + contrastText: '#fff', + }, + error: { + light: '#eed9d9', + main: '#cf1717', + dark: '#431616', + contrastText: '#fff', + }, + background: { + default: '#1a2f4b', + paper: '#28475c', + shadow: '#00000033', + }, + }, + shape: { + borderRadius: 16, + }, + breakpoints: { + values: { + mobile: 0, + tablet: 640, + laptop: 1024, + desktop: 1200, + }, + }, +}); + +const create = (baseTheme: Theme) => + createTheme(baseTheme, { + typography: { + h1: { + fontSize: '1.5rem', + fontWeight: 'bold', + color: + baseTheme.palette.mode === 'light' + ? baseTheme.palette.info.dark + : baseTheme.palette.info.light, + }, + h2: { + fontSize: '1.5rem', + }, + h5: { + fontSize: '1rem', + }, + body: { + fontSize: '1rem', + }, + body2: { + fontSize: '0.75rem', + color: baseTheme.palette.text.secondary, + }, + subtitle2: { + fontSize: '0.625rem', + [baseTheme.breakpoints.down('tablet')]: { + fontSize: '0.5625rem', + }, + }, + }, + components: { + MuiCard: { + defaultProps: { + elevation: 0, + }, + }, + MuiCardHeader: { + styleOverrides: { + title: { + fontSize: '1rem', + fontWeight: 'bold', + }, + }, + }, + MuiLoadingButton: { + defaultProps: { + variant: 'contained', + }, + }, + MuiTextField: { + defaultProps: { + fullWidth: true, + }, + }, + MuiPagination: { + defaultProps: { + color: 'primary', + }, + }, + MuiTableContainer: { + styleOverrides: { + root: { + backgroundColor: baseTheme.palette.background.paper, + borderRadius: baseTheme.shape.borderRadius, + [baseTheme.breakpoints.up('tablet')]: { + padding: baseTheme.spacing(0, 2), + }, + }, + }, + }, + MuiTable: { + styleOverrides: { + root: { + tableLayout: 'fixed', + }, + }, + }, + MuiTableBody: { + styleOverrides: { + root: { + '& tr.shaded': { + backgroundColor: + baseTheme.palette.mode === 'light' + ? baseTheme.palette.info.light + : baseTheme.palette.info.dark + '22', + }, + }, + }, + }, + MuiTableCell: { + styleOverrides: { + root: { + borderWidth: 0, + }, + body: { + [baseTheme.breakpoints.down('tablet')]: { + verticalAlign: 'top', + '&:not(.MuiTableCell-paddingNone)': { + padding: baseTheme.spacing(1), + }, + '&:first-of-type': { + color: baseTheme.palette.text.secondary, + }, + }, + }, + head: { + padding: baseTheme.spacing(1, 2), + backgroundColor: baseTheme.palette.info.dark, + color: baseTheme.palette.info.contrastText, + whiteSpace: 'noWrap', + [baseTheme.breakpoints.up('tablet')]: { + '&:nth-of-type(1)': { + borderBottomLeftRadius: baseTheme.shape.borderRadius / 2, + }, + '&:nth-last-of-type(1)': { + borderBottomRightRadius: baseTheme.shape.borderRadius / 2, + }, + }, + [baseTheme.breakpoints.down('tablet')]: { + '&:nth-of-type(1)': { + borderTopLeftRadius: baseTheme.shape.borderRadius / 2, + }, + '&:nth-last-of-type(1)': { + borderTopRightRadius: baseTheme.shape.borderRadius / 2, + }, + }, + }, + footer: { + borderTop: `1px solid ${baseTheme.palette.divider}`, + }, + }, + }, + }, + }); + +export const theme = { + light: create(light), + dark: create(dark), +}; diff --git a/apps/watcher/app/Toolbar.tsx b/apps/watcher/app/Toolbar.tsx index 230433c8..af211f1e 100644 --- a/apps/watcher/app/Toolbar.tsx +++ b/apps/watcher/app/Toolbar.tsx @@ -1,9 +1,12 @@ import { useSelectedLayoutSegment } from 'next/navigation'; import React from 'react'; -import { Toolbar as UiKitToolbar } from '@rosen-bridge/ui-kit'; +import { + ToolbarThemeTogglerAction, + Toolbar as UiKitToolbar, +} from '@rosen-bridge/ui-kit'; -import ToolbarActions from './ToolbarActions'; +import ApiKeyModal from './_modals/ApiKeyModal'; const pageTitleMap: Record = { '(home)': 'Home', @@ -23,7 +26,12 @@ const Toolbar = () => { return ( } + toolbarActions={ + <> + + + + } /> ); }; diff --git a/apps/watcher/app/ToolbarActions.tsx b/apps/watcher/app/ToolbarActions.tsx deleted file mode 100644 index ccacd2f6..00000000 --- a/apps/watcher/app/ToolbarActions.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import React, { useContext } from 'react'; - -import { Moon, Sun } from '@rosen-bridge/icons'; -import { IconButton, SvgIcon, useIsDarkMode } from '@rosen-bridge/ui-kit'; -import ApiKeyModal from './_modals/ApiKeyModal'; - -import { ColorModeContext } from '@/_theme/ThemeProvider'; - -/** - * render some toolbar actions - */ -const ToolbarActions = () => { - const colorMode = useContext(ColorModeContext); - const isDarkMode = useIsDarkMode(); - - return ( - <> - - - {isDarkMode ? ( - - - - ) : ( - - - - )} - - - ); -}; - -export default ToolbarActions; diff --git a/apps/watcher/app/_theme/ThemeProvider.tsx b/apps/watcher/app/_theme/ThemeProvider.tsx deleted file mode 100644 index f4f0ce41..00000000 --- a/apps/watcher/app/_theme/ThemeProvider.tsx +++ /dev/null @@ -1,351 +0,0 @@ -import React, { createContext, useMemo, useState } from 'react'; -import { useLocalStorageManager } from '@rosen-ui/common-hooks'; - -import { - CssBaseline, - ThemeProvider as UiKitThemeProvider, - createTheme, - useMediaQuery, -} from '@rosen-bridge/ui-kit'; - -export const ColorModeContext = createContext({ toggle: () => {} }); - -export interface AppThemeProps { - children: React.ReactNode; -} - -declare module '@mui/material/styles' { - interface TypePaletteGradient { - a: string; - b: string; - c: string; - d: string; - e: string; - f: string; - } - interface Palette { - gradient: TypePaletteGradient; - } - interface PaletteOptions { - gradient?: Partial; - } -} - -type ColorModes = 'light' | 'dark'; - -/** - * provide theme and color mode - */ -const ThemeProvider = ({ children }: AppThemeProps) => { - const localStorageManager = useLocalStorageManager(); - - const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)', { - noSsr: true, - }); - - const preferredColorMode = prefersDarkMode ? 'dark' : 'light'; - - const [mode, setMode] = useState( - localStorageManager.get('colorMode') || preferredColorMode, - ); - - const colorMode = useMemo( - () => ({ - toggle: () => { - const newColorMode = mode === 'light' ? 'dark' : 'light'; - setMode(newColorMode); - localStorageManager.set('colorMode', newColorMode); - }, - }), - [mode, localStorageManager], - ); - - const theme = useMemo(() => { - const baseTheme = createTheme({ - palette: { - mode, - ...(mode === 'light' - ? { - primary: { - light: '#ebf2ff', - main: '#2c73d2', - dark: '#1b5eb8', - contrastText: '#fff', - }, - secondary: { - light: '#d2b8fd', - main: '#845ec2', - dark: '#543487', - contrastText: '#fff', - }, - info: { - light: '#cdeaea', - main: '#008e9b', - dark: '#006d77', - contrastText: '#fff', - }, - success: { - light: '#d9eeeb', - main: '#008f7a', - dark: '#006666', - contrastText: '#fff', - }, - warning: { - light: '#fff9e2', - main: '#c89d09', - dark: '#8f6f00', - contrastText: '#fff', - }, - error: { - light: '#eed9d9', - main: '#cf1717', - dark: '#8f0000', - contrastText: '#fff', - }, - background: { - default: '#ffffff', - paper: '#ffffff', - shadow: '#00000033', - }, - gradient: { - a: '#845ec2', - b: '#2c73d2', - c: '#0081cf', - d: '#0089ba', - e: '#008e9b', - f: '#008f7a', - }, - } - : { - primary: { - light: '#accbeb', - main: '#1f56a0', - dark: '#1b5eb8', - contrastText: '#fff', - }, - secondary: { - light: '#d2b8fd', - main: '#5c487d', - dark: '#231933', - contrastText: '#fff', - }, - info: { - light: '#9edde3', - main: '#036a73', - dark: '#006d77', - contrastText: '#fff', - }, - success: { - light: '#d9eeeb', - main: '#008f7a', - dark: '#184c4c', - contrastText: '#fff', - }, - warning: { - light: '#fff9e2', - main: '#c89d09', - dark: '#5a4b1d', - contrastText: '#fff', - }, - error: { - light: '#eed9d9', - main: '#cf1717', - dark: '#431616', - contrastText: '#fff', - }, - background: { - default: '#2b1f3f', - paper: '#2b1f3f', - shadow: '#00000033', - }, - gradient: { - a: '#845ec2', - b: '#2c73d2', - c: '#0081cf', - d: '#0089ba', - e: '#008e9b', - f: '#008f7a', - }, - }), - }, - shape: { - borderRadius: 16, - }, - breakpoints: { - values: { - mobile: 0, - tablet: 640, - laptop: 1024, - desktop: 1200, - }, - }, - }); - - return createTheme(baseTheme, { - typography: { - h1: { - fontSize: '1.5rem', - fontWeight: 'bold', - color: - mode === 'light' - ? baseTheme.palette.secondary.dark - : baseTheme.palette.secondary.light, - }, - h2: { - fontSize: '1.5rem', - }, - h5: { - fontSize: '1rem', - }, - body: { - fontSize: '1rem', - }, - body2: { - fontSize: '0.75rem', - color: baseTheme.palette.text.secondary, - }, - subtitle2: { - fontSize: '0.625rem', - [baseTheme.breakpoints.down('tablet')]: { - fontSize: '0.5625rem', - }, - }, - }, - components: { - MuiCard: { - defaultProps: { - elevation: 0, - }, - }, - MuiCardHeader: { - styleOverrides: { - title: { - fontSize: '1rem', - fontWeight: 'bold', - }, - }, - }, - MuiButton: { - styleOverrides: { - textPrimary: { - color: - mode === 'light' - ? baseTheme.palette.primary.main - : baseTheme.palette.primary.light, - }, - }, - }, - MuiLoadingButton: { - defaultProps: { - variant: 'contained', - }, - }, - MuiTextField: { - defaultProps: { - fullWidth: true, - }, - }, - MuiTable: { - styleOverrides: { - root: { - tableLayout: 'fixed', - }, - }, - }, - MuiPagination: { - defaultProps: { - color: 'primary', - }, - }, - MuiTableBody: { - styleOverrides: { - root: { - '& tr.divider:not(:first-of-type)': { - borderTop: `1px solid ${baseTheme.palette.divider}`, - }, - }, - }, - }, - MuiTableCell: { - styleOverrides: { - root: { - borderWidth: 0, - }, - body: { - [baseTheme.breakpoints.down('tablet')]: { - verticalAlign: 'top', - '&:not(.MuiTableCell-paddingNone)': { - padding: baseTheme.spacing(1), - }, - '&:first-of-type': { - color: baseTheme.palette.text.secondary, - }, - }, - }, - head: { - backgroundColor: - mode === 'light' ? baseTheme.palette.primary.dark : '#ffffff11', - color: baseTheme.palette.primary.contrastText, - whiteSpace: 'noWrap', - '&:nth-of-type(1)': { - borderTopLeftRadius: baseTheme.shape.borderRadius, - borderBottomLeftRadius: baseTheme.shape.borderRadius / 2, - }, - '&:nth-last-of-type(1)': { - borderTopRightRadius: baseTheme.shape.borderRadius, - borderBottomRightRadius: baseTheme.shape.borderRadius / 2, - }, - [baseTheme.breakpoints.down('tablet')]: { - padding: baseTheme.spacing(1), - }, - }, - footer: { - backgroundColor: mode === 'light' ? '#00000011' : '#ffffff11', - '&:nth-of-type(1)': { - borderTopLeftRadius: baseTheme.shape.borderRadius / 2, - borderBottomLeftRadius: baseTheme.shape.borderRadius, - }, - '&:nth-last-of-type(1)': { - borderTopRightRadius: baseTheme.shape.borderRadius / 2, - borderBottomRightRadius: baseTheme.shape.borderRadius, - }, - }, - }, - }, - MuiSnackbar: { - defaultProps: { - anchorOrigin: { vertical: 'bottom', horizontal: 'center' }, - }, - }, - MuiAlert: { - styleOverrides: { - root: { - fontSize: '0.9rem', - }, - filledSuccess: { - color: baseTheme.palette.success.dark, - backgroundColor: baseTheme.palette.success.light, - }, - filledError: { - color: baseTheme.palette.error.dark, - backgroundColor: baseTheme.palette.error.light, - }, - }, - }, - }, - }); - }, [mode]); - - return ( - - - <> - - {children} - - - - ); -}; - -export default ThemeProvider; diff --git a/apps/watcher/app/_theme/theme.ts b/apps/watcher/app/_theme/theme.ts new file mode 100644 index 00000000..aa9e27be --- /dev/null +++ b/apps/watcher/app/_theme/theme.ts @@ -0,0 +1,314 @@ +import { Theme } from '@mui/material'; +import { createTheme } from '@rosen-bridge/ui-kit'; + +declare module '@mui/material/styles' { + interface TypePaletteGradient { + a: string; + b: string; + c: string; + d: string; + e: string; + f: string; + } + interface Palette { + gradient: TypePaletteGradient; + } + interface PaletteOptions { + gradient?: Partial; + } +} + +const light = createTheme({ + palette: { + mode: 'light', + primary: { + light: '#ebf2ff', + main: '#2c73d2', + dark: '#1b5eb8', + contrastText: '#fff', + }, + secondary: { + light: '#d2b8fd', + main: '#845ec2', + dark: '#543487', + contrastText: '#fff', + }, + info: { + light: '#cdeaea', + main: '#008e9b', + dark: '#006d77', + contrastText: '#fff', + }, + success: { + light: '#d9eeeb', + main: '#008f7a', + dark: '#006666', + contrastText: '#fff', + }, + warning: { + light: '#fff9e2', + main: '#c89d09', + dark: '#8f6f00', + contrastText: '#fff', + }, + error: { + light: '#eed9d9', + main: '#cf1717', + dark: '#8f0000', + contrastText: '#fff', + }, + background: { + default: '#ffffff', + paper: '#ffffff', + shadow: '#00000033', + }, + gradient: { + a: '#845ec2', + b: '#2c73d2', + c: '#0081cf', + d: '#0089ba', + e: '#008e9b', + f: '#008f7a', + }, + }, + shape: { + borderRadius: 16, + }, + breakpoints: { + values: { + mobile: 0, + tablet: 640, + laptop: 1024, + desktop: 1200, + }, + }, +}); + +const dark = createTheme({ + palette: { + mode: 'dark', + primary: { + light: '#accbeb', + main: '#1f56a0', + dark: '#1b5eb8', + contrastText: '#fff', + }, + secondary: { + light: '#d2b8fd', + main: '#5c487d', + dark: '#231933', + contrastText: '#fff', + }, + info: { + light: '#9edde3', + main: '#036a73', + dark: '#006d77', + contrastText: '#fff', + }, + success: { + light: '#d9eeeb', + main: '#008f7a', + dark: '#184c4c', + contrastText: '#fff', + }, + warning: { + light: '#fff9e2', + main: '#c89d09', + dark: '#5a4b1d', + contrastText: '#fff', + }, + error: { + light: '#eed9d9', + main: '#cf1717', + dark: '#431616', + contrastText: '#fff', + }, + background: { + default: '#2b1f3f', + paper: '#2b1f3f', + shadow: '#00000033', + }, + gradient: { + a: '#845ec2', + b: '#2c73d2', + c: '#0081cf', + d: '#0089ba', + e: '#008e9b', + f: '#008f7a', + }, + }, + shape: { + borderRadius: 16, + }, + breakpoints: { + values: { + mobile: 0, + tablet: 640, + laptop: 1024, + desktop: 1200, + }, + }, +}); + +const create = (baseTheme: Theme) => + createTheme(baseTheme, { + typography: { + h1: { + fontSize: '1.5rem', + fontWeight: 'bold', + color: + baseTheme.palette.mode === 'light' + ? baseTheme.palette.secondary.dark + : baseTheme.palette.secondary.light, + }, + h2: { + fontSize: '1.5rem', + }, + h5: { + fontSize: '1rem', + }, + body: { + fontSize: '1rem', + }, + body2: { + fontSize: '0.75rem', + color: baseTheme.palette.text.secondary, + }, + subtitle2: { + fontSize: '0.625rem', + [baseTheme.breakpoints.down('tablet')]: { + fontSize: '0.5625rem', + }, + }, + }, + components: { + MuiCard: { + defaultProps: { + elevation: 0, + }, + }, + MuiCardHeader: { + styleOverrides: { + title: { + fontSize: '1rem', + fontWeight: 'bold', + }, + }, + }, + MuiButton: { + styleOverrides: { + textPrimary: { + color: + baseTheme.palette.mode === 'light' + ? baseTheme.palette.primary.main + : baseTheme.palette.primary.light, + }, + }, + }, + MuiLoadingButton: { + defaultProps: { + variant: 'contained', + }, + }, + MuiTextField: { + defaultProps: { + fullWidth: true, + }, + }, + MuiTable: { + styleOverrides: { + root: { + tableLayout: 'fixed', + }, + }, + }, + MuiPagination: { + defaultProps: { + color: 'primary', + }, + }, + MuiTableBody: { + styleOverrides: { + root: { + '& tr.divider:not(:first-of-type)': { + borderTop: `1px solid ${baseTheme.palette.divider}`, + }, + }, + }, + }, + MuiTableCell: { + styleOverrides: { + root: { + borderWidth: 0, + }, + body: { + [baseTheme.breakpoints.down('tablet')]: { + verticalAlign: 'top', + '&:not(.MuiTableCell-paddingNone)': { + padding: baseTheme.spacing(1), + }, + '&:first-of-type': { + color: baseTheme.palette.text.secondary, + }, + }, + }, + head: { + backgroundColor: + baseTheme.palette.mode === 'light' + ? baseTheme.palette.primary.dark + : '#ffffff11', + color: baseTheme.palette.primary.contrastText, + whiteSpace: 'noWrap', + '&:nth-of-type(1)': { + borderTopLeftRadius: baseTheme.shape.borderRadius, + borderBottomLeftRadius: baseTheme.shape.borderRadius / 2, + }, + '&:nth-last-of-type(1)': { + borderTopRightRadius: baseTheme.shape.borderRadius, + borderBottomRightRadius: baseTheme.shape.borderRadius / 2, + }, + [baseTheme.breakpoints.down('tablet')]: { + padding: baseTheme.spacing(1), + }, + }, + footer: { + backgroundColor: + baseTheme.palette.mode === 'light' ? '#00000011' : '#ffffff11', + '&:nth-of-type(1)': { + borderTopLeftRadius: baseTheme.shape.borderRadius / 2, + borderBottomLeftRadius: baseTheme.shape.borderRadius, + }, + '&:nth-last-of-type(1)': { + borderTopRightRadius: baseTheme.shape.borderRadius / 2, + borderBottomRightRadius: baseTheme.shape.borderRadius, + }, + }, + }, + }, + MuiSnackbar: { + defaultProps: { + anchorOrigin: { vertical: 'bottom', horizontal: 'center' }, + }, + }, + MuiAlert: { + styleOverrides: { + root: { + fontSize: '0.9rem', + }, + filledSuccess: { + color: baseTheme.palette.success.dark, + backgroundColor: baseTheme.palette.success.light, + }, + filledError: { + color: baseTheme.palette.error.dark, + backgroundColor: baseTheme.palette.error.light, + }, + }, + }, + }, + }); + +export const theme = { + light: create(light), + dark: create(dark), +}; diff --git a/apps/watcher/app/layout.tsx b/apps/watcher/app/layout.tsx index 31c4365f..ad7e38c5 100644 --- a/apps/watcher/app/layout.tsx +++ b/apps/watcher/app/layout.tsx @@ -9,13 +9,19 @@ import SWRConfig from '@rosen-ui/swr-mock'; */ import { NoSsr } from '@mui/material'; -import { AppSnackbar, styled, SnackbarProvider } from '@rosen-bridge/ui-kit'; +import { + AppSnackbar, + styled, + SnackbarProvider, + ThemeProvider, + CssBaseline, +} from '@rosen-bridge/ui-kit'; import { ApiKeyContextProvider } from '@rosen-bridge/shared-contexts'; import SideBar from './SideBar'; import Toolbar from './Toolbar'; -import ThemeProvider from '@/_theme/ThemeProvider'; +import { theme } from './_theme/theme'; import mockedData from './_mock/mockedData'; @@ -69,26 +75,29 @@ const RootLayout = ({ children }: { children: React.ReactNode }) => { - - - - - - -
- - {children} - -
-
-
-
-
+ + <> + + + + + + +
+ + {children} + +
+
+
+
+
+
From e89bbd43b5e702e50a26fc40bb308e7598fe580d Mon Sep 17 00:00:00 2001 From: ALI-HUP Date: Mon, 14 Oct 2024 13:43:46 +0330 Subject: [PATCH 164/168] changeset updated --- .changeset/lemon-trains-agree.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/lemon-trains-agree.md b/.changeset/lemon-trains-agree.md index 1ee5622e..d54090a4 100644 --- a/.changeset/lemon-trains-agree.md +++ b/.changeset/lemon-trains-agree.md @@ -4,4 +4,4 @@ '@rosen-bridge/watcher-app': patch --- -Disregarding the inclusion of the .env file in all UI applications. +The .env files are included in the .gitignore file for all UI applications to ensure sensitive information remains secure From ca16f932baf431b6881581a5a95569f02a9e5b63 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 14 Oct 2024 11:37:30 +0000 Subject: [PATCH 165/168] feat: Set up an alert for the ledger whenever the source network is Ethereum --- .changeset/lucky-buckets-attack.md | 5 ++++ apps/rosen/app/(bridge)/page.tsx | 41 ++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 11 deletions(-) create mode 100644 .changeset/lucky-buckets-attack.md diff --git a/.changeset/lucky-buckets-attack.md b/.changeset/lucky-buckets-attack.md new file mode 100644 index 00000000..af4de47b --- /dev/null +++ b/.changeset/lucky-buckets-attack.md @@ -0,0 +1,5 @@ +--- +'@rosen-bridge/rosen-app': minor +--- + +Set up an alert for the ledger whenever the Ethereum source network is selected diff --git a/apps/rosen/app/(bridge)/page.tsx b/apps/rosen/app/(bridge)/page.tsx index 8c60a9f1..1367d281 100644 --- a/apps/rosen/app/(bridge)/page.tsx +++ b/apps/rosen/app/(bridge)/page.tsx @@ -3,6 +3,7 @@ import { useForm, FormProvider } from 'react-hook-form'; import { + Alert, Card, Divider, styled, @@ -12,27 +13,33 @@ import { import { BridgeTransaction } from './BridgeTransaction'; import { BridgeForm } from './BridgeForm'; import { RosenAmountValue } from '@rosen-ui/types'; +import { NETWORKS } from '@rosen-ui/constants'; -const BridgeContainer = styled(Card)(({ theme }) => ({ +const Root = styled('div')(({ theme }) => ({ position: 'absolute', top: '50%', left: '50%', transform: 'translate(-50%, -60%)', + margin: '0 auto', + minWidth: 0, + width: '100%', + [theme.breakpoints.up('tablet')]: { + minWidth: '600px', + maxWidth: '50vmax', + }, +})); + +const BridgeContainer = styled(Card)(({ theme }) => ({ backgroundColor: theme.palette.background.paper, borderRadius: theme.spacing(2), - margin: '0 auto', display: 'grid', - minWidth: 0, gap: theme.spacing(1.5), padding: theme.spacing(3), - width: '100%', gridTemplateColumns: '1fr', gridTemplateRows: '5fr 5px auto', [theme.breakpoints.up('tablet')]: { gridTemplateColumns: '3fr auto 2fr', gridTemplateRows: '1fr', - minWidth: '600px', - maxWidth: '50vmax', }, })); @@ -66,11 +73,23 @@ const RosenBridge = () => { return ( - - - - - + + + + + + + {methods.getValues().source == NETWORKS.ETHEREUM && ( + + If you are using Ledger, you may need to enable "Blind signing" and + "Debug data" in the Ledger (Ethereum > Settings) due to{' '} + + a known issue in Ledger and MetaMask interaction + + . + + )} + ); }; From c0eb3022665995876079cc88a309135bc0f052c3 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Mon, 14 Oct 2024 12:12:03 +0000 Subject: [PATCH 166/168] fix: Resolve the bug related to the use of the quotation mark character in the bridge form --- apps/rosen/app/(bridge)/page.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/rosen/app/(bridge)/page.tsx b/apps/rosen/app/(bridge)/page.tsx index 1367d281..4883778a 100644 --- a/apps/rosen/app/(bridge)/page.tsx +++ b/apps/rosen/app/(bridge)/page.tsx @@ -81,8 +81,9 @@ const RosenBridge = () => { {methods.getValues().source == NETWORKS.ETHEREUM && ( - If you are using Ledger, you may need to enable "Blind signing" and - "Debug data" in the Ledger (Ethereum > Settings) due to{' '} + If you are using Ledger, you may need to enable 'Blind + signing' and 'Debug data' in the Ledger (Ethereum + > Settings) due to{' '} a known issue in Ledger and MetaMask interaction From 116b5cbf5d4da6bc8a4862ce9e111662617a6d96 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 15 Oct 2024 08:45:33 +0000 Subject: [PATCH 167/168] chore: Run changeset --- .changeset/angry-flies-march.md | 8 - .changeset/clever-carrots-rush.md | 5 - .changeset/cold-shoes-talk.md | 5 - .changeset/cool-cooks-sneeze.md | 5 - .changeset/cool-feet-scream.md | 5 - .changeset/cyan-tips-suffer.md | 5 - .changeset/cyan-years-bake.md | 5 - .changeset/dirty-deers-roll.md | 5 - .changeset/dry-dolphins-enjoy.md | 5 - .changeset/dull-penguins-fold.md | 7 - .changeset/dull-windows-clean.md | 5 - .changeset/eighty-olives-serve.md | 5 - .changeset/empty-crews-cheat.md | 5 - .changeset/empty-emus-battle.md | 5 - .changeset/famous-zebras-attend.md | 5 - .changeset/few-rats-compete.md | 5 - .changeset/fifty-jeans-bake.md | 15 -- .changeset/flat-foxes-change.md | 5 - .changeset/flat-ligers-compete.md | 23 --- .changeset/fluffy-geese-admire.md | 7 - .changeset/fresh-chairs-move.md | 5 - .changeset/fresh-crews-think.md | 6 - .changeset/funny-jokes-sort.md | 5 - .changeset/giant-donkeys-camp.md | 5 - .changeset/giant-trains-roll.md | 5 - .changeset/great-steaks-yawn.md | 5 - .changeset/hip-students-jam.md | 5 - .changeset/hot-berries-rule.md | 9 - .changeset/itchy-cheetahs-itch.md | 5 - .changeset/kind-jobs-scream.md | 6 - .changeset/lazy-points-rescue.md | 6 - .changeset/lemon-trains-agree.md | 7 - .changeset/light-drinks-unite.md | 5 - .changeset/long-worms-look.md | 5 - .changeset/loud-pets-lay.md | 5 - .changeset/lucky-buckets-attack.md | 5 - .changeset/lucky-squids-accept.md | 8 - .changeset/modern-coins-love.md | 5 - .changeset/neat-donkeys-pump.md | 6 - .changeset/new-cherries-attack.md | 2 - .changeset/nice-moons-study.md | 5 - .changeset/old-tigers-think.md | 5 - .changeset/olive-mice-punch.md | 5 - .changeset/orange-weeks-juggle.md | 5 - .changeset/perfect-eels-push.md | 5 - .changeset/pink-spies-lie.md | 5 - .changeset/plenty-chefs-behave.md | 7 - .changeset/quiet-jokes-marry.md | 5 - .changeset/selfish-insects-look.md | 5 - .changeset/shaggy-pens-hide.md | 5 - ...bright-trees-share.md => sharp-cups-do.md} | 0 ...ur-lions-shave.md => silent-cups-trade.md} | 0 .changeset/silly-wasps-share.md | 5 - .changeset/spicy-bees-obey.md | 5 - .changeset/tall-rules-tickle.md | 5 - .changeset/tasty-carrots-press.md | 5 - .changeset/ten-geckos-marry.md | 10 - .changeset/thick-icons-bake.md | 3 - .changeset/twelve-colts-hunt.md | 7 - .changeset/warm-moons-hunt.md | 5 - .changeset/wet-rats-glow.md | 5 - .changeset/wise-badgers-shake.md | 5 - .changeset/wise-deers-talk.md | 2 - .changeset/yellow-tools-add.md | 5 - .changeset/young-radios-clap.md | 5 - apps/guard/CHANGELOG.md | 16 ++ apps/guard/package.json | 14 +- apps/rosen-service/CHANGELOG.md | 11 + apps/rosen-service/package.json | 4 +- apps/rosen/CHANGELOG.md | 40 ++++ apps/rosen/package.json | 28 +-- apps/watcher/CHANGELOG.md | 13 ++ apps/watcher/package.json | 14 +- networks/bitcoin/CHANGELOG.md | 14 ++ networks/bitcoin/package.json | 6 +- networks/cardano/CHANGELOG.md | 13 ++ networks/cardano/package.json | 4 +- networks/ergo/CHANGELOG.md | 13 ++ networks/ergo/package.json | 4 +- networks/ethereum/CHANGELOG.md | 9 + networks/ethereum/package.json | 4 +- package-lock.json | 192 +++++++++--------- packages/asset-calculator/CHANGELOG.md | 15 ++ packages/asset-calculator/package.json | 4 +- packages/constants/CHANGELOG.md | 6 + packages/constants/package.json | 2 +- packages/icons/CHANGELOG.md | 7 + packages/icons/package.json | 2 +- packages/swr-helpers/CHANGELOG.md | 6 + packages/swr-helpers/package.json | 2 +- packages/types/CHANGELOG.md | 10 + packages/types/package.json | 4 +- packages/ui-kit/CHANGELOG.md | 14 +- packages/ui-kit/package.json | 12 +- packages/utils/CHANGELOG.md | 6 + packages/utils/package.json | 2 +- wallets/eternl-wallet/CHANGELOG.md | 15 +- wallets/eternl-wallet/package.json | 10 +- wallets/flint-wallet/CHANGELOG.md | 15 +- wallets/flint-wallet/package.json | 10 +- wallets/lace-wallet/CHANGELOG.md | 15 +- wallets/lace-wallet/package.json | 10 +- wallets/metamask-wallet/CHANGELOG.md | 9 + wallets/metamask-wallet/package.json | 10 +- wallets/nami-wallet/CHANGELOG.md | 14 +- wallets/nami-wallet/package.json | 10 +- wallets/nautilus-wallet/CHANGELOG.md | 13 +- wallets/nautilus-wallet/package.json | 10 +- wallets/vespr-wallet/CHANGELOG.md | 8 +- wallets/vespr-wallet/package.json | 8 +- wallets/wallet-api/CHANGELOG.md | 9 +- wallets/wallet-api/package.json | 6 +- wallets/xdefi-wallet/CHANGELOG.md | 13 ++ wallets/xdefi-wallet/package.json | 12 +- 114 files changed, 488 insertions(+), 564 deletions(-) delete mode 100644 .changeset/angry-flies-march.md delete mode 100644 .changeset/clever-carrots-rush.md delete mode 100644 .changeset/cold-shoes-talk.md delete mode 100644 .changeset/cool-cooks-sneeze.md delete mode 100644 .changeset/cool-feet-scream.md delete mode 100644 .changeset/cyan-tips-suffer.md delete mode 100644 .changeset/cyan-years-bake.md delete mode 100644 .changeset/dirty-deers-roll.md delete mode 100644 .changeset/dry-dolphins-enjoy.md delete mode 100644 .changeset/dull-penguins-fold.md delete mode 100644 .changeset/dull-windows-clean.md delete mode 100644 .changeset/eighty-olives-serve.md delete mode 100644 .changeset/empty-crews-cheat.md delete mode 100644 .changeset/empty-emus-battle.md delete mode 100644 .changeset/famous-zebras-attend.md delete mode 100644 .changeset/few-rats-compete.md delete mode 100644 .changeset/fifty-jeans-bake.md delete mode 100644 .changeset/flat-foxes-change.md delete mode 100644 .changeset/flat-ligers-compete.md delete mode 100644 .changeset/fluffy-geese-admire.md delete mode 100644 .changeset/fresh-chairs-move.md delete mode 100644 .changeset/fresh-crews-think.md delete mode 100644 .changeset/funny-jokes-sort.md delete mode 100644 .changeset/giant-donkeys-camp.md delete mode 100644 .changeset/giant-trains-roll.md delete mode 100644 .changeset/great-steaks-yawn.md delete mode 100644 .changeset/hip-students-jam.md delete mode 100644 .changeset/hot-berries-rule.md delete mode 100644 .changeset/itchy-cheetahs-itch.md delete mode 100644 .changeset/kind-jobs-scream.md delete mode 100644 .changeset/lazy-points-rescue.md delete mode 100644 .changeset/lemon-trains-agree.md delete mode 100644 .changeset/light-drinks-unite.md delete mode 100644 .changeset/long-worms-look.md delete mode 100644 .changeset/loud-pets-lay.md delete mode 100644 .changeset/lucky-buckets-attack.md delete mode 100644 .changeset/lucky-squids-accept.md delete mode 100644 .changeset/modern-coins-love.md delete mode 100644 .changeset/neat-donkeys-pump.md delete mode 100644 .changeset/new-cherries-attack.md delete mode 100644 .changeset/nice-moons-study.md delete mode 100644 .changeset/old-tigers-think.md delete mode 100644 .changeset/olive-mice-punch.md delete mode 100644 .changeset/orange-weeks-juggle.md delete mode 100644 .changeset/perfect-eels-push.md delete mode 100644 .changeset/pink-spies-lie.md delete mode 100644 .changeset/plenty-chefs-behave.md delete mode 100644 .changeset/quiet-jokes-marry.md delete mode 100644 .changeset/selfish-insects-look.md delete mode 100644 .changeset/shaggy-pens-hide.md rename .changeset/{bright-trees-share.md => sharp-cups-do.md} (100%) rename .changeset/{four-lions-shave.md => silent-cups-trade.md} (100%) delete mode 100644 .changeset/silly-wasps-share.md delete mode 100644 .changeset/spicy-bees-obey.md delete mode 100644 .changeset/tall-rules-tickle.md delete mode 100644 .changeset/tasty-carrots-press.md delete mode 100644 .changeset/ten-geckos-marry.md delete mode 100644 .changeset/thick-icons-bake.md delete mode 100644 .changeset/twelve-colts-hunt.md delete mode 100644 .changeset/warm-moons-hunt.md delete mode 100644 .changeset/wet-rats-glow.md delete mode 100644 .changeset/wise-badgers-shake.md delete mode 100644 .changeset/wise-deers-talk.md delete mode 100644 .changeset/yellow-tools-add.md delete mode 100644 .changeset/young-radios-clap.md diff --git a/.changeset/angry-flies-march.md b/.changeset/angry-flies-march.md deleted file mode 100644 index 31632311..00000000 --- a/.changeset/angry-flies-march.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@rosen-network/ethereum': patch -'@rosen-network/bitcoin': patch -'@rosen-network/cardano': patch -'@rosen-network/ergo': patch ---- - -Enhance the generateUnsignedTx utility functions within the networks package diff --git a/.changeset/clever-carrots-rush.md b/.changeset/clever-carrots-rush.md deleted file mode 100644 index 87a0064e..00000000 --- a/.changeset/clever-carrots-rush.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': patch ---- - -Fix issue of "All" network item not being selected in assets page in first load diff --git a/.changeset/cold-shoes-talk.md b/.changeset/cold-shoes-talk.md deleted file mode 100644 index 39b0ffd7..00000000 --- a/.changeset/cold-shoes-talk.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': patch ---- - -Refine and strengthen the validation process for network addresses to ensure greater accuracy and reliability. diff --git a/.changeset/cool-cooks-sneeze.md b/.changeset/cool-cooks-sneeze.md deleted file mode 100644 index 37575413..00000000 --- a/.changeset/cool-cooks-sneeze.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': minor ---- - -Implement logic for automatic detection of installed wallets in runtime without the need to refresh the page. diff --git a/.changeset/cool-feet-scream.md b/.changeset/cool-feet-scream.md deleted file mode 100644 index 29cbc8f4..00000000 --- a/.changeset/cool-feet-scream.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/ui-kit': patch ---- - -Revise the font-size of the hot and cold amounts in the TokenListItem component. diff --git a/.changeset/cyan-tips-suffer.md b/.changeset/cyan-tips-suffer.md deleted file mode 100644 index ceac8d1a..00000000 --- a/.changeset/cyan-tips-suffer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': patch ---- - -Fix the external token link within the assets page diff --git a/.changeset/cyan-years-bake.md b/.changeset/cyan-years-bake.md deleted file mode 100644 index abbab015..00000000 --- a/.changeset/cyan-years-bake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-network/bitcoin': patch ---- - -update address-codec package diff --git a/.changeset/dirty-deers-roll.md b/.changeset/dirty-deers-roll.md deleted file mode 100644 index f4e8e06f..00000000 --- a/.changeset/dirty-deers-roll.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': major ---- - -Update the `getMaxTransfer` server action in the networks to return a `WRAPPED-VALUE`. diff --git a/.changeset/dry-dolphins-enjoy.md b/.changeset/dry-dolphins-enjoy.md deleted file mode 100644 index 7c11acde..00000000 --- a/.changeset/dry-dolphins-enjoy.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-ui/asset-calculator': major ---- - -To implement decimal drop context, convert unwrapped values into wrapped values. diff --git a/.changeset/dull-penguins-fold.md b/.changeset/dull-penguins-fold.md deleted file mode 100644 index 1176e8b6..00000000 --- a/.changeset/dull-penguins-fold.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@rosen-bridge/guard-app': minor -'@rosen-bridge/rosen-app': minor -'@rosen-bridge/watcher-app': minor ---- - -Revise the theme provider code to incorporate the latest updates from the design system diff --git a/.changeset/dull-windows-clean.md b/.changeset/dull-windows-clean.md deleted file mode 100644 index b6d32ce8..00000000 --- a/.changeset/dull-windows-clean.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-network/ethereum': patch ---- - -Initialize the Ethereum network package. diff --git a/.changeset/eighty-olives-serve.md b/.changeset/eighty-olives-serve.md deleted file mode 100644 index 0dce5c86..00000000 --- a/.changeset/eighty-olives-serve.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-ui/metamask-wallet': patch ---- - -Implement the MetaMask wallet package. diff --git a/.changeset/empty-crews-cheat.md b/.changeset/empty-crews-cheat.md deleted file mode 100644 index d7e60095..00000000 --- a/.changeset/empty-crews-cheat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': patch ---- - -Revise the bridge form to enhance maintainability. diff --git a/.changeset/empty-emus-battle.md b/.changeset/empty-emus-battle.md deleted file mode 100644 index 0a71d543..00000000 --- a/.changeset/empty-emus-battle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/guard-app': minor ---- - -Update the ApiInfoResponse interface to incorporate the latest API enhancements. diff --git a/.changeset/famous-zebras-attend.md b/.changeset/famous-zebras-attend.md deleted file mode 100644 index 1788c082..00000000 --- a/.changeset/famous-zebras-attend.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': minor ---- - -Add token id of the bridged asset to asset details API response diff --git a/.changeset/few-rats-compete.md b/.changeset/few-rats-compete.md deleted file mode 100644 index 62250382..00000000 --- a/.changeset/few-rats-compete.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': patch ---- - -Sort the results of the query on the assets repository service by the name property diff --git a/.changeset/fifty-jeans-bake.md b/.changeset/fifty-jeans-bake.md deleted file mode 100644 index b5a0410c..00000000 --- a/.changeset/fifty-jeans-bake.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -'@rosen-ui/nautilus-wallet': patch -'@rosen-ui/eternl-wallet': patch -'@rosen-ui/flint-wallet': patch -'@rosen-ui/vespr-wallet': patch -'@rosen-ui/xdefi-wallet': patch -'@rosen-ui/lace-wallet': patch -'@rosen-ui/nami-wallet': patch -'@rosen-ui/wallet-api': patch -'@rosen-network/bitcoin': patch -'@rosen-network/cardano': patch -'@rosen-network/ergo': patch ---- - -Revise the wallet creation logic and update the access type for each API. diff --git a/.changeset/flat-foxes-change.md b/.changeset/flat-foxes-change.md deleted file mode 100644 index 29465e51..00000000 --- a/.changeset/flat-foxes-change.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-ui/xdefi-wallet': patch ---- - -remove redundant package dependency diff --git a/.changeset/flat-ligers-compete.md b/.changeset/flat-ligers-compete.md deleted file mode 100644 index b345fd71..00000000 --- a/.changeset/flat-ligers-compete.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -'@rosen-ui/asset-calculator': patch -'@rosen-ui/metamask-wallet': patch -'@rosen-ui/nautilus-wallet': patch -'@rosen-ui/eternl-wallet': patch -'@rosen-ui/flint-wallet': patch -'@rosen-ui/xdefi-wallet': patch -'@rosen-ui/lace-wallet': patch -'@rosen-ui/nami-wallet': patch -'@rosen-ui/constants': patch -'@rosen-ui/wallet-api': patch -'@rosen-network/ethereum': patch -'@rosen-network/bitcoin': patch -'@rosen-network/cardano': patch -'@rosen-ui/types': patch -'@rosen-ui/utils': patch -'@rosen-network/ergo': patch -'@rosen-bridge/watcher-app': patch -'@rosen-bridge/guard-app': patch -'@rosen-bridge/rosen-app': patch ---- - -Strengthen type safety and enforce robust typing for Chain and Network types diff --git a/.changeset/fluffy-geese-admire.md b/.changeset/fluffy-geese-admire.md deleted file mode 100644 index bcb37466..00000000 --- a/.changeset/fluffy-geese-admire.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@rosen-network/bitcoin': major -'@rosen-network/cardano': major -'@rosen-network/ergo': major ---- - -Update the input parameter of the `generateUnsignedTx` function from an `UNWRAPPED-VALUE` to a `WRAPPED-VALUE`. diff --git a/.changeset/fresh-chairs-move.md b/.changeset/fresh-chairs-move.md deleted file mode 100644 index 8d702c71..00000000 --- a/.changeset/fresh-chairs-move.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': patch ---- - -Address the issue concerning the display of hot, cold, and locked amount values on the assets page diff --git a/.changeset/fresh-crews-think.md b/.changeset/fresh-crews-think.md deleted file mode 100644 index e63c365b..00000000 --- a/.changeset/fresh-crews-think.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@rosen-bridge/ui-kit': minor -'@rosen-bridge/rosen-app': minor ---- - -Improve the sidebar component to accept child elements as specific props, enhancing maintainability and enabling future implementation of responsive design diff --git a/.changeset/funny-jokes-sort.md b/.changeset/funny-jokes-sort.md deleted file mode 100644 index f898ee54..00000000 --- a/.changeset/funny-jokes-sort.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-service': major ---- - -initialize Ethereum scanner and Extractor diff --git a/.changeset/giant-donkeys-camp.md b/.changeset/giant-donkeys-camp.md deleted file mode 100644 index 2a415bd5..00000000 --- a/.changeset/giant-donkeys-camp.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': patch ---- - -Implement utility functions to facilitate the transfer of the BigInt data type between the server and client in server actions. diff --git a/.changeset/giant-trains-roll.md b/.changeset/giant-trains-roll.md deleted file mode 100644 index 3f9aea3f..00000000 --- a/.changeset/giant-trains-roll.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-ui/types': minor ---- - -Revise the HealthParamInfo model to align with the latest API updates diff --git a/.changeset/great-steaks-yawn.md b/.changeset/great-steaks-yawn.md deleted file mode 100644 index 1fcbc9e0..00000000 --- a/.changeset/great-steaks-yawn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-service': patch ---- - -Fix scanner initialization bug diff --git a/.changeset/hip-students-jam.md b/.changeset/hip-students-jam.md deleted file mode 100644 index ddb11e86..00000000 --- a/.changeset/hip-students-jam.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/icons': minor ---- - -Add Ethereum and MetaMask icons diff --git a/.changeset/hot-berries-rule.md b/.changeset/hot-berries-rule.md deleted file mode 100644 index 853de712..00000000 --- a/.changeset/hot-berries-rule.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@rosen-ui/eternl-wallet': major -'@rosen-ui/flint-wallet': major -'@rosen-ui/lace-wallet': major -'@rosen-ui/nami-wallet': major -'@rosen-ui/xdefi-wallet': major ---- - -Modify the `transferCreator` function parameter to accept `WRAPPED-VALUE`. diff --git a/.changeset/itchy-cheetahs-itch.md b/.changeset/itchy-cheetahs-itch.md deleted file mode 100644 index be8cd89c..00000000 --- a/.changeset/itchy-cheetahs-itch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': patch ---- - -Implement cache utility to optimize performance for server actions and Display a zero balance when the wallet balance is zero or when the token is unsupported. diff --git a/.changeset/kind-jobs-scream.md b/.changeset/kind-jobs-scream.md deleted file mode 100644 index 64678036..00000000 --- a/.changeset/kind-jobs-scream.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@rosen-bridge/watcher-app': minor -'@rosen-bridge/guard-app': minor ---- - -Enhance the app to incorporate the latest updates in API functionality and design diff --git a/.changeset/lazy-points-rescue.md b/.changeset/lazy-points-rescue.md deleted file mode 100644 index eabf1912..00000000 --- a/.changeset/lazy-points-rescue.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@rosen-bridge/watcher-app': patch -'@rosen-bridge/guard-app': patch ---- - -Address the issue related to retrieving the app version property from the API diff --git a/.changeset/lemon-trains-agree.md b/.changeset/lemon-trains-agree.md deleted file mode 100644 index d54090a4..00000000 --- a/.changeset/lemon-trains-agree.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@rosen-bridge/guard-app': patch -'@rosen-bridge/rosen-app': patch -'@rosen-bridge/watcher-app': patch ---- - -The .env files are included in the .gitignore file for all UI applications to ensure sensitive information remains secure diff --git a/.changeset/light-drinks-unite.md b/.changeset/light-drinks-unite.md deleted file mode 100644 index 39f8249e..00000000 --- a/.changeset/light-drinks-unite.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': minor ---- - -Enable CORS headers for allowing certain origins to access APIs diff --git a/.changeset/long-worms-look.md b/.changeset/long-worms-look.md deleted file mode 100644 index 9ba91b86..00000000 --- a/.changeset/long-worms-look.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/guard-app': minor ---- - -Integrate a token list for the Ethereum network into the dashboard. diff --git a/.changeset/loud-pets-lay.md b/.changeset/loud-pets-lay.md deleted file mode 100644 index 8c62d8ca..00000000 --- a/.changeset/loud-pets-lay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': patch ---- - -Improve the error handling for the validateAddress function and implement result caching using centralized cache utilities diff --git a/.changeset/lucky-buckets-attack.md b/.changeset/lucky-buckets-attack.md deleted file mode 100644 index af4de47b..00000000 --- a/.changeset/lucky-buckets-attack.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': minor ---- - -Set up an alert for the ledger whenever the Ethereum source network is selected diff --git a/.changeset/lucky-squids-accept.md b/.changeset/lucky-squids-accept.md deleted file mode 100644 index 44aa9bef..00000000 --- a/.changeset/lucky-squids-accept.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@rosen-network/bitcoin': patch -'@rosen-network/cardano': patch -'@rosen-network/ergo': patch -'@rosen-bridge/rosen-app': patch ---- - -Add the tokenMap configuration to the wallet creator's setup. diff --git a/.changeset/modern-coins-love.md b/.changeset/modern-coins-love.md deleted file mode 100644 index 7b971ea0..00000000 --- a/.changeset/modern-coins-love.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': major ---- - -integrate Ethereum diff --git a/.changeset/neat-donkeys-pump.md b/.changeset/neat-donkeys-pump.md deleted file mode 100644 index b37287c9..00000000 --- a/.changeset/neat-donkeys-pump.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@rosen-ui/metamask-wallet': patch -'@rosen-network/ethereum': patch ---- - -Address the issue related to retrieving the token balance in Ethereum diff --git a/.changeset/new-cherries-attack.md b/.changeset/new-cherries-attack.md deleted file mode 100644 index a845151c..00000000 --- a/.changeset/new-cherries-attack.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/nice-moons-study.md b/.changeset/nice-moons-study.md deleted file mode 100644 index fe248e46..00000000 --- a/.changeset/nice-moons-study.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-ui/metamask-wallet': patch ---- - -Upgrade the @rosen-ui/utils package from version 0.3.0 to 0.4.0 diff --git a/.changeset/old-tigers-think.md b/.changeset/old-tigers-think.md deleted file mode 100644 index b58fa0de..00000000 --- a/.changeset/old-tigers-think.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': patch ---- - -Update server actions for error handling based on new error handling module diff --git a/.changeset/olive-mice-punch.md b/.changeset/olive-mice-punch.md deleted file mode 100644 index b387f31d..00000000 --- a/.changeset/olive-mice-punch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': major ---- - -Transform the Rosen amount type from a numerical format to a bigint data type. diff --git a/.changeset/orange-weeks-juggle.md b/.changeset/orange-weeks-juggle.md deleted file mode 100644 index d9a9b0fa..00000000 --- a/.changeset/orange-weeks-juggle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': minor ---- - -Develop a utility to validate the arguments for server actions. diff --git a/.changeset/perfect-eels-push.md b/.changeset/perfect-eels-push.md deleted file mode 100644 index 9261c3d1..00000000 --- a/.changeset/perfect-eels-push.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': minor ---- - -Integrate the MetaMask wallet package into the Rosen app. diff --git a/.changeset/pink-spies-lie.md b/.changeset/pink-spies-lie.md deleted file mode 100644 index f1ffda2e..00000000 --- a/.changeset/pink-spies-lie.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-ui/swr-helpers': minor ---- - -Implement support for the PUT method in the fetcher utilities diff --git a/.changeset/plenty-chefs-behave.md b/.changeset/plenty-chefs-behave.md deleted file mode 100644 index 9aea3ce7..00000000 --- a/.changeset/plenty-chefs-behave.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@rosen-ui/eternl-wallet': patch -'@rosen-ui/flint-wallet': patch -'@rosen-ui/lace-wallet': patch ---- - -Resolve the issue by replacing the incorrect token retrieval method using policyId with a more accurate approach that retrieves the token by both nameHex and policyId. diff --git a/.changeset/quiet-jokes-marry.md b/.changeset/quiet-jokes-marry.md deleted file mode 100644 index 780e3c90..00000000 --- a/.changeset/quiet-jokes-marry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': patch ---- - -Refined Rosen app code for better maintainability by unifying environment variable access, reviewing database service code in assets and events, and enhancing type usage throughout the application. diff --git a/.changeset/selfish-insects-look.md b/.changeset/selfish-insects-look.md deleted file mode 100644 index 51b4687a..00000000 --- a/.changeset/selfish-insects-look.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': minor ---- - -Develop a responsive assets page that allows users to view detailed information about each asset, ensuring a seamless user experience across various devices and screen sizes. diff --git a/.changeset/shaggy-pens-hide.md b/.changeset/shaggy-pens-hide.md deleted file mode 100644 index e226c939..00000000 --- a/.changeset/shaggy-pens-hide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/ui-kit': minor ---- - -Enhance the HealthParamCard component to accommodate emerging requirements diff --git a/.changeset/bright-trees-share.md b/.changeset/sharp-cups-do.md similarity index 100% rename from .changeset/bright-trees-share.md rename to .changeset/sharp-cups-do.md diff --git a/.changeset/four-lions-shave.md b/.changeset/silent-cups-trade.md similarity index 100% rename from .changeset/four-lions-shave.md rename to .changeset/silent-cups-trade.md diff --git a/.changeset/silly-wasps-share.md b/.changeset/silly-wasps-share.md deleted file mode 100644 index 40cd30c4..00000000 --- a/.changeset/silly-wasps-share.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': patch ---- - -Update the asset user interface to align with the latest API changes. diff --git a/.changeset/spicy-bees-obey.md b/.changeset/spicy-bees-obey.md deleted file mode 100644 index cdbb1ad8..00000000 --- a/.changeset/spicy-bees-obey.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-ui/asset-calculator': minor ---- - -Add evm asset calculator and ethereum calculator interface diff --git a/.changeset/tall-rules-tickle.md b/.changeset/tall-rules-tickle.md deleted file mode 100644 index e6cec827..00000000 --- a/.changeset/tall-rules-tickle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/ui-kit': minor ---- - -Enhance the design system by adding the ToolbarThemeTogglerAction component, introducing a useThemeToggler hook, and updating the ThemeProvider to support overarching logic diff --git a/.changeset/tasty-carrots-press.md b/.changeset/tasty-carrots-press.md deleted file mode 100644 index fa0db4bf..00000000 --- a/.changeset/tasty-carrots-press.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-ui/asset-calculator': minor ---- - -Save bridged token ids inside bridged assets table diff --git a/.changeset/ten-geckos-marry.md b/.changeset/ten-geckos-marry.md deleted file mode 100644 index 503e9fb2..00000000 --- a/.changeset/ten-geckos-marry.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@rosen-ui/eternl-wallet': major -'@rosen-ui/flint-wallet': major -'@rosen-ui/lace-wallet': major -'@rosen-ui/nami-wallet': major -'@rosen-ui/nautilus-wallet': major -'@rosen-ui/xdefi-wallet': major ---- - -Change the output type of the `getBalance` function from an `UNWRAPPED-VALUE` to a `WRAPPED-VALUE`. diff --git a/.changeset/thick-icons-bake.md b/.changeset/thick-icons-bake.md deleted file mode 100644 index 55ebf183..00000000 --- a/.changeset/thick-icons-bake.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -'@rosen-bridge/rosen-app': patch ---- diff --git a/.changeset/twelve-colts-hunt.md b/.changeset/twelve-colts-hunt.md deleted file mode 100644 index b771a96e..00000000 --- a/.changeset/twelve-colts-hunt.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@rosen-bridge/rosen-service': patch -'@rosen-bridge/guard-app': patch -'@rosen-bridge/rosen-app': patch ---- - -Update README diff --git a/.changeset/warm-moons-hunt.md b/.changeset/warm-moons-hunt.md deleted file mode 100644 index c8c7b4e9..00000000 --- a/.changeset/warm-moons-hunt.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-service': patch ---- - -Fix observation entity no metadata error diff --git a/.changeset/wet-rats-glow.md b/.changeset/wet-rats-glow.md deleted file mode 100644 index 7f28c24d..00000000 --- a/.changeset/wet-rats-glow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/guard-app': patch ---- - -Fix the bug that prevents the Clear button from working correctly in the text field of the API key modal. Ensure that submitting the form does not trigger the parent forms, which would subsequently open a dialog that relies on them. diff --git a/.changeset/wise-badgers-shake.md b/.changeset/wise-badgers-shake.md deleted file mode 100644 index 7b7cdaa1..00000000 --- a/.changeset/wise-badgers-shake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': minor ---- - -Implement an error handling utility for the server actions diff --git a/.changeset/wise-deers-talk.md b/.changeset/wise-deers-talk.md deleted file mode 100644 index a845151c..00000000 --- a/.changeset/wise-deers-talk.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/yellow-tools-add.md b/.changeset/yellow-tools-add.md deleted file mode 100644 index 1646ad80..00000000 --- a/.changeset/yellow-tools-add.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/rosen-app': patch ---- - -Fix the Events page in the Rosen app to ensure accurate display of amounts and fees with the correct decimal places diff --git a/.changeset/young-radios-clap.md b/.changeset/young-radios-clap.md deleted file mode 100644 index 3248bb59..00000000 --- a/.changeset/young-radios-clap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rosen-bridge/icons': minor ---- - -Add the ShieldQuestion icon diff --git a/apps/guard/CHANGELOG.md b/apps/guard/CHANGELOG.md index 9c75ea52..fb2d9bd3 100644 --- a/apps/guard/CHANGELOG.md +++ b/apps/guard/CHANGELOG.md @@ -1,5 +1,21 @@ # @rosen-bridge/guard-app +## 1.5.0 + +### Minor Changes + +- Revise the theme provider code to incorporate the latest updates from the design system +- Update the ApiInfoResponse interface to incorporate the latest API enhancements. +- Enhance the app to incorporate the latest updates in API functionality and design +- Integrate a token list for the Ethereum network into the dashboard. + +### Patch Changes + +- Strengthen type safety and enforce robust typing for Chain and Network types +- Address the issue related to retrieving the app version property from the API +- The .env files are included in the .gitignore file for all UI applications to ensure sensitive information remains secure +- Fix the bug that prevents the Clear button from working correctly in the text field of the API key modal. Ensure that submitting the form does not trigger the parent forms, which would subsequently open a dialog that relies on them. + ## 1.4.1 ### Patch Changes diff --git a/apps/guard/package.json b/apps/guard/package.json index 2e2b4c43..590b645b 100644 --- a/apps/guard/package.json +++ b/apps/guard/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-bridge/guard-app", - "version": "1.4.1", + "version": "1.5.0", "private": true, "scripts": { "prettify": "prettier --write . --ignore-path ./.gitignore", @@ -14,12 +14,12 @@ "dependencies": { "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", - "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/icons": "^0.5.0", "@rosen-bridge/shared-contexts": "^0.0.1", - "@rosen-bridge/ui-kit": "^1.2.0", - "@rosen-ui/constants": "^0.0.3", - "@rosen-ui/swr-helpers": "^0.1.0", - "@rosen-ui/utils": "^0.4.0", + "@rosen-bridge/ui-kit": "^1.3.0", + "@rosen-ui/constants": "^0.0.4", + "@rosen-ui/swr-helpers": "^0.2.0", + "@rosen-ui/utils": "^0.4.1", "moment": "^2.29.4", "next": "14.1.0", "react": "^18.2.0", @@ -32,7 +32,7 @@ "devDependencies": { "@rosen-ui/common-hooks": "^0.1.0", "@rosen-ui/swr-mock": "^0.0.1", - "@rosen-ui/types": "^0.2.0", + "@rosen-ui/types": "^0.3.0", "@tauri-apps/cli": "^1.4.0", "@types/moment": "^2.13.0", "@types/node": "20.2.5", diff --git a/apps/rosen-service/CHANGELOG.md b/apps/rosen-service/CHANGELOG.md index 67d3e04f..8052b1ec 100644 --- a/apps/rosen-service/CHANGELOG.md +++ b/apps/rosen-service/CHANGELOG.md @@ -1,5 +1,16 @@ # @rosen-bridge/rosen-service +## 2.0.0 + +### Major Changes + +- initialize Ethereum scanner and Extractor + +### Patch Changes + +- Fix scanner initialization bug +- Fix observation entity no metadata error + ## 1.1.0 ### Minor Changes diff --git a/apps/rosen-service/package.json b/apps/rosen-service/package.json index ad38214e..672880d8 100644 --- a/apps/rosen-service/package.json +++ b/apps/rosen-service/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-bridge/rosen-service", - "version": "1.1.0", + "version": "2.0.0", "private": true, "license": "GPL-3.0", "author": "Rosen Team", @@ -26,7 +26,7 @@ "@rosen-bridge/scanner": "^4.1.3", "@rosen-bridge/watcher-data-extractor": "^8.0.2", "@rosen-bridge/winston-logger": "^0.2.1", - "@rosen-ui/asset-calculator": "^1.0.1", + "@rosen-ui/asset-calculator": "^2.0.0", "config": "^3.3.7" }, "devDependencies": { diff --git a/apps/rosen/CHANGELOG.md b/apps/rosen/CHANGELOG.md index 2f1eb68e..6147b480 100644 --- a/apps/rosen/CHANGELOG.md +++ b/apps/rosen/CHANGELOG.md @@ -1,5 +1,45 @@ # @rosen-bridge/rosen-app +## 2.0.0 + +### Major Changes + +- Update the `getMaxTransfer` server action in the networks to return a `WRAPPED-VALUE`. +- integrate Ethereum +- Transform the Rosen amount type from a numerical format to a bigint data type. + +### Minor Changes + +- Implement logic for automatic detection of installed wallets in runtime without the need to refresh the page. +- Revise the theme provider code to incorporate the latest updates from the design system +- Add token id of the bridged asset to asset details API response +- Improve the sidebar component to accept child elements as specific props, enhancing maintainability and enabling future implementation of responsive design +- Enable CORS headers for allowing certain origins to access APIs +- Set up an alert for the ledger whenever the Ethereum source network is selected +- Develop a utility to validate the arguments for server actions. +- Integrate the MetaMask wallet package into the Rosen app. +- Develop a responsive assets page that allows users to view detailed information about each asset, ensuring a seamless user experience across various devices and screen sizes. +- Implement an error handling utility for the server actions + +### Patch Changes + +- Fix issue of "All" network item not being selected in assets page in first load +- Refine and strengthen the validation process for network addresses to ensure greater accuracy and reliability. +- Fix the external token link within the assets page +- Revise the bridge form to enhance maintainability. +- Sort the results of the query on the assets repository service by the name property +- Strengthen type safety and enforce robust typing for Chain and Network types +- Address the issue concerning the display of hot, cold, and locked amount values on the assets page +- Implement utility functions to facilitate the transfer of the BigInt data type between the server and client in server actions. +- Implement cache utility to optimize performance for server actions and Display a zero balance when the wallet balance is zero or when the token is unsupported. +- The .env files are included in the .gitignore file for all UI applications to ensure sensitive information remains secure +- Improve the error handling for the validateAddress function and implement result caching using centralized cache utilities +- Add the tokenMap configuration to the wallet creator's setup. +- Update server actions for error handling based on new error handling module +- Refined Rosen app code for better maintainability by unifying environment variable access, reviewing database service code in assets and events, and enhancing type usage throughout the application. +- Update the asset user interface to align with the latest API changes. +- Fix the Events page in the Rosen app to ensure accurate display of amounts and fees with the correct decimal places + ## 1.1.1 ### Patch Changes diff --git a/apps/rosen/package.json b/apps/rosen/package.json index 9154fb08..c3640834 100644 --- a/apps/rosen/package.json +++ b/apps/rosen/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-bridge/rosen-app", - "version": "1.1.1", + "version": "2.0.0", "private": true, "scripts": { "prettify": "prettier --write . --ignore-path ./.gitignore", @@ -30,20 +30,20 @@ "@rosen-bridge/watcher-data-extractor": "^8.0.2", "@rosen-clients/cardano-koios": "^2.0.1", "@rosen-clients/ergo-explorer": "^1.0.2", - "@rosen-network/bitcoin": "^0.2.0", - "@rosen-network/cardano": "^0.1.1", - "@rosen-network/ergo": "^0.1.2", - "@rosen-ui/asset-calculator": "^1.0.1", + "@rosen-network/bitcoin": "^1.0.0", + "@rosen-network/cardano": "^1.0.0", + "@rosen-network/ergo": "^1.0.0", + "@rosen-ui/asset-calculator": "^2.0.0", "@rosen-ui/common-hooks": "^0.1.0", - "@rosen-ui/eternl-wallet": "^0.1.3", - "@rosen-ui/flint-wallet": "^0.1.3", - "@rosen-ui/lace-wallet": "^0.1.3", - "@rosen-ui/nami-wallet": "^0.1.3", - "@rosen-ui/nautilus-wallet": "^0.2.0", - "@rosen-ui/utils": "^0.4.0", - "@rosen-ui/vespr-wallet": "^0.0.7", - "@rosen-ui/wallet-api": "^1.0.2", - "@rosen-ui/xdefi-wallet": "^0.4.0", + "@rosen-ui/eternl-wallet": "^1.0.0", + "@rosen-ui/flint-wallet": "^1.0.0", + "@rosen-ui/lace-wallet": "^1.0.0", + "@rosen-ui/nami-wallet": "^1.0.0", + "@rosen-ui/nautilus-wallet": "^1.0.0", + "@rosen-ui/utils": "^0.4.1", + "@rosen-ui/vespr-wallet": "^0.0.8", + "@rosen-ui/wallet-api": "^1.0.3", + "@rosen-ui/xdefi-wallet": "^1.0.0", "@upstash/ratelimit": "^1.2.1", "@vercel/kv": "^2.0.0", "buffer": "^6.0.3", diff --git a/apps/watcher/CHANGELOG.md b/apps/watcher/CHANGELOG.md index 22cb097b..ec346444 100644 --- a/apps/watcher/CHANGELOG.md +++ b/apps/watcher/CHANGELOG.md @@ -1,5 +1,18 @@ # @rosen-bridge/watcher-app +## 2.4.0 + +### Minor Changes + +- Revise the theme provider code to incorporate the latest updates from the design system +- Enhance the app to incorporate the latest updates in API functionality and design + +### Patch Changes + +- Strengthen type safety and enforce robust typing for Chain and Network types +- Address the issue related to retrieving the app version property from the API +- The .env files are included in the .gitignore file for all UI applications to ensure sensitive information remains secure + ## 2.3.0 ### Minor Changes diff --git a/apps/watcher/package.json b/apps/watcher/package.json index 35308ada..caeda276 100644 --- a/apps/watcher/package.json +++ b/apps/watcher/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-bridge/watcher-app", - "version": "2.3.0", + "version": "2.4.0", "private": true, "scripts": { "prettify": "prettier --write . --ignore-path ./.gitignore", @@ -14,15 +14,15 @@ "dependencies": { "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", - "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/icons": "^0.5.0", "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/shared-contexts": "^0.0.1", - "@rosen-bridge/ui-kit": "^1.2.0", + "@rosen-bridge/ui-kit": "^1.3.0", "@rosen-ui/common-hooks": "^0.1.0", - "@rosen-ui/constants": "^0.0.3", - "@rosen-ui/swr-helpers": "^0.1.0", + "@rosen-ui/constants": "^0.0.4", + "@rosen-ui/swr-helpers": "^0.2.0", "@rosen-ui/swr-mock": "^0.0.1", - "@rosen-ui/utils": "^0.4.0", + "@rosen-ui/utils": "^0.4.1", "lodash-es": "^4.17.21", "moment": "^2.29.4", "next": "14.1.0", @@ -34,7 +34,7 @@ "swr": "^2.1.5" }, "devDependencies": { - "@rosen-ui/types": "^0.2.0", + "@rosen-ui/types": "^0.3.0", "@tauri-apps/cli": "^1.4.0", "@types/lodash-es": "^4.17.11", "@types/moment": "^2.13.0", diff --git a/networks/bitcoin/CHANGELOG.md b/networks/bitcoin/CHANGELOG.md index 75210d11..2c8026b2 100644 --- a/networks/bitcoin/CHANGELOG.md +++ b/networks/bitcoin/CHANGELOG.md @@ -1,5 +1,19 @@ # @rosen-network/bitcoin +## 1.0.0 + +### Major Changes + +- Update the input parameter of the `generateUnsignedTx` function from an `UNWRAPPED-VALUE` to a `WRAPPED-VALUE`. + +### Patch Changes + +- Enhance the generateUnsignedTx utility functions within the networks package +- update address-codec package +- Revise the wallet creation logic and update the access type for each API. +- Strengthen type safety and enforce robust typing for Chain and Network types +- Add the tokenMap configuration to the wallet creator's setup. + ## 0.2.0 ### Minor Changes diff --git a/networks/bitcoin/package.json b/networks/bitcoin/package.json index 911c5a9c..47b1d5b3 100644 --- a/networks/bitcoin/package.json +++ b/networks/bitcoin/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-network/bitcoin", - "version": "0.2.0", + "version": "1.0.0", "private": true, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -15,8 +15,8 @@ "dependencies": { "@rosen-bridge/address-codec": "^0.3.0", "@rosen-bridge/bitcoin-utxo-selection": "^0.2.0", - "@rosen-ui/constants": "^0.0.3", - "@rosen-ui/wallet-api": "^1.0.2", + "@rosen-ui/constants": "^0.0.4", + "@rosen-ui/wallet-api": "^1.0.3", "axios": "^1.7.2", "bitcoinjs-lib": "^6.1.6" }, diff --git a/networks/cardano/CHANGELOG.md b/networks/cardano/CHANGELOG.md index 191bdb8a..8816496c 100644 --- a/networks/cardano/CHANGELOG.md +++ b/networks/cardano/CHANGELOG.md @@ -1,5 +1,18 @@ # @rosen-network/cardano +## 1.0.0 + +### Major Changes + +- Update the input parameter of the `generateUnsignedTx` function from an `UNWRAPPED-VALUE` to a `WRAPPED-VALUE`. + +### Patch Changes + +- Enhance the generateUnsignedTx utility functions within the networks package +- Revise the wallet creation logic and update the access type for each API. +- Strengthen type safety and enforce robust typing for Chain and Network types +- Add the tokenMap configuration to the wallet creator's setup. + ## 0.1.1 ### Patch Changes diff --git a/networks/cardano/package.json b/networks/cardano/package.json index f67c08cd..01014f0d 100644 --- a/networks/cardano/package.json +++ b/networks/cardano/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-network/cardano", - "version": "0.1.1", + "version": "1.0.0", "private": true, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -15,7 +15,7 @@ "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", "@rosen-bridge/cardano-utxo-selection": "^1.1.0", "@rosen-clients/cardano-koios": "^2.0.3", - "@rosen-ui/wallet-api": "^1.0.0" + "@rosen-ui/wallet-api": "^1.0.3" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.30.7", diff --git a/networks/ergo/CHANGELOG.md b/networks/ergo/CHANGELOG.md index 30a37b0b..735bdc40 100644 --- a/networks/ergo/CHANGELOG.md +++ b/networks/ergo/CHANGELOG.md @@ -1,5 +1,18 @@ # @rosen-network/ergo +## 1.0.0 + +### Major Changes + +- Update the input parameter of the `generateUnsignedTx` function from an `UNWRAPPED-VALUE` to a `WRAPPED-VALUE`. + +### Patch Changes + +- Enhance the generateUnsignedTx utility functions within the networks package +- Revise the wallet creation logic and update the access type for each API. +- Strengthen type safety and enforce robust typing for Chain and Network types +- Add the tokenMap configuration to the wallet creator's setup. + ## 0.1.2 ### Patch Changes diff --git a/networks/ergo/package.json b/networks/ergo/package.json index 5d7c0d5a..c8f8713d 100644 --- a/networks/ergo/package.json +++ b/networks/ergo/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-network/ergo", - "version": "0.1.2", + "version": "1.0.0", "private": true, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -13,7 +13,7 @@ }, "dependencies": { "@rosen-clients/ergo-explorer": "^1.1.1", - "@rosen-ui/wallet-api": "^1.0.2", + "@rosen-ui/wallet-api": "^1.0.3", "ergo-lib-wasm-nodejs": "^0.24.1" }, "devDependencies": { diff --git a/networks/ethereum/CHANGELOG.md b/networks/ethereum/CHANGELOG.md index 0fe51c22..69460a34 100644 --- a/networks/ethereum/CHANGELOG.md +++ b/networks/ethereum/CHANGELOG.md @@ -1 +1,10 @@ # @rosen-network/ethereum + +## 0.1.1 + +### Patch Changes + +- Enhance the generateUnsignedTx utility functions within the networks package +- Initialize the Ethereum network package. +- Strengthen type safety and enforce robust typing for Chain and Network types +- Address the issue related to retrieving the token balance in Ethereum diff --git a/networks/ethereum/package.json b/networks/ethereum/package.json index dfab87b1..36a9cc37 100644 --- a/networks/ethereum/package.json +++ b/networks/ethereum/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-network/ethereum", - "version": "0.1.0", + "version": "0.1.1", "private": true, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -14,7 +14,7 @@ "dependencies": { "@rosen-bridge/address-codec": "^0.3.0", "@rosen-bridge/tokens": "^1.2.1", - "@rosen-ui/wallet-api": "^1.0.0", + "@rosen-ui/wallet-api": "^1.0.3", "ethers": "^6.13.2" }, "devDependencies": { diff --git a/package-lock.json b/package-lock.json index a324f358..8c176d1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,16 +25,16 @@ }, "apps/guard": { "name": "@rosen-bridge/guard-app", - "version": "1.4.1", + "version": "1.5.0", "dependencies": { "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", - "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/icons": "^0.5.0", "@rosen-bridge/shared-contexts": "^0.0.1", - "@rosen-bridge/ui-kit": "^1.2.0", - "@rosen-ui/constants": "^0.0.3", - "@rosen-ui/swr-helpers": "^0.1.0", - "@rosen-ui/utils": "^0.4.0", + "@rosen-bridge/ui-kit": "^1.3.0", + "@rosen-ui/constants": "^0.0.4", + "@rosen-ui/swr-helpers": "^0.2.0", + "@rosen-ui/utils": "^0.4.1", "moment": "^2.29.4", "next": "14.1.0", "react": "^18.2.0", @@ -47,7 +47,7 @@ "devDependencies": { "@rosen-ui/common-hooks": "^0.1.0", "@rosen-ui/swr-mock": "^0.0.1", - "@rosen-ui/types": "^0.2.0", + "@rosen-ui/types": "^0.3.0", "@tauri-apps/cli": "^1.4.0", "@types/moment": "^2.13.0", "@types/node": "20.2.5", @@ -78,7 +78,7 @@ }, "apps/rosen": { "name": "@rosen-bridge/rosen-app", - "version": "1.1.1", + "version": "2.0.0", "dependencies": { "@emurgo/cardano-serialization-lib-browser": "^11.5.0", "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", @@ -96,20 +96,20 @@ "@rosen-bridge/watcher-data-extractor": "^8.0.2", "@rosen-clients/cardano-koios": "^2.0.1", "@rosen-clients/ergo-explorer": "^1.0.2", - "@rosen-network/bitcoin": "^0.2.0", - "@rosen-network/cardano": "^0.1.1", - "@rosen-network/ergo": "^0.1.2", - "@rosen-ui/asset-calculator": "^1.0.1", + "@rosen-network/bitcoin": "^1.0.0", + "@rosen-network/cardano": "^1.0.0", + "@rosen-network/ergo": "^1.0.0", + "@rosen-ui/asset-calculator": "^2.0.0", "@rosen-ui/common-hooks": "^0.1.0", - "@rosen-ui/eternl-wallet": "^0.1.3", - "@rosen-ui/flint-wallet": "^0.1.3", - "@rosen-ui/lace-wallet": "^0.1.3", - "@rosen-ui/nami-wallet": "^0.1.3", - "@rosen-ui/nautilus-wallet": "^0.2.0", - "@rosen-ui/utils": "^0.4.0", - "@rosen-ui/vespr-wallet": "^0.0.7", - "@rosen-ui/wallet-api": "^1.0.2", - "@rosen-ui/xdefi-wallet": "^0.4.0", + "@rosen-ui/eternl-wallet": "^1.0.0", + "@rosen-ui/flint-wallet": "^1.0.0", + "@rosen-ui/lace-wallet": "^1.0.0", + "@rosen-ui/nami-wallet": "^1.0.0", + "@rosen-ui/nautilus-wallet": "^1.0.0", + "@rosen-ui/utils": "^0.4.1", + "@rosen-ui/vespr-wallet": "^0.0.8", + "@rosen-ui/wallet-api": "^1.0.3", + "@rosen-ui/xdefi-wallet": "^1.0.0", "@upstash/ratelimit": "^1.2.1", "@vercel/kv": "^2.0.0", "buffer": "^6.0.3", @@ -139,7 +139,7 @@ }, "apps/rosen-service": { "name": "@rosen-bridge/rosen-service", - "version": "1.1.0", + "version": "2.0.0", "license": "GPL-3.0", "dependencies": { "@rosen-bridge/bitcoin-esplora-scanner": "^0.1.14", @@ -151,7 +151,7 @@ "@rosen-bridge/scanner": "^4.1.3", "@rosen-bridge/watcher-data-extractor": "^8.0.2", "@rosen-bridge/winston-logger": "^0.2.1", - "@rosen-ui/asset-calculator": "^1.0.1", + "@rosen-ui/asset-calculator": "^2.0.0", "config": "^3.3.7" }, "devDependencies": { @@ -229,19 +229,19 @@ }, "apps/watcher": { "name": "@rosen-bridge/watcher-app", - "version": "2.3.0", + "version": "2.4.0", "dependencies": { "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", - "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/icons": "^0.5.0", "@rosen-bridge/json-bigint": "^0.1.0", "@rosen-bridge/shared-contexts": "^0.0.1", - "@rosen-bridge/ui-kit": "^1.2.0", + "@rosen-bridge/ui-kit": "^1.3.0", "@rosen-ui/common-hooks": "^0.1.0", - "@rosen-ui/constants": "^0.0.3", - "@rosen-ui/swr-helpers": "^0.1.0", + "@rosen-ui/constants": "^0.0.4", + "@rosen-ui/swr-helpers": "^0.2.0", "@rosen-ui/swr-mock": "^0.0.1", - "@rosen-ui/utils": "^0.4.0", + "@rosen-ui/utils": "^0.4.1", "lodash-es": "^4.17.21", "moment": "^2.29.4", "next": "14.1.0", @@ -253,7 +253,7 @@ "swr": "^2.1.5" }, "devDependencies": { - "@rosen-ui/types": "^0.2.0", + "@rosen-ui/types": "^0.3.0", "@tauri-apps/cli": "^1.4.0", "@types/lodash-es": "^4.17.11", "@types/moment": "^2.13.0", @@ -284,12 +284,12 @@ }, "networks/bitcoin": { "name": "@rosen-network/bitcoin", - "version": "0.2.0", + "version": "1.0.0", "dependencies": { "@rosen-bridge/address-codec": "^0.3.0", "@rosen-bridge/bitcoin-utxo-selection": "^0.2.0", - "@rosen-ui/constants": "^0.0.3", - "@rosen-ui/wallet-api": "^1.0.2", + "@rosen-ui/constants": "^0.0.4", + "@rosen-ui/wallet-api": "^1.0.3", "axios": "^1.7.2", "bitcoinjs-lib": "^6.1.6" }, @@ -319,12 +319,12 @@ }, "networks/cardano": { "name": "@rosen-network/cardano", - "version": "0.1.1", + "version": "1.0.0", "dependencies": { "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", "@rosen-bridge/cardano-utxo-selection": "^1.1.0", "@rosen-clients/cardano-koios": "^2.0.3", - "@rosen-ui/wallet-api": "^1.0.0" + "@rosen-ui/wallet-api": "^1.0.3" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.30.7", @@ -352,10 +352,10 @@ }, "networks/ergo": { "name": "@rosen-network/ergo", - "version": "0.1.2", + "version": "1.0.0", "dependencies": { "@rosen-clients/ergo-explorer": "^1.1.1", - "@rosen-ui/wallet-api": "^1.0.2", + "@rosen-ui/wallet-api": "^1.0.3", "ergo-lib-wasm-nodejs": "^0.24.1" }, "devDependencies": { @@ -384,11 +384,11 @@ }, "networks/ethereum": { "name": "@rosen-network/ethereum", - "version": "0.1.0", + "version": "0.1.1", "dependencies": { "@rosen-bridge/address-codec": "^0.3.0", "@rosen-bridge/tokens": "^1.2.1", - "@rosen-ui/wallet-api": "^1.0.0", + "@rosen-ui/wallet-api": "^1.0.3", "ethers": "^6.13.2" }, "devDependencies": { @@ -24614,7 +24614,7 @@ }, "packages/asset-calculator": { "name": "@rosen-ui/asset-calculator", - "version": "1.0.1", + "version": "2.0.0", "license": "GPL-3.0", "dependencies": { "@rosen-bridge/abstract-logger": "^1.0.0", @@ -24623,7 +24623,7 @@ "@rosen-bridge/tokens": "^1.2.1", "@rosen-clients/cardano-koios": "^2.0.3", "@rosen-clients/ergo-explorer": "^1.1.2", - "@rosen-ui/types": "^0.2.0", + "@rosen-ui/types": "^0.3.0", "axios": "^1.7.0", "ethers": "^6.13.2", "lodash-es": "^4.17.21", @@ -25075,7 +25075,7 @@ }, "packages/constants": { "name": "@rosen-ui/constants", - "version": "0.0.3", + "version": "0.0.4", "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.26.0", @@ -25101,7 +25101,7 @@ }, "packages/icons": { "name": "@rosen-bridge/icons", - "version": "0.4.0", + "version": "0.5.0", "license": "GPL-3.0", "devDependencies": { "@types/react": "18.2.12", @@ -25172,7 +25172,7 @@ }, "packages/swr-helpers": { "name": "@rosen-ui/swr-helpers", - "version": "0.1.0", + "version": "0.2.0", "dependencies": { "axios": "^1.4.0", "json-bigint": "^1.0.0" @@ -25232,9 +25232,9 @@ }, "packages/types": { "name": "@rosen-ui/types", - "version": "0.2.0", + "version": "0.3.0", "dependencies": { - "@rosen-ui/constants": "^0.0.3" + "@rosen-ui/constants": "^0.0.4" }, "devDependencies": { "@mui/material": "^5.13.7", @@ -25262,21 +25262,21 @@ }, "packages/ui-kit": { "name": "@rosen-bridge/ui-kit", - "version": "1.2.0", + "version": "1.3.0", "license": "GPL-3.0", "dependencies": { "@mui/lab": "^5.0.0-alpha.134", "@mui/material": "^5.13.4", - "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/icons": "^0.5.0", "@rosen-ui/common-hooks": "^0.1.0", - "@rosen-ui/constants": "^0.0.3", - "@rosen-ui/swr-helpers": "^0.1.0", - "@rosen-ui/utils": "^0.4.0", + "@rosen-ui/constants": "^0.0.4", + "@rosen-ui/swr-helpers": "^0.2.0", + "@rosen-ui/utils": "^0.4.1", "moment": "^2.29.4", "qrcode.react": "^3.1.0" }, "devDependencies": { - "@rosen-ui/types": "^0.2.0", + "@rosen-ui/types": "^0.3.0", "@types/react": "18.2.12", "@types/react-dom": "18.2.4", "@typescript-eslint/eslint-plugin": "^5.59.0", @@ -25311,7 +25311,7 @@ }, "packages/utils": { "name": "@rosen-ui/utils", - "version": "0.4.0", + "version": "0.4.1", "dependencies": { "@rosen-bridge/json-bigint": "^0.1.0", "buffer": "^6.0.3", @@ -25344,13 +25344,13 @@ }, "wallets/eternl-wallet": { "name": "@rosen-ui/eternl-wallet", - "version": "0.1.3", + "version": "1.0.0", "dependencies": { - "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/icons": "^0.5.0", "@rosen-bridge/tokens": "^1.2.1", - "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.4.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-network/cardano": "^1.0.0", + "@rosen-ui/utils": "^0.4.1", + "@rosen-ui/wallet-api": "^1.0.3" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.30.7", @@ -25377,13 +25377,13 @@ }, "wallets/flint-wallet": { "name": "@rosen-ui/flint-wallet", - "version": "0.1.3", + "version": "1.0.0", "dependencies": { - "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/icons": "^0.5.0", "@rosen-bridge/tokens": "^1.2.1", - "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.4.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-network/cardano": "^1.0.0", + "@rosen-ui/utils": "^0.4.1", + "@rosen-ui/wallet-api": "^1.0.3" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.30.7", @@ -25410,13 +25410,13 @@ }, "wallets/lace-wallet": { "name": "@rosen-ui/lace-wallet", - "version": "0.1.3", + "version": "1.0.0", "dependencies": { - "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/icons": "^0.5.0", "@rosen-bridge/tokens": "^1.2.1", - "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.4.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-network/cardano": "^1.0.0", + "@rosen-ui/utils": "^0.4.1", + "@rosen-ui/wallet-api": "^1.0.3" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.30.7", @@ -25443,14 +25443,14 @@ }, "wallets/metamask-wallet": { "name": "@rosen-ui/metamask-wallet", - "version": "0.1.0", + "version": "0.1.1", "dependencies": { "@metamask/sdk": "^0.28.2", - "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/icons": "^0.5.0", "@rosen-bridge/tokens": "^1.2.1", - "@rosen-network/ethereum": "^0.1.0", - "@rosen-ui/utils": "^0.4.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-network/ethereum": "^0.1.1", + "@rosen-ui/utils": "^0.4.1", + "@rosen-ui/wallet-api": "^1.0.3" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.30.7", @@ -25478,13 +25478,13 @@ }, "wallets/nami-wallet": { "name": "@rosen-ui/nami-wallet", - "version": "0.1.3", + "version": "1.0.0", "dependencies": { - "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/icons": "^0.5.0", "@rosen-bridge/tokens": "^1.2.1", - "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.4.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-network/cardano": "^1.0.0", + "@rosen-ui/utils": "^0.4.1", + "@rosen-ui/wallet-api": "^1.0.3" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.30.7", @@ -25511,15 +25511,15 @@ }, "wallets/nautilus-wallet": { "name": "@rosen-ui/nautilus-wallet", - "version": "0.2.0", + "version": "1.0.0", "dependencies": { - "@rosen-bridge/icons": "^0.4.0", - "@rosen-network/ergo": "^0.1.2", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-bridge/icons": "^0.5.0", + "@rosen-network/ergo": "^1.0.0", + "@rosen-ui/wallet-api": "^1.0.3" }, "devDependencies": { "@rosen-bridge/tokens": "^1.2.1", - "@rosen-ui/utils": "^0.4.0", + "@rosen-ui/utils": "^0.4.1", "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.26.0", "eslint": "^8.16.0", @@ -25547,11 +25547,11 @@ }, "wallets/vespr-wallet": { "name": "@rosen-ui/vespr-wallet", - "version": "0.0.7", + "version": "0.0.8", "dependencies": { - "@rosen-bridge/icons": "^0.4.0", - "@rosen-ui/utils": "^0.4.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-bridge/icons": "^0.5.0", + "@rosen-ui/utils": "^0.4.1", + "@rosen-ui/wallet-api": "^1.0.3" }, "devDependencies": { "@rosen-bridge/tokens": "^1.2.1", @@ -25579,10 +25579,10 @@ }, "wallets/wallet-api": { "name": "@rosen-ui/wallet-api", - "version": "1.0.2", + "version": "1.0.3", "dependencies": { - "@rosen-ui/types": "^0.2.0", - "@rosen-ui/utils": "^0.4.0" + "@rosen-ui/types": "^0.3.0", + "@rosen-ui/utils": "^0.4.1" }, "devDependencies": { "@rosen-bridge/tokens": "^1.2.1", @@ -25613,15 +25613,15 @@ }, "wallets/xdefi-wallet": { "name": "@rosen-ui/xdefi-wallet", - "version": "0.4.0", + "version": "1.0.0", "dependencies": { "@rosen-bridge/bitcoin-utxo-selection": "^0.2.0", - "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/icons": "^0.5.0", "@rosen-bridge/tokens": "^1.2.1", - "@rosen-network/bitcoin": "^0.2.0", - "@rosen-ui/constants": "^0.0.3", - "@rosen-ui/utils": "^0.4.0", - "@rosen-ui/wallet-api": "^1.0.2", + "@rosen-network/bitcoin": "^1.0.0", + "@rosen-ui/constants": "^0.0.4", + "@rosen-ui/utils": "^0.4.1", + "@rosen-ui/wallet-api": "^1.0.3", "sats-connect": "^1.4.1" }, "devDependencies": { diff --git a/packages/asset-calculator/CHANGELOG.md b/packages/asset-calculator/CHANGELOG.md index 7d6f02ac..d7413580 100644 --- a/packages/asset-calculator/CHANGELOG.md +++ b/packages/asset-calculator/CHANGELOG.md @@ -1,5 +1,20 @@ # @rosen-ui/asset-calculator +## 2.0.0 + +### Major Changes + +- To implement decimal drop context, convert unwrapped values into wrapped values. + +### Minor Changes + +- Add evm asset calculator and ethereum calculator interface +- Save bridged token ids inside bridged assets table + +### Patch Changes + +- Strengthen type safety and enforce robust typing for Chain and Network types + ## 1.0.1 ### Patch Changes diff --git a/packages/asset-calculator/package.json b/packages/asset-calculator/package.json index 71885c4d..55cec4af 100644 --- a/packages/asset-calculator/package.json +++ b/packages/asset-calculator/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-ui/asset-calculator", - "version": "1.0.1", + "version": "2.0.0", "description": "Rosen bridge locked asset calculator", "license": "GPL-3.0", "author": "Rosen Team", @@ -37,7 +37,7 @@ "@rosen-bridge/tokens": "^1.2.1", "@rosen-clients/cardano-koios": "^2.0.3", "@rosen-clients/ergo-explorer": "^1.1.2", - "@rosen-ui/types": "^0.2.0", + "@rosen-ui/types": "^0.3.0", "axios": "^1.7.0", "ethers": "^6.13.2", "lodash-es": "^4.17.21", diff --git a/packages/constants/CHANGELOG.md b/packages/constants/CHANGELOG.md index 8ea46b94..34d9987e 100644 --- a/packages/constants/CHANGELOG.md +++ b/packages/constants/CHANGELOG.md @@ -1,5 +1,11 @@ # @rosen-ui/constants +## 0.0.4 + +### Patch Changes + +- Strengthen type safety and enforce robust typing for Chain and Network types + ## 0.0.3 ### Patch Changes diff --git a/packages/constants/package.json b/packages/constants/package.json index c4e01948..cb477316 100644 --- a/packages/constants/package.json +++ b/packages/constants/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-ui/constants", - "version": "0.0.3", + "version": "0.0.4", "private": true, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", diff --git a/packages/icons/CHANGELOG.md b/packages/icons/CHANGELOG.md index 3e3a6ebe..be5960ac 100644 --- a/packages/icons/CHANGELOG.md +++ b/packages/icons/CHANGELOG.md @@ -1,5 +1,12 @@ # @rosen-bridge/icons +## 0.5.0 + +### Minor Changes + +- Add Ethereum and MetaMask icons +- Add the ShieldQuestion icon + ## 0.4.0 ### Minor Changes diff --git a/packages/icons/package.json b/packages/icons/package.json index 20cd721b..9548d9ac 100644 --- a/packages/icons/package.json +++ b/packages/icons/package.json @@ -2,7 +2,7 @@ "name": "@rosen-bridge/icons", "description": "An icon set wrapping Unicons", "private": "true", - "version": "0.4.0", + "version": "0.5.0", "type": "module", "types": "./dist/index.d.ts", "files": [ diff --git a/packages/swr-helpers/CHANGELOG.md b/packages/swr-helpers/CHANGELOG.md index 8ce591ce..fc8b2aab 100644 --- a/packages/swr-helpers/CHANGELOG.md +++ b/packages/swr-helpers/CHANGELOG.md @@ -1,5 +1,11 @@ # @rosen-ui/swr-helpers +## 0.2.0 + +### Minor Changes + +- Implement support for the PUT method in the fetcher utilities + ## 0.1.0 ### Minor Changes diff --git a/packages/swr-helpers/package.json b/packages/swr-helpers/package.json index 32b58311..c5a470d3 100644 --- a/packages/swr-helpers/package.json +++ b/packages/swr-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-ui/swr-helpers", - "version": "0.1.0", + "version": "0.2.0", "private": true, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index dd9f2d1c..515950b9 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,15 @@ # @rosen-ui/types +## 0.3.0 + +### Minor Changes + +- Revise the HealthParamInfo model to align with the latest API updates + +### Patch Changes + +- Strengthen type safety and enforce robust typing for Chain and Network types + ## 0.2.0 ### Minor Changes diff --git a/packages/types/package.json b/packages/types/package.json index 07f44f4a..26edf2c5 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-ui/types", - "version": "0.2.0", + "version": "0.3.0", "private": true, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -21,6 +21,6 @@ "typescript": "^5.0.0" }, "dependencies": { - "@rosen-ui/constants": "^0.0.3" + "@rosen-ui/constants": "^0.0.4" } } diff --git a/packages/ui-kit/CHANGELOG.md b/packages/ui-kit/CHANGELOG.md index 89841159..46fa790c 100644 --- a/packages/ui-kit/CHANGELOG.md +++ b/packages/ui-kit/CHANGELOG.md @@ -1,4 +1,16 @@ -# @rosen-bridge/rosen-app +# @rosen-bridge/ui-kit + +## 1.3.0 + +### Minor Changes + +- Improve the sidebar component to accept child elements as specific props, enhancing maintainability and enabling future implementation of responsive design +- Enhance the HealthParamCard component to accommodate emerging requirements +- Enhance the design system by adding the ToolbarThemeTogglerAction component, introducing a useThemeToggler hook, and updating the ThemeProvider to support overarching logic + +### Patch Changes + +- Revise the font-size of the hot and cold amounts in the TokenListItem component. ## 1.2.0 diff --git a/packages/ui-kit/package.json b/packages/ui-kit/package.json index 6209a31d..0043fbe6 100644 --- a/packages/ui-kit/package.json +++ b/packages/ui-kit/package.json @@ -2,7 +2,7 @@ "name": "@rosen-bridge/ui-kit", "description": "ui kit for Rosen projects", "private": true, - "version": "1.2.0", + "version": "1.3.0", "type": "module", "files": [ "dist" @@ -32,7 +32,7 @@ "swr": "^2.1.5" }, "devDependencies": { - "@rosen-ui/types": "^0.2.0", + "@rosen-ui/types": "^0.3.0", "@types/react": "18.2.12", "@types/react-dom": "18.2.4", "@typescript-eslint/eslint-plugin": "^5.59.0", @@ -46,11 +46,11 @@ "dependencies": { "@mui/lab": "^5.0.0-alpha.134", "@mui/material": "^5.13.4", - "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/icons": "^0.5.0", "@rosen-ui/common-hooks": "^0.1.0", - "@rosen-ui/constants": "^0.0.3", - "@rosen-ui/swr-helpers": "^0.1.0", - "@rosen-ui/utils": "^0.4.0", + "@rosen-ui/constants": "^0.0.4", + "@rosen-ui/swr-helpers": "^0.2.0", + "@rosen-ui/utils": "^0.4.1", "moment": "^2.29.4", "qrcode.react": "^3.1.0" } diff --git a/packages/utils/CHANGELOG.md b/packages/utils/CHANGELOG.md index 774cb4db..51be78a7 100644 --- a/packages/utils/CHANGELOG.md +++ b/packages/utils/CHANGELOG.md @@ -1,5 +1,11 @@ # @rosen-ui/utils +## 0.4.1 + +### Patch Changes + +- Strengthen type safety and enforce robust typing for Chain and Network types + ## 0.4.0 ### Minor Changes diff --git a/packages/utils/package.json b/packages/utils/package.json index 115d58c1..b7208ba9 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-ui/utils", - "version": "0.4.0", + "version": "0.4.1", "main": "dist/src/index.js", "types": "dist/src/index.d.ts", "type": "module", diff --git a/wallets/eternl-wallet/CHANGELOG.md b/wallets/eternl-wallet/CHANGELOG.md index dbb97919..232c9cc7 100644 --- a/wallets/eternl-wallet/CHANGELOG.md +++ b/wallets/eternl-wallet/CHANGELOG.md @@ -1,4 +1,17 @@ -# @rosen-bridge/rosen-app +# @rosen-ui/eternl-wallet + +## 1.0.0 + +### Major Changes + +- Modify the `transferCreator` function parameter to accept `WRAPPED-VALUE`. +- Change the output type of the `getBalance` function from an `UNWRAPPED-VALUE` to a `WRAPPED-VALUE`. + +### Patch Changes + +- Revise the wallet creation logic and update the access type for each API. +- Strengthen type safety and enforce robust typing for Chain and Network types +- Resolve the issue by replacing the incorrect token retrieval method using policyId with a more accurate approach that retrieves the token by both nameHex and policyId. ## 0.1.3 diff --git a/wallets/eternl-wallet/package.json b/wallets/eternl-wallet/package.json index 688468bf..eda3b748 100644 --- a/wallets/eternl-wallet/package.json +++ b/wallets/eternl-wallet/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-ui/eternl-wallet", - "version": "0.1.3", + "version": "1.0.0", "private": true, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -20,10 +20,10 @@ "typescript": "^5.0.0" }, "dependencies": { - "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/icons": "^0.5.0", "@rosen-bridge/tokens": "^1.2.1", - "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.4.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-network/cardano": "^1.0.0", + "@rosen-ui/utils": "^0.4.1", + "@rosen-ui/wallet-api": "^1.0.3" } } diff --git a/wallets/flint-wallet/CHANGELOG.md b/wallets/flint-wallet/CHANGELOG.md index ca682a7d..f47447d9 100644 --- a/wallets/flint-wallet/CHANGELOG.md +++ b/wallets/flint-wallet/CHANGELOG.md @@ -1,4 +1,17 @@ -# @rosen-bridge/rosen-app +# @rosen-ui/flint-wallet + +## 1.0.0 + +### Major Changes + +- Modify the `transferCreator` function parameter to accept `WRAPPED-VALUE`. +- Change the output type of the `getBalance` function from an `UNWRAPPED-VALUE` to a `WRAPPED-VALUE`. + +### Patch Changes + +- Revise the wallet creation logic and update the access type for each API. +- Strengthen type safety and enforce robust typing for Chain and Network types +- Resolve the issue by replacing the incorrect token retrieval method using policyId with a more accurate approach that retrieves the token by both nameHex and policyId. ## 0.1.3 diff --git a/wallets/flint-wallet/package.json b/wallets/flint-wallet/package.json index cd4deb5e..fed0eb64 100644 --- a/wallets/flint-wallet/package.json +++ b/wallets/flint-wallet/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-ui/flint-wallet", - "version": "0.1.3", + "version": "1.0.0", "private": true, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -20,10 +20,10 @@ "typescript": "^5.0.0" }, "dependencies": { - "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/icons": "^0.5.0", "@rosen-bridge/tokens": "^1.2.1", - "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.4.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-network/cardano": "^1.0.0", + "@rosen-ui/utils": "^0.4.1", + "@rosen-ui/wallet-api": "^1.0.3" } } diff --git a/wallets/lace-wallet/CHANGELOG.md b/wallets/lace-wallet/CHANGELOG.md index 7a0df183..dd497f00 100644 --- a/wallets/lace-wallet/CHANGELOG.md +++ b/wallets/lace-wallet/CHANGELOG.md @@ -1,4 +1,17 @@ -# @rosen-bridge/rosen-app +# @rosen-ui/lace-wallet + +## 1.0.0 + +### Major Changes + +- Modify the `transferCreator` function parameter to accept `WRAPPED-VALUE`. +- Change the output type of the `getBalance` function from an `UNWRAPPED-VALUE` to a `WRAPPED-VALUE`. + +### Patch Changes + +- Revise the wallet creation logic and update the access type for each API. +- Strengthen type safety and enforce robust typing for Chain and Network types +- Resolve the issue by replacing the incorrect token retrieval method using policyId with a more accurate approach that retrieves the token by both nameHex and policyId. ## 0.1.3 diff --git a/wallets/lace-wallet/package.json b/wallets/lace-wallet/package.json index 03eaee58..3f286acf 100644 --- a/wallets/lace-wallet/package.json +++ b/wallets/lace-wallet/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-ui/lace-wallet", - "version": "0.1.3", + "version": "1.0.0", "private": true, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -20,10 +20,10 @@ "typescript": "^5.0.0" }, "dependencies": { - "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/icons": "^0.5.0", "@rosen-bridge/tokens": "^1.2.1", - "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.4.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-network/cardano": "^1.0.0", + "@rosen-ui/utils": "^0.4.1", + "@rosen-ui/wallet-api": "^1.0.3" } } diff --git a/wallets/metamask-wallet/CHANGELOG.md b/wallets/metamask-wallet/CHANGELOG.md index e69de29b..67b43deb 100644 --- a/wallets/metamask-wallet/CHANGELOG.md +++ b/wallets/metamask-wallet/CHANGELOG.md @@ -0,0 +1,9 @@ +# @rosen-ui/metamask-wallet + +## 0.1.1 + +### Patch Changes + +- Implement the MetaMask wallet package. +- Strengthen type safety and enforce robust typing for Chain and Network types +- Address the issue related to retrieving the token balance in Ethereum diff --git a/wallets/metamask-wallet/package.json b/wallets/metamask-wallet/package.json index 7a0d31ee..8238c8f1 100644 --- a/wallets/metamask-wallet/package.json +++ b/wallets/metamask-wallet/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-ui/metamask-wallet", - "version": "0.1.0", + "version": "0.1.1", "private": true, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -21,10 +21,10 @@ }, "dependencies": { "@metamask/sdk": "^0.28.2", - "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/icons": "^0.5.0", "@rosen-bridge/tokens": "^1.2.1", - "@rosen-network/ethereum": "^0.1.0", - "@rosen-ui/utils": "^0.4.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-network/ethereum": "^0.1.1", + "@rosen-ui/utils": "^0.4.1", + "@rosen-ui/wallet-api": "^1.0.3" } } diff --git a/wallets/nami-wallet/CHANGELOG.md b/wallets/nami-wallet/CHANGELOG.md index 87e0083e..aeab1af0 100644 --- a/wallets/nami-wallet/CHANGELOG.md +++ b/wallets/nami-wallet/CHANGELOG.md @@ -1,4 +1,16 @@ -# @rosen-bridge/rosen-app +# @rosen-ui/nami-wallet + +## 1.0.0 + +### Major Changes + +- Modify the `transferCreator` function parameter to accept `WRAPPED-VALUE`. +- Change the output type of the `getBalance` function from an `UNWRAPPED-VALUE` to a `WRAPPED-VALUE`. + +### Patch Changes + +- Revise the wallet creation logic and update the access type for each API. +- Strengthen type safety and enforce robust typing for Chain and Network types ## 0.1.3 diff --git a/wallets/nami-wallet/package.json b/wallets/nami-wallet/package.json index e5e3b446..562c447e 100644 --- a/wallets/nami-wallet/package.json +++ b/wallets/nami-wallet/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-ui/nami-wallet", - "version": "0.1.3", + "version": "1.0.0", "private": true, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -20,10 +20,10 @@ "typescript": "^5.0.0" }, "dependencies": { - "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/icons": "^0.5.0", "@rosen-bridge/tokens": "^1.2.1", - "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.4.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-network/cardano": "^1.0.0", + "@rosen-ui/utils": "^0.4.1", + "@rosen-ui/wallet-api": "^1.0.3" } } diff --git a/wallets/nautilus-wallet/CHANGELOG.md b/wallets/nautilus-wallet/CHANGELOG.md index a159d87a..994829f4 100644 --- a/wallets/nautilus-wallet/CHANGELOG.md +++ b/wallets/nautilus-wallet/CHANGELOG.md @@ -1,4 +1,15 @@ -# @rosen-bridge/rosen-app +# @rosen-ui/nautilus-wallet + +## 1.0.0 + +### Major Changes + +- Change the output type of the `getBalance` function from an `UNWRAPPED-VALUE` to a `WRAPPED-VALUE`. + +### Patch Changes + +- Revise the wallet creation logic and update the access type for each API. +- Strengthen type safety and enforce robust typing for Chain and Network types ## 0.2.0 diff --git a/wallets/nautilus-wallet/package.json b/wallets/nautilus-wallet/package.json index 02c09c4f..0ae6f7d3 100644 --- a/wallets/nautilus-wallet/package.json +++ b/wallets/nautilus-wallet/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-ui/nautilus-wallet", - "version": "0.2.0", + "version": "1.0.0", "private": true, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -13,7 +13,7 @@ }, "devDependencies": { "@rosen-bridge/tokens": "^1.2.1", - "@rosen-ui/utils": "^0.4.0", + "@rosen-ui/utils": "^0.4.1", "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.26.0", "eslint": "^8.16.0", @@ -22,9 +22,9 @@ "typescript": "^5.0.0" }, "dependencies": { - "@rosen-bridge/icons": "^0.4.0", - "@rosen-network/ergo": "^0.1.2", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-bridge/icons": "^0.5.0", + "@rosen-network/ergo": "^1.0.0", + "@rosen-ui/wallet-api": "^1.0.3" }, "peerDependencies": { "react": "18.2.0" diff --git a/wallets/vespr-wallet/CHANGELOG.md b/wallets/vespr-wallet/CHANGELOG.md index 16e0f41d..238d74e6 100644 --- a/wallets/vespr-wallet/CHANGELOG.md +++ b/wallets/vespr-wallet/CHANGELOG.md @@ -1,4 +1,10 @@ -# @rosen-bridge/rosen-app +# @rosen-ui/vespr-wallet + +## 0.0.8 + +### Patch Changes + +- Revise the wallet creation logic and update the access type for each API. ## 0.0.7 diff --git a/wallets/vespr-wallet/package.json b/wallets/vespr-wallet/package.json index 0573a8c2..4d9edf45 100644 --- a/wallets/vespr-wallet/package.json +++ b/wallets/vespr-wallet/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-ui/vespr-wallet", - "version": "0.0.7", + "version": "0.0.8", "private": true, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -21,8 +21,8 @@ "typescript": "^5.0.0" }, "dependencies": { - "@rosen-bridge/icons": "^0.4.0", - "@rosen-ui/utils": "^0.4.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-bridge/icons": "^0.5.0", + "@rosen-ui/utils": "^0.4.1", + "@rosen-ui/wallet-api": "^1.0.3" } } diff --git a/wallets/wallet-api/CHANGELOG.md b/wallets/wallet-api/CHANGELOG.md index 8dc38589..d5578404 100644 --- a/wallets/wallet-api/CHANGELOG.md +++ b/wallets/wallet-api/CHANGELOG.md @@ -1,4 +1,11 @@ -# @rosen-bridge/rosen-app +# @rosen-ui/wallet-api + +## 1.0.3 + +### Patch Changes + +- Revise the wallet creation logic and update the access type for each API. +- Strengthen type safety and enforce robust typing for Chain and Network types ## 1.0.2 diff --git a/wallets/wallet-api/package.json b/wallets/wallet-api/package.json index 622162ec..c7eddb52 100644 --- a/wallets/wallet-api/package.json +++ b/wallets/wallet-api/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-ui/wallet-api", - "version": "1.0.2", + "version": "1.0.3", "main": "dist/src/index.js", "types": "dist/src/index.d.ts", "type": "module", @@ -21,8 +21,8 @@ "typescript": "^5.0.0" }, "dependencies": { - "@rosen-ui/types": "^0.2.0", - "@rosen-ui/utils": "^0.4.0" + "@rosen-ui/types": "^0.3.0", + "@rosen-ui/utils": "^0.4.1" }, "peerDependencies": { "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0" diff --git a/wallets/xdefi-wallet/CHANGELOG.md b/wallets/xdefi-wallet/CHANGELOG.md index bd0a2da0..fa6833dd 100644 --- a/wallets/xdefi-wallet/CHANGELOG.md +++ b/wallets/xdefi-wallet/CHANGELOG.md @@ -1,5 +1,18 @@ # @rosen-ui/xdefi-wallet +## 1.0.0 + +### Major Changes + +- Modify the `transferCreator` function parameter to accept `WRAPPED-VALUE`. +- Change the output type of the `getBalance` function from an `UNWRAPPED-VALUE` to a `WRAPPED-VALUE`. + +### Patch Changes + +- Revise the wallet creation logic and update the access type for each API. +- remove redundant package dependency +- Strengthen type safety and enforce robust typing for Chain and Network types + ## 0.4.0 ### Minor Changes diff --git a/wallets/xdefi-wallet/package.json b/wallets/xdefi-wallet/package.json index c2db3d38..b671cb31 100644 --- a/wallets/xdefi-wallet/package.json +++ b/wallets/xdefi-wallet/package.json @@ -1,6 +1,6 @@ { "name": "@rosen-ui/xdefi-wallet", - "version": "0.4.0", + "version": "1.0.0", "private": true, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -21,12 +21,12 @@ }, "dependencies": { "@rosen-bridge/bitcoin-utxo-selection": "^0.2.0", - "@rosen-bridge/icons": "^0.4.0", + "@rosen-bridge/icons": "^0.5.0", "@rosen-bridge/tokens": "^1.2.1", - "@rosen-network/bitcoin": "^0.2.0", - "@rosen-ui/constants": "^0.0.3", - "@rosen-ui/utils": "^0.4.0", - "@rosen-ui/wallet-api": "^1.0.2", + "@rosen-network/bitcoin": "^1.0.0", + "@rosen-ui/constants": "^0.0.4", + "@rosen-ui/utils": "^0.4.1", + "@rosen-ui/wallet-api": "^1.0.3", "sats-connect": "^1.4.1" } } From 3d54ae3b198d5566be6b40d859883f967cf1e3c2 Mon Sep 17 00:00:00 2001 From: Masood Abdolian Date: Tue, 15 Oct 2024 13:26:55 +0000 Subject: [PATCH 168/168] fix: Address the issue of displaying decimal values in the bridged assets amount page --- .changeset/unlucky-hairs-decide.md | 2 ++ apps/rosen/app/assets/TableRow.tsx | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/unlucky-hairs-decide.md diff --git a/.changeset/unlucky-hairs-decide.md b/.changeset/unlucky-hairs-decide.md new file mode 100644 index 00000000..a845151c --- /dev/null +++ b/.changeset/unlucky-hairs-decide.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/apps/rosen/app/assets/TableRow.tsx b/apps/rosen/app/assets/TableRow.tsx index ac65836e..f74a1983 100644 --- a/apps/rosen/app/assets/TableRow.tsx +++ b/apps/rosen/app/assets/TableRow.tsx @@ -315,7 +315,7 @@ export const TabletRow: FC = (props) => {
- {getDecimalString(row.bridged || '0', row.decimal)} + {getDecimalString(row.bridged || '0', row.significantDecimals)} = (props) => { > {item.chain} - {getDecimalString(item.amount, row.decimal)} + {getDecimalString( + item.amount, + row.significantDecimals, + )}