diff --git a/.changeset/late-dolls-fetch.md b/.changeset/sharp-cups-do.md similarity index 100% rename from .changeset/late-dolls-fetch.md rename to .changeset/sharp-cups-do.md diff --git a/.changeset/silent-cups-trade.md b/.changeset/silent-cups-trade.md new file mode 100644 index 00000000..a845151c --- /dev/null +++ b/.changeset/silent-cups-trade.md @@ -0,0 +1,2 @@ +--- +--- 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/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/.changeset/wet-rats-glow.md b/.changeset/wet-rats-glow.md deleted file mode 100644 index b4e13213..00000000 --- a/.changeset/wet-rats-glow.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@rosen-bridge/watcher-app': patch -'@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/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..dde82eeb --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,65 @@ +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: 20 + 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 + + test: + name: '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 + with: + # check out full history + fetch-depth: 0 + + - name: Run changeset to check versions + uses: actions/setup-node@v3 + with: + node-version: 20 + cache: 'npm' + - run: npx @changesets/cli@2.27.7 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/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/.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/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/README.md b/apps/guard/README.md index 53d67991..b0416fa4 100644 --- a/apps/guard/README.md +++ b/apps/guard/README.md @@ -1 +1,27 @@ -# 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 + ./build.sh + cd apps/guard + ``` +4. **Launch the App** + ```bash + npm run dev + ``` 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]} + + ))} ( marginLeft: theme.spacing(2), marginRight: theme.spacing(1), }, + '& strong': { + flexGrow: 1, + }, }), ); @@ -47,7 +56,7 @@ const HealthWidget = () => { @@ -60,7 +69,20 @@ const HealthWidget = () => { Health is - {info.health} + {info.health.status} + {!!info.health.trialErrors.length && ( + + {info.health.trialErrors.join('\n')} + + } + > + + + + + )} ) )} diff --git a/apps/guard/app/(dashboard)/@tokens/page.tsx b/apps/guard/app/(dashboard)/@tokens/page.tsx index f620d9f0..912294f9 100644 --- a/apps/guard/app/(dashboard)/@tokens/page.tsx +++ b/apps/guard/app/(dashboard)/@tokens/page.tsx @@ -6,33 +6,50 @@ import { Grid, TokensCard } from '@rosen-bridge/ui-kit'; import { fetcher } from '@rosen-ui/swr-helpers'; import { ApiAddressAssetsResponse } from '@/_types/api'; +import { NETWORKS } from '@rosen-ui/constants'; const Tokens = () => { 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, + ); + + const { data: ethereumTokens, isLoading: isEthereumTokensLoading } = + useSWR( + ['/assets', { chain: NETWORKS.ETHEREUM }], fetcher, ); return ( <> - + - + + + + ); }; 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/SideBar.tsx b/apps/guard/app/SideBar.tsx index 69db2230..d097338c 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?.versions?.app ?? '?'} + + ) : ( + + + + )} + { 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/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/_mock/mockedData.ts b/apps/guard/app/_mock/mockedData.ts index 1312245e..41782aa9 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 { @@ -18,12 +19,15 @@ import { } from '@/_types/api'; const info: ApiInfoResponse = { - health: 'Unstable', + health: { + status: 'Unstable', + trialErrors: [], + }, balances: { hot: [ { address: '3WvuxxkcM5gRhfktbKTn3Wvux1xkcM5gRhTn1WfktbGoSqpW', - chain: 'Ergo', + chain: NETWORKS.ERGO, balance: { amount: 100 * 1e9, decimals: 9, @@ -35,7 +39,7 @@ const info: ApiInfoResponse = { { address: 'addr1qyrgyu3x5vqul78qa2g9q8l62xxnnfyz64qawwelltuzagdhs2e6xhe9mn0j9xzhf3f63vd0ulm58820qp7s3q0ql92swdh27a', - chain: 'Cardano', + chain: NETWORKS.CARDANO, balance: { amount: 500 * 1e6, decimals: 6, @@ -48,7 +52,7 @@ const info: ApiInfoResponse = { cold: [ { address: '3WvuxxkcM5gRhfktbKTn3Wvux1xkcM5gRhTn1WfktbGoSqpW', - chain: 'Ergo', + chain: NETWORKS.ERGO, balance: { amount: 300 * 1e9, decimals: 9, @@ -60,7 +64,7 @@ const info: ApiInfoResponse = { { address: 'addr1qyrgyu3x5vqul78qa2g9q8l62xxnnfyz64qawwelltuzagdhs2e6xhe9mn0j9xzhf3f63vd0ulm58820qp7s3q0ql92swdh27a', - chain: 'Cardano', + chain: NETWORKS.CARDANO, balance: { amount: 1500 * 1e6, decimals: 6, @@ -73,7 +77,11 @@ const info: ApiInfoResponse = { }, rsnTokenId: '85baefff2eb9e45b04f8b4e6265e866773db6db5f9e8e30ce2cae1aa263b90gg', - version: '2.5.1', + versions: { + app: '', + contract: '', + tokensMap: '', + }, }; const revenueChartWeekly: ApiRevenueChartResponse = [ @@ -210,14 +218,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, }, { @@ -225,7 +233,7 @@ const assets = [ tokenId: 'c6cce2d65182c2e4343d942000263b75d103e6d56fea08ded6dfc25548c2d34d', amount: 200, decimals: 1, - chain: 'ergo', + chain: NETWORKS.ERGO, isNativeToken: false, }, { @@ -233,7 +241,7 @@ const assets = [ tokenId: '6c1526b2a5ef010edb622719d9d7fbde8437a39543547c3effbe72ad33504cf1', amount: 20, decimals: 5, - chain: 'cardano', + chain: NETWORKS.CARDANO, isNativeToken: false, }, ]; @@ -241,18 +249,24 @@ 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', }, { status: 'Broken', @@ -260,11 +274,14 @@ 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', + description: 'Ergo Node Sync Check Description', lastCheck: '2023-06-26T11:15:45.206Z', id: 'Ergo Node Sync Check', + title: 'Ergo Node Sync Check', }, { status: 'Broken', @@ -272,6 +289,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', }, ]; @@ -281,8 +299,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', @@ -307,8 +325,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', @@ -334,8 +352,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/_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/guard/app/_types/api.ts b/apps/guard/app/_types/api.ts index a4a06408..4e249e75 100644 --- a/apps/guard/app/_types/api.ts +++ b/apps/guard/app/_types/api.ts @@ -5,26 +5,34 @@ import { Paginated, TokenInfoWithColdAmount, MutationRequestBodyWithHeaders, + Network, } from '@rosen-ui/types'; export interface TokenInfoWithAddress { address: string; - chain: string; + chain: Network; balance: TokenInfo; } export interface ApiInfoResponse { - health: 'Healthy' | 'Unstable' | 'Broken'; + health: { + status: 'Healthy' | 'Unstable' | 'Broken'; + trialErrors: string[]; + }; rsnTokenId: string; balances: { hot: TokenInfoWithAddress[]; cold: TokenInfoWithAddress[]; }; - version: string; + versions: { + app: string; + contract: string; + tokensMap: string; + }; } export interface GuardTokenInfo extends TokenInfoWithColdAmount { - chain: string; + chain: Network; } interface GuardTokenChartData extends Omit { @@ -33,7 +41,7 @@ interface GuardTokenChartData extends Omit { export type ApiRevenueChartResponse = GuardTokenChartData[]; export interface ApiSignRequestBodyData { - chain: string; + chain: Network; txJson: string; requiredSign: number; overwrite?: boolean; @@ -52,8 +60,8 @@ export type ApiHealthStatusResponse = HealthParamInfo[]; export interface EventBase { eventId: string; - fromChain: string; - toChain: string; + fromChain: Network; + toChain: Network; fromAddress: string; toAddress: string; bridgeFee: string; @@ -80,8 +88,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) => { { + 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, 1000); + } + + setChecking((checking) => checking.filter((item) => item != paramId)); + + const healthParamIndex = data!.findIndex( + (healthParam) => healthParam.id === paramId, + ); + openSnackbar(currentHealthParamInfo.title + ' 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/guard/app/history/TableRow.tsx b/apps/guard/app/history/TableRow.tsx index 9348bb0f..5f8e040b 100644 --- a/apps/guard/app/history/TableRow.tsx +++ b/apps/guard/app/history/TableRow.tsx @@ -13,6 +13,7 @@ import { AngleDown, AngleUp } from '@rosen-bridge/icons'; import { getDecimalString, getTxURL } from '@rosen-ui/utils'; import { HistoryEvent } from '@/_types/api'; +import { NETWORKS } from '@rosen-ui/constants'; interface RowProps extends HistoryEvent { isLoading?: boolean; @@ -136,7 +137,10 @@ export const MobileRow: FC = (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) => { { addresses: config.calculator.addresses.bitcoin, esploraUrl: config.bitcoin.esploraUrl, }, + { + addresses: config.calculator.addresses.ethereum, + rpcUrl: config.ethereum.rpcUrl, + authToken: config.ethereum.rpcAuthToken, + }, dataSource, logger ); diff --git a/apps/rosen-service/src/configs.ts b/apps/rosen-service/src/configs.ts index 36cebd5e..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 { @@ -52,6 +61,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: getOptionalString('ethereum.rpcAuthToken'), + }, postgres: { url: nodeConfig.get('postgres.url'), logging: nodeConfig.get('postgres.logging'), @@ -62,6 +87,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'), }, }, }; 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/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); -}; 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/.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/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/README.md b/apps/rosen/README.md index fbe1b672..e3951a63 100644 --- a/apps/rosen/README.md +++ b/apps/rosen/README.md @@ -1 +1,40 @@ -# 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 + ./build.sh + cd apps/rosen + ``` + +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/rosen/app/(bridge)/BridgeForm.tsx b/apps/rosen/app/(bridge)/BridgeForm.tsx index 4d1955f4..71f7f194 100644 --- a/apps/rosen/app/(bridge)/BridgeForm.tsx +++ b/apps/rosen/app/(bridge)/BridgeForm.tsx @@ -21,9 +21,12 @@ 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'; +import useWallet from '@/_hooks/useWallet'; +import { NETWORKS } from '@rosen-ui/constants'; /** * customized form input @@ -78,7 +81,7 @@ const FormContainer = styled('div')(({ theme }) => ({ /** * renders the bridge main form */ -const BridgeForm = () => { +export const BridgeForm = () => { const { reset, setValue, @@ -95,11 +98,14 @@ const BridgeForm = () => { formState: { isValidating }, } = useTransactionFormData(); - const { availableNetworks, tokens, targetNetworks, selectedNetwork } = - useNetwork(); + const { availableNetworks, tokens, targetNetworks } = useNetwork(); + const { isLoading, amount, token } = useTokenBalance(); - const { max } = useMaxTransfer(); + const { max, loading: isMaxLoading } = useMaxTransfer(); + const tokenMap = useTokenMap(); + + const { selectedWallet } = useWallet(); const renderSelectedNetwork = (value: unknown) => { const network = availableNetworks.find( @@ -171,17 +177,20 @@ 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 = () => ( <> - {tokenField.value && !!max && ( + {tokenField.value && !isMaxLoading && selectedWallet && ( { {`Balance: ${ isLoading ? 'loading...' - : getDecimalString(amount.toString(), token?.decimals ?? 0) + : getDecimalString( + amount.toString(), + tokenMap.getSignificantDecimals( + tokenField.value.tokenId, + ) || 0, + ) }`} @@ -268,6 +282,28 @@ const BridgeForm = () => { + + ) : ( + errors.walletAddress?.message?.toString() + ) + } + disabled={!targetField.value} + autoComplete="off" + {...addressField} + value={addressField.value ?? ''} + /> + {targetField.value == NETWORKS.BITCOIN && ( + + Only Native SegWit (P2WPKH or P2WSH) addresses are supported. + + )} { disabled={!tokenField.value} autoComplete="off" /> - - ) : ( - 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. - - )} ); }; - -export default BridgeForm; diff --git a/apps/rosen/app/(bridge)/BridgeTransaction.tsx b/apps/rosen/app/(bridge)/BridgeTransaction.tsx index d942c490..4b08f830 100644 --- a/apps/rosen/app/(bridge)/BridgeTransaction.tsx +++ b/apps/rosen/app/(bridge)/BridgeTransaction.tsx @@ -2,28 +2,26 @@ import { useState } from 'react'; -import { TokenMap } from '@rosen-bridge/tokens'; import { Alert, Avatar, Divider, Grid, IconButton, - LoadingButton, Tooltip, Typography, styled, } from '@rosen-bridge/ui-kit'; import useNetwork from '@/_hooks/useNetwork'; -import { useTokensMap } from '@/_hooks/useTokensMap'; -import { useTransaction } from '@/_hooks/useTransaction'; +import { useTokenMap } from '@/_hooks/useTokenMap'; 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,34 +44,28 @@ 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 tokenMap = useTokenMap(); const { status, - networkFee, - bridgeFee, - receivingAmount, + networkFeeRaw, + bridgeFeeRaw, + receivingAmountRaw, isLoading: isLoadingFees, - minTransfer, + minTransferRaw, } = useTransactionFees(sourceValue, targetValue, tokenValue, amountValue); - const { setSelectedWallet, availableWallets, selectedWallet } = useWallet(); + const { setSelectedWallet, wallets, selectedWallet } = useWallet(); const { selectedNetwork } = useNetwork(); - const tokenInfo = tokenValue && getTokenNameAndId(tokenValue, sourceValue); + const tokenInfo = + tokenValue && sourceValue && getTokenNameAndId(tokenValue, sourceValue); const idKey = sourceValue && tokenMap.getIdKey(sourceValue); const targetTokenSearchResults = @@ -82,15 +74,10 @@ const BridgeTransaction = () => { tokenMap.search(sourceValue, { [idKey]: tokenValue[idKey], }); - const targetTokenInfo = targetTokenSearchResults?.[0]?.[targetValue]; + const targetTokenInfo = + targetValue && targetTokenSearchResults?.[0]?.[targetValue]; const WalletIcon = selectedWallet?.icon; - const { startTransaction, isSubmitting: isTransactionSubmitting } = - useTransaction(); - - const handleFormSubmit = handleSubmit(() => { - startTransaction(+bridgeFee, +networkFee); - }); const renderFee = ( title: string, @@ -191,63 +178,44 @@ 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()} - { - if (!selectedWallet) { - setChooseWalletsModalOpen(true); - } else { - handleFormSubmit(); - } - }} - > - {!selectedWallet ? 'CONNECT WALLET' : 'SUBMIT'} - + setChooseWalletsModalOpen(false)} - supportedWallets={selectedNetwork?.supportedWallets ?? []} - availableWallets={availableWallets ?? []} + wallets={wallets || []} /> ); }; - -export default BridgeTransaction; diff --git a/apps/rosen/app/(bridge)/ChooseWalletModal.tsx b/apps/rosen/app/(bridge)/ChooseWalletModal.tsx index 6c6772b7..f1592025 100644 --- a/apps/rosen/app/(bridge)/ChooseWalletModal.tsx +++ b/apps/rosen/app/(bridge)/ChooseWalletModal.tsx @@ -6,16 +6,18 @@ import { DialogContentText, Grid, Tooltip, + Typography, } from '@rosen-bridge/ui-kit'; -import { Wallet, WalletInfo } from '@rosen-ui/wallet-api'; +import { Network } from '@rosen-ui/types'; +import { Wallet } from '@rosen-ui/wallet-api'; +import { useEffect, useState } from 'react'; interface ChooseWalletModalProps { open: boolean; handleClose: () => void; setSelectedWallet: ((wallet: Wallet) => Promise) | undefined; - chainName: string; - supportedWallets: WalletInfo[]; - availableWallets: Wallet[]; + chainName?: Network; + wallets: Wallet[]; } /** @@ -25,8 +27,7 @@ interface ChooseWalletModalProps { * @param handleClose * @param setSelectedWallet * @param chainName - * @param supportedWallets - * @param availableWallets + * @param wallets * */ export const ChooseWalletModal = ({ @@ -34,32 +35,53 @@ export const ChooseWalletModal = ({ handleClose, setSelectedWallet, chainName, - supportedWallets, - availableWallets, + wallets, }: ChooseWalletModalProps) => { + const [, forceUpdate] = useState(''); + const handleConnect = async (wallet: Wallet) => { setSelectedWallet && (await setSelectedWallet(wallet)); handleClose(); }; + useEffect(() => { + if (!open) return; + + const timeout = setInterval(() => { + forceUpdate(wallets.map((wallet) => wallet.isAvailable()).join(':')); + }, 2000); + + return () => { + clearInterval(timeout); + }; + }, [open, wallets]); + 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), }} > - {supportedWallets.map( - ({ icon: WalletIcon, label, link, name }, index) => ( - + {wallets.map((wallet) => { + const WalletIcon = wallet.icon; + return ( + @@ -95,25 +117,19 @@ export const ChooseWalletModal = ({ - ), - )} + ); + })} 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 9e8a8ead..4883778a 100644 --- a/apps/rosen/app/(bridge)/page.tsx +++ b/apps/rosen/app/(bridge)/page.tsx @@ -3,35 +3,43 @@ import { useForm, FormProvider } from 'react-hook-form'; import { + Alert, Card, Divider, styled, 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'; +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', }, })); @@ -40,7 +48,7 @@ export interface BridgeForm { target: string | null; token: string | null; walletAddress: string | null; - amount: number | null; + amount: RosenAmountValue | null; } /** @@ -65,11 +73,24 @@ 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 + + . + + )} + ); }; diff --git a/apps/rosen/app/App.tsx b/apps/rosen/app/App.tsx index aef55665..c3c670bf 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 @@ -9,14 +8,19 @@ import { RosenTokens } from '@rosen-bridge/tokens'; */ 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 { SideBar } from './SideBar'; import Toolbar from './Toolbar'; -import ThemeProvider from '@/_theme/ThemeProvider'; +import { theme } from '@/_theme/theme'; import { WalletContextProvider } from './_contexts/walletContext'; -import { TokensMapProvider } from './_contexts/tokenMapProvider'; const Root = styled('div')(({ theme }) => ({ width: '100vw', @@ -61,15 +65,15 @@ const Main = styled('main')(({ theme }) => ({ interface AppProps { children?: React.ReactNode; - tokensMap: RosenTokens; } -const App = ({ children, tokensMap }: AppProps) => { +const App = ({ children }: AppProps) => { return ( - - - + + <> + + @@ -80,8 +84,8 @@ const App = ({ children, tokensMap }: AppProps) => { - - + + ); diff --git a/apps/rosen/app/SideBar.tsx b/apps/rosen/app/SideBar.tsx index 6e9ccec3..f6dd4c04 100644 --- a/apps/rosen/app/SideBar.tsx +++ b/apps/rosen/app/SideBar.tsx @@ -8,115 +8,66 @@ import { Exchange, Headphones, } from '@rosen-bridge/icons'; -import { - AppBar, - AppLogo, - 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')} - disabled - /> - - - - - - } - 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/apps/rosen/app/Toolbar.tsx b/apps/rosen/app/Toolbar.tsx index 6d67f15d..a1d4a1be 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,7 +23,7 @@ const Toolbar = () => { return ( } + toolbarActions={} isCentered /> ); 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/_actions/calculateFee.ts b/apps/rosen/app/_actions/calculateFee.ts index 68bc8d97..749d8961 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!, @@ -12,16 +13,18 @@ const ergoExplorerClient = ergoExplorerClientFactory( process.env.ERGO_EXPLORER_API!, ); -import { Networks } from '@rosen-ui/constants'; -import { ERGO_EXPLORER_URL, feeConfigTokenId } from '@/_constants'; -import { AvailableNetworks } from '@/_networks'; +import { NETWORKS } from '@rosen-ui/constants'; +import { Network } from '@rosen-ui/types'; +import { wrap } from '@/_errors'; +import { toSafeData } from '@/_utils/safeData'; const GetHeight = { - [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`, ); @@ -37,55 +40,50 @@ const GetHeight = { * @param height * @param explorerUrl * @param nextHeightInterval + * @returns CONTAINS WRAPPED-VALUE */ -export const calculateFee = async ( - sourceNetwork: AvailableNetworks, - targetNetwork: AvailableNetworks, - tokenId: string, - nextHeightInterval: number, -) => { - try { - const height = await GetHeight[sourceNetwork](); +export const calculateFee = wrap( + toSafeData( + async ( + sourceNetwork: Network, + targetNetwork: Network, + 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, + process.env.NEXT_PUBLIC_FEE_CONFIG_TOKEN_ID!, + ErgoNetworkType.explorer, + process.env.ERGO_EXPLORER_API!, + ); + 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({ - fees, - nextFees, - }), - }; - } catch (error) { - return { - tokenId, - status: 'error', - message: 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/_actions/validateAddress.ts b/apps/rosen/app/_actions/validateAddress.ts index d4290ba1..7cdb6564 100644 --- a/apps/rosen/app/_actions/validateAddress.ts +++ b/apps/rosen/app/_actions/validateAddress.ts @@ -1,33 +1,30 @@ 'use server'; -import { Address } from 'ergo-lib-wasm-nodejs'; -import { Networks } from '@rosen-ui/constants'; +import { NETWORK_VALUES } from '@rosen-ui/constants'; +import { Network } from '@rosen-ui/types'; -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'; +import { validateAddress as validate } from '@rosen-bridge/address-codec'; /** * server action to verify the wallet addresses * @param walletAddress - wallet address to verify * @returns the validation results for the passed address */ -export const validateAddress = ( - 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 (!isValidAddress(walletAddress)) { - throw new Error(); - } - } - return { isValid: true }; - } catch { - return { isValid: false, message: 'Invalid Address' }; - } -}; +const validateAddressCore = async (chain: Network, walletAddress: string) => + validate(chain, walletAddress); + +type Schema = Parameters; + +const schema = Joi.array().ordered( + Joi.string() + .required() + .valid(...NETWORK_VALUES), + Joi.string().required(), +); + +export const validateAddress = wrap( + withValidation(schema, validateAddressCore), +); 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/_backend/assets/repository.ts b/apps/rosen/app/_backend/assets/repository.ts new file mode 100644 index 00000000..c27885b3 --- /dev/null +++ b/apps/rosen/app/_backend/assets/repository.ts @@ -0,0 +1,127 @@ +import { + BridgedAssetEntity, + LockedAssetEntity, + TokenEntity, +} from '@rosen-ui/asset-calculator'; + +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); + +export interface Asset { + id: string; + name: string; + decimal: number; + isNative: boolean; + bridged: string | null; + lockedPerAddress?: Array<{ amount: number; address: string }>; + chain: Network; +} + +export type AssetFilters = Partial>; + +interface AssetWithTotal extends Asset { + total: number; +} + +/** + * get details of an asset, including its token info, plus locked and bridged + * data + * @param id + */ +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< + BridgedAssetEntity, + 'amount' | 'chain' | 'bridgedTokenId' + >[] = await bridgedAssetRepository.find({ + where: { tokenId: id }, + select: ['amount', 'chain', 'bridgedTokenId'], + }); + + const locked: Pick[] = + await lockedAssetRepository.find({ + where: { tokenId: id }, + select: ['amount', 'address'], + }); + + return { + token, + bridged, + locked, + }; +}; + +/** + * get paginated list of assets + * @param offset + * @param limit + * @param filters + */ +export const getAllAssets = async ( + offset: number, + limit: number, + filters: AssetFilters = {}, +) => { + const rawItems: AssetWithTotal[] = await tokenRepository + .createQueryBuilder('te') + .leftJoin( + (queryBuilder) => + queryBuilder + .select(['bae.tokenId AS "tokenId"', 'sum(bae.amount) AS "bridged"']) + .from(bridgedAssetRepository.metadata.tableName, 'bae') + .groupBy('bae.tokenId'), + 'baeq', + 'baeq."tokenId" = te.id', + ) + .leftJoin( + (queryBuilder) => + queryBuilder + .select([ + 'lae.tokenId AS "tokenId"', + `jsonb_agg(to_jsonb(lae) - 'tokenId') AS "lockedPerAddress"`, + ]) + .from(lockedAssetRepository.metadata.tableName, 'lae') + .groupBy('lae.tokenId'), + 'laeq', + 'laeq."tokenId" = te.id', + ) + .select([ + 'id', + 'name', + 'decimal', + '"isNative"', + '"bridged"', + '"lockedPerAddress"', + 'chain', + 'count(*) over() AS total', + ]) + .where(filters) + .orderBy('name', 'ASC') + .offset(offset) + .limit(limit) + .getRawMany(); + + const items = rawItems.map(({ total, ...item }) => item); + + const total = rawItems[0]?.total ?? 0; + + return { + items, + 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..1a0a9935 --- /dev/null +++ b/apps/rosen/app/_backend/assets/services.ts @@ -0,0 +1,54 @@ +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 + * @param limit + */ +export const getAsset = async (id: string) => { + const assetDetails = await repositoryGetAsset(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(), + birdgedTokenId: bridgedItem.bridgedTokenId, + })), + }; +}; + +/** + * return assets + * @param offset + * @param limit + */ +export const getAllAssets = async ( + offset: number, + limit: number, + filters: AssetFilters = {}, +) => { + const assets = await repositoryGetAllAssets(offset, limit, filters); + + return { + total: assets.total, + items: assets.items.map((asset) => ({ + ...asset, + significantDecimals: tokenMap.getSignificantDecimals(asset.id) || 0, + })), + }; +}; 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 95% rename from apps/rosen/app/_backend/events/event-repository.ts rename to apps/rosen/app/_backend/events/repository.ts index 6a01e5a4..69569190 100644 --- a/apps/rosen/app/_backend/events/event-repository.ts +++ b/apps/rosen/app/_backend/events/repository.ts @@ -1,9 +1,12 @@ 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'; +import '../initialize-datasource-if-needed'; + const blockRepository = dataSource.getRepository(BlockEntity); const eventTriggerRepository = dataSource.getRepository(EventTriggerEntity); const observationRepository = dataSource.getRepository(ObservationEntity); @@ -13,6 +16,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/services.ts similarity index 75% rename from apps/rosen/app/_backend/events/event-service.ts rename to apps/rosen/app/_backend/events/services.ts index 9cd4afec..f2a165e5 100644 --- a/apps/rosen/app/_backend/events/event-service.ts +++ b/apps/rosen/app/_backend/events/services.ts @@ -1,8 +1,9 @@ import { TokenMap } from '@rosen-bridge/tokens'; +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'; @@ -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, @@ -22,14 +23,14 @@ const getFullTokenData = (tokenId: string, chain: string) => { 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', }; } catch { return { tokenId: tokenId, name: UNSUPPORTED_TOKEN_NAME, - decimals: 0, + significantDecimals: 0, isNativeToken: false, }; } @@ -40,7 +41,10 @@ const getFullTokenData = (tokenId: string, chain: string) => { * @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 { @@ -51,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/_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/_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/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/_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/_errors/core.ts b/apps/rosen/app/_errors/core.ts new file mode 100644 index 00000000..305d2610 --- /dev/null +++ b/apps/rosen/app/_errors/core.ts @@ -0,0 +1,119 @@ +import { isPlainObject } from 'lodash-es'; + +type AsyncFunction = (...args: any[]) => Promise; + +type Wrap = ( + func: Func, +) => ( + ...args: Parameters +) => Promise> | WrapError>; + +type Unwrap = ( + func: Func, +) => ( + ...args: Parameters +) => Promise>, WrapError>>; + +/** + * Interface representing the result of an error. + */ +export interface WrapError extends Error {} + +/** + * 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: 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: JSON.stringify(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 (!isPlainObject(result)) 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 }; +}; diff --git a/apps/rosen/app/_errors/index.ts b/apps/rosen/app/_errors/index.ts new file mode 100644 index 00000000..b4243a4a --- /dev/null +++ b/apps/rosen/app/_errors/index.ts @@ -0,0 +1,9 @@ +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/_hooks/useBridgeForm.ts b/apps/rosen/app/_hooks/useBridgeForm.ts index b8db2da4..991dab40 100644 --- a/apps/rosen/app/_hooks/useBridgeForm.ts +++ b/apps/rosen/app/_hooks/useBridgeForm.ts @@ -3,18 +3,19 @@ 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'; import { validateAddress } from '@/_actions/validateAddress'; -import { AvailableNetworks, availableNetworks } from '@/_networks'; +import { availableNetworks } from '@/_networks'; import { getMinTransfer } from '@/_utils/index'; -import getMaxTransfer from '@/_utils/getMaxTransfer'; - -const validationCache = new Map(); +import { getMaxTransfer } from '@/_utils/getMaxTransfer'; +import { useTokenMap } from './useTokenMap'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; +import { unwrap } from '@/_errors'; +import { cache } from '@/_utils/cache'; /** * handles the form field registrations and form state changes @@ -25,7 +26,7 @@ const useBridgeForm = () => { const { control, resetField, reset, setValue, formState, setFocus } = useTransactionFormData(); - const tokensMap = useTokensMap(); + const tokenMap = useTokenMap(); const walletGlobalContext = useContext(WalletContext); @@ -50,24 +51,31 @@ 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; if (isValueInvalid) return 'The amount is not valid'; + if (!tokenMap) return 'Token map config is unavailable'; + const decimals = + tokenMap.getSignificantDecimals(tokenField.value.tokenId) || 0; + // 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`; + + const wrappedAmount = BigInt( + 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]; + availableNetworks[sourceField.value as Network]; const maxTransfer = await getMaxTransfer( selectedNetwork, @@ -82,13 +90,11 @@ const useBridgeForm = () => { fromAddress: await walletGlobalContext!.state.selectedWallet!.getAddress(), toAddress: addressField.value, - toChain: targetField.value, + toChain: targetField.value as Network, }), ); - const isAmountLarge = - BigInt(getNonDecimalString(value, tokenField.value?.decimals)) > - BigInt(maxTransfer.toString()); + const isAmountLarge = wrappedAmount > maxTransfer; if (isAmountLarge) return 'Balance insufficient'; } @@ -96,16 +102,8 @@ const useBridgeForm = () => { tokenField.value, sourceField.value, targetField.value, - tokensMap, ); - const isAmountSmall = - BigInt(getNonDecimalString(value, tokenField.value?.decimals)) < - BigInt( - getNonDecimalString( - minTransfer.toString(), - tokenField.value.decimals, - ), - ); + const isAmountSmall = wrappedAmount < minTransfer; if (isAmountSmall) return 'Minimum transfer amount not respected'; return undefined; @@ -121,19 +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, value) - ).message; - validationCache.set(cacheKey, validationResult); - - return validationResult; }, }, }); 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 611b6267..fed579ed 100644 --- a/apps/rosen/app/_hooks/useMaxTransfer.ts +++ b/apps/rosen/app/_hooks/useMaxTransfer.ts @@ -1,72 +1,94 @@ -import { useEffect, useState } 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 { getMaxTransfer } from '@/_utils/getMaxTransfer'; +import useTransactionFormData from './useTransactionFormData'; +import useWallet from './useWallet'; /** * a hook version of `getMaxTransfer` util + * @returns CONTAINS A WRAPPED-VALUE */ -const useMaxTransfer = () => { - const [max, setMax] = useState(0); - const [loading, setLoading] = useState(false); +export const useMaxTransfer = () => { + const [error, setError] = useState(false); - const { isLoading: isTokenBalanceLoading, amount } = useTokenBalance(); + const [max, setMax] = useState(0n); + + 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; - - try { - setLoading(true); - 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); - } finally { - setLoading(false); + const loading = isTokenBalanceLoading || isTransitionLoading; + + const load = useCallback(async () => { + const skip = + !amount || + isTokenBalanceLoading || + !selectedNetwork || + !selectedWallet || + !targetValue || + !tokenValue; + + if (skip) return; + + setError(false); + + try { + let eventData: any; + + if (selectedNetwork.name === NETWORKS.BITCOIN) { + eventData = { + fromAddress: await selectedWallet.getAddress(), + toAddress: walletAddressValue, + toChain: targetValue, + }; } - }; - effect(); + const max = await getMaxTransfer( + selectedNetwork, + { + balance: amount, + isNative: tokenValue.metaData.type === 'native', + }, + async () => ({ + fromAddress: await selectedWallet.getAddress(), + toAddress: walletAddressValue, + toChain: targetValue, + }), + ); + + 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..672eb916 100644 --- a/apps/rosen/app/_hooks/useNetwork.ts +++ b/apps/rosen/app/_hooks/useNetwork.ts @@ -1,14 +1,11 @@ -import { TokenMap } from '@rosen-bridge/tokens'; 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 { useTokensMap } from './useTokensMap'; - -type Chain = string; -type SourceFieldValue = Chain & AvailableNetworks; +import { useTokenMap } from './useTokenMap'; +import { Network } from '@rosen-ui/types'; /** * handles network related operations and provide list of @@ -16,33 +13,27 @@ 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[]) - .filter((chain) => Object.values(Networks).includes(chain)) + return (tokenMap.getAllChains() as Network[]) + .filter((chain) => NETWORK_VALUES.includes(chain)) .map((chain) => availableNetworks[chain]); - }, [tokensMap]); + }, [tokenMap]); /** * returns the list of available target network objects if a and filters out * unsupported networks */ const targetNetworks = useMemo(() => { - return ( - tokensMap.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, tokensMap]); + }, [sourceField.value, tokenMap]); /** * a list of available tokens in the selected network @@ -50,16 +41,19 @@ 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, selectedNetwork: sourceField.value - ? availableNetworks[sourceField.value as SourceFieldValue] + ? availableNetworks[sourceField.value as Network] : null, targetNetworks: targetNetworks, tokens, + selectedTargetNetwork: targetField.value + ? availableNetworks[targetField.value as Network] + : null, }; }; diff --git a/apps/rosen/app/_hooks/useTokenBalance.ts b/apps/rosen/app/_hooks/useTokenBalance.ts index aeb1bc33..26992075 100644 --- a/apps/rosen/app/_hooks/useTokenBalance.ts +++ b/apps/rosen/app/_hooks/useTokenBalance.ts @@ -5,21 +5,24 @@ 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 { isLoading: boolean; - amount: number; + // THIS IS A WRAPPED-VALUE + amount: RosenAmountValue; token: TokenInfo | null; } /** * returns the amount of currently selected asset + * @returns CONTAINS A WRAPPED-VALUE */ const useTokenBalance = () => { const [balanceState, setBalanceState] = useState({ isLoading: false, - amount: 0, + amount: 0n, token: null, }); @@ -30,17 +33,18 @@ const useTokenBalance = () => { const token = tokenField.value; const getAssetBalance = useCallback( - async (wallet: SupportedWallets) => { - setBalanceState({ isLoading: true, amount: 0, token: null }); + async (wallet: Wallet) => { + 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]); @@ -51,6 +55,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..d2b47e41 --- /dev/null +++ b/apps/rosen/app/_hooks/useTokenMap.ts @@ -0,0 +1,23 @@ +import { useEffect, useState, useTransition } from 'react'; + +import { TokenMap } from '@rosen-bridge/tokens'; + +import { getTokenMap } from '@/_networks/getTokenMap.client'; + +/** + * return TokenMap instance + */ +export const useTokenMap = (): TokenMap => { + const [tokenMap, setTokenMap] = useState( + new TokenMap({ idKeys: {}, tokens: [] }), + ); + + const [, startTransition] = useTransition(); + useEffect(() => { + startTransition(async () => { + setTokenMap(await getTokenMap()); + }); + }, []); + + 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 97cffbba..6cd299ee 100644 --- a/apps/rosen/app/_hooks/useTransaction.ts +++ b/apps/rosen/app/_hooks/useTransaction.ts @@ -3,40 +3,56 @@ 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'; +import { useTokenMap } from './useTokenMap'; +import { RosenAmountValue } from '@rosen-ui/types'; /** * a react hook to create and sign and submit transactions */ export const useTransaction = () => { + const tokenMap = useTokenMap(); + const { selectedNetwork, selectedTargetNetwork } = 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(); - const startTransaction = async (bridgeFee: number, networkFee: number) => { + const startTransaction = async ( + bridgeFee: RosenAmountValue, + networkFee: RosenAmountValue, + ) => { if ( tokenValue && targetValue && amountValue && walletAddressValue && bridgeFee && - networkFee + networkFee && + tokenMap && + selectedTargetNetwork ) { setIsSubmitting(true); try { + const amountValueWrapped = BigInt( + getNonDecimalString( + amountValue as string, + tokenMap.getSignificantDecimals(tokenValue.tokenId) || 0, + ), + ); const txId = await selectedWallet?.transfer( tokenValue as RosenChainToken, - amountValue, + amountValueWrapped, targetValue, - walletAddressValue, + selectedTargetNetwork.toSafeAddress(walletAddressValue), bridgeFee, networkFee, lockAddress, diff --git a/apps/rosen/app/_hooks/useTransactionFees.ts b/apps/rosen/app/_hooks/useTransactionFees.ts index 4e7bef5c..3e736b9c 100644 --- a/apps/rosen/app/_hooks/useTransactionFees.ts +++ b/apps/rosen/app/_hooks/useTransactionFees.ts @@ -1,24 +1,26 @@ 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'; -import { AvailableNetworks } from '@/_networks'; +import { Network } from '@rosen-ui/types'; +import { unwrap } from '@/_errors'; +import { useTokenMap } from './useTokenMap'; +import { fromSafeData } from '@/_utils/safeData'; /** * calculates the fees for a token swap between * two networks */ const useTransactionFees = ( - sourceChain: AvailableNetworks | null, - targetChain: AvailableNetworks | null, + sourceChain: Network | null, + targetChain: Network | null, token: RosenChainToken | null, amount: string | null, ) => { @@ -27,21 +29,20 @@ const useTransactionFees = ( const { selectedNetwork } = useNetwork(); const feeInfo = useRef(null); - const tokensMap = useTokensMap(); + const tokenMap = useTokenMap(); /** * finds and returns a token id based on supported networks */ const getTokenId = useCallback( - (sourceChain: string, token: RosenChainToken) => { - const tokenMap = new TokenMap(tokensMap); + (sourceChain: Network, token: RosenChainToken) => { const idKey = tokenMap.getIdKey(sourceChain); const tokens = tokenMap.search(sourceChain, { [idKey]: token[idKey], }); return tokens[0].ergo.tokenId; }, - [tokensMap], + [tokenMap], ); /** @@ -54,6 +55,11 @@ const useTransactionFees = ( return null; }, [getTokenId, sourceChain, token]); + const decimals = useMemo(() => { + if (!tokenId) return 0; + return tokenMap.getSignificantDecimals(tokenId) || 0; + }, [tokenId, tokenMap]); + useEffect(() => { feeInfo.current = null; }, [sourceChain, targetChain, token]); @@ -71,18 +77,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(fromSafeData(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 +98,19 @@ const useTransactionFees = ( 'warning', ); } - feeInfo.current = parsedData; - } else if (data.status === 'error') { + + feeInfo.current = { + tokenId, + status: '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, + }; } }); } @@ -111,56 +126,50 @@ 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 && token - ? +getNonDecimalString(amount.toString(), token.decimals) - : 0; + let paymentAmount = 0n; + + try { + paymentAmount = BigInt(getNonDecimalString(amount!, decimals)); + } catch {} - 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: getDecimalString( - bridgeFee?.toString() || '0', - token?.decimals || 0, - ), - networkFee: getDecimalString( - networkFee?.toString() || '0', - token?.decimals || 0, - ), - receivingAmount: + bridgeFee, + bridgeFeeRaw: getDecimalString(bridgeFee?.toString() || '0', decimals), + networkFee, + networkFeeRaw: getDecimalString(networkFee?.toString() || '0', decimals), + receivingAmount: receivingAmountValue, + receivingAmountRaw: fees && receivingAmountValue > 0 - ? getDecimalString( - receivingAmountValue.toString() || '0', - token?.decimals || 0, - ) + ? getDecimalString(receivingAmountValue.toString() || '0', decimals) : '0', - minTransfer: minTransfer - ? getDecimalString( - (minTransfer + 1).toString() || '0', - token?.decimals || 0, - ) + minTransfer: minTransfer ? minTransfer + 1n || 0n : 0n, + minTransferRaw: minTransfer + ? getDecimalString((minTransfer + 1n).toString() || '0', decimals) : '0', isLoading: pending, status: feeInfo.current, }; - }, [amount, fees, pending, token, feeRatioDivisor]); + }, [amount, fees, pending, decimals, feeRatioDivisor]); return transactionFees; }; diff --git a/apps/rosen/app/_hooks/useTransactionFormData.ts b/apps/rosen/app/_hooks/useTransactionFormData.ts index 484a97bc..fe10b8cf 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 | 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/_hooks/useWallet.ts b/apps/rosen/app/_hooks/useWallet.ts index 6cf30bc6..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,12 +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.availableWallets] : [] - ).find((w: SupportedWallets) => w.name === name); + selectedNetwork + ? selectedNetwork.wallets.filter((wallet) => wallet.isAvailable()) + : [] + ).find((w: Wallet) => w.name === name); if (!wallet) { throw new Error(`unsupported wallet with name ${name}`); } @@ -59,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); @@ -77,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(); @@ -124,7 +124,7 @@ const useWallet = () => { ? { setSelectedWallet, selectedWallet: walletGlobalContext?.state.selectedWallet, - availableWallets: selectedNetwork.availableWallets, + wallets: selectedNetwork.wallets, getBalance: walletGlobalContext?.state.selectedWallet?.getBalance, } : {}; diff --git a/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts b/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts index 9cff21e6..3aad9790 100644 --- a/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts +++ b/apps/rosen/app/_networks/bitcoin/getMaxTransfer.ts @@ -8,50 +8,67 @@ import { getMinimumMeaningfulSatoshi, } from '@rosen-network/bitcoin'; +import { wrap } from '@/_errors'; 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 */ -const getMaxTransfer = async ({ - balance, - isNative, - eventData, -}: Parameters[0]) => { - if (!eventData.toAddress) return 0; +export const getMaxTransfer = wrap( + 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); - 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; -}; + const tokenMap = await getTokenMap(); -export default getMaxTransfer; + 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); + }, + ), +); diff --git a/apps/rosen/app/_networks/bitcoin/index.ts b/apps/rosen/app/_networks/bitcoin/index.ts index 6a571f1f..4d1bf85a 100644 --- a/apps/rosen/app/_networks/bitcoin/index.ts +++ b/apps/rosen/app/_networks/bitcoin/index.ts @@ -1,13 +1,13 @@ import { BitcoinIcon } from '@rosen-bridge/icons'; -import { xdefiWalletCreator, xdefiWalletInfo } from '@rosen-ui/xdefi-wallet'; +import { xdefiWalletCreator } 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 { NETWORK_LABELS, NETWORKS } from '@rosen-ui/constants'; +import { unwrap } from '@/_errors'; import { BitcoinNetwork as BitcoinNetworkType } from '@/_types/network'; +import { cache } from '@/_utils/cache'; import { generateOpReturnData, @@ -16,27 +16,31 @@ import { getAddressBalance, } from './server'; +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 * functionality */ const BitcoinNetwork: BitcoinNetworkType = { - name: Networks.BITCOIN, - label: 'Bitcoin', + name: NETWORKS.BITCOIN, + label: NETWORK_LABELS.BITCOIN, logo: BitcoinIcon, - supportedWallets: [xdefiWalletInfo], - availableWallets: compact([ - xdefiWalletCreator({ - generateOpReturnData, - generateUnsignedTx, - getAddressBalance, - submitTransaction, - }), - ]), + wallets: [xdefiWalletCreator(config)], nextHeightInterval: 1, lockAddress: process.env.NEXT_PUBLIC_BITCOIN_LOCK_ADDRESS!, - getMaxTransfer, + getMaxTransfer: unwrap(fromSafeData(getMaxTransfer)), + toSafeAddress: (address) => address, }; export default BitcoinNetwork; diff --git a/apps/rosen/app/_networks/bitcoin/server.ts b/apps/rosen/app/_networks/bitcoin/server.ts index d02c071a..7cb8b723 100644 --- a/apps/rosen/app/_networks/bitcoin/server.ts +++ b/apps/rosen/app/_networks/bitcoin/server.ts @@ -7,7 +7,14 @@ 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'; +import { TokenMap } from '@rosen-bridge/tokens'; +import { getRosenTokens } from '@/_backend/utils'; +import { toSafeData } from '@/_utils/safeData'; + +export const generateOpReturnData = wrap(toSafeData(generateOpReturnDataCore)); +export const generateUnsignedTx = wrap( + toSafeData(generateUnsignedTxCore(new TokenMap(getRosenTokens()))), +); +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 new file mode 100644 index 00000000..16f01122 --- /dev/null +++ b/apps/rosen/app/_networks/cardano/getMaxTransfer.ts @@ -0,0 +1,35 @@ +'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.server'; +import { RosenAmountValue } from '@rosen-ui/types'; +import { toSafeData } from '@/_utils/safeData'; + +/** + * get max transfer for cardano + */ +export const getMaxTransfer = wrap( + 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 18834477..c9c4e931 100644 --- a/apps/rosen/app/_networks/cardano/index.ts +++ b/apps/rosen/app/_networks/cardano/index.ts @@ -1,18 +1,14 @@ -import { compact } from 'lodash-es'; - -import { convertNumberToBigint, validateDecimalPlaces } from '@rosen-ui/utils'; - -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'; -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, @@ -21,12 +17,17 @@ import { setTxWitnessSet, } from './server'; -import { feeAndMinBoxValue } from '@rosen-network/cardano/dist/src/constants'; +import { getTokenMap } from '../getTokenMap.client'; +import { getMaxTransfer } from './getMaxTransfer'; +import { fromSafeData } from '@/_utils/safeData'; -import getVesprWallet, { - isVesprAvailable, - walletInfo as vesprWalletInfo, -} from '@rosen-ui/vespr-wallet'; +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 @@ -34,118 +35,19 @@ import getVesprWallet, { * functionality */ const CardanoNetwork: CardanoNetworkType = { - name: Networks.CARDANO, - label: 'Cardano', - supportedWallets: [ - eternlWalletInfo, - flintWalletInfo, - laceWalletInfo, - namiWalletInfo, + name: NETWORKS.CARDANO, + label: NETWORK_LABELS.CARDANO, + wallets: [ + eternlWalletCreator(config), + flintWalletCreator(config), + laceWalletCreator(config), + namiWalletCreator(config), ], - availableWallets: compact([ - eternlWalletCreator({ - decodeWasmValue: decodeWasmValue, - generateLockAuxiliaryData: generateLockAuxiliaryData, - generateUnsignedTx: generateUnsignedTx, - setTxWitnessSet: setTxWitnessSet, - }), - flintWalletCreator({ - decodeWasmValue: decodeWasmValue, - generateLockAuxiliaryData: generateLockAuxiliaryData, - generateUnsignedTx: generateUnsignedTx, - setTxWitnessSet: setTxWitnessSet, - }), - laceWalletCreator({ - decodeWasmValue: decodeWasmValue, - generateLockAuxiliaryData: generateLockAuxiliaryData, - generateUnsignedTx: generateUnsignedTx, - setTxWitnessSet: setTxWitnessSet, - }), - namiWalletCreator({ - decodeWasmValue: decodeWasmValue, - generateLockAuxiliaryData: generateLockAuxiliaryData, - generateUnsignedTx: generateUnsignedTx, - setTxWitnessSet: setTxWitnessSet, - }), - isVesprAvailable() && { - ...getVesprWallet(), - getBalance: async (token: RosenChainToken) => { - const context = await getVesprWallet().api.enable(); - const rawValue = await context.getBalance(); - const balances = await 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().api.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 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 generateUnsignedTx( - walletUtxos, - lockAddress, - changeAddressHex, - policyIdHex, - assetNameHex, - amount.toString(), - auxiliaryDataHex, - ); - - const signedTxHex = await setTxWitnessSet( - unsignedTxHex, - await wallet.signTx(unsignedTxHex, false), - ); - - const result = await wallet.submitTx(signedTxHex); - return result; - }, - }, - ]), 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(fromSafeData(getMaxTransfer)), + toSafeAddress: (address) => address, }; export default CardanoNetwork; diff --git a/apps/rosen/app/_networks/cardano/server.ts b/apps/rosen/app/_networks/cardano/server.ts index 34dfd46f..2f593909 100644 --- a/apps/rosen/app/_networks/cardano/server.ts +++ b/apps/rosen/app/_networks/cardano/server.ts @@ -7,7 +7,16 @@ 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'; +import { TokenMap } from '@rosen-bridge/tokens'; +import { getRosenTokens } from '@/_backend/utils'; +import { toSafeData } from '@/_utils/safeData'; + +export const decodeWasmValue = wrap(toSafeData(decodeWasmValueCore)); +export const generateLockAuxiliaryData = wrap( + toSafeData(generateLockAuxiliaryDataCore), +); +export const generateUnsignedTx = wrap( + toSafeData(generateUnsignedTxCore(new TokenMap(getRosenTokens()))), +); +export const setTxWitnessSet = wrap(toSafeData(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..ce5c7ef0 --- /dev/null +++ b/apps/rosen/app/_networks/ergo/getMaxTransfer.ts @@ -0,0 +1,38 @@ +'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 { ErgoNetwork } 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( + toSafeData( + async ({ + balance, + isNative, + }: Parameters< + ErgoNetwork['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 0015e9c7..f37ba8ff 100644 --- a/apps/rosen/app/_networks/ergo/index.ts +++ b/apps/rosen/app/_networks/ergo/index.ts @@ -1,20 +1,20 @@ -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'; +import { NETWORK_LABELS, NETWORKS } from '@rosen-ui/constants'; +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 @@ -22,24 +22,14 @@ import { generateUnsignedTx } from './server'; * functionality */ const ErgoNetwork: ErgoNetworkType = { - name: Networks.ERGO, - label: 'Ergo', - supportedWallets: [nautilusWalletInfo], - availableWallets: compact([ - nautilusWalletCreator({ - generateUnsignedTx, - }), - ]), + name: NETWORKS.ERGO, + label: NETWORK_LABELS.ERGO, + wallets: [nautilusWalletCreator(config)], 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(fromSafeData(getMaxTransfer)), + toSafeAddress: (address) => address, }; export default ErgoNetwork; diff --git a/apps/rosen/app/_networks/ergo/server.ts b/apps/rosen/app/_networks/ergo/server.ts index a6f8d7c3..25e22033 100644 --- a/apps/rosen/app/_networks/ergo/server.ts +++ b/apps/rosen/app/_networks/ergo/server.ts @@ -2,4 +2,11 @@ import { generateUnsignedTx as generateUnsignedTxCore } from '@rosen-network/ergo'; -export const generateUnsignedTx = generateUnsignedTxCore; +import { wrap } from '@/_errors'; +import { TokenMap } from '@rosen-bridge/tokens'; +import { getRosenTokens } from '@/_backend/utils'; +import { toSafeData } from '@/_utils/safeData'; + +export const generateUnsignedTx = wrap( + toSafeData(generateUnsignedTxCore(new TokenMap(getRosenTokens()))), +); diff --git a/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts b/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts new file mode 100644 index 00000000..f843b1a2 --- /dev/null +++ b/apps/rosen/app/_networks/ethereum/getMaxTransfer.ts @@ -0,0 +1,39 @@ +'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'; +import { ETH_TRANSFER_GAS, getFeeData } from '@rosen-network/ethereum'; + +/** + * get max transfer for ethereum + */ +export const getMaxTransfer = wrap( + toSafeData( + async ({ + balance, + isNative, + }: Parameters< + EthereumNetwork['getMaxTransfer'] + >[0]): Promise => { + 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 wrappedFee = tokenMap.wrapAmount( + 'eth', + estimatedFee, + NETWORKS.ETHEREUM, + ).amount; + const offset = isNative ? wrappedFee : 0n; + const amount = balance - offset; + return amount < 0n ? 0n : 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..a085372d --- /dev/null +++ b/apps/rosen/app/_networks/ethereum/index.ts @@ -0,0 +1,36 @@ +import { metaMaskWalletCreator } from '@rosen-ui/metamask-wallet'; + +import { NETWORK_LABELS, NETWORKS } from '@rosen-ui/constants'; + +import { unwrap } from '@/_errors'; +import { EthereumNetwork as EthereumNetworkType } from '@/_types/network'; +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 + * providing access to network info and wallets and network specific + * functionality + */ +const EthereumNetwork: EthereumNetworkType = { + name: NETWORKS.ETHEREUM, + label: NETWORK_LABELS.ETHEREUM, + wallets: [ + metaMaskWalletCreator({ + getTokenMap, + generateLockData: unwrap(generateLockData), + generateTxParameters: unwrap(fromSafeData(generateTxParameters)), + }), + ], + logo: EthereumIcon, + 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/_networks/ethereum/server.ts b/apps/rosen/app/_networks/ethereum/server.ts new file mode 100644 index 00000000..14a36eba --- /dev/null +++ b/apps/rosen/app/_networks/ethereum/server.ts @@ -0,0 +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/apps/rosen/app/_networks/getTokenMap.client.ts b/apps/rosen/app/_networks/getTokenMap.client.ts new file mode 100644 index 00000000..b864249e --- /dev/null +++ b/apps/rosen/app/_networks/getTokenMap.client.ts @@ -0,0 +1,16 @@ +import { TokenMap } from '@rosen-bridge/tokens'; + +import { getRosenTokens } from '@/_backend/utils'; +import { cache } from '@/_utils/cache'; + +let tokenMap: TokenMap; + +/** + * get a TokenMap instance using the Rosen TokenMapObject in the client. + */ +export const getTokenMap = async () => { + if (tokenMap) return tokenMap; + const tokens = await cache(getRosenTokens, 60000)(); + 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..dbd6cf05 --- /dev/null +++ b/apps/rosen/app/_networks/getTokenMap.server.ts @@ -0,0 +1,15 @@ +import { TokenMap } from '@rosen-bridge/tokens'; + +import { getRosenTokens } from '@/_backend/utils'; + +let tokenMap: TokenMap; + +/** + * get a TokenMap instance using the Rosen TokenMapObject in the server. + */ +export const getTokenMap = async () => { + if (tokenMap) return tokenMap; + const tokens = await getRosenTokens(); + tokenMap = new TokenMap(tokens); + return tokenMap; +}; diff --git a/apps/rosen/app/_networks/index.ts b/apps/rosen/app/_networks/index.ts index e2ca55ad..4a5104cf 100644 --- a/apps/rosen/app/_networks/index.ts +++ b/apps/rosen/app/_networks/index.ts @@ -1,16 +1,13 @@ import BitcoinNetwork from './bitcoin'; 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.CARDANO]: CardanoNetwork, - [Networks.BITCOIN]: BitcoinNetwork, + [NETWORKS.ERGO]: ErgoNetwork, + [NETWORKS.ETHEREUM]: EthereumNetwork, + [NETWORKS.CARDANO]: CardanoNetwork, + [NETWORKS.BITCOIN]: BitcoinNetwork, } as const; - -export type AvailableNetworks = Exclude< - (typeof Networks)[keyof typeof Networks], - 'ethereum' ->; 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/apps/rosen/app/_types/api.ts b/apps/rosen/app/_types/api.ts index dcf012d7..b5721a93 100644 --- a/apps/rosen/app/_types/api.ts +++ b/apps/rosen/app/_types/api.ts @@ -1,7 +1,13 @@ -import eventService from '@/_backend/events/event-service'; +import { getAsset, getAllAssets } from '@/_backend/assets'; +import { getEventsWithFullTokenData } from '@/_backend/events'; export type ApiEventResponse = Awaited< - ReturnType + ReturnType >; type ArrayElement = T extends (infer Element)[] ? Element : never; export type Event = ArrayElement; + +export type ApiAssetsResponse = Awaited>; +export type Assets = ArrayElement; + +export type ApiAssetResponse = Awaited>; diff --git a/apps/rosen/app/_types/network.ts b/apps/rosen/app/_types/network.ts index 4762a968..fe932bd6 100644 --- a/apps/rosen/app/_types/network.ts +++ b/apps/rosen/app/_types/network.ts @@ -1,9 +1,9 @@ -import { Wallet, WalletInfo } from '@rosen-ui/wallet-api'; +import { Wallet } from '@rosen-ui/wallet-api'; -import { AvailableNetworks } from '@/_networks'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; interface GetMaxTransferParams { - balance: number; + balance: RosenAmountValue; isNative: boolean; } @@ -11,32 +11,32 @@ interface GetMaxTransferParams { * the main network interface for all supported networks */ export interface BaseNetwork< - NetworkName extends AvailableNetworks, + NetworkName extends Network, GetMaxTransferParamsExtra = {}, > { name: NetworkName; logo: string; label: string; - availableWallets: Wallet[]; - supportedWallets: WalletInfo[]; + wallets: Wallet[]; nextHeightInterval: number; lockAddress: string; + // THIS FUNCTION WORKS WITH WRAPPED-VALUE getMaxTransfer: ( props: GetMaxTransferParams & GetMaxTransferParamsExtra, - ) => Promise; + ) => Promise; + toSafeAddress: (address: string) => string; } interface BitcoinMaxTransferExtra { eventData: { - toChain: string; + toChain: Network; fromAddress: string; toAddress: string; }; } +export interface EthereumNetwork extends BaseNetwork<'ethereum'> {} 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/_utils/cache.ts b/apps/rosen/app/_utils/cache.ts new file mode 100644 index 00000000..6ac7998e --- /dev/null +++ b/apps/rosen/app/_utils/cache.ts @@ -0,0 +1,18 @@ +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) { + data[key] = [(result = callback(...args)), Date.now()]; + } + + return await result; + }) as T; +}; diff --git a/apps/rosen/app/_utils/getMaxTransfer.ts b/apps/rosen/app/_utils/getMaxTransfer.ts index 940c2fd3..527a4148 100644 --- a/apps/rosen/app/_utils/getMaxTransfer.ts +++ b/apps/rosen/app/_utils/getMaxTransfer.ts @@ -1,26 +1,34 @@ -import { BitcoinNetwork, CardanoNetwork, ErgoNetwork } from '@/_types/network'; +import { + BitcoinNetwork, + CardanoNetwork, + ErgoNetwork, + EthereumNetwork, +} from '@/_types/network'; +import { NETWORKS } from '@rosen-ui/constants'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; /** * 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, +export const getMaxTransfer = async ( + network: ErgoNetwork | CardanoNetwork | BitcoinNetwork | EthereumNetwork, tokenInfo: { - balance: number; + balance: RosenAmountValue; isNative: boolean; }, getContext: () => Promise<{ fromAddress: string; toAddress: string; - toChain: string; + toChain: Network; }>, -) => { - if (network.name === 'bitcoin') { +): Promise => { + if (network.name === NETWORKS.BITCOIN) { const context = await getContext(); - return network.getMaxTransfer({ + return await network.getMaxTransfer({ balance: tokenInfo.balance, isNative: tokenInfo.isNative, eventData: { @@ -31,10 +39,8 @@ const getMaxTransfer = async ( }); } - return network.getMaxTransfer({ + 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 bfe4cfb7..d85d559e 100644 --- a/apps/rosen/app/_utils/index.ts +++ b/apps/rosen/app/_utils/index.ts @@ -1,21 +1,19 @@ 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'; -import { Networks } from '@rosen-ui/constants'; -import { AvailableNetworks } from '@/_networks'; +import { NETWORK_VALUES } from '@rosen-ui/constants'; +import { unwrap } from '@/_errors'; +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.CARDANO, Networks.BITCOIN].includes(network)) { +export const getTokenNameAndId = (token: RosenChainToken, network: Network) => { + if (NETWORK_VALUES.includes(network)) { return { tokenName: token.name, tokenId: token.tokenId, @@ -28,36 +26,37 @@ export const getTokenNameAndId = ( * @param token * @param amount * @param sourceChain + * @returns A WRAPPED-VALUE */ export const getMinTransfer = async ( token: RosenChainToken, - sourceChain: AvailableNetworks, - targetChain: AvailableNetworks, - tokensMap: any, -) => { - const tokenMap = new TokenMap(tokensMap); + sourceChain: Network, + targetChain: Network, +): Promise => { + const tokenMap = await getTokenMap(); const idKey = tokenMap.getIdKey(sourceChain); const tokens = tokenMap.search(sourceChain, { [idKey]: token[idKey], }); 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(fromSafeData(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 ? BigInt(fees.networkFee) : 0n; + const bridgeFee = fees ? BigInt(fees.bridgeFee) : 0n; - return minTransfer - ? getDecimalString( - (minTransfer + 1).toString() || '0', - token?.decimals || 0, - ) - : '0'; + const minTransfer = bridgeFee + networkFee; + + return minTransfer ? minTransfer + 1n : 0n; + } catch { + return 0n; + } }; 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/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); + }; diff --git a/apps/rosen/app/api/v1/assets/assets-repository.ts b/apps/rosen/app/api/v1/assets/assets-repository.ts deleted file mode 100644 index 94972e7a..00000000 --- a/apps/rosen/app/api/v1/assets/assets-repository.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { - BridgedAssetEntity, - LockedAssetEntity, - TokenEntity, -} from '@rosen-ui/asset-calculator'; - -import dataSource from '../../../_backend/dataSource'; - -const bridgedAssetRepository = dataSource.getRepository(BridgedAssetEntity); -const lockedAssetRepository = dataSource.getRepository(LockedAssetEntity); -const tokenRepository = dataSource.getRepository(TokenEntity); - -interface AssetWithTotal { - id: string; - name: string; - decimal: number; - isNative: boolean; - bridged: string; - locked: string; - chain: string; - total: number; -} -export type AssetFilters = Partial< - Pick ->; - -/** - * remove total field from rawItems returned by query in getAssets - * @param rawItems - */ -const getItemsWithoutTotal = (rawItems: AssetWithTotal[]) => - rawItems.map(({ total, ...item }) => item); - -/** - * get paginated list of assets - * @param offset - * @param limit - * @param filters - */ -export const getAssets = async ( - offset: number, - limit: number, - filters: AssetFilters = {}, -) => { - const rawItems: AssetWithTotal[] = await tokenRepository - .createQueryBuilder('te') - .leftJoin( - (queryBuilder) => - queryBuilder - .select(['bae.tokenId AS "tokenId"', 'sum(bae.amount) AS "bridged"']) - .from(bridgedAssetRepository.metadata.tableName, 'bae') - .groupBy('bae.tokenId'), - 'baeq', - 'baeq."tokenId" = te.id', - ) - .leftJoin( - (queryBuilder) => - queryBuilder - .select(['lae.tokenId AS "tokenId"', 'sum(lae.amount) AS "locked"']) - .from(lockedAssetRepository.metadata.tableName, 'lae') - .groupBy('lae.tokenId'), - 'laeq', - 'laeq."tokenId" = te.id', - ) - .select([ - 'id', - 'name', - 'decimal', - '"isNative"', - '"bridged"', - '"locked"', - 'chain', - 'count(*) over() AS total', - ]) - .where(filters) - .offset(offset) - .limit(limit) - .getRawMany(); - - const items = getItemsWithoutTotal(rawItems); - - return { - items, - total: rawItems[0]?.total ?? 0, - }; -}; 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..b1438109 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,7 @@ -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..93164ded 100644 --- a/apps/rosen/app/api/v1/assets/route.ts +++ b/apps/rosen/app/api/v1/assets/route.ts @@ -1,17 +1,11 @@ import { pick } from 'lodash-es'; -import assetService from './assets-service'; +import { getAllAssets } from '@/_backend/assets'; import withValidation from '../withValidation'; -import EventsValidations from './validations'; +import { validateGet } from './validations'; -import '../initialize-datasource-if-needed'; - -export const GET = withValidation(EventsValidations.GET, (value) => - assetService.getAssets( - value.offset, - value.limit, - pick(value, 'chain', 'name', 'id'), - ), +export const GET = withValidation(validateGet, (value) => + getAllAssets(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..0bf339c3 100644 --- a/apps/rosen/app/api/v1/assets/validations.ts +++ b/apps/rosen/app/api/v1/assets/validations.ts @@ -1,31 +1,28 @@ 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({ offset: Joi.number().min(0).default(0), 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), }); /** * 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/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), ); diff --git a/apps/rosen/app/assets/TableRow.tsx b/apps/rosen/app/assets/TableRow.tsx new file mode 100644 index 00000000..f74a1983 --- /dev/null +++ b/apps/rosen/app/assets/TableRow.tsx @@ -0,0 +1,414 @@ +import { AngleDown, AngleUp, OpenInNew } from '@rosen-bridge/icons'; +import { + Box, + Button, + CircularProgress, + Collapse, + Divider, + EnhancedTableCell, + IconButton, + Id, + Link, + Stack, + SvgIcon, + Table, + TableBody, + TableCell, + TableRow, +} from '@rosen-bridge/ui-kit'; +import { useState, FC, useMemo } from 'react'; +import useSWR from 'swr'; +import { fetcher } from '@rosen-ui/swr-helpers'; + +import { ApiAssetResponse, Assets } from '@/_types/api'; + +import { + getAddressUrl, + getDecimalString, + getTokenUrl, + getTxURL, +} from '@rosen-ui/utils'; +import { NETWORKS } from '@rosen-ui/constants'; + +interface RowProps extends Assets { + isLoading?: boolean; +} + +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 = [ + { + title: '', + cellProps: { + width: '40%', + }, + }, + { + title: '', + cellProps: { + width: '60%', + }, + }, +]; + +export const tabletHeader = [ + { + title: 'Name', + cellProps: { + width: 200, + align: 'left' as const, + }, + }, + { + title: 'Network', + cellProps: { + width: 150, + align: 'left' as const, + }, + }, + { + title: 'Locked', + cellProps: { + width: 150, + align: 'left' as const, + }, + }, + { + title: 'Hot', + cellProps: { + width: 150, + align: 'left' as const, + }, + }, + { + title: 'Cold', + cellProps: { + width: 150, + align: 'left' as const, + }, + }, + { + title: 'Bridged', + cellProps: { + width: 150, + align: 'left' as const, + }, + }, + { + title: '', + cellProps: { + width: 100, + align: 'left' as const, + }, + }, +]; + +export const MobileRow: FC = (props) => { + const { isLoading, ...row } = props; + + const [expand, setExpand] = useState(false); + + const [open, setOpen] = useState(false); + + const rowStyles = useMemo( + () => ({ + opacity: isLoading ? 0.3 : 1.0, + '& > td': { + border: 0, + padding: 1, + }, + }), + [isLoading], + ); + + const toggleExpand = () => { + 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 ( + <> + + Name + {row.name} + + + Network + {row.chain} + + + Locked + + {getDecimalString( + ((hot?.amount || 0) + (cold?.amount || 0)).toString(), + row.decimal, + )} + + + {expand && ( + <> + + Hot + + {getDecimalString(hot?.amount.toString() || '0', row.decimal)} + + + + Cold + + {getDecimalString(cold?.amount.toString() || '0', row.decimal)} + + + + + Bridged + + + {getDecimalString(row.bridged || '0', row.decimal)} + + + + )} + td': { + border: 0, + }, + }} + > + + + + + + ); +}; + +export const TabletRow: FC = (props) => { + const { isLoading, ...row } = props; + + const [expanded, setExpanded] = useState(false); + + const { data, isLoading: loading } = useSWR( + expanded ? `/v1/assets/detail/${row.id.toLowerCase()}` : null, + 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; + + const tokenUrl = + !row.isNative && + getTokenUrl( + row.chain, + row.chain == NETWORKS.CARDANO ? row.id.replace('.', '') : row.id, + ); + + return ( + <> + td': { border: 0 }, + }} + onClick={() => setExpanded(!open)} + > + + + {row.name} + {tokenUrl && ( + event.stopPropagation()} + > + + + + + )} + + + {row.chain} + + {getDecimalString( + ((hot?.amount || 0) + (cold?.amount || 0)).toString(), + row.significantDecimals, + )} + + + + + {getDecimalString( + hot?.amount.toString() || '0', + row.significantDecimals, + )} + + {hotUrl && ( + event.stopPropagation()} + > + + + + + )} + + + + + + {getDecimalString( + cold?.amount.toString() || '0', + row.significantDecimals, + )} + + {coldUrl && ( + event.stopPropagation()} + > + + + + + )} + + + + {getDecimalString(row.bridged || '0', row.significantDecimals)} + + + { + return theme.transitions.create('transform', { + duration: theme.transitions.duration.shortest, + }); + }, + }} + onClick={() => setExpanded(!open)} + > + {loading ? ( + + ) : ( + + + + )} + + + + + + + + {data && ( + + {data.bridged && ( + + + {data.bridged.map((item) => { + const tokenUrl = getTokenUrl( + item.chain, + item.chain == NETWORKS.CARDANO + ? item.birdgedTokenId.replace('.', '') + : item.birdgedTokenId, + ); + return ( + + {item.chain} + + {getDecimalString( + item.amount, + row.significantDecimals, + )} + + + + + {tokenUrl && ( + event.stopPropagation()} + > + + + + + )} + + + + ); + })} + +
+ )} +
+ )} +
+
+
+ + ); +}; 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 bc4be3e8..1ee41497 100644 --- a/apps/rosen/app/assets/page.tsx +++ b/apps/rosen/app/assets/page.tsx @@ -1,5 +1,191 @@ +/** + * TODO: Convert this page to SSR mode + * local:ergo/rosen-bridge/ui#307 + */ + 'use client'; -const Assets = () => null; +import { + Box, + EnhancedTable, + Grid, + MenuItem, + TablePaginationProps, + TextField, + Typography, + useTableDataPagination, +} from '@rosen-bridge/ui-kit'; +import { MouseEvent, useCallback, useMemo, useState } from 'react'; + +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: Network | 'all') => (offset: number, limit: number) => { + return [ + '/v1/assets', + { offset, limit, chain: chain == 'all' ? undefined : chain }, + ]; +}; + +export default function Page() { + 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); + }; + + 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: Assets) => , + [isLoading], + ); + + const renderTabletRow = useCallback( + (rowData: Assets) => , + [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, + ], + ); -export default Assets; + return ( + <> + + + ({ + mobile: theme.palette.secondary.light, + tablet: 'transparent', + })} + borderRadius={(theme) => + `${theme.shape.borderRadius}px ${theme.shape.borderRadius}px 0 0` + } + padding={{ mobile: 2, tablet: 0 }} + > + List of Locked Assets + + Showing {paginationProps.page * paginationProps.rowsPerPage + 1}{' '} + to{' '} + {isLastPage + ? paginationProps.count + : paginationProps.page * paginationProps.rowsPerPage + + paginationProps.rowsPerPage}{' '} + of {paginationProps.count} Entries{' '} + + + + + + All + {Object.keys(NETWORKS).map((key) => ( + + {NETWORK_LABELS[key as keyof typeof NETWORKS]} + + ))} + + + + {isFirstLoad && ( + + + + )} + {!isFirstLoad && data && ( + + )} + + ); +} diff --git a/apps/rosen/app/events/TableRow.tsx b/apps/rosen/app/events/TableRow.tsx index e6f4eb10..ae91ab3a 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'; @@ -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)} @@ -190,7 +191,10 @@ export const MobileRow: FC = (props) => { Amount - {getDecimalString(row.amount.toString(), row.lockToken.decimals)} + {getDecimalString( + row.amount.toString(), + row.lockToken.significantDecimals, + )} @@ -198,7 +202,7 @@ export const MobileRow: FC = (props) => { {getDecimalString( row.bridgeFee.toString(), - row.lockToken.decimals, + row.lockToken.significantDecimals, )} @@ -207,7 +211,7 @@ export const MobileRow: FC = (props) => { {getDecimalString( row.networkFee.toString(), - row.lockToken.decimals, + row.lockToken.significantDecimals, )} @@ -267,11 +271,11 @@ export const TabletRow: FC = (props) => { )}
- {upperFirst(row.fromChain)} + {upperFirst(row.fromChain as Network)} - {upperFirst(row.toChain)} + {upperFirst(row.toChain as Network)} {row.height} @@ -283,13 +287,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()} diff --git a/apps/rosen/app/events/page.tsx b/apps/rosen/app/events/page.tsx index 88c2eb3f..29f5e300 100644 --- a/apps/rosen/app/events/page.tsx +++ b/apps/rosen/app/events/page.tsx @@ -1,3 +1,8 @@ +/** + * TODO: Convert this page to SSR mode + * local:ergo/rosen-bridge/ui#307 + */ + 'use client'; import { MouseEvent, useCallback, useMemo } from 'react'; 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} ); 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 a4e04b08..cb86390a 100644 --- a/apps/rosen/next.config.js +++ b/apps/rosen/next.config.js @@ -1,6 +1,14 @@ /** @type {import('next').NextConfig} */ + 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: [ 'ergo-lib-wasm-nodejs', '@emurgo/cardano-serialization-lib-nodejs', diff --git a/apps/rosen/package.json b/apps/rosen/package.json index 1d1f761f..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", @@ -11,38 +11,39 @@ "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", "@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", "@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/tokens": "^1.0.0", - "@rosen-bridge/watcher-data-extractor": "^4.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": "^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.3.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/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/.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 diff --git a/apps/watcher/CHANGELOG.md b/apps/watcher/CHANGELOG.md index ec4c07d5..ec346444 100644 --- a/apps/watcher/CHANGELOG.md +++ b/apps/watcher/CHANGELOG.md @@ -1,5 +1,33 @@ # @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 + +- 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 + - @rosen-bridge/ui-kit@1.2.0 + - @rosen-ui/utils@0.4.0 + ## 2.2.1 ### Patch Changes diff --git a/apps/watcher/README.md b/apps/watcher/README.md index bbaf0ab4..cdfd1de1 100644 --- a/apps/watcher/README.md +++ b/apps/watcher/README.md @@ -1 +1,27 @@ -# 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 + ./build.sh + cd apps/watcher + ``` +4. **Launch the App** + ```bash + npm run dev + ``` diff --git a/apps/watcher/app/(home)/@infoWidgets/InfoWidgetCard.tsx b/apps/watcher/app/(home)/@infoWidgets/InfoWidgetCard.tsx index 4a671ad9..1a12ab33 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; @@ -41,9 +44,12 @@ const InfoWidgetCardBase = styled(Card)( opacity: 0.75, }, '& .value': { - fontSize: theme.typography.h2.fontSize, + 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,20 @@ const InfoWidgetCard = ({ ) : ( - {value} -   - {unit} +
+ {value} +   + {unit} +
+ {warning && ( + {warning}} + > + + + + + )}
)} {title} diff --git a/apps/watcher/app/(home)/@infoWidgets/page.tsx b/apps/watcher/app/(home)/@infoWidgets/page.tsx index ab75aa99..30d9aef1 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,20 @@ const InfoWidgets = () => { { } color="warning" - isLoading={isRsnTokenLoading} + isLoading={isRsnTokenLoading || isERsnTokenLoading} /> - {data?.health === 'Healthy' ? ( + {data?.health.status === 'Healthy' ? ( ) : ( @@ -183,10 +195,13 @@ const InfoWidgets = () => { } color={ data?.health - ? (healthStatusColorMap[data.health] as keyof AugmentedPalette) + ? (healthStatusColorMap[ + data.health.status + ] as keyof AugmentedPalette) : 'success' } isLoading={isInfoLoading} + warning={data?.health.trialErrors.join('\n')} /> diff --git a/apps/watcher/app/SideBar.tsx b/apps/watcher/app/SideBar.tsx index 23b42ee6..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 ?? '?'} ) : ( @@ -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/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/_hooks/useERsnToken.ts b/apps/watcher/app/_hooks/useERsnToken.ts new file mode 100644 index 00000000..010fa456 --- /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 ersn token info (if present) + */ +const useERsnToken = () => { + const { data: info, isLoading: isInfoLoading } = useSWR( + '/info', + fetcher, + ); + + const { token: eRsnToken, isLoading: isERsnInfoLoading } = useToken( + info?.eRsnTokenId, + ); + + return { + eRsnToken, + isLoading: isInfoLoading || isERsnInfoLoading, + }; +}; + +export default useERsnToken; diff --git a/apps/watcher/app/_mock/mockedData.ts b/apps/watcher/app/_mock/mockedData.ts index 36f5ec96..eea5aa6f 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'; @@ -24,8 +25,11 @@ const info: ApiInfoResponse = { rsn: 0, }, currentBalance: 150, - health: 'Unstable', - network: 'ergo', + health: { + status: 'Unstable', + trialErrors: [], + }, + network: NETWORKS.ERGO, permitsPerEvent: 1000, permitCount: { active: 20, @@ -33,7 +37,13 @@ const info: ApiInfoResponse = { }, rsnTokenId: '6c1526b2a5ef010edb622719d9d7fbde8437a39543547c3effbe72ad33504cf1', - version: '2.5.1', + eRsnTokenId: + '6c1526b2a5ef010edb622719d9d7fbde8437a39543547c3effbe72ad33504cf2', + versions: { + app: '', + contract: '', + tokensMap: '', + }, }; const addressAssets: ApiAddressAssetsResponse = { @@ -194,18 +204,24 @@ 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', }, { status: 'Broken', @@ -213,11 +229,14 @@ 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', + description: 'Ergo Node Sync Check Description', lastCheck: '2023-06-26T11:15:45.206Z', id: 'Ergo Node Sync Check', + title: 'Ergo Node Sync Check', }, { status: 'Broken', @@ -225,6 +244,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', }, ]; @@ -244,8 +264,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, @@ -278,8 +298,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', @@ -310,8 +330,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/_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/_types/api.ts b/apps/watcher/app/_types/api.ts index cd1700f4..ac65fd43 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 { @@ -18,10 +19,18 @@ export interface ApiInfoResponse { active: number; total: number; }; - health: 'Healthy' | 'Unstable' | 'Broken'; + health: { + status: 'Healthy' | 'Unstable' | 'Broken'; + trialErrors: string[]; + }; address: string; rsnTokenId: string; - version: string; + eRsnTokenId: string; + versions: { + app: string; + contract: string; + tokensMap: string; + }; } export type ApiAddressAssetsResponse = Paginated; @@ -68,8 +77,8 @@ export interface ApiPermitReturnResponse { export interface Observation { id: number; - fromChain: string; - toChain: string; + fromChain: Network; + toChain: Network; fromAddress: string; toAddress: string; height: number; @@ -93,8 +102,8 @@ export interface Revenue { permitTxId: string; eventId: string; lockHeight: number; - fromChain: string; - toChain: string; + fromChain: Network; + toChain: Network; fromAddress: string; toAddress: string; amount: string; @@ -119,8 +128,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/app/health/page.tsx b/apps/watcher/app/health/page.tsx index 430618b3..51cc0839 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, 1000); + } + + setChecking((checking) => checking.filter((item) => item != paramId)); + + const healthParamIndex = data!.findIndex( + (healthParam) => healthParam.id === paramId, + ); + openSnackbar(currentHealthParamInfo.title + ' 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/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} + +
+
+
+
+
+
diff --git a/apps/watcher/app/revenues/TableRow.tsx b/apps/watcher/app/revenues/TableRow.tsx index 151ff3cf..22d97c41 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,22 +139,38 @@ 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] + .map((info) => { + return getDecimalString( + info?.amount.toString() ?? '0', + info?.decimals ?? 0, + ); + }) + .reduce((sum, amount) => sum + parseFloat(amount), 0) + .toString(); + + return amount; }; 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)} ${ diff --git a/apps/watcher/package.json b/apps/watcher/package.json index 14a3c304..caeda276 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.4.0", "private": true, "scripts": { "prettify": "prettier --write . --ignore-path ./.gitignore", @@ -14,14 +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/ui-kit": "^1.1.2", - "@rosen-ui/common-hooks": "^0.1.0", "@rosen-bridge/shared-contexts": "^0.0.1", - "@rosen-ui/swr-helpers": "^0.1.0", + "@rosen-bridge/ui-kit": "^1.3.0", + "@rosen-ui/common-hooks": "^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.3.0", + "@rosen-ui/utils": "^0.4.1", "lodash-es": "^4.17.21", "moment": "^2.29.4", "next": "14.1.0", @@ -33,7 +34,7 @@ "swr": "^2.1.5" }, "devDependencies": { - "@rosen-ui/types": "^0.1.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/apps/rosen/build.sh b/build.sh similarity index 90% rename from apps/rosen/build.sh rename to build.sh index d266dc5d..f6d64ff1 100755 --- a/apps/rosen/build.sh +++ b/build.sh @@ -4,27 +4,23 @@ # 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/utils 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 networks/ethereum 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 npm run build --workspace wallets/nautilus-wallet npm run build --workspace wallets/xdefi-wallet - -cd apps/rosen - -npm run build 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 8044b0f1..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", @@ -13,10 +13,10 @@ "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", + "@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/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 cda14798..b3725e71 100644 --- a/networks/bitcoin/src/generateUnsignedTx.ts +++ b/networks/bitcoin/src/generateUnsignedTx.ts @@ -9,105 +9,114 @@ import { getFeeRatio, getMinimumMeaningfulSatoshi, } 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 - * @param lockAddress - * @param fromAddress - * @param amount - * @param opReturnData + * @param tokenMap * @returns */ -export const generateUnsignedTx = async ( - lockAddress: string, - fromAddress: string, - amount: bigint, - opReturnData: string -): Promise => { - // generate txBuilder - const psbt = new Psbt(); +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; - // generate OP_RETURN box - const opReturnPayment = payments.embed({ - data: [Buffer.from(opReturnData, 'hex')], - }); - psbt.addOutput({ - script: opReturnPayment.output!, - value: 0, - }); + // generate txBuilder + const psbt = new Psbt(); - // generate lock box - const lockPayment = payments.p2wpkh({ - address: lockAddress, - }); - psbt.addOutput({ - script: lockPayment.output!, - value: Number(amount), - }); + // 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); + // 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 - }` + // 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), - }, + // 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; + // 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), - }); + // 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, + return { + psbt: psbt.toBase64(), + inputSize: psbt.inputCount, + }; }; -}; diff --git a/networks/bitcoin/src/types.ts b/networks/bitcoin/src/types.ts index 79dbd2ac..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'; @@ -66,11 +67,12 @@ export interface UnsignedPsbtData { inputSize: number; } -export type WalletCreator = (config: WalletCreatorConfig) => Wallet | undefined; +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..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'); @@ -71,7 +72,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 +97,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..29bffe2c 100644 --- a/networks/bitcoin/unitTests/src/generateTx.test.ts +++ b/networks/bitcoin/unitTests/src/generateTx.test.ts @@ -1,6 +1,9 @@ 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'; +import { Network } from '@rosen-ui/types'; const testData = await vi.hoisted(async () => await import('./testData')); @@ -44,11 +47,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 +84,74 @@ describe('generateUnsignedTx', () => { ); }); + /** + * @target generateUnsignedTx should generate lock transaction with multi decimals token map 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 with multi decimals token map 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] as Network; + + 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 +170,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/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/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/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/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..6b0d3919 100644 --- a/networks/cardano/src/generateUnsignedTx.ts +++ b/networks/cardano/src/generateUnsignedTx.ts @@ -15,123 +15,126 @@ import { sumAssetBalance, walletUtxoToCardanoUtxo, } 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 - * @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 */ -export const generateUnsignedTx = async ( - walletUtxos: string[], - lockAddress: string, - changeAddressHex: string, - policyIdHex: string, - assetNameHex: string, - amountString: string, - auxiliaryDataHex: string -): Promise => { - const amount = BigInt(amountString); +export const generateUnsignedTx = + (tokenMap: TokenMap) => + async ( + walletUtxos: string[], + lockAddress: string, + changeAddressHex: string, + policyIdHex: string, + assetNameHex: string, + wrappedAmount: RosenAmountValue, + auxiliaryDataHex: string + ): Promise => { + const unwrappedAmount = tokenMap.unwrapAmount( + `${policyIdHex}.${assetNameHex}`, + wrappedAmount, + NETWORKS.CARDANO + ).amount; - // converts hex address to bech32 address - const changeAddress = wasm.Address.from_hex(changeAddressHex).to_bech32(); + // 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) - ); + 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 - ); + // 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, + 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); + // 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 - 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() + 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); + // 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); + // 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); + // set tx fee + txBuilder.set_fee(fee); - // build transaction - const txBody = txBuilder.build(); + // 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(); -}; + // 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/cardano/src/types.ts b/networks/cardano/src/types.ts index 2ceed70d..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'; @@ -19,12 +20,13 @@ export interface CardanoProtocolParams { export const ADA_POLICY_ID = ''; -export type WalletCreator = (config: WalletCreatorConfig) => Wallet | undefined; +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..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, @@ -130,6 +131,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 +169,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 +200,9 @@ export const sumAssetBalance = ( /** * converts CardanoUtxo assets to AssetBalance + * + * THIS FUNCTION WORKS WITH UNWRAPPED-VALUE + * * @param utxo * @returns */ @@ -207,6 +218,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 +269,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/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/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..ffdbac37 100644 --- a/networks/ergo/src/generateUnsignedTx.ts +++ b/networks/ergo/src/generateUnsignedTx.ts @@ -14,107 +14,110 @@ 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'; +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 */ -export const generateUnsignedTx = async ( - changeAddress: string, - walletUtxos: ErgoBoxProxy[], - lockAddress: string, - toChain: string, - toAddress: string, - tokenId: string, - amountString: string, - bridgeFeeString: string, - networkFeeString: string -): Promise => { - const height = await getHeight(); +export const generateUnsignedTx = + (tokenMap: TokenMap) => + async ( + changeAddress: string, + walletUtxos: ErgoBoxProxy[], + lockAddress: string, + toChain: Network, + toAddress: string, + wrappedAmount: RosenAmountValue, + bridgeFeeString: string, + networkFeeString: string, + token: RosenChainToken + ): Promise => { + const tokenId = token[tokenMap.getIdKey(NETWORKS.ERGO)]; + const unwrappedAmount = tokenMap.unwrapAmount( + tokenId, + wrappedAmount, + NETWORKS.ERGO + ).amount; - const amount = BigInt(amountString); - const bridgeFee = BigInt(bridgeFeeString); - const networkFee = BigInt(networkFeeString); + const height = await getHeight(); - // 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: [], - }); + const bridgeFee = BigInt(bridgeFeeString); + const networkFee = BigInt(networkFeeString); - // 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)) + // 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, + changeAddress, + bridgeFee, + networkFee ); - inputAssets = sumAssetBalance(inputAssets, getBoxAssets(box)); - }); + // calculate required assets to get input boxes + const requiredAssets = sumAssetBalance(lockAssets, { + nativeToken: minBoxValue + fee, + tokens: [], + }); - // 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 - ); + // 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)); + }); - const txOutputs = new wasm.ErgoBoxCandidates(lockBox); - txOutputs.add(changeBox); - txOutputs.add(feeBox); + // 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 unsignedTx = new wasm.UnsignedTransaction( - unsignedInputs, - new wasm.DataInputs(), - txOutputs - ); - return unsignedTransactionToProxy(unsignedTx, inputs.boxes); -}; + 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/ergo/src/types.ts b/networks/ergo/src/types.ts index 2d363f0f..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'; @@ -22,10 +23,11 @@ export interface CoveringBoxes { boxes: Array; } -export type WalletCreator = (config: WalletCreatorConfig) => Wallet | undefined; +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..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 @@ -20,7 +21,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 @@ -32,7 +33,7 @@ export const createLockBox = ( height: number, tokenId: string, amount: bigint, - toChain: string, + toChain: Network, toAddress: string, fromAddress: string, bridgeFee: bigint, @@ -75,6 +76,9 @@ export const createLockBox = ( /** * creates change box candidate + * + * THIS FUNCTION WORKS WITH UNWRAPPED VALUES + * * @param changeAddress * @param height * @param balance @@ -102,6 +106,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 +127,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 +211,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 +242,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 +293,9 @@ export const subtractAssetBalance = ( /** * calculates box assets + * + * THIS FUNCTION WORKS WITH UNWRAPPED VALUES + * * @param utxo * @returns */ 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..69460a34 --- /dev/null +++ b/networks/ethereum/CHANGELOG.md @@ -0,0 +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/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..36a9cc37 --- /dev/null +++ b/networks/ethereum/package.json @@ -0,0 +1,28 @@ +{ + "name": "@rosen-network/ethereum", + "version": "0.1.1", + "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-bridge/address-codec": "^0.3.0", + "@rosen-bridge/tokens": "^1.2.1", + "@rosen-ui/wallet-api": "^1.0.3", + "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/constants.ts b/networks/ethereum/src/constants.ts new file mode 100644 index 00000000..25889678 --- /dev/null +++ b/networks/ethereum/src/constants.ts @@ -0,0 +1,72 @@ +import { InterfaceAbi } from 'ethers'; + +export const ETH = 'eth'; +export const ETH_TRANSFER_GAS = 21000n; + +export const transferABI: InterfaceAbi = [ + { + constant: false, + inputs: [ + { + name: '_to', + type: 'address', + }, + { + name: '_value', + type: 'uint256', + }, + ], + name: 'transfer', + outputs: [], + payable: false, + stateMutability: 'nonpayable', + 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/networks/ethereum/src/generateTxParameters.ts b/networks/ethereum/src/generateTxParameters.ts new file mode 100644 index 00000000..936d5a2e --- /dev/null +++ b/networks/ethereum/src/generateTxParameters.ts @@ -0,0 +1,51 @@ +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 tokenMap + * @returns + */ +export const generateTxParameters = + (tokenMap: TokenMap) => + async ( + 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; + + 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; + }; diff --git a/networks/ethereum/src/index.ts b/networks/ethereum/src/index.ts new file mode 100644 index 00000000..584557bb --- /dev/null +++ b/networks/ethereum/src/index.ts @@ -0,0 +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 new file mode 100644 index 00000000..7781ce8c --- /dev/null +++ b/networks/ethereum/src/types.ts @@ -0,0 +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 new file mode 100644 index 00000000..5813aa73 --- /dev/null +++ b/networks/ethereum/src/utils.ts @@ -0,0 +1,70 @@ +import { FeeData, isAddress, JsonRpcProvider } from 'ethers'; +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 + * @param toChain + * @param toAddress + * @param fromAddress + * @param networkFee + * @param bridgeFee + * @returns + */ +export const generateLockData = async ( + toChain: Network, + toAddress: string, + networkFee: string, + bridgeFee: string +): Promise => { + // parse toChain + 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'); + + // 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 ( + toChainHex + bridgeFeeHex + networkFeeHex + addressLengthCode + addressHex + ); +}; + +/** + * gets Ethereum current block height + * @returns + */ +export const getHeight = async (): Promise => { + return await new JsonRpcProvider( + process.env.ETHEREUM_BLAST_API + ).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 + * @returns + */ +export const isValidAddress = (addr: string) => { + return isAddress(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"] +} diff --git a/package-lock.json b/package-lock.json index 7b6b2e8e..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.1.2", - "@rosen-ui/constants": "^0.0.3", - "@rosen-ui/swr-helpers": "^0.1.0", - "@rosen-ui/utils": "^0.3.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.1.0", + "@rosen-ui/types": "^0.3.0", "@tauri-apps/cli": "^1.4.0", "@types/moment": "^2.13.0", "@types/node": "20.2.5", @@ -78,37 +78,38 @@ }, "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", + "@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", "@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/tokens": "^1.0.0", - "@rosen-bridge/watcher-data-extractor": "^4.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": "^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.3.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", @@ -138,17 +139,19 @@ }, "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.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", + "@rosen-ui/asset-calculator": "^2.0.0", "config": "^3.3.7" }, "devDependencies": { @@ -159,45 +162,6 @@ "typescript": "^5.0.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/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/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==", - "dependencies": { - "@rosen-bridge/abstract-extractor": "^0.1.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-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, @@ -219,45 +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/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, @@ -299,18 +229,19 @@ }, "apps/watcher": { "name": "@rosen-bridge/watcher-app", - "version": "2.2.1", + "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.1.2", + "@rosen-bridge/ui-kit": "^1.3.0", "@rosen-ui/common-hooks": "^0.1.0", - "@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.3.0", + "@rosen-ui/utils": "^0.4.1", "lodash-es": "^4.17.21", "moment": "^2.29.4", "next": "14.1.0", @@ -322,7 +253,7 @@ "swr": "^2.1.5" }, "devDependencies": { - "@rosen-ui/types": "^0.1.0", + "@rosen-ui/types": "^0.3.0", "@tauri-apps/cli": "^1.4.0", "@types/lodash-es": "^4.17.11", "@types/moment": "^2.13.0", @@ -353,12 +284,12 @@ }, "networks/bitcoin": { "name": "@rosen-network/bitcoin", - "version": "0.2.0", + "version": "1.0.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", + "@rosen-ui/constants": "^0.0.4", + "@rosen-ui/wallet-api": "^1.0.3", "axios": "^1.7.2", "bitcoinjs-lib": "^6.1.6" }, @@ -388,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", @@ -421,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": { @@ -451,6 +382,39 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "networks/ethereum": { + "name": "@rosen-network/ethereum", + "version": "0.1.1", + "dependencies": { + "@rosen-bridge/address-codec": "^0.3.0", + "@rosen-bridge/tokens": "^1.2.1", + "@rosen-ui/wallet-api": "^1.0.3", + "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, @@ -466,7 +430,6 @@ }, "node_modules/@ampproject/remapping": { "version": "2.2.1", - "dev": true, "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", @@ -516,56 +479,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", @@ -594,39 +528,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" }, @@ -636,63 +593,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" @@ -702,52 +768,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", @@ -759,12 +843,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" @@ -772,7 +858,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" }, @@ -782,7 +869,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", @@ -794,15 +882,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" }, @@ -810,1421 +902,1723 @@ "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_modules/@blockfrost/blockfrost-js/node_modules/@sindresorhus/is": { - "version": "4.6.0", - "license": "MIT", - "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@blockfrost/blockfrost-js/node_modules/cacheable-request": { - "version": "7.0.4", - "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": { - "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-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "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-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": { - "mimic-response": "^3.1.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-default-from": "^7.24.7" }, "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-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": { - "pump": "^3.0.0" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^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", + "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": { - "@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" + "@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": ">=10.19.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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", + "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": ">=8" + "node": ">=6.9.0" + }, + "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_modules/@changesets/cli/node_modules/jsonfile": { - "version": "4.0.0", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@changesets/cli/node_modules/p-limit": { - "version": "2.3.0", - "license": "MIT", + "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": { - "p-try": "^2.0.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "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-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": { + "@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": ">=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-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": ">= 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-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": { - "@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.7" + }, + "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-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": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@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-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": { + "@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/config/node_modules/universalify": { - "version": "0.1.2", - "license": "MIT", + "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": ">= 4.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/@changesets/errors": { - "version": "0.2.0", - "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": { - "extendable-error": "^0.1.5" + "@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": ">=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-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": { - "@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.7", + "@babel/template": "^7.24.7" + }, + "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-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": { - "color-convert": "^1.9.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/get-dependents-graph/node_modules/chalk": { - "version": "2.4.2", - "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": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.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/escape-string-regexp": { - "version": "1.0.5", - "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": { + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">=0.8.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/get-dependents-graph/node_modules/fs-extra": { - "version": "7.0.1", - "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": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.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-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": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "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-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": ">= 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-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/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.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "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-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/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.8", + "@babel/plugin-syntax-flow": "^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-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": { - "chalk": "^2.1.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/node_modules/ansi-styles": { - "version": "3.2.1", - "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": { - "color-convert": "^1.9.0" + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" }, "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-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": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.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/escape-string-regexp": { - "version": "1.0.5", - "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": { + "@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/parse": { - "version": "0.4.0", - "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": { - "@changesets/types": "^6.0.0", - "js-yaml": "^3.13.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "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-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": { - "sprintf-js": "~1.0.2" + "@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-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": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^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-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": { - "@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.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-simple-access": "^7.24.7" + }, + "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-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": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@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 <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/@changesets/pre/node_modules/universalify": { - "version": "0.1.2", - "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": { + "@babel/helper-module-transforms": "^7.24.7", + "@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-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/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-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/read/node_modules/ansi-styles": { - "version": "3.2.1", - "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": { - "color-convert": "^1.9.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/read/node_modules/chalk": { - "version": "2.4.2", - "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": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "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-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": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, "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-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": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.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": ">=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-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": ">=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-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": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, "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-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/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-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/write/node_modules/fs-extra": { - "version": "7.0.1", - "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": { - "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/write/node_modules/jsonfile": { - "version": "4.0.0", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "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/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/universalify": { - "version": "0.1.2", - "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": { + "@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": ">= 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-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": ">=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-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": { - "@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": { + "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": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@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": ">=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-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": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "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-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": { - "@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-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": { - "@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-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/hash": { - "version": "0.9.1", - "license": "MIT" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.1", - "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": { - "@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-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": { - "@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-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" }, - "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", - "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/@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/sheet": { - "version": "1.2.2", - "license": "MIT" - }, - "node_modules/@emotion/styled": { - "version": "11.11.0", - "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": { - "@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" }, - "peerDependencies": { - "@emotion/react": "^11.0.0-rc.0", - "react": ">=16.8.0" + "engines": { + "node": ">=6.9.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "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-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/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^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/@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": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@emurgo/cip14-js": { - "version": "3.0.1", - "license": "Apache-2.0 OR 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": { - "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-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" + }, "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-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": ">=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-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": { + "@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-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/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/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/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/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/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/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/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/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/@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/@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/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/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/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/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/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/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/@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-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/@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-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/@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-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/@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-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": { + "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-x64": { - "version": "0.18.20", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@blockfrost/blockfrost-js/node_modules/@sindresorhus/is": { + "version": "4.6.0", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?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" - ], + "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/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/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/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": ">=12" - } - }, - "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": ">=12" - } - }, - "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": ">=12" - } - }, - "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/get-stream": { + "version": "5.2.0", "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "pump": "^3.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8" }, - "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/blockfrost-js/node_modules/got": { + "version": "11.8.6", "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" + "@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.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10.19.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.23.0", - "dev": true, + "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", - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { "node": ">=8" + } + }, + "node_modules/@blockfrost/blockfrost-js/node_modules/mimic-response": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", + "node_modules/@blockfrost/blockfrost-js/node_modules/normalize-url": { + "version": "6.1.0", + "license": "MIT", "engines": { "node": ">=10" }, @@ -2232,229 +2626,252 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/js": { - "version": "8.42.0", - "dev": true, + "node_modules/@blockfrost/blockfrost-js/node_modules/p-cancelable": { + "version": "2.1.1", "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/@floating-ui/core": { - "version": "1.5.0", + "node_modules/@blockfrost/blockfrost-js/node_modules/responselike": { + "version": "2.0.1", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.1.3" + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@floating-ui/dom": { - "version": "1.5.3", + "node_modules/@blockfrost/openapi": { + "version": "0.1.60", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" + "ajv": "^8.11.2", + "cbor": "^8.1.0", + "yaml": "^2.2.1" } }, - "node_modules/@floating-ui/react-dom": { - "version": "2.0.4", + "node_modules/@blockfrost/openapi/node_modules/ajv": { + "version": "8.12.0", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.5.1" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@floating-ui/utils": { - "version": "0.1.6", + "node_modules/@blockfrost/openapi/node_modules/json-schema-traverse": { + "version": "1.0.0", "license": "MIT" }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "license": "MIT", - "optional": true - }, - "node_modules/@graphql-typed-document-node/core": { - "version": "3.2.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/@blockfrost/openapi/node_modules/yaml": { + "version": "2.3.4", + "license": "ISC", + "engines": { + "node": ">= 14" } }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "license": "BSD-3-Clause", + "node_modules/@cardano-ogmios/client": { + "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": { - "@hapi/hoek": "^9.0.0" + "@cardano-ogmios/schema": "6.8.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.5.10" + }, + "engines": { + "node": ">=14" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, + "node_modules/@cardano-ogmios/schema": { + "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": ">=10.10.0" + "node": ">=14" } }, - "node_modules/@humanwhocodes/module-importer": { + "node_modules/@cardanosolutions/json-bigint": { "version": "1.0.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "resolved": "https://registry.npmjs.org/@cardanosolutions/json-bigint/-/json-bigint-1.0.1.tgz", + "integrity": "sha512-mbYL6jtHqMFCZnTFhmkmoeDzHMBino0gMiGQnOJE7CwzZzkK2HCpH0MTBk+84QDadMEGX7iFt7uB+levm1a+bQ==", + "dependencies": { + "bignumber.js": "^9.0.0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "dev": true, - "license": "BSD-3-Clause" + "node_modules/@cbor-extract/cbor-extract-linux-x64": { + "version": "2.2.0", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "license": "ISC", + "node_modules/@changesets/apply-release-plan": { + "version": "7.0.0", + "license": "MIT", "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": ">=12" + "@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/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", + "node_modules/@changesets/apply-release-plan/node_modules/fs-extra": { + "version": "7.0.1", "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=6 <7 || >=8" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", + "node_modules/@changesets/apply-release-plan/node_modules/jsonfile": { + "version": "4.0.0", "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "dev": true, + "node_modules/@changesets/apply-release-plan/node_modules/resolve-from": { + "version": "5.0.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" - }, + "node_modules/@changesets/apply-release-plan/node_modules/universalify": { + "version": "0.1.2", + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 4.0.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "dev": true, + "node_modules/@changesets/assemble-release-plan": { + "version": "6.0.0", "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "@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/@jridgewell/resolve-uri": { - "version": "3.1.1", - "devOptional": true, + "node_modules/@changesets/changelog-git": { + "version": "0.2.0", "license": "MIT", - "engines": { - "node": ">=6.0.0" + "dependencies": { + "@changesets/types": "^6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "dev": true, + "node_modules/@changesets/cli": { + "version": "2.27.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" + "@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" + }, + "bin": { + "changeset": "bin.js" } }, - "node_modules/@manypkg/find-root": { - "version": "1.1.0", + "node_modules/@changesets/cli/node_modules/ansi-styles": { + "version": "3.2.1", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.5.5", - "@types/node": "^12.7.1", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0" + "color-convert": "^1.9.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/chalk": { + "version": "2.4.2", "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/@manypkg/find-root/node_modules/fs-extra": { - "version": "8.1.0", + "node_modules/@changesets/cli/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.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" }, @@ -2462,24 +2879,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": { @@ -2492,44 +2899,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" }, @@ -2537,6324 +2938,12701 @@ "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" + "node": ">=4" + } + }, + "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" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "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/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" } }, - "node_modules/@microsoft/api-extractor": { - "version": "7.38.3", - "dev": true, + "node_modules/@changesets/get-dependents-graph/node_modules/fs-extra": { + "version": "7.0.1", "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" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, - "bin": { - "api-extractor": "bin/api-extractor" + "engines": { + "node": ">=6 <7 || >=8" } }, - "node_modules/@microsoft/api-extractor-model": { - "version": "7.28.2", - "dev": true, + "node_modules/@changesets/get-dependents-graph/node_modules/jsonfile": { + "version": "4.0.0", "license": "MIT", - "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.61.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@microsoft/api-extractor/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/@changesets/get-dependents-graph/node_modules/universalify": { + "version": "0.1.2", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 4.0.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/@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/@microsoft/tsdoc": { - "version": "0.14.2", - "dev": true, + "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" + "node": ">=4" + } + }, + "node_modules/@changesets/logger/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/@mui/core-downloads-tracker": { - "version": "5.14.18", + "node_modules/@changesets/logger/node_modules/escape-string-regexp": { + "version": "1.0.5", "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" + "engines": { + "node": ">=0.8.0" } }, - "node_modules/@mui/lab": { - "version": "5.0.0-alpha.153", + "node_modules/@changesets/parse": { + "version": "0.4.0", "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 - } + "@changesets/types": "^6.0.0", + "js-yaml": "^3.13.1" } }, - "node_modules/@mui/material": { - "version": "5.14.18", + "node_modules/@changesets/parse/node_modules/argparse": { + "version": "1.0.10", "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" + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@changesets/parse/node_modules/js-yaml": { + "version": "3.14.1", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@mui/private-theming": { - "version": "5.14.18", + "node_modules/@changesets/pre": { + "version": "2.0.0", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.2", - "@mui/utils": "^5.14.18", - "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": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node": ">=6 <7 || >=8" } }, - "node_modules/@mui/styled-engine": { - "version": "5.14.18", + "node_modules/@changesets/pre/node_modules/jsonfile": { + "version": "4.0.0", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "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", - "@emotion/cache": "^11.11.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1" + "@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": { - "@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": ">=4" } }, - "node_modules/@mui/system": { - "version": "5.14.18", + "node_modules/@changesets/read/node_modules/chalk": { + "version": "2.4.2", "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" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.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": ">=4" } }, - "node_modules/@mui/types": { - "version": "7.2.9", + "node_modules/@changesets/read/node_modules/escape-string-regexp": { + "version": "1.0.5", "license": "MIT", - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": ">=0.8.0" } }, - "node_modules/@mui/utils": { - "version": "5.14.18", + "node_modules/@changesets/read/node_modules/fs-extra": { + "version": "7.0.1", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.2", - "@types/prop-types": "^15.7.10", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" + "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": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node": ">=6 <7 || >=8" } }, - "node_modules/@napi-rs/snappy-linux-x64-gnu": { - "version": "7.2.2", - "cpu": [ - "x64" - ], + "node_modules/@changesets/read/node_modules/jsonfile": { + "version": "4.0.0", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@napi-rs/snappy-linux-x64-musl": { - "version": "7.2.2", - "cpu": [ - "x64" - ], + "node_modules/@changesets/read/node_modules/universalify": { + "version": "0.1.2", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10" + "node": ">= 4.0.0" } }, - "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/types": { + "version": "6.0.0", + "license": "MIT" }, - "node_modules/@next/eslint-plugin-next": { - "version": "14.0.3", - "dev": true, + "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==", + "node_modules/@changesets/write/node_modules/jsonfile": { + "version": "4.0.0", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@changesets/write/node_modules/universalify": { + "version": "0.1.2", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "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": [ - "darwin" + "aix" ], "engines": { - "node": ">= 10" + "node": ">=12" } }, - "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==", + "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": [ - "arm64" + "arm" ], + "dev": true, "optional": true, "os": [ - "linux" + "android" ], "engines": { - "node": ">= 10" + "node": ">=12" } }, - "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==", + "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": [ - "linux" + "android" ], "engines": { - "node": ">= 10" + "node": ">=12" } }, - "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/@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": [ - "linux" + "android" ], "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/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": [ - "linux" + "darwin" ], "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/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": [ - "arm64" + "x64" ], + "dev": true, "optional": true, "os": [ - "win32" + "darwin" ], "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/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": [ - "ia32" + "arm64" ], + "dev": true, "optional": true, "os": [ - "win32" + "freebsd" ], "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/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": [ - "win32" + "freebsd" ], "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": ">=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/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/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/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/@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-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": ">= 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/@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-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.stat": { - "version": "2.0.5", - "license": "MIT", + "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/@nodelib/fs.walk": { - "version": "1.2.8", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "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" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/@npmcli/fs": { - "version": "1.1.1", - "license": "ISC", + "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": { - "@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-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, - "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", + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", "optional": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">=12" } }, - "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" - }, + "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": { - "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/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" + "node": ">=12" } }, - "node_modules/@octokit/auth-app/node_modules/lru-cache": { - "version": "9.1.2", - "license": "ISC", + "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 || >=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/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-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-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-oauth-user": { - "version": "2.1.2", + "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, "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" + "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/auth-token": { - "version": "3.0.4", + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "dev": true, "license": "MIT", "engines": { - "node": ">= 14" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@octokit/auth-unauthenticated": { - "version": "3.0.5", + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "dev": true, "license": "MIT", "dependencies": { - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.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/core": { - "version": "4.2.4", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.23.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" + "type-fest": "^0.20.2" }, "engines": { - "node": ">= 14" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@octokit/endpoint": { - "version": "7.0.6", + "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/@eslint/js": { + "version": "8.42.0", + "dev": true, "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "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/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.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/graphql": { - "version": "5.0.6", - "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/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" + "@ethereumjs/common": "^3.2.0", + "@ethereumjs/rlp": "^4.0.1", + "@ethereumjs/util": "^8.1.0", + "ethereum-cryptography": "^2.0.0" }, "engines": { - "node": ">= 14" + "node": ">=14" } }, - "node_modules/@octokit/oauth-app": { - "version": "4.2.4", - "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/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" + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" }, "engines": { - "node": ">= 14" + "node": ">=14" } }, - "node_modules/@octokit/oauth-authorization-url": { - "version": "5.0.0", + "node_modules/@floating-ui/core": { + "version": "1.5.0", "license": "MIT", - "engines": { - "node": ">= 14" + "dependencies": { + "@floating-ui/utils": "^0.1.3" } }, - "node_modules/@octokit/oauth-methods": { - "version": "2.0.6", + "node_modules/@floating-ui/dom": { + "version": "1.5.3", "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" + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.5.1" }, - "engines": { - "node": ">= 14" + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@octokit/openapi-types": { - "version": "18.1.1", + "node_modules/@floating-ui/utils": { + "version": "0.1.6", "license": "MIT" }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.1.2", + "node_modules/@gar/promisify": { + "version": "1.1.3", + "license": "MIT", + "optional": true + }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.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": { - "@octokit/tsconfig": "^1.0.2", - "@octokit/types": "^9.2.3" + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">= 14" + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" }, - "peerDependencies": { - "@octokit/core": ">=4" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "7.2.3", - "license": "MIT", + "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": { - "@octokit/types": "^10.0.0" + "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" - }, - "peerDependencies": { - "@octokit/core": ">=3" + "node": ">=12" } }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "10.0.0", + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@octokit/plugin-retry": { - "version": "4.1.6", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", "license": "MIT", "dependencies": { - "@octokit/types": "^9.0.0", - "bottleneck": "^2.15.3" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">= 14" + "node": ">=12" }, - "peerDependencies": { - "@octokit/core": ">=3" + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@octokit/plugin-throttling": { - "version": "5.2.3", + "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/@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": { - "@octokit/types": "^9.0.0", - "bottleneck": "^2.15.3" + "@jest/types": "^29.6.3" }, "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": "^4.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@octokit/request": { - "version": "6.2.8", - "license": "MIT", + "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": { - "@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" + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" }, "engines": { - "node": ">= 14" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@octokit/request-error": { - "version": "3.0.3", - "license": "MIT", + "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": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "@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" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@octokit/tsconfig": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/@octokit/types": { - "version": "9.3.2", - "license": "MIT", + "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": { - "@octokit/openapi-types": "^18.0.0" + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@octokit/webhooks": { - "version": "10.9.2", - "license": "MIT", + "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": { - "@octokit/request-error": "^3.0.0", - "@octokit/webhooks-methods": "^3.0.0", - "@octokit/webhooks-types": "6.11.0", - "aggregate-error": "^3.1.0" + "@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" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@octokit/webhooks-methods": { - "version": "3.0.3", - "license": "MIT", + "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": ">= 14" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@octokit/webhooks-types": { - "version": "6.11.0", - "license": "MIT" - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "license": "MIT", - "optional": true, + "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": ">=14" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" + "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/@protobufjs/aspromise": { - "version": "1.1.2", - "license": "BSD-3-Clause" + "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/@protobufjs/base64": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "license": "BSD-3-Clause" + "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/@protobufjs/eventemitter": { - "version": "1.1.0", - "license": "BSD-3-Clause" + "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/@protobufjs/fetch": { - "version": "1.1.0", - "license": "BSD-3-Clause", + "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": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "@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/@protobufjs/float": { - "version": "1.0.2", - "license": "BSD-3-Clause" + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "license": "BSD-3-Clause" + "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/@protobufjs/path": { - "version": "1.1.2", - "license": "BSD-3-Clause" + "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/@protobufjs/pool": { - "version": "1.1.0", - "license": "BSD-3-Clause" + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "license": "MIT" }, - "node_modules/@protobufjs/utf8": { + "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": "BSD-3-Clause" + "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/@rollup/pluginutils": { - "version": "5.0.5", - "dev": true, + "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": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + "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" }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "engines": { + "node": ">=6 <7 || >=8" } }, - "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/@manypkg/find-root/node_modules/jsonfile": { + "version": "4.0.0", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } }, - "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" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] + "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/@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/@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/@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/@manypkg/find-root/node_modules/p-locate": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } }, - "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/@manypkg/find-root/node_modules/universalify": { + "version": "0.1.2", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } }, - "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/@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/@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/@manypkg/get-packages/node_modules/@changesets/types": { + "version": "4.1.0", + "license": "MIT" }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.14.0", + "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" + ], + "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" + "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.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-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/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.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" + } + }, + "node_modules/@rosen-bridge/bitcoin-esplora-scanner": { + "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.1.3", + "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": "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.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-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.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.1.3", + "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==", + "license": "GPL-3.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==", + "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/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-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-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.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" + } + }, + "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/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": "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.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/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": "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.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/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.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.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", + "@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": "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/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" + } + }, + "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/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.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" + } + }, + "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, - "optional": true, - "os": [ - "linux" - ] + "license": "MIT" }, - "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/@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, - "optional": true, - "os": [ - "linux" - ] + "license": "MIT" }, - "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/@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, - "optional": true, - "os": [ - "linux" - ] + "license": "MIT" }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.6", - "cpu": [ - "x64" - ], + "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, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "license": "MIT" }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.6", - "cpu": [ - "x64" - ], + "node_modules/@types/json5": { + "version": "0.0.29", "dev": true, + "license": "MIT" + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.5", "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@types/node": "*" + } }, - "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/@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, - "optional": true, - "os": [ - "win32" - ] + "license": "MIT", + "dependencies": { + "moment": "*" + } }, - "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/@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, - "optional": true, - "os": [ - "win32" - ] + "license": "MIT", + "dependencies": { + "@types/react": "*" + } }, - "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/@types/react-dom": { + "version": "18.2.4", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "license": "MIT", + "dependencies": { + "@types/react": "*" + } }, - "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/@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": { - "@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" + "@types/yargs-parser": "*" } }, - "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/@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/@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/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "dev": true, + "license": "MIT", "dependencies": { - "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0", - "bitcoinjs-lib": "^6.1.5", - "ergo-lib-wasm-nodejs": "^0.24.1" + "@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": ">=20.11.0" + "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/@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/@typescript-eslint/parser": { + "version": "5.62.0", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/scanner": "^4.0.0", - "axios": "^1.6.8" + "@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": ">=20.11.0" + "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/@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==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "dev": true, + "license": "MIT", "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" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { - "node": ">=20.11.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "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/@typescript-eslint/type-utils": { + "version": "5.62.0", + "dev": true, + "license": "MIT", "dependencies": { - "@rosen-bridge/abstract-logger": "^1.0.0", - "@rosen-bridge/scanner": "^4.0.0", - "axios": "^1.6.8" + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=20.11.0" + "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/@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/@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/@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/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@rosen-bridge/abstract-logger": "^1.0.0" + "@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": ">=20.11.0" + "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/@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/@typescript-eslint/utils": { + "version": "5.62.0", + "dev": true, + "license": "MIT", "dependencies": { - "@rosen-bridge/abstract-logger": "^1.0.0" + "@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/@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", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", "dev": true, - "license": "GPL-3.0", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, "engines": { - "node": ">=20.11.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "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/@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==", "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" + "@upstash/redis": "^1.28.3" }, - "bin": { - "cli": "dist/bin/index.js" + "engines": { + "node": ">=16.0.0" } }, - "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/@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": { - "@rosen-bridge/abstract-logger": "^0.3.0" - }, - "engines": { - "node": ">=18.12.0" + "@upstash/core-analytics": "^0.0.9" } }, - "node_modules/@rosen-bridge/extended-typeorm": { - "version": "0.0.1", - "license": "GPL-3.0", + "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": { - "async-mutex": "^0.4.0", - "typeorm": "^0.3.12" - }, - "peerDependencies": { - "sqlite3": "^5.1.6" + "crypto-js": "^4.2.0" } }, - "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", + "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": { - "json-bigint": "^1.0.0" + "@upstash/redis": "^1.31.3" }, "engines": { - "node": ">=18.12.0" + "node": ">=14.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/@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, "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" + "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" }, - "engines": { - "node": ">=18.16.1" + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.4.0" } }, - "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==", + "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, "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" + "@vitest/spy": "1.4.0", + "@vitest/utils": "1.4.0", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "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==", + "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, "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" + "@vitest/utils": "1.4.0", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "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/@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": { - "@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" + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@rosen-bridge/scanner/node_modules/@rosen-bridge/abstract-logger": { + "node_modules/@vitest/runner/node_modules/yocto-queue": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/abstract-logger/-/abstract-logger-1.0.0.tgz", - "integrity": "sha512-hN/cb0HSlhqvaEjqzFPZGIYOa70gdPd+mYrS5C7uNrv1Vw6k2k4lY4US05rwBENjSQpwik1H4gdCBzUkbCcjGA==" + "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/@rosen-bridge/scanner/node_modules/cross-fetch": { - "version": "4.0.0", - "license": "MIT", + "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, "dependencies": { - "node-fetch": "^2.6.12" + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@rosen-bridge/shared-contexts": { - "resolved": "packages/shared-contexts", - "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==" - }, - "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==", + "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, "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" + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" } }, - "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/@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, "dependencies": { - "download": "^8.0.0", - "octokit": "^2.0.14" + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "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/@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, "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" + "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/@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==", + "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, "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" + "@types/estree": "^1.0.0" } }, - "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/@wry/caches": { + "version": "1.0.1", + "license": "MIT", "dependencies": { - "node-fetch": "^2.6.12" + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@rosen-bridge/winston-logger": { - "version": "0.2.1", - "license": "GPL-3.0", + "node_modules/@wry/context": { + "version": "0.7.4", + "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" + "tslib": "^2.3.0" }, "engines": { - "node": ">=18.12.0" + "node": ">=8" } }, - "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==", + "node_modules/@wry/equality": { + "version": "0.5.7", + "license": "MIT", "dependencies": { - "axios": "^1.6.8", - "json-bigint": "^1.0.0" + "tslib": "^2.3.0" }, "engines": { - "node": ">=18.11.0" + "node": ">=8" } }, - "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/@wry/trie": { + "version": "0.5.0", + "license": "MIT", "dependencies": { - "@rosen-clients/axios": "^0.1.0" + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@rosen-clients/ergo-explorer": { + "node_modules/@yr/monotone-cubic-spline": { + "version": "1.0.3", + "license": "MIT", + "peer": true + }, + "node_modules/abbrev": { "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==", + "license": "ISC" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dependencies": { - "@rosen-clients/axios": "^0.1.0" + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" } }, - "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/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-clients/axios": "^0.1.0" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" } }, - "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-ui/asset-calculator": { - "resolved": "packages/asset-calculator", - "link": true + "node_modules/acorn": { + "version": "8.11.3", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } }, - "node_modules/@rosen-ui/common-hooks": { - "resolved": "packages/common-hooks", - "link": true + "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/@rosen-ui/constants": { - "resolved": "packages/constants", - "link": true + "node_modules/acorn-walk": { + "version": "8.3.2", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } }, - "node_modules/@rosen-ui/eternl-wallet": { - "resolved": "wallets/eternl-wallet", - "link": true + "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/@rosen-ui/flint-wallet": { - "resolved": "wallets/flint-wallet", - "link": true + "node_modules/agent-base": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } }, - "node_modules/@rosen-ui/lace-wallet": { - "resolved": "wallets/lace-wallet", - "link": true + "node_modules/agentkeepalive": { + "version": "4.5.0", + "license": "MIT", + "optional": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } }, - "node_modules/@rosen-ui/nami-wallet": { - "resolved": "wallets/nami-wallet", - "link": true + "node_modules/aggregate-error": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/@rosen-ui/nautilus-wallet": { - "resolved": "wallets/nautilus-wallet", - "link": true + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "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" + } }, - "node_modules/@rosen-ui/swr-helpers": { - "resolved": "packages/swr-helpers", - "link": true + "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-ui/swr-mock": { - "resolved": "packages/swr-mock", - "link": true + "node_modules/ansi-colors": { + "version": "4.1.3", + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/@rosen-ui/types": { - "resolved": "packages/types", - "link": true + "node_modules/ansi-escapes": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/@rosen-ui/utils": { - "resolved": "packages/utils", - "link": true + "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": { + "colorette": "^1.0.7", + "slice-ansi": "^2.0.0", + "strip-ansi": "^5.0.0" + } }, - "node_modules/@rosen-ui/vespr-wallet": { - "resolved": "wallets/vespr-wallet", - "link": true + "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": ">=6" + } }, - "node_modules/@rosen-ui/wallet-api": { - "resolved": "wallets/wallet-api", - "link": true + "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": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/@rosen-ui/xdefi-wallet": { - "resolved": "wallets/xdefi-wallet", - "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/@rushstack/eslint-patch": { - "version": "1.5.1", - "dev": true, - "license": "MIT" + "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/@rushstack/node-core-library": { - "version": "3.61.0", - "dev": true, - "license": "MIT", + "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": { - "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": "*" + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "engines": { + "node": ">=6" } }, - "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { - "version": "7.0.1", - "dev": true, - "license": "MIT", + "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": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "ansi-regex": "^4.1.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=6" } }, - "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { - "version": "4.0.0", - "dev": true, + "node_modules/ansi-regex": { + "version": "5.0.1", "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=8" } }, - "node_modules/@rushstack/node-core-library/node_modules/universalify": { - "version": "0.1.2", - "dev": true, + "node_modules/ansi-styles": { + "version": "6.2.1", "license": "MIT", "engines": { - "node": ">= 4.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@rushstack/rig-package": { - "version": "0.5.1", - "dev": true, - "license": "MIT", + "node_modules/any-promise": { + "version": "1.3.0", + "license": "MIT" + }, + "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": { - "resolve": "~1.22.1", - "strip-json-comments": "~3.1.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@rushstack/ts-command-line": { - "version": "4.17.1", - "dev": true, + "node_modules/apexcharts": { + "version": "3.44.0", "license": "MIT", + "peer": true, "dependencies": { - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "colors": "~1.2.1", - "string-argv": "~0.3.1" + "@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/@rushstack/ts-command-line/node_modules/argparse": { - "version": "1.0.10", - "dev": true, + "node_modules/app-root-path": { + "version": "3.1.0", "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" + "engines": { + "node": ">= 6.0.0" } }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "license": "BSD-3-Clause", + "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": { - "@hapi/hoek": "^9.0.0" + "file-type": "^4.2.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "license": "BSD-3-Clause" + "node_modules/archive-type/node_modules/file-type": { + "version": "4.4.0", + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "node_modules/@sideway/pinpoint": { + "node_modules/are-we-there-yet": { "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==", - "dev": true + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/@sindresorhus/is": { - "version": "0.7.0", + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/@sqltools/formatter": { - "version": "1.2.5", + "node_modules/arg": { + "version": "4.1.3", + "devOptional": true, "license": "MIT" }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", + "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": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", "license": "MIT", - "engines": { - "node": ">=14" + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", + "node_modules/array-includes": { + "version": "3.1.7", "dev": true, "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" + }, "engines": { - "node": ">=14" + "node": ">= 0.4" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", + "node_modules/array-union": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", "dev": true, "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" + }, "engines": { - "node": ">=14" + "node": ">= 0.4" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "dev": true, + "node_modules/array.prototype.flat": { + "version": "1.3.2", "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": ">=14" + "node": ">= 0.4" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", "dev": true, "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": ">=14" + "node": ">= 0.4" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", + "node_modules/array.prototype.tosorted": { + "version": "1.1.2", "dev": true, "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "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" } }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "dev": 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": ">=14" + "node": ">= 0.4" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "dev": true, + "node_modules/arrify": { + "version": "1.0.1", "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=0.10.0" } }, - "node_modules/@svgr/babel-preset": { - "version": "8.1.0", + "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/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, - "license": "MIT", + "engines": { + "node": "*" + } + }, + "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": { - "@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" + "tslib": "^2.0.1" }, "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=4" } }, - "node_modules/@svgr/core": { - "version": "8.1.0", + "node_modules/ast-types-flow": { + "version": "0.0.8", "dev": true, + "license": "MIT" + }, + "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/async": { + "version": "3.2.5", + "license": "MIT" + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", "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": ">=0.12.0" } }, - "node_modules/@svgr/core/node_modules/cosmiconfig": { - "version": "8.3.6", - "dev": 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/async-mutex": { + "version": "0.4.0", "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 - } + "tslib": "^2.4.0" } }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", + "node_modules/asynciterator.prototype": { + "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - }, + "has-symbols": "^1.0.3" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "license": "MIT", "engines": { - "node": ">=14" + "node": ">= 0.4" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", + "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/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/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=10", + "npm": ">=6" + } + }, + "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": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" }, "peerDependencies": { - "@svgr/core": "*" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "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/@swc/helpers": { - "version": "0.5.2", - "license": "Apache-2.0", + "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": { - "tslib": "^2.4.0" + "@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/@szmarczak/http-timer": { - "version": "4.0.6", - "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": { - "defer-to-connect": "^2.0.0" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "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/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": { + "@babel/plugin-syntax-flow": "^7.12.1" } }, - "node_modules/@tauri-apps/cli-linux-x64-gnu": { - "version": "1.5.6", - "cpu": [ - "x64" + "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" + } ], - "dev": true, + "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/better-path-resolve": { + "version": "1.0.0", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "is-windows": "^1.0.0" + }, "engines": { - "node": ">= 10" + "node": ">=4" } }, - "node_modules/@tauri-apps/cli-linux-x64-musl": { - "version": "1.5.6", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/bignumber.js": { + "version": "9.1.2", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10" + "node": "*" } }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "license": "MIT", - "optional": true, + "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": ">= 6" + "node": ">=8.0.0" } }, - "node_modules/@ts-morph/common": { - "version": "0.19.0", - "dev": true, - "license": "MIT", + "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": { - "fast-glob": "^3.2.12", - "minimatch": "^7.4.3", - "mkdirp": "^2.1.6", - "path-browserify": "^1.0.1" + "@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" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@ts-morph/common/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, + "node_modules/bl": { + "version": "5.1.0", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/@ts-morph/common/node_modules/minimatch": { - "version": "7.4.6", - "dev": true, - "license": "ISC", + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 6" } }, - "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/blake2b": { + "version": "2.1.3", + "license": "ISC", + "dependencies": { + "blake2b-wasm": "^1.1.0", + "nanoassert": "^1.0.0" + } }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", + "node_modules/blake2b-wasm": { + "version": "1.1.7", "license": "MIT", "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" + "nanoassert": "^1.0.0" } }, - "node_modules/@types/config": { - "version": "0.0.41", - "dev": true, - "license": "MIT" - }, - "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/json-bigint": { - "version": "1.0.4", + "node_modules/blakejs": { + "version": "1.2.1", "license": "MIT" }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "dev": true, - "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/@types/json5": { - "version": "0.0.29", - "dev": true, + "node_modules/bottleneck": { + "version": "2.19.5", "license": "MIT" }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.5", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } + "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/@types/keyv": { - "version": "3.1.4", + "node_modules/brace-expansion": { + "version": "1.1.11", "license": "MIT", "dependencies": { - "@types/node": "*" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@types/lodash": { - "version": "4.14.201", - "license": "MIT" - }, - "node_modules/@types/lodash-es": { - "version": "4.17.11", + "node_modules/braces": { + "version": "3.0.2", "license": "MIT", "dependencies": { - "@types/lodash": "*" + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "license": "MIT" - }, - "node_modules/@types/moment": { - "version": "2.13.0", - "dev": true, + "node_modules/breakword": { + "version": "1.0.6", "license": "MIT", "dependencies": { - "moment": "*" + "wcwidth": "^1.0.1" } }, - "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/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, - "node_modules/@types/prop-types": { - "version": "15.7.10", - "license": "MIT" + "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": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } }, - "node_modules/@types/react": { - "version": "18.2.12", - "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": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "base-x": "^4.0.0" } }, - "node_modules/@types/react-copy-to-clipboard": { - "version": "5.0.7", - "dev": true, - "license": "MIT", + "node_modules/bs58check": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-3.0.1.tgz", + "integrity": "sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==", "dependencies": { - "@types/react": "*" + "@noble/hashes": "^1.2.0", + "bs58": "^5.0.0" } }, - "node_modules/@types/react-dom": { - "version": "18.2.4", - "dev": true, - "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": { - "@types/react": "*" + "node-int64": "^0.4.0" } }, - "node_modules/@types/react-transition-group": { - "version": "4.4.9", + "node_modules/btoa": { + "version": "1.2.1", + "license": "(MIT OR Apache-2.0)", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.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" + } + ], "license": "MIT", "dependencies": { - "@types/react": "*" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/@types/responselike": { - "version": "1.0.3", + "node_modules/buffer-alloc": { + "version": "1.2.0", "license": "MIT", "dependencies": { - "@types/node": "*" + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, - "node_modules/@types/scheduler": { - "version": "0.16.6", + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", "license": "MIT" }, - "node_modules/@types/semver": { - "version": "7.5.5", - "license": "MIT" + "node_modules/buffer-crc32": { + "version": "0.2.13", + "license": "MIT", + "engines": { + "node": "*" + } }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", + "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/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "dev": true, + "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": { - "@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": ">=4" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/bufferutil": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", + "hasInstallScript": true, "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" + "node-gyp-build": "^4.3.0" }, "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": ">=6.14.2" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "dev": true, - "license": "MIT", + "node_modules/busboy": { + "version": "1.6.0", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" + "streamsearch": "^1.1.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=10.16.0" } }, - "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" - }, + "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": "^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": ">= 0.8" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.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, - "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=8" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/cacache": { + "version": "15.3.0", + "license": "ISC", + "optional": true, "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" + "@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": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">= 10" } }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "dev": true, - "license": "MIT", + "node_modules/cacache/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "optional": true, "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" + "yallist": "^4.0.0" }, "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": ">=10" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "dev": true, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=10" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "dev": true, - "license": "ISC" + "node_modules/cacache/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC", + "optional": true }, - "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" - }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "license": "MIT", "engines": { - "node": ">=16.0.0" + "node": ">=10.6.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==", + "node_modules/cacheable-request": { + "version": "2.1.4", + "license": "MIT", "dependencies": { - "@upstash/core-analytics": "^0.0.9" + "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/@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/cacheable-request/node_modules/get-stream": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" } }, - "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/cacheable-request/node_modules/json-buffer": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/cacheable-request/node_modules/keyv": { + "version": "3.0.0", + "license": "MIT", "dependencies": { - "@upstash/redis": "^1.31.3" - }, + "json-buffer": "3.0.0" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "1.0.0", + "license": "MIT", "engines": { - "node": ">=14.6" + "node": ">=0.10.0" } }, - "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/call-bind": { + "version": "1.0.5", + "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" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "1.4.0" + "url": "https://github.com/sponsors/ljharb" } }, - "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/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": { - "@vitest/spy": "1.4.0", - "@vitest/utils": "1.4.0", - "chai": "^4.3.10" + "callsites": "^2.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=4" } }, - "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, - "dependencies": { - "@vitest/utils": "1.4.0", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "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/@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, + "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": { - "yocto-queue": "^1.0.0" + "caller-callsite": "^2.0.0" }, "engines": { - "node": ">=18" + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "license": "MIT", + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "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/camelcase-keys": { + "version": "6.2.2", + "license": "MIT", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, "engines": { - "node": ">=12.20" + "node": ">=8" }, "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, - "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", + "license": "MIT", + "engines": { + "node": ">=6" } }, - "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, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, + "node_modules/camelcase-keys/node_modules/quick-lru": { + "version": "4.0.1", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" } }, - "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/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/cbor": { + "version": "8.1.0", + "license": "MIT", "dependencies": { - "tinyspy": "^2.2.0" + "nofilter": "^3.1.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=12.19" } }, - "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/cbor-extract": { + "version": "2.2.0", + "hasInstallScript": true, + "license": "MIT", + "optional": true, "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" + "node-gyp-build-optional-packages": "5.1.1" }, - "funding": { - "url": "https://opencollective.com/vitest" + "bin": { + "download-cbor-prebuilds": "bin/download-prebuilds.js" + }, + "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/@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, - "dependencies": { - "@types/estree": "^1.0.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/@wry/caches": { - "version": "1.0.1", - "license": "MIT", + "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, "dependencies": { - "tslib": "^2.3.0" + "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": ">=8" + "node": ">=4" } }, - "node_modules/@wry/context": { - "version": "0.7.4", + "node_modules/chalk": { + "version": "5.3.0", "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, "engines": { - "node": ">=8" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@wry/equality": { - "version": "0.5.7", - "license": "MIT", + "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, "dependencies": { - "tslib": "^2.3.0" + "get-func-name": "^2.0.2" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/@wry/trie": { - "version": "0.5.0", - "license": "MIT", + "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": { - "tslib": "^2.3.0" + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0" + }, + "bin": { + "print-chrome-path": "bin/print-chrome-path.js" }, "engines": { - "node": ">=8" + "node": ">=12.13.0" } }, - "node_modules/@yr/monotone-cubic-spline": { - "version": "1.0.3", - "license": "MIT", - "peer": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "license": "ISC" + "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/acorn": { - "version": "8.11.3", - "devOptional": true, - "license": "MIT", + "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": { - "acorn": "bin/acorn" + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">=0.4.0" + "node": ">=10" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "dev": true, + "node_modules/ci-info": { + "version": "3.9.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "devOptional": true, + "node_modules/clean-stack": { + "version": "2.2.0", "license": "MIT", "engines": { - "node": ">=0.4.0" + "node": ">=6" } }, - "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", + "node_modules/cli-cursor": { + "version": "4.0.0", "license": "MIT", "dependencies": { - "debug": "4" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">= 6.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "license": "MIT", - "optional": true, + "node_modules/cli-highlight": { + "version": "2.1.11", + "license": "ISC", "dependencies": { - "humanize-ms": "^1.2.1" + "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" }, "engines": { - "node": ">= 8.0.0" + "node": ">=8.0.0", + "npm": ">=5.0.0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", + "node_modules/cli-highlight/node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "license": "MIT", - "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" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "license": "MIT", - "engines": { - "node": ">=6" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ansi-escapes": { - "version": "5.0.0", - "dev": true, + "node_modules/cli-highlight/node_modules/chalk": { + "version": "4.1.2", "license": "MIT", "dependencies": { - "type-fest": "^1.0.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" + "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/ansi-styles": { - "version": "6.2.1", + "node_modules/cli-highlight/node_modules/color-convert": { + "version": "2.0.1", "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "color-name": "~1.1.4" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=7.0.0" } }, - "node_modules/any-promise": { - "version": "1.3.0", + "node_modules/cli-highlight/node_modules/color-name": { + "version": "1.1.4", "license": "MIT" }, - "node_modules/apexcharts": { - "version": "3.44.0", + "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", - "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" + "engines": { + "node": ">=8" } }, - "node_modules/app-root-path": { - "version": "3.1.0", + "node_modules/cli-highlight/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", "license": "MIT", "engines": { - "node": ">= 6.0.0" + "node": ">=8" } }, - "node_modules/aproba": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/archive-type": { - "version": "4.0.0", + "node_modules/cli-highlight/node_modules/string-width": { + "version": "4.2.3", "license": "MIT", "dependencies": { - "file-type": "^4.2.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/archive-type/node_modules/file-type": { - "version": "4.4.0", + "node_modules/cli-highlight/node_modules/supports-color": { + "version": "7.2.0", "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "license": "ISC", + "node_modules/cli-highlight/node_modules/wrap-ansi": { + "version": "7.0.0", + "license": "MIT", "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" + "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/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.2", + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.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" }, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "node_modules/arg": { - "version": "4.1.3", - "devOptional": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/aria-query": { - "version": "5.3.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" + "node_modules/cli-highlight/node_modules/yargs-parser": { + "version": "20.2.9", + "license": "ISC", + "engines": { + "node": ">=10" } }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", + "node_modules/cli-spinners": { + "version": "2.9.1", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "engines": { + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/array-includes": { - "version": "3.1.7", + "node_modules/cli-truncate": { + "version": "3.1.0", "dev": true, "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" + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" }, "engines": { - "node": ">= 0.4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/array-union": { - "version": "2.1.0", - "license": "MIT", + "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" + }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "dev": true, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.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" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", + "node_modules/cliui/node_modules/color-convert": { + "version": "2.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" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 0.4" + "node": ">=7.0.0" + } + }, + "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": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "dev": true, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.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" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "dev": true, + "node_modules/clone": { + "version": "1.0.4", "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" + "engines": { + "node": ">=0.8" } }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "license": "MIT", + "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": { - "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" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/arrify": { - "version": "1.0.1", - "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": { + "isobject": "^3.0.1" + }, "engines": { "node": ">=0.10.0" } }, - "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/clone-response": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" } }, - "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/clsx": { + "version": "2.0.0", "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": ">=6" } }, - "node_modules/async-mutex": { - "version": "0.4.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.4.0" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "dev": true, + "node_modules/color-convert": { + "version": "1.9.3", "license": "MIT", "dependencies": { - "has-symbols": "^1.0.3" + "color-name": "1.1.3" } }, - "node_modules/asynckit": { - "version": "0.4.0", + "node_modules/color-name": { + "version": "1.1.3", "license": "MIT" }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", + "node_modules/color-string": { + "version": "1.9.1", "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, - "node_modules/await-semaphore": { - "version": "0.1.3", + "node_modules/color-support": { + "version": "1.1.3", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "dev": true, "license": "MIT" }, - "node_modules/axe-core": { - "version": "4.7.0", + "node_modules/colors": { + "version": "1.2.5", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "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": ">=0.1.90" } }, - "node_modules/axobject-query": { - "version": "3.2.1", - "dev": true, - "license": "Apache-2.0", + "node_modules/colorspace": { + "version": "1.1.4", + "license": "MIT", "dependencies": { - "dequal": "^2.0.3" + "color": "^3.1.3", + "text-hex": "1.0.x" } }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", + "node_modules/combined-stream": { + "version": "1.0.8", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=10", - "npm": ">=6" + "node": ">= 0.8" } }, - "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/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/bech32": { - "version": "2.0.0", - "license": "MIT" + "node_modules/commander": { + "version": "11.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "license": "Apache-2.0" + "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/better-path-resolve": { - "version": "1.0.0", - "license": "MIT", + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "peer": true, "dependencies": { - "is-windows": "^1.0.0" + "mime-db": ">= 1.43.0 < 2" }, "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "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": { + "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": "*" + "node": ">= 0.8.0" } }, - "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": ">=8.0.0" + "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": { + "ms": "2.0.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/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": ">= 10.0.0" + } + }, + "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": { - "@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" + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.10.0" } }, - "node_modules/bl": { - "version": "5.1.0", - "license": "MIT", + "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": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "ms": "2.0.0" } }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", + "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", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "safe-buffer": "5.2.1" }, "engines": { - "node": ">= 6" + "node": ">= 0.6" } }, - "node_modules/blake2b": { - "version": "2.1.3", - "license": "ISC", + "node_modules/convert-source-map": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "license": "MIT", "dependencies": { - "blake2b-wasm": "^1.1.0", - "nanoassert": "^1.0.0" + "toggle-selection": "^1.0.6" } }, - "node_modules/blake2b-wasm": { - "version": "1.1.7", - "license": "MIT", + "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": { - "nanoassert": "^1.0.0" + "browserslist": "^4.23.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/blakejs": { - "version": "1.2.1", + "node_modules/core-util-is": { + "version": "1.0.3", "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/cosmiconfig": { + "version": "7.1.0", + "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" + } }, - "node_modules/bottleneck": { - "version": "2.19.5", + "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": ">=0.8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "devOptional": true, "license": "MIT" }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "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": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node-fetch": "^2.6.12" } }, - "node_modules/braces": { - "version": "3.0.2", + "node_modules/cross-spawn": { + "version": "7.0.3", "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/breakword": { - "version": "1.0.6", - "license": "MIT", - "dependencies": { - "wcwidth": "^1.0.1" - } + "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/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + "node_modules/csstype": { + "version": "3.1.2", + "license": "MIT" }, - "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" - } - ], + "node_modules/csv": { + "version": "5.5.3", "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" + "csv-generate": "^3.4.3", + "csv-parse": "^4.16.3", + "csv-stringify": "^5.6.5", + "stream-transform": "^2.1.3" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">= 0.1.90" } }, - "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/csv-generate": { + "version": "3.4.3", + "license": "MIT" }, - "node_modules/bs58check": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-3.0.1.tgz", - "integrity": "sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==", - "dependencies": { - "@noble/hashes": "^1.2.0", - "bs58": "^5.0.0" - } + "node_modules/csv-parse": { + "version": "4.16.3", + "license": "MIT" }, - "node_modules/btoa": { - "version": "1.2.1", - "license": "(MIT OR Apache-2.0)", - "bin": { - "btoa": "bin/btoa.js" + "node_modules/csv-stringify": { + "version": "5.6.5", + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "dev": true, + "license": "BSD-2-Clause" + }, + "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": { + "@babel/runtime": "^7.21.0" }, "engines": { - "node": ">= 0.4.0" + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" } }, - "node_modules/btoa-lite": { - "version": "1.0.0", + "node_modules/dayjs": { + "version": "1.11.10", "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/debug": { + "version": "4.3.4", "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/buffer-alloc": { + "node_modules/decamelize": { "version": "1.2.0", "license": "MIT", - "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "license": "MIT" + "node_modules/decamelize-keys": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", "license": "MIT", "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "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-writer": { - "version": "2.0.0", + "node_modules/decode-uri-component": { + "version": "0.2.2", "license": "MIT", "engines": { - "node": ">=4" + "node": ">=0.10" } }, - "node_modules/busboy": { - "version": "1.6.0", + "node_modules/decompress": { + "version": "4.2.1", + "license": "MIT", "dependencies": { - "streamsearch": "^1.1.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": ">=10.16.0" + "node": ">=4" } }, - "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, + "node_modules/decompress-response": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/cacache": { - "version": "15.3.0", - "license": "ISC", - "optional": true, + "node_modules/decompress-tar": { + "version": "4.1.1", + "license": "MIT", "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" + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" }, "engines": { - "node": ">= 10" + "node": ">=4" } }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, + "node_modules/decompress-tar/node_modules/file-type": { + "version": "5.2.0", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/cacache/node_modules/mkdirp": { - "version": "1.0.4", + "node_modules/decompress-tarbz2": { + "version": "4.1.1", "license": "MIT", - "optional": true, - "bin": { - "mkdirp": "bin/cmd.js" + "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": ">=10" + "node": ">=4" } }, - "node_modules/cacache/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC", - "optional": true - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", + "node_modules/decompress-tarbz2/node_modules/file-type": { + "version": "6.2.0", "license": "MIT", "engines": { - "node": ">=10.6.0" + "node": ">=4" } }, - "node_modules/cacheable-request": { - "version": "2.1.4", + "node_modules/decompress-targz": { + "version": "4.1.1", "license": "MIT", "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" + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "3.0.0", + "node_modules/decompress-targz/node_modules/file-type": { + "version": "5.2.0", "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/cacheable-request/node_modules/json-buffer": { - "version": "3.0.0", - "license": "MIT" - }, - "node_modules/cacheable-request/node_modules/keyv": { - "version": "3.0.0", + "node_modules/decompress-unzip": { + "version": "4.0.1", "license": "MIT", "dependencies": { - "json-buffer": "3.0.0" + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "engines": { + "node": ">=4" } }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "1.0.0", + "node_modules/decompress-unzip/node_modules/file-type": { + "version": "3.9.0", "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/call-bind": { - "version": "1.0.5", + "node_modules/decompress-unzip/node_modules/get-stream": { + "version": "2.3.1", "license": "MIT", "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "dev": true, + "node_modules/decompress-unzip/node_modules/pify": { + "version": "2.3.0", "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/camelcase-keys": { - "version": "6.2.2", + "node_modules/decompress/node_modules/make-dir": { + "version": "1.3.0", "license": "MIT", "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" + "pify": "^3.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/camelcase-keys/node_modules/camelcase": { - "version": "5.3.1", + "node_modules/decompress/node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", "license": "MIT", "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/camelcase-keys/node_modules/quick-lru": { - "version": "4.0.1", + "node_modules/decompress/node_modules/pify": { + "version": "2.3.0", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "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/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": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } }, - "node_modules/cbor": { - "version": "8.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": { - "nofilter": "^3.1.0" + "clone": "^1.0.2" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "license": "MIT", "engines": { - "node": ">=12.19" + "node": ">=10" } }, - "node_modules/cbor-extract": { - "version": "2.2.0", - "hasInstallScript": true, + "node_modules/define-data-property": { + "version": "1.1.1", "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.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.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/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/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/define-properties": { + "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" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/chalk": { - "version": "5.3.0", + "node_modules/delayed-stream": { + "version": "1.0.0", "license": "MIT", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=0.4.0" } }, - "node_modules/chardet": { - "version": "0.7.0", + "node_modules/delegates": { + "version": "1.0.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/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/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/deprecation": { + "version": "2.3.1", + "license": "ISC" + }, + "node_modules/dequal": { + "version": "2.0.3", "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">=6" } }, - "node_modules/chownr": { - "version": "2.0.0", - "license": "ISC", + "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": ">=10" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/ci-info": { - "version": "3.9.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], + "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", "engines": { "node": ">=8" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "license": "MIT", + "node_modules/detect-libc": { + "version": "2.0.2", + "license": "Apache-2.0", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/cli-cursor": { - "version": "4.0.0", + "node_modules/diff": { + "version": "4.0.2", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "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/dir-glob": { + "version": "3.0.1", "license": "MIT", "dependencies": { - "restore-cursor": "^4.0.0" + "path-type": "^4.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/cli-highlight": { - "version": "2.1.11", - "license": "ISC", + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", "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" + "esutils": "^2.0.2" }, "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" + "node": ">=6.0.0" } }, - "node_modules/cli-highlight/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/dom-helpers": { + "version": "5.2.1", "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "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": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, - "node_modules/cli-highlight/node_modules/chalk": { - "version": "4.1.2", + "node_modules/download": { + "version": "8.0.0", "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "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": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/cli-highlight/node_modules/cliui": { - "version": "7.0.4", - "license": "ISC", + "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", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "safe-buffer": "^5.0.1" } }, - "node_modules/cli-highlight/node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", + "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": { + "@types/secp256k1": "^4.0.6", + "futoin-hkdf": "^1.5.3", + "secp256k1": "^5.0.0" + } + }, + "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/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": { + "elliptic": "^6.5.4", + "node-addon-api": "^5.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "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": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.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/cli-highlight/node_modules/color-name": { - "version": "1.1.4", + "node_modules/emoji-regex": { + "version": "9.2.2", "license": "MIT" }, - "node_modules/cli-highlight/node_modules/emoji-regex": { - "version": "8.0.0", + "node_modules/enabled": { + "version": "2.0.0", "license": "MIT" }, - "node_modules/cli-highlight/node_modules/has-flag": { - "version": "4.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": ">=8" + "node": ">= 0.8" } }, - "node_modules/cli-highlight/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", + "node_modules/encoding": { + "version": "0.1.13", "license": "MIT", - "engines": { - "node": ">=8" + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" } }, - "node_modules/cli-highlight/node_modules/string-width": { - "version": "4.2.3", + "node_modules/end-of-stream": { + "version": "1.4.4", "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "once": "^1.4.0" } }, - "node_modules/cli-highlight/node_modules/supports-color": { - "version": "7.2.0", - "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": { - "has-flag": "^4.0.0" + "@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/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": ">=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/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": ">=8" + "node": ">=10.0.0" } }, - "node_modules/cli-highlight/node_modules/wrap-ansi": { - "version": "7.0.0", + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=10.13.0" } }, - "node_modules/cli-highlight/node_modules/yargs": { - "version": "16.2.0", + "node_modules/enquirer": { + "version": "2.4.1", "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" + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=10" + "node": ">=8.6" } }, - "node_modules/cli-highlight/node_modules/yargs-parser": { - "version": "20.2.9", - "license": "ISC", + "node_modules/entities": { + "version": "4.5.0", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=10" + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/cli-spinners": { - "version": "2.9.1", + "node_modules/env-paths": { + "version": "2.2.1", "license": "MIT", "engines": { "node": ">=6" + } + }, + "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/cli-truncate": { - "version": "3.1.0", - "dev": true, + "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": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "is-arrayish": "^0.2.1" } }, - "node_modules/client-only": { - "version": "0.0.1", - "license": "MIT" + "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/cliui": { - "version": "8.0.1", - "license": "ISC", + "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": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "accepts": "~1.3.7", + "escape-html": "~1.0.3" }, "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/es-abstract": { + "version": "1.22.3", "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "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": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/es-iterator-helpers": { + "version": "1.0.15", + "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "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/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", + "node_modules/es-set-tostringtag": { + "version": "2.0.2", "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", + "node_modules/es-shim-unscopables": { + "version": "1.0.2", "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "hasown": "^2.0.0" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", + "node_modules/es-to-primitive": { + "version": "1.2.1", "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/clone": { - "version": "1.0.4", + "node_modules/esbuild": { + "version": "0.18.20", + "dev": true, + "hasInstallScript": true, "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=0.8" + "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" } }, - "node_modules/clone-response": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" + "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" + ], + "engines": { + "node": ">=12" } }, - "node_modules/clsx": { - "version": "2.0.0", - "license": "MIT", + "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": ">=6" + "node": ">=12" } }, - "node_modules/code-block-writer": { - "version": "12.0.0", + "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, - "license": "MIT" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/color": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" + "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": ">=12" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" + "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" } }, - "node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" + "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/color-string": { - "version": "1.9.1", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "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": ">=12" } }, - "node_modules/color-support": { - "version": "1.1.3", - "license": "ISC", - "bin": { - "color-support": "bin.js" + "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": ">=12" } }, - "node_modules/colorette": { - "version": "2.0.20", + "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, - "license": "MIT" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/colors": { - "version": "1.2.5", + "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, - "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.1.90" + "node": ">=12" } }, - "node_modules/colorspace": { - "version": "1.1.4", - "license": "MIT", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" + "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": ">=12" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, + "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": ">= 0.8" + "node": ">=12" } }, - "node_modules/commander": { - "version": "11.0.0", + "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, - "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16" + "node": ">=12" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/config": { - "version": "3.3.9", - "license": "MIT", - "dependencies": { - "json5": "^2.2.3" - }, + "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": ">= 10.0.0" + "node": ">=12" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "license": "ISC" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, + "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": ">= 0.6" + "node": ">=12" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, - "node_modules/copy-to-clipboard": { - "version": "3.3.3", - "license": "MIT", - "dependencies": { - "toggle-selection": "^1.0.6" + "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": ">=12" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "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" - }, + "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/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/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": ">=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" - }, + "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": ">= 8" + "node": ">=12" } }, - "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": { - "csv-generate": "^3.4.3", - "csv-parse": "^4.16.3", - "csv-stringify": "^5.6.5", - "stream-transform": "^2.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" + ], "engines": { - "node": ">= 0.1.90" + "node": ">=12" } }, - "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/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, - "license": "BSD-2-Clause" - }, - "node_modules/dayjs": { - "version": "1.11.10", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=12" } }, - "node_modules/decamelize": { - "version": "1.2.0", - "license": "MIT", + "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": ">=0.10.0" + "node": ">=6" } }, - "node_modules/decamelize-keys": { - "version": "1.1.1", + "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/escape-string-regexp": { + "version": "4.0.0", "license": "MIT", - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=10" }, "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" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/decompress": { - "version": "4.2.1", + "node_modules/eslint": { + "version": "8.42.0", + "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" + "@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": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/decompress-response": { - "version": "3.3.0", + "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" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/decompress-tar": { - "version": "4.1.1", + "node_modules/eslint-config-next/node_modules/@next/eslint-plugin-next": { + "version": "13.4.4", + "dev": true, "license": "MIT", "dependencies": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - }, - "engines": { - "node": ">=4" + "glob": "7.1.7" } }, - "node_modules/decompress-tar/node_modules/file-type": { - "version": "5.2.0", + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "dev": true, "license": "MIT", - "engines": { - "node": ">=4" + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/decompress-tarbz2": { - "version": "4.1.1", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "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" - }, - "engines": { - "node": ">=4" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/decompress-tarbz2/node_modules/file-type": { - "version": "6.2.0", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "dev": true, "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/decompress-targz": { - "version": "4.1.1", - "license": "MIT", + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "dev": true, + "license": "ISC", "dependencies": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" + "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": ">=4" - } - }, - "node_modules/decompress-targz/node_modules/file-type": { - "version": "5.2.0", - "license": "MIT", - "engines": { - "node": ">=4" + "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/decompress-unzip": { - "version": "4.0.1", + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "dev": true, "license": "MIT", "dependencies": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" + "debug": "^3.2.7" }, "engines": { "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/decompress-unzip/node_modules/file-type": { - "version": "3.9.0", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/decompress-unzip/node_modules/get-stream": { - "version": "2.3.1", + "node_modules/eslint-plugin-import": { + "version": "2.29.0", + "dev": true, "license": "MIT", "dependencies": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.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.10.0" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, - "node_modules/decompress-unzip/node_modules/pify": { - "version": "2.3.0", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/decompress/node_modules/make-dir": { - "version": "1.3.0", - "license": "MIT", + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "pify": "^3.0.0" + "esutils": "^2.0.2" }, "engines": { - "node": ">=4" - } - }, - "node_modules/decompress/node_modules/make-dir/node_modules/pify": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/decompress/node_modules/pify": { - "version": "2.3.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "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==", + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.8.0", "dev": true, + "license": "MIT", "dependencies": { - "type-detect": "^4.0.0" + "@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": ">=6" + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/deep-is": { - "version": "0.1.4", + "node_modules/eslint-plugin-react": { + "version": "7.33.2", "dev": true, - "license": "MIT" - }, - "node_modules/defaults": { - "version": "1.0.4", "license": "MIT", "dependencies": { - "clone": "^1.0.2" + "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" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "dev": true, "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_modules/define-data-property": { - "version": "1.1.1", + "node_modules/eslint-plugin-react-refresh": { + "version": "0.3.5", + "dev": true, "license": "MIT", + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "esutils": "^2.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } }, - "node_modules/define-properties": { - "version": "1.2.1", + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "dev": true, "license": "MIT", "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">= 0.4" + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/delegates": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/deprecation": { - "version": "2.3.1", - "license": "ISC" - }, - "node_modules/dequal": { - "version": "2.0.3", + "node_modules/eslint-scope": { + "version": "5.1.1", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, "engines": { - "node": ">=6" + "node": ">=8.0.0" } }, - "node_modules/detect-indent": { - "version": "6.1.0", - "license": "MIT", + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=8" + "node": ">=4.0" } }, - "node_modules/detect-libc": { - "version": "2.0.2", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, "license": "Apache-2.0", "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "devOptional": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "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/eslint/node_modules/ansi-styles": { + "version": "4.3.0", "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", "license": "MIT", "dependencies": { - "path-type": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/dot-case": { - "version": "3.0.4", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", "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", + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/download": { - "version": "8.0.0", + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, "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" + "color-name": "~1.1.4" }, "engines": { - "node": ">=10" + "node": ">=7.0.0" } }, - "node_modules/duplexer3": { - "version": "0.1.5", - "license": "BSD-3-Clause" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "dev": true, "license": "MIT" }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.588", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", "dev": true, - "license": "ISC" - }, - "node_modules/elliptic": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", - "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", + "license": "BSD-2-Clause", "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" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "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", + "node_modules/eslint/node_modules/globals": { + "version": "13.23.0", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "iconv-lite": "^0.6.2" + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "once": "^1.4.0" + "engines": { + "node": ">=8" } }, - "node_modules/enhanced-resolve": { - "version": "5.15.0", + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=8" } }, - "node_modules/enquirer": { - "version": "2.4.1", - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=8.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/entities": { - "version": "4.5.0", + "node_modules/espree": { + "version": "9.6.1", "dev": true, "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, "engines": { - "node": ">=0.12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://opencollective.com/eslint" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "license": "MIT", - "optional": true, + "node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "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", + "node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "is-arrayish": "^0.2.1" + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/es-abstract": { - "version": "1.22.3", - "license": "MIT", + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", "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" + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4.0" } }, - "node_modules/es-iterator-helpers": { - "version": "1.0.15", + "node_modules/estraverse": { + "version": "5.3.0", "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" + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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.6" } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "license": "MIT", + "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": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" + "fast-safe-stringify": "^2.0.6" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "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": { - "hasown": "^2.0.0" + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "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": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "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": { + "@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/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://github.com/sponsors/ljharb" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/esbuild": { - "version": "0.18.20", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, + "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": ">=12" + "node": ">=10.0.0" }, - "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" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "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/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": ">=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" - ], + "node_modules/eventemitter2": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" + }, + "node_modules/eventemitter3": { + "version": "5.0.1", "dev": true, - "optional": true, - "os": [ - "android" - ], + "license": "MIT" + }, + "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": ">=12" + "node": ">=0.8.x" } }, - "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" - ], + "node_modules/execa": { + "version": "7.2.0", "dev": true, - "optional": true, - "os": [ - "android" - ], + "license": "MIT", + "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" + }, "engines": { - "node": ">=12" + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "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" - ], + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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" - ], + "node_modules/execa/node_modules/is-stream": { + "version": "3.0.0", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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" - ], + "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": { + "mime-db": "^1.28.0" + }, "engines": { - "node": ">=12" + "node": ">=0.10.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/ext-name": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">=4" } }, - "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/extendable-error": { + "version": "0.1.7", + "license": "MIT" + }, + "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": { + "readable-stream": "^3.6.2 || ^4.4.2", + "webextension-polyfill": ">=0.10.0 <1.0" + }, "engines": { - "node": ">=12" + "node": ">=12.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" - ], + "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": { + "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" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "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" - ], + "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": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/extensionless": { + "version": "1.9.6", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "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": ">=12" + "node": ">=4" } }, - "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/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "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/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" + }, "engines": { - "node": ">=12" + "node": ">=8.6.0" } }, - "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/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, "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" - ], + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", "dev": true, - "optional": true, - "os": [ - "linux" + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "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/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" + } ], - "engines": { - "node": ">=12" + "peer": true, + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" } }, - "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" - ], + "node_modules/fastq": { + "version": "1.15.0", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "peer": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, "engines": { - "node": ">=12" + "node": "^10.12.0 || >=12.0.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" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "node_modules/file-stream-rotator": { + "version": "0.6.1", + "license": "MIT", + "dependencies": { + "moment": "^2.29.1" + } + }, + "node_modules/file-type": { + "version": "11.1.0", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6" } }, - "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" - ], + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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/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/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/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" - ], + "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/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/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/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/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/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/escalade": { - "version": "3.1.1", - "license": "MIT", + "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": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "license": "MIT", + "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": ">=10" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint": { - "version": "8.42.0", - "dev": true, - "license": "MIT", + "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": { - "@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" + "p-limit": "^2.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6" + } + }, + "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": ">=4" + } + }, + "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" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": ">=6" } }, - "node_modules/eslint-config-next": { - "version": "13.4.4", - "dev": true, + "node_modules/find-root": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", "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" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", - "typescript": ">=3.3.1" + "engines": { + "node": ">=10" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-config-next/node_modules/@next/eslint-plugin-next": { - "version": "13.4.4", - "dev": true, - "license": "MIT", + "node_modules/find-yarn-workspace-root2": { + "version": "1.2.16", + "license": "Apache-2.0", "dependencies": { - "glob": "7.1.7" + "micromatch": "^4.0.2", + "pkg-dir": "^4.2.0" } }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", + "node_modules/flat-cache": { + "version": "3.2.0", "dev": true, "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, - "peerDependencies": { - "eslint": ">=7.0.0" + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", + "node_modules/flatted": { + "version": "3.2.9", "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "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": ">=0.4.0" + } + }, + "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": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "dev": true, + "node_modules/for-each": { + "version": "0.3.3", "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "is-callable": "^1.1.3" } }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "dev": true, + "node_modules/foreground-child": { + "version": "3.1.1", "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" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=14" }, "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "license": "ISC", + "engines": { + "node": ">=14" }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "dev": true, + "node_modules/form-data": { + "version": "4.0.0", "license": "MIT", "dependencies": { - "debug": "^3.2.7" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "node": ">= 6" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" + "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": ">= 0.6" } }, - "node_modules/eslint-plugin-import": { - "version": "2.29.0", - "dev": true, + "node_modules/from2": { + "version": "2.3.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" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", + "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": { - "ms": "^2.1.1" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { + "node_modules/fs-minipass": { "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", + "license": "ISC", "dependencies": { - "esutils": "^2.0.2" + "minipass": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "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/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "dev": true, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", "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" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { - "node": ">=4.0" + "node": ">= 0.4" }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "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": { - "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" + "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": ">=4" + "node": ">=10" + } + }, + "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", + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/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" }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "engines": { + "node": ">=8" } }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "dev": true, + "node_modules/gensync": { + "version": "1.0.0-beta.2", "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": ">=6.9.0" } }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.3.5", + "node_modules/get-caller-file": { + "version": "2.0.5", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "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, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", "license": "MIT", - "peerDependencies": { - "eslint": ">=7" + "dependencies": { + "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-react/node_modules/doctrine": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", + "node_modules/get-stream": { + "version": "4.1.0", + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "pump": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "dev": true, + "node_modules/get-symbol-description": { + "version": "1.0.0", "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", + "node_modules/get-tsconfig": { + "version": "4.7.2", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/glob": { + "version": "7.1.7", + "license": "ISC", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "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": ">=8.0.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", + "node_modules/glob-parent": { + "version": "6.0.2", "dev": true, - "license": "BSD-2-Clause", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, "engines": { - "node": ">=4.0" + "node": ">=10.13.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", + "node_modules/globals": { + "version": "11.12.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", - "dev": true, + "node_modules/globalthis": { + "version": "1.0.3", "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "define-properties": "^1.1.3" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "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/globby": { + "version": "11.1.0", "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.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" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, + "node_modules/gopd": { + "version": "1.0.1", "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "8.3.2", + "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" }, "engines": { - "node": ">=7.0.0" + "node": ">=4" } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "dev": true, + "node_modules/got/node_modules/get-stream": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/got/node_modules/pify": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", "license": "MIT" }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", + "node_modules/graphemer": { + "version": "1.4.0", "dev": true, - "license": "BSD-2-Clause", + "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": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "tslib": "^2.1.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10" }, - "funding": { - "url": "https://opencollective.com/eslint" + "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/eslint/node_modules/globals": { - "version": "13.23.0", - "dev": true, + "node_modules/has-bigints": { + "version": "1.0.2", "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, "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, + "node_modules/has-flag": { + "version": "3.0.0", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, + "node_modules/has-property-descriptors": { + "version": "1.0.1", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "get-intrinsic": "^1.2.2" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", + "node_modules/has-proto": { + "version": "1.0.1", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/espree": { - "version": "9.6.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, + "node_modules/has-symbol-support-x": { + "version": "1.4.2", + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "*" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esprima": { - "version": "4.0.1", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "node_modules/has-to-string-tag-x": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "has-symbol-support-x": "^1.4.1" }, "engines": { - "node": ">=4" + "node": "*" } }, - "node_modules/esquery": { - "version": "1.5.0", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/has-tostringtag": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "estraverse": "^5.1.0" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=0.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", + "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": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/hasown": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, "engines": { - "node": ">=4.0" + "node": ">= 0.4" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "dev": true, - "license": "MIT" + "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/esutils": { - "version": "2.0.3", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" + "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/ethers": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.12.1.tgz", - "integrity": "sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "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.5.0" - }, + "node_modules/highlight.js": { + "version": "10.7.3", + "license": "BSD-3-Clause", "engines": { - "node": ">=14.0.0" + "node": "*" } }, - "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/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/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/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } }, - "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/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" }, - "node_modules/ethers/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "engines": { - "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/hosted-git-info": { + "version": "2.8.9", + "license": "ISC" }, - "node_modules/eventemitter3": { - "version": "5.0.1", + "node_modules/html-escaper": { + "version": "2.0.2", "dev": true, "license": "MIT" }, - "node_modules/execa": { - "version": "7.2.0", - "dev": true, - "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": { - "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" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">= 0.8" } }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", + "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": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } - }, - "node_modules/execa/node_modules/is-stream": { - "version": "3.0.0", - "dev": true, + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "optional": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 6" } }, - "node_modules/ext-list": { - "version": "2.2.2", + "node_modules/http2-wrapper": { + "version": "1.0.3", "license": "MIT", "dependencies": { - "mime-db": "^1.28.0" + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.19.0" } }, - "node_modules/ext-name": { - "version": "5.0.0", + "node_modules/https-proxy-agent": { + "version": "5.0.1", "license": "MIT", "dependencies": { - "ext-list": "^2.0.0", - "sort-keys-length": "^1.0.0" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/extendable-error": { - "version": "0.1.7", + "node_modules/human-id": { + "version": "1.0.2", "license": "MIT" }, - "node_modules/extensionless": { - "version": "1.9.6", + "node_modules/human-signals": { + "version": "4.3.1", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "engines": { + "node": ">=14.18.0" + } }, - "node_modules/external-editor": { - "version": "3.1.0", + "node_modules/humanize-ms": { + "version": "1.2.1", "license": "MIT", + "optional": true, "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "ms": "^2.0.0" + } + }, + "node_modules/husky": { + "version": "8.0.3", + "dev": true, + "license": "MIT", + "bin": { + "husky": "lib/bin.js" }, "engines": { - "node": ">=4" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" } }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", + "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://locize.com" + }, + { + "type": "individual", + "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": { + "@babel/runtime": "^7.23.2" + } + }, + "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/iconv-lite": { + "version": "0.6.3", "license": "MIT", + "optional": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "license": "MIT" + "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/fast-glob": { - "version": "3.3.2", + "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": { - "@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" + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" }, "engines": { - "node": ">=8.6.0" + "node": ">=16.x" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "license": "ISC", + "node_modules/import-fresh": { + "version": "3.3.0", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", + "node_modules/import-lazy": { + "version": "4.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/fastq": { - "version": "1.15.0", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" + "node_modules/imurmurhash": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.8.19" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", + "node_modules/indent-string": { + "version": "4.0.0", "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "license": "ISC", + "optional": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", "dependencies": { - "pend": "~1.2.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/fecha": { - "version": "4.2.3", - "license": "MIT" + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "dev": true, + "node_modules/internal-slot": { + "version": "1.0.6", "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">= 0.4" } }, - "node_modules/file-stream-rotator": { - "version": "0.6.1", + "node_modules/into-stream": { + "version": "3.1.0", "license": "MIT", "dependencies": { - "moment": "^2.29.1" + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/file-type": { - "version": "11.1.0", - "license": "MIT", - "engines": { - "node": ">=6" + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" } }, - "node_modules/filename-reserved-regex": { + "node_modules/ip": { "version": "2.0.0", "license": "MIT", - "engines": { - "node": ">=4" - } + "optional": true }, - "node_modules/filenamify": { - "version": "3.0.0", - "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": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.0", - "trim-repeated": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fill-range": { - "version": "7.0.1", + "node_modules/is-array-buffer": { + "version": "3.0.2", "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/find-root": { - "version": "1.1.0", + "node_modules/is-arrayish": { + "version": "0.2.1", "license": "MIT" }, - "node_modules/find-up": { - "version": "5.0.0", + "node_modules/is-async-function": { + "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "has-tostringtag": "^1.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-bigint": { + "version": "1.0.4", + "license": "MIT", "dependencies": { - "micromatch": "^4.0.2", - "pkg-dir": "^4.2.0" + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/flat-cache": { - "version": "3.2.0", - "dev": true, + "node_modules/is-boolean-object": { + "version": "1.1.2", "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "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/flatted": { - "version": "3.2.9", - "dev": true, - "license": "ISC" - }, - "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" - } - ], + "node_modules/is-callable": { + "version": "1.2.7", + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/for-each": { - "version": "0.3.3", + "node_modules/is-core-module": { + "version": "2.13.1", "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/foreground-child": { - "version": "3.1.1", - "license": "ISC", + "node_modules/is-date-object": { + "version": "1.0.5", + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=14" + "node": ">= 0.4" }, "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-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": ">=14" + "node": ">=0.10.0" + } + }, + "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": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/form-data": { - "version": "4.0.0", + "node_modules/is-extglob": { + "version": "2.1.1", "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/from2": { - "version": "2.3.0", + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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", + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", "dev": true, "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "license": "ISC", + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">= 8" + "node": ">=0.10.0" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "license": "ISC" + "node_modules/is-interactive": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "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-lambda": { + "version": "1.0.1", + "license": "MIT", + "optional": true + }, + "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" @@ -8863,107 +15641,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/is-path-inside": { + "version": "3.0.3", + "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "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-plain-obj": { + "version": "1.1.0", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "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-object": { + "version": "5.0.0", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", + "node_modules/is-regex": { + "version": "1.1.4", "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.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/gensync": { - "version": "1.0.0-beta.2", - "dev": true, + "node_modules/is-retry-allowed": { + "version": "1.2.0", "license": "MIT", "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "license": "ISC", - "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" @@ -8972,1367 +15729,1639 @@ "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" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", + "node_modules/is-typed-array": { + "version": "1.1.12", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.3" + "which-typed-array": "^1.1.11" }, "engines": { - "node": ">=10.13.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globals": { - "version": "11.12.0", - "dev": true, + "node_modules/is-unicode-supported": { + "version": "1.3.0", "license": "MIT", "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globalthis": { - "version": "1.0.3", + "node_modules/is-weakmap": { + "version": "2.0.1", + "dev": true, "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", + "node_modules/is-weakref": { + "version": "1.0.2", "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" + "call-bind": "^1.0.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gopd": { - "version": "1.0.1", + "node_modules/is-weakset": { + "version": "2.0.2", + "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.3" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/got": { - "version": "8.3.2", + "node_modules/is-windows": { + "version": "1.0.2", "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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": { - "@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" + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "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": ">=0.10.0" + } + }, + "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": { + "@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": ">=4" - } - }, - "node_modules/got/node_modules/get-stream": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/got/node_modules/pify": { - "version": "3.0.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": ">=4" + "node": ">=10" } }, - "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", + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.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": ">=8" } }, - "node_modules/graphql-tag": { - "version": "2.12.6", + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.1.0" + "semver": "^7.5.3" }, "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" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hard-rejection": { - "version": "2.1.0", + "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": ">=6" + "node": ">=8" } }, - "node_modules/has-bigints": { - "version": "1.0.2", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "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" + }, + "engines": { + "node": ">=10" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", + "node_modules/istanbul-reports": { + "version": "3.1.6", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", + "node_modules/isurl": { + "version": "1.0.0", "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.2" + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 4" } }, - "node_modules/has-proto": { - "version": "1.0.1", + "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/jackspeak": { + "version": "2.3.6", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/has-symbol-support-x": { - "version": "1.4.2", - "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": { + "@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": "*" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "license": "MIT", + "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": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/has-to-string-tag-x": { - "version": "1.4.1", - "license": "MIT", + "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": { - "has-symbol-support-x": "^1.4.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": "*" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "license": "MIT", + "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": { - "has-symbols": "^1.0.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/hasown": { - "version": "2.0.0", - "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": { - "function-bind": "^1.1.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.4" - } - }, - "node_modules/highlight.js": { - "version": "10.7.3", - "license": "BSD-3-Clause", - "engines": { - "node": "*" - } - }, - "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": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "license": "BSD-3-Clause", + "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": { - "react-is": "^16.7.0" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.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": "MIT" - }, - "node_modules/http-cache-semantics": { - "version": "3.8.1", - "license": "BSD-2-Clause" + "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-proxy-agent": { - "version": "4.0.1", - "license": "MIT", - "optional": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, + "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": ">= 6" + "node": ">=8" } }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "license": "MIT", + "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": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10.19.0" + "node": ">=8" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "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": { - "agent-base": "6", - "debug": "4" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, "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": { + "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": { + "@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": ">=14.18.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "license": "MIT", - "optional": true, + "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": { - "ms": "^2.0.0" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/husky": { - "version": "8.0.3", - "dev": true, - "license": "MIT", - "bin": { - "husky": "lib/bin.js" + "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": { + "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/jju": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/joi": { + "version": "17.11.0", + "license": "BSD-3-Clause", + "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" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "license": "MIT", + "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/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", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "@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" + "bin": { + "jscodeshift": "bin/jscodeshift.js" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "dev": true, - "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": { - "has-tostringtag": "^1.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/is-bigint": { - "version": "1.0.4", - "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-bigints": "^1.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "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", - "has-tostringtag": "^1.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=7.0.0" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "license": "MIT", + "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", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/is-core-module": { - "version": "2.13.1", - "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": { - "hasown": "^2.0.0" + "has-flag": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/is-date-object": { - "version": "1.0.5", + "node_modules/jsesc": { + "version": "2.5.2", "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/is-extglob": { - "version": "2.1.1", + "node_modules/json-bigint": { + "version": "1.0.0", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "bignumber.js": "^9.0.0" } }, - "node_modules/is-finalizationregistry": { + "node_modules/json-buffer": { + "version": "3.0.1", + "license": "MIT" + }, + "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", - "dependencies": { - "call-bind": "^1.0.2" + "bin": { + "json5": "lib/cli.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6" } }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", + "node_modules/jsonc-parser": { + "version": "3.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.1.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "universalify": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", + "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": { - "has-tostringtag": "^1.0.0" + "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.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12", + "npm": ">=6" } }, - "node_modules/is-glob": { - "version": "4.0.3", + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0" } }, - "node_modules/is-interactive": { - "version": "2.0.0", + "node_modules/jwa": { + "version": "1.4.1", "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" } }, - "node_modules/is-lambda": { - "version": "1.0.1", + "node_modules/jws": { + "version": "3.2.2", "license": "MIT", - "optional": true + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } }, - "node_modules/is-map": { - "version": "2.0.2", - "dev": true, + "node_modules/keyv": { + "version": "4.5.4", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "json-buffer": "3.0.1" } }, - "node_modules/is-natural-number": { - "version": "4.0.1", + "node_modules/kind-of": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "dev": true, "license": "MIT" }, - "node_modules/is-negative-zero": { - "version": "2.0.2", + "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", - "engines": { - "node": ">= 0.4" + "dependencies": { + "language-subtag-registry": "^0.3.20" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10" } }, - "node_modules/is-number": { - "version": "7.0.0", - "license": "MIT", + "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": ">=0.12.0" + "node": ">=6" } }, - "node_modules/is-number-object": { - "version": "1.0.7", + "node_modules/levn": { + "version": "0.4.1", + "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8.0" } }, - "node_modules/is-object": { - "version": "1.0.2", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "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/is-path-inside": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "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-plain-obj": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "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/is-plain-object": { - "version": "5.0.0", + "node_modules/lilconfig": { + "version": "2.1.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/is-regex": { - "version": "1.1.4", + "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", - "has-tostringtag": "^1.0.0" + "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": ">= 0.4" + "node": "^16.14.0 || >=18.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/lint-staged" } }, - "node_modules/is-retry-allowed": { - "version": "1.2.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-set": { - "version": "2.0.2", + "node_modules/listr2": { + "version": "6.6.1", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "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" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } } }, - "node_modules/is-string": { - "version": "1.0.7", + "node_modules/load-yaml-file": { + "version": "0.2.0", "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "graceful-fs": "^4.1.5", + "js-yaml": "^3.13.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/is-subdir": { - "version": "1.2.0", + "node_modules/load-yaml-file/node_modules/argparse": { + "version": "1.0.10", "license": "MIT", "dependencies": { - "better-path-resolve": "1.0.0" - }, - "engines": { - "node": ">=4" + "sprintf-js": "~1.0.2" } }, - "node_modules/is-symbol": { - "version": "1.0.4", + "node_modules/load-yaml-file/node_modules/js-yaml": { + "version": "3.14.1", "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "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/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/isexe": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/isomorphic-ws": { + "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", + "node_modules/lodash.once": { + "version": "4.1.1", + "license": "MIT" + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "license": "MIT" + }, + "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/log-symbols": { + "version": "5.1.0", + "license": "MIT", "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" + "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": { - "version": "3.0.1", + "node_modules/log-update": { + "version": "5.0.1", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.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": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", "dev": true, "license": "MIT", "dependencies": { - "semver": "^7.5.3" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, + "node_modules/logform": { + "version": "2.6.0", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@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": ">=8" + "node": ">= 12.0.0" } }, - "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, + "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": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" + "ansi-fragments": "^0.2.1", + "dayjs": "^1.8.15", + "yargs": "^15.1.0" }, - "engines": { - "node": ">=10" + "bin": { + "logkitty": "bin/logkitty.js" } }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "dev": true, - "license": "BSD-3-Clause", + "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": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/isurl": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - }, + "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": ">= 4" + "node": ">=6" } }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "dev": true, - "license": "MIT", + "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": { - "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" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "node_modules/jackspeak": { - "version": "2.3.6", - "license": "BlueOak-1.0.0", + "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": { - "@isaacs/cliui": "^8.0.2" + "color-name": "~1.1.4" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "node": ">=7.0.0" } }, - "node_modules/jju": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/joi": { - "version": "17.11.0", - "license": "BSD-3-Clause", - "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" - } + "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/js-tokens": { - "version": "4.0.0", - "license": "MIT" + "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/js-yaml": { + "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/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": ">=6" + "node": ">=8" } }, - "node_modules/jsonc-parser": { - "version": "3.2.1", - "dev": true, - "license": "MIT" - }, - "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", - "license": "MIT", - "engines": { - "node": ">=6" + "node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" } }, - "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", + "node_modules/magic-string": { + "version": "0.29.0", "dev": true, "license": "MIT", "dependencies": { - "language-subtag-registry": "^0.3.20" + "@jridgewell/sourcemap-codec": "^1.4.13" }, "engines": { - "node": ">=0.10" + "node": ">=12" } }, - "node_modules/levn": { - "version": "0.4.1", + "node_modules/magicast": { + "version": "0.3.3", "dev": true, "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "source-map-js": "^1.0.2" } }, - "node_modules/lilconfig": { + "node_modules/make-dir": { "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "license": "MIT" - }, - "node_modules/lint-staged": { - "version": "13.3.0", - "dev": true, "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" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" + "node": ">=6" } }, - "node_modules/lint-staged/node_modules/yaml": { - "version": "2.3.1", - "dev": true, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", "license": "ISC", - "engines": { - "node": ">= 14" + "bin": { + "semver": "bin/semver" } }, - "node_modules/listr2": { - "version": "6.6.1", - "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": { - "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" + "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": ">=16.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } + "node": ">= 10" } }, - "node_modules/load-yaml-file": { - "version": "0.2.0", - "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": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.13.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/load-yaml-file/node_modules/argparse": { - "version": "1.0.10", - "license": "MIT", + "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": { - "sprintf-js": "~1.0.2" + "tmpl": "1.0.5" } }, - "node_modules/load-yaml-file/node_modules/js-yaml": { - "version": "3.14.1", + "node_modules/map-obj": { + "version": "4.3.0", "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "engines": { + "node": ">=8" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/local-pkg": { - "version": "0.5.0", - "dev": true, + "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/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": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" + "@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" }, "engines": { - "node": ">=14" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/locate-path": { - "version": "6.0.0", + "node_modules/meow/node_modules/camelcase": { + "version": "5.3.1", "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, + "engines": { + "node": ">=6" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.13.1", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -10340,344 +17369,516 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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/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/lodash.isnumber": { - "version": "3.0.3", + "node_modules/merge-stream": { + "version": "2.0.0", "license": "MIT" }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "license": "MIT" + "node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "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": { + "@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" + }, + "bin": { + "metro": "src/cli.js" + }, + "engines": { + "node": ">=18" + } }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "dev": true, - "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": { + "@babel/core": "^7.20.0", + "flow-enums-runtime": "^0.0.6", + "hermes-parser": "0.23.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + } }, - "node_modules/lodash.once": { - "version": "4.1.1", - "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/lodash.startcase": { - "version": "4.4.0", - "license": "MIT" + "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": { + "hermes-estree": "0.23.1" + } }, - "node_modules/log-symbols": { - "version": "5.1.0", - "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": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" + "exponential-backoff": "^3.1.1", + "flow-enums-runtime": "^0.0.6", + "metro-core": "0.80.12" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/log-update": { - "version": "5.0.1", - "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": { - "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" + "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "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": { + "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" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=18" } }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "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": { - "ansi-regex": "^6.0.1" + "sprintf-js": "~1.0.2" + } + }, + "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": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" }, "engines": { - "node": ">=12" + "node": ">=4" + } + }, + "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": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "engines": { + "node": ">=4" } }, - "node_modules/logform": { - "version": "2.6.0", - "license": "MIT", + "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": { - "@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" + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": ">= 12.0.0" + "node": ">=4" } }, - "node_modules/long": { - "version": "5.2.3", - "license": "Apache-2.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": ">=4" + } }, - "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/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", @@ -10689,6 +17890,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", @@ -10753,7 +17966,6 @@ }, "node_modules/minimist": { "version": "1.2.8", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10944,11 +18156,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", @@ -11003,10 +18220,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", @@ -11025,6 +18269,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", @@ -11154,10 +18407,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", @@ -11196,6 +18468,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", @@ -11243,6 +18524,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", @@ -11373,6 +18682,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", @@ -11401,6 +18731,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", @@ -11642,6 +18993,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, @@ -11801,8 +19161,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", @@ -11849,6 +19210,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", @@ -11913,6 +19283,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": [ @@ -12015,7 +19393,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", @@ -12029,7 +19406,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" }, @@ -12049,6 +19425,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", @@ -12066,6 +19451,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", @@ -12124,6 +19531,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", @@ -12143,6 +19571,25 @@ "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": [ @@ -12161,76 +19608,338 @@ ], "license": "MIT" }, - "node_modules/quick-lru": { - "version": "5.1.1", - "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/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/react": { - "version": "18.2.0", - "license": "MIT", + "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": { - "loose-envify": "^1.1.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/react-apexcharts": { - "version": "1.4.1", - "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/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": ">=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": { - "prop-types": "^15.8.1" + "minimist": "^1.2.6" }, - "peerDependencies": { - "apexcharts": "^3.41.0", - "react": ">=0.13" + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/react-copy-to-clipboard": { - "version": "5.1.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": { - "copy-to-clipboard": "^3.3.1", - "prop-types": "^15.8.1" + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" }, - "peerDependencies": { - "react": "^15.3.0 || 16 || 17 || 18" + "engines": { + "node": ">= 10" } }, - "node_modules/react-dom": { - "version": "18.2.0", - "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": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" + "loose-envify": "^1.1.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" + "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": { + "has-flag": "^4.0.0" }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18" + "engines": { + "node": ">=8" } }, - "node_modules/react-is": { - "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": { + "async-limiter": "~1.0.0" + } + }, + "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": ">=0.10.0" + } }, "node_modules/react-transition-group": { "version": "4.4.5", @@ -12380,6 +20089,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", @@ -12414,10 +20153,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", @@ -12433,6 +20199,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", @@ -12569,7 +20373,7 @@ }, "node_modules/rollup": { "version": "3.29.4", - "dev": true, + "devOptional": true, "license": "MIT", "bin": { "rollup": "dist/bin/rollup" @@ -12582,6 +20386,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": [ @@ -12715,6 +20568,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", @@ -12742,6 +20608,108 @@ "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/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": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "license": "ISC" @@ -12771,6 +20739,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)", @@ -12782,6 +20756,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", @@ -12799,6 +20785,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", @@ -12831,6 +20826,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", @@ -13073,6 +21074,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", @@ -13144,6 +21171,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", @@ -13274,11 +21320,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, @@ -13558,6 +21661,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", @@ -13583,6 +21692,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", @@ -13777,6 +21892,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", @@ -13787,6 +21927,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, @@ -13826,10 +21990,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", @@ -13869,6 +22049,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" @@ -13894,6 +22080,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" @@ -14146,7 +22341,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" } @@ -14239,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", @@ -14425,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": { @@ -14503,6 +22697,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", @@ -14539,9 +22773,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", @@ -14556,10 +22800,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" @@ -14603,6 +22846,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", @@ -14619,6 +22874,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": [ @@ -14659,6 +22923,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, @@ -15766,6 +24039,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", @@ -15773,10 +24061,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", @@ -16137,10 +24436,22 @@ "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", - "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" }, @@ -16157,6 +24468,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", @@ -16173,7 +24492,6 @@ }, "node_modules/yallist": { "version": "3.1.1", - "dev": true, "license": "ISC" }, "node_modules/yaml": { @@ -16296,16 +24614,18 @@ }, "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", - "@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.0.1", - "@rosen-clients/cardano-koios": "^2.0.1", - "@rosen-clients/ergo-explorer": "^1.0.3", + "@rosen-bridge/tokens": "^1.2.1", + "@rosen-clients/cardano-koios": "^2.0.3", + "@rosen-clients/ergo-explorer": "^1.1.2", + "@rosen-ui/types": "^0.3.0", "axios": "^1.7.0", + "ethers": "^6.13.2", "lodash-es": "^4.17.21", "typeorm": "^0.3.20" }, @@ -16336,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, @@ -16766,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", @@ -16792,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", @@ -16863,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" @@ -16923,7 +25232,10 @@ }, "packages/types": { "name": "@rosen-ui/types", - "version": "0.1.0", + "version": "0.3.0", + "dependencies": { + "@rosen-ui/constants": "^0.0.4" + }, "devDependencies": { "@mui/material": "^5.13.7", "@typescript-eslint/eslint-plugin": "^5.30.7", @@ -16950,20 +25262,21 @@ }, "packages/ui-kit": { "name": "@rosen-bridge/ui-kit", - "version": "1.1.2", + "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-ui/constants": "^0.0.3", - "@rosen-ui/swr-helpers": "^0.1.0", - "@rosen-ui/utils": "^0.3.0", + "@rosen-bridge/icons": "^0.5.0", + "@rosen-ui/common-hooks": "^0.1.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.1.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", @@ -16998,7 +25311,7 @@ }, "packages/utils": { "name": "@rosen-ui/utils", - "version": "0.3.0", + "version": "0.4.1", "dependencies": { "@rosen-bridge/json-bigint": "^0.1.0", "buffer": "^6.0.3", @@ -17031,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/tokens": "^1.1.0", - "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.3.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-bridge/icons": "^0.5.0", + "@rosen-bridge/tokens": "^1.2.1", + "@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", @@ -17064,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/tokens": "^1.1.0", - "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.3.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-bridge/icons": "^0.5.0", + "@rosen-bridge/tokens": "^1.2.1", + "@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", @@ -17097,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/tokens": "^1.1.0", - "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.3.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-bridge/icons": "^0.5.0", + "@rosen-bridge/tokens": "^1.2.1", + "@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", @@ -17128,15 +25441,50 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "wallets/metamask-wallet": { + "name": "@rosen-ui/metamask-wallet", + "version": "0.1.1", + "dependencies": { + "@metamask/sdk": "^0.28.2", + "@rosen-bridge/icons": "^0.5.0", + "@rosen-bridge/tokens": "^1.2.1", + "@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", + "@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", + "version": "1.0.0", "dependencies": { - "@rosen-bridge/icons": "^0.4.0", - "@rosen-bridge/tokens": "^1.1.0", - "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.3.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-bridge/icons": "^0.5.0", + "@rosen-bridge/tokens": "^1.2.1", + "@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", @@ -17163,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.1.0", - "@rosen-ui/utils": "^0.3.0", + "@rosen-bridge/tokens": "^1.2.1", + "@rosen-ui/utils": "^0.4.1", "@typescript-eslint/eslint-plugin": "^5.30.7", "@typescript-eslint/parser": "^5.26.0", "eslint": "^8.16.0", @@ -17199,14 +25547,14 @@ }, "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.3.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.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", @@ -17231,12 +25579,13 @@ }, "wallets/wallet-api": { "name": "@rosen-ui/wallet-api", - "version": "1.0.2", + "version": "1.0.3", "dependencies": { - "@rosen-ui/utils": "^0.3.0" + "@rosen-ui/types": "^0.3.0", + "@rosen-ui/utils": "^0.4.1" }, "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", @@ -17264,16 +25613,15 @@ }, "wallets/xdefi-wallet": { "name": "@rosen-ui/xdefi-wallet", - "version": "0.4.0", + "version": "1.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.1.0", - "@rosen-network/bitcoin": "^0.2.0", - "@rosen-ui/constants": "^0.0.3", - "@rosen-ui/utils": "^0.3.0", - "@rosen-ui/wallet-api": "^1.0.2", + "@rosen-bridge/icons": "^0.5.0", + "@rosen-bridge/tokens": "^1.2.1", + "@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/package.json b/package.json index 704a7c93..db9568f9 100644 --- a/package.json +++ b/package.json @@ -8,12 +8,15 @@ "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", "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/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/lib/asset-calculator.ts b/packages/asset-calculator/lib/asset-calculator.ts index 93cfc6c9..cb221076 100644 --- a/packages/asset-calculator/lib/asset-calculator.ts +++ b/packages/asset-calculator/lib/asset-calculator.ts @@ -17,13 +17,16 @@ import { BitcoinCalculatorInterface, CardanoCalculatorInterface, ErgoCalculatorInterface, + EthereumCalculatorInterface, } 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'; 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,29 +40,42 @@ class AssetCalculator { ergoCalculator: ErgoCalculatorInterface, cardanoCalculator: CardanoCalculatorInterface, bitcoinCalculator: BitcoinCalculatorInterface, + ethereumCalculator: EthereumCalculatorInterface, dataSource: DataSource, protected readonly logger: AbstractLogger = new DummyLogger() ) { 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 ); - this.calculatorMap.set(ERGO_CHAIN, ergoAssetCalculator); - this.calculatorMap.set(CARDANO_CHAIN, cardanoAssetCalculator); - this.calculatorMap.set(BITCOIN_CHAIN, bitcoinAssetCalculator); + const ethereumAssetCalculator = new EvmCalculator( + NETWORKS.ETHEREUM, + this.tokens, + ethereumCalculator.addresses, + ethereumCalculator.rpcUrl, + ethereumCalculator.authToken, + logger + ); + this.calculatorMap.set(NETWORKS.ERGO, ergoAssetCalculator); + this.calculatorMap.set(NETWORKS.CARDANO, cardanoAssetCalculator); + this.calculatorMap.set(NETWORKS.BITCOIN, bitcoinAssetCalculator); + this.calculatorMap.set(NETWORKS.ETHEREUM, ethereumAssetCalculator); this.bridgedAssetModel = new BridgedAssetModel(dataSource, logger); this.lockedAssetModel = new LockedAssetModel(dataSource, logger); this.tokenModel = new TokenModel(dataSource, logger); @@ -72,7 +88,7 @@ class AssetCalculator { */ private getTokenIdOnResidentChain = ( token: RosenChainToken, - residencyChain: string + residencyChain: Network ): string => { const chainIdKey = this.tokens.getIdKey(residencyChain); @@ -87,8 +103,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, { @@ -107,8 +123,8 @@ class AssetCalculator { */ private calculateEmissionForChain = async ( token: RosenChainToken, - chain: string, - residencyChain: string + chain: Network, + residencyChain: Network ): Promise => { const calculator = this.calculatorMap.get(chain); @@ -116,6 +132,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)); @@ -138,7 +158,7 @@ class AssetCalculator { */ private calculateLocked = async ( token: RosenChainToken, - residencyChain: string + residencyChain: Network ) => { const calculator = this.calculatorMap.get(residencyChain); @@ -173,23 +193,29 @@ 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 = []; 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); @@ -202,7 +228,9 @@ class AssetCalculator { )}` ); - const chains = this.tokens.getSupportedChains(residencyChain); + const chains = this.tokens.getSupportedChains( + residencyChain + ) as Network[]; for (const nativeResidentToken of nativeResidentTokens) { const newToken = { @@ -251,8 +279,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, diff --git a/packages/asset-calculator/lib/calculator/abstract-calculator.ts b/packages/asset-calculator/lib/calculator/abstract-calculator.ts index 7257f2a2..82aff192 100644 --- a/packages/asset-calculator/lib/calculator/abstract-calculator.ts +++ b/packages/asset-calculator/lib/calculator/abstract-calculator.ts @@ -1,26 +1,64 @@ -import { RosenChainToken } from '@rosen-bridge/tokens'; +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: Network; + 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..dff97940 100644 --- a/packages/asset-calculator/lib/calculator/chains/bitcoin-calculator.ts +++ b/packages/asset-calculator/lib/calculator/chains/bitcoin-calculator.ts @@ -1,8 +1,10 @@ -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'; 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,14 +17,17 @@ interface PartialEsploraAddress { } export class BitcoinCalculator extends AbstractCalculator { + readonly chain: Network = NETWORKS.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 +36,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 +51,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..a249acd6 100644 --- a/packages/asset-calculator/lib/calculator/chains/cardano-calculator.ts +++ b/packages/asset-calculator/lib/calculator/chains/cardano-calculator.ts @@ -1,19 +1,24 @@ -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'; +import { NETWORKS } from '@rosen-ui/constants'; +import { Network } from '@rosen-ui/types'; export class CardanoCalculator extends AbstractCalculator { + readonly chain: Network = NETWORKS.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 +26,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 +45,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 +67,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..931d11b2 100644 --- a/packages/asset-calculator/lib/calculator/chains/ergo-calculator.ts +++ b/packages/asset-calculator/lib/calculator/chains/ergo-calculator.ts @@ -1,20 +1,25 @@ -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'; 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: Network = NETWORKS.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 +27,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 +44,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 = @@ -48,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; }; @@ -79,7 +86,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/lib/calculator/chains/evm-calculator.ts b/packages/asset-calculator/lib/calculator/chains/evm-calculator.ts new file mode 100644 index 00000000..6a44149b --- /dev/null +++ b/packages/asset-calculator/lib/calculator/chains/evm-calculator.ts @@ -0,0 +1,106 @@ +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'; +import { Network } from '@rosen-ui/types'; + +export class EvmCalculator extends AbstractCalculator { + readonly chain: Network; + private readonly provider: JsonRpcProvider; + + constructor( + chain: Network, + 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..b13b0faf 100644 --- a/packages/asset-calculator/lib/constants.ts +++ b/packages/asset-calculator/lib/constants.ts @@ -1,3 +1,61 @@ -export const BITCOIN_CHAIN = 'bitcoin'; -export const CARDANO_CHAIN = 'cardano'; -export const ERGO_CHAIN = 'ergo'; +import { InterfaceAbi } from 'ethers'; + +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/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/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 1c29fd5c..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", @@ -32,12 +32,14 @@ }, "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.0.1", - "@rosen-clients/cardano-koios": "^2.0.1", - "@rosen-clients/ergo-explorer": "^1.0.3", + "@rosen-bridge/tokens": "^1.2.1", + "@rosen-clients/cardano-koios": "^2.0.3", + "@rosen-clients/ergo-explorer": "^1.1.2", + "@rosen-ui/types": "^0.3.0", "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..2daee9a6 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'; @@ -22,6 +22,7 @@ describe('AssetCalculator', () => { }, { addresses: ['hotAddr', 'coldAddr'], koiosUrl: 'koiosUrl' }, { addresses: ['hotAddr', 'coldAddr'], esploraUrl: 'esploraUrl' }, + { addresses: ['hotAddr', 'coldAddr'], rpcUrl: 'rpcUrl' }, dataSource ); }); @@ -42,12 +43,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 +69,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); }); @@ -94,6 +95,7 @@ describe('AssetCalculator', () => { }, { addresses: ['hotAddr', 'coldAddr'], koiosUrl: 'koiosUrl' }, { addresses: ['hotAddr', 'coldAddr'], esploraUrl: 'esploraUrl' }, + { addresses: ['hotAddr', 'coldAddr'], rpcUrl: 'rpcUrl' }, dataSource ); }); @@ -117,11 +119,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); @@ -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'] = () => @@ -208,9 +211,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( @@ -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); @@ -320,9 +324,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/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' ); 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/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/constants/src/index.ts b/packages/constants/src/index.ts index b8bb78ad..07a5740e 100644 --- a/packages/constants/src/index.ts +++ b/packages/constants/src/index.ts @@ -8,9 +8,26 @@ export const TOKEN_NAME_PLACEHOLDER = 'unnamed token'; export const HEALTH_DATA_REFRESH_INTERVAL = 60000; -export const Networks = { +/** + * The order should be Ergo, Cardano, Bitcoin, Ethereum. + * This sequence should be consistently used as the SUPPORTED_CHAINS. + */ +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', +}; 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/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/icons/shield-question.svg b/packages/icons/src/icons/shield-question.svg new file mode 100644 index 00000000..4da48c35 --- /dev/null +++ b/packages/icons/src/icons/shield-question.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/icons/src/index.ts b/packages/icons/src/index.ts index b62cf8be..97fca35f 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'; @@ -31,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/icons/src/networks/ethereum.svg b/packages/icons/src/networks/ethereum.svg new file mode 100644 index 00000000..1fde3792 --- /dev/null +++ b/packages/icons/src/networks/ethereum.svg @@ -0,0 +1,7 @@ + + + + + + + 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..b717b9a8 --- /dev/null +++ b/packages/icons/src/wallets/metamask.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/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/CHANGELOG.md b/packages/types/CHANGELOG.md index 501e1ad7..515950b9 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,21 @@ # @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 + +- 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..26edf2c5 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.3.0", "private": true, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -19,5 +19,8 @@ "eslint-config-prettier": "^9.0.0", "prettier": "^3.0.2", "typescript": "^5.0.0" + }, + "dependencies": { + "@rosen-ui/constants": "^0.0.4" } } diff --git a/packages/types/src/common.ts b/packages/types/src/common.ts index bae85f05..f4f01b31 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 { @@ -22,9 +24,13 @@ export interface TokenInfoWithColdAmount extends TokenInfo { export interface HealthParamInfo { id: string; + title: string; + details?: string; status: 'Healthy' | 'Unstable' | 'Broken'; - lastCheck: string; - description?: string; + lastCheck?: string; + description: string; + lastTrialErrorMessage?: string; + lastTrialErrorTime?: string; } export interface Paginated { @@ -38,3 +44,8 @@ export interface MutationRequestBodyWithHeaders { [headerKey: string]: string | number; }; } + +// This is the Rosen wrapped-value +export type RosenAmountValue = bigint; + +export type Network = (typeof NETWORKS)[keyof typeof NETWORKS]; diff --git a/packages/ui-kit/CHANGELOG.md b/packages/ui-kit/CHANGELOG.md index 9b864e9d..46fa790c 100644 --- a/packages/ui-kit/CHANGELOG.md +++ b/packages/ui-kit/CHANGELOG.md @@ -1,4 +1,28 @@ -# @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 + +### 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 diff --git a/packages/ui-kit/package.json b/packages/ui-kit/package.json index 19db244f..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.1.2", + "version": "1.3.0", "type": "module", "files": [ "dist" @@ -32,7 +32,7 @@ "swr": "^2.1.5" }, "devDependencies": { - "@rosen-ui/types": "^0.1.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,10 +46,11 @@ "dependencies": { "@mui/lab": "^5.0.0-alpha.134", "@mui/material": "^5.13.4", - "@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-bridge/icons": "^0.5.0", + "@rosen-ui/common-hooks": "^0.1.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/ui-kit/src/Providers/ThemeProvider.tsx b/packages/ui-kit/src/Providers/ThemeProvider.tsx index 9e80f080..39c941c5 100644 --- a/packages/ui-kit/src/Providers/ThemeProvider.tsx +++ b/packages/ui-kit/src/Providers/ThemeProvider.tsx @@ -1,14 +1,54 @@ -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', + // eslint-disable-next-line @typescript-eslint/no-empty-function + 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/base/Drawer.tsx b/packages/ui-kit/src/components/base/Drawer.tsx new file mode 100644 index 00000000..4a6f1d70 --- /dev/null +++ b/packages/ui-kit/src/components/base/Drawer.tsx @@ -0,0 +1,2 @@ +export { Drawer } from '@mui/material'; +export type { DrawerProps } from '@mui/material'; diff --git a/packages/ui-kit/src/components/base/index.ts b/packages/ui-kit/src/components/base/index.ts index f5905e62..735206b9 100644 --- a/packages/ui-kit/src/components/base/index.ts +++ b/packages/ui-kit/src/components/base/index.ts @@ -16,6 +16,7 @@ export * from './CircularProgress'; export * from './Collapse'; export * from './CssBaseLine'; export * from './Divider'; +export * from './Drawer'; export * from './Dialog'; export * from './DialogActions'; export * from './DialogContent'; 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/HealthParamCard.tsx b/packages/ui-kit/src/components/common/HealthParamCard.tsx index 5d2efeb6..82383f32 100644 --- a/packages/ui-kit/src/components/common/HealthParamCard.tsx +++ b/packages/ui-kit/src/components/common/HealthParamCard.tsx @@ -1,20 +1,28 @@ 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 { Button, SvgIcon, Typography } from '../base'; +import { Alert, LoadingButton, SvgIcon, Tooltip, Typography } from '../base'; export type HealthParamCardProps = HealthParamInfo & { + checking?: boolean; handleCheckNow: () => void; }; /** * render a healt param card to be used in health page * * @param id + * @param title + * @param details * @param status * @param description * @param lastCheck @@ -22,9 +30,14 @@ export type HealthParamCardProps = HealthParamInfo & { */ export const HealthParamCard = ({ id, + title, + details, status, description, lastCheck, + lastTrialErrorMessage, + lastTrialErrorTime, + checking, handleCheckNow, }: HealthParamCardProps) => { const theme = useTheme(); @@ -40,21 +53,63 @@ export const HealthParamCard = ({ } }, [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; + 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' }, + color: colors.cardColor, + '& span': { + color: 'inherit', + display: 'flex', + justifyContent: 'space-between', + }, }, }} contentProps={{ @@ -64,20 +119,35 @@ 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')}) + {checking ? 'Checking' : 'Check now'} + + {lastCheck && + `(Last check: ${moment(lastCheck).format('DD/MM/YYYY HH:mm:ss')})`} } > - {id} + {title} {description} + {details && ( + + {details} + + )} ); }; 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 ( 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/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)} - - {' '} - ❄️ - + ❄️ )} 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); diff --git a/packages/utils/CHANGELOG.md b/packages/utils/CHANGELOG.md index b0d93995..51be78a7 100644 --- a/packages/utils/CHANGELOG.md +++ b/packages/utils/CHANGELOG.md @@ -1,5 +1,17 @@ # @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 + +- 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..b7208ba9 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.1", "main": "dist/src/index.js", "types": "dist/src/index.d.ts", "type": "module", diff --git a/packages/utils/src/getAddressUrl.ts b/packages/utils/src/getAddressUrl.ts new file mode 100644 index 00000000..d18b67ed --- /dev/null +++ b/packages/utils/src/getAddressUrl.ts @@ -0,0 +1,17 @@ +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]: 'https://etherscan.io/address', +}; + +export const getAddressUrl = (network: Network, address?: string) => { + const baseURL = baseAddressURLs[network as keyof typeof baseAddressURLs]; + + 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..22e30743 --- /dev/null +++ b/packages/utils/src/getTokenUrl.ts @@ -0,0 +1,17 @@ +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]: 'https://etherscan.io/token', +}; + +export const getTokenUrl = (network: Network, tokenId?: string) => { + const baseURL = baseTokenURLs[network as keyof typeof baseTokenURLs]; + + if (!baseURL || !tokenId) return null; + + return `${baseURL}/${tokenId}`; +}; diff --git a/packages/utils/src/getTxUrl.ts b/packages/utils/src/getTxUrl.ts index d43c50f2..2e1dd427 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]: 'https://etherscan.io/tx', }; -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/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'; 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, }, }, }); 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 1313e30e..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/tokens": "^1.1.0", - "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.3.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-bridge/icons": "^0.5.0", + "@rosen-bridge/tokens": "^1.2.1", + "@rosen-network/cardano": "^1.0.0", + "@rosen-ui/utils": "^0.4.1", + "@rosen-ui/wallet-api": "^1.0.3" } } 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/eternl-wallet/src/getBalance.ts b/wallets/eternl-wallet/src/getBalance.ts index d6ac9db3..dd85e99b 100644 --- a/wallets/eternl-wallet/src/getBalance.ts +++ b/wallets/eternl-wallet/src/getBalance.ts @@ -1,15 +1,33 @@ 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'; export const getBalanceCreator = (config: WalletCreatorConfig) => - async (token: RosenChainToken): Promise => { - const context = await getEternlWallet().api.enable(); + 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); - return amount ? Number(amount.quantity) : 0; + const amount = balances.find( + (asset) => + asset.policyId === token.policyId && + (asset.nameHex === hexToCbor(token.assetName) || !token.policyId) + ); + + if (!amount) return 0n; + + const tokenMap = await config.getTokenMap(); + + const wrappedAmount = tokenMap.wrapAmount( + token[tokenMap.getIdKey(NETWORKS.CARDANO)], + amount.quantity, + NETWORKS.CARDANO + ).amount; + + return wrappedAmount; }; 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..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 { convertNumberToBigint, validateDecimalPlaces } from '@rosen-ui/utils'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; import { getEternlWallet } from './getEternlWallet'; @@ -8,27 +8,16 @@ export const transferCreator = (config: WalletCreatorConfig) => async ( token: RosenChainToken, - decimalAmount: number, - toChain: string, + amount: RosenAmountValue, + toChain: Network, toAddress: string, - decimalBridgeFee: number, - decimalNetworkFee: number, + bridgeFee: RosenAmountValue, + networkFee: RosenAmountValue, lockAddress: string ): Promise => { - validateDecimalPlaces(decimalAmount, token.decimals); - 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); - const bridgeFee = convertNumberToBigint( - decimalBridgeFee * 10 ** token.decimals - ); - const networkFee = convertNumberToBigint( - decimalNetworkFee * 10 ** token.decimals - ); const changeAddressHex = await wallet.getChangeAddress(); const auxiliaryDataHex = await config.generateLockAuxiliaryData( @@ -47,7 +36,7 @@ export const transferCreator = changeAddressHex, policyIdHex, assetNameHex, - amount.toString(), + amount, auxiliaryDataHex ); 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 98e28363..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/tokens": "^1.1.0", - "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.3.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-bridge/icons": "^0.5.0", + "@rosen-bridge/tokens": "^1.2.1", + "@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/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/flint-wallet/src/getBalance.ts b/wallets/flint-wallet/src/getBalance.ts index fc45b77e..63f05992 100644 --- a/wallets/flint-wallet/src/getBalance.ts +++ b/wallets/flint-wallet/src/getBalance.ts @@ -1,15 +1,33 @@ 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'; export const getBalanceCreator = (config: WalletCreatorConfig) => - async (token: RosenChainToken): Promise => { - const context = await getFlintWallet().api.enable(); + 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); - return amount ? Number(amount.quantity) : 0; + const amount = balances.find( + (asset) => + asset.policyId === token.policyId && + (asset.nameHex === hexToCbor(token.assetName) || !token.policyId) + ); + + if (!amount) return 0n; + + const tokenMap = await config.getTokenMap(); + + const wrappedAmount = tokenMap.wrapAmount( + token[tokenMap.getIdKey(NETWORKS.CARDANO)], + amount.quantity, + NETWORKS.CARDANO + ).amount; + + return wrappedAmount; }; 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..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 { convertNumberToBigint, validateDecimalPlaces } from '@rosen-ui/utils'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; import { getFlintWallet } from './getFlintWallet'; @@ -8,27 +8,16 @@ export const transferCreator = (config: WalletCreatorConfig) => async ( token: RosenChainToken, - decimalAmount: number, - toChain: string, + amount: RosenAmountValue, + toChain: Network, toAddress: string, - decimalBridgeFee: number, - decimalNetworkFee: number, + bridgeFee: RosenAmountValue, + networkFee: RosenAmountValue, lockAddress: string ): Promise => { - validateDecimalPlaces(decimalAmount, token.decimals); - 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); - const bridgeFee = convertNumberToBigint( - decimalBridgeFee * 10 ** token.decimals - ); - const networkFee = convertNumberToBigint( - decimalNetworkFee * 10 ** token.decimals - ); const changeAddressHex = await wallet.getChangeAddress(); const auxiliaryDataHex = await config.generateLockAuxiliaryData( @@ -47,7 +36,7 @@ export const transferCreator = changeAddressHex, policyIdHex, assetNameHex, - amount.toString(), + amount, auxiliaryDataHex ); 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 9c290881..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/tokens": "^1.1.0", - "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.3.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-bridge/icons": "^0.5.0", + "@rosen-bridge/tokens": "^1.2.1", + "@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/src/getBalance.ts b/wallets/lace-wallet/src/getBalance.ts index 237b3467..0a33b5c2 100644 --- a/wallets/lace-wallet/src/getBalance.ts +++ b/wallets/lace-wallet/src/getBalance.ts @@ -1,15 +1,33 @@ 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'; export const getBalanceCreator = (config: WalletCreatorConfig) => - async (token: RosenChainToken): Promise => { - const context = await getLaceWallet().api.enable(); + 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); - return amount ? Number(amount.quantity) : 0; + const amount = balances.find( + (asset) => + asset.policyId === token.policyId && + (asset.nameHex === hexToCbor(token.assetName) || !token.policyId) + ); + + if (!amount) return 0n; + + const tokenMap = await config.getTokenMap(); + + const wrappedAmount = tokenMap.wrapAmount( + token[tokenMap.getIdKey(NETWORKS.CARDANO)], + amount.quantity, + NETWORKS.CARDANO + ).amount; + + return wrappedAmount; }; 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/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/lace-wallet/src/transfer.ts b/wallets/lace-wallet/src/transfer.ts index 3580a272..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 { convertNumberToBigint, validateDecimalPlaces } from '@rosen-ui/utils'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; import { getLaceWallet } from './getLaceWallet'; @@ -8,27 +8,16 @@ export const transferCreator = (config: WalletCreatorConfig) => async ( token: RosenChainToken, - decimalAmount: number, - toChain: string, + amount: RosenAmountValue, + toChain: Network, toAddress: string, - decimalBridgeFee: number, - decimalNetworkFee: number, + bridgeFee: RosenAmountValue, + networkFee: RosenAmountValue, lockAddress: string ): Promise => { - validateDecimalPlaces(decimalAmount, token.decimals); - 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); - const bridgeFee = convertNumberToBigint( - decimalBridgeFee * 10 ** token.decimals - ); - const networkFee = convertNumberToBigint( - decimalNetworkFee * 10 ** token.decimals - ); const changeAddressHex = await wallet.getChangeAddress(); const auxiliaryDataHex = await config.generateLockAuxiliaryData( @@ -47,7 +36,7 @@ export const transferCreator = changeAddressHex, policyIdHex, assetNameHex, - amount.toString(), + amount, auxiliaryDataHex ); 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..67b43deb --- /dev/null +++ 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/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..8238c8f1 --- /dev/null +++ b/wallets/metamask-wallet/package.json @@ -0,0 +1,30 @@ +{ + "name": "@rosen-ui/metamask-wallet", + "version": "0.1.1", + "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.5.0", + "@rosen-bridge/tokens": "^1.2.1", + "@rosen-network/ethereum": "^0.1.1", + "@rosen-ui/utils": "^0.4.1", + "@rosen-ui/wallet-api": "^1.0.3" + } +} 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..08d098a6 --- /dev/null +++ b/wallets/metamask-wallet/src/getBalance.ts @@ -0,0 +1,55 @@ +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'; + +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 tokenMap = await config.getTokenMap(); + + const tokenId = token[tokenMap.getIdKey(NETWORKS.ETHEREUM)]; + + 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)], + BigInt(amount), + 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..8786623e --- /dev/null +++ b/wallets/metamask-wallet/src/isMetaMaskAvailable.ts @@ -0,0 +1,17 @@ +/** + * global type augmentation for the wallet + */ +declare global { + let ethereum: { + isMetaMask: boolean; + _metamask: any; + }; +} + +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..6730317d --- /dev/null +++ b/wallets/metamask-wallet/src/transfer.ts @@ -0,0 +1,56 @@ +import { RosenChainToken } from '@rosen-bridge/tokens'; +import { WalletCreatorConfig } from '@rosen-network/ethereum'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; + +import { getMetaMaskWallet } from './getMetaMaskWallet'; +import { NETWORKS } from '@rosen-ui/constants'; + +export const transferCreator = + (config: WalletCreatorConfig) => + async ( + token: RosenChainToken, + amount: RosenAmountValue, + toChain: Network, + toAddress: string, + bridgeFee: RosenAmountValue, + networkFee: RosenAmountValue, + lockAddress: string + ): Promise => { + 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/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"] +} 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 36580de0..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/tokens": "^1.1.0", - "@rosen-network/cardano": "^0.1.1", - "@rosen-ui/utils": "^0.3.0", - "@rosen-ui/wallet-api": "^1.0.2" + "@rosen-bridge/icons": "^0.5.0", + "@rosen-bridge/tokens": "^1.2.1", + "@rosen-network/cardano": "^1.0.0", + "@rosen-ui/utils": "^0.4.1", + "@rosen-ui/wallet-api": "^1.0.3" } } diff --git a/wallets/nami-wallet/src/getBalance.ts b/wallets/nami-wallet/src/getBalance.ts index 01e8ca75..100e9178 100644 --- a/wallets/nami-wallet/src/getBalance.ts +++ b/wallets/nami-wallet/src/getBalance.ts @@ -1,13 +1,15 @@ 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 => { - const context = await getNamiWallet().api.enable(); + async (token: RosenChainToken): Promise => { + const context = await getNamiWallet().getApi().enable(); const rawValue = await context.getBalance(); const balances = await config.decodeWasmValue(rawValue); @@ -16,5 +18,16 @@ export const getBalanceCreator = asset.policyId === token.policyId && (asset.nameHex === hexToCbor(token.assetName) || !token.policyId) ); - return amount ? Number(amount.quantity) : 0; + + if (!amount) return 0n; + + const tokenMap = await config.getTokenMap(); + + const wrappedAmount = tokenMap.wrapAmount( + token[tokenMap.getIdKey(NETWORKS.CARDANO)], + amount.quantity, + NETWORKS.CARDANO + ).amount; + + return wrappedAmount; }; 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/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/nami-wallet/src/transfer.ts b/wallets/nami-wallet/src/transfer.ts index bf884c0a..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 { convertNumberToBigint, validateDecimalPlaces } from '@rosen-ui/utils'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; import { getNamiWallet } from './getNamiWallet'; @@ -8,27 +8,16 @@ export const transferCreator = (config: WalletCreatorConfig) => async ( token: RosenChainToken, - decimalAmount: number, - toChain: string, + amount: RosenAmountValue, + toChain: Network, toAddress: string, - decimalBridgeFee: number, - decimalNetworkFee: number, + bridgeFee: RosenAmountValue, + networkFee: RosenAmountValue, lockAddress: string ): Promise => { - validateDecimalPlaces(decimalAmount, token.decimals); - 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); - const bridgeFee = convertNumberToBigint( - decimalBridgeFee * 10 ** token.decimals - ); - const networkFee = convertNumberToBigint( - decimalNetworkFee * 10 ** token.decimals - ); const changeAddressHex = await wallet.getChangeAddress(); const auxiliaryDataHex = await config.generateLockAuxiliaryData( @@ -47,7 +36,7 @@ export const transferCreator = changeAddressHex, policyIdHex, assetNameHex, - amount.toString(), + amount, auxiliaryDataHex ); 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 4e6f92cf..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", @@ -12,8 +12,8 @@ "type-check": "tsc --noEmit" }, "devDependencies": { - "@rosen-bridge/tokens": "^1.1.0", - "@rosen-ui/utils": "^0.3.0", + "@rosen-bridge/tokens": "^1.2.1", + "@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/nautilus-wallet/src/getBalance.ts b/wallets/nautilus-wallet/src/getBalance.ts index 02af05be..e796ab96 100644 --- a/wallets/nautilus-wallet/src/getBalance.ts +++ b/wallets/nautilus-wallet/src/getBalance.ts @@ -1,14 +1,18 @@ 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 { RosenAmountValue } from '@rosen-ui/types'; import { getNautilusWallet } from './getNautilusWallet'; export const getBalanceCreator = (config: WalletCreatorConfig) => - async (token: RosenChainToken): Promise => { - const context = await getNautilusWallet().api.getContext(); - const tokenId = (token as ErgoToken).tokenId; + async (token: RosenChainToken): Promise => { + const context = await getNautilusWallet().getApi().getContext(); + + 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 +20,16 @@ export const getBalanceCreator = const balance = await context.get_balance( tokenId === 'erg' ? 'ERG' : tokenId ); - return +balance; + + const amount = BigInt(balance); + + if (!amount) return 0n; + + const wrappedAmount = tokenMap.wrapAmount( + tokenId, + amount, + NETWORKS.ERGO + ).amount; + + return wrappedAmount; }; 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/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/nautilus-wallet/src/transfer.ts b/wallets/nautilus-wallet/src/transfer.ts index fd6600c7..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 { convertNumberToBigint, validateDecimalPlaces } from '@rosen-ui/utils'; +import { Network, RosenAmountValue } from '@rosen-ui/types'; import { getNautilusWallet } from './getNautilusWallet'; @@ -8,26 +8,15 @@ export const transferCreator = (config: WalletCreatorConfig) => async ( token: RosenChainToken, - decimalAmount: number, - toChain: string, + amount: RosenAmountValue, + toChain: Network, toAddress: string, - decimalBridgeFee: number, - decimalNetworkFee: number, + bridgeFee: RosenAmountValue, + networkFee: RosenAmountValue, lockAddress: string ): Promise => { - validateDecimalPlaces(decimalAmount, token.decimals); - 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( - decimalBridgeFee * 10 ** token.decimals - ); - const networkFee = convertNumberToBigint( - decimalNetworkFee * 10 ** token.decimals - ); const changeAddress = await wallet.get_change_address(); const walletUtxos = await wallet.get_utxos(); @@ -39,10 +28,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/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 98cffa20..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", @@ -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", @@ -21,8 +21,8 @@ "typescript": "^5.0.0" }, "dependencies": { - "@rosen-bridge/icons": "^0.4.0", - "@rosen-ui/utils": "^0.3.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/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/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 99569a29..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", @@ -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", @@ -21,7 +21,8 @@ "typescript": "^5.0.0" }, "dependencies": { - "@rosen-ui/utils": "^0.3.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/wallet-api/src/index.ts b/wallets/wallet-api/src/index.ts index 7e8e88bd..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 9250fa87..5375e5c8 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 { Network, RosenAmountValue } from '@rosen-ui/types'; export enum WalletState { NOT_CONNECTED, @@ -26,21 +27,22 @@ 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, - toChain: string, + amount: RosenAmountValue, + toChain: Network, address: string, - bridgeFee: number, - networkFee: number, + bridgeFee: RosenAmountValue, + networkFee: RosenAmountValue, lockAddress: string ) => Promise; readonly getAddress: () => Promise; + readonly isAvailable: () => boolean; } export interface RawWallet extends WalletBase { - api: Api; + getApi: () => Api; } export * from './common'; 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 11d350b5..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", @@ -20,14 +20,13 @@ "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.1.0", - "@rosen-network/bitcoin": "^0.2.0", - "@rosen-ui/constants": "^0.0.3", - "@rosen-ui/utils": "^0.3.0", - "@rosen-ui/wallet-api": "^1.0.2", + "@rosen-bridge/icons": "^0.5.0", + "@rosen-bridge/tokens": "^1.2.1", + "@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" } } diff --git a/wallets/xdefi-wallet/src/getAddressCreator.ts b/wallets/xdefi-wallet/src/getAddressCreator.ts index 5c7b0c71..34ac7e4f 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() + .getApi() + .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..0b3723a7 100644 --- a/wallets/xdefi-wallet/src/getBalance.ts +++ b/wallets/xdefi-wallet/src/getBalance.ts @@ -1,34 +1,49 @@ 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) => (): Promise => { + (config: WalletCreatorConfig) => + (token: RosenChainToken): Promise => { return new Promise((resolve, reject) => { - getXdefiWallet().api.getAddress({ - payload: { - message: '', - network: { - type: BitcoinNetworkType.Mainnet, + getXdefiWallet() + .getApi() + .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) => + config.getTokenMap().then((tokenMap) => { + const wrappedAmount = tokenMap.wrapAmount( + token[tokenMap.getIdKey(NETWORKS.BITCOIN)], + balance, + NETWORKS.BITCOIN + ).amount; + resolve(wrappedAmount); + }) + ) + .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..5fd56211 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 { Network, RosenAmountValue } from '@rosen-ui/types'; import { getXdefiWallet } from './getXdefiWallet'; @@ -12,46 +12,36 @@ export const transferCreator = (config: WalletCreatorConfig) => async ( token: RosenChainToken, - decimalAmount: number, - toChain: string, + amount: RosenAmountValue, + toChain: Network, toAddress: string, - decimalBridgeFee: number, - decimalNetworkFee: number, + bridgeFee: RosenAmountValue, + networkFee: RosenAmountValue, 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 userAddress: string = await new Promise((resolve, reject) => { - getXdefiWallet().api.getAddress({ - payload: { - message: '', - network: { - type: BitcoinNetworkType.Mainnet, + getXdefiWallet() + .getApi() + .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( @@ -65,37 +55,40 @@ export const transferCreator = lockAddress, userAddress, amount, - opReturnData + opReturnData, + token ); 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() + .getApi() + .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; }; 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),