diff --git a/.github/workflows/docker-ghostnet-front-staging.yml b/.github/workflows/docker-ghostnet-front-staging.yml
new file mode 100644
index 00000000..e88f3a08
--- /dev/null
+++ b/.github/workflows/docker-ghostnet-front-staging.yml
@@ -0,0 +1,67 @@
+name: Docker ghostnet front staging
+
+on:
+ push:
+ branches:
+ - 'release-ghostnet-staging'
+ - 'release-ghostnet-beta'
+ pull_request:
+ branches:
+ - 'release-ghostnet-staging'
+ - 'release-ghostnet-beta'
+ types:
+ - closed
+ workflow_dispatch:
+
+jobs:
+ ui:
+ strategy:
+ matrix:
+ network: [ghostnet]
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3.0.0
+ with:
+ submodules: true
+
+ - name: Set outputs
+ id: vars
+ run: |
+ echo "date=$(date +%Y-%m-%dT%H-%M-%S)" >> "${GITHUB_OUTPUT}"
+ echo "sha_short=$(git rev-parse --short HEAD)" >> "${GITHUB_OUTPUT}"
+
+ - name: Set up Docker Buildx
+ uses: docker/Setup-buildx-action@v2
+
+ - name: Login to GitHub Container Registry
+ uses: docker/login-action@v2
+ with:
+ registry: ghcr.io
+ username: ${{ github.repository_owner }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Build and push ui version release-ghostnet-staging
+ if: github.ref == 'refs/heads/release-ghostnet-staging'
+ uses: docker/build-push-action@v3
+ with:
+ file: ./batcher-ui/Dockerfile.${{ matrix.network }}
+ context: ./batcher-ui/
+ push: ${{ github.ref == 'refs/heads/release-ghostnet-staging' }}
+ tags: |
+ ghcr.io/marigold-dev/batcher-${{ matrix.network }}:staging
+ ghcr.io/marigold-dev/batcher-${{ matrix.network }}:${{ steps.vars.outputs.date }}-${{ steps.vars.outputs.sha_short }}-staging
+ cache-from: type=gha
+ cache-to: type=gha,mode=max
+
+ - name: Build and push ui version on release-ghostnet-beta
+ if: github.ref == 'refs/heads/release-ghostnet-beta'
+ uses: docker/build-push-action@v3
+ with:
+ file: ./batcher-ui/Dockerfile.${{ matrix.network }}
+ context: ./batcher-ui/
+ push: ${{ github.ref == 'refs/heads/release-ghostnet-beta' }}
+ tags: |
+ ghcr.io/marigold-dev/batcher-${{ matrix.network }}:beta
+ ghcr.io/marigold-dev/batcher-${{ matrix.network }}:${{ steps.vars.outputs.date }}-${{ steps.vars.outputs.sha_short }}-beta
+ cache-from: type=gha
+ cache-to: type=gha,mode=max
diff --git a/batcher-ui/.eslintrc.js b/batcher-ui/.eslintrc.js
deleted file mode 100644
index b882c20e..00000000
--- a/batcher-ui/.eslintrc.js
+++ /dev/null
@@ -1,8 +0,0 @@
-module.exports = {
- extends: [require.resolve('@umijs/fabric/dist/eslint')],
- globals: {
- ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: true,
- page: true,
- REACT_APP_ENV: true,
- },
-};
diff --git a/batcher-ui/.eslintrc.json b/batcher-ui/.eslintrc.json
new file mode 100644
index 00000000..a4502a8c
--- /dev/null
+++ b/batcher-ui/.eslintrc.json
@@ -0,0 +1,24 @@
+{
+ "extends": [
+ "eslint:recommended",
+ "next",
+ "prettier"
+ ],
+ // For more informations, see https://github.com/vercel/next.js/issues/40687#issuecomment-1378845989
+ "overrides": [
+ {
+ // Adapt to your needs (e.g. some might want to only override "next.config.js")
+ "files": [
+ "*.js"
+ ],
+ // This is the default parser of ESLint
+ "parser": "espree",
+ "parserOptions": {
+ "ecmaVersion": 2020
+ }
+ }
+ ],
+ "rules": {
+ "no-unused-vars": "off"
+ }
+}
\ No newline at end of file
diff --git a/batcher-ui/.gitignore b/batcher-ui/.gitignore
index 21ab9fb7..2f598bde 100644
--- a/batcher-ui/.gitignore
+++ b/batcher-ui/.gitignore
@@ -17,7 +17,6 @@ yarn-error.log
/coverage
.idea
yarn.lock
-package-lock.json
pnpm-lock.yaml
*bak
@@ -28,13 +27,10 @@ pnpm-lock.yaml
functions/*
.temp/**
-# umi
-.umi
-.umi-production
-
# screenshot
screenshot
.firebase
.eslintcache
build
+.next
\ No newline at end of file
diff --git a/batcher-ui/.husky/.gitignore b/batcher-ui/.husky/.gitignore
deleted file mode 100644
index 31354ec1..00000000
--- a/batcher-ui/.husky/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-_
diff --git a/batcher-ui/.husky/commit-msg b/batcher-ui/.husky/commit-msg
deleted file mode 100755
index d50cdcf9..00000000
--- a/batcher-ui/.husky/commit-msg
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-. "$(dirname "$0")/_/husky.sh"
-
-# Export Git hook params
-export GIT_PARAMS=$*
-
-npx --no-install fabric verify-commit
diff --git a/batcher-ui/.husky/pre-commit b/batcher-ui/.husky/pre-commit
index d37daa07..36af2198 100755
--- a/batcher-ui/.husky/pre-commit
+++ b/batcher-ui/.husky/pre-commit
@@ -1,4 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
-npx --no-install lint-staged
+npx lint-staged
diff --git a/batcher-ui/.lintstagedrc.js b/batcher-ui/.lintstagedrc.js
new file mode 100644
index 00000000..f85c082b
--- /dev/null
+++ b/batcher-ui/.lintstagedrc.js
@@ -0,0 +1,10 @@
+const path = require('path');
+
+const buildEslintCommand = filenames =>
+ `next lint --fix --file ${filenames
+ .map(f => path.relative(process.cwd(), f))
+ .join(' --file ')}`;
+
+module.exports = {
+ '*.{js,jsx,ts,tsx}': [buildEslintCommand],
+};
diff --git a/batcher-ui/.prettierignore b/batcher-ui/.prettierignore
index d17efb44..b3a247ab 100644
--- a/batcher-ui/.prettierignore
+++ b/batcher-ui/.prettierignore
@@ -1,7 +1,5 @@
**/*.svg
package.json
-.umi
-.umi-production
/dist
.dockerignore
.DS_Store
diff --git a/batcher-ui/.prettierrc.js b/batcher-ui/.prettierrc.js
deleted file mode 100644
index 7b597d78..00000000
--- a/batcher-ui/.prettierrc.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const fabric = require('@umijs/fabric');
-
-module.exports = {
- ...fabric.prettier,
-};
diff --git a/batcher-ui/.prettierrc.json b/batcher-ui/.prettierrc.json
new file mode 100644
index 00000000..62ee55b4
--- /dev/null
+++ b/batcher-ui/.prettierrc.json
@@ -0,0 +1,7 @@
+{
+ "singleQuote": true,
+ "trailingComma": "es5",
+ "jsxBracketSameLine": true,
+ "arrowParens": "avoid",
+ "tabWidth": 2
+}
\ No newline at end of file
diff --git a/batcher-ui/.stylelintrc.js b/batcher-ui/.stylelintrc.js
deleted file mode 100644
index a1184de4..00000000
--- a/batcher-ui/.stylelintrc.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
- extends: [require.resolve('@umijs/fabric/dist/stylelint')],
-};
diff --git a/batcher-ui/Dockerfile.ghostnet b/batcher-ui/Dockerfile.ghostnet
index 6f76dbae..cbdefdbf 100644
--- a/batcher-ui/Dockerfile.ghostnet
+++ b/batcher-ui/Dockerfile.ghostnet
@@ -2,18 +2,25 @@ FROM node:latest as builder
WORKDIR /app
+# ENV ENV=ghostnet
+
COPY ./package.json ./
RUN npm install
COPY ./tsconfig.json ./jsconfig.json ./
+COPY ./pages ./pages
COPY ./src ./src
+COPY ./styles ./styles
COPY ./public ./public
-COPY ./img ./img
-COPY ./config ./config
+COPY ./postcss.config.js ./postcss.config.js
+COPY ./next.config.js ./next.config.js
+COPY ./tailwind.config.js ./tailwind.config.js
+
+
+RUN npm run build:ghostnet
-RUN npm run build:ghostnet-ci
+EXPOSE 80
-FROM nginx:latest
+CMD ["npm", "run", "start:ghostnet"]
-COPY --from=builder /app/dist /usr/share/nginx/html
diff --git a/batcher-ui/Dockerfile.staging b/batcher-ui/Dockerfile.staging
new file mode 100644
index 00000000..5787cdae
--- /dev/null
+++ b/batcher-ui/Dockerfile.staging
@@ -0,0 +1,26 @@
+FROM node:latest as builder
+
+WORKDIR /app
+
+# ENV ENV=ghostnet
+
+COPY ./package.json ./
+
+RUN npm install
+
+COPY ./tsconfig.json ./jsconfig.json ./
+COPY ./pages ./pages
+COPY ./src ./src
+COPY ./styles ./styles
+COPY ./public ./public
+COPY ./postcss.config.js ./postcss.config.js
+COPY ./next.config.js ./next.config.js
+COPY ./tailwind.config.js ./tailwind.config.js
+
+
+RUN npm run build:staging
+
+EXPOSE 80
+
+CMD ["npm", "run", "start:staging"]
+
diff --git a/batcher-ui/README.md b/batcher-ui/README.md
index 4c89a727..945f07ce 100644
--- a/batcher-ui/README.md
+++ b/batcher-ui/README.md
@@ -1,6 +1,8 @@
-# Ant Design Pro
+# Batcher User Interface
+
+
+This project is built with React ecosystem. Follow is the quick guide for how to use.
-This project is initialized with [Ant Design Pro](https://pro.ant.design). Follow is the quick guide for how to use.
## Environment Prepare
@@ -10,48 +12,38 @@ Install `node_modules`:
npm install
```
-or
+### Run project in development mode
-```bash
-yarn
-```
-## Provided Scripts
+:warning: For now, Batcher in development runs onto Ghostnet Smart Contract.
-Ant Design Pro provides some useful script to help you quick start and build with web project, code style check and test.
-Scripts provided in `package.json`. It's safe to modify or add additional script:
-### Start project
-```bash
-npm start
-```
-### Build project
-```bash
-npm run build
-```
-### Check code style
```bash
-npm run lint
+npm run dev
+
```
-You can also use script to auto fix some lint error:
+### Start project on GHOSTNET
+
```bash
-npm run lint:fix
+npm run build:ghostnet && npm run start:ghostnet
+
```
-### Test code
+### Build project on MAINNET
+
+
+
```bash
-npm test
-```
+npm run build && npm start
-## More
+```
-You can view full document on our [official website](https://pro.ant.design). And welcome any feedback in our [github](https://github.com/ant-design/ant-design-pro).
diff --git a/batcher-ui/config/config.dev.ts b/batcher-ui/config/config.dev.ts
deleted file mode 100644
index ab0e590f..00000000
--- a/batcher-ui/config/config.dev.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-// https://umijs.org/config/
-import { defineConfig } from 'umi';
-
-export default defineConfig({
- plugins: [
- // https://github.com/zthxxx/react-dev-inspector
- 'react-dev-inspector/plugins/umi/react-inspector',
- ],
- // https://github.com/zthxxx/react-dev-inspector#inspector-loader-props
- inspectorConfig: {
- exclude: [],
- babelPlugins: [],
- babelOptions: {},
- },
-});
diff --git a/batcher-ui/config/config.ghostnet.ts b/batcher-ui/config/config.ghostnet.ts
deleted file mode 100644
index a2026c66..00000000
--- a/batcher-ui/config/config.ghostnet.ts
+++ /dev/null
@@ -1,125 +0,0 @@
-// @ts-nocheck
-import { defineConfig } from 'umi';
-
-import defaultSettings from './defaultSettings';
-import proxy from './proxy';
-
-const { REACT_APP_ENV } = process.env;
-
-const BATCHER_LOGO = 'https://storage.googleapis.com/marigold-public-bucket/batcher-logo.png';
-
-export default defineConfig({
- hash: true,
- antd: {},
- dva: {
- hmr: true,
- },
- layout: {
- // https://umijs.org/zh-CN/plugins/plugin-layout
- locale: true,
- siderWidth: 208,
- ...defaultSettings,
- },
- dynamicImport: {
- loading: '@ant-design/pro-layout/es/PageLoading',
- },
- targets: {
- ie: 11,
- },
- // umi routes: https://umijs.org/docs/routing
- access: {},
- theme: {
- 'root-entry-name': 'variable',
- },
- // esbuild is father build tools
- // https://umijs.org/plugins/plugin-esbuild
- esbuild: {},
- title: false,
- ignoreMomentLocale: true,
- proxy: proxy[REACT_APP_ENV || 'dev'],
- manifest: {
- basePath: '/',
- },
- // Fast Refresh 热更新
- fastRefresh: {},
- nodeModulesTransform: { type: 'none' },
- mfsu: {},
- webpack5: {},
- exportStatic: {},
- favicon:
- 'https://uploads-ssl.webflow.com/616ab4741d375d1642c19027/617952f8510cfc45cbf09312_Favicon(3)(1).png',
- define: {
- REACT_APP_NETWORK_TARGET: 'GHOSTNET',
- REACT_APP_BATCHER_URI: 'https://ghostnet.batcher.marigold.dev',
- REACT_APP_PATH_TO_BATCHER_LOGO: BATCHER_LOGO,
- REACT_APP_TEZOS_NODE_URI: 'https://ghostnet.tezos.marigold.dev',
- REACT_APP_TZKT_URI_API: 'https://api.ghostnet.tzkt.io',
- REACT_APP_BATCHER_CONTRACT_HASH: 'KT1UPMR3WkoFRJYmBBbvv4Z9bBhKYuhCx7Cq',
- GA_TRACKING_ID: 'G-2K59PEELC8',
-
- },
- metas: [
- {
- property: 'og:locale',
- content: 'en_US',
- },
- {
- property: 'og:title',
- content: 'Batcher DEX',
- },
- {
- property: 'og:description',
- content:
- 'The aim of the batch clearing dex is to enable users to deposit tokens with the aim of being swapped at a fair price with bounded slippage and almost no impermanent loss..',
- },
- {
- property: 'og:url',
- content: 'https://batcher.marigold.dev',
- },
- {
- property: 'og:site_name',
- content: 'Batcher DEX',
- },
- {
- property: 'og:image',
- content: BATCHER_LOGO,
- },
- {
- property: 'og:image:secure_url',
- content: BATCHER_LOGO,
- },
- {
- property: 'og:image:width',
- content: '400',
- },
- {
- property: 'og:image:height',
- content: '400',
- },
- {
- name: 'twitter:card',
- content: 'summary',
- },
- {
- name: 'twitter:description',
- content:
- 'The aim of the batch clearing dex is to enable users to deposit tokens with the aim of being swapped at a fair price with bounded slippage and almost no impermanent loss.',
- },
- {
- name: 'twitter:title',
- content: 'Batcher DEX',
- },
- {
- name: 'twitter:site',
- content: '@Marigold_Dev',
- },
- {
- name: 'twitter:image',
- content: BATCHER_LOGO,
- },
- {
- name: 'twitter:creator',
- content: '@Marigold_Dev',
- },
- ],
-});
diff --git a/batcher-ui/config/config.mainnet.ts b/batcher-ui/config/config.mainnet.ts
deleted file mode 100644
index 92c5c02a..00000000
--- a/batcher-ui/config/config.mainnet.ts
+++ /dev/null
@@ -1,124 +0,0 @@
-// @ts-nocheck
-import { defineConfig } from 'umi';
-
-import defaultSettings from './defaultSettings';
-import proxy from './proxy';
-
-const { REACT_APP_ENV } = process.env;
-
-const BATCHER_LOGO = 'https://storage.googleapis.com/marigold-public-bucket/batcher-logo.png';
-
-export default defineConfig({
- hash: true,
- antd: {},
- dva: {
- hmr: true,
- },
- layout: {
- // https://umijs.org/zh-CN/plugins/plugin-layout
- locale: true,
- siderWidth: 208,
- ...defaultSettings,
- },
- dynamicImport: {
- loading: '@ant-design/pro-layout/es/PageLoading',
- },
- targets: {
- ie: 11,
- },
- // umi routes: https://umijs.org/docs/routing
- access: {},
- theme: {
- 'root-entry-name': 'variable',
- },
- // esbuild is father build tools
- // https://umijs.org/plugins/plugin-esbuild
- esbuild: {},
- title: false,
- ignoreMomentLocale: true,
- proxy: proxy[REACT_APP_ENV || 'dev'],
- manifest: {
- basePath: '/',
- },
- // Fast Refresh 热更新
- fastRefresh: {},
- nodeModulesTransform: { type: 'none' },
- mfsu: {},
- webpack5: {},
- exportStatic: {},
- favicon:
- 'https://uploads-ssl.webflow.com/616ab4741d375d1642c19027/617952f8510cfc45cbf09312_Favicon(3)(1).png',
- define: {
- REACT_APP_NETWORK_TARGET: 'MAINNET',
- REACT_APP_BATCHER_URI: 'https://batcher.marigold.dev',
- REACT_APP_PATH_TO_BATCHER_LOGO: BATCHER_LOGO,
- REACT_APP_TEZOS_NODE_URI: 'https://mainnet.tezos.marigold.dev',
- REACT_APP_TZKT_URI_API: 'https://api.tzkt.io',
- REACT_APP_BATCHER_CONTRACT_HASH: 'KT1CoTu4CXcWoVk69Ukbgwx2iDK7ZA4FMSpJ',
- GA_TRACKING_ID: 'G-VS1FBNXJ7N',
- },
- metas: [
- {
- property: 'og:locale',
- content: 'en_US',
- },
- {
- property: 'og:title',
- content: 'Batcher DEX',
- },
- {
- property: 'og:description',
- content:
- 'The aim of the batch clearing dex is to enable users to deposit tokens with the aim of being swapped at a fair price with bounded slippage and almost no impermanent loss..',
- },
- {
- property: 'og:url',
- content: 'https://batcher.marigold.dev',
- },
- {
- property: 'og:site_name',
- content: 'Batcher DEX',
- },
- {
- property: 'og:image',
- content: BATCHER_LOGO,
- },
- {
- property: 'og:image:secure_url',
- content: BATCHER_LOGO,
- },
- {
- property: 'og:image:width',
- content: '400',
- },
- {
- property: 'og:image:height',
- content: '400',
- },
- {
- name: 'twitter:card',
- content: 'summary',
- },
- {
- name: 'twitter:description',
- content:
- 'The aim of the batch clearing dex is to enable users to deposit tokens with the aim of being swapped at a fair price with bounded slippage and almost no impermanent loss.',
- },
- {
- name: 'twitter:title',
- content: 'Batcher DEX',
- },
- {
- name: 'twitter:site',
- content: '@Marigold_Dev',
- },
- {
- name: 'twitter:image',
- content: BATCHER_LOGO,
- },
- {
- name: 'twitter:creator',
- content: '@Marigold_Dev',
- },
- ],
-});
diff --git a/batcher-ui/config/config.ts b/batcher-ui/config/config.ts
deleted file mode 100644
index 1449d67c..00000000
--- a/batcher-ui/config/config.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { defineConfig } from 'umi';
-
-import defaultSettings from './defaultSettings';
-import proxy from './proxy';
-
-const { REACT_APP_ENV } = process.env;
-
-export default defineConfig({
- hash: true,
- antd: {},
- dva: {
- hmr: true,
- },
- layout: {
- // https://umijs.org/zh-CN/plugins/plugin-layout
- locale: true,
- siderWidth: 208,
- ...defaultSettings,
- },
- dynamicImport: {
- loading: '@ant-design/pro-layout/es/PageLoading',
- },
- targets: {
- ie: 11,
- },
- // umi routes: https://umijs.org/docs/routing
- access: {},
- theme: {
- 'root-entry-name': 'variable',
- },
- // esbuild is father build tools
- // https://umijs.org/plugins/plugin-esbuild
- esbuild: {},
- title: false,
- ignoreMomentLocale: true,
- proxy: proxy[REACT_APP_ENV || 'dev'],
- manifest: {
- basePath: '/',
- },
- // Fast Refresh 热更新
- fastRefresh: {},
- nodeModulesTransform: { type: 'none' },
- mfsu: {},
- webpack5: {},
- exportStatic: {},
- define: {
- REACT_APP_BATCHER: 'hello',
- },
-});
diff --git a/batcher-ui/config/defaultSettings.ts b/batcher-ui/config/defaultSettings.ts
deleted file mode 100644
index 682d3d83..00000000
--- a/batcher-ui/config/defaultSettings.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { Settings as LayoutSettings } from '@ant-design/pro-components';
-
-const Settings: LayoutSettings & {
- pwa?: boolean;
- logo?: string;
- disableMobile?: boolean;
-} = {
- navTheme: 'dark',
- // 拂晓蓝
- primaryColor: 'black',
- layout: 'top',
- contentWidth: 'Fluid',
- fixedHeader: true,
- fixSiderbar: true,
- colorWeak: false,
- title: 'BATCHER',
- pwa: false,
- logo: 'https://storage.googleapis.com/marigold-public-bucket/batcher-logo.png',
- iconfontUrl: '',
- disableMobile: true,
-};
-
-export default Settings;
diff --git a/batcher-ui/config/proxy.ts b/batcher-ui/config/proxy.ts
deleted file mode 100644
index a8194b7e..00000000
--- a/batcher-ui/config/proxy.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * 在生产环境 代理是无法生效的,所以这里没有生产环境的配置
- * -------------------------------
- * The agent cannot take effect in the production environment
- * so there is no configuration of the production environment
- * For details, please see
- * https://pro.ant.design/docs/deploy
- */
-export default {
- dev: {
- // localhost:8000/api/** -> https://preview.pro.ant.design/api/**
- '/api/': {
- // 要代理的地址
- target: 'https://preview.pro.ant.design',
- // 配置了这个可以从 http 代理到 https
- // 依赖 origin 的功能可能需要这个,比如 cookie
- changeOrigin: true,
- },
- },
- test: {
- '/api/': {
- target: 'https://proapi.azurewebsites.net',
- changeOrigin: true,
- pathRewrite: { '^': '' },
- },
- },
- pre: {
- '/api/': {
- target: 'your pre url',
- changeOrigin: true,
- pathRewrite: { '^': '' },
- },
- },
-};
diff --git a/batcher-ui/config/routes.ts b/batcher-ui/config/routes.ts
deleted file mode 100644
index 78d4af5e..00000000
--- a/batcher-ui/config/routes.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-export default [
- {
- path: '/user',
- layout: false,
- routes: [
- {
- name: 'login',
- path: '/user/login',
- component: './404',
- },
- {
- component: './404',
- },
- ],
- },
- {
- path: '/welcome',
- name: 'welcome',
- icon: 'smile',
- component: './Welcome',
- },
- {
- path: '/admin',
- name: 'admin',
- icon: 'crown',
- access: 'canAdmin',
- routes: [
- {
- path: '/admin/sub-page',
- name: 'sub-page',
- icon: 'smile',
- component: './Welcome',
- },
- {
- component: './404',
- },
- ],
- },
- // {
- // name: 'list.table-list',
- // icon: 'table',
- // path: '/list',
- // component: './TableList',
- // },
- {
- path: '/',
- redirect: '/welcome',
- },
- {
- component: './404',
- },
- {
- path: '/hihi',
- name: 'hihi',
- icon: 'smile',
- component: './Welcome',
- },
-];
diff --git a/batcher-ui/global.d.ts b/batcher-ui/global.d.ts
new file mode 100644
index 00000000..2fb6c50d
--- /dev/null
+++ b/batcher-ui/global.d.ts
@@ -0,0 +1,8 @@
+declare global {
+ namespace NodeJS {
+ interface ProcessEnv {
+ SECRET: string;
+ }
+ }
+}
+export {};
diff --git a/batcher-ui/img/exchange-dollar.svg b/batcher-ui/img/exchange-dollar.svg
deleted file mode 100644
index 58070f80..00000000
--- a/batcher-ui/img/exchange-dollar.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
diff --git a/batcher-ui/img/exchange-euro.svg b/batcher-ui/img/exchange-euro.svg
deleted file mode 100644
index f46feb03..00000000
--- a/batcher-ui/img/exchange-euro.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
diff --git a/batcher-ui/img/marigold-logo.svg b/batcher-ui/img/marigold-logo.svg
deleted file mode 100644
index e4a0c2e0..00000000
--- a/batcher-ui/img/marigold-logo.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/batcher-ui/jest.config.js b/batcher-ui/jest.config.js
index 47295738..bed84b7d 100644
--- a/batcher-ui/jest.config.js
+++ b/batcher-ui/jest.config.js
@@ -3,7 +3,6 @@ module.exports = {
verbose: false,
extraSetupFiles: ['./tests/setupTests.js'],
globals: {
- ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: false,
localStorage: null,
},
};
diff --git a/batcher-ui/next-env.d.ts b/batcher-ui/next-env.d.ts
new file mode 100644
index 00000000..4f11a03d
--- /dev/null
+++ b/batcher-ui/next-env.d.ts
@@ -0,0 +1,5 @@
+///
+///
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/batcher-ui/next.config.js b/batcher-ui/next.config.js
new file mode 100644
index 00000000..91f9cb61
--- /dev/null
+++ b/batcher-ui/next.config.js
@@ -0,0 +1,28 @@
+/** @type {import('next').NextConfig} */
+
+const config = require('./src/config/env.ts');
+
+const env = process.env.ENV; // 'mainnet' | 'ghostnet'
+
+console.info('🚀 Current env:', env);
+
+const nextConfig = {
+ reactStrictMode: false,
+ swcMinify: true,
+ env: config[env],
+ webpack: (config, { isServer, webpack }) => {
+ if (!isServer) config.resolve.fallback['fs'] = false;
+
+ return config;
+ },
+ images: {
+ remotePatterns: [
+ {
+ protocol: 'https',
+ hostname: 'ipfs.io',
+ },
+ ],
+ },
+};
+
+module.exports = nextConfig;
diff --git a/batcher-ui/package-lock.json b/batcher-ui/package-lock.json
new file mode 100644
index 00000000..a158d410
--- /dev/null
+++ b/batcher-ui/package-lock.json
@@ -0,0 +1,8742 @@
+{
+ "name": "batcher",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "batcher",
+ "version": "1.0.0",
+ "dependencies": {
+ "@airgap/beacon-sdk": "^4.0.10",
+ "@fortawesome/fontawesome-svg-core": "^6.4.2",
+ "@fortawesome/free-solid-svg-icons": "^6.4.2",
+ "@fortawesome/react-fontawesome": "^0.2.0",
+ "@microsoft/signalr": "^6.0.10",
+ "@radix-ui/react-dialog": "^1.0.4",
+ "@radix-ui/react-form": "^0.0.3",
+ "@radix-ui/react-icons": "^1.3.0",
+ "@radix-ui/react-radio-group": "^1.1.3",
+ "@radix-ui/react-select": "^1.2.2",
+ "@radix-ui/react-toast": "^1.1.4",
+ "@radix-ui/react-tooltip": "^1.0.6",
+ "@taquito/beacon-wallet": "^17.3.0",
+ "@taquito/taquito": "^17.3.0",
+ "@taquito/tzip12": "^17.3.0",
+ "@taquito/tzip16": "^17.3.0",
+ "@types/react-redux": "^7.1.25",
+ "date-fns": "^2.29.3",
+ "fp-ts": "^2.16.0",
+ "next": "^13.4.10",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-ga4": "^2.1.0",
+ "react-redux": "^8.1.1",
+ "redux": "^4.2.1",
+ "redux-logger": "^3.0.6",
+ "redux-loop": "^6.2.0"
+ },
+ "devDependencies": {
+ "@types/jest": "^26.0.0",
+ "@types/react": "^18.2.15",
+ "@types/react-dom": "^18.2.7",
+ "@types/redux-logger": "^3.0.9",
+ "assert": "^2.0.0",
+ "autoprefixer": "^10.4.14",
+ "cross-port-killer": "^1.3.0",
+ "eslint": "^8.45.0",
+ "eslint-config-next": "^13.4.12",
+ "eslint-config-prettier": "^8.8.0",
+ "gh-pages": "^3.2.0",
+ "husky": "^8.0.0",
+ "lint-staged": "^13.2.3",
+ "postcss": "^8.4.26",
+ "postcss-import": "^15.1.0",
+ "prettier": "^2.5.0",
+ "process": "^0.11.10",
+ "tailwindcss": "^3.3.3",
+ "typescript": "^5.1.6"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@airgap/beacon-blockchain-substrate": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-blockchain-substrate/-/beacon-blockchain-substrate-4.0.10.tgz",
+ "integrity": "sha512-2QO51om5flWf6Q47cJibsBCnz95pbe1WE7HZXkWQhQ6SG++IVSmJAY2Ir2pei1k63aHXYE3+VTHSuR7R4fj56A==",
+ "dependencies": {
+ "@airgap/beacon-types": "4.0.10",
+ "@airgap/beacon-ui": "4.0.10"
+ }
+ },
+ "node_modules/@airgap/beacon-blockchain-substrate/node_modules/@airgap/beacon-core": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-core/-/beacon-core-4.0.10.tgz",
+ "integrity": "sha512-iOAKZRD5BSDFfZKa++FoYBnfDhTLZSzKUbhF/AI6CnnTgzZaEbkTIs+/XVpFhcJQY58hJN77cGnioeG2/WCWkw==",
+ "dependencies": {
+ "@airgap/beacon-types": "4.0.10",
+ "@airgap/beacon-utils": "4.0.10",
+ "@stablelib/ed25519": "^1.0.3",
+ "@stablelib/nacl": "^1.0.4",
+ "@stablelib/utf8": "^1.0.1",
+ "@stablelib/x25519-session": "^1.0.4",
+ "bs58check": "2.1.2"
+ }
+ },
+ "node_modules/@airgap/beacon-blockchain-substrate/node_modules/@airgap/beacon-transport-postmessage": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-transport-postmessage/-/beacon-transport-postmessage-4.0.10.tgz",
+ "integrity": "sha512-MaBRLU/8QFFyXt9LoTN1Vz3dnRwHPptl0r4XPPH6enJTNBZ6PoqLenIs+BiCMMrnMKlBTlRHzfDUlSd9avcFbA==",
+ "dependencies": {
+ "@airgap/beacon-core": "4.0.10",
+ "@airgap/beacon-types": "4.0.10",
+ "@airgap/beacon-utils": "4.0.10"
+ }
+ },
+ "node_modules/@airgap/beacon-blockchain-substrate/node_modules/@airgap/beacon-types": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-types/-/beacon-types-4.0.10.tgz",
+ "integrity": "sha512-C7gRyReO1puytL+D9I0xV5WTdbqXtHRcRJHnXt+KTWckZf9eHmUcnAk5JinBlIyFT0oz5jgPxN63UmhJ+lTtZQ==",
+ "dependencies": {
+ "@types/chrome": "0.0.163"
+ }
+ },
+ "node_modules/@airgap/beacon-blockchain-substrate/node_modules/@airgap/beacon-ui": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-ui/-/beacon-ui-4.0.10.tgz",
+ "integrity": "sha512-mvhtUSpKfkfz+MWSKXVWHcE8SqD8ChtOv/0dNziQr75LPmLreMB29/hZEQYCfF0T+FXeNVjTvizOlw8sv2Gd6g==",
+ "dependencies": {
+ "@airgap/beacon-core": "4.0.10",
+ "@airgap/beacon-transport-postmessage": "4.0.10",
+ "@airgap/beacon-types": "4.0.10",
+ "@airgap/beacon-utils": "4.0.10",
+ "qrcode-svg": "^1.1.0",
+ "solid-js": "^1.6.6"
+ }
+ },
+ "node_modules/@airgap/beacon-blockchain-substrate/node_modules/@airgap/beacon-utils": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-utils/-/beacon-utils-4.0.10.tgz",
+ "integrity": "sha512-g4nCL8hQ2Y59Lp1a0BEm01HbGpjq+WOFFHTD5G3ySTHXwYOIfP1h8T9SLerK2hb91/nMJxthjAshfNwKXaqbqw==",
+ "dependencies": {
+ "@stablelib/ed25519": "^1.0.3",
+ "@stablelib/nacl": "^1.0.3",
+ "@stablelib/random": "^1.0.2",
+ "@stablelib/utf8": "^1.0.1",
+ "bs58check": "2.1.2"
+ }
+ },
+ "node_modules/@airgap/beacon-blockchain-tezos": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-blockchain-tezos/-/beacon-blockchain-tezos-4.0.10.tgz",
+ "integrity": "sha512-l7eHC1YyD45EbXuwKQ9rZs7GeoZAFaaBwNm0PVYmC28Op8Mj2lS1FHTqYHNPHqg4+pf/AySLu4h+z2onCwBmug==",
+ "dependencies": {
+ "@airgap/beacon-types": "4.0.10",
+ "@airgap/beacon-ui": "4.0.10"
+ }
+ },
+ "node_modules/@airgap/beacon-blockchain-tezos/node_modules/@airgap/beacon-core": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-core/-/beacon-core-4.0.10.tgz",
+ "integrity": "sha512-iOAKZRD5BSDFfZKa++FoYBnfDhTLZSzKUbhF/AI6CnnTgzZaEbkTIs+/XVpFhcJQY58hJN77cGnioeG2/WCWkw==",
+ "dependencies": {
+ "@airgap/beacon-types": "4.0.10",
+ "@airgap/beacon-utils": "4.0.10",
+ "@stablelib/ed25519": "^1.0.3",
+ "@stablelib/nacl": "^1.0.4",
+ "@stablelib/utf8": "^1.0.1",
+ "@stablelib/x25519-session": "^1.0.4",
+ "bs58check": "2.1.2"
+ }
+ },
+ "node_modules/@airgap/beacon-blockchain-tezos/node_modules/@airgap/beacon-transport-postmessage": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-transport-postmessage/-/beacon-transport-postmessage-4.0.10.tgz",
+ "integrity": "sha512-MaBRLU/8QFFyXt9LoTN1Vz3dnRwHPptl0r4XPPH6enJTNBZ6PoqLenIs+BiCMMrnMKlBTlRHzfDUlSd9avcFbA==",
+ "dependencies": {
+ "@airgap/beacon-core": "4.0.10",
+ "@airgap/beacon-types": "4.0.10",
+ "@airgap/beacon-utils": "4.0.10"
+ }
+ },
+ "node_modules/@airgap/beacon-blockchain-tezos/node_modules/@airgap/beacon-types": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-types/-/beacon-types-4.0.10.tgz",
+ "integrity": "sha512-C7gRyReO1puytL+D9I0xV5WTdbqXtHRcRJHnXt+KTWckZf9eHmUcnAk5JinBlIyFT0oz5jgPxN63UmhJ+lTtZQ==",
+ "dependencies": {
+ "@types/chrome": "0.0.163"
+ }
+ },
+ "node_modules/@airgap/beacon-blockchain-tezos/node_modules/@airgap/beacon-ui": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-ui/-/beacon-ui-4.0.10.tgz",
+ "integrity": "sha512-mvhtUSpKfkfz+MWSKXVWHcE8SqD8ChtOv/0dNziQr75LPmLreMB29/hZEQYCfF0T+FXeNVjTvizOlw8sv2Gd6g==",
+ "dependencies": {
+ "@airgap/beacon-core": "4.0.10",
+ "@airgap/beacon-transport-postmessage": "4.0.10",
+ "@airgap/beacon-types": "4.0.10",
+ "@airgap/beacon-utils": "4.0.10",
+ "qrcode-svg": "^1.1.0",
+ "solid-js": "^1.6.6"
+ }
+ },
+ "node_modules/@airgap/beacon-blockchain-tezos/node_modules/@airgap/beacon-utils": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-utils/-/beacon-utils-4.0.10.tgz",
+ "integrity": "sha512-g4nCL8hQ2Y59Lp1a0BEm01HbGpjq+WOFFHTD5G3ySTHXwYOIfP1h8T9SLerK2hb91/nMJxthjAshfNwKXaqbqw==",
+ "dependencies": {
+ "@stablelib/ed25519": "^1.0.3",
+ "@stablelib/nacl": "^1.0.3",
+ "@stablelib/random": "^1.0.2",
+ "@stablelib/utf8": "^1.0.1",
+ "bs58check": "2.1.2"
+ }
+ },
+ "node_modules/@airgap/beacon-core": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-core/-/beacon-core-4.0.6.tgz",
+ "integrity": "sha512-gSyA1rEZ9Rphbr575UgYNnEAcVAYaZ1AGo/7m4xmvyNVAi906BPfnfpsrH8HfsDZRcnW+ahMd+YElA6a2tesmw==",
+ "dependencies": {
+ "@airgap/beacon-types": "4.0.6",
+ "@airgap/beacon-utils": "4.0.6",
+ "@stablelib/ed25519": "^1.0.3",
+ "@stablelib/nacl": "^1.0.4",
+ "@stablelib/utf8": "^1.0.1",
+ "@stablelib/x25519-session": "^1.0.4",
+ "bs58check": "2.1.2"
+ }
+ },
+ "node_modules/@airgap/beacon-dapp": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-dapp/-/beacon-dapp-4.0.6.tgz",
+ "integrity": "sha512-4+AgPopWWjwxVJcpLXTlRGb/5jdkc0MUjBvtH6kZJfhf2drsdWUkBtGHCiqpy8KjLLOiyVgdGniNTFt4025hsg==",
+ "dependencies": {
+ "@airgap/beacon-core": "4.0.6",
+ "@airgap/beacon-transport-matrix": "4.0.6",
+ "@airgap/beacon-transport-postmessage": "4.0.6",
+ "@airgap/beacon-transport-walletconnect": "4.0.6",
+ "@airgap/beacon-ui": "4.0.6"
+ }
+ },
+ "node_modules/@airgap/beacon-sdk": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-sdk/-/beacon-sdk-4.0.10.tgz",
+ "integrity": "sha512-wrgXnkXBHjL2gKd6q/CUdr8ekrkmD0V+XlMXfFAAnLQuV3vDU6oB9uO5mSxYvxs5htKUb6JURiKyDi7/eWSDMw==",
+ "dependencies": {
+ "@airgap/beacon-blockchain-substrate": "4.0.10",
+ "@airgap/beacon-blockchain-tezos": "4.0.10",
+ "@airgap/beacon-core": "4.0.10",
+ "@airgap/beacon-dapp": "4.0.10",
+ "@airgap/beacon-transport-matrix": "4.0.10",
+ "@airgap/beacon-transport-postmessage": "4.0.10",
+ "@airgap/beacon-types": "4.0.10",
+ "@airgap/beacon-ui": "4.0.10",
+ "@airgap/beacon-utils": "4.0.10",
+ "@airgap/beacon-wallet": "4.0.10"
+ }
+ },
+ "node_modules/@airgap/beacon-sdk/node_modules/@airgap/beacon-core": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-core/-/beacon-core-4.0.10.tgz",
+ "integrity": "sha512-iOAKZRD5BSDFfZKa++FoYBnfDhTLZSzKUbhF/AI6CnnTgzZaEbkTIs+/XVpFhcJQY58hJN77cGnioeG2/WCWkw==",
+ "dependencies": {
+ "@airgap/beacon-types": "4.0.10",
+ "@airgap/beacon-utils": "4.0.10",
+ "@stablelib/ed25519": "^1.0.3",
+ "@stablelib/nacl": "^1.0.4",
+ "@stablelib/utf8": "^1.0.1",
+ "@stablelib/x25519-session": "^1.0.4",
+ "bs58check": "2.1.2"
+ }
+ },
+ "node_modules/@airgap/beacon-sdk/node_modules/@airgap/beacon-dapp": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-dapp/-/beacon-dapp-4.0.10.tgz",
+ "integrity": "sha512-QfoRKxMCt4/RjW/lkExicoqzwdhhEhRxPwntS19VW+Q+cWhsJhmWULdF3rQNHRBtSsHws3LnOT0r8e1hndDxfQ==",
+ "dependencies": {
+ "@airgap/beacon-core": "4.0.10",
+ "@airgap/beacon-transport-matrix": "4.0.10",
+ "@airgap/beacon-transport-postmessage": "4.0.10",
+ "@airgap/beacon-transport-walletconnect": "4.0.10",
+ "@airgap/beacon-ui": "4.0.10"
+ }
+ },
+ "node_modules/@airgap/beacon-sdk/node_modules/@airgap/beacon-transport-matrix": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-transport-matrix/-/beacon-transport-matrix-4.0.10.tgz",
+ "integrity": "sha512-UB7QZaI+hizg5vWYXaGyZfl0uQbhcbJzS6vzyeYxQcUH6uK9h3drHL/UiF8RQuMK73P3WcxShQq1Wn2Pu02gag==",
+ "dependencies": {
+ "@airgap/beacon-core": "4.0.10",
+ "@airgap/beacon-utils": "4.0.10",
+ "axios": "0.24.0"
+ }
+ },
+ "node_modules/@airgap/beacon-sdk/node_modules/@airgap/beacon-transport-postmessage": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-transport-postmessage/-/beacon-transport-postmessage-4.0.10.tgz",
+ "integrity": "sha512-MaBRLU/8QFFyXt9LoTN1Vz3dnRwHPptl0r4XPPH6enJTNBZ6PoqLenIs+BiCMMrnMKlBTlRHzfDUlSd9avcFbA==",
+ "dependencies": {
+ "@airgap/beacon-core": "4.0.10",
+ "@airgap/beacon-types": "4.0.10",
+ "@airgap/beacon-utils": "4.0.10"
+ }
+ },
+ "node_modules/@airgap/beacon-sdk/node_modules/@airgap/beacon-transport-walletconnect": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-transport-walletconnect/-/beacon-transport-walletconnect-4.0.10.tgz",
+ "integrity": "sha512-SV9RIZLk6pZVPfEFWWJzB4MuVGi+fBGQsZI25NTPvuT9bvF6IBZwdQp8YwdNiGK3lOhThH+eb82W/b8CH6OOyg==",
+ "dependencies": {
+ "@airgap/beacon-core": "4.0.10",
+ "@airgap/beacon-types": "4.0.10",
+ "@airgap/beacon-utils": "4.0.10",
+ "@walletconnect/sign-client": "2.7.0"
+ }
+ },
+ "node_modules/@airgap/beacon-sdk/node_modules/@airgap/beacon-types": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-types/-/beacon-types-4.0.10.tgz",
+ "integrity": "sha512-C7gRyReO1puytL+D9I0xV5WTdbqXtHRcRJHnXt+KTWckZf9eHmUcnAk5JinBlIyFT0oz5jgPxN63UmhJ+lTtZQ==",
+ "dependencies": {
+ "@types/chrome": "0.0.163"
+ }
+ },
+ "node_modules/@airgap/beacon-sdk/node_modules/@airgap/beacon-ui": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-ui/-/beacon-ui-4.0.10.tgz",
+ "integrity": "sha512-mvhtUSpKfkfz+MWSKXVWHcE8SqD8ChtOv/0dNziQr75LPmLreMB29/hZEQYCfF0T+FXeNVjTvizOlw8sv2Gd6g==",
+ "dependencies": {
+ "@airgap/beacon-core": "4.0.10",
+ "@airgap/beacon-transport-postmessage": "4.0.10",
+ "@airgap/beacon-types": "4.0.10",
+ "@airgap/beacon-utils": "4.0.10",
+ "qrcode-svg": "^1.1.0",
+ "solid-js": "^1.6.6"
+ }
+ },
+ "node_modules/@airgap/beacon-sdk/node_modules/@airgap/beacon-utils": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-utils/-/beacon-utils-4.0.10.tgz",
+ "integrity": "sha512-g4nCL8hQ2Y59Lp1a0BEm01HbGpjq+WOFFHTD5G3ySTHXwYOIfP1h8T9SLerK2hb91/nMJxthjAshfNwKXaqbqw==",
+ "dependencies": {
+ "@stablelib/ed25519": "^1.0.3",
+ "@stablelib/nacl": "^1.0.3",
+ "@stablelib/random": "^1.0.2",
+ "@stablelib/utf8": "^1.0.1",
+ "bs58check": "2.1.2"
+ }
+ },
+ "node_modules/@airgap/beacon-transport-matrix": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-transport-matrix/-/beacon-transport-matrix-4.0.6.tgz",
+ "integrity": "sha512-wLla13DorVGadc4fG5S/o1EijwpTKIADP0DhGGD33bQc5s/59BFNSPAo3ZErZqD7+5vn7JTRKN4V/JUigsX+ZA==",
+ "dependencies": {
+ "@airgap/beacon-core": "4.0.6",
+ "@airgap/beacon-utils": "4.0.6",
+ "axios": "0.24.0"
+ }
+ },
+ "node_modules/@airgap/beacon-transport-postmessage": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-transport-postmessage/-/beacon-transport-postmessage-4.0.6.tgz",
+ "integrity": "sha512-lEwh3bLEOHnvjqA2ffaYxiIfcHLjnk0CzKW3CsvA5RJaMMZATNYj63HKC85K1SQZmy5EPReqGrjg7NpohC/TKw==",
+ "dependencies": {
+ "@airgap/beacon-core": "4.0.6",
+ "@airgap/beacon-types": "4.0.6",
+ "@airgap/beacon-utils": "4.0.6"
+ }
+ },
+ "node_modules/@airgap/beacon-transport-walletconnect": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-transport-walletconnect/-/beacon-transport-walletconnect-4.0.6.tgz",
+ "integrity": "sha512-/YxGCbhw8JqkyEYGd7mCa5greMYO9/Ro+61xQv1/3WjT/wlTYFDF0tuH+Di6ZxVz7SBk8e95bQsKL5u10poGoA==",
+ "dependencies": {
+ "@airgap/beacon-core": "4.0.6",
+ "@airgap/beacon-types": "4.0.6",
+ "@airgap/beacon-utils": "4.0.6",
+ "@walletconnect/sign-client": "^2.9.0"
+ }
+ },
+ "node_modules/@airgap/beacon-transport-walletconnect/node_modules/@walletconnect/core": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.10.0.tgz",
+ "integrity": "sha512-Z8pdorfIMueuiBXLdnf7yloiO9JIiobuxN3j0OTal+MYc4q5/2O7d+jdD1DAXbLi1taJx3x60UXT/FPVkjIqIQ==",
+ "dependencies": {
+ "@walletconnect/heartbeat": "1.2.1",
+ "@walletconnect/jsonrpc-provider": "1.0.13",
+ "@walletconnect/jsonrpc-types": "1.0.3",
+ "@walletconnect/jsonrpc-utils": "1.0.8",
+ "@walletconnect/jsonrpc-ws-connection": "1.0.13",
+ "@walletconnect/keyvaluestorage": "^1.0.2",
+ "@walletconnect/logger": "^2.0.1",
+ "@walletconnect/relay-api": "^1.0.9",
+ "@walletconnect/relay-auth": "^1.0.4",
+ "@walletconnect/safe-json": "^1.0.2",
+ "@walletconnect/time": "^1.0.2",
+ "@walletconnect/types": "2.10.0",
+ "@walletconnect/utils": "2.10.0",
+ "events": "^3.3.0",
+ "lodash.isequal": "4.5.0",
+ "uint8arrays": "^3.1.0"
+ }
+ },
+ "node_modules/@airgap/beacon-transport-walletconnect/node_modules/@walletconnect/sign-client": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.10.0.tgz",
+ "integrity": "sha512-hbDljDS53kR/It3oXD91UkcOsT6diNnW5+Zzksm0YEfwww5dop/YfNlcdnc8+jKUhWOL/YDPNQCjzsCSNlVzbw==",
+ "dependencies": {
+ "@walletconnect/core": "2.10.0",
+ "@walletconnect/events": "^1.0.1",
+ "@walletconnect/heartbeat": "1.2.1",
+ "@walletconnect/jsonrpc-utils": "1.0.8",
+ "@walletconnect/logger": "^2.0.1",
+ "@walletconnect/time": "^1.0.2",
+ "@walletconnect/types": "2.10.0",
+ "@walletconnect/utils": "2.10.0",
+ "events": "^3.3.0"
+ }
+ },
+ "node_modules/@airgap/beacon-transport-walletconnect/node_modules/@walletconnect/types": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.10.0.tgz",
+ "integrity": "sha512-kSTA/WZnbKdEbvbXSW16Ty6dOSzOZCHnGg6JH7q1MuraalD2HuNg00lVVu7QAZ/Rj1Gn9DAkrgP5Wd5a8Xq//Q==",
+ "dependencies": {
+ "@walletconnect/events": "^1.0.1",
+ "@walletconnect/heartbeat": "1.2.1",
+ "@walletconnect/jsonrpc-types": "1.0.3",
+ "@walletconnect/keyvaluestorage": "^1.0.2",
+ "@walletconnect/logger": "^2.0.1",
+ "events": "^3.3.0"
+ }
+ },
+ "node_modules/@airgap/beacon-transport-walletconnect/node_modules/@walletconnect/utils": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.10.0.tgz",
+ "integrity": "sha512-9GRyEz/7CJW+G04RvrjPET5k7hOEsB9b3fF9cWDk/iDCxSWpbkU/hv/urRB36C+gvQMAZgIZYX3dHfzJWkY/2g==",
+ "dependencies": {
+ "@stablelib/chacha20poly1305": "1.0.1",
+ "@stablelib/hkdf": "1.0.1",
+ "@stablelib/random": "^1.0.2",
+ "@stablelib/sha256": "1.0.1",
+ "@stablelib/x25519": "^1.0.3",
+ "@walletconnect/relay-api": "^1.0.9",
+ "@walletconnect/safe-json": "^1.0.2",
+ "@walletconnect/time": "^1.0.2",
+ "@walletconnect/types": "2.10.0",
+ "@walletconnect/window-getters": "^1.0.1",
+ "@walletconnect/window-metadata": "^1.0.1",
+ "detect-browser": "5.3.0",
+ "query-string": "7.1.3",
+ "uint8arrays": "^3.1.0"
+ }
+ },
+ "node_modules/@airgap/beacon-transport-walletconnect/node_modules/query-string": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz",
+ "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==",
+ "dependencies": {
+ "decode-uri-component": "^0.2.2",
+ "filter-obj": "^1.1.0",
+ "split-on-first": "^1.0.0",
+ "strict-uri-encode": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@airgap/beacon-types": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-types/-/beacon-types-4.0.6.tgz",
+ "integrity": "sha512-9hBUts03MdYAp0IdNnXbLO1JDZd3jNXyez4ahht0jv396aPc27ZKAcWKBjkZCMbxQwpw9/pZVAmkLCErYNMSww==",
+ "dependencies": {
+ "@types/chrome": "0.0.163"
+ }
+ },
+ "node_modules/@airgap/beacon-ui": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-ui/-/beacon-ui-4.0.6.tgz",
+ "integrity": "sha512-wid0hxsR4QrB8se1/ID7H8O9BVL3VrLUjTEIMqaXPNyDa+p53FNTVq+CGeKJ8dz/IcjjZrRB7ZTRlYVTxgqP5A==",
+ "dependencies": {
+ "@airgap/beacon-core": "4.0.6",
+ "@airgap/beacon-transport-postmessage": "4.0.6",
+ "@airgap/beacon-types": "4.0.6",
+ "@airgap/beacon-utils": "4.0.6",
+ "qrcode-svg": "^1.1.0",
+ "solid-js": "^1.6.6"
+ }
+ },
+ "node_modules/@airgap/beacon-utils": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-utils/-/beacon-utils-4.0.6.tgz",
+ "integrity": "sha512-vV6xtS50Qd/VzJPeoK3y14ddSR+9AEV0HtmP7BcYC5jTN2flT+PlTO8y8vS0+Yx8eFnQTnlS2vp7a2DTa/aWUA==",
+ "dependencies": {
+ "@stablelib/ed25519": "^1.0.3",
+ "@stablelib/nacl": "^1.0.3",
+ "@stablelib/random": "^1.0.2",
+ "@stablelib/utf8": "^1.0.1",
+ "bs58check": "2.1.2"
+ }
+ },
+ "node_modules/@airgap/beacon-wallet": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-wallet/-/beacon-wallet-4.0.10.tgz",
+ "integrity": "sha512-qrmGsOQLF2c9R8G++vsYw74puJkVQa8cnNrcNvYYWo4LgjncZT9hKLZ2kdcODEQ992Sn8nP5ry8vpCBaOPqG0w==",
+ "dependencies": {
+ "@airgap/beacon-core": "4.0.10",
+ "@airgap/beacon-transport-matrix": "4.0.10",
+ "@airgap/beacon-transport-postmessage": "4.0.10"
+ }
+ },
+ "node_modules/@airgap/beacon-wallet/node_modules/@airgap/beacon-core": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-core/-/beacon-core-4.0.10.tgz",
+ "integrity": "sha512-iOAKZRD5BSDFfZKa++FoYBnfDhTLZSzKUbhF/AI6CnnTgzZaEbkTIs+/XVpFhcJQY58hJN77cGnioeG2/WCWkw==",
+ "dependencies": {
+ "@airgap/beacon-types": "4.0.10",
+ "@airgap/beacon-utils": "4.0.10",
+ "@stablelib/ed25519": "^1.0.3",
+ "@stablelib/nacl": "^1.0.4",
+ "@stablelib/utf8": "^1.0.1",
+ "@stablelib/x25519-session": "^1.0.4",
+ "bs58check": "2.1.2"
+ }
+ },
+ "node_modules/@airgap/beacon-wallet/node_modules/@airgap/beacon-transport-matrix": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-transport-matrix/-/beacon-transport-matrix-4.0.10.tgz",
+ "integrity": "sha512-UB7QZaI+hizg5vWYXaGyZfl0uQbhcbJzS6vzyeYxQcUH6uK9h3drHL/UiF8RQuMK73P3WcxShQq1Wn2Pu02gag==",
+ "dependencies": {
+ "@airgap/beacon-core": "4.0.10",
+ "@airgap/beacon-utils": "4.0.10",
+ "axios": "0.24.0"
+ }
+ },
+ "node_modules/@airgap/beacon-wallet/node_modules/@airgap/beacon-transport-postmessage": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-transport-postmessage/-/beacon-transport-postmessage-4.0.10.tgz",
+ "integrity": "sha512-MaBRLU/8QFFyXt9LoTN1Vz3dnRwHPptl0r4XPPH6enJTNBZ6PoqLenIs+BiCMMrnMKlBTlRHzfDUlSd9avcFbA==",
+ "dependencies": {
+ "@airgap/beacon-core": "4.0.10",
+ "@airgap/beacon-types": "4.0.10",
+ "@airgap/beacon-utils": "4.0.10"
+ }
+ },
+ "node_modules/@airgap/beacon-wallet/node_modules/@airgap/beacon-types": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-types/-/beacon-types-4.0.10.tgz",
+ "integrity": "sha512-C7gRyReO1puytL+D9I0xV5WTdbqXtHRcRJHnXt+KTWckZf9eHmUcnAk5JinBlIyFT0oz5jgPxN63UmhJ+lTtZQ==",
+ "dependencies": {
+ "@types/chrome": "0.0.163"
+ }
+ },
+ "node_modules/@airgap/beacon-wallet/node_modules/@airgap/beacon-utils": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/@airgap/beacon-utils/-/beacon-utils-4.0.10.tgz",
+ "integrity": "sha512-g4nCL8hQ2Y59Lp1a0BEm01HbGpjq+WOFFHTD5G3ySTHXwYOIfP1h8T9SLerK2hb91/nMJxthjAshfNwKXaqbqw==",
+ "dependencies": {
+ "@stablelib/ed25519": "^1.0.3",
+ "@stablelib/nacl": "^1.0.3",
+ "@stablelib/random": "^1.0.2",
+ "@stablelib/utf8": "^1.0.1",
+ "bs58check": "2.1.2"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz",
+ "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==",
+ "dependencies": {
+ "regenerator-runtime": "^0.13.11"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz",
+ "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz",
+ "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.44.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz",
+ "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz",
+ "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==",
+ "dependencies": {
+ "@floating-ui/utils": "^0.1.1"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz",
+ "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==",
+ "dependencies": {
+ "@floating-ui/core": "^1.4.1",
+ "@floating-ui/utils": "^0.1.1"
+ }
+ },
+ "node_modules/@floating-ui/react-dom": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz",
+ "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==",
+ "dependencies": {
+ "@floating-ui/dom": "^1.5.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz",
+ "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw=="
+ },
+ "node_modules/@fortawesome/fontawesome-common-types": {
+ "version": "6.4.2",
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz",
+ "integrity": "sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==",
+ "hasInstallScript": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@fortawesome/fontawesome-svg-core": {
+ "version": "6.4.2",
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz",
+ "integrity": "sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@fortawesome/fontawesome-common-types": "6.4.2"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@fortawesome/free-solid-svg-icons": {
+ "version": "6.4.2",
+ "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.2.tgz",
+ "integrity": "sha512-sYwXurXUEQS32fZz9hVCUUv/xu49PEJEyUOsA51l6PU/qVgfbTb2glsTEaJngVVT8VqBATRIdh7XVgV1JF1LkA==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@fortawesome/fontawesome-common-types": "6.4.2"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@fortawesome/react-fontawesome": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz",
+ "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==",
+ "dependencies": {
+ "prop-types": "^15.8.1"
+ },
+ "peerDependencies": {
+ "@fortawesome/fontawesome-svg-core": "~1 || ~6",
+ "react": ">=16.3"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
+ "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "node_modules/@jest/types": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
+ "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
+ "dev": 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/@jridgewell/gen-mapping": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.18",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
+ "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "3.1.0",
+ "@jridgewell/sourcemap-codec": "1.4.14"
+ }
+ },
+ "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "dev": true
+ },
+ "node_modules/@microsoft/signalr": {
+ "version": "6.0.20",
+ "resolved": "https://registry.npmjs.org/@microsoft/signalr/-/signalr-6.0.20.tgz",
+ "integrity": "sha512-jcJDnI/Ca4+EBQnIE0B9q4XZLGn48S//rk6IeiKeItSkR15mZ9DjLui3VMSXUrpx4ioNGVWMVzI/7DPByJshLA==",
+ "dependencies": {
+ "abort-controller": "^3.0.0",
+ "eventsource": "^1.0.7",
+ "fetch-cookie": "^0.11.0",
+ "node-fetch": "^2.6.7",
+ "ws": "^7.4.5"
+ }
+ },
+ "node_modules/@next/env": {
+ "version": "13.4.10",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.10.tgz",
+ "integrity": "sha512-3G1yD/XKTSLdihyDSa8JEsaWOELY+OWe08o0LUYzfuHp1zHDA8SObQlzKt+v+wrkkPcnPweoLH1ImZeUa0A1NQ=="
+ },
+ "node_modules/@next/eslint-plugin-next": {
+ "version": "13.4.12",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz",
+ "integrity": "sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==",
+ "dev": true,
+ "dependencies": {
+ "glob": "7.1.7"
+ }
+ },
+ "node_modules/@next/eslint-plugin-next/node_modules/glob": {
+ "version": "7.1.7",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+ "dev": true,
+ "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"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@next/swc-darwin-arm64": {
+ "version": "13.4.10",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.10.tgz",
+ "integrity": "sha512-4bsdfKmmg7mgFGph0UorD1xWfZ5jZEw4kKRHYEeTK9bT1QnMbPVPlVXQRIiFPrhoDQnZUoa6duuPUJIEGLV1Jg==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-darwin-x64": {
+ "version": "13.4.10",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.10.tgz",
+ "integrity": "sha512-ngXhUBbcZIWZWqNbQSNxQrB9T1V+wgfCzAor2olYuo/YpaL6mUYNUEgeBMhr8qwV0ARSgKaOp35lRvB7EmCRBg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-gnu": {
+ "version": "13.4.10",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.10.tgz",
+ "integrity": "sha512-SjCZZCOmHD4uyM75MVArSAmF5Y+IJSGroPRj2v9/jnBT36SYFTORN8Ag/lhw81W9EeexKY/CUg2e9mdebZOwsg==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-musl": {
+ "version": "13.4.10",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.10.tgz",
+ "integrity": "sha512-F+VlcWijX5qteoYIOxNiBbNE8ruaWuRlcYyIRK10CugqI/BIeCDzEDyrHIHY8AWwbkTwe6GRHabMdE688Rqq4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-gnu": {
+ "version": "13.4.10",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.10.tgz",
+ "integrity": "sha512-WDv1YtAV07nhfy3i1visr5p/tjiH6CeXp4wX78lzP1jI07t4PnHHG1WEDFOduXh3WT4hG6yN82EQBQHDi7hBrQ==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-musl": {
+ "version": "13.4.10",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.10.tgz",
+ "integrity": "sha512-zFkzqc737xr6qoBgDa3AwC7jPQzGLjDlkNmt/ljvQJ/Veri5ECdHjZCUuiTUfVjshNIIpki6FuP0RaQYK9iCRg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-arm64-msvc": {
+ "version": "13.4.10",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.10.tgz",
+ "integrity": "sha512-IboRS8IWz5mWfnjAdCekkl8s0B7ijpWeDwK2O8CdgZkoCDY0ZQHBSGiJ2KViAG6+BJVfLvcP+a2fh6cdyBr9QQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-ia32-msvc": {
+ "version": "13.4.10",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.10.tgz",
+ "integrity": "sha512-bSA+4j8jY4EEiwD/M2bol4uVEu1lBlgsGdvM+mmBm/BbqofNBfaZ2qwSbwE2OwbAmzNdVJRFRXQZ0dkjopTRaQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-x64-msvc": {
+ "version": "13.4.10",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.10.tgz",
+ "integrity": "sha512-g2+tU63yTWmcVQKDGY0MV1PjjqgZtwM4rB1oVVi/v0brdZAcrcTV+04agKzWtvWroyFz6IqtT0MoZJA7PNyLVw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@pkgr/utils": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz",
+ "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "fast-glob": "^3.3.0",
+ "is-glob": "^4.0.3",
+ "open": "^9.1.0",
+ "picocolors": "^1.0.0",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unts"
+ }
+ },
+ "node_modules/@pkgr/utils/node_modules/tslib": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz",
+ "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==",
+ "dev": true
+ },
+ "node_modules/@radix-ui/number": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz",
+ "integrity": "sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "node_modules/@radix-ui/primitive": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz",
+ "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "node_modules/@radix-ui/react-arrow": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz",
+ "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-primitive": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-collection": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz",
+ "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-slot": "1.0.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz",
+ "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-context": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz",
+ "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dialog": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.4.tgz",
+ "integrity": "sha512-hJtRy/jPULGQZceSAP2Re6/4NpKo8im6V8P2hUqZsdFiSL8l35kYsw3qbRI6Ay5mQd2+wlLqje770eq+RJ3yZg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-dismissable-layer": "1.0.4",
+ "@radix-ui/react-focus-guards": "1.0.1",
+ "@radix-ui/react-focus-scope": "1.0.3",
+ "@radix-ui/react-id": "1.0.1",
+ "@radix-ui/react-portal": "1.0.3",
+ "@radix-ui/react-presence": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-slot": "1.0.2",
+ "@radix-ui/react-use-controllable-state": "1.0.1",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "2.5.5"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-direction": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz",
+ "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz",
+ "integrity": "sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-use-callback-ref": "1.0.1",
+ "@radix-ui/react-use-escape-keydown": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-guards": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz",
+ "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-scope": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz",
+ "integrity": "sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-use-callback-ref": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-form": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.0.3.tgz",
+ "integrity": "sha512-kgE+Z/haV6fxE5WqIXj05KkaXa3OkZASoTDy25yX2EIp/x0c54rOH/vFr5nOZTg7n7T1z8bSyXmiVIFP9bbhPQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-id": "1.0.1",
+ "@radix-ui/react-label": "2.0.2",
+ "@radix-ui/react-primitive": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-icons": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.0.tgz",
+ "integrity": "sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==",
+ "peerDependencies": {
+ "react": "^16.x || ^17.x || ^18.x"
+ }
+ },
+ "node_modules/@radix-ui/react-id": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz",
+ "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-layout-effect": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-label": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.0.2.tgz",
+ "integrity": "sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-primitive": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-popper": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.2.tgz",
+ "integrity": "sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@floating-ui/react-dom": "^2.0.0",
+ "@radix-ui/react-arrow": "1.0.3",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-use-callback-ref": "1.0.1",
+ "@radix-ui/react-use-layout-effect": "1.0.1",
+ "@radix-ui/react-use-rect": "1.0.1",
+ "@radix-ui/react-use-size": "1.0.1",
+ "@radix-ui/rect": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-portal": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.3.tgz",
+ "integrity": "sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-primitive": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-presence": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz",
+ "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-use-layout-effect": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-primitive": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz",
+ "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-slot": "1.0.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-radio-group": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.1.3.tgz",
+ "integrity": "sha512-x+yELayyefNeKeTx4fjK6j99Fs6c4qKm3aY38G3swQVTN6xMpsrbigC0uHs2L//g8q4qR7qOcww8430jJmi2ag==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-direction": "1.0.1",
+ "@radix-ui/react-presence": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-roving-focus": "1.0.4",
+ "@radix-ui/react-use-controllable-state": "1.0.1",
+ "@radix-ui/react-use-previous": "1.0.1",
+ "@radix-ui/react-use-size": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-roving-focus": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz",
+ "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-collection": "1.0.3",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-direction": "1.0.1",
+ "@radix-ui/react-id": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-use-callback-ref": "1.0.1",
+ "@radix-ui/react-use-controllable-state": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-select": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-1.2.2.tgz",
+ "integrity": "sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/number": "1.0.1",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-collection": "1.0.3",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-direction": "1.0.1",
+ "@radix-ui/react-dismissable-layer": "1.0.4",
+ "@radix-ui/react-focus-guards": "1.0.1",
+ "@radix-ui/react-focus-scope": "1.0.3",
+ "@radix-ui/react-id": "1.0.1",
+ "@radix-ui/react-popper": "1.1.2",
+ "@radix-ui/react-portal": "1.0.3",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-slot": "1.0.2",
+ "@radix-ui/react-use-callback-ref": "1.0.1",
+ "@radix-ui/react-use-controllable-state": "1.0.1",
+ "@radix-ui/react-use-layout-effect": "1.0.1",
+ "@radix-ui/react-use-previous": "1.0.1",
+ "@radix-ui/react-visually-hidden": "1.0.3",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "2.5.5"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-slot": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz",
+ "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toast": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.1.4.tgz",
+ "integrity": "sha512-wf+fc8DOywrpRK3jlPlWVe+ELYGHdKDaaARJZNuUTWyWYq7+ANCFLp4rTjZ/mcGkJJQ/vZ949Zis9xxEpfq9OA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-collection": "1.0.3",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-dismissable-layer": "1.0.4",
+ "@radix-ui/react-portal": "1.0.3",
+ "@radix-ui/react-presence": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-use-callback-ref": "1.0.1",
+ "@radix-ui/react-use-controllable-state": "1.0.1",
+ "@radix-ui/react-use-layout-effect": "1.0.1",
+ "@radix-ui/react-visually-hidden": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-tooltip": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.6.tgz",
+ "integrity": "sha512-DmNFOiwEc2UDigsYj6clJENma58OelxD24O4IODoZ+3sQc3Zb+L8w1EP+y9laTuKCLAysPw4fD6/v0j4KNV8rg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-dismissable-layer": "1.0.4",
+ "@radix-ui/react-id": "1.0.1",
+ "@radix-ui/react-popper": "1.1.2",
+ "@radix-ui/react-portal": "1.0.3",
+ "@radix-ui/react-presence": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-slot": "1.0.2",
+ "@radix-ui/react-use-controllable-state": "1.0.1",
+ "@radix-ui/react-visually-hidden": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz",
+ "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz",
+ "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-callback-ref": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz",
+ "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-callback-ref": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz",
+ "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-previous": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz",
+ "integrity": "sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-rect": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz",
+ "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/rect": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-size": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz",
+ "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-layout-effect": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-visually-hidden": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz",
+ "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-primitive": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/rect": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz",
+ "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "node_modules/@rushstack/eslint-patch": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz",
+ "integrity": "sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==",
+ "dev": true
+ },
+ "node_modules/@stablelib/aead": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/aead/-/aead-1.0.1.tgz",
+ "integrity": "sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg=="
+ },
+ "node_modules/@stablelib/binary": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/binary/-/binary-1.0.1.tgz",
+ "integrity": "sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==",
+ "dependencies": {
+ "@stablelib/int": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/blake2b": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/blake2b/-/blake2b-1.0.1.tgz",
+ "integrity": "sha512-B3KyKoBAjkIFeH7romcF96i+pVFYk7K2SBQ1pZvaxV+epSBXJ+n0C66esUhyz6FF+5FbdQVm77C5fzGFcEZpKA==",
+ "dependencies": {
+ "@stablelib/binary": "^1.0.1",
+ "@stablelib/hash": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/bytes": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/bytes/-/bytes-1.0.1.tgz",
+ "integrity": "sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ=="
+ },
+ "node_modules/@stablelib/chacha": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/chacha/-/chacha-1.0.1.tgz",
+ "integrity": "sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==",
+ "dependencies": {
+ "@stablelib/binary": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/chacha20poly1305": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/chacha20poly1305/-/chacha20poly1305-1.0.1.tgz",
+ "integrity": "sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA==",
+ "dependencies": {
+ "@stablelib/aead": "^1.0.1",
+ "@stablelib/binary": "^1.0.1",
+ "@stablelib/chacha": "^1.0.1",
+ "@stablelib/constant-time": "^1.0.1",
+ "@stablelib/poly1305": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/constant-time/-/constant-time-1.0.1.tgz",
+ "integrity": "sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg=="
+ },
+ "node_modules/@stablelib/ed25519": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@stablelib/ed25519/-/ed25519-1.0.3.tgz",
+ "integrity": "sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==",
+ "dependencies": {
+ "@stablelib/random": "^1.0.2",
+ "@stablelib/sha512": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/hash": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/hash/-/hash-1.0.1.tgz",
+ "integrity": "sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg=="
+ },
+ "node_modules/@stablelib/hkdf": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/hkdf/-/hkdf-1.0.1.tgz",
+ "integrity": "sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g==",
+ "dependencies": {
+ "@stablelib/hash": "^1.0.1",
+ "@stablelib/hmac": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/hmac": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/hmac/-/hmac-1.0.1.tgz",
+ "integrity": "sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==",
+ "dependencies": {
+ "@stablelib/constant-time": "^1.0.1",
+ "@stablelib/hash": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/int": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/int/-/int-1.0.1.tgz",
+ "integrity": "sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w=="
+ },
+ "node_modules/@stablelib/keyagreement": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/keyagreement/-/keyagreement-1.0.1.tgz",
+ "integrity": "sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==",
+ "dependencies": {
+ "@stablelib/bytes": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/nacl": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@stablelib/nacl/-/nacl-1.0.4.tgz",
+ "integrity": "sha512-PJ2U/MrkXSKUM8C4qFs87WeCNxri7KQwR8Cdwm9q2sweGuAtTvOJGuW0F3N+zn+ySLPJA98SYWSSpogMJ1gCmw==",
+ "dependencies": {
+ "@stablelib/poly1305": "^1.0.1",
+ "@stablelib/random": "^1.0.2",
+ "@stablelib/wipe": "^1.0.1",
+ "@stablelib/x25519": "^1.0.3",
+ "@stablelib/xsalsa20": "^1.0.2"
+ }
+ },
+ "node_modules/@stablelib/poly1305": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/poly1305/-/poly1305-1.0.1.tgz",
+ "integrity": "sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==",
+ "dependencies": {
+ "@stablelib/constant-time": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/random": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@stablelib/random/-/random-1.0.2.tgz",
+ "integrity": "sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==",
+ "dependencies": {
+ "@stablelib/binary": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/salsa20": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@stablelib/salsa20/-/salsa20-1.0.2.tgz",
+ "integrity": "sha512-nfjKzw0KTKrrKBasEP+j7UP4I8Xudom8lVZIBCp0kQNARXq72IlSic0oabg2FC1NU68L4RdHrNJDd8bFwrphYA==",
+ "dependencies": {
+ "@stablelib/binary": "^1.0.1",
+ "@stablelib/constant-time": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/sha256": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/sha256/-/sha256-1.0.1.tgz",
+ "integrity": "sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==",
+ "dependencies": {
+ "@stablelib/binary": "^1.0.1",
+ "@stablelib/hash": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/sha512": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/sha512/-/sha512-1.0.1.tgz",
+ "integrity": "sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==",
+ "dependencies": {
+ "@stablelib/binary": "^1.0.1",
+ "@stablelib/hash": "^1.0.1",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/utf8": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/utf8/-/utf8-1.0.1.tgz",
+ "integrity": "sha512-FrYD1xadah/TtAP6VJ04lDD5h9rdDj/d8wH/jMYTtHqZBv9z2btdvEU8vTxdjdkFmo1b/BH+t3R1wi/mYhCCNg=="
+ },
+ "node_modules/@stablelib/wipe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/wipe/-/wipe-1.0.1.tgz",
+ "integrity": "sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg=="
+ },
+ "node_modules/@stablelib/x25519": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@stablelib/x25519/-/x25519-1.0.3.tgz",
+ "integrity": "sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==",
+ "dependencies": {
+ "@stablelib/keyagreement": "^1.0.1",
+ "@stablelib/random": "^1.0.2",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@stablelib/x25519-session": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@stablelib/x25519-session/-/x25519-session-1.0.4.tgz",
+ "integrity": "sha512-UZw67EJWSNTaou7Qp086fzGek7crrCQl2K7MoqEzslXxrm6vybySfcdsqaZ0ZpKq19IHWK8G0wAlFBy70srm3w==",
+ "dependencies": {
+ "@stablelib/blake2b": "^1.0.1",
+ "@stablelib/keyagreement": "^1.0.1",
+ "@stablelib/random": "^1.0.2",
+ "@stablelib/wipe": "^1.0.1",
+ "@stablelib/x25519": "^1.0.3"
+ }
+ },
+ "node_modules/@stablelib/xsalsa20": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@stablelib/xsalsa20/-/xsalsa20-1.0.2.tgz",
+ "integrity": "sha512-7XdBGbcNgBShmuhDXv1G1WPVCkjZdkb1oPMzSidO7Fve0MHntH6TjFkj5bfLI+aRE+61weO076vYpP/jmaAYog==",
+ "dependencies": {
+ "@stablelib/binary": "^1.0.1",
+ "@stablelib/salsa20": "^1.0.2",
+ "@stablelib/wipe": "^1.0.1"
+ }
+ },
+ "node_modules/@swc/helpers": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz",
+ "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@swc/helpers/node_modules/tslib": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
+ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+ },
+ "node_modules/@taquito/beacon-wallet": {
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@taquito/beacon-wallet/-/beacon-wallet-17.3.0.tgz",
+ "integrity": "sha512-uUJWK3ieW4affaka3j6dWzqNTmvBkoOmDp/byzJhRoMBx6uwMcul/akyneqNkD5dQLe4vj3Hkh2S73cpl1G0xw==",
+ "dependencies": {
+ "@airgap/beacon-dapp": "4.0.6",
+ "@taquito/core": "^17.3.0",
+ "@taquito/taquito": "^17.3.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@taquito/core": {
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@taquito/core/-/core-17.3.0.tgz",
+ "integrity": "sha512-worh4CMAue4GqLZeJOB1PwIHZ+LH+RmHxfRuSD/c0VoAbuJUVkdRu+uLgGyx+hdIKUeyAxe2g41c50VSMYF3Zw==",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@taquito/http-utils": {
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@taquito/http-utils/-/http-utils-17.3.0.tgz",
+ "integrity": "sha512-jUclvXppsIExn93PSrEsW5IkrsP11V9D5DWfqFne5uwt5GAaJBlaSYBJKo4vyfE9EGmZ+MQWs0X/MbTT625FgA==",
+ "dependencies": {
+ "@taquito/core": "^17.3.0",
+ "axios": "0.26.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@taquito/http-utils/node_modules/axios": {
+ "version": "0.26.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.0.tgz",
+ "integrity": "sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==",
+ "dependencies": {
+ "follow-redirects": "^1.14.8"
+ }
+ },
+ "node_modules/@taquito/local-forging": {
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@taquito/local-forging/-/local-forging-17.3.0.tgz",
+ "integrity": "sha512-Y/4Yl2RBvE7UhgZ1GNj6LlJFgfqtgtNNbZ9zJEqbUBuxpwC/i0ZP5UlOwInbwFS9081vrWgLkj3JNyvC7KP2Kg==",
+ "dependencies": {
+ "@taquito/core": "^17.3.0",
+ "@taquito/utils": "^17.3.0",
+ "bignumber.js": "^9.1.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@taquito/michel-codec": {
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@taquito/michel-codec/-/michel-codec-17.3.0.tgz",
+ "integrity": "sha512-svct6iY1VnwFUlJaj6LX6kcuTqQ0nCiZ+DcTmsZAG6HcCP3gcEPxf02pbZl2zyqJbNpeKt4Q9EDaxBapBW2G5Q==",
+ "dependencies": {
+ "@taquito/core": "^17.3.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@taquito/michelson-encoder": {
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@taquito/michelson-encoder/-/michelson-encoder-17.3.0.tgz",
+ "integrity": "sha512-XFvAGdnwpH0TF8liNiuE5COdvBFh5VmyN8WullRvwxlUcxLvQYS+MAfJjbk7WuSv4k31gQPc9r7O3G4m0AbPlA==",
+ "dependencies": {
+ "@taquito/rpc": "^17.3.0",
+ "@taquito/utils": "^17.3.0",
+ "bignumber.js": "^9.1.0",
+ "fast-json-stable-stringify": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@taquito/rpc": {
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@taquito/rpc/-/rpc-17.3.0.tgz",
+ "integrity": "sha512-xZkTS3BhAe/9Bo8Q7o5LLsMYkv5R+g33gp2Fm/drmpyFmepk1QCj94fEvIUSb/7CcOJxr3dnPXTPh1hpi8zp+w==",
+ "dependencies": {
+ "@taquito/core": "^17.3.0",
+ "@taquito/http-utils": "^17.3.0",
+ "@taquito/utils": "^17.3.0",
+ "bignumber.js": "^9.1.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@taquito/taquito": {
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@taquito/taquito/-/taquito-17.3.0.tgz",
+ "integrity": "sha512-AODy23a398LWx2k7gIFxHrJHe8BzLsvxCBR9eTIOH1qhhCiKf9oEEJR6Ymj9rAXnp3RoZRt/orQ7ylqB0NrXnA==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@taquito/core": "^17.3.0",
+ "@taquito/http-utils": "^17.3.0",
+ "@taquito/local-forging": "^17.3.0",
+ "@taquito/michel-codec": "^17.3.0",
+ "@taquito/michelson-encoder": "^17.3.0",
+ "@taquito/rpc": "^17.3.0",
+ "@taquito/utils": "^17.3.0",
+ "bignumber.js": "^9.1.0",
+ "rxjs": "^7.8.1"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@taquito/tzip12": {
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@taquito/tzip12/-/tzip12-17.3.0.tgz",
+ "integrity": "sha512-vDh7ygTMpJBeEsRejB+hqot0Z0NbdLt9nI2KBACDvlsX2EyOLGrlQaMRcfivd0bnNz/rkkFhH4EzodulIbPXRg==",
+ "dependencies": {
+ "@taquito/michelson-encoder": "^17.3.0",
+ "@taquito/taquito": "^17.3.0",
+ "@taquito/tzip16": "^17.3.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@taquito/tzip16": {
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@taquito/tzip16/-/tzip16-17.3.0.tgz",
+ "integrity": "sha512-7rSIWQhUKg+c1JpB3dqHKSPwjne1gbwtMYKthYOycmZbCzT31zYgrpF6UVamLnVcTt+102v24OY/P+Y9JZ3lyg==",
+ "dependencies": {
+ "@taquito/http-utils": "^17.3.0",
+ "@taquito/michelson-encoder": "^17.3.0",
+ "@taquito/rpc": "^17.3.0",
+ "@taquito/taquito": "^17.3.0",
+ "@taquito/utils": "^17.3.0",
+ "bignumber.js": "^9.1.0",
+ "crypto-js": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@taquito/utils": {
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@taquito/utils/-/utils-17.3.0.tgz",
+ "integrity": "sha512-e1MdHDdDcK473bdi/zLtBV91b/7SUx/j0kwKXgPt04hbKX+/Nu1mJSviExFE/GXgxFvB6iufDui45Ui8jcYKtg==",
+ "dependencies": {
+ "@stablelib/blake2b": "^1.0.1",
+ "@stablelib/ed25519": "^1.0.3",
+ "@taquito/core": "^17.3.0",
+ "@types/bs58check": "^2.1.0",
+ "bignumber.js": "^9.1.0",
+ "blakejs": "^1.2.1",
+ "bs58check": "^2.1.2",
+ "buffer": "^6.0.3",
+ "elliptic": "^6.5.4",
+ "typedarray-to-buffer": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@types/bs58check": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/bs58check/-/bs58check-2.1.0.tgz",
+ "integrity": "sha512-OxsysnJQh82vy9DRbOcw9m2j/WiyqZLn0YBhKxdQ+aCwoHj+tWzyCgpwAkr79IfDXZKxc6h7k89T9pwS78CqTQ==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/chrome": {
+ "version": "0.0.163",
+ "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.163.tgz",
+ "integrity": "sha512-g+3E2tg/ukFsEgH+tB3a/b+J1VSvq/8gh2Jwih9eq+T3Idrz7ngj97u+/ya58Bfei2TQtPlRivj1FsCaSnukDA==",
+ "dependencies": {
+ "@types/filesystem": "*",
+ "@types/har-format": "*"
+ }
+ },
+ "node_modules/@types/filesystem": {
+ "version": "0.0.32",
+ "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.32.tgz",
+ "integrity": "sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==",
+ "dependencies": {
+ "@types/filewriter": "*"
+ }
+ },
+ "node_modules/@types/filewriter": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.29.tgz",
+ "integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ=="
+ },
+ "node_modules/@types/har-format": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.11.tgz",
+ "integrity": "sha512-T232/TneofqK30AD1LRrrf8KnjLvzrjWDp7eWST5KoiSzrBfRsLrWDPk4STQPW4NZG6v2MltnduBVmakbZOBIQ=="
+ },
+ "node_modules/@types/hoist-non-react-statics": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz",
+ "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==",
+ "dependencies": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
+ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
+ "dev": true
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
+ "dev": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
+ "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
+ "dev": true,
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/jest": {
+ "version": "26.0.24",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz",
+ "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==",
+ "dev": true,
+ "dependencies": {
+ "jest-diff": "^26.0.0",
+ "pretty-format": "^26.0.0"
+ }
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "20.4.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz",
+ "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw=="
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.5",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
+ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w=="
+ },
+ "node_modules/@types/react": {
+ "version": "18.2.15",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.15.tgz",
+ "integrity": "sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA==",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.2.7",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz",
+ "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==",
+ "devOptional": true,
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react-redux": {
+ "version": "7.1.25",
+ "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.25.tgz",
+ "integrity": "sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==",
+ "dependencies": {
+ "@types/hoist-non-react-statics": "^3.3.0",
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0",
+ "redux": "^4.0.0"
+ }
+ },
+ "node_modules/@types/redux-logger": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/@types/redux-logger/-/redux-logger-3.0.9.tgz",
+ "integrity": "sha512-cwYhVbYNgH01aepeMwhd0ABX6fhVB2rcQ9m80u8Fl50ZODhsZ8RhQArnLTkE7/Zrfq4Sz/taNoF7DQy9pCZSKg==",
+ "dev": true,
+ "dependencies": {
+ "redux": "^4.0.0"
+ }
+ },
+ "node_modules/@types/scheduler": {
+ "version": "0.16.3",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
+ "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ=="
+ },
+ "node_modules/@types/use-sync-external-store": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz",
+ "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
+ },
+ "node_modules/@types/yargs": {
+ "version": "15.0.15",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz",
+ "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==",
+ "dev": true,
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.0",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz",
+ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz",
+ "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==",
+ "dev": 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"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz",
+ "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz",
+ "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz",
+ "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==",
+ "dev": 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"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz",
+ "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@walletconnect/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-xUeFPpElybgn1a+lknqtHleei4VyuV/4qWgB1nP8qQUAO6a5pNsioODrnB2VAPdUHJYBdx2dCt2maRk6g53IPQ==",
+ "dependencies": {
+ "@walletconnect/heartbeat": "1.2.1",
+ "@walletconnect/jsonrpc-provider": "^1.0.12",
+ "@walletconnect/jsonrpc-utils": "^1.0.7",
+ "@walletconnect/jsonrpc-ws-connection": "^1.0.11",
+ "@walletconnect/keyvaluestorage": "^1.0.2",
+ "@walletconnect/logger": "^2.0.1",
+ "@walletconnect/relay-api": "^1.0.9",
+ "@walletconnect/relay-auth": "^1.0.4",
+ "@walletconnect/safe-json": "^1.0.2",
+ "@walletconnect/time": "^1.0.2",
+ "@walletconnect/types": "2.7.0",
+ "@walletconnect/utils": "2.7.0",
+ "events": "^3.3.0",
+ "lodash.isequal": "4.5.0",
+ "uint8arrays": "^3.1.0"
+ }
+ },
+ "node_modules/@walletconnect/environment": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.1.tgz",
+ "integrity": "sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==",
+ "dependencies": {
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/events": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@walletconnect/events/-/events-1.0.1.tgz",
+ "integrity": "sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==",
+ "dependencies": {
+ "keyvaluestorage-interface": "^1.0.0",
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/heartbeat": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@walletconnect/heartbeat/-/heartbeat-1.2.1.tgz",
+ "integrity": "sha512-yVzws616xsDLJxuG/28FqtZ5rzrTA4gUjdEMTbWB5Y8V1XHRmqq4efAxCw5ie7WjbXFSUyBHaWlMR+2/CpQC5Q==",
+ "dependencies": {
+ "@walletconnect/events": "^1.0.1",
+ "@walletconnect/time": "^1.0.2",
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/jsonrpc-provider": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.13.tgz",
+ "integrity": "sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g==",
+ "dependencies": {
+ "@walletconnect/jsonrpc-utils": "^1.0.8",
+ "@walletconnect/safe-json": "^1.0.2",
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/jsonrpc-types": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.3.tgz",
+ "integrity": "sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw==",
+ "dependencies": {
+ "keyvaluestorage-interface": "^1.0.0",
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/jsonrpc-utils": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz",
+ "integrity": "sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==",
+ "dependencies": {
+ "@walletconnect/environment": "^1.0.1",
+ "@walletconnect/jsonrpc-types": "^1.0.3",
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/jsonrpc-ws-connection": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.13.tgz",
+ "integrity": "sha512-mfOM7uFH4lGtQxG+XklYuFBj6dwVvseTt5/ahOkkmpcAEgz2umuzu7fTR+h5EmjQBdrmYyEBOWADbeaFNxdySg==",
+ "dependencies": {
+ "@walletconnect/jsonrpc-utils": "^1.0.6",
+ "@walletconnect/safe-json": "^1.0.2",
+ "events": "^3.3.0",
+ "tslib": "1.14.1",
+ "ws": "^7.5.1"
+ }
+ },
+ "node_modules/@walletconnect/keyvaluestorage": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.0.2.tgz",
+ "integrity": "sha512-U/nNG+VLWoPFdwwKx0oliT4ziKQCEoQ27L5Hhw8YOFGA2Po9A9pULUYNWhDgHkrb0gYDNt//X7wABcEWWBd3FQ==",
+ "dependencies": {
+ "safe-json-utils": "^1.1.1",
+ "tslib": "1.14.1"
+ },
+ "peerDependencies": {
+ "@react-native-async-storage/async-storage": "1.x",
+ "lokijs": "1.x"
+ },
+ "peerDependenciesMeta": {
+ "@react-native-async-storage/async-storage": {
+ "optional": true
+ },
+ "lokijs": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@walletconnect/logger": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@walletconnect/logger/-/logger-2.0.1.tgz",
+ "integrity": "sha512-SsTKdsgWm+oDTBeNE/zHxxr5eJfZmE9/5yp/Ku+zJtcTAjELb3DXueWkDXmE9h8uHIbJzIb5wj5lPdzyrjT6hQ==",
+ "dependencies": {
+ "pino": "7.11.0",
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/relay-api": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@walletconnect/relay-api/-/relay-api-1.0.9.tgz",
+ "integrity": "sha512-Q3+rylJOqRkO1D9Su0DPE3mmznbAalYapJ9qmzDgK28mYF9alcP3UwG/og5V7l7CFOqzCLi7B8BvcBUrpDj0Rg==",
+ "dependencies": {
+ "@walletconnect/jsonrpc-types": "^1.0.2",
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/relay-auth": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz",
+ "integrity": "sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==",
+ "dependencies": {
+ "@stablelib/ed25519": "^1.0.2",
+ "@stablelib/random": "^1.0.1",
+ "@walletconnect/safe-json": "^1.0.1",
+ "@walletconnect/time": "^1.0.2",
+ "tslib": "1.14.1",
+ "uint8arrays": "^3.0.0"
+ }
+ },
+ "node_modules/@walletconnect/safe-json": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.2.tgz",
+ "integrity": "sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==",
+ "dependencies": {
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/sign-client": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.7.0.tgz",
+ "integrity": "sha512-K99xa6GSFS04U+140yrIEi/VJJJ0Q1ov4jCaiqa9euILDKxlBsM7m5GR+9sq6oYyj18SluJY4CJTdeOXUJlarA==",
+ "dependencies": {
+ "@walletconnect/core": "2.7.0",
+ "@walletconnect/events": "^1.0.1",
+ "@walletconnect/heartbeat": "1.2.1",
+ "@walletconnect/jsonrpc-utils": "^1.0.7",
+ "@walletconnect/logger": "^2.0.1",
+ "@walletconnect/time": "^1.0.2",
+ "@walletconnect/types": "2.7.0",
+ "@walletconnect/utils": "2.7.0",
+ "events": "^3.3.0"
+ }
+ },
+ "node_modules/@walletconnect/time": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@walletconnect/time/-/time-1.0.2.tgz",
+ "integrity": "sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==",
+ "dependencies": {
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/types": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.7.0.tgz",
+ "integrity": "sha512-aMUDUtO79WSBtC/bDetE6aFwdgwJr0tJ8nC8gnAl5ELsrjygEKCn6M8Q+v6nP9svG9yf5Rds4cImxCT6BWwTyw==",
+ "dependencies": {
+ "@walletconnect/events": "^1.0.1",
+ "@walletconnect/heartbeat": "1.2.1",
+ "@walletconnect/jsonrpc-types": "^1.0.2",
+ "@walletconnect/keyvaluestorage": "^1.0.2",
+ "@walletconnect/logger": "^2.0.1",
+ "events": "^3.3.0"
+ }
+ },
+ "node_modules/@walletconnect/utils": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.7.0.tgz",
+ "integrity": "sha512-k32jrQeyJsNZPdmtmg85Y3QgaS5YfzYSPrAxRC2uUD1ts7rrI6P5GG2iXNs3AvWKOuCgsp/PqU8s7AC7CRUscw==",
+ "dependencies": {
+ "@stablelib/chacha20poly1305": "1.0.1",
+ "@stablelib/hkdf": "1.0.1",
+ "@stablelib/random": "^1.0.2",
+ "@stablelib/sha256": "1.0.1",
+ "@stablelib/x25519": "^1.0.3",
+ "@walletconnect/jsonrpc-utils": "^1.0.7",
+ "@walletconnect/relay-api": "^1.0.9",
+ "@walletconnect/safe-json": "^1.0.2",
+ "@walletconnect/time": "^1.0.2",
+ "@walletconnect/types": "2.7.0",
+ "@walletconnect/window-getters": "^1.0.1",
+ "@walletconnect/window-metadata": "^1.0.1",
+ "detect-browser": "5.3.0",
+ "query-string": "7.1.1",
+ "uint8arrays": "^3.1.0"
+ }
+ },
+ "node_modules/@walletconnect/window-getters": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.1.tgz",
+ "integrity": "sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==",
+ "dependencies": {
+ "tslib": "1.14.1"
+ }
+ },
+ "node_modules/@walletconnect/window-metadata": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz",
+ "integrity": "sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==",
+ "dependencies": {
+ "@walletconnect/window-getters": "^1.0.1",
+ "tslib": "1.14.1"
+ }
+ },
+ "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": {
+ "event-target-shim": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6.5"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "dev": true,
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-escapes/node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true
+ },
+ "node_modules/aria-hidden": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz",
+ "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/aria-hidden/node_modules/tslib": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz",
+ "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig=="
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
+ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
+ "dev": true,
+ "dependencies": {
+ "dequal": "^2.0.3"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
+ "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "is-array-buffer": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz",
+ "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "get-intrinsic": "^1.1.3",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz",
+ "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz",
+ "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz",
+ "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0",
+ "get-intrinsic": "^1.1.3"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz",
+ "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "get-intrinsic": "^1.2.1",
+ "is-array-buffer": "^3.0.2",
+ "is-shared-array-buffer": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/assert": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz",
+ "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==",
+ "dev": true,
+ "dependencies": {
+ "es6-object-assign": "^1.1.0",
+ "is-nan": "^1.2.1",
+ "object-is": "^1.0.1",
+ "util": "^0.12.0"
+ }
+ },
+ "node_modules/ast-types-flow": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
+ "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==",
+ "dev": true
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/async": {
+ "version": "2.6.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
+ "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.14"
+ }
+ },
+ "node_modules/atomic-sleep": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz",
+ "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.14",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz",
+ "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.21.5",
+ "caniuse-lite": "^1.0.30001464",
+ "fraction.js": "^4.2.0",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axe-core": {
+ "version": "4.7.2",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz",
+ "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/axios": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz",
+ "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==",
+ "dependencies": {
+ "follow-redirects": "^1.14.4"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz",
+ "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==",
+ "dev": true,
+ "dependencies": {
+ "dequal": "^2.0.3"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/base-x": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz",
+ "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "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/big-integer": {
+ "version": "1.6.51",
+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz",
+ "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/bignumber.js": {
+ "version": "9.1.1",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz",
+ "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/blakejs": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz",
+ "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ=="
+ },
+ "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/bplist-parser": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz",
+ "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==",
+ "dev": true,
+ "dependencies": {
+ "big-integer": "^1.6.44"
+ },
+ "engines": {
+ "node": ">= 5.10.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="
+ },
+ "node_modules/browserslist": {
+ "version": "4.21.9",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz",
+ "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==",
+ "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"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001503",
+ "electron-to-chromium": "^1.4.431",
+ "node-releases": "^2.0.12",
+ "update-browserslist-db": "^1.0.11"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bs58": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
+ "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==",
+ "dependencies": {
+ "base-x": "^3.0.2"
+ }
+ },
+ "node_modules/bs58check": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz",
+ "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==",
+ "dependencies": {
+ "bs58": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "node_modules/bundle-name": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz",
+ "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==",
+ "dev": true,
+ "dependencies": {
+ "run-applescript": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001516",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz",
+ "integrity": "sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==",
+ "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/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": 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/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-truncate": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz",
+ "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==",
+ "dev": true,
+ "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"
+ }
+ },
+ "node_modules/cli-truncate/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/cli-truncate/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/cli-truncate/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-truncate/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "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==",
+ "dev": true
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "dev": true
+ },
+ "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==",
+ "dev": true
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "dev": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "node_modules/cross-port-killer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/cross-port-killer/-/cross-port-killer-1.4.0.tgz",
+ "integrity": "sha512-ujqfftKsSeorFMVI6JP25xMBixHEaDWVK+NarRZAGnJjR5AhebRQU+g+k/Lj8OHwM6f+wrrs8u5kkCdI7RLtxQ==",
+ "dev": true,
+ "bin": {
+ "kill-port": "source/cli.js"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypto-js": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
+ "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
+ "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
+ },
+ "node_modules/damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "dev": true
+ },
+ "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.11"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/date-fns"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/decode-uri-component": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+ "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/deep-diff": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz",
+ "integrity": "sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug=="
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/default-browser": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz",
+ "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==",
+ "dev": true,
+ "dependencies": {
+ "bundle-name": "^3.0.0",
+ "default-browser-id": "^3.0.0",
+ "execa": "^7.1.1",
+ "titleize": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/default-browser-id": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz",
+ "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==",
+ "dev": true,
+ "dependencies": {
+ "bplist-parser": "^0.2.0",
+ "untildify": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz",
+ "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==",
+ "dev": true,
+ "dependencies": {
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/detect-browser": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz",
+ "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w=="
+ },
+ "node_modules/detect-node-es": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true
+ },
+ "node_modules/diff-sequences": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz",
+ "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.14.2"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.463",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.463.tgz",
+ "integrity": "sha512-fT3hvdUWLjDbaTGzyOjng/CQhQJSQP8ThO3XZAoaxHvHo2kUXiRQVMj9M235l8uDFiNPsPa6KHT1p3RaR6ugRw==",
+ "dev": true
+ },
+ "node_modules/elliptic": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+ "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+ "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"
+ }
+ },
+ "node_modules/email-addresses": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz",
+ "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==",
+ "dev": true
+ },
+ "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==",
+ "dev": true
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.15.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
+ "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/enhanced-resolve/node_modules/tapable": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz",
+ "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "arraybuffer.prototype.slice": "^1.0.1",
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "es-set-tostringtag": "^2.0.1",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.5",
+ "get-intrinsic": "^1.2.1",
+ "get-symbol-description": "^1.0.0",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has": "^1.0.3",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "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.10",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.12.3",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.5.0",
+ "safe-array-concat": "^1.0.0",
+ "safe-regex-test": "^1.0.0",
+ "string.prototype.trim": "^1.2.7",
+ "string.prototype.trimend": "^1.0.6",
+ "string.prototype.trimstart": "^1.0.6",
+ "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.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
+ "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.3",
+ "has": "^1.0.3",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
+ "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es6-object-assign": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz",
+ "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==",
+ "dev": true
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.45.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz",
+ "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.4.0",
+ "@eslint/eslintrc": "^2.1.0",
+ "@eslint/js": "8.44.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.6.0",
+ "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",
+ "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.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-next": {
+ "version": "13.4.12",
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.12.tgz",
+ "integrity": "sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==",
+ "dev": true,
+ "dependencies": {
+ "@next/eslint-plugin-next": "13.4.12",
+ "@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": "5.0.0-canary-7118f5dd7-20230705"
+ },
+ "peerDependencies": {
+ "eslint": "^7.23.0 || ^8.0.0",
+ "typescript": ">=3.3.1"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "8.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz",
+ "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.7",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz",
+ "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.11.0",
+ "resolve": "^1.22.1"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-import-resolver-typescript": {
+ "version": "3.5.5",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz",
+ "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.4",
+ "enhanced-resolve": "^5.12.0",
+ "eslint-module-utils": "^2.7.4",
+ "get-tsconfig": "^4.5.0",
+ "globby": "^13.1.3",
+ "is-core-module": "^2.11.0",
+ "is-glob": "^4.0.3",
+ "synckit": "^0.8.5"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "eslint-plugin-import": "*"
+ }
+ },
+ "node_modules/eslint-import-resolver-typescript/node_modules/globby": {
+ "version": "13.2.2",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz",
+ "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==",
+ "dev": true,
+ "dependencies": {
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.3.0",
+ "ignore": "^5.2.4",
+ "merge2": "^1.4.1",
+ "slash": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint-import-resolver-typescript/node_modules/slash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
+ "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.27.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz",
+ "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "array.prototype.flatmap": "^1.3.1",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.7",
+ "eslint-module-utils": "^2.7.4",
+ "has": "^1.0.3",
+ "is-core-module": "^2.11.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.values": "^1.1.6",
+ "resolve": "^1.22.1",
+ "semver": "^6.3.0",
+ "tsconfig-paths": "^3.14.1"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz",
+ "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.20.7",
+ "aria-query": "^5.1.3",
+ "array-includes": "^3.1.6",
+ "array.prototype.flatmap": "^1.3.1",
+ "ast-types-flow": "^0.0.7",
+ "axe-core": "^4.6.2",
+ "axobject-query": "^3.1.1",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "has": "^1.0.3",
+ "jsx-ast-utils": "^3.3.3",
+ "language-tags": "=1.0.5",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.6",
+ "object.fromentries": "^2.0.6",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.33.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.0.tgz",
+ "integrity": "sha512-qewL/8P34WkY8jAqdQxsiL82pDUeT7nhs8IsuXgfgnsEloKCT4miAV9N9kGtx7/KM9NH/NCGUE7Edt9iGxLXFw==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flatmap": "^1.3.1",
+ "array.prototype.tosorted": "^1.1.1",
+ "doctrine": "^2.1.0",
+ "estraverse": "^5.3.0",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.6",
+ "object.fromentries": "^2.0.6",
+ "object.hasown": "^1.1.2",
+ "object.values": "^1.1.6",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.4",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "5.0.0-canary-7118f5dd7-20230705",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz",
+ "integrity": "sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==",
+ "dev": true,
+ "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/eslint-plugin-react/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.4",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
+ "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
+ "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/eslint-scope": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz",
+ "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==",
+ "dev": true,
+ "dependencies": {
+ "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/eslint/node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/eslint/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree/node_modules/acorn": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+ "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/event-target-shim": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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": ">=0.8.x"
+ }
+ },
+ "node_modules/eventsource": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.2.tgz",
+ "integrity": "sha512-xAH3zWhgO2/3KIniEKYPr8plNSzlGINOUqYj0m0u7AB81iRw8b/3E73W6AuU+6klLbaSFmZnaETQ2lXPfAydrA==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/execa": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz",
+ "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==",
+ "dev": 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"
+ },
+ "engines": {
+ "node": "^14.18.0 || ^16.14.0 || >=18.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/execa/node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/execa/node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/execa/node_modules/npm-run-path": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz",
+ "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/execa/node_modules/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/execa/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/execa/node_modules/strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
+ "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz",
+ "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==",
+ "dev": 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"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fast-redact": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.2.0.tgz",
+ "integrity": "sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fetch-cookie": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-0.11.0.tgz",
+ "integrity": "sha512-BQm7iZLFhMWFy5CZ/162sAGjBfdNWb7a8LEqqnzsHFhxT/X/SVj/z2t2nu3aJvjlbQkrAlTUApplPRjWyH4mhA==",
+ "dependencies": {
+ "tough-cookie": "^2.3.3 || ^3.0.1 || ^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/filename-reserved-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
+ "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/filenamify": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz",
+ "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==",
+ "dev": true,
+ "dependencies": {
+ "filename-reserved-regex": "^2.0.0",
+ "strip-outer": "^1.0.1",
+ "trim-repeated": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/filter-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz",
+ "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "dev": true,
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+ "dev": true
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+ "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/fp-ts": {
+ "version": "2.16.0",
+ "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.0.tgz",
+ "integrity": "sha512-bLq+KgbiXdTEoT1zcARrWEpa5z6A/8b7PcDW7Gef3NSisQ+VS7ll2Xbf1E+xsgik0rWub/8u0qP/iTTjj+PhxQ=="
+ },
+ "node_modules/fraction.js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://www.patreon.com/infusion"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
+ "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.19.0",
+ "functions-have-names": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
+ "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-tsconfig": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.6.2.tgz",
+ "integrity": "sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==",
+ "dev": true,
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
+ "node_modules/gh-pages": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-3.2.3.tgz",
+ "integrity": "sha512-jA1PbapQ1jqzacECfjUaO9gV8uBgU6XNMV0oXLtfCX3haGLe5Atq8BxlrADhbD6/UdG9j6tZLWAkAybndOXTJg==",
+ "dev": true,
+ "dependencies": {
+ "async": "^2.6.1",
+ "commander": "^2.18.0",
+ "email-addresses": "^3.0.1",
+ "filenamify": "^4.3.0",
+ "find-cache-dir": "^3.3.1",
+ "fs-extra": "^8.1.0",
+ "globby": "^6.1.0"
+ },
+ "bin": {
+ "gh-pages": "bin/gh-pages.js",
+ "gh-pages-clean": "bin/gh-pages-clean.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/gh-pages/node_modules/array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==",
+ "dev": true,
+ "dependencies": {
+ "array-uniq": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/gh-pages/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==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/gh-pages/node_modules/globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^1.0.1",
+ "glob": "^7.0.3",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/gh-pages/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/gh-pages/node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+ "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "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"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
+ "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hash-base": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "node_modules/hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+ "dependencies": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "dependencies": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz",
+ "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/husky": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz",
+ "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==",
+ "dev": true,
+ "bin": {
+ "husky": "lib/bin.js"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/typicode"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "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/ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
+ "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.0",
+ "has": "^1.0.3",
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "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/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==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
+ "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.0",
+ "is-typed-array": "^1.1.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dev": true,
+ "dependencies": {
+ "has-bigints": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
+ "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true,
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-inside-container": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
+ "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+ "dev": true,
+ "dependencies": {
+ "is-docker": "^3.0.0"
+ },
+ "bin": {
+ "is-inside-container": "cli.js"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-inside-container/node_modules/is-docker": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+ "dev": true,
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-nan": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz",
+ "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz",
+ "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==",
+ "dev": true,
+ "dependencies": {
+ "which-typed-array": "^1.1.11"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/jest-diff": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz",
+ "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^26.6.2",
+ "jest-get-type": "^26.3.0",
+ "pretty-format": "^26.6.2"
+ },
+ "engines": {
+ "node": ">= 10.14.2"
+ }
+ },
+ "node_modules/jest-get-type": {
+ "version": "26.3.0",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+ "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.14.2"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz",
+ "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==",
+ "dev": true,
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz",
+ "integrity": "sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/keyvaluestorage-interface": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz",
+ "integrity": "sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g=="
+ },
+ "node_modules/language-subtag-registry": {
+ "version": "0.3.22",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
+ "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==",
+ "dev": true
+ },
+ "node_modules/language-tags": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
+ "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==",
+ "dev": true,
+ "dependencies": {
+ "language-subtag-registry": "~0.3.2"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
+ "node_modules/lint-staged": {
+ "version": "13.2.3",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.3.tgz",
+ "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "5.2.0",
+ "cli-truncate": "^3.1.0",
+ "commander": "^10.0.0",
+ "debug": "^4.3.4",
+ "execa": "^7.0.0",
+ "lilconfig": "2.1.0",
+ "listr2": "^5.0.7",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-inspect": "^1.12.3",
+ "pidtree": "^0.6.0",
+ "string-argv": "^0.3.1",
+ "yaml": "^2.2.2"
+ },
+ "bin": {
+ "lint-staged": "bin/lint-staged.js"
+ },
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/lint-staged"
+ }
+ },
+ "node_modules/lint-staged/node_modules/chalk": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
+ "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/lint-staged/node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/lint-staged/node_modules/yaml": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz",
+ "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/listr2": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz",
+ "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==",
+ "dev": true,
+ "dependencies": {
+ "cli-truncate": "^2.1.0",
+ "colorette": "^2.0.19",
+ "log-update": "^4.0.0",
+ "p-map": "^4.0.0",
+ "rfdc": "^1.3.0",
+ "rxjs": "^7.8.0",
+ "through": "^2.3.8",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "enquirer": ">= 2.3.0 < 3"
+ },
+ "peerDependenciesMeta": {
+ "enquirer": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/listr2/node_modules/cli-truncate": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
+ "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+ "dev": true,
+ "dependencies": {
+ "slice-ansi": "^3.0.0",
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/listr2/node_modules/slice-ansi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+ "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/log-update": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
+ "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-escapes": "^4.3.0",
+ "cli-cursor": "^3.1.0",
+ "slice-ansi": "^4.0.0",
+ "wrap-ansi": "^6.2.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/log-update/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==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/md5.js": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+ },
+ "node_modules/minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true
+ },
+ "node_modules/multiformats": {
+ "version": "9.9.0",
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz",
+ "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+ "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/next": {
+ "version": "13.4.10",
+ "resolved": "https://registry.npmjs.org/next/-/next-13.4.10.tgz",
+ "integrity": "sha512-4ep6aKxVTQ7rkUW2fBLhpBr/5oceCuf4KmlUpvG/aXuDTIf9mexNSpabUD6RWPspu6wiJJvozZREhXhueYO36A==",
+ "dependencies": {
+ "@next/env": "13.4.10",
+ "@swc/helpers": "0.5.1",
+ "busboy": "1.6.0",
+ "caniuse-lite": "^1.0.30001406",
+ "postcss": "8.4.14",
+ "styled-jsx": "5.1.1",
+ "watchpack": "2.4.0",
+ "zod": "3.21.4"
+ },
+ "bin": {
+ "next": "dist/bin/next"
+ },
+ "engines": {
+ "node": ">=16.8.0"
+ },
+ "optionalDependencies": {
+ "@next/swc-darwin-arm64": "13.4.10",
+ "@next/swc-darwin-x64": "13.4.10",
+ "@next/swc-linux-arm64-gnu": "13.4.10",
+ "@next/swc-linux-arm64-musl": "13.4.10",
+ "@next/swc-linux-x64-gnu": "13.4.10",
+ "@next/swc-linux-x64-musl": "13.4.10",
+ "@next/swc-win32-arm64-msvc": "13.4.10",
+ "@next/swc-win32-ia32-msvc": "13.4.10",
+ "@next/swc-win32-x64-msvc": "13.4.10"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.1.0",
+ "fibers": ">= 3.1.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "sass": "^1.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "fibers": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/next/node_modules/busboy": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+ "dependencies": {
+ "streamsearch": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=10.16.0"
+ }
+ },
+ "node_modules/next/node_modules/postcss": {
+ "version": "8.4.14",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
+ "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.4",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/next/node_modules/streamsearch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "2.6.13",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz",
+ "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-fetch/node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+ },
+ "node_modules/node-fetch/node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+ },
+ "node_modules/node-fetch/node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
+ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.12.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
+ "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-is": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
+ "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
+ "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz",
+ "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz",
+ "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.hasown": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz",
+ "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz",
+ "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-exit-leak-free": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz",
+ "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg=="
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/open": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz",
+ "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==",
+ "dev": true,
+ "dependencies": {
+ "default-browser": "^4.0.0",
+ "define-lazy-prop": "^3.0.0",
+ "is-inside-container": "^1.0.0",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/open/node_modules/define-lazy-prop": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
+ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "dev": true,
+ "dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "dev": true,
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pidtree": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
+ "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
+ "dev": true,
+ "bin": {
+ "pidtree": "bin/pidtree.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
+ "dev": true,
+ "dependencies": {
+ "pinkie": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pino": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz",
+ "integrity": "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==",
+ "dependencies": {
+ "atomic-sleep": "^1.0.0",
+ "fast-redact": "^3.0.0",
+ "on-exit-leak-free": "^0.2.0",
+ "pino-abstract-transport": "v0.5.0",
+ "pino-std-serializers": "^4.0.0",
+ "process-warning": "^1.0.0",
+ "quick-format-unescaped": "^4.0.3",
+ "real-require": "^0.1.0",
+ "safe-stable-stringify": "^2.1.0",
+ "sonic-boom": "^2.2.1",
+ "thread-stream": "^0.15.1"
+ },
+ "bin": {
+ "pino": "bin.js"
+ }
+ },
+ "node_modules/pino-abstract-transport": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz",
+ "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==",
+ "dependencies": {
+ "duplexify": "^4.1.2",
+ "split2": "^4.0.0"
+ }
+ },
+ "node_modules/pino-abstract-transport/node_modules/duplexify": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
+ "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
+ "dependencies": {
+ "end-of-stream": "^1.4.1",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1",
+ "stream-shift": "^1.0.0"
+ }
+ },
+ "node_modules/pino-std-serializers": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz",
+ "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q=="
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.26",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz",
+ "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.13",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+ "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "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==",
+ "dev": 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/pretty-format/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==",
+ "dev": true
+ },
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/process-warning": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz",
+ "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q=="
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/psl": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
+ },
+ "node_modules/punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qrcode-svg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/qrcode-svg/-/qrcode-svg-1.1.0.tgz",
+ "integrity": "sha512-XyQCIXux1zEIA3NPb0AeR8UMYvXZzWEhgdBgBjH9gO7M48H9uoHzviNz8pXw3UzrAcxRRRn9gxHewAVK7bn9qw==",
+ "bin": {
+ "qrcode-svg": "bin/qrcode-svg.js"
+ }
+ },
+ "node_modules/query-string": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.1.tgz",
+ "integrity": "sha512-MplouLRDHBZSG9z7fpuAAcI7aAYjDLhtsiVZsevsfaHWDS2IDdORKbSd1kWUA+V4zyva/HZoSfpwnYMMQDhb0w==",
+ "dependencies": {
+ "decode-uri-component": "^0.2.0",
+ "filter-obj": "^1.1.0",
+ "split-on-first": "^1.0.0",
+ "strict-uri-encode": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "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/quick-format-unescaped": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz",
+ "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="
+ },
+ "node_modules/react": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
+ "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
+ "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.0"
+ },
+ "peerDependencies": {
+ "react": "^18.2.0"
+ }
+ },
+ "node_modules/react-ga4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/react-ga4/-/react-ga4-2.1.0.tgz",
+ "integrity": "sha512-ZKS7PGNFqqMd3PJ6+C2Jtz/o1iU9ggiy8Y8nUeksgVuvNISbmrQtJiZNvC/TjDsqD0QlU5Wkgs7i+w9+OjHhhQ=="
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "node_modules/react-redux": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.1.tgz",
+ "integrity": "sha512-5W0QaKtEhj+3bC0Nj0NkqkhIv8gLADH/2kYFMTHxCVqQILiWzLv6MaLuV5wJU3BQEdHKzTfcvPN0WMS6SC1oyA==",
+ "dependencies": {
+ "@babel/runtime": "^7.12.1",
+ "@types/hoist-non-react-statics": "^3.3.1",
+ "@types/use-sync-external-store": "^0.0.3",
+ "hoist-non-react-statics": "^3.3.2",
+ "react-is": "^18.0.0",
+ "use-sync-external-store": "^1.0.0"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8 || ^17.0 || ^18.0",
+ "@types/react-dom": "^16.8 || ^17.0 || ^18.0",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0",
+ "react-native": ">=0.59",
+ "redux": "^4 || ^5.0.0-beta.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ },
+ "redux": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-redux/node_modules/react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ },
+ "node_modules/react-remove-scroll": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz",
+ "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==",
+ "dependencies": {
+ "react-remove-scroll-bar": "^2.3.3",
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.0",
+ "use-sidecar": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-remove-scroll-bar": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz",
+ "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==",
+ "dependencies": {
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-remove-scroll-bar/node_modules/tslib": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz",
+ "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig=="
+ },
+ "node_modules/react-remove-scroll/node_modules/tslib": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz",
+ "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig=="
+ },
+ "node_modules/react-style-singleton": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz",
+ "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==",
+ "dependencies": {
+ "get-nonce": "^1.0.0",
+ "invariant": "^2.2.4",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-style-singleton/node_modules/tslib": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz",
+ "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig=="
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/read-cache/node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/real-require": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz",
+ "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==",
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/redux": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
+ "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
+ "dependencies": {
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "node_modules/redux-logger": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz",
+ "integrity": "sha512-JoCIok7bg/XpqA1JqCqXFypuqBbQzGQySrhFzewB7ThcnysTO30l4VCst86AuB9T9tuT03MAA56Jw2PNhRSNCg==",
+ "dependencies": {
+ "deep-diff": "^0.3.5"
+ }
+ },
+ "node_modules/redux-loop": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/redux-loop/-/redux-loop-6.2.0.tgz",
+ "integrity": "sha512-Je/5EdfwX8J99sRq9Y6FsTs/5KIfulli66AMkdu8VnHUXlnas9cA62BjuipUt1nVL9yo+UxCK91TtZ1KHILEwg==",
+ "peerDependencies": {
+ "redux": "^3.7.2 || ^4.0.0"
+ }
+ },
+ "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=="
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz",
+ "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "functions-have-names": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
+ },
+ "node_modules/resolve": {
+ "version": "1.22.2",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
+ "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.11.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rfdc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
+ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
+ "dev": true
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "node_modules/run-applescript": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz",
+ "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==",
+ "dev": true,
+ "dependencies": {
+ "execa": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/run-applescript/node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": 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/run-applescript/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==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/rxjs": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
+ "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/rxjs/node_modules/tslib": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz",
+ "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.0",
+ "has-symbols": "^1.0.3",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "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/safe-json-utils": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/safe-json-utils/-/safe-json-utils-1.1.1.tgz",
+ "integrity": "sha512-SAJWGKDs50tAbiDXLf89PDwt9XYkWyANFWVzn4dTXl5QyI8t2o/bW5/OJl3lvc2WVU4MEpTo9Yz5NVFNsp+OJQ=="
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
+ "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "is-regex": "^1.1.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-stable-stringify": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz",
+ "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
+ "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/seroval": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/seroval/-/seroval-0.5.1.tgz",
+ "integrity": "sha512-ZfhQVB59hmIauJG5Ydynupy8KHyr5imGNtdDhbZG68Ufh1Ynkv9KOYOAABf71oVbQxJ8VkWnMHAjEHE7fWkH5g==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ },
+ "bin": {
+ "sha.js": "bin.js"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
+ "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.0.0",
+ "is-fullwidth-code-point": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
+ "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/solid-js": {
+ "version": "1.7.8",
+ "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.7.8.tgz",
+ "integrity": "sha512-XHBWk1FvFd0JMKljko7FfhefJMTSgYEuVKcQ2a8hzRXfiuSJAGsrPPafqEo+f6l+e8Oe3cROSpIL6kbzjC1fjQ==",
+ "dependencies": {
+ "csstype": "^3.1.0",
+ "seroval": "^0.5.0"
+ }
+ },
+ "node_modules/sonic-boom": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz",
+ "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==",
+ "dependencies": {
+ "atomic-sleep": "^1.0.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/split-on-first": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz",
+ "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "engines": {
+ "node": ">= 10.x"
+ }
+ },
+ "node_modules/stream-shift": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
+ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ=="
+ },
+ "node_modules/strict-uri-encode": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
+ "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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/string-argv": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
+ "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6.19"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz",
+ "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "get-intrinsic": "^1.1.3",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.3",
+ "regexp.prototype.flags": "^1.4.3",
+ "side-channel": "^1.0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz",
+ "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
+ "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
+ "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-outer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
+ "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
+ "dev": true,
+ "dependencies": {
+ "escape-string-regexp": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-outer/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/styled-jsx": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
+ "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==",
+ "dependencies": {
+ "client-only": "0.0.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/sucrase": {
+ "version": "3.33.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.33.0.tgz",
+ "integrity": "sha512-ARGC7vbufOHfpvyGcZZXFaXCMZ9A4fffOGC5ucOW7+WHDGlAe8LJdf3Jts1sWhDeiI1RSWrKy5Hodl+JWGdW2A==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "7.1.6",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sucrase/node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/sucrase/node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "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"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/synckit": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz",
+ "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==",
+ "dev": true,
+ "dependencies": {
+ "@pkgr/utils": "^2.3.1",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unts"
+ }
+ },
+ "node_modules/synckit/node_modules/tslib": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz",
+ "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==",
+ "dev": true
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz",
+ "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==",
+ "dev": true,
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.2.12",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.18.2",
+ "lilconfig": "^2.1.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.23",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.1",
+ "postcss-nested": "^6.0.1",
+ "postcss-selector-parser": "^6.0.11",
+ "resolve": "^1.22.2",
+ "sucrase": "^3.32.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "dev": true,
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/postcss-load-config": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
+ "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
+ "dev": true,
+ "dependencies": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^2.1.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tailwindcss/node_modules/postcss-nested": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
+ "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.11"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/yaml": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz",
+ "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/thread-stream": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz",
+ "integrity": "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==",
+ "dependencies": {
+ "real-require": "^0.1.0"
+ }
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true
+ },
+ "node_modules/titleize": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz",
+ "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tough-cookie": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz",
+ "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
+ "dependencies": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tough-cookie/node_modules/universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/trim-repeated": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
+ "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==",
+ "dev": true,
+ "dependencies": {
+ "escape-string-regexp": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/trim-repeated/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "dev": true
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz",
+ "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==",
+ "dev": true,
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "node_modules/tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
+ "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
+ "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
+ "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+ "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "is-typed-array": "^1.1.9"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typedarray-to-buffer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-4.0.0.tgz",
+ "integrity": "sha512-6dOYeZfS3O9RtRD1caom0sMxgK59b27+IwoNy8RDPsmslSGOyU+mpTamlaIW7aNKi90ZQZ9DFaZL3YRoiSCULQ==",
+ "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/typescript": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz",
+ "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/uint8arrays": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz",
+ "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==",
+ "dependencies": {
+ "multiformats": "^9.4.2"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/untildify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
+ "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
+ "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"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "node_modules/use-callback-ref": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz",
+ "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-callback-ref/node_modules/tslib": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz",
+ "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig=="
+ },
+ "node_modules/use-sidecar": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz",
+ "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==",
+ "dependencies": {
+ "detect-node-es": "^1.1.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-sidecar/node_modules/tslib": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz",
+ "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig=="
+ },
+ "node_modules/use-sync-external-store": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/util": {
+ "version": "0.12.5",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
+ "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "is-typed-array": "^1.1.3",
+ "which-typed-array": "^1.1.2"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "node_modules/watchpack": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
+ "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "dependencies": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz",
+ "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "node_modules/ws": {
+ "version": "7.5.9",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
+ "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zod": {
+ "version": "3.21.4",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz",
+ "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ }
+ }
+}
diff --git a/batcher-ui/package.json b/batcher-ui/package.json
index d1bc6a09..e93dd5fb 100644
--- a/batcher-ui/package.json
+++ b/batcher-ui/package.json
@@ -2,44 +2,22 @@
"name": "batcher",
"version": "1.0.0",
"private": true,
- "description": "An out-of-box UI solution for enterprise applications",
+ "description": "Batch clearing DEX",
"scripts": {
- "analyze": "cross-env ANALYZE=1 umi build",
- "build": "umi build",
- "build:ghostnet": "UMI_ENV=ghostnet umi build",
- "build:ghostnet-ci": "UMI_ENV=ghostnet NODE_OPTIONS='--openssl-legacy-provider' umi build",
- "build:mainnet": "UMI_ENV=mainnet umi build",
- "build:mainnet-ci": "UMI_ENV=mainnet NODE_OPTIONS='--openssl-legacy-provider' umi build",
- "deploy": "npm run build && npm run gh-pages",
- "dev": "npm run start:dev",
"gh-pages": "gh-pages -d dist",
- "i18n-remove": "pro i18n-remove --locale=zh-CN --write",
- "postinstall": "umi g tmp",
- "lint": "umi g tmp && npm run lint:js && npm run lint:style && npm run lint:prettier && npm run tsc",
- "lint-staged": "lint-staged",
- "lint-staged:js": "eslint --ext .js,.jsx,.ts,.tsx ",
- "lint:fix": "eslint --fix --cache --ext .js,.jsx,.ts,.tsx --format=pretty ./src && npm run lint:style",
- "lint:js": "eslint --cache --ext .js,.jsx,.ts,.tsx --format=pretty ./src",
- "lint:prettier": "prettier -c --write \"src/**/*\" --end-of-line auto",
- "lint:style": "stylelint --fix \"src/**/*.less\" --syntax less",
- "openapi": "umi openapi",
- "playwright": "playwright install && playwright test",
- "prepare": "husky install",
+ "prepare": "cd .. && husky install batcher-ui/.husky",
"prettier": "prettier -c --write \"src/**/*\"",
- "serve": "umi-serve",
- "start": "cross-env UMI_ENV=dev umi dev",
- "start:ghostnet": "cross-env UMI_ENV=ghostnet umi dev",
- "start:ghostnet-ci": "cross-env UMI_ENV=ghostnet NODE_OPTIONS='--openssl-legacy-provider' umi dev",
- "start:mainnet": "cross-env UMI_ENV=mainnet umi dev",
- "start:mainnet-ci": "cross-env UMI_ENV=mainnet NODE_OPTIONS='--openssl-legacy-provider' umi dev",
- "test": "umi test",
- "test:component": "umi test ./src/components",
- "test:e2e": "node ./tests/run-tests.js",
- "tsc": "tsc --noEmit"
+ "tsc": "tsc --noEmit",
+ "dev": "ENV=staging next dev",
+ "build": "next build",
+ "start": "next start -p 80",
+ "start:ghostnet": "ENV=ghostnet next start -p 80",
+ "build:ghostnet": "ENV=ghostnet next build",
+ "start:staging": "ENV=staging next start -p 80",
+ "build:staging": "ENV=staging next build",
+ "lint": "next lint"
},
"lint-staged": {
- "**/*.less": "stylelint --syntax less",
- "**/*.{js,jsx,ts,tsx}": "npm run lint-staged:js",
"**/*.{js,jsx,tsx,ts,less,md,json}": [
"prettier --write"
]
@@ -50,69 +28,56 @@
"not ie <= 10"
],
"dependencies": {
- "@ant-design/icons": "^4.7.0",
- "@ant-design/pro-components": "1.1.1",
- "@dipdup/tzkt-api": "^0.0.1",
+ "@airgap/beacon-sdk": "^4.0.10",
+ "@fortawesome/fontawesome-svg-core": "^6.4.2",
+ "@fortawesome/free-solid-svg-icons": "^6.4.2",
+ "@fortawesome/react-fontawesome": "^0.2.0",
"@microsoft/signalr": "^6.0.10",
- "@taquito/beacon-wallet": "^16.0.0",
- "@taquito/taquito": "^16.0.0",
- "@taquito/tzip12": "^16.0.0",
- "@taquito/tzip16": "^16.0.0",
- "@umijs/route-utils": "^2.0.0",
- "antd": "^4.20.0",
- "classnames": "^2.3.0",
+ "@radix-ui/react-dialog": "^1.0.4",
+ "@radix-ui/react-form": "^0.0.3",
+ "@radix-ui/react-icons": "^1.3.0",
+ "@radix-ui/react-radio-group": "^1.1.3",
+ "@radix-ui/react-select": "^1.2.2",
+ "@radix-ui/react-toast": "^1.1.4",
+ "@radix-ui/react-tooltip": "^1.0.6",
+ "@taquito/beacon-wallet": "^17.3.0",
+ "@taquito/taquito": "^17.3.0",
+ "@taquito/tzip12": "^17.3.0",
+ "@taquito/tzip16": "^17.3.0",
+ "@types/react-redux": "^7.1.25",
"date-fns": "^2.29.3",
- "dotenv": "^16.0.3",
- "jsonpath-plus": "^7.2.0",
- "lodash": "^4.17.0",
- "moment": "^2.29.0",
- "omit.js": "^2.0.2",
- "rc-menu": "^9.1.0",
- "rc-util": "^5.16.0",
- "react": "^16.0.2",
- "react-dev-inspector": "^1.7.0",
- "react-dom": "^16.0.2",
+ "fp-ts": "^2.16.0",
+ "next": "^13.4.10",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
"react-ga4": "^2.1.0",
- "react-helmet-async": "^1.2.0",
- "react-hot-toast": "^2.4.0",
- "typescript": "^4.4.2",
- "umi": "^3.5.0"
+ "react-redux": "^8.1.1",
+ "redux": "^4.2.1",
+ "redux-logger": "^3.0.6",
+ "redux-loop": "^6.2.0"
},
"devDependencies": {
- "@ant-design/pro-cli": "^2.1.0",
- "@playwright/test": "^1.17.0",
- "@types/classnames": "^2.3.1",
- "@types/express": "^4.17.0",
- "@types/history": "^4.7.0",
"@types/jest": "^26.0.0",
- "@types/lodash": "^4.14.0",
- "@types/react": "^17.0.0",
- "@types/react-dom": "^17.0.0",
- "@types/react-helmet": "^6.1.0",
- "@umijs/fabric": "^2.11.1",
- "@umijs/openapi": "^1.6.0",
- "@umijs/plugin-blocks": "^2.2.0",
- "@umijs/plugin-esbuild": "^1.4.0",
- "@umijs/plugin-openapi": "^1.3.3",
- "@umijs/preset-ant-design-pro": "^1.3.0",
- "@umijs/preset-dumi": "^1.1.0",
- "@umijs/preset-react": "^2.1.0",
- "cross-env": "^7.0.0",
+ "@types/react": "^18.2.15",
+ "@types/react-dom": "^18.2.7",
+ "@types/redux-logger": "^3.0.9",
+ "assert": "^2.0.0",
+ "autoprefixer": "^10.4.14",
"cross-port-killer": "^1.3.0",
- "detect-installer": "^1.0.0",
- "eslint": "^7.32.0",
+ "eslint": "^8.45.0",
+ "eslint-config-next": "^13.4.12",
+ "eslint-config-prettier": "^8.8.0",
"gh-pages": "^3.2.0",
- "husky": "^7.0.4",
- "jsdom-global": "^3.0.0",
- "lint-staged": "^10.0.0",
- "mockjs": "^1.1.0",
+ "husky": "^8.0.0",
+ "lint-staged": "^13.2.3",
+ "postcss": "^8.4.26",
+ "postcss-import": "^15.1.0",
"prettier": "^2.5.0",
- "stylelint": "^13.0.0",
- "swagger-ui-dist": "^4.12.0",
- "typescript": "^4.5.0",
- "umi-serve": "^1.9.10"
+ "process": "^0.11.10",
+ "tailwindcss": "^3.3.3",
+ "typescript": "^5.1.6"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">=16.0.0"
}
}
diff --git a/batcher-ui/pages/404.tsx b/batcher-ui/pages/404.tsx
new file mode 100644
index 00000000..b4a41cd5
--- /dev/null
+++ b/batcher-ui/pages/404.tsx
@@ -0,0 +1,23 @@
+import React from 'react';
+import Link from 'next/link';
+import Head from 'next/head';
+
+const NoFoundPage = () => (
+ <>
+
+ BATCHER - Not found
+
+
+
Sorry, the page you visited does not exist
+
+
+ Back Home
+
+
+ >
+);
+
+export default NoFoundPage;
diff --git a/batcher-ui/pages/_app.tsx b/batcher-ui/pages/_app.tsx
new file mode 100644
index 00000000..105260cc
--- /dev/null
+++ b/batcher-ui/pages/_app.tsx
@@ -0,0 +1,66 @@
+import React from 'react';
+import { AppProps } from 'next/app';
+import { TezosToolkitProvider } from '../src/contexts/tezos-toolkit';
+import { WalletProvider } from '../src/contexts/wallet';
+import { EventsProvider } from '../src/contexts/events';
+import '../styles/globals.css';
+import { Provider } from 'react-redux';
+import { store } from '../src/store';
+import ReactGA from 'react-ga4';
+import Head from 'next/head';
+import { config } from '@fortawesome/fontawesome-svg-core';
+import '@fortawesome/fontawesome-svg-core/styles.css';
+import Root from '../src/components/Root';
+import Toast from 'src/components/Toast';
+
+config.autoAddCss = false;
+
+process.env.NEXT_PUBLIC_GA_TRACKING_ID &&
+ ReactGA.initialize(process.env.NEXT_PUBLIC_GA_TRACKING_ID);
+
+const App = ({ Component }: AppProps) => {
+ return (
+
+
+
+
BATCHER
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default App;
diff --git a/batcher-ui/pages/_document.tsx b/batcher-ui/pages/_document.tsx
new file mode 100644
index 00000000..303f9c71
--- /dev/null
+++ b/batcher-ui/pages/_document.tsx
@@ -0,0 +1,14 @@
+import { Html, Head, Main, NextScript } from 'next/document';
+
+export default function Document() {
+ return (
+
+
+
+
+
+
+
+ );
+}
diff --git a/batcher-ui/pages/about.tsx b/batcher-ui/pages/about.tsx
new file mode 100644
index 00000000..fce5fb91
--- /dev/null
+++ b/batcher-ui/pages/about.tsx
@@ -0,0 +1,78 @@
+import React from 'react';
+import Link from 'next/link';
+
+const About = () => {
+ return (
+
+
+ WHAT IS BATCHER?
+
+
+
+ Batcher is a new type of DEX that we have named a batch clearing DEX. It
+ provides a dark pool-like trading environment without using liquidity
+ pools or having the issue of significant slippage. Batcher’s goal is to
+ enable users to deposit tokens with the aim of being swapped at a
+ fair price with
+ bounded slippage and almost no impermanent loss . This
+ means that all orders for potential swaps between two pairs of tokens
+ are collected over a finite period (currently 10 minutes). This is
+ deemed the batch. After the order collection period is over, the batch
+ is closed to additions. Batcher then waits for the next Oracle price for
+ the token pair. When this is received, the batch is terminated and then
+ Batcher looks to match the maximum amount of orders at the fairest
+ possible price.
+
+
+
TIMELINE
+
+
+ For V1, the deposit window will be 10 mins and then a wait time
+ of 2 minutes before awaiting the oracle price. Once we got oracle price,
+ the batch is cleared.
+
+
+
DISCLAIMER
+
+
+ All investing comes with risk and DeFi is no exception. The content in
+ this Dapp contains no financial advice. Please do your own thorough
+ research and note that all users funds are traded at their own risk.
+ No reimbursement will be made and Marigold will not assume
+ responsibility for any losses.
+
+
+
+
NOTE
+
+
+ Batcher can deal with token value imbalance which means that holders of{' '}
+ tzBTC
+ and holders of USDT can swap different amounts as long as there
+ is a market for the
+ trade on both sides.
+
+
+
+ Batcher has been designed to be composable with other high liquidity
+ paths in the Tezos ecosystem, specifically the Sirius DEX; thus, the two
+ pairs that are supported in V1 are tzBTC/USDT and tzBTC/EURL.
+
+
+ For more information including blog posts and faqs, please visit the
+ Batcher project page at Marigold.dev.
+
+
+ {'Batcher Project Page'}
+
+
+ );
+};
+
+export default About;
diff --git a/batcher-ui/pages/holdings.tsx b/batcher-ui/pages/holdings.tsx
new file mode 100644
index 00000000..3297ccb8
--- /dev/null
+++ b/batcher-ui/pages/holdings.tsx
@@ -0,0 +1,132 @@
+import React, { useCallback, useContext, useEffect } from 'react';
+import { TezosToolkitContext } from 'src/contexts/tezos-toolkit';
+import { useDispatch, useSelector } from 'react-redux';
+import { getHoldings, userAddressSelector } from 'src/reducers';
+import {
+ getHoldings as getHoldingsAction,
+ newError,
+ newInfo,
+} from 'src/actions';
+
+const Holdings = () => {
+ const { tezos } = useContext(TezosToolkitContext);
+ const contractAddress = process.env.NEXT_PUBLIC_BATCHER_CONTRACT_HASH;
+
+ const { open, cleared } = useSelector(getHoldings);
+ const userAddress = useSelector(userAddressSelector);
+
+ const dispatch = useDispatch();
+
+ const hasClearedHoldings = useCallback(
+ () => Object.values(cleared).some(holdings => holdings > 0),
+ [cleared]
+ );
+
+ useEffect(() => {
+ if (userAddress) {
+ dispatch(getHoldingsAction(userAddress));
+ }
+ }, [userAddress, dispatch]);
+
+ const redeem = async (): Promise => {
+ try {
+ if (!tezos || !contractAddress) {
+ throw new Error('Failed to initialize communication with contract.');
+ }
+ const contractWallet = await tezos.wallet.at(contractAddress);
+
+ let redeemTransaction = await contractWallet.methods.redeem().send();
+
+ if (redeemTransaction) {
+ //?useless
+ dispatch(newInfo('Attempting to redeem holdings...'));
+ // message.loading('Attempting to redeem holdings...', 0);
+ const confirm = await redeemTransaction.confirmation();
+ if (!confirm || !confirm.completed) {
+ dispatch(newError('Failed to redeem holdings.'));
+ } else {
+ dispatch(newInfo('Successfully redeemed holdings.'));
+ }
+ } else {
+ dispatch(newError('Failed to redeem tokens.'));
+ throw new Error('Failed to redeem tokens');
+ }
+ } catch (error) {
+ dispatch(newError('Unable to redeem holdings.'));
+ console.error('Unable to redeem holdings' + error);
+ }
+ };
+ return (
+
+
Holdings
+
Open/closed batches
+
+
+
+ {Object.keys(open).map((b, i) => (
+
+ {b}
+
+ ))}
+
+
+
+
+ {Object.values(open).map((b, i) => {
+ return (
+
+ {b}
+
+ );
+ })}
+
+
+
+
+
Cleared batches (Redeemable)
+
+
+
+
+ {Object.keys(cleared).map((b, i) => (
+
+ {b}
+
+ ))}
+
+
+
+
+ {Object.values(cleared).map((b, i) => {
+ return (
+
+ {b}
+
+ );
+ })}
+
+
+
+ <>
+ {hasClearedHoldings() && (
+
+ Redeem
+
+ )}
+ >
+
+ );
+};
+
+export default Holdings;
diff --git a/batcher-ui/pages/index.tsx b/batcher-ui/pages/index.tsx
new file mode 100644
index 00000000..d556e147
--- /dev/null
+++ b/batcher-ui/pages/index.tsx
@@ -0,0 +1,45 @@
+import React, { useEffect } from 'react';
+import Exchange from '../src/components/Exchange';
+import BatcherInfo from '../src/components/BatcherInfo';
+import PriceStrategy from '../src/components/PriceStrategy';
+
+import { useSelector, useDispatch } from 'react-redux';
+import { currentPairSelector, userAddressSelector } from '../src/reducers';
+import {
+ fetchUserBalances,
+ batcherUnsetup,
+ getPairsInfos,
+} from '../src/actions';
+
+const Swap = () => {
+ const userAddress = useSelector(userAddressSelector);
+ const tokenPair = useSelector(currentPairSelector);
+
+ const dispatch = useDispatch();
+
+ useEffect(() => {
+ dispatch(getPairsInfos(tokenPair));
+
+ return () => {
+ dispatch(batcherUnsetup());
+ };
+ }, [dispatch, tokenPair]);
+
+ useEffect(() => {
+ if (userAddress) {
+ dispatch(fetchUserBalances());
+ }
+ }, [userAddress, dispatch]);
+
+ return (
+
+ );
+};
+
+export default Swap;
diff --git a/batcher-ui/pages/volumes.tsx b/batcher-ui/pages/volumes.tsx
new file mode 100644
index 00000000..03b5cc86
--- /dev/null
+++ b/batcher-ui/pages/volumes.tsx
@@ -0,0 +1,109 @@
+import React, { useEffect } from 'react';
+import { PriceStrategy } from 'src/types';
+import { batchNumberSelector, volumesSelector } from 'src/reducers';
+import { useSelector } from 'react-redux';
+import { useDispatch } from 'react-redux';
+import { getVolumes } from 'src/actions';
+
+const Volume = () => {
+ const { sell, buy } = useSelector(volumesSelector);
+ const batchNumber = useSelector(batchNumberSelector);
+ const dispatch = useDispatch();
+
+ useEffect(() => {
+ if (batchNumber) dispatch(getVolumes());
+ }, [dispatch, batchNumber]);
+
+ const listOfBuyVolumesColumns = [
+ {
+ title: 'Buy Minus Volume',
+ key: PriceStrategy.WORSE,
+ dataIndex: 'buyMinusVolume',
+ },
+ {
+ title: 'Buy Exact Volume',
+ key: PriceStrategy.EXACT,
+ dataIndex: 'buyExactVolume',
+ },
+ {
+ title: 'Buy Plus Volume',
+ key: PriceStrategy.BETTER,
+ dataIndex: 'buyPlusVolume',
+ },
+ ];
+
+ const listOfSellVolumesColumns = [
+ {
+ title: 'Sell Minus Volume',
+ key: PriceStrategy.WORSE,
+ dataIndex: 'sellMinusVolume',
+ },
+ {
+ title: 'Sell Exact Volume',
+ key: PriceStrategy.EXACT,
+ dataIndex: 'sellExactVolume',
+ },
+ {
+ title: 'Sell Plus Volume',
+ key: PriceStrategy.BETTER,
+ dataIndex: 'sellPlusVolume',
+ },
+ ];
+ return (
+
+
Volumes
+
+
+
+ {listOfBuyVolumesColumns.map((b, i) => (
+
+ {b.title}
+
+ ))}
+
+
+
+
+ {listOfBuyVolumesColumns.map((b, i) => {
+ return (
+
+ {buy[b.key]}
+
+ );
+ })}
+
+
+
+
+ {listOfSellVolumesColumns.map((b, i) => (
+
+ {b.title}
+
+ ))}
+
+
+
+
+ {listOfSellVolumesColumns.map((b, i) => {
+ return (
+
+ {sell[b.key]}
+
+ );
+ })}
+
+
+
+
+ );
+};
+
+export default Volume;
diff --git a/batcher-ui/playwright.config.ts b/batcher-ui/playwright.config.ts
deleted file mode 100644
index ec1b31db..00000000
--- a/batcher-ui/playwright.config.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-// playwright.config.ts
-import type { PlaywrightTestConfig } from '@playwright/test';
-import { devices } from '@playwright/test';
-
-const config: PlaywrightTestConfig = {
- forbidOnly: !!process.env.CI,
- retries: process.env.CI ? 2 : 0,
- use: {
- trace: 'on-first-retry',
- },
- projects: [
- {
- name: 'chromium',
- use: { ...devices['Desktop Chrome'] },
- },
- {
- name: 'firefox',
- use: { ...devices['Desktop Firefox'] },
- },
- ],
-};
-export default config;
diff --git a/batcher-ui/postcss.config.js b/batcher-ui/postcss.config.js
new file mode 100644
index 00000000..e569373f
--- /dev/null
+++ b/batcher-ui/postcss.config.js
@@ -0,0 +1,8 @@
+module.exports = {
+ plugins: {
+ 'postcss-import': {},
+ 'tailwindcss/nesting': {},
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/batcher-ui/img/batcher-logo.png b/batcher-ui/public/batcher-logo.png
similarity index 100%
rename from batcher-ui/img/batcher-logo.png
rename to batcher-ui/public/batcher-logo.png
diff --git a/batcher-ui/public/favicon.ico b/batcher-ui/public/favicon.ico
new file mode 100644
index 00000000..4d0f39b0
Binary files /dev/null and b/batcher-ui/public/favicon.ico differ
diff --git a/batcher-ui/img/marigold-logo.png b/batcher-ui/public/marigold-logo.png
similarity index 100%
rename from batcher-ui/img/marigold-logo.png
rename to batcher-ui/public/marigold-logo.png
diff --git a/batcher-ui/public/tzBTC-icon.png b/batcher-ui/public/tzBTC-icon.png
new file mode 100644
index 00000000..5eceedd3
Binary files /dev/null and b/batcher-ui/public/tzBTC-icon.png differ
diff --git a/batcher-ui/src/access.ts b/batcher-ui/src/access.ts
deleted file mode 100644
index e823e24b..00000000
--- a/batcher-ui/src/access.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-/**
- * @see https://umijs.org/zh-CN/plugins/plugin-access
- * */
-export default function access(initialState: { currentUser?: API.CurrentUser } | undefined) {
- const { currentUser } = initialState ?? {};
- return {
- canAdmin: currentUser && currentUser.access === 'admin',
- };
-}
diff --git a/batcher-ui/src/actions/events.ts b/batcher-ui/src/actions/events.ts
new file mode 100644
index 00000000..989387fe
--- /dev/null
+++ b/batcher-ui/src/actions/events.ts
@@ -0,0 +1,30 @@
+import { BigMapEvent } from 'src/types/events';
+
+export const newEvent = (event: BigMapEvent) =>
+ ({
+ type: 'NEW_EVENT',
+ payload: { event },
+ } as const);
+
+ export const closeToast = () =>
+ ({
+ type: 'CLOSE_TOAST',
+ } as const);
+
+ export const newError = (errorContent: string) =>
+ ({
+ type: 'NEW_ERROR',
+ payload: { errorContent },
+ } as const);
+
+ export const newInfo = (infoContent: string) =>
+ ({
+ type: 'NEW_INFO',
+ payload: { infoContent },
+ } as const);
+
+ export type EventActions =
+ | ReturnType
+ | ReturnType
+ | ReturnType
+ | ReturnType;
diff --git a/batcher-ui/src/actions/exchange.ts b/batcher-ui/src/actions/exchange.ts
new file mode 100644
index 00000000..9eb7d44c
--- /dev/null
+++ b/batcher-ui/src/actions/exchange.ts
@@ -0,0 +1,135 @@
+import { BatcherStatus, CurrentSwap, PriceStrategy } from '../types';
+
+export const updatePriceStrategy = (priceStrategy: PriceStrategy) =>
+ ({
+ type: 'UDPATE_PRICE_STATEGY',
+ payload: { priceStrategy },
+ } as const);
+
+export const reverseSwap = () =>
+ ({
+ type: 'REVERSE_SWAP',
+ } as const);
+
+export const changePair = (pair: string, isReverse: boolean) =>
+ ({
+ type: 'CHANGE_PAIR',
+ payload: { pair, isReverse },
+ } as const);
+
+export const getPairsInfos = (pair: string) =>
+ ({
+ type: 'GET_PAIR_INFOS',
+ payload: { pair },
+ } as const);
+
+export const updatePairsInfos = ({
+ currentSwap,
+ pair,
+}: {
+ currentSwap: Omit;
+ pair: string;
+}) =>
+ ({
+ type: 'UPDATE_PAIR_INFOS',
+ payload: { currentSwap, pair },
+ } as const);
+
+export const getBatcherStatus = () =>
+ ({
+ type: 'GET_BATCHER_STATUS',
+ } as const);
+
+export const updateBatcherStatus = ({
+ status,
+ at,
+ startTime,
+}: {
+ status: BatcherStatus;
+ at: string;
+ startTime: string | null;
+}) =>
+ ({
+ type: 'UDPATE_BATCHER_STATUS',
+ payload: { status, at, startTime },
+ } as const);
+
+export const updateRemainingTime = () =>
+ ({
+ type: 'UPDATE_REMAINING_TIME',
+ } as const);
+
+export const getCurrentBatchNumber = () =>
+ ({
+ type: 'GET_CURRENT_BATCHER_NUMBER',
+ } as const);
+
+export const updateBatchNumber = (batchNumber: number) =>
+ ({
+ type: 'UDPATE_BATCH_NUMBER',
+ payload: { batchNumber },
+ } as const);
+
+export const batcherSetup = () =>
+ ({
+ type: 'BATCHER_SETUP',
+ } as const);
+
+export const batcherTimerId = (timerId: number) =>
+ ({
+ type: 'BATCHER_TIMER_ID',
+ payload: { timerId },
+ } as const);
+
+export const batcherUnsetup = () =>
+ ({
+ type: 'BATCHER_UNSETUP',
+ } as const);
+
+export const getOraclePrice = () =>
+ ({
+ type: 'GET_ORACLE_PRICE',
+ } as const);
+
+export const updateOraclePrice = (oraclePrice: number) =>
+ ({
+ type: 'UPDATE_ORACLE_PRICE',
+ payload: { oraclePrice },
+ } as const);
+
+export const getVolumes = () =>
+ ({
+ type: 'GET_VOLUMES',
+ } as const);
+
+export const updateVolumes = (volumes: unknown) =>
+ ({
+ type: 'UPDATE_VOLUMES',
+ payload: { volumes },
+ } as const);
+
+export const noBatchError = (errorMessage: string) =>
+ ({
+ type: 'NO_BATCH_ERROR',
+ payload: { errorMessage },
+ } as const);
+
+export type ExchangeActions =
+ | ReturnType
+ | ReturnType
+ | ReturnType
+ | ReturnType
+ | ReturnType
+ | ReturnType
+ | ReturnType
+ | ReturnType
+ | ReturnType
+ | ReturnType
+ | ReturnType
+ | ReturnType
+ | ReturnType
+ | ReturnType
+ | ReturnType
+ | ReturnType
+ | ReturnType
+ | ReturnType;
diff --git a/batcher-ui/src/actions/holdings.ts b/batcher-ui/src/actions/holdings.ts
new file mode 100644
index 00000000..b7460078
--- /dev/null
+++ b/batcher-ui/src/actions/holdings.ts
@@ -0,0 +1,23 @@
+import { HoldingsState } from 'src/types';
+
+export const redeem = () =>
+ ({
+ type: 'REDEEM',
+ } as const);
+
+export const updateHoldings = (holdings: HoldingsState) =>
+ ({
+ type: 'UPDATE_HOLDINGS',
+ payload: { holdings },
+ } as const);
+
+export const getHoldings = (userAddress: string | undefined) =>
+ ({
+ type: 'GET_HOLDINGS',
+ payload: { userAddress },
+ } as const);
+
+export type HoldingsActions =
+ | ReturnType
+ | ReturnType
+ | ReturnType;
diff --git a/batcher-ui/src/actions/index.ts b/batcher-ui/src/actions/index.ts
new file mode 100644
index 00000000..9879b241
--- /dev/null
+++ b/batcher-ui/src/actions/index.ts
@@ -0,0 +1,15 @@
+import { WalletActions } from './wallet';
+import { ExchangeActions } from './exchange';
+import { EventActions } from './events';
+import { HoldingsActions } from './holdings';
+
+export * from './wallet';
+export * from './exchange';
+export * from './events';
+export * from './holdings';
+
+export type Actions =
+ | WalletActions
+ | ExchangeActions
+ | EventActions
+ | HoldingsActions;
diff --git a/batcher-ui/src/actions/wallet.ts b/batcher-ui/src/actions/wallet.ts
new file mode 100644
index 00000000..c4aa9f95
--- /dev/null
+++ b/batcher-ui/src/actions/wallet.ts
@@ -0,0 +1,39 @@
+// import { Option } from 'fp-ts/Option';
+import { Balances } from 'src/utils/utils';
+
+const connectedWallet = ({ userAddress }: { userAddress: string }) =>
+ ({
+ type: 'CONNECTED_WALLET',
+ payload: {
+ userAddress,
+ },
+ } as const);
+
+const disconnectedWallet = () =>
+ ({
+ type: 'DISCONNECTED_WALLET',
+ } as const);
+
+const fetchUserBalances = () =>
+ ({
+ type: 'FETCH_USER_BALANCES',
+ } as const);
+
+const gotUserBalances = (balances: Balances) =>
+ ({
+ type: 'GOT_USER_BALANCES',
+ balances,
+ } as const);
+
+export {
+ connectedWallet,
+ disconnectedWallet,
+ fetchUserBalances,
+ gotUserBalances,
+};
+
+export type WalletActions =
+ | ReturnType
+ | ReturnType
+ | ReturnType
+ | ReturnType;
diff --git a/batcher-ui/src/app.tsx b/batcher-ui/src/app.tsx
deleted file mode 100644
index 1f61d3f6..00000000
--- a/batcher-ui/src/app.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import Footer from '@/components/Footer';
-import React, { useState, useEffect } from 'react';
-import RightContent from '@/components/RightContent';
-import { AccountInfo } from '@airgap/beacon-sdk';
-import { BeaconWallet } from '@taquito/beacon-wallet';
-import { PageLoading } from '@ant-design/pro-components';
-import type { RunTimeLayoutConfig } from 'umi';
-import defaultSettings from '../config/defaultSettings';
-import Main from './pages/Main';
-import { Spin, Image } from 'antd';
-import MarigoldLogo from '../img/marigold-logo.png';
-import { TezosToolkit } from '@taquito/taquito';
-import ReactGA from "react-ga4";
-Spin.setDefaultIndicator( );
-
-ReactGA.initialize(GA_TRACKING_ID);
-
-export const initialStateConfig = {
- loading: ,
-};
-
-export async function getInitialState(): Promise {
- return {
- wallet: null,
- userAddress: null,
- userAccount: null,
- settings: defaultSettings,
- };
-}
-
-export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
- return {
- rightContentRender: () => ,
- disableContentMargin: false,
- waterMarkProps: {
- content: initialState?.currentUser?.name,
- },
- footerRender: () => ,
- menuHeaderRender: undefined,
- ...initialState?.settings,
- childrenRender: () => {
- return ;
- },
- };
-};
diff --git a/batcher-ui/src/commands/events.ts b/batcher-ui/src/commands/events.ts
new file mode 100644
index 00000000..973ad1c3
--- /dev/null
+++ b/batcher-ui/src/commands/events.ts
@@ -0,0 +1,112 @@
+import { Cmd } from 'redux-loop';
+import {
+ updateBatchNumber,
+ updateVolumes,
+ updateOraclePrice,
+ updateBatcherStatus,
+} from 'src/actions';
+import { updateHoldings } from 'src/actions/holdings';
+import { userAddressSelector } from 'src/reducers';
+import { BatchBigmap, OrderBookBigmap, RatesCurrentBigmap } from 'src/types';
+import { BigMapEvent } from 'src/types/events';
+import {
+ computeAllHoldings,
+ computeOraclePrice,
+ mapStatus,
+ toVolumes,
+} from 'src/utils/utils';
+
+export const newEventCmd = (event: BigMapEvent) => {
+ return Cmd.run(
+ (dispatch, getState) => {
+ return event.data.map(async eventData => {
+ switch (eventData.action) {
+ case 'add_key': {
+ switch (eventData.path) {
+ case 'batch_set.batches': {
+ const data = eventData.content.value as BatchBigmap;
+ const status = mapStatus(data);
+ //! new batch
+ dispatch(updateBatchNumber(parseInt(data.batch_number)));
+ dispatch(updateBatcherStatus(status));
+ dispatch(
+ updateVolumes(
+ toVolumes(data.volumes, {
+ buyDecimals: parseInt(data.pair.decimals_1, 10),
+ sellDecimals: parseInt(data.pair.decimals_0, 10),
+ })
+ )
+ );
+ return Promise.resolve();
+ }
+ case 'user_batch_ordertypes': {
+ //! deposit from new address
+ const data = eventData.content.value as OrderBookBigmap;
+ const userAddress = userAddressSelector(getState());
+ //! user addresses are keys of this bigmap so we need to ensure that the key is the user address
+ if (userAddress === eventData.content.key) {
+ const holdings = await computeAllHoldings(data);
+ dispatch(updateHoldings(holdings));
+ }
+ return Promise.resolve();
+ }
+ case 'rates_current':
+ default:
+ return Promise.reject('Unknown event');
+ }
+ }
+ case 'update_key': {
+ switch (eventData.path) {
+ case 'rates_current': {
+ //! oracle price has changed
+ const data = eventData.content.value as RatesCurrentBigmap;
+ dispatch(
+ updateOraclePrice(
+ computeOraclePrice(data.rate, {
+ buyDecimals: parseInt(data.swap.to.decimals),
+ sellDecimals: parseInt(data.swap.from.token.decimals),
+ })
+ )
+ );
+ return Promise.resolve();
+ }
+ case 'batch_set.batches': {
+ //! batch status has changed
+ const data = eventData.content.value as BatchBigmap;
+ const status = mapStatus(data);
+ dispatch(updateBatcherStatus(status));
+ dispatch(
+ updateVolumes(
+ toVolumes(data.volumes, {
+ buyDecimals: parseInt(data.pair.decimals_1, 10),
+ sellDecimals: parseInt(data.pair.decimals_0, 10),
+ })
+ )
+ );
+ return Promise.resolve();
+ }
+ case 'user_batch_ordertypes': {
+ //! new deposit or redeem from an existing address
+ const data = eventData.content.value as OrderBookBigmap;
+ const userAddress = userAddressSelector(getState());
+ //! user addresses are keys of this bigmap so we need to ensure that the key is the user address
+ if (userAddress === eventData.content.key) {
+ const holdings = await computeAllHoldings(data);
+ dispatch(updateHoldings(holdings));
+ }
+ return Promise.resolve();
+ }
+ default:
+ return Promise.reject('Unknown event');
+ }
+ }
+ default:
+ return Promise.reject('Unknown event');
+ }
+ });
+ },
+ {
+ args: [Cmd.dispatch, Cmd.getState],
+ }
+ );
+};
diff --git a/batcher-ui/src/commands/exchange.ts b/batcher-ui/src/commands/exchange.ts
new file mode 100644
index 00000000..35692435
--- /dev/null
+++ b/batcher-ui/src/commands/exchange.ts
@@ -0,0 +1,113 @@
+import { Cmd } from 'redux-loop';
+import {
+ computeOraclePrice,
+ getBatcherStatus,
+ fetchCurrentBatchNumber,
+ getCurrentRates,
+ getPairsInformations,
+ getVolumes,
+ getTimeDifferenceInMs,
+} from '../utils/utils';
+import {
+ updateBatchNumber,
+ updateBatcherStatus,
+ updatePairsInfos,
+ updateOraclePrice,
+ updateVolumes,
+ batcherTimerId,
+ updateRemainingTime,
+ noBatchError,
+ newError,
+} from '../actions';
+import { BatcherStatus, CurrentSwap, SwapNames } from 'src/types';
+
+const fetchPairInfosCmd = (pair: string) =>
+ Cmd.run(
+ () => {
+ return getPairsInformations(pair);
+ },
+ {
+ successActionCreator: updatePairsInfos,
+ failActionCreator: () => newError('Fail to get pair informations.'),
+ }
+ );
+
+const fetchCurrentBatchNumberCmd = (pair: SwapNames) =>
+ Cmd.run(
+ () => {
+ return fetchCurrentBatchNumber(pair);
+ },
+ {
+ successActionCreator: updateBatchNumber,
+ failActionCreator: (e: string) => noBatchError(e),
+ }
+ );
+
+const fetchBatcherStatusCmd = (batchNumber: number) =>
+ Cmd.run(
+ () => {
+ return getBatcherStatus(batchNumber);
+ },
+ {
+ successActionCreator: updateBatcherStatus,
+ failActionCreator: () => newError('Fail to get batch status.'),
+ }
+ );
+
+const setupBatcherCmd = (startTime: string | null, status: BatcherStatus) => {
+ if (startTime && status === BatcherStatus.OPEN) {
+ return Cmd.list([
+ Cmd.setTimeout(
+ Cmd.action(
+ updateBatcherStatus({
+ status: BatcherStatus.CLOSED,
+ at: startTime,
+ startTime,
+ })
+ ),
+ getTimeDifferenceInMs(status, startTime)
+ ),
+ Cmd.setInterval(Cmd.action(updateRemainingTime()), 60000, {
+ scheduledActionCreator: timerId => batcherTimerId(timerId),
+ }),
+ ]);
+ }
+ return Cmd.none;
+};
+
+const fetchOraclePriceCmd = (tokenPair: string, { swap }: CurrentSwap) => {
+ return Cmd.run(
+ async () => {
+ const rates = await getCurrentRates(tokenPair);
+ return computeOraclePrice(rates[0].rate, {
+ buyDecimals: swap.to.decimals,
+ sellDecimals: swap.from.token.decimals,
+ });
+ },
+ {
+ successActionCreator: updateOraclePrice,
+ failActionCreator: () => newError('Fail to get oracle price.'),
+ }
+ );
+};
+
+const fetchVolumesCmd = (batchNumber: number) => {
+ return Cmd.run(
+ () => {
+ return getVolumes(batchNumber);
+ },
+ {
+ successActionCreator: updateVolumes,
+ failActionCreator: () => newError('Fail to fetch batch volumes.'),
+ }
+ );
+};
+
+export {
+ fetchPairInfosCmd,
+ fetchCurrentBatchNumberCmd,
+ fetchBatcherStatusCmd,
+ setupBatcherCmd,
+ fetchOraclePriceCmd,
+ fetchVolumesCmd,
+};
diff --git a/batcher-ui/src/commands/holdings.ts b/batcher-ui/src/commands/holdings.ts
new file mode 100644
index 00000000..ea3592c7
--- /dev/null
+++ b/batcher-ui/src/commands/holdings.ts
@@ -0,0 +1,21 @@
+import { Cmd } from 'redux-loop';
+import { getOrdersBook } from '../utils/utils';
+import { updateHoldings } from 'src/actions/holdings';
+import { newError } from 'src/actions';
+
+const fetchHoldingsCmd = (userAddress?: string) => {
+ return Cmd.run(
+ async () => {
+ if (!userAddress) return Promise.reject('Not connected !');
+ const holdings = await getOrdersBook(userAddress);
+
+ return holdings;
+ },
+ {
+ successActionCreator: updateHoldings,
+ failActionCreator: (e: string) => newError(e),
+ }
+ );
+};
+
+export { fetchHoldingsCmd };
diff --git a/batcher-ui/src/commands/wallet.ts b/batcher-ui/src/commands/wallet.ts
new file mode 100644
index 00000000..2d472426
--- /dev/null
+++ b/batcher-ui/src/commands/wallet.ts
@@ -0,0 +1,18 @@
+import { Cmd } from 'redux-loop';
+import { getBalances } from '../utils/utils';
+import { gotUserBalances } from '../actions';
+
+const fetchUserBalancesCmd = (userAddress?: string) => {
+ return Cmd.run(
+ async () => {
+ if (!userAddress) return Promise.reject('No address !');
+
+ return getBalances(userAddress);
+ },
+ {
+ successActionCreator: gotUserBalances,
+ }
+ );
+};
+
+export { fetchUserBalancesCmd };
diff --git a/batcher-ui/src/components/About/index.less b/batcher-ui/src/components/About/index.less
deleted file mode 100644
index a746b111..00000000
--- a/batcher-ui/src/components/About/index.less
+++ /dev/null
@@ -1,110 +0,0 @@
-@import '~antd/es/style/variable.less';
-
-@media (min-width: @screen-lg) {
- .batcher-header {
- .batcher-time {
- border-top: 2px solid #7B7B7E;
- border-left: 2px solid #7B7B7E;
- border-right: 2px solid #7B7B7E;
- }
-
- .batcher-balance {
- border-top: 2px solid #7B7B7E;
- border-right: 2px solid #7B7B7E;
- .batcher-balance-title {
- border-bottom: 2px solid #7B7B7E;
- padding: 10px 25px;
- }
- .batcher-balance-amount {
- padding: 10px 25px;
- }
- }
-
- .batcher-oracle {
- border-top: 2px solid #7B7B7E;
- border-right: 2px solid #7B7B7E;
-
- .ant-space {
- display: grid !important;
- }
- }
- }
-
- .batcher-content-outer {
- border: 2px solid #7B7B7E;
- }
-
- .mtb-25 {
- margin-top: 25px;
- }
-}
-
-@media (max-width: @screen-xs) {
- .batcher-header {
- .batcher-balance {
- border-top: 2px solid #7B7B7E;
- .batcher-balance-title {
- padding: 10px 25px 4px;
- }
- .batcher-balance-amount {
- padding: 4px 25px;
- }
- }
-
- .batcher-oracle {
- .ant-space {
- padding: 4px 25px 10px !important;
- display: flex !important;
- }
- }
- }
-
- .batcher-connect-wallet {
- display: none;
- }
-
- .batcher-menu {
- display: block;
- font-size: 30px;
- color: #ff4d4f !important;
- }
-
- .batcher-content-outer {
- border-top: 2px solid #7B7B7E;
- }
-
- .mtb-25 {
- margin-top: 25px;
- margin-bottom: 45px;
- }
-}
-
-.batcher-title {
- font-family: monospace;
-}
-
-.batcher-header {
- .ant-col {
- text-align: initial !important;
- .ant-space {
- display: flex;
- padding: 10px 25px;
- }
- }
-}
-
-.batcher-content {
- .batcher-price {
- display: flex;
- padding: 25px;
- gap: 20px !important;
- }
-}
-
-.ant-table-placeholder {
- display: none;
-}
-
-.ant-table-cell-row-hover {
- background-color: #1C1D22 !important;
-}
diff --git a/batcher-ui/src/components/About/index.tsx b/batcher-ui/src/components/About/index.tsx
deleted file mode 100644
index a879c267..00000000
--- a/batcher-ui/src/components/About/index.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import React, { useEffect, useState } from 'react';
-import { Button, Space, Typography, Col, Row, Table, Anchor } from 'antd';
-import '@/global.less';
-const { Text, Paragraph } = Typography;
-const { Link } = Anchor;
-const About: React.FC = () => {
- return (
-
-
-
- Batcher is a new type of DEX that we have named a 'batch clearing DEX'. It provides a dark
- pool-like trading environment without using liquidity pools or having the issue of
- significant slippage. Batcher’s goal is to enable users to deposit tokens with the aim of
- being swapped at a fair price with{' '}
- bounded slippage and almost no impermanent loss .
- This means that all orders for potential swaps between two pairs of tokens are collected
- over a finite period (currently 10 minutes). This is deemed the 'batch'. After the order
- collection period is over, the batch is closed to additions. Batcher then waits for the
- next Oracle price for the token pair. When this is received, the batch is terminated and
- then Batcher looks to match the maximum amount of orders at the fairest possible price.
-
-
- For V1, the deposit window will be 10 mins and then a wait time of 2
- minutes before awaiting the oracle price.
-
-
- Note: Batcher can deal with token value imbalance which means that holders of{' '}
- tzBTC and holders of USDT can swap different
- amounts as long as there is a market for the trade on both sides.
-
-
- Batcher has been designed to be composable with other high liquidity paths in the Tezos
- ecosystem, specifically the Sirius DEX; thus, the two pairs that are supported in V1 are
- tzBTC/USDT and tzBTC/EURL.
-
-
- For more information including blog posts and faqs, please visit the Batcher project page
- at Marigold.dev.
-
-
-
- *DISCLAIMER:*
-
- {' '}
- All investing comes with risk and DeFi is no exception. The content in this Dapp
- contains no financial advice. Please do your own thorough research and note that all
- users funds are traded at their own risk. No reimbursement will be made and Marigold
- will not assume responsibility for any losses.{' '}
-
-
-
-
- );
-};
-
-export default About;
diff --git a/batcher-ui/src/components/BatcherAction/index.less b/batcher-ui/src/components/BatcherAction/index.less
deleted file mode 100644
index 410b8d5f..00000000
--- a/batcher-ui/src/components/BatcherAction/index.less
+++ /dev/null
@@ -1,53 +0,0 @@
-@import '~antd/es/style/variable.less';
-
-.batcher-nav-btn {
- color: #FFF;
- background-color: #1C1D22;
- border: 2px solid #ff4d4f !important;
- text-align: center;
- width: "5%";
-}
-
-.batcher-nav-btn:active,
-.batcher-nav-btn:focus,
-.batcher-nav-btn:hover {
- color: #1C1D22;
- background-color: #ff4d4f;
- border: 2px solid #7B7B7E !important;
-}
-.ant-radio-button-checked {
- color: #1C1D22;
- background-color: #ff4d4f;
-
-}
-
-
-
-@media (min-width: @screen-lg) {
- .batcher-action-outer {
- border-top: 2px solid #7B7B7E;
- border-left: 2px solid #7B7B7E;
- border-right: 2px solid #7B7B7E;
-
- padding: 25px;
- }
-}
-
-.batcher-action-items {
- display: flex;
- .ant-space {
- margin: auto;
- gap: 16px !important;
- }
-}
-
-@media (max-width: @screen-xs) {
- .batcher-action-outer {
- border-top: 2px solid #7B7B7E;
-
- .ant-space {
- gap: 6px !important;
- padding: 25px 0px;
- }
- }
-}
diff --git a/batcher-ui/src/components/BatcherAction/index.tsx b/batcher-ui/src/components/BatcherAction/index.tsx
deleted file mode 100644
index f3e770f7..00000000
--- a/batcher-ui/src/components/BatcherAction/index.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import React, { useEffect, useState } from 'react';
-import '@/components/BatcherAction/index.less';
-import '@/global.less';
-import type { RadioChangeEvent } from 'antd';
-import { Button, Col, Space, Row, Typography, Drawer, Radio } from 'antd';
-import { BatcherActionProps, ContentType } from '@/extra_utils/types';
-
-const { Text } = Typography;
-
-const BatcherAction: React.FC = ({
- content,
- setContent,
-}: BatcherActionProps) => {
- return (
-
-
-
-
-
-
-
-
- setContent(ContentType.SWAP)}>
- Swap
-
- setContent(ContentType.VOLUME)}>
- Volume
-
- setContent(ContentType.REDEEM_HOLDING)}
- >
- Redeem Holdings
-
- setContent(ContentType.ABOUT)}>
- About
-
-
-
-
-
-
-
-
-
- );
-};
-
-export default BatcherAction;
diff --git a/batcher-ui/src/components/BatcherInfo.tsx b/batcher-ui/src/components/BatcherInfo.tsx
new file mode 100644
index 00000000..2adc7770
--- /dev/null
+++ b/batcher-ui/src/components/BatcherInfo.tsx
@@ -0,0 +1,58 @@
+import React from 'react';
+import BatcherStepper from './BatcherStepper';
+import { useSelector } from 'react-redux';
+import {
+ batchNumberSelector,
+ batcherStatusSelector,
+ currentPairSelector,
+ oraclePriceSelector,
+ remainingTimeSelector,
+} from '../reducers';
+import { BatcherStatus } from '../types';
+
+const BatcherInfo = () => {
+ const tokenPair = useSelector(currentPairSelector);
+ const batchNumber = useSelector(batchNumberSelector);
+
+ const status = useSelector(batcherStatusSelector);
+ const remainingTime = useSelector(remainingTimeSelector);
+ const oraclePrice = useSelector(oraclePriceSelector);
+
+ return (
+
+
+
Batcher Status
+ {status === BatcherStatus.NONE ? (
+
No open Batch
+ ) : (
+
+ )}
+ {status === BatcherStatus.OPEN ? (
+
+
{`Remaining time: ${remainingTime} min`}
+
+ ) : (
+
+ )}
+ {batchNumber > 0 ? (
+
+
+ {`${
+ status === BatcherStatus.CLEARED
+ ? 'Last batch: '
+ : 'Current batch: '
+ } ${batchNumber}`}
+
+
+ ) : (
+
+ )}
+
+
{`Oracle Price: ${oraclePrice} ${tokenPair}`}
+
+
+
+ );
+};
+
+export default BatcherInfo;
diff --git a/batcher-ui/src/components/BatcherInfo/index.less b/batcher-ui/src/components/BatcherInfo/index.less
deleted file mode 100644
index 48dcba23..00000000
--- a/batcher-ui/src/components/BatcherInfo/index.less
+++ /dev/null
@@ -1,106 +0,0 @@
-@import '~antd/es/style/variable.less';
-
-@media (min-width: @screen-lg) {
- .batcher-header {
- .batcher-time {
- border-top: 2px solid #7B7B7E;
- border-left: 2px solid #7B7B7E;
- border-right: 2px solid #7B7B7E;
- }
-
- .batcher-balance {
- border-top: 2px solid #7B7B7E;
- border-right: 2px solid #7B7B7E;
- .batcher-balance-title {
- border-bottom: 2px solid #7B7B7E;
- padding: 10px 25px;
- }
- .batcher-balance-amount {
- padding: 10px 25px;
- }
- }
-
- .batcher-oracle {
- border-top: 2px solid #7B7B7E;
- border-right: 2px solid #7B7B7E;
-
- .ant-space {
- display: grid !important;
- }
- }
-
- .batcher-price {
- border-top: 2px solid #7B7B7E;
- padding: 10px 25px;
- }
- }
-
- .batcher-content-outer {
- border: 2px solid #7B7B7E;
- }
-
- .mtb-25 {
- margin-top: 25px;
- }
-}
-
-@media (max-width: @screen-xs) {
- .batcher-header {
- .batcher-balance {
- border-top: 2px solid #7B7B7E;
- .batcher-balance-title {
- padding: 10px 25px 4px;
- }
- .batcher-balance-amount {
- padding: 4px 25px;
- }
- }
-
- .batcher-oracle {
- .ant-space {
- padding: 4px 25px 10px !important;
- display: flex !important;
- }
- }
-
- .batcher-price {
- .ant-space {
- padding: 4px 25px 10px !important;
- display: flex !important;
- }
- }
- }
-
- .batcher-connect-wallet {
- display: none;
- }
-
- .batcher-menu {
- display: block;
- font-size: 30px;
- color: #ff4d4f !important;
- }
-
- .batcher-content-outer {
- border-top: 2px solid #7B7B7E;
- }
-
- .mtb-25 {
- margin-top: 25px;
- margin-bottom: 45px;
- }
-}
-
-.batcher-title {
- font-family: monospace;
-}
-
-.batcher-header {
- .ant-col {
- text-align: initial !important;
- .ant-space {
- display: flex;
- padding: 10px 25px;
- }
- }
-}
\ No newline at end of file
diff --git a/batcher-ui/src/components/BatcherInfo/index.tsx b/batcher-ui/src/components/BatcherInfo/index.tsx
deleted file mode 100644
index a1d7e5f6..00000000
--- a/batcher-ui/src/components/BatcherInfo/index.tsx
+++ /dev/null
@@ -1,135 +0,0 @@
-import React, { useEffect, useState } from 'react';
-import { Space, Typography, Col, Row } from 'antd';
-import { useModel } from 'umi';
-import '@/components/BatcherInfo/index.less';
-import '@/global.less';
-import { BatcherInfoProps, BatcherStatus } from '@/extra_utils/types';
-import BatcherStepper from '../BatcherStepper';
-import { parseISO, add, differenceInMinutes } from 'date-fns';
-
-const { Text } = Typography;
-
-const BatcherInfo: React.FC = ({
- userAddress,
- tokenPair,
- buyBalance,
- sellBalance,
- buyTokenName,
- sellTokenName,
- inversion,
- rate,
- status,
- openTime,
- updateAll,
- setUpdateAll,
- batchNumber,
-}: BatcherInfoProps) => {
- const { initialState } = useModel('@@initialState');
-
- const triggerUpdate = () => {
- if (status === BatcherStatus.OPEN && openTime) {
- setTimeout(function () {
- const u = !updateAll;
- setUpdateAll(u);
- }, 600000);
- }
- };
-
- useEffect(() => {
- triggerUpdate();
- }, [status]);
-
-const get_batch_prefix = () => {
-
- if(status == BatcherStatus.CLEARED){
- return "Last Batch ";
- }
- return "Current Batch ";
-
-};
-
- const get_time_difference = () => {
- if (status === BatcherStatus.OPEN && openTime) {
- const now = new Date();
- const open = parseISO(openTime);
- const batcherClose = add(open, { minutes: 10 });
- const diff = differenceInMinutes(batcherClose, now);
- if (diff < 0) {
- return 0;
- } else {
- return diff;
- }
- }
- return 0;
- };
-
- return (
-
-
-
-
-
-
- Batcher Time Remaining
- {status === BatcherStatus.NONE ? (
- No open Batch
- ) : (
-
- )}
-
- {status === BatcherStatus.OPEN ? (
-
- {get_time_difference() + ' min'}
-
- ) : (
-
- )}
- { (batchNumber > 0) ? (
-
- { get_batch_prefix() + '#' + batchNumber }
-
- ) : (
-
- )}
-
-
-
-
-
- Balances
-
- {inversion ? buyBalance + ' ' + buyTokenName : sellBalance + ' ' + sellTokenName}
-
-
- {inversion ? sellBalance + ' ' + sellTokenName : buyBalance + ' ' + buyTokenName}
-
-
-
-
-
- Address
- {userAddress ? (
-
- {userAddress}
-
- ) : (
- No Wallet connected
- )}
-
-
-
-
- Oracle Price
-
- {rate} {tokenPair}
-
-
-
-
-
-
-
- );
-};
-
-export default BatcherInfo;
diff --git a/batcher-ui/src/components/BatcherStepper.tsx b/batcher-ui/src/components/BatcherStepper.tsx
new file mode 100644
index 00000000..2fd60603
--- /dev/null
+++ b/batcher-ui/src/components/BatcherStepper.tsx
@@ -0,0 +1,61 @@
+import React from 'react';
+import { useSelector } from 'react-redux';
+import { batcherStatusSelector } from '../reducers';
+import { BatcherStatus } from '../types';
+
+const Square = ({ isActive }: { isActive: boolean }) => (
+
+);
+
+const Dot = ({ isActive }: { isActive: boolean }) => (
+
+ -
+
+);
+
+const BatcherStepper = () => {
+ const status = useSelector(batcherStatusSelector);
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default BatcherStepper;
diff --git a/batcher-ui/src/components/BatcherStepper/index.less b/batcher-ui/src/components/BatcherStepper/index.less
deleted file mode 100644
index e4ef1006..00000000
--- a/batcher-ui/src/components/BatcherStepper/index.less
+++ /dev/null
@@ -1,31 +0,0 @@
-.gray-color {
- background-color: #CECCCC;
- color: #CECCCC;
-}
-
-.gray-dot {
- .batcher-dot {
- font-size: 25px;
- color: #CECCCC;
- }
-}
-
-.green-color {
- background-color: #6FE17A;
- color: #6FE17A;
-}
-
-.green-dot {
- .batcher-dot {
- font-size: 25px;
- color: #6FE17A;
- }
-}
-
-.text-none {
- color: #1C1D22;
-}
-
-.batcher-stepper-gap {
- gap: 40px !important;
-}
\ No newline at end of file
diff --git a/batcher-ui/src/components/BatcherStepper/index.tsx b/batcher-ui/src/components/BatcherStepper/index.tsx
deleted file mode 100644
index 583dbdaa..00000000
--- a/batcher-ui/src/components/BatcherStepper/index.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import React, { useEffect, useState } from 'react';
-import { Space, Typography } from 'antd';
-import '@/components/BatcherStepper/index.less';
-import { BatcherStatus, BatcherStepperProps } from '@/extra_utils/types';
-
-const BatcherStepper: React.FC = ({ status }: BatcherStepperProps) => {
- return (
-
-
-
- null
-
- -
- -
- -
-
-
-
-
- null
-
-
- -
- -
- -
-
-
-
-
- null
-
-
-
-
- Started
- Closed
- Cleared
-
-
- );
-};
-
-export default BatcherStepper;
diff --git a/batcher-ui/src/components/Copy.tsx b/batcher-ui/src/components/Copy.tsx
new file mode 100644
index 00000000..d7454300
--- /dev/null
+++ b/batcher-ui/src/components/Copy.tsx
@@ -0,0 +1,47 @@
+import { ReactNode, useEffect, useState } from 'react';
+import Tooltip from './Tooltip';
+
+export type copyProps = {
+ children: ReactNode;
+ value: string;
+ disabled?: boolean;
+ text?: string;
+};
+
+const Copy = ({ children, value, disabled = false, text }: copyProps) => {
+ const [isCopying, setIsCopying] = useState(false);
+
+ useEffect(() => {
+ if (!isCopying) return;
+
+ setTimeout(() => {
+ setIsCopying(false);
+ }, 1500);
+ });
+
+ return (
+
+ {
+ if (disabled) return;
+
+ setIsCopying(true);
+
+ try {
+ await navigator.clipboard.writeText(value);
+ } catch (err) {
+ console.error('Failed to copy: ', err);
+ }
+ }}
+ data-name="copy">
+ {children}
+
+
+ );
+};
+
+export default Copy;
diff --git a/batcher-ui/src/components/Exchange.tsx b/batcher-ui/src/components/Exchange.tsx
new file mode 100644
index 00000000..6b762aa2
--- /dev/null
+++ b/batcher-ui/src/components/Exchange.tsx
@@ -0,0 +1,395 @@
+import React, { useState } from 'react';
+import { compose, OpKind, WalletContract } from '@taquito/taquito';
+import { getFees, scaleAmountUp } from '../utils/utils';
+import { tzip12 } from '@taquito/tzip12';
+import { tzip16 } from '@taquito/tzip16';
+import { BatchWalletOperation } from '@taquito/taquito/dist/types/wallet/batch-operation';
+import { useTezosToolkit } from '../contexts/tezos-toolkit';
+import { useSelector } from 'react-redux';
+import {
+ batcherStatusSelector,
+ currentSwapSelector,
+ priceStrategySelector,
+ userAddressSelector,
+ userBalancesSelector,
+} from '../reducers';
+import { BatcherStatus, PriceStrategy } from '../types';
+import { useDispatch } from 'react-redux';
+import { fetchUserBalances, newError, newInfo, reverseSwap } from '../actions';
+import * as Form from '@radix-ui/react-form';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { faArrowRightArrowLeft } from '@fortawesome/free-solid-svg-icons';
+import SelectPair from './SelectPair';
+
+const Exchange = () => {
+ const userAddress = useSelector(userAddressSelector);
+ const batcherStatus = useSelector(batcherStatusSelector);
+ const priceStategy = useSelector(priceStrategySelector);
+ const currentSwap = useSelector(currentSwapSelector);
+ const userBalances = useSelector(userBalancesSelector);
+
+ const { tezos } = useTezosToolkit();
+
+ const { isReverse, swap } = currentSwap;
+
+ const dispatch = useDispatch();
+
+ const [amountInput, setAmount] = useState('0');
+ const [animate, setAnimate] = useState(false);
+
+ if (!tezos)
+ return (
+
+
+ {
+ "There is an error with Tezos Tool Kit, can't swap ! Please contact \
+ Marigold if problem persists."
+ }
+
+
+ );
+
+ const toTolerance = (isReverse: boolean, priceStategy: PriceStrategy) => {
+ switch (priceStategy) {
+ case PriceStrategy.EXACT:
+ return 1;
+ case PriceStrategy.BETTER:
+ return 2;
+ case PriceStrategy.WORSE:
+ return 0;
+ }
+ };
+
+ const depositToken = async () => {
+ const amount = parseFloat(amountInput);
+ if (!userAddress) {
+ dispatch(newError('Not connected.'));
+ return;
+ }
+
+ const batcherContractHash = process.env.NEXT_PUBLIC_BATCHER_CONTRACT_HASH;
+ if (!batcherContractHash) {
+ dispatch(
+ newError('Batcher contract not found, please contact Marigold.')
+ );
+ return;
+ }
+
+ const tokenName = isReverse ? swap.to.name : swap.from.token.name;
+
+ const selectedToken = isReverse ? swap.to : swap.from.token;
+
+ const batcherContract = await tezos.wallet.at(batcherContractHash);
+
+ if (!selectedToken.address) {
+ dispatch(newError('Token contract not found, please contact Marigold.'));
+ return;
+ }
+
+ const fees = await getFees();
+
+ const tokenContract: WalletContract = await tezos.wallet.at(
+ selectedToken.address,
+ compose(tzip12, tzip16)
+ );
+ const tokenId = isReverse ? swap.to.tokenId : swap.from.token.tokenId;
+
+ const scaled_amount = isReverse
+ ? scaleAmountUp(amount, swap.to.decimals)
+ : scaleAmountUp(amount, swap.from.token.decimals);
+
+ const tolerance = toTolerance(isReverse, priceStategy);
+
+ // This is for fa2 token standard. I.e, USDT token
+ const fa2_add_operator_params = [
+ {
+ add_operator: {
+ owner: userAddress,
+ operator: batcherContractHash,
+ token_id: tokenId,
+ },
+ },
+ ];
+
+ const fa2_remove_operator_params = [
+ {
+ remove_operator: {
+ owner: userAddress,
+ operator: batcherContractHash,
+ token_id: tokenId,
+ },
+ },
+ ];
+
+ try {
+ let order_batcher_op: BatchWalletOperation | undefined = undefined;
+ const swap_params = {
+ swap: isReverse
+ ? {
+ from: {
+ token: {
+ ...currentSwap.swap.to,
+ },
+ amount: scaleAmountUp(amount, currentSwap.swap.to.decimals),
+ },
+ to: {
+ ...currentSwap.swap.from.token,
+ },
+ }
+ : {
+ from: {
+ token: { ...currentSwap.swap.from.token },
+ amount: scaleAmountUp(
+ amount,
+ currentSwap.swap.from.token.decimals
+ ),
+ },
+ to: {
+ ...currentSwap.swap.to,
+ },
+ },
+ created_at: new Date(),
+ //! side is reverse in relation to contract.
+ //! UI : from = sell / to = buy | contract : from = buy (0) / to = sell (1)
+ side: isReverse ? 1 : 0,
+ tolerance,
+ };
+
+ if (selectedToken.standard === 'FA1.2 token') {
+ if (!swap.from.token.address) {
+ dispatch(
+ newError(
+ `Can\t retrieve token contract address for ${swap.from.token.name}`
+ )
+ );
+ return;
+ }
+ const tokenfa12Contract = await tezos?.wallet.at(
+ swap.from.token.address,
+ compose(tzip12, tzip16)
+ );
+
+ order_batcher_op = await tezos.wallet
+ .batch([
+ {
+ kind: OpKind.TRANSACTION,
+ ...tokenfa12Contract.methods
+ .approve(batcherContractHash, scaled_amount)
+ .toTransferParams(),
+ },
+ {
+ kind: OpKind.TRANSACTION,
+ ...batcherContract.methodsObject
+ .deposit(swap_params)
+ .toTransferParams(),
+ to: batcherContractHash,
+ amount: fees,
+ mutez: true,
+ },
+ ])
+ .send();
+ }
+
+ if (selectedToken.standard === 'FA2 token') {
+ order_batcher_op = await tezos?.wallet
+ .batch([
+ {
+ kind: OpKind.TRANSACTION,
+ ...tokenContract.methods
+ .update_operators(fa2_add_operator_params)
+ .toTransferParams(),
+ },
+ {
+ kind: OpKind.TRANSACTION,
+ ...batcherContract.methodsObject
+ .deposit(swap_params)
+ .toTransferParams(),
+ to: batcherContractHash,
+ amount: fees,
+ mutez: true,
+ },
+ {
+ kind: OpKind.TRANSACTION,
+ ...tokenContract.methods
+ .update_operators(fa2_remove_operator_params)
+ .toTransferParams(),
+ },
+ ])
+ .send();
+ }
+
+ if (!order_batcher_op) {
+ dispatch(newError('Failed to define order Batcher operation.'));
+ throw new Error('Order Batcher Operation is not defined...');
+ }
+ dispatch(newInfo('Attempt to deposit the order...'));
+ const confirm = await order_batcher_op?.confirmation();
+
+ if (!confirm || !confirm.completed) {
+ console.error(confirm);
+ dispatch(
+ newError(
+ `Deposit failed for token ${
+ isReverse ? swap.to.name : swap.from.token.name
+ }`
+ )
+ );
+ throw new Error(
+ `Failed to deposit ${
+ isReverse ? swap.to.name : swap.from.token.name
+ } token.`
+ );
+ } else {
+ dispatch(newInfo(`Successfully deposited ${tokenName}`));
+
+ dispatch(fetchUserBalances());
+ setAmount('0');
+ }
+ } catch (error: any) {
+ console.error(error);
+ if (error?.title === 'Aborted') {
+ // Action aborted by user
+ dispatch(newError(error.description));
+ } else {
+ dispatch(
+ newError('Unknown deposit error, please retry or contact Marigold')
+ );
+ }
+ }
+ };
+
+ return (
+
+
+
{
+ event.preventDefault();
+ depositToken();
+ }}>
+
+
+
+ {`From ${
+ isReverse
+ ? currentSwap.swap.to.name
+ : currentSwap.swap.from.token.name
+ }`}
+
+ {`Balance : ${
+ isReverse
+ ? userBalances[currentSwap.swap.to.name.toUpperCase()] ||
+ 0
+ : userBalances[
+ currentSwap.swap.from.token.name.toUpperCase()
+ ] || 0
+ }`}
+
+
+
+
+
+
+ {
+ (/^\d*\.{0,1}\d*$/.test(event.target.value) ||
+ event.target.value === '') &&
+ setAmount(event.target.value);
+ }}
+ type="text"
+ value={amountInput}
+ defaultValue={0}
+ />
+
+
+
+ Please input your amount
+
+
+ Invalid input.
+
+ {
+ return (
+ (isReverse &&
+ Number.parseFloat(value) >
+ userBalances[swap.to.name.toUpperCase()]) ||
+ (!isReverse &&
+ Number.parseFloat(value) >
+ userBalances[swap.from.token.name.toUpperCase()])
+ );
+ }}>
+ Greater than the balance.
+
+
+
+ {
+ setAnimate(true);
+ dispatch(reverseSwap());
+ }}
+ onAnimationEnd={() => setAnimate(false)}>
+
+
+
+
+
+
+ {`To ${
+ isReverse
+ ? currentSwap.swap.from.token.name
+ : currentSwap.swap.to.name
+ }`}
+
+ {`Balance : ${
+ isReverse
+ ? userBalances[
+ currentSwap.swap.from.token.name.toUpperCase()
+ ] || 0
+ : userBalances[currentSwap.swap.to.name.toUpperCase()] ||
+ 0
+ }`}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Swap
+
+
+
+
+
+ );
+};
+
+export default Exchange;
diff --git a/batcher-ui/src/components/Exchange/customicons.ts b/batcher-ui/src/components/Exchange/customicons.ts
deleted file mode 100644
index e69de29b..00000000
diff --git a/batcher-ui/src/components/Exchange/index.less b/batcher-ui/src/components/Exchange/index.less
deleted file mode 100644
index aa4f7110..00000000
--- a/batcher-ui/src/components/Exchange/index.less
+++ /dev/null
@@ -1,160 +0,0 @@
-@import '~antd/es/style/variable.less';
-
-@media (min-width: @screen-lg) {
-
-.batcher-nav-btn {
- color: #FFF;
- background-color: #1C1D22;
- border: 2px solid #ff4d4f !important;
- text-align: center;
- display: inline-block;
-}
-
-.batcher-nav-btn:active,
-.batcher-nav-btn:focus,
-.batcher-nav-btn:hover {
- color: #1C1D22;
- background-color: #ff4d4f;
- border: 2px solid #7B7B7E !important;
-}
-.ant-radio-button-checked {
- color: #1C1D22;
- background-color: #ff4d4f;
-
-}
-
-
-.ant-drawer-header {
- background-color: #1C1D22;
-}
-.ant-drawer-title {
- color: #ff4d4f;
-}
-.ant-drawer-body {
- background-color: #1C1D22;
- color: #fff;
- height: calc(100vh - 45px);
-}
- .batcher-header {
- .batcher-time {
- border-top: 2px solid #7B7B7E;
- border-left: 2px solid #7B7B7E;
- border-right: 2px solid #7B7B7E;
- }
-
- .batcher-balance {
- border-top: 2px solid #7B7B7E;
- border-right: 2px solid #7B7B7E;
- .batcher-balance-title {
- border-bottom: 2px solid #7B7B7E;
- padding: 10px 25px;
- }
- .batcher-balance-amount {
- padding: 10px 25px;
- }
- }
-
- .batcher-oracle {
- border-top: 2px solid #7B7B7E;
- border-right: 2px solid #7B7B7E;
-
- .ant-space {
- display: grid !important;
- }
- }
- }
-
- .batcher-content-outer {
- border: 2px solid #7B7B7E;
- }
-
- .mtb-25 {
- margin-top: 25px;
- }
-}
-
-@media (max-width: @screen-xs) {
- .batcher-header {
- .batcher-balance {
- border-top: 2px solid #7B7B7E;
- .batcher-balance-title {
- padding: 10px 25px 4px;
- }
- .batcher-balance-amount {
- padding: 4px 25px;
- }
- }
-
- .batcher-oracle {
- .ant-space {
- padding: 4px 25px 10px !important;
- display: flex !important;
- }
- }
- }
-
- .batcher-connect-wallet {
- display: none;
- }
-
- .batcher-menu {
- display: block;
- font-size: 30px;
- color: #ff4d4f !important;
- }
-
- .batcher-content-outer {
- border-top: 2px solid #7B7B7E;
- }
-
- .mtb-25 {
- margin-top: 25px;
- margin-bottom: 45px;
- }
-}
-
-.batcher-title {
- font-family: monospace;
-}
-
-.batcher-header {
- .ant-col {
- text-align: initial !important;
- .ant-space {
- display: flex;
- padding: 10px 25px;
- }
- }
-}
-
-.batcher-content {
- .batcher-price {
- display: flex;
- padding: 25px;
- gap: 20px !important;
- }
-}
-
-.exchange-button {
- display: block !important;
- font-size: 35px !important;
- color: #ff4d4f !important;
-}
-
-.batcher-amount {
- .ant-form-item-required::before {
- display: none !important;
- }
- .ant-form-item-required::after {
- content: '';
- }
-}
-
-.ant-input.ant-input-status-error.batcher-token {
- background-color: #7B7B7E !important;
-}
-
-.ant-input.ant-input-disabled.batcher-token {
- background-color: #7B7B7E !important;
-}
-
diff --git a/batcher-ui/src/components/Exchange/index.tsx b/batcher-ui/src/components/Exchange/index.tsx
deleted file mode 100644
index 821cacf9..00000000
--- a/batcher-ui/src/components/Exchange/index.tsx
+++ /dev/null
@@ -1,351 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { SwapOutlined, SettingOutlined, RetweetOutlined, DollarOutlined } from '@ant-design/icons';
-import { Input, Button, Space, Typography, Col, Row, message, Form, Drawer, Radio } from 'antd';
-import { compose, OpKind, WalletContract } from '@taquito/taquito';
-import { useModel } from 'umi';
-import '@/components/Exchange/index.less';
-import '@/global.less';
-import { ExchangeProps, PriceType, BatcherStatus } from '@/extra_utils/types';
-// import { ReactComponent as ExchangeDollarSvg } from '../../../img/exchange-dollar.svg';
-import { getErrorMess, scaleAmountUp } from '@/extra_utils/utils';
-import { tzip12, Tzip12Module } from '@taquito/tzip12';
-import { tzip16 } from '@taquito/tzip16';
-const Exchange: React.FC = ({
- userAddress,
- buyBalance,
- sellBalance,
- inversion,
- setInversion,
- tezos,
- fee_in_mutez,
- buyToken,
- sellToken,
- showDrawer,
- updateAll,
- setUpdateAll,
- status,
-}: ExchangeProps) => {
- const [price, setPrice] = useState(PriceType.EXACT);
- const [side, setSide] = useState(0);
- const [amount, setAmount] = useState(0);
- const { initialState } = useModel('@@initialState');
- const [batchClosed, setBatchClosed] = useState(false);
-
- const [form] = Form.useForm();
-
- const triggerUpdate = () => {
- setTimeout(function () {
- const u = !updateAll;
- setUpdateAll(u);
- }, 5000);
- };
-
- const inverseTokenType = () => {
- setInversion(!inversion);
- const s = inversion ? 0 : 1;
- setSide(s);
- };
-
- const depositToken = async () => {
- if (!userAddress) {
- return;
- }
-
- tezos.setWalletProvider(initialState.wallet);
-
- console.info('tezos', initialState.tezos);
- const tokenName = inversion ? buyToken.name : sellToken.name;
- const selectedToken = inversion ? buyToken : sellToken;
- const batcherContract = await tezos.wallet.at(REACT_APP_BATCHER_CONTRACT_HASH);
- const tokenContract: WalletContract = await tezos.wallet.at(
- inversion ? buyToken.address : sellToken.address,
- compose(tzip12, tzip16),
- );
- const tokenId = inversion ? buyToken.token_id : sellToken.token_id;
-
- const scaled_amount = inversion
- ? scaleAmountUp(amount, buyToken.decimals)
- : scaleAmountUp(amount, sellToken.decimals);
-
- const selected_side = inversion ? 0 : 1;
- let tolerance = 0;
-
- if (selected_side == 0) {
- if (price === PriceType.WORSE) {
- tolerance = 0;
- } else if (price === PriceType.EXACT) {
- tolerance = 1;
- } else {
- tolerance = 2;
- }
- } else {
- if (price === PriceType.WORSE) {
- tolerance = 2;
- } else if (price === PriceType.EXACT) {
- tolerance = 1;
- } else {
- tolerance = 0;
- }
- }
-
- // This is for fa2 token standard. I.e, USDT token
- const fa2_add_operator_params = [
- {
- add_operator: {
- owner: userAddress,
- operator: REACT_APP_BATCHER_CONTRACT_HASH,
- token_id: tokenId,
- },
- },
- ];
-
- const fa2_remove_operator_params = [
- {
- remove_operator: {
- owner: userAddress,
- operator: REACT_APP_BATCHER_CONTRACT_HASH,
- token_id: tokenId,
- },
- },
- ];
-
- let loading = function () {
- return undefined;
- };
-
- try {
- let order_batcher_op = null;
-
- console.log('operations-token', selectedToken);
- console.log('operations-side', side);
- console.log('operations-fee-in-mutez', fee_in_mutez);
- console.log('operations-scaled-amount', fee_in_mutez);
-
- const swap_params = {
- swap: {
- from: {
- token: {
- token_id: inversion ? buyToken.token_id : sellToken.token_id,
- name: inversion ? buyToken.name : sellToken.name,
- address: inversion ? buyToken.address : sellToken.address,
- decimals: inversion ? buyToken.decimals : sellToken.decimals,
- standard: inversion ? buyToken.standard : sellToken.standard,
- },
- amount: scaled_amount,
- },
- to: {
- token_id: inversion ? sellToken.token_id : buyToken.token_id,
- name: inversion ? sellToken.name : buyToken.name,
- address: inversion ? sellToken.address : buyToken.address,
- decimals: inversion ? sellToken.decimals : buyToken.decimals,
- standard: inversion ? sellToken.standard : buyToken.standard,
- },
- },
- created_at: new Date(),
- side: selected_side,
- tolerance: tolerance,
- };
-
- console.log('test');
-
- if (selectedToken.standard === 'FA1.2 token') {
- console.log('inversion', inversion);
- console.log('buy', buyToken);
- console.log('sell', sellToken);
- const tokenfa12Contract: WalletContract = await tezos.wallet.at(
- buyToken.address,
- compose(tzip12, tzip16),
- );
- console.log('methods', tokenfa12Contract.methods);
- order_batcher_op = await tezos.wallet
- .batch([
- {
- kind: OpKind.TRANSACTION,
- ...tokenfa12Contract.methods
- .approve(REACT_APP_BATCHER_CONTRACT_HASH, scaled_amount)
- .toTransferParams(),
- },
- {
- kind: OpKind.TRANSACTION,
- ...batcherContract.methodsObject.deposit(swap_params).toTransferParams(),
- to: REACT_APP_BATCHER_CONTRACT_HASH,
- amount: fee_in_mutez,
- mutez: true,
- },
- ])
- .send();
- }
-
- if (selectedToken.standard === 'FA2 token') {
- order_batcher_op = await tezos.wallet
- .batch([
- {
- kind: OpKind.TRANSACTION,
- ...tokenContract.methods.update_operators(fa2_add_operator_params).toTransferParams(),
- },
- {
- kind: OpKind.TRANSACTION,
- ...batcherContract.methodsObject.deposit(swap_params).toTransferParams(),
- to: REACT_APP_BATCHER_CONTRACT_HASH,
- amount: fee_in_mutez,
- mutez: true,
- },
- {
- kind: OpKind.TRANSACTION,
- ...tokenContract.methods
- .update_operators(fa2_remove_operator_params)
- .toTransferParams(),
- },
- ])
- .send();
- }
-
- loading = message.loading('Attempting to place swap order for ' + tokenName, 0);
- const confirm = await order_batcher_op.confirmation();
- if (!confirm.completed) {
- console.error(confirm);
- message.error('Failed to deposit ' + tokenName);
- throw new Error(
- 'Failed to deposit ' + (inversion ? buyToken.name : sellToken.name) + ' token',
- );
- } else {
- loading();
- form.resetFields();
- message.success('Successfully deposited ' + tokenName);
- triggerUpdate();
- }
- } catch (error) {
- console.log('deposit error', error);
- const converted_error_message = getErrorMess(error);
- message.error(converted_error_message);
- loading();
- form.resetFields();
- }
- };
-
- const isBatchClosed = () => {
- console.info('EXCHANGE: isBatchClosed', status);
- if (status === BatcherStatus.CLOSED) {
- setBatchClosed(true);
- } else {
- setBatchClosed(false);
- }
- };
-
- useEffect(() => {
- isBatchClosed();
- }, [status]);
- return (
-
-
-
-
- Try to swap
-
-
-
- ) : (
-
- )}
-
-
- );
-};
-
-export default Exchange;
diff --git a/batcher-ui/src/components/Footer.tsx b/batcher-ui/src/components/Footer.tsx
new file mode 100644
index 00000000..a1c5e17b
--- /dev/null
+++ b/batcher-ui/src/components/Footer.tsx
@@ -0,0 +1,57 @@
+import React from 'react';
+import Image from 'next/image';
+
+const Footer = () => (
+
+);
+
+export default Footer;
diff --git a/batcher-ui/src/components/Footer/index.tsx b/batcher-ui/src/components/Footer/index.tsx
deleted file mode 100644
index 13c407e7..00000000
--- a/batcher-ui/src/components/Footer/index.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import {
- TwitterOutlined,
- GithubOutlined,
- LinkedinOutlined,
- GitlabOutlined,
-} from '@ant-design/icons';
-import { FooterToolbar } from '@ant-design/pro-components';
-import { Space, Button, Image } from 'antd';
-import React from 'react';
-import MarigoldLogo from '../../../img/marigold-logo.png';
-
-const Footer: React.FC = () => {
- const LeftFooter = (
-
-
- MARIGOLD
-
-
-
- );
-
- return (
-
-
-
-
-
-
-
-
-
-
- );
-};
-
-export default Footer;
diff --git a/batcher-ui/src/components/Holdings/index.less b/batcher-ui/src/components/Holdings/index.less
deleted file mode 100644
index 45c28242..00000000
--- a/batcher-ui/src/components/Holdings/index.less
+++ /dev/null
@@ -1,121 +0,0 @@
-@import '~antd/es/style/variable.less';
-
-@media (min-width: @screen-lg) {
- .batcher-header {
- .batcher-time {
- border-top: 2px solid #7B7B7E;
- border-left: 2px solid #7B7B7E;
- border-right: 2px solid #7B7B7E;
- }
-
- .batcher-balance {
- border-top: 2px solid #7B7B7E;
- border-right: 2px solid #7B7B7E;
- .batcher-balance-title {
- border-bottom: 2px solid #7B7B7E;
- padding: 10px 25px;
- }
- .batcher-balance-amount {
- padding: 10px 25px;
- }
- }
-
- .batcher-oracle {
- border-top: 2px solid #7B7B7E;
- border-right: 2px solid #7B7B7E;
-
- .ant-space {
- display: grid !important;
- }
- }
- }
-
- .batcher-content-outer {
- border: 2px solid #7B7B7E;
- }
-
- .mtb-25 {
- margin-top: 25px;
- }
-}
-
-@media (max-width: @screen-xs) {
- .batcher-header {
- .batcher-balance {
- border-top: 2px solid #7B7B7E;
- .batcher-balance-title {
- padding: 10px 25px 4px;
- }
- .batcher-balance-amount {
- padding: 4px 25px;
- }
- }
-
- .batcher-oracle {
- .ant-space {
- padding: 4px 25px 10px !important;
- display: flex !important;
- }
- }
- }
-
- .batcher-connect-wallet {
- display: none;
- }
-
- .batcher-menu {
- display: block;
- font-size: 30px;
- color: #ff4d4f !important;
- }
-
- .batcher-content-outer {
- border-top: 2px solid #7B7B7E;
- }
-
- .mtb-25 {
- margin-top: 25px;
- margin-bottom: 45px;
- }
-}
-
-.batcher-title {
- font-family: monospace;
-}
-
-.batcher-header {
- .ant-col {
- text-align: initial !important;
- .ant-space {
- display: flex;
- padding: 10px 25px;
- }
- }
-}
-
-.batcher-content {
- .batcher-price {
- display: flex;
- padding: 25px;
- gap: 20px !important;
- }
-}
-
-.exchange-button {
- display: block !important;
- font-size: 35px !important;
- color: #ff4d4f !important;
-}
-
-.batcher-holding-content {
- background-color: #2B2A2E;
-}
-
-.batcher-redeem-btn {
- display: flex;
- .btn-content {
- margin: auto;
- }
-
-}
-
diff --git a/batcher-ui/src/components/Holdings/index.tsx b/batcher-ui/src/components/Holdings/index.tsx
deleted file mode 100644
index faa23776..00000000
--- a/batcher-ui/src/components/Holdings/index.tsx
+++ /dev/null
@@ -1,117 +0,0 @@
-import React, { useState, useEffect, useContext } from 'react';
-import { Button, Space, Typography, Col, message, Table } from 'antd';
-import '@/components/Exchange/index.less';
-import '@/components/Holdings/index.less';
-import '@/global.less';
-import { HoldingsProps } from '@/extra_utils/types';
-import { useModel } from 'umi';
-import { zeroHoldings } from '@/extra_utils/utils';
-const Holdings: React.FC = ({
- tezos,
- contractAddress,
- openHoldings,
- clearedHoldings,
- setOpenHoldings,
- setClearedHoldings,
- updateAll,
- setUpdateAll,
- hasClearedHoldings,
-}: HoldingsProps) => {
- const { initialState } = useModel('@@initialState');
-
- const triggerUpdate = () => {
- setTimeout(function () {
- const u = !updateAll;
- setUpdateAll(u);
- }, 5000);
- };
-
- const generateHoldings = (dict: Map) => {
- var data = [];
- for (const key of dict) {
- data.push({
- token: key[0],
- holding: key[1],
- });
- }
- return (
- <>
- {data.map((h) => (
-
-
- {' '}
- {h.holding} {h.token} |{' '}
-
-
- ))}
- >
- );
- };
- const redeemHoldings = async (): Promise => {
- let loading = function () {
- return undefined;
- };
-
- try {
- tezos.setWalletProvider(initialState.wallet);
- const contractWallet = await tezos.wallet.at(contractAddress);
- let redeem_op = await contractWallet.methods.redeem().send();
-
- if (redeem_op) {
- loading = message.loading('Attempting to redeem holdings...', 0);
- const confirm = await redeem_op.confirmation();
- if (!confirm.completed) {
- message.error('Failed to redeem holdings');
- console.error('Failed to redeem holdings' + confirm);
- } else {
- setOpenHoldings(new Map());
- setClearedHoldings(new Map());
- loading();
- message.success('Successfully redeemed holdings');
- triggerUpdate();
- }
- } else {
- throw new Error('Failed to redeem tokens');
- }
- } catch (error: any) {
- loading();
- message.error('Unable to redeem holdings : ' + error.message);
- console.error('Unable to redeem holdings' + error);
- }
- };
-
- return (
-
-
- Open/Closed Batches
-
-
- Holdings => | {generateHoldings(openHoldings)}
-
-
-
-
- Cleared Batches (Redeemable)
-
-
- Holdings =>
- {generateHoldings(clearedHoldings)}
-
-
-
-
-
- {hasClearedHoldings ? (
-
- Redeem
-
- ) : (
-
- )}
-
-
-
- );
-};
-
-export default Holdings;
diff --git a/batcher-ui/src/components/Link.tsx b/batcher-ui/src/components/Link.tsx
new file mode 100644
index 00000000..d535962a
--- /dev/null
+++ b/batcher-ui/src/components/Link.tsx
@@ -0,0 +1,28 @@
+import Link from 'next/link';
+import { usePathname } from 'next/navigation';
+import React from 'react';
+
+interface LinkProps {
+ path: string;
+ title: string;
+ onClick?(): void;
+}
+
+const LinkComponent = ({ path, title, onClick }: LinkProps) => {
+ const route = usePathname();
+
+ return (
+
+ {title}
+
+ );
+};
+export default LinkComponent;
diff --git a/batcher-ui/src/components/Menu.tsx b/batcher-ui/src/components/Menu.tsx
new file mode 100644
index 00000000..b90d35ff
--- /dev/null
+++ b/batcher-ui/src/components/Menu.tsx
@@ -0,0 +1,51 @@
+import React from 'react';
+import LinkComponent from './Link';
+import { useWallet } from 'src/contexts/wallet';
+
+interface MenuProps {
+ setIsMenuOpen(arg: boolean): void;
+}
+
+const Menu = ({ setIsMenuOpen }: MenuProps) => {
+ const walletCtx = useWallet();
+ const userAddress = walletCtx.state.userAddress;
+
+ return (
+
+ {
+ setIsMenuOpen(false);
+ userAddress
+ ? walletCtx.disconnectWallet()
+ : walletCtx.connectWallet();
+ }}>
+ {userAddress ? 'Disconnect Wallet' : 'Connect Wallet'}
+
+ setIsMenuOpen(false)}
+ />
+ setIsMenuOpen(false)}
+ />
+ setIsMenuOpen(false)}
+ />
+ setIsMenuOpen(false)}
+ />
+
+ );
+};
+
+export default Menu;
diff --git a/batcher-ui/src/components/NavBar.tsx b/batcher-ui/src/components/NavBar.tsx
new file mode 100644
index 00000000..15e9df34
--- /dev/null
+++ b/batcher-ui/src/components/NavBar.tsx
@@ -0,0 +1,81 @@
+import React, { useEffect } from 'react';
+import { useDispatch } from 'react-redux';
+import Image from 'next/image';
+import { connectedWallet, disconnectedWallet } from '../actions';
+import { useWallet } from '../contexts/wallet';
+import Menu from './Menu';
+import LinkComponent from './Link';
+import { faBars } from '@fortawesome/free-solid-svg-icons';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import Copy from './Copy';
+
+interface NavBarProps {
+ isMenuOpen: boolean;
+ setIsMenuOpen(arg: boolean): void;
+}
+
+const NavBar = ({ isMenuOpen, setIsMenuOpen }: NavBarProps) => {
+ const dispatch = useDispatch();
+
+ const walletCtx = useWallet();
+ const userAddress = walletCtx.state.userAddress;
+
+ useEffect(() => {
+ userAddress
+ ? dispatch(connectedWallet({ userAddress }))
+ : dispatch(disconnectedWallet());
+ }, [userAddress, dispatch]);
+
+ return (
+ <>
+
+
+
+
BATCHER
+
+
+
+
+
+
+
+
+
+ {userAddress ? (
+
+ {`${userAddress.substring(
+ 0,
+ 3
+ )}...${userAddress.substring(userAddress.length - 3)}`}
+
+ ) : null}
+
setIsMenuOpen(!isMenuOpen)}>
+
+
+
{
+ setIsMenuOpen(false);
+ userAddress
+ ? walletCtx.disconnectWallet()
+ : walletCtx.connectWallet();
+ }}>
+ {userAddress ? 'Disconnect Wallet' : 'Connect Wallet'}
+
+
+
+
+ {isMenuOpen && }
+ >
+ );
+};
+export default NavBar;
diff --git a/batcher-ui/src/components/PriceStrategy.tsx b/batcher-ui/src/components/PriceStrategy.tsx
new file mode 100644
index 00000000..625d27dc
--- /dev/null
+++ b/batcher-ui/src/components/PriceStrategy.tsx
@@ -0,0 +1,97 @@
+import React from 'react';
+import * as RadioGroup from '@radix-ui/react-radio-group';
+import { useDispatch } from 'react-redux';
+import { PriceStrategy } from 'src/types';
+import { updatePriceStrategy } from 'src/actions';
+import Tooltip from './Tooltip';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { faQuestionCircle } from '@fortawesome/free-solid-svg-icons';
+
+const PriceStrategyComponent = () => {
+ const dispatch = useDispatch();
+
+ return (
+
+
+
Select the price you want to sell
+
+
+ {
+ 'As Batcher uses a future Oracle price to execute swaps, a user cannot select a specific price to execute the swap at. When using Batcher, a user would rather select one of the price tranches when placing a swap. The available tranches are all given in the context of the future oracle price. Those tranches are:'
+ }
+
+ - Oracle price + 10 basis points (Better Price)
+ - Oracle price
+ - Oracle price - 10 basis points (Worse Price)
+
+
+
+ {'More informations on '}
+
+ marigold.dev/batcher
+
+
+ >
+ }>
+
+
+
+
+
+ );
+};
+
+export default PriceStrategyComponent;
diff --git a/batcher-ui/src/components/RightContent/index.less b/batcher-ui/src/components/RightContent/index.less
deleted file mode 100644
index 6df74184..00000000
--- a/batcher-ui/src/components/RightContent/index.less
+++ /dev/null
@@ -1,116 +0,0 @@
-@import (reference) '~antd/es/style/themes/index';
-
-@pro-header-hover-bg: rgba(0, 0, 0, 0.025);
-
-.menu {
- :global(.anticon) {
- margin-right: 8px;
- }
- :global(.ant-dropdown-menu-item) {
- min-width: 160px;
- }
-}
-
-.right {
- display: flex;
- float: right;
- height: 48px;
- margin-left: auto;
- overflow: hidden;
- .action {
- display: flex;
- align-items: center;
- height: 48px;
- padding: 0 12px;
- cursor: pointer;
- transition: all 0.3s;
- > span {
- vertical-align: middle;
- }
- &:hover {
- background: @pro-header-hover-bg;
- }
- &:global(.opened) {
- background: @pro-header-hover-bg;
- }
- }
- .search {
- padding: 0 12px;
- &:hover {
- background: transparent;
- }
- }
- .account {
- .avatar {
- margin-right: 8px;
- color: @primary-color;
- vertical-align: top;
- background: rgba(255, 255, 255, 0.85);
- }
- }
-}
-
-.dark {
- .action {
- &:hover {
- background: #252a3d;
- }
- &:global(.opened) {
- background: #252a3d;
- }
- }
-}
-
-@media only screen and (max-width: @screen-md) {
- :global(.ant-divider-vertical) {
- vertical-align: unset;
- }
- .name {
- display: none;
- }
- .right {
- position: absolute;
- top: 0;
- right: 12px;
- .account {
- .avatar {
- margin-right: 0;
- }
- }
- .search {
- display: none;
- }
- }
-}
-
-@media (max-width: @screen-xs) {
- .batcher-menu-outer {
- display: block !important;
- }
-
- .ant-dropdown {
- top: 10px !important;
- border: 1px solid #E2E2E3;
- .ant-dropdown-menu {
- background-color: #1C1D22;
- .ant-dropdown-menu-item {
- padding: 8px 20px;
- .white-color {
- color: #FFFFFF;
- svg {
- margin-left: 90px;
- }
- }
- }
- .ant-dropdown-menu-item.ant-dropdown-menu-item-active {
- background-color: #1C1D22 !important;
- }
- }
- }
-}
-
-@media (min-width: @screen-lg) {
- .batcher-menu-outer {
- display: none !important;
- }
-}
diff --git a/batcher-ui/src/components/RightContent/index.tsx b/batcher-ui/src/components/RightContent/index.tsx
deleted file mode 100644
index 3a6db61d..00000000
--- a/batcher-ui/src/components/RightContent/index.tsx
+++ /dev/null
@@ -1,158 +0,0 @@
-import { Space, Button, Dropdown, Typography, MenuProps } from 'antd';
-import React, { useEffect, useState } from 'react';
-import { useModel } from 'umi';
-import styles from '@/components/RightContent/index.less';
-import { MenuOutlined } from '@ant-design/icons';
-import { TezosToolkit } from '@taquito/taquito';
-import { BeaconWallet } from '@taquito/beacon-wallet';
-import { getNetworkType } from '@/extra_utils/utils';
-import '@/components/RightContent/index.less';
-import { connection } from '@/extra_utils/webSocketUtils';
-import { LocalStorage } from '@airgap/beacon-sdk';
-
-export type SiderTheme = 'light' | 'dark';
-
-const GlobalHeaderRight: React.FC = () => {
- const { initialState, setInitialState } = useModel('@@initialState');
- const tezos = new TezosToolkit(REACT_APP_TEZOS_NODE_URI);
- if (!initialState || !initialState.settings) {
- return null;
- }
-
- const { navTheme, layout } = initialState.settings;
- let className = styles.right;
-
- if ((navTheme === 'dark' && layout === 'top') || layout === 'mix') {
- className = `${styles.right} ${styles.dark}`;
- }
-
- const connectCaption = 'Connect Wallet';
- const connectingCaption = 'Connecting...';
- const disconnectCaption = 'Disconnect Wallet';
- const disconnectingCaption = 'Disconnecting...';
- const [caption, setCaption] = useState(connectCaption);
-
- const items: MenuProps['items'] = [
- {
- key: '1',
- label: {caption} ,
- },
- ];
-
- const menuProps = {
- items,
- onClick: !initialState.userAddress ? () => connectWallet() : () => disconnectWallet(),
- };
-
- const connectWallet = async () => {
- console.info('=== STATE === state change check ', initialState);
- if (!initialState.userAddress) {
- setCaption(connectingCaption);
- const wallet = new BeaconWallet({
- name: 'batcher',
- preferredNetwork: getNetworkType(),
- });
- await wallet.requestPermissions({
- network: {
- type: getNetworkType(),
- rpcUrl: REACT_APP_TEZOS_NODE_URI,
- },
- });
-
- tezos.setWalletProvider(wallet);
- const activeAccount = await wallet.client.getActiveAccount();
- const userAddress = activeAccount ? await wallet.getPKH() : null;
- let updatedState = {
- ...initialState,
- wallet: wallet,
- userAddress: userAddress,
- userAccount: activeAccount,
- };
-
- setCaption(disconnectCaption);
- // localStorage.setItem("state", JSON.stringify(updatedState));
- console.log('localstroage - after connect', localStorage);
- setInitialState(updatedState);
- console.log('Setting initialState', updatedState);
- }
- };
-
- const disconnectWallet = async () => {
- console.info('Disconnecting wallet');
- setCaption(disconnectingCaption);
- await connection.stop();
- try {
- await initialState.wallet.clearActiveAccount();
- } catch (error) {
- console.error(error);
- }
- let updatedState = { ...initialState, wallet: null, userAddress: null, userAccount: null };
- localStorage.setItem('state', JSON.stringify(updatedState));
- setInitialState(updatedState);
- setCaption(connectCaption);
- };
-
- const scrollToTop = () => {
- window.scrollTo(0, 0);
- };
-
- const newWallet = () => {
- return new BeaconWallet({
- name: 'batcher',
- preferredNetwork: getNetworkType(),
- });
- };
-
- useEffect(() => {
- (async () => {
- try {
- setCaption(connectCaption);
- // let localstate = JSON.parse(localStorage.getItem("state"));
- let state = initialState;
- let wallet = newWallet();
-
- setCaption(connectingCaption);
- tezos.setWalletProvider(wallet);
- const activeAccount = await wallet.client.getActiveAccount();
- if (activeAccount) {
- console.info('=== STATE === no dep check - active account ', activeAccount);
- const userAddress = await wallet.getPKH();
- let updatedState = {
- ...state,
- wallet: wallet,
- userAddress: userAddress,
- userAccount: activeAccount,
- };
- // localStorage.setItem("state", JSON.stringify(updatedState));
- setInitialState(updatedState);
- setCaption(disconnectCaption);
- } else {
- setCaption(connectCaption);
- }
- } catch (error) {
- setCaption(connectCaption);
- console.error(error);
- }
- })();
- }, []);
- return (
-
-
-
- {caption}
-
-
-
-
-
-
-
-
- );
-};
-export default GlobalHeaderRight;
diff --git a/batcher-ui/src/components/Root.tsx b/batcher-ui/src/components/Root.tsx
new file mode 100644
index 00000000..176fae41
--- /dev/null
+++ b/batcher-ui/src/components/Root.tsx
@@ -0,0 +1,52 @@
+import { NextComponentType, NextPageContext } from 'next';
+import { useEffect, useState } from 'react';
+import Footer from './Footer';
+import NavBar from './NavBar';
+import { batcherSetup, getCurrentBatchNumber } from 'src/actions';
+import { useDispatch } from 'react-redux';
+import { setByKey } from 'src/utils/local-storage';
+import { getStorage } from 'src/utils/utils';
+import { useSelector } from 'react-redux';
+import { batcherStatusSelector } from 'src/reducers';
+import { BatcherStatus } from 'src/types';
+
+interface RootProps {
+ Component: NextComponentType;
+}
+
+const Root = ({ Component }: RootProps) => {
+ const [isMenuOpen, setIsMenuOpen] = useState(false);
+ const dispatch = useDispatch();
+ const status = useSelector(batcherStatusSelector);
+
+ // Override TZKT base url if we are in ghostnet
+ useEffect(() => {
+ dispatch(getCurrentBatchNumber());
+ }, [dispatch]);
+
+ useEffect(() => {
+ getStorage().then(({ rates_current, batch_set, user_batch_ordertypes }) => {
+ setByKey('rates_current', rates_current);
+ setByKey('batches', batch_set.batches);
+ setByKey('user_batch_ordertypes', user_batch_ordertypes);
+ });
+ }, []);
+
+ useEffect(() => {
+ if (status === BatcherStatus.OPEN) {
+ dispatch(batcherSetup());
+ }
+ }, [status, dispatch]);
+
+ return (
+
+
+
+ {!isMenuOpen && }
+
+
+
+ );
+};
+
+export default Root;
diff --git a/batcher-ui/src/components/SelectPair.tsx b/batcher-ui/src/components/SelectPair.tsx
new file mode 100644
index 00000000..02af72ba
--- /dev/null
+++ b/batcher-ui/src/components/SelectPair.tsx
@@ -0,0 +1,137 @@
+import React, { useCallback, useEffect, useState } from 'react';
+import * as Select from '@radix-ui/react-select';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import {
+ faChevronDown,
+ faCheck,
+ faChevronUp,
+} from '@fortawesome/free-solid-svg-icons';
+import { useSelector } from 'react-redux';
+import { currentSwapSelector } from 'src/reducers';
+import { useDispatch } from 'react-redux';
+import { changePair } from 'src/actions';
+import { getTokensMetadata } from 'src/utils/utils';
+import Image from 'next/image';
+
+interface SelectPairProps {
+ isFrom: boolean;
+}
+
+const SelectPair = ({ isFrom }: SelectPairProps) => {
+ const { swap, isReverse } = useSelector(currentSwapSelector);
+ const dispatch = useDispatch();
+
+ const [availableTokens, setAvailableTokens] = useState([]);
+
+ const displayValue = useCallback(() => {
+ if (isReverse && isFrom) return swap.to.name;
+ if (isReverse && !isFrom) return swap.from.token.name;
+ if (!isReverse && isFrom) return swap.from.token.name;
+ if (!isReverse && !isFrom) return swap.to.name;
+ return swap.from.token.name;
+ }, [isReverse, isFrom, swap]);
+
+ useEffect(() => {
+ getTokensMetadata().then(
+ (tokens: { name: string; address: string; icon: string | undefined }[]) =>
+ setAvailableTokens(tokens)
+ );
+ }, []);
+
+ return (
+ {
+ //TODO: change this when we had more pair
+ const pair =
+ value === 'tzBTC' ? `tzBTC/${swap.to.name}` : `tzBTC/${value}`;
+ const reversed =
+ (!isFrom && value === 'tzBTC') || (isFrom && value !== 'tzBTC');
+ dispatch(changePair(pair, reversed));
+ }}>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {availableTokens.map(t => (
+
+
+ {t.icon ? (
+
+ ) : (
+
+ )}
+
{t.name}
+
+
+ ))}
+
+
+
+
+
+
+
+
+ );
+};
+
+// eslint-disable-next-line react/display-name
+const SelectItem = React.forwardRef<
+ HTMLDivElement,
+ {
+ children: React.ReactNode;
+ className?: string;
+ value: string;
+ disabled?: boolean;
+ }
+>(({ children, className, disabled, ...props }, forwardedRef) => {
+ return (
+
+ {children}
+
+
+
+
+ );
+});
+
+export default SelectPair;
diff --git a/batcher-ui/src/components/Toast.tsx b/batcher-ui/src/components/Toast.tsx
new file mode 100644
index 00000000..2c3be9cd
--- /dev/null
+++ b/batcher-ui/src/components/Toast.tsx
@@ -0,0 +1,62 @@
+import * as React from 'react';
+import * as ToastBase from '@radix-ui/react-toast';
+import { useSelector } from 'react-redux';
+import { getToastInfosSelector } from 'src/reducers';
+import { useDispatch } from 'react-redux';
+import { closeToast } from 'src/actions';
+import { createPortal } from 'react-dom';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { faCircleInfo, faCircleXmark } from '@fortawesome/free-solid-svg-icons';
+
+const Toast = () => {
+ const [PortalRoot, setPortalRoot] = React.useState(null);
+
+ const { isToastOpen, toastDescription, type } = useSelector(
+ getToastInfosSelector
+ );
+ const dispatch = useDispatch();
+
+ React.useEffect(() => {
+ // Avoid SSR with NextJS because document is not defined in server-side
+ setPortalRoot(document.getElementById('portal'));
+ }, []);
+
+ if (!PortalRoot) return null;
+
+ return createPortal(
+
+ dispatch(closeToast())}>
+
+
+
+
+ {type === 'error' ? 'Error' : 'Info'}
+
+
+ {toastDescription}
+
+
+
+
+
+ Undo
+
+
+
+
+ ,
+ PortalRoot
+ );
+};
+
+export default Toast;
diff --git a/batcher-ui/src/components/Tooltip.tsx b/batcher-ui/src/components/Tooltip.tsx
new file mode 100644
index 00000000..75be9be2
--- /dev/null
+++ b/batcher-ui/src/components/Tooltip.tsx
@@ -0,0 +1,36 @@
+import * as TooltipPrimitive from '@radix-ui/react-tooltip';
+import React, { ReactNode } from 'react';
+
+type TooltipBaseProps = {
+ children: ReactNode;
+ text: string | ReactNode;
+ disabled?: boolean;
+ visible?: boolean;
+};
+
+const TooltipBase = ({
+ children,
+ text,
+ disabled = false,
+ visible,
+}: TooltipBaseProps) => {
+ return (
+
+
+
+ {children}
+
+
+
+
+ {text}
+
+
+
+
+ );
+};
+
+export default TooltipBase;
diff --git a/batcher-ui/src/components/Volume/index.less b/batcher-ui/src/components/Volume/index.less
deleted file mode 100644
index a746b111..00000000
--- a/batcher-ui/src/components/Volume/index.less
+++ /dev/null
@@ -1,110 +0,0 @@
-@import '~antd/es/style/variable.less';
-
-@media (min-width: @screen-lg) {
- .batcher-header {
- .batcher-time {
- border-top: 2px solid #7B7B7E;
- border-left: 2px solid #7B7B7E;
- border-right: 2px solid #7B7B7E;
- }
-
- .batcher-balance {
- border-top: 2px solid #7B7B7E;
- border-right: 2px solid #7B7B7E;
- .batcher-balance-title {
- border-bottom: 2px solid #7B7B7E;
- padding: 10px 25px;
- }
- .batcher-balance-amount {
- padding: 10px 25px;
- }
- }
-
- .batcher-oracle {
- border-top: 2px solid #7B7B7E;
- border-right: 2px solid #7B7B7E;
-
- .ant-space {
- display: grid !important;
- }
- }
- }
-
- .batcher-content-outer {
- border: 2px solid #7B7B7E;
- }
-
- .mtb-25 {
- margin-top: 25px;
- }
-}
-
-@media (max-width: @screen-xs) {
- .batcher-header {
- .batcher-balance {
- border-top: 2px solid #7B7B7E;
- .batcher-balance-title {
- padding: 10px 25px 4px;
- }
- .batcher-balance-amount {
- padding: 4px 25px;
- }
- }
-
- .batcher-oracle {
- .ant-space {
- padding: 4px 25px 10px !important;
- display: flex !important;
- }
- }
- }
-
- .batcher-connect-wallet {
- display: none;
- }
-
- .batcher-menu {
- display: block;
- font-size: 30px;
- color: #ff4d4f !important;
- }
-
- .batcher-content-outer {
- border-top: 2px solid #7B7B7E;
- }
-
- .mtb-25 {
- margin-top: 25px;
- margin-bottom: 45px;
- }
-}
-
-.batcher-title {
- font-family: monospace;
-}
-
-.batcher-header {
- .ant-col {
- text-align: initial !important;
- .ant-space {
- display: flex;
- padding: 10px 25px;
- }
- }
-}
-
-.batcher-content {
- .batcher-price {
- display: flex;
- padding: 25px;
- gap: 20px !important;
- }
-}
-
-.ant-table-placeholder {
- display: none;
-}
-
-.ant-table-cell-row-hover {
- background-color: #1C1D22 !important;
-}
diff --git a/batcher-ui/src/components/Volume/index.tsx b/batcher-ui/src/components/Volume/index.tsx
deleted file mode 100644
index 3ed4eede..00000000
--- a/batcher-ui/src/components/Volume/index.tsx
+++ /dev/null
@@ -1,105 +0,0 @@
-import React, { useState } from 'react';
-import { Space, Typography, Col, Row, Table } from 'antd';
-import '@/components/Exchange/index.less';
-import '@/components/Volume/index.less';
-import '@/global.less';
-import { VolumeProps } from '@/extra_utils/types';
-
-const Volume: React.FC = ({ volumes }: VolumeProps) => {
- console.log(555, volumes);
-
- const sellVolumes = [
- {
- sellMinusVolume: volumes.sell_minus_volume,
- sellExactVolume: volumes.sell_exact_volume,
- sellPlusVolume: volumes.sell_plus_volume,
- },
- ];
- const buyVolumes = [
- {
- buyMinusVolume: volumes.buy_minus_volume,
- buyExactVolume: volumes.buy_exact_volume,
- buyPlusVolume: volumes.buy_plus_volume,
- },
- ];
-
- const listOfBuyVolumesColumns = [
- {
- title: 'Buy Minus Volume',
- key: 'buyMinusVolume',
- dataIndex: 'buyMinusVolume',
- },
- {
- title: 'Buy Exact Volume',
- key: 'buyExactVolume',
- dataIndex: 'buyExactVolume',
- },
- {
- title: 'Buy Plus Volume',
- key: 'buyPlusVolume',
- dataIndex: 'buyPlusVolume',
- },
- ];
-
- const listOfSellVolumesColumns = [
- {
- title: 'Sell Minus Volume',
- key: 'sellMinusVolume',
- dataIndex: 'sellMinusVolume',
- },
- {
- title: 'Sell Exact Volume',
- key: 'sellExactVolume',
- dataIndex: 'sellExactVolume',
- },
- {
- title: 'Sell Plus Volume',
- key: 'sellPlusVolume',
- dataIndex: 'sellPlusVolume',
- },
- ];
-
- return (
-
-
-
-
-
- Volumes
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-};
-
-export default Volume;
diff --git a/batcher-ui/src/config/env.ts b/batcher-ui/src/config/env.ts
new file mode 100644
index 00000000..de63846a
--- /dev/null
+++ b/batcher-ui/src/config/env.ts
@@ -0,0 +1,35 @@
+module.exports = {
+ ghostnet: {
+ NEXT_PUBLIC_NETWORK_TARGET: 'GHOSTNET',
+ NEXT_PUBLIC_BATCHER_URI: 'https://ghostnet.batcher.marigold.dev',
+ NEXT_PUBLIC_PATH_TO_BATCHER_LOGO:
+ 'https://storage.googleapis.com/marigold-public-bucket/batcher-logo.png',
+ NEXT_PUBLIC_TEZOS_NODE_URI: 'https://ghostnet.tezos.marigold.dev/',
+ NEXT_PUBLIC_TZKT_URI_API: 'https://api.ghostnet.tzkt.io',
+ NEXT_PUBLIC_BATCHER_CONTRACT_HASH: 'KT1UPMR3WkoFRJYmBBbvv4Z9bBhKYuhCx7Cq',
+ NEXT_PUBLIC_LOCAL_STORAGE_KEY_STATE: 'batcher-state',
+ NEXT_PUBLIC_GA_TRACKING_ID: 'G-2K59PEELC8',
+ },
+ mainnet: {
+ NEXT_PUBLIC_NETWORK_TARGET: 'MAINNET',
+ NEXT_PUBLIC_BATCHER_URI: 'https://batcher.marigold.dev',
+ NEXT_PUBLIC_PATH_TO_BATCHER_LOGO:
+ 'https://storage.googleapis.com/marigold-public-bucket/batcher-logo.png',
+ NEXT_PUBLIC_TEZOS_NODE_URI: 'https://mainnet.tezos.marigold.dev/',
+ NEXT_PUBLIC_TZKT_URI_API: 'https://api.tzkt.io',
+ NEXT_PUBLIC_BATCHER_CONTRACT_HASH: 'KT1CoTu4CXcWoVk69Ukbgwx2iDK7ZA4FMSpJ',
+ NEXT_PUBLIC_LOCAL_STORAGE_KEY_STATE: 'batcher-state',
+ NEXT_PUBLIC_GA_TRACKING_ID: 'G-2K59PEELC8',
+ },
+ staging: {
+ NEXT_PUBLIC_NETWORK_TARGET: 'GHOSTNET',
+ NEXT_PUBLIC_BATCHER_URI: 'https://ghostnet.batcher.staging.marigold.dev',
+ NEXT_PUBLIC_PATH_TO_BATCHER_LOGO:
+ 'https://storage.googleapis.com/marigold-public-bucket/batcher-logo.png',
+ NEXT_PUBLIC_TEZOS_NODE_URI: 'https://ghostnet.tezos.marigold.dev/',
+ NEXT_PUBLIC_TZKT_URI_API: 'https://api.ghostnet.tzkt.io',
+ NEXT_PUBLIC_BATCHER_CONTRACT_HASH: 'KT1UPMR3WkoFRJYmBBbvv4Z9bBhKYuhCx7Cq',
+ NEXT_PUBLIC_LOCAL_STORAGE_KEY_STATE: 'batcher-state',
+ NEXT_PUBLIC_GA_TRACKING_ID: 'G-2K59PEELC8',
+ },
+};
diff --git a/batcher-ui/src/contexts/events.tsx b/batcher-ui/src/contexts/events.tsx
new file mode 100644
index 00000000..d43ecd17
--- /dev/null
+++ b/batcher-ui/src/contexts/events.tsx
@@ -0,0 +1,35 @@
+import { /* HubConnection */ HubConnectionBuilder } from '@microsoft/signalr';
+import React, { createContext, useEffect } from 'react';
+// import { useSelector } from 'react-redux';
+import { useDispatch } from 'react-redux';
+import { newEvent } from 'src/actions/events';
+// import { userAddressSelector } from 'src/reducers';
+import { setup /* subscribeTokenBalances */ } from 'src/utils/webSocketUtils';
+
+export const EventsContext = createContext<{}>({});
+
+export const EventsProvider = ({ children }: { children: React.ReactNode }) => {
+ // const [socket, setSocket] = useState(undefined);
+ const dispatch = useDispatch();
+ // const userAddress = useSelector(userAddressSelector);
+
+ useEffect(() => {
+ const socket = new HubConnectionBuilder()
+ .withUrl(process.env.NEXT_PUBLIC_TZKT_URI_API + '/v1/ws')
+ .build();
+ setup(socket);
+ // setSocket(socket);
+ socket.on('bigmaps', e => {
+ if (e.data) dispatch(newEvent(e));
+ });
+ }, [dispatch]);
+
+ // useEffect(() => {
+ // console.warn(socket?.state, userAddress);
+ // subscribeTokenBalances(socket, userAddress);
+ // }, [socket, userAddress]);
+
+ return {children} ;
+};
+
+export const useEvents = () => React.useContext(EventsContext);
diff --git a/batcher-ui/src/contexts/tezos-toolkit.tsx b/batcher-ui/src/contexts/tezos-toolkit.tsx
new file mode 100644
index 00000000..f6d7d5fd
--- /dev/null
+++ b/batcher-ui/src/contexts/tezos-toolkit.tsx
@@ -0,0 +1,31 @@
+import { TezosToolkit } from '@taquito/taquito';
+import React, { createContext, useEffect, useState } from 'react';
+
+type TzTkState = {
+ tezos?: TezosToolkit;
+};
+
+export const TezosToolkitContext = createContext({
+ tezos: undefined,
+});
+
+export const TezosToolkitProvider = ({
+ children,
+}: {
+ children: React.ReactNode;
+}) => {
+ const [tezos, setConnection] = useState();
+ useEffect(() => {
+ if (process.env.NEXT_PUBLIC_TEZOS_NODE_URI) {
+ setConnection(new TezosToolkit(process.env.NEXT_PUBLIC_TEZOS_NODE_URI));
+ }
+ }, []);
+
+ return (
+
+ {children}
+
+ );
+};
+
+export const useTezosToolkit = () => React.useContext(TezosToolkitContext);
\ No newline at end of file
diff --git a/batcher-ui/src/contexts/wallet.tsx b/batcher-ui/src/contexts/wallet.tsx
new file mode 100644
index 00000000..8043b780
--- /dev/null
+++ b/batcher-ui/src/contexts/wallet.tsx
@@ -0,0 +1,159 @@
+import { TezosToolkit } from '@taquito/taquito';
+import React, { createContext, useEffect, useReducer } from 'react';
+import { BeaconWallet } from '@taquito/beacon-wallet';
+import { AccountInfo, NetworkType } from '@airgap/beacon-sdk';
+import { useTezosToolkit } from './tezos-toolkit';
+
+type WalletState = {
+ wallet: BeaconWallet | undefined;
+ userAccount: AccountInfo | undefined;
+ userAddress: string | undefined;
+};
+
+type WalletContextType = {
+ connectWallet: () => void;
+ disconnectWallet: () => void;
+ state: WalletState;
+};
+
+const initialState: WalletState = {
+ wallet: undefined,
+ userAccount: undefined,
+ userAddress: undefined,
+};
+
+export const WalletContext = createContext({
+ state: initialState,
+ connectWallet: () => {},
+ disconnectWallet: () => {},
+});
+
+const connectWallet = async (tezos: TezosToolkit | undefined) => {
+ if (!tezos) return Promise.reject('ERROR');
+ const wallet = new BeaconWallet({
+ name: 'batcher',
+ // @ts-ignore
+ preferredNetwork:
+ process.env.NEXT_PUBLIC_NETWORK_TARGET === 'GHOSTNET'
+ ? NetworkType.GHOSTNET
+ : NetworkType.MAINNET,
+ });
+
+ //TODO: Find a way to fix error "Argument of type 'BeaconWallet' is not assignable to parameter of type 'WalletProvider'.
+ // @ts-ignore
+ tezos.setWalletProvider(wallet);
+
+ await wallet.requestPermissions({
+ network: {
+ // @ts-ignore
+ type:
+ process.env.NEXT_PUBLIC_NETWORK_TARGET === 'GHOSTNET'
+ ? NetworkType.GHOSTNET
+ : NetworkType.MAINNET,
+ rpcUrl: process.env.NEXT_PUBLIC_TEZOS_NODE_URI,
+ },
+ });
+
+ return await wallet.client.getActiveAccount().then(async userAccount => {
+ const userAddress = await wallet.getPKH();
+
+ return { wallet, userAddress, userAccount };
+ });
+};
+
+const disconnectWallet = async (
+ tezos?: TezosToolkit,
+ wallet?: BeaconWallet
+) => {
+ if (!tezos) return Promise.reject('Error: Tezos Toolkit is not initialized.');
+ if (!wallet) return Promise.reject("Error: No wallet. Can't disconnected.");
+
+ wallet.clearActiveAccount();
+ wallet.disconnect();
+
+ return Promise.resolve();
+};
+
+const reducer = (
+ state: WalletState,
+ action:
+ | {
+ type: 'CONNECT_WALLET';
+ payload: {
+ wallet: BeaconWallet;
+ userAddress: string;
+ userAccount: AccountInfo | undefined;
+ };
+ }
+ | {
+ type: 'DISCONNECT_WALLET';
+ }
+ | {
+ type: 'HYDRATE_WALLET';
+ userAddress: string | undefined;
+ userAccount: AccountInfo | undefined;
+ wallet: BeaconWallet;
+ }
+) => {
+ switch (action.type) {
+ case 'CONNECT_WALLET':
+ return { ...state, ...action.payload };
+ case 'DISCONNECT_WALLET':
+ return initialState;
+ case 'HYDRATE_WALLET': {
+ const { userAddress, userAccount, wallet } = action;
+ return { ...state, userAddress, userAccount, wallet };
+ }
+ default:
+ return state;
+ }
+};
+
+export const WalletProvider = ({ children }: { children: React.ReactNode }) => {
+ const { tezos } = useTezosToolkit();
+
+ const [state, dispatch] = useReducer(reducer, initialState);
+
+ useEffect(() => {
+ const wallet = new BeaconWallet({
+ name: 'batcher',
+ // @ts-ignore
+ preferredNetwork:
+ process.env.NEXT_PUBLIC_NETWORK_TARGET === 'GHOSTNET'
+ ? NetworkType.GHOSTNET
+ : NetworkType.MAINNET,
+ });
+
+ //TODO: Find a way to fix error "Argument of type 'BeaconWallet' is not assignable to parameter of type 'WalletProvider'.
+ // @ts-ignore
+ tezos?.setWalletProvider(wallet);
+
+ wallet.client.getActiveAccount().then(userAccount => {
+ dispatch({
+ type: 'HYDRATE_WALLET',
+ userAddress: userAccount?.address,
+ userAccount,
+ wallet,
+ });
+ });
+ }, [tezos]);
+
+ return (
+
+ connectWallet(tezos).then(payload =>
+ dispatch({ type: 'CONNECT_WALLET', payload })
+ ),
+ disconnectWallet: () =>
+ disconnectWallet(tezos, state.wallet).then(() => {
+ dispatch({ type: 'DISCONNECT_WALLET' });
+ }),
+ }}>
+ {children}
+
+ );
+};
+
+export const useWallet = () => React.useContext(WalletContext);
diff --git a/batcher-ui/src/extra_utils/types.ts b/batcher-ui/src/extra_utils/types.ts
deleted file mode 100644
index 35a710c7..00000000
--- a/batcher-ui/src/extra_utils/types.ts
+++ /dev/null
@@ -1,269 +0,0 @@
-import { Dispatch, SetStateAction } from 'react';
-import { TezosToolkit, WalletContract, MichelsonMap } from '@taquito/taquito';
-import { StringNullableChain } from 'lodash';
-
-export enum NetworkType {
- MAINNET = 'mainnet',
- GHOSTNET = 'ghostnet',
- MONDAYNET = 'mondaynet',
- DAILYNET = 'dailynet',
- DELPHINET = 'delphinet',
- EDONET = 'edonet',
- FLORENCENET = 'florencenet',
- GRANADANET = 'granadanet',
- HANGZHOUNET = 'hangzhounet',
- ITHACANET = 'ithacanet',
- JAKARTANET = 'jakartanet',
- KATHMANDUNET = 'kathmandunet',
- CUSTOM = 'custom',
-}
-
-export enum ContentType {
- SWAP = 'swap',
- ORDER_BOOK = 'order_book',
- REDEEM_HOLDING = 'redeem_holding',
- ABOUT = 'about',
- VOLUME = 'volume',
-}
-
-export enum selected_price {
- worse = 0,
- exact,
- better,
-}
-
-export class token {
- token_id!: number;
- name!: string;
- address!: string;
- decimals!: number;
- standard!: string;
-}
-
-export class token_balance {
- token!: token;
- balance!: number;
-}
-
-export class token_amount {
- token!: token;
- amount!: number;
-}
-
-export class swap {
- from!: token_amount;
- to!: token;
-}
-
-export class float_t {
- pow!: number;
- val!: number;
-}
-
-export class exchange_rate {
- swap!: swap;
- rate!: float_t;
- when!: string;
-}
-
-export interface Side {
- bUY?: BUy;
- sELL?: SEll;
-}
-
-export interface BUy {}
-export interface SEll {}
-
-export interface Tolerance {
- eXACT?: EXact;
- mINUS?: MInus;
- pLUS?: PLus;
-}
-
-export interface EXact {}
-export interface MInus {}
-export interface PLus {}
-
-export enum PriceType {
- WORSE = 0,
- EXACT = 1,
- BETTER = 2,
-}
-
-export enum SideType {
- BUY = 0,
- SELL = 1,
-}
-
-export class swap_order {
- trader!: string;
- swap!: swap;
- created_at!: string;
- side!: Side;
- tolerance!: Tolerance;
-}
-
-export class order_book {
- bids!: Array;
- asks!: Array;
-}
-
-export class token_holding {
- holder!: string;
- token_amount!: token_amount;
-}
-
-export class batch_status {
- open!: string;
-}
-
-export class batch {
- status!: batch_status;
- treasury!: MichelsonMap>;
- orderbook!: order_book;
- pair!: [token, token];
-}
-
-export class batch_set {
- current!: batch;
- previous!: Array;
-}
-export class ContractStorage {
- valid_tokens!: Array;
- valid_swaps!: Map;
- rates_current!: MichelsonMap;
- batches!: batch_set;
-}
-
-export class AddressData {
- address!: string;
-}
-
-export class TokenMetaData {
- name!: string;
- symbol!: string;
- decimals!: string;
-}
-
-export class TokenData {
- id!: number;
- contract!: AddressData;
- tokenId!: string;
- standard!: string;
- totalSupply!: string;
- metadata!: TokenMetaData;
-}
-
-export class ApiTokenBalanceData {
- id!: number;
- account!: AddressData;
- token!: TokenData;
- balance!: string;
- transfersCount!: number;
- firstLevel!: number;
- firstTime!: string;
- lastLevel!: number;
- lastTime!: string;
-}
-
-export type OrderBookProps = {
- orderBook: order_book;
- buyToken: token;
- sellToken: token;
-};
-
-export type ExchangeProps = {
- userAddress: string;
- buyBalance: number;
- sellBalance: number;
- inversion: boolean;
- setInversion: Dispatch>;
- tezos: TezosToolkit;
- fee_in_mutez: number;
- buyToken: token;
- sellToken: token;
- showDrawer: Dispatch>;
- updateAll: boolean;
- setUpdateAll: Dispatch>;
- status: string;
-};
-
-export type BatcherInfoProps = {
- userAddress: string;
- tokenPair: string;
- buyBalance: number;
- sellBalance: number;
- buyTokenName: string;
- sellTokenName: string;
- inversion: boolean;
- rate: number;
- status: string;
- openTime: string;
- updateAll: boolean;
- setUpdateAll: Dispatch>;
- batchNumber: number;
-};
-
-export type BatcherActionProps = {
- content: ContentType;
- setContent: Dispatch>;
-};
-export class aggregate_orders {
- buyside!: number;
- sellside!: number;
-}
-export class list_of_orders {
- ordertype!: string;
- price!: string;
- value!: number;
-}
-
-export enum BatcherStatus {
- NONE = 'none',
- OPEN = 'open',
- CLOSED = 'closed',
- CLEARED = 'cleared',
-}
-
-export type BatcherStepperProps = {
- status: string;
-};
-
-export type HoldingsProps = {
- tezos: TezosToolkit;
- userAddress: string;
- contractAddress: string;
- openHoldings: Map;
- clearedHoldings: Map;
- setOpenHoldings: Dispatch>>;
- setClearedHoldings: Dispatch>>;
- updateAll: boolean;
- setUpdateAll: Dispatch>;
- hasClearedHoldings: boolean;
-};
-
-export type Volumes = {
- buy_minus_volume: string;
- buy_exact_volume: string;
- buy_plus_volume: string;
- sell_minus_volume: string;
- sell_exact_volume: string;
- sell_plus_volume: string;
-};
-
-export type VolumeProps = {
- volumes: Volumes;
-};
-
-export const BUY = 'bUY';
-export const SELL = 'sELL';
-export const CLEARED = 'cleared';
-
-export const MINUS = 'mINUS';
-export const EXACT = 'eXACT';
-export const PLUS = 'pLUS';
-
-export type tokens = {
- buy_token_name: string;
- sell_token_name: string;
-};
diff --git a/batcher-ui/src/extra_utils/utils.ts b/batcher-ui/src/extra_utils/utils.ts
deleted file mode 100644
index af7597c7..00000000
--- a/batcher-ui/src/extra_utils/utils.ts
+++ /dev/null
@@ -1,156 +0,0 @@
-import { StringIterator } from 'lodash';
-import * as types from './types';
-import { Dispatch, SetStateAction } from 'react';
-
-export const setTokenAmount = (
- balances: any[],
- standardBalance: number,
- tokenAddress: string,
- tokenDecimals: number,
- setBalance: Dispatch>,
-) => {
- const item = balances.find(
- // eslint-disable-next-line @typescript-eslint/no-shadow
- (item) => item.token.contract.address === tokenAddress,
- );
- const tokAmount = item ? parseInt(item.balance) / 10 ** tokenDecimals : 0;
- setBalance(tokAmount);
-};
-
-export const scaleAmountDown = (amount: number, decimals: number) => {
- const scale = 10 ** -decimals;
- return amount * scale;
-};
-export const scaleAmountUp = (amount: number, decimals: number) => {
- const scale = 10 ** decimals;
- return amount * scale;
-};
-
-export const setSocketTokenAmount = (
- balances: any[],
- userAddress: string,
- token: types.token,
- setBalance: Dispatch>,
-) => {
- const item = balances.find(
- // eslint-disable-next-line @typescript-eslint/no-shadow
- (item) => item.account.address === userAddress && item.token.contract.address === token.address,
- );
- const tokAmount = item ? parseInt(item.balance) / 10 ** token.decimals : 0;
- setBalance(tokAmount);
-};
-
-// Contract error codes
-var error_codes = new Map([
- [100, 'No rate available for swap '],
- [101, 'Invalid token address '],
- [102, 'Invalid tezos address'],
- [103, 'No open batch for deposits'],
- [104, 'Batch should be cleared'],
- [105, 'Trying to close batch which is not open'],
- [106, 'Unable to parse side from external order'],
- [107, 'Unable to parse tolerance from external order'],
- [108, 'Token standard not found'],
- [109, 'Xtz not currently supported'],
- [110, 'Unsupported swap type'],
- [111, 'Unable to reduce token amount to less than zero'],
- [112, 'Too many unredeemed orders'],
- [113, 'Insufficient swap fee'],
- [114, 'Sender not administrator'],
- [115, 'Token already exists but details are different'],
- [116, 'Swap already exists'],
- [117, 'Swap does not exist'],
- [118, 'Endpoint does not accept tez'],
- [119, 'Number is not a nat'],
- [120, 'Oracle price is stale'],
- [121, 'Oracle price is not timely'],
- [122, 'Unable to get price from oracle'],
- [123, 'Unable to get price from new oracle source'],
- [124, 'Oracle price should be available before deposit'],
- [125, 'Swap is disabled for deposits'],
- [126, 'Upper limit on tokens has been reached'],
- [127, 'Upper limit on swap pairs has been reached'],
- [128, 'Cannot reduce limit on tokens to less than already exists'],
- [129, 'Cannot reduce limit on swap pairs to less than already exists'],
- [130, 'More tez sent than fee cost'],
- [131, 'Cannot update deposit window to less than the minimum'],
- [132, 'Cannot update deposit window to more than the maximum'],
- [133, 'Oracle must be equal to minimum precision'],
- [134, 'Swap precision is less than minimum'],
- [135, 'Cannot update scale factor to less than the minimum'],
- [136, 'Cannot update scale factor to more than the maximum'],
- [137, 'Cannot remove swap pair that is not disabled'],
-]);
-export const getErrorMess = (error: any) => {
- try {
- console.info('Error Message', error);
- const error_data_size = error.data.length;
- console.info('Error Data Length', error_data_size);
- const error_code = error.data[error_data_size - 1].with.int;
- const error_message = error_codes.get(parseInt(error_code));
- return error_message;
- } catch {
- return error instanceof Error ? error.message : 'Unknown error';
- }
-};
-
-export const orders_exist_in_order_book = (ob: types.order_book) => {
- try {
- return ob.bids.length > 0 || ob.asks.length > 0;
- } catch {
- return false;
- }
-};
-
-export const getEmptyOrderBook = () => {
- return {
- bids: [],
- asks: [],
- };
-};
-
-export const getNetworkType = () => {
- const network = REACT_APP_NETWORK_TARGET;
- if (network?.includes('GHOSTNET')) {
- return types.NetworkType.GHOSTNET;
- } else {
- return types.NetworkType.MAINNET;
- }
-};
-
-export const getEmptyVolumes = () => {
- return {
- buy_minus_volume: '0',
- buy_exact_volume: '0',
- buy_plus_volume: '0',
- sell_minus_volume: '0',
- sell_exact_volume: '0',
- sell_plus_volume: '0',
- };
-};
-
-export const scaleStringAmountDown = (amount: string, decimals: number) => {
- if (!amount) {
- console.error('scaleStringAmountDown - amount is undefined', amount);
- return '0';
- } else {
- const scale = 10 ** -decimals;
- return (Number.parseInt(amount) * scale).toString();
- }
-};
-
-export const zeroHoldings = (
- storage: any,
- setOpenHoldings: Dispatch>>,
- setClearedHoldings: Dispatch>>,
-) => {
- const valid_pairs = storage.valid_tokens;
- const ot = new Map();
- const ct = new Map();
- Object.keys(valid_pairs).map((k, i) => {
- ot.set(k, 0);
- ct.set(k, 0);
- });
- setClearedHoldings(ct);
- setOpenHoldings(ot);
-};
diff --git a/batcher-ui/src/extra_utils/webSocketUtils.ts b/batcher-ui/src/extra_utils/webSocketUtils.ts
deleted file mode 100644
index e8872046..00000000
--- a/batcher-ui/src/extra_utils/webSocketUtils.ts
+++ /dev/null
@@ -1,84 +0,0 @@
-// Tzkt Websocket
-import { HubConnectionBuilder, HubConnectionState } from '@microsoft/signalr';
-import { now } from 'moment';
-export const connection = new HubConnectionBuilder()
- .withUrl(REACT_APP_TZKT_URI_API + '/v1/ws')
- .build();
-
-function isReady() {
- return connection.state === HubConnectionState.Connected;
-}
-
-function isNotReady() {
- return !isReady();
-}
-
-function sleep(ms: number) {
- console.info(`Sleeping (${ms} ms)`, now());
- return new Promise((resolve) => setTimeout(resolve, ms));
-}
-
-const assure_connection = async () => {
- try {
- if (connection.state === HubConnectionState.Disconnected) {
- console.log('SOCKET CONNECTION: was disconnected - starting', connection.state);
- await connection.start();
- }
- let retries = 10;
- while (isNotReady()) {
- if (retries > 0) {
- console.log(
- 'SOCKET CONNECTION: connection not ready retrying ' + retries,
- connection.state,
- );
- retries = retries - 1;
- await sleep(2000);
- } else {
- return;
- }
- }
- } catch (error: any) {
- console.error(error);
- }
-};
-
-export const init_contract = async () => {
- await assure_connection()
- .then(() => {
- console.log('SOCKET CONNECTION: connecting bigmaps', connection.state);
- if (isReady()) {
- // Subscription to Batcher oracle rates
- connection.invoke('SubscribeToBigMaps', {
- contract: REACT_APP_BATCHER_CONTRACT_HASH,
- });
- }
- })
- .then(() => {
- console.log('SOCKET CONNECTION: connecting operations', connection.state);
- if (isReady()) {
- // Subscription to Batcher operations
- connection.invoke('SubscribeToOperations', {
- address: REACT_APP_BATCHER_CONTRACT_HASH,
- types: 'transaction',
- });
- }
- });
-};
-
-export const init_user = async (userAddress: string) => {
- try {
- await assure_connection().then(() => {
- if (isReady()) {
- if (userAddress) {
- // Subscription to token balances
- console.log('SOCKET CONNECTION: connecting token balances', connection.state);
- connection.invoke('SubscribeToTokenBalances', {
- account: userAddress,
- });
- }
- }
- });
- } catch (error) {
- console.error('Unable to init connection', error);
- }
-};
diff --git a/batcher-ui/src/global.less b/batcher-ui/src/global.less
deleted file mode 100644
index 6c77faec..00000000
--- a/batcher-ui/src/global.less
+++ /dev/null
@@ -1,234 +0,0 @@
-@import '~antd/es/style/variable.less';
-
-html,
-body,
-#root {
- height: 100%;
- background-color: #1C1D22 !important;
-}
-
-.colorWeak {
- filter: invert(80%);
-}
-
-.ant-layout {
- min-height: 60vh;
-}
-.ant-pro-sider.ant-layout-sider.ant-pro-sider-fixed {
- left: unset;
-}
-
-canvas {
- display: block;
-}
-
-body {
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-ul,
-ol {
- list-style: none;
-}
-
-.ant-typography {
- color: #FFFFFF;
-}
-
-.ant-pro-top-nav-header-main {
- background-color: #1C1D22;
- border-bottom: 2px solid #7B7B7E;
-}
-
-.ant-layout {
- background-color: #1C1D22 !important;
-}
-
-.ant-pro-footer-bar {
- background-color: #1C1D22 !important;
- border-top: 2px solid #7B7B7E !important;
- // min-height: 10vh ;
-}
-
-.p-16 {
- font-size: 16px;
-}
-
-.p-13 {
- font-size: 13px;
-}
-
-.p-12 {
- font-size: 12px;
-}
-
-.mtb-25 {
- margin-top: 25px;
-}
-
-.grid-padding {
- padding: 10px 25px;
-}
-
-.text-center {
- text-align: center;
-}
-
-.br-t {
- border-top: 2px solid #7B7B7E;
-}
-
-.br-l {
- border-left: 2px solid #7B7B7E;
-}
-
-.br-r {
- border-right: 2px solid #7B7B7E;
-}
-
-.br-b {
- border-bottom: 2px solid #7B7B7E;
-}
-
-.pd-0 {
- padding: 0px !important;
-}
-
-.pd-5 {
- padding: 5px !important;
-}
-
-.pd-5-10 {
- padding: 5px 12px !important;
-}
-
-.pd-25 {
- padding: 25px;
-}
-
-.tx-align {
- text-align: center !important;
-}
-
-.grid-display {
- display: grid;
-}
-
-.batcher-token {
- background-color: #7B7B7E;
- .ant-input {
- background-color: #7B7B7E;
- }
-}
-
-.batcher-time-gap {
- gap: 40px !important;
-}
-
-.batcher-time-difference {
- padding: 25px;
- border: 2px solid #7B7B7E;
-}
-
-.mr-c {
- margin: auto 0;
-}
-.batcher-table {
- .ant-table {
- box-sizing: border-box;
- margin: 0;
- padding: 0;
- color: #1C1D22;
- font-variant: roboto;
- line-height: 1.5715;
- position: relative;
- font-size: 12px;
- background: #1C1D22;
- border-radius: 1px;
- text-align: center;
- }
- .ant-table table {
- width: 100%;
- border-radius: 2px 2px 0 0;
- border-collapse: separate;
- border-spacing: 0;
- text-align: center;
- }
- .ant-table-thead > tr > th {
- background: #2B2A2E;
- position: relative;
- padding: 16px 16px;
- overflow-wrap: break-word;
- color: #FFF;
- border: 1px solid #FFF;
- text-align: center;
- }
- .ant-table-tbody > tr > td {
- position: relative;
- padding: 16px 16px;
- overflow-wrap: break-word;
- text-align: center;
- border: 1px solid #FFF;
- background: #1C1D22;
- color: #FFF;
- }
- .ant-table-cell > tr > td {
- background: #1C1D22;
- color: #FFF;
- }
-}
-
-.batcher-nav-btn {
- color: #FFF;
- background-color: #1C1D22;
- border: 2px solid #ff4d4f !important;
- text-align: center;
-}
-
-.batcher-nav-btn:active,
-.batcher-nav-btn:focus,
-.batcher-nav-btn:hover {
- color: #1C1D22;
- background-color: #ff4d4f;
- border: 2px solid #7B7B7E !important;
-}
-.batcher-col-focus {
- background-color: #FFFFFF;
- .ant-typography {
- color: #1C1D22;
- }
-}
-
-.ant-pro-basicLayout-content {
- margin-bottom: 80px;
-}
-
-.ant-drawer-header {
- background-color: #FFF;
-}
-.ant-drawer-title {
- color: #ff4d4f;
-}
-.ant-drawer-body {
- background-color: #1C1D22;
- color: #fff;
- height: calc(100vh - 45px);
-}
-
-@media (max-width: @screen-xs) {
- .ant-pro-basicLayout-content {
- margin: 0 0 80px 0 !important;
- }
-
- .batcher-nav-btn {
- font-size: 11px !important;
- }
-
- .swap-btn {
- font-size: 12px !important;
- }
-}
-
-
diff --git a/batcher-ui/src/global.tsx b/batcher-ui/src/global.tsx
deleted file mode 100644
index 960629c3..00000000
--- a/batcher-ui/src/global.tsx
+++ /dev/null
@@ -1,90 +0,0 @@
-import { Button, message, notification } from 'antd';
-import defaultSettings from '../config/defaultSettings';
-
-const { pwa } = defaultSettings;
-const isHttps = document.location.protocol === 'https:';
-
-const clearCache = () => {
- // remove all caches
- if (window.caches) {
- caches
- .keys()
- .then((keys) => {
- keys.forEach((key) => {
- caches.delete(key);
- });
- })
- .catch((e) => console.log(e));
- }
-};
-
-// if pwa is true
-if (pwa) {
- // Notify user if offline now
- window.addEventListener('sw.offline', () => {
- message.warning('You are offline now');
- });
-
- // Pop up a prompt on the page asking the user if they want to use the latest version
- window.addEventListener('sw.updated', (event: Event) => {
- const e = event as CustomEvent;
- const reloadSW = async () => {
- // Check if there is sw whose state is waiting in ServiceWorkerRegistration
- // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration
- const worker = e.detail && e.detail.waiting;
- if (!worker) {
- return true;
- }
- // Send skip-waiting event to waiting SW with MessageChannel
- await new Promise((resolve, reject) => {
- const channel = new MessageChannel();
- channel.port1.onmessage = (msgEvent) => {
- if (msgEvent.data.error) {
- reject(msgEvent.data.error);
- } else {
- resolve(msgEvent.data);
- }
- };
- worker.postMessage({ type: 'skip-waiting' }, [channel.port2]);
- });
-
- clearCache();
- window.location.reload();
- return true;
- };
- const key = `open${Date.now()}`;
- const btn = (
- {
- notification.close(key);
- reloadSW();
- }}
- >
- Refresh
-
- );
- notification.open({
- message: 'New content is available',
- description: 'Please press the "Refresh" button to reload current page',
- btn,
- key,
- onClose: async () => null,
- });
- });
-} else if ('serviceWorker' in navigator && isHttps) {
- // unregister service worker
- const { serviceWorker } = navigator;
- if (serviceWorker.getRegistrations) {
- serviceWorker.getRegistrations().then((sws) => {
- sws.forEach((sw) => {
- sw.unregister();
- });
- });
- }
- serviceWorker.getRegistration().then((sw) => {
- if (sw) sw.unregister();
- });
-
- clearCache();
-}
diff --git a/batcher-ui/src/manifest.json b/batcher-ui/src/manifest.json
deleted file mode 100644
index e3b3f870..00000000
--- a/batcher-ui/src/manifest.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "name": "Ant Design Pro45",
- "short_name": "Ant Design Pro67",
- "display": "standalone",
- "start_url": "./?utm_source=homescreen",
- "theme_color": "#002140",
- "background_color": "#001529",
- "icons": [
- {
- "src": "icons/icon-192x192.png",
- "sizes": "192x192"
- },
- {
- "src": "icons/icon-128x128.png",
- "sizes": "128x128"
- },
- {
- "src": "icons/icon-512x512.png",
- "sizes": "512x512"
- }
- ]
-}
diff --git a/batcher-ui/src/pages/404.tsx b/batcher-ui/src/pages/404.tsx
deleted file mode 100644
index 301e1739..00000000
--- a/batcher-ui/src/pages/404.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { Button, Result } from 'antd';
-import React from 'react';
-import { history } from 'umi';
-
-const NoFoundPage: React.FC = () => (
- history.push('/')}>
- Back Home
-
- }
- />
-);
-
-export default NoFoundPage;
diff --git a/batcher-ui/src/pages/Main.tsx b/batcher-ui/src/pages/Main.tsx
deleted file mode 100644
index 2a73f5bd..00000000
--- a/batcher-ui/src/pages/Main.tsx
+++ /dev/null
@@ -1,881 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import Exchange from '@/components/Exchange';
-import About from '@/components/About';
-import Volume from '@/components/Volume';
-import BatcherInfo from '@/components/BatcherInfo';
-import BatcherAction from '@/components/BatcherAction';
-import { ContentType, token, BatcherStatus, Volumes, swap, tokens } from '@/extra_utils/types';
-import { ContractsService, MichelineFormat } from '@dipdup/tzkt-api';
-import { Space, Col, Row, Drawer, Radio } from 'antd';
-import { CiTwoTone, ConsoleSqlOutlined, DoubleRightOutlined } from '@ant-design/icons';
-
-import type { RadioChangeEvent } from 'antd';
-import { useModel } from 'umi';
-import {
- getEmptyVolumes,
- setTokenAmount,
- setSocketTokenAmount,
- scaleStringAmountDown,
-} from '@/extra_utils/utils';
-import { connection, init_contract, init_user } from '@/extra_utils/webSocketUtils';
-import { scaleAmountUp, zeroHoldings } from '@/extra_utils/utils';
-import Holdings from '@/components/Holdings';
-import { TezosToolkit } from '@taquito/taquito';
-
-const Welcome: React.FC = () => {
- const [Tezos] = useState(new TezosToolkit(REACT_APP_TEZOS_NODE_URI));
- const [content, setContent] = useState(ContentType.SWAP);
- const [tokenMap, setTokenMap] = useState>(new Map());
- const [ratesBigMapId, setRatesBigMapId] = useState(0);
- const [userBatchOrderTypesBigMapId, setUserBatchOrderTypesBigMapId] = useState(0);
- const [batchesBigMapId, setBatchesBigMapId] = useState(0);
- const [contractAddress] = useState(REACT_APP_BATCHER_CONTRACT_HASH);
- const chain_api_url = REACT_APP_TZKT_URI_API;
- const contractsService = new ContractsService({
- baseUrl: chain_api_url,
- version: '',
- withCredentials: false,
- });
- const [bigMapsByIdUri] = useState('' + chain_api_url + '/v1/bigmaps/');
- const [inversion, setInversion] = useState(true);
- const { initialState } = useModel('@@initialState');
- const { userAddress } = initialState;
-
- const [buyToken, setBuyToken] = useState({
- token_id: 0,
- name: 'tzBTC',
- address: undefined,
- decimals: 8,
- standard: 'FA1.2 token',
- });
- const [sellToken, setSellToken] = useState({
- token_id: 0,
- name: 'USDT',
- address: undefined,
- decimals: 6,
- standard: 'FA2 token',
- });
- const [tokenPair, setTokenPair] = useState(buyToken.name + '/' + sellToken.name);
- const [buyBalance, setBuyBalance] = useState(0);
- const [sellBalance, setSellBalance] = useState(0);
-
- const [rate, setRate] = useState(0);
- const [status, setStatus] = useState(BatcherStatus.NONE);
- const [openTime, setOpenTime] = useState(null);
- const [clearedHoldings, setClearedHoldings] = useState>(
- new Map(),
- );
- const [openHoldings, setOpenHoldings] = useState>(new Map());
- const [feeInMutez, setFeeInMutez] = useState(0);
- const [volumes, setVolumes] = useState(getEmptyVolumes());
- const [updateAll, setUpdateAll] = useState(false);
- const [batchNumber, setBatchNumber] = useState(0);
- const [hasClearedHoldings, setHasClearedHoldings] = useState(false);
-
-
- const pullStorage = async () => {
- const storage = await contractsService.getStorage({
- address: contractAddress,
- level: 0,
- path: null,
- });
- return storage;
- };
-
- const scaleVolumeDown = (vols: Volumes) => {
- return {
- buy_minus_volume: scaleStringAmountDown(vols.buy_minus_volume, buyToken.decimals),
- buy_exact_volume: scaleStringAmountDown(vols.buy_exact_volume, buyToken.decimals),
- buy_plus_volume: scaleStringAmountDown(vols.buy_plus_volume, buyToken.decimals),
- sell_minus_volume: scaleStringAmountDown(vols.sell_minus_volume, sellToken.decimals),
- sell_exact_volume: scaleStringAmountDown(vols.sell_exact_volume, sellToken.decimals),
- sell_plus_volume: scaleStringAmountDown(vols.sell_plus_volume, sellToken.decimals),
- };
- };
-
-
- const setStatusFromBatch = (sts: string, jsonData: any) => {
- try {
- if (sts === BatcherStatus.OPEN) {
- setOpenTime(jsonData.value.status.open);
- setStatus(BatcherStatus.OPEN);
- } else if (sts === BatcherStatus.CLOSED) {
- setStatus(BatcherStatus.CLOSED);
- } else if (sts === BatcherStatus.CLEARED) {
- setStatus(BatcherStatus.CLEARED);
- } else {
- console.error('Unable to set status', sts);
- }
- } catch (error) {
- console.error('Unable to set status', error);
- }
- };
- const getCurrentVolume = async (storage: any) => {
- try {
- const currentBatchIndices = storage.batch_set.current_batch_indices;
- const index_map = new Map(
- Object.keys(currentBatchIndices).map((k) => [k, currentBatchIndices[k] as number]),
- );
- const currentBatchNumber = index_map.get(tokenPair);
- console.log('current_batch_number', currentBatchNumber);
-
- if (currentBatchNumber === 0) {
- setBatchNumber(0);
- setStatus(BatcherStatus.NONE);
- const vols: Volumes = getEmptyVolumes();
- setVolumes(vols);
- } else {
- setBatchNumber(currentBatchNumber);
- const currentBatchURI =
- bigMapsByIdUri + batchesBigMapId + '/keys/' + currentBatchNumber;
- console.log('######Volumes - URI', currentBatchURI);
- const data = await fetch(currentBatchURI, {
- method: 'GET',
- });
- if (data.ok && data.status !== 204) {
- const jsonData = await data.json();
- const sts = Object.keys(jsonData.value.status)[0];
- setStatusFromBatch(sts, jsonData);
- // eslint-disable-next-line @typescript-eslint/no-shadow
- const scaledVolumes = scaleVolumeDown(jsonData.value.volumes);
- setVolumes(scaledVolumes);
- } else {
- console.info('Response from current batch api was no ok', data);
- }
- }
- } catch (error) {
- console.error('Unable to get current volume', error);
- }
- };
-
- // eslint-disable-next-line @typescript-eslint/no-shadow
- const setFee = async (storage: any) => {
- try {
- const fee = storage.fee_in_mutez;
- setFeeInMutez(fee);
- } catch (error) {
- console.error('Unable to set fee', error);
- }
- };
-
- const updateSwapMap = async (storage: any) => {
- try {
- const valid_swaps = storage.valid_swaps;
- console.info('Valid Swaps', valid_swaps);
- const swap_map = new Map(
- Object.keys(valid_swaps)
- .filter((k) => !valid_swaps[k].is_disabled_for_desposits)
- .map((k) => [k, valid_swaps[k]]),
- );
- setTokenMap(swap_map);
- } catch (error) {
- console.error('Unable to update swap map', error);
- }
- };
- const getOriginalDepositAmounts = (
- side: any,
- initialBuySideAmount: number,
- initialSellSideAmount: number,
- depositValue: number,
- ) => {
- if (Object.keys(side).at(0) === 'buy') {
- initialBuySideAmount += Math.floor(depositValue) / 10 ** buyToken.decimals;
- } else if (Object.keys(side).at(0) === 'sell') {
- initialSellSideAmount += Math.floor(depositValue) / 10 ** sellToken.decimals;
- } else {
- console.error("Couldn't understand which side the deposit was on");
- }
- return [initialBuySideAmount, initialSellSideAmount];
- };
-
- const wasInClearingForBatch = (
- side_obj: any,
- order_tolerance_obj: any,
- clearing_tolerance_obj: any,
- ) => {
- const side = Object.keys(side_obj).at(0);
- const order_tolerance = Object.keys(order_tolerance_obj).at(0);
- const clearing_tolerance = Object.keys(clearing_tolerance_obj).at(0);
- if (side == 'buy') {
- if (clearing_tolerance === 'minus') {
- if (order_tolerance === 'minus') {
- return true;
- } else if (order_tolerance === 'exact') {
- return false;
- } else if (order_tolerance === 'plus') {
- return false;
- } else {
- console.error('Could not determine order tolerance for buy deposit');
- }
- } else if (clearing_tolerance === 'exact') {
- if (order_tolerance === 'minus') {
- return true;
- } else if (order_tolerance === 'exact') {
- return true;
- } else if (order_tolerance === 'plus') {
- return false;
- } else {
- console.error('Could not determine order tolerance for buy deposit');
- }
- } else if (clearing_tolerance === 'plus') {
- if (order_tolerance === 'minus') {
- return true;
- } else if (order_tolerance === 'exact') {
- return true;
- } else if (order_tolerance === 'plus') {
- return true;
- } else {
- console.error('Could not determine order tolerance for buy deposit');
- }
- } else {
- console.error('Unable to determine clearing tolerance for buy deposit');
- }
- } else if (side == 'sell') {
- if (clearing_tolerance === 'minus') {
- if (order_tolerance === 'minus') {
- return true;
- } else if (order_tolerance === 'exact') {
- return true;
- } else if (order_tolerance === 'plus') {
- return true;
- } else {
- console.error('Could not determine order tolerance for buy deposit');
- }
- } else if (clearing_tolerance === 'exact') {
- if (order_tolerance === 'minus') {
- return false;
- } else if (order_tolerance === 'exact') {
- return true;
- } else if (order_tolerance === 'plus') {
- return true;
- } else {
- console.error('Could not determine order tolerance for buy deposit');
- }
- } else if (clearing_tolerance === 'plus') {
- if (order_tolerance === 'minus') {
- return false;
- } else if (order_tolerance === 'exact') {
- return false;
- } else if (order_tolerance === 'plus') {
- return true;
- } else {
- console.error('Could not determine order tolerance for buy deposit');
- }
- } else {
- console.error('Unable to determine clearing tolerance for buy deposit');
- }
- } else {
- console.error('Unable to determine side for holdings');
- }
- };
-
- const convertHoldingToPayout = (
- fromAmount: any,
- fromVolumeSubjectToClearing: any,
- fromClearedVolume: any,
- toClearedVolume: any,
- fromDecimals: number,
- toDecimals: number,
- ) => {
- const prorata = fromAmount / fromVolumeSubjectToClearing;
- const payout = toClearedVolume * prorata;
- const payoutInFromTokens = fromClearedVolume * prorata;
- const remainder = fromAmount - payoutInFromTokens;
- const scaled_payout = Math.floor(payout) / 10 ** toDecimals;
- const scaled_remainder = Math.floor(remainder) / 10 ** fromDecimals;
-
- return [scaled_payout, scaled_remainder];
- };
-
- const findTokensForBatch = (batch: any) => {
- const pair = batch.pair;
- const tkns: tokens = {
- buy_token_name: pair.name_0,
- sell_token_name: pair.name_1,
- };
- return tkns;
- };
-
- const calculateHoldingFromBatch = (
- batch: any,
- ubots: any,
- open_holdings: Map,
- cleared_holdings: Map,
- ) => {
- const tkns = findTokensForBatch(batch);
- const depositsInBatches = ubots.value;
- const userBatchLength = depositsInBatches[batch.batch_number].length;
-
- if (Object.keys(batch.status)[0] !== BatcherStatus.CLEARED) {
- for (let j = 0; j < userBatchLength; j++) {
- try {
- const depObject = ubots.value[batch.batch_number].at(j);
- const side = depObject.key.side;
- const value = depObject.value;
- let initialBuySideOpenAmount = open_holdings.get(tkns.buy_token_name);
- let initialSellSideOpenAmount = open_holdings.get(tkns.sell_token_name);
- const updatedValues = getOriginalDepositAmounts(
- side,
- initialBuySideOpenAmount,
- initialSellSideOpenAmount,
- value,
- );
- initialBuySideOpenAmount += updatedValues.at(0);
- initialSellSideOpenAmount += updatedValues.at(1);
- open_holdings.set(tkns.buy_token_name, initialBuySideOpenAmount);
- open_holdings.set(tkns.sell_token_name, initialSellSideOpenAmount);
- } catch (error) {
- console.error(error);
- }
- }
- } else {
- const cleared = batch.status.cleared;
- const clearing = cleared.clearing;
- const buy_side_cleared_volume = clearing.total_cleared_volumes.buy_side_total_cleared_volume;
- const sell_side_cleared_volume =
- clearing.total_cleared_volumes.sell_side_total_cleared_volume;
- const buy_side_volume_subject_to_clearing =
- clearing.total_cleared_volumes.buy_side_volume_subject_to_clearing;
- const sell_side_volume_subject_to_clearing =
- clearing.total_cleared_volumes.sell_side_volume_subject_to_clearing;
-
- for (let j = 0; j < userBatchLength; j++) {
- try {
- const depObject = ubots.value[batch.batch_number].at(j);
- const side = depObject.key.side;
- const tol = depObject.key.tolerance;
- const value = depObject.value;
-
- if (buy_side_cleared_volume === 0 || sell_side_cleared_volume === 0) {
- let initialBuySideAmount = cleared_holdings.get(tkns.buy_token_name);
- let initialSellSideAmount = cleared_holdings.get(tkns.sell_token_name);
- const updatedValues = getOriginalDepositAmounts(
- side,
- initialBuySideAmount,
- initialSellSideAmount,
- value,
- );
- initialBuySideAmount += updatedValues.at(0);
- initialSellSideAmount += updatedValues.at(1);
- cleared_holdings.set(tkns.buy_token_name, initialBuySideAmount);
- cleared_holdings.set(tkns.sell_token_name, initialSellSideAmount);
- } else {
- const wasInClearing = wasInClearingForBatch(side, tol, clearing.clearing_tolerance);
- if (wasInClearing) {
- if (Object.keys(side).at(0) === 'buy') {
- let initialBuySideAmount = cleared_holdings.get(tkns.buy_token_name);
- let initialSellSideAmount = cleared_holdings.get(tkns.sell_token_name);
- const payout = convertHoldingToPayout(
- value,
- buy_side_volume_subject_to_clearing,
- buy_side_cleared_volume,
- sell_side_cleared_volume,
- buyToken.decimals,
- sellToken.decimals,
- );
- initialSellSideAmount += payout.at(0);
- initialBuySideAmount += payout.at(1);
- cleared_holdings.set(tkns.buy_token_name, initialBuySideAmount);
- cleared_holdings.set(tkns.sell_token_name, initialSellSideAmount);
- } else if (Object.keys(side).at(0) === 'sell') {
- let initialBuySideAmount = cleared_holdings.get(tkns.buy_token_name);
- let initialSellSideAmount = cleared_holdings.get(tkns.sell_token_name);
- const payout = convertHoldingToPayout(
- value,
- sell_side_volume_subject_to_clearing,
- sell_side_cleared_volume,
- buy_side_cleared_volume,
- sellToken.decimals,
- buyToken.decimals,
- );
- initialBuySideAmount += payout.at(0);
- initialSellSideAmount += payout.at(1);
- cleared_holdings.set(tkns.buy_token_name, initialBuySideAmount);
- cleared_holdings.set(tkns.sell_token_name, initialSellSideAmount);
- } else {
- console.error('Unable to determine side for a deposit that was in clearing');
- }
- } else {
- let initialBuySideAmount = cleared_holdings.get(tkns.buy_token_name);
- let initialSellSideAmount = cleared_holdings.get(tkns.sell_token_name);
- const updatedValues = getOriginalDepositAmounts(
- side,
- initialBuySideAmount,
- initialSellSideAmount,
- value,
- );
- initialBuySideAmount += updatedValues.at(0);
- initialSellSideAmount += updatedValues.at(1);
- cleared_holdings.set(tkns.buy_token_name, initialBuySideAmount);
- cleared_holdings.set(tkns.sell_token_name, initialSellSideAmount);
- }
- }
- } catch (error) {
- console.error(error);
- }
- }
- }
- return [open_holdings, cleared_holdings];
- };
-
- const updateHoldings = async (storage: any) => {
- let oh = openHoldings;
- let ch = clearedHoldings;
- try {
- if (!userAddress) {
- return;
- }
-
- console.info('##open holdings', openHoldings);
- console.info('##cleared holdings', clearedHoldings);
- const userBatcherURI = bigMapsByIdUri + userBatchOrderTypesBigMapId + '/keys/' + userAddress;
- const userOrderBookData = await fetch(userBatcherURI, { method: 'GET' });
- let userBatches = null;
- try {
- userBatches = await userOrderBookData.json();
- } catch (error) {
- console.error(error);
- return;
- }
-
- if (Object.keys(userBatches.value).length === 0) {
- return;
- }
-
- for (let i = 0; i < Object.keys(userBatches.value).length; i++) {
- const batchId = Object.keys(userBatches.value).at(i);
-
- const batchURI = bigMapsByIdUri + storage.batch_set.batches + '/keys/' + batchId;
- const batchData = await fetch(batchURI, { method: 'GET' });
- let batch = null;
- try {
- batch = await batchData.json();
- } catch (error) {
- console.error(error);
- return;
- }
-
- try {
- const batch_holdings = calculateHoldingFromBatch(batch.value, userBatches, oh, ch);
-
- console.info('== batcher holdings ' + batchId, batch_holdings);
- oh = batch_holdings[0];
- ch = batch_holdings[1];
- } catch (error) {
- console.error(error);
- }
- }
- } catch (error) {
- console.error('Unable to update holdings', error);
- }
- setOpenHoldings(oh);
- setClearedHoldings(ch);
-
- let sum_of_holdings = 0;
- for (const value of ch.values()) {
- sum_of_holdings = sum_of_holdings + value;
- }
- setHasClearedHoldings(sum_of_holdings > 0);
- };
-
- const getBatches = async (storage: any) => {
- await getCurrentVolume(storage);
- };
-
- const updateTokenBalances = (tokenBalances: any) => {
- try {
- console.log('tokenbalances', tokenBalances);
- setSocketTokenAmount(tokenBalances, userAddress, buyToken, setBuyBalance);
- console.log('updateBuyBalance', buyBalance);
-
- setSocketTokenAmount(tokenBalances, userAddress, sellToken, setSellBalance);
- console.log('updateSellBalance', sellBalance);
- } catch (error) {
- console.error('Unable to update token balances', error);
- }
- };
-
- const updateRate = (bigmaps: any) => {
- try {
- console.log('bigmaps', bigmaps);
- const numerator = bigmaps.content.value.rate.p;
- const denominator = bigmaps.content.value.rate.q;
-
- const scaledPow = buyToken.decimals - sellToken.decimals;
- const scaledRate = scaleAmountUp(numerator / denominator, scaledPow);
- setRate(scaledRate);
- } catch (error) {
- console.error('Unable to update rate', error);
- }
- };
-
- const updateTokenDetails = async (storage: any) => {
- try {
- setTokenPair(buyToken.name + '/' + sellToken.name);
-
- const valid_tokens = storage.valid_tokens;
- const token_map = new Map(Object.keys(valid_tokens).map((k) => [k, valid_tokens[k]]));
- const buyTokenData = token_map.get(buyToken.name);
- console.log('buyTokenAddress', buyToken.address);
- const sellTokenData = token_map.get(sellToken.name);
- console.log('sellTokenAddress', sellToken.address);
-
- const bToken: token = {
- token_id: buyTokenData.token_id,
- name: buyTokenData.name,
- address: buyTokenData.address,
- decimals: buyTokenData.decimals,
- standard: buyTokenData.standard,
- };
- const sToken: token = {
- token_id: sellTokenData.token_id,
- name: sellTokenData.name,
- address: sellTokenData.address,
- decimals: sellTokenData.decimals,
- standard: sellTokenData.standard,
- };
-
- if (buyToken != bToken) setBuyToken(bToken);
-
- if (sellToken != sToken) setSellToken(sToken);
- } catch (error) {
- console.error('Unable to update token details', error);
- }
- };
-
- const setOraclePrice = async (rates: any) => {
- if (rates.length != 0) {
- // eslint-disable-next-line @typescript-eslint/no-shadow
- console.info('rates', rates);
- console.info('tokenPair', tokenPair);
- const rt = rates.filter((r) => r.key == tokenPair)[0].value;
- const numerator = rt.rate.p;
- const denominator = rt.rate.q;
-
- const scaledPow = buyToken.decimals - sellToken.decimals;
- const scaledRate = scaleAmountUp(numerator / denominator, scaledPow);
- setRate(scaledRate);
- }
- };
-
- const getOraclePrice = async () => {
- await contractsService
- .getBigMapByNameKeys({
- address: REACT_APP_BATCHER_CONTRACT_HASH,
- name: 'rates_current',
- micheline: MichelineFormat.JSON,
- })
- .then((r) => setOraclePrice(r));
- };
-
- const [open, setOpen] = useState(false);
- const [swaps, setSwaps] = useState([]);
- const showDrawer = () => {
- setOpen(true);
- };
-
- const onClose = () => {
- setOpen(false);
- };
-
- const getPairs = () => {
- const swps = [];
- for (const keyvalue of tokenMap) {
- console.log(keyvalue);
- swps.push(keyvalue[0]);
- }
- setSwaps(swps);
- };
-
- const changeTokenPair = (e: RadioChangeEvent) => {
- const pair = e.target.value;
- console.log('pair changed', pair);
- setTokenPair(pair);
- const swp = tokenMap.get(pair);
- console.log('pair changed to ', swap);
- // Set Buy Token Details
- setBuyToken(swp.swap.from.token);
-
- // Set Sell Token Details
- setSellToken(swp.swap.to);
- };
-
- const generatePairs = () => {
- return (
- <>
- {swaps.map((swp) => (
-
-
- {swp}
-
-
- ))}
- >
- );
- };
-
- useEffect(() => {
- getPairs();
- }, [tokenMap]);
-
- // eslint-disable-next-line @typescript-eslint/no-shadow
- const renderRightContent = (content: ContentType) => {
- console.log('rendering content');
- switch (content) {
- case ContentType.SWAP:
- return (
-
- );
- case ContentType.VOLUME:
- return ;
- case ContentType.REDEEM_HOLDING:
- return (
-
- );
- case ContentType.ABOUT:
- return ;
- default:
- return (
-
- );
- }
- };
-
- const updateBigMapIds = (storage: any) => {
- try {
- setRatesBigMapId(storage.rates_current);
- setUserBatchOrderTypesBigMapId(storage.user_batch_ordertypes);
- setBatchesBigMapId(storage.batch_set.batches);
- } catch (error) {
- console.error('Unable to update bigmap ids', error);
- }
- };
-
- const getTokenBalance = async () => {
- try {
- let usrAddr = userAddress;
- if (userAddress === null) {
- if (initialState.userAddress !== null) {
- usrAddr = initialState.userAddress;
- }
- }
-
- if (usrAddr === null) {
- setBuyBalance(0);
- setSellBalance(0);
- } else {
- console.log('getTokenBalance-userAddress', usrAddr);
- const balanceURI = REACT_APP_TZKT_URI_API + '/v1/tokens/balances?account=' + usrAddr;
- console.log('getTokenBalance-balanceURI', balanceURI);
-
- const buyTokenData = await fetch(balanceURI + '&token.contract=' + buyToken.address, {
- method: 'GET',
- });
- const sellTokenData = await fetch(balanceURI + '&token.contract=' + sellToken.address, {
- method: 'GET',
- });
-
- try {
- await buyTokenData.json().then((balance) => {
- if (Array.isArray(balance)) {
- setTokenAmount(
- balance,
- buyBalance,
- buyToken.address,
- buyToken.decimals,
- setBuyBalance,
- );
- }
- });
- } catch (error) {
- console.error(error);
- }
- await sellTokenData.json().then((balance) => {
- if (Array.isArray(balance)) {
- setTokenAmount(
- balance,
- sellBalance,
- sellToken.address,
- sellToken.decimals,
- setSellBalance,
- );
- }
- });
- }
- } catch (error) {
- console.error('getTokenBalance-error', error);
- if (!userAddress) {
- setBuyBalance(0);
- setSellBalance(0);
- } else {
- setBuyBalance(-1);
- setSellBalance(-1);
- }
- }
- };
-
- const updateFromStorage = async (storage: any) => {
- updateBigMapIds(storage);
- zeroHoldings(storage, setOpenHoldings, setClearedHoldings);
- await updateTokenDetails(storage);
- await getBatches(storage);
- await updateSwapMap(storage);
- await setFee(storage);
- await getOraclePrice();
- await getTokenBalance();
- await updateHoldings(storage);
- await getCurrentVolume(storage);
- };
-
- const handleWebsocket = () => {
- connection.on('token_balances', (msg: any) => {
- if (!msg.data) return;
- updateTokenBalances(msg.data);
- });
-
- // This is the place handling operations and storages
- connection.on('operations', (msg: any) => {
- if (!msg.data) return;
- if (!msg.data[0].storage) return;
- console.info('#######WS###### - operations', msg.data[0].storage);
- updateFromStorage(msg.data[0].storage).then((r) => console.log(r));
- });
-
- connection.on('bigmaps', (msg: any) => {
- if (!msg.data) return;
- console.info('#######WS###### - bigmap', msg);
- for (let i = 0; i < Object.keys(msg.data).length; i++) {
- try {
- const m = msg.data[i];
- if (m.path == 'batch_set.batches') {
- const val = m.content.value;
- const batch_number = val.batch_number;
- const sts = Object.keys(val.status)[0];
- setStatusFromBatch(sts, m.content);
- }
-
- if (m.path == 'rates_current') {
- updateRate(m);
- }
- } catch (error: any) {
- console.error(error);
- }
- }
- });
- };
-
- const refreshStorage = async () => {
- pullStorage().then((s) => updateFromStorage(s));
- };
-
- useEffect(() => {
- refreshStorage().then((r) => console.log(r));
- init_contract().then((r) => console.log(r));
- handleWebsocket();
- }, []);
-
- useEffect(() => {
- if (initialState?.wallet !== null) {
- Tezos.setWalletProvider(initialState.wallet);
- }
- }, []);
- useEffect(() => {
- refreshStorage().then((r) => console.log(r));
- }, [buyToken.address, sellToken.address, updateAll]);
-
- useEffect(() => {
- console.log('User address changed - refreshing from storage');
- refreshStorage().then((r) => console.log(r));
- init_user(userAddress).then((r) => console.log(r));
- }, [userAddress]);
-
- return (
-
-
-
-
-
-
-
-
- }
- >
-
- {generatePairs()}
-
-
-
-
- {renderRightContent(content)}
-
-
-
-
-
-
- );
-};
-
-export default Welcome;
diff --git a/batcher-ui/src/reducers/events.ts b/batcher-ui/src/reducers/events.ts
new file mode 100644
index 00000000..c8329ed2
--- /dev/null
+++ b/batcher-ui/src/reducers/events.ts
@@ -0,0 +1,44 @@
+import { loop } from 'redux-loop';
+import { EventActions } from 'src/actions/events';
+import { newEventCmd } from 'src/commands/events';
+import { EventsState } from 'src/types';
+
+const initialState: EventsState = {
+ toast: {
+ isToastOpen: false,
+ toastDescription: '',
+ type: 'error',
+ },
+};
+
+export const eventReducer = (
+ state: EventsState = initialState,
+ action: EventActions
+) => {
+ switch (action.type) {
+ case 'NEW_EVENT':
+ return loop(state, newEventCmd(action.payload.event));
+ case 'NEW_INFO':
+ return {
+ ...state,
+ toast: {
+ isToastOpen: true,
+ toastDescription: action.payload.infoContent,
+ type: 'info',
+ },
+ };
+ case 'NEW_ERROR':
+ return {
+ ...state,
+ toast: {
+ isToastOpen: true,
+ toastDescription: action.payload.errorContent,
+ type: 'error',
+ },
+ };
+ case 'CLOSE_TOAST':
+ return initialState;
+ default:
+ return state;
+ }
+};
diff --git a/batcher-ui/src/reducers/exchange.ts b/batcher-ui/src/reducers/exchange.ts
new file mode 100644
index 00000000..06281505
--- /dev/null
+++ b/batcher-ui/src/reducers/exchange.ts
@@ -0,0 +1,219 @@
+import { Cmd, loop } from 'redux-loop';
+import {
+ ExchangeActions,
+ batcherUnsetup,
+ getCurrentBatchNumber,
+ getOraclePrice,
+ getPairsInfos,
+ newError,
+} from '../../src/actions';
+import {
+ BatcherStatus,
+ CurrentSwap,
+ ExchangeState,
+ PriceStrategy,
+} from '../../src/types';
+import {
+ fetchBatcherStatusCmd,
+ fetchCurrentBatchNumberCmd,
+ fetchPairInfosCmd,
+ fetchVolumesCmd,
+ fetchOraclePriceCmd,
+ setupBatcherCmd,
+} from '../../src/commands/exchange';
+import { getTimeDifference } from 'src/utils/utils';
+
+const initialSwap: CurrentSwap = {
+ swap: {
+ from: {
+ token: {
+ tokenId: 0,
+ name: 'tzBTC',
+ address: undefined,
+ decimals: 0,
+ standard: undefined,
+ },
+ amount: 0,
+ },
+ to: {
+ tokenId: 0,
+ name: 'USDT',
+ address: undefined,
+ decimals: 0,
+ standard: undefined,
+ },
+ },
+ isReverse: false,
+};
+
+const initialState: ExchangeState = {
+ priceStrategy: PriceStrategy.EXACT,
+ currentSwap: initialSwap,
+ batcherTimerId: 0,
+ batcherStatus: {
+ status: BatcherStatus.NONE,
+ at: null,
+ startTime: null,
+ remainingTime: 0,
+ },
+ swapPairName: 'tzBTC/USDT',
+ batchNumber: 0,
+ oraclePrice: 0,
+ volumes: {
+ sell: Object.keys(PriceStrategy).reduce(
+ (acc, k) => ({ ...acc, [k]: 0 }),
+ {}
+ ) as Record,
+ buy: Object.keys(PriceStrategy).reduce(
+ (acc, k) => ({ ...acc, [k]: 0 }),
+ {}
+ ) as Record,
+ },
+};
+
+const exchangeReducer = (
+ state: ExchangeState = initialState,
+ action: ExchangeActions
+) => {
+ if (!state) return initialState;
+ switch (action.type) {
+ case 'BATCHER_SETUP':
+ return loop(
+ state,
+ setupBatcherCmd(
+ state.batcherStatus.startTime,
+ state.batcherStatus.status
+ )
+ );
+ case 'BATCHER_TIMER_ID':
+ return { ...state, batcherTimerId: action.payload.timerId };
+ case 'BATCHER_UNSETUP':
+ return loop(state, Cmd.clearTimeout(state.batcherTimerId));
+ case 'CHANGE_PAIR':
+ return loop(
+ {
+ ...state,
+ swapPairName: action.payload.pair,
+ currentSwap: {
+ ...state.currentSwap,
+ isReverse: action.payload.isReverse,
+ },
+ },
+ Cmd.action(getPairsInfos(action.payload.pair))
+ );
+ case 'GET_PAIR_INFOS':
+ return loop(state, fetchPairInfosCmd(action.payload.pair));
+ case 'UPDATE_PAIR_INFOS': {
+ //! We hard code token_id because it's not in contract storage.
+ //! Update this when we use token with token_id != 0
+ return loop(
+ {
+ ...state,
+ swapPairName: action.payload.pair,
+ currentSwap: {
+ ...action.payload.currentSwap,
+ isReverse: state.currentSwap.isReverse,
+ swap: {
+ from: {
+ token: {
+ ...action.payload.currentSwap.swap.from.token,
+ tokenId: 0,
+ },
+ },
+ to: {
+ ...action.payload.currentSwap.swap.to,
+ tokenId: 0,
+ },
+ },
+ },
+ },
+ Cmd.list([
+ Cmd.action(getOraclePrice()),
+ Cmd.action(getCurrentBatchNumber()),
+ ])
+ );
+ }
+ case 'UDPATE_PRICE_STATEGY':
+ return {
+ ...state,
+ priceStrategy: action.payload.priceStrategy,
+ };
+ case 'REVERSE_SWAP':
+ return {
+ ...state,
+ currentSwap: {
+ ...state.currentSwap,
+ isReverse: !state.currentSwap.isReverse,
+ },
+ };
+ case 'GET_BATCHER_STATUS':
+ return loop(state, fetchBatcherStatusCmd(state.batchNumber));
+ case 'UDPATE_BATCHER_STATUS': {
+ const startTime =
+ action.payload.startTime || state.batcherStatus.startTime;
+ return loop(
+ {
+ ...state,
+ batcherStatus: {
+ ...action.payload,
+ startTime,
+ remainingTime: getTimeDifference(action.payload.status, startTime),
+ },
+ },
+ action.payload.status === BatcherStatus.CLOSED
+ ? Cmd.action(batcherUnsetup())
+ : Cmd.none
+ );
+ }
+ case 'UPDATE_REMAINING_TIME':
+ return {
+ ...state,
+ batcherStatus: {
+ ...state.batcherStatus,
+ remainingTime: getTimeDifference(
+ state.batcherStatus.status,
+ state.batcherStatus.startTime
+ ),
+ },
+ };
+ case 'GET_CURRENT_BATCHER_NUMBER':
+ return loop(state, fetchCurrentBatchNumberCmd(state.swapPairName));
+ case 'UDPATE_BATCH_NUMBER':
+ return loop(
+ {
+ ...state,
+ batchNumber: action.payload.batchNumber,
+ },
+ fetchBatcherStatusCmd(action.payload.batchNumber)
+ );
+ case 'GET_ORACLE_PRICE':
+ return loop(
+ state,
+ fetchOraclePriceCmd(state.swapPairName, state.currentSwap)
+ );
+ case 'UPDATE_ORACLE_PRICE':
+ return { ...state, oraclePrice: action.payload.oraclePrice };
+ case 'GET_VOLUMES':
+ return loop(state, fetchVolumesCmd(state.batchNumber));
+ case 'UPDATE_VOLUMES':
+ return { ...state, volumes: action.payload.volumes };
+ case 'NO_BATCH_ERROR':
+ return loop(
+ {
+ ...state,
+ batcherStatus: {
+ status: BatcherStatus.NONE,
+ at: null,
+ startTime: null,
+ remainingTime: 0,
+ },
+ batchNumber: 0,
+ },
+ Cmd.action(newError('No batch open for this pair.'))
+ );
+ default:
+ return state;
+ }
+};
+
+export default exchangeReducer;
diff --git a/batcher-ui/src/reducers/holdings.ts b/batcher-ui/src/reducers/holdings.ts
new file mode 100644
index 00000000..cc9ddabd
--- /dev/null
+++ b/batcher-ui/src/reducers/holdings.ts
@@ -0,0 +1,26 @@
+import { Cmd, loop } from 'redux-loop';
+import { HoldingsActions } from 'src/actions/holdings';
+import { fetchHoldingsCmd } from 'src/commands/holdings';
+import { HoldingsState } from 'src/types';
+
+const initialState: HoldingsState = {
+ open: { tzBTC: 0, USDT: 0, EURL: 0 },
+ cleared: { tzBTC: 0, USDT: 0, EURL: 0 },
+};
+
+export const holdingsReducer = (
+ state: HoldingsState = initialState,
+ action: HoldingsActions
+) => {
+ switch (action.type) {
+ case 'REDEEM':
+ //TODO redeem with Redux
+ return loop(state, Cmd.none);
+ case 'UPDATE_HOLDINGS':
+ return { ...state, ...action.payload.holdings };
+ case 'GET_HOLDINGS':
+ return loop(state, fetchHoldingsCmd(action.payload.userAddress));
+ default:
+ return state;
+ }
+};
diff --git a/batcher-ui/src/reducers/index.ts b/batcher-ui/src/reducers/index.ts
new file mode 100644
index 00000000..1a1f79a4
--- /dev/null
+++ b/batcher-ui/src/reducers/index.ts
@@ -0,0 +1,63 @@
+import { LoopReducer, combineReducers } from 'redux-loop';
+import exchangeReducer from './exchange';
+import walletReducer from './wallet';
+import {
+ AppState,
+ EventsState,
+ ExchangeState,
+ HoldingsState,
+ WalletState,
+} from '../types';
+import { eventReducer } from './events';
+import { holdingsReducer } from './holdings';
+
+// Wallet selectors
+export const userAddressSelector = (state: AppState) => {
+ return state.wallet.userAddress;
+};
+
+export const userBalancesSelector = (state: AppState) =>
+ state.wallet.userBalances;
+
+// Exchange selectors
+export const priceStrategySelector = (state: AppState) =>
+ state.exchange.priceStrategy;
+
+export const currentSwapSelector = (state: AppState) =>
+ state.exchange.currentSwap;
+
+export const currentPairSelector = (state: AppState) =>
+ state.exchange.swapPairName;
+
+export const batcherStatusSelector = (state: AppState) =>
+ state.exchange.batcherStatus.status;
+
+export const batcherStatusTimeSelector = (state: AppState) =>
+ state.exchange.batcherStatus.at;
+
+export const batchStartTimeSelector = (state: AppState) =>
+ state.exchange.batcherStatus.startTime;
+
+export const remainingTimeSelector = (state: AppState) =>
+ state.exchange.batcherStatus.remainingTime;
+
+export const batchNumberSelector = (state: AppState) =>
+ state.exchange.batchNumber;
+
+export const oraclePriceSelector = (state: AppState) =>
+ state.exchange.oraclePrice;
+
+export const volumesSelector = (state: AppState) => state.exchange.volumes;
+
+// Holdings selectors
+export const getHoldings = (state: AppState) => state.holdings;
+
+// Events selectors
+export const getToastInfosSelector = (state: AppState) => state.events.toast;
+
+export default combineReducers({
+ exchange: exchangeReducer as LoopReducer,
+ wallet: walletReducer as LoopReducer,
+ events: eventReducer as LoopReducer,
+ holdings: holdingsReducer as LoopReducer,
+});
diff --git a/batcher-ui/src/reducers/wallet.ts b/batcher-ui/src/reducers/wallet.ts
new file mode 100644
index 00000000..597167ba
--- /dev/null
+++ b/batcher-ui/src/reducers/wallet.ts
@@ -0,0 +1,50 @@
+import { WalletActions } from 'src/actions';
+import { Loop, liftState, loop } from 'redux-loop';
+import { fetchUserBalancesCmd } from '../commands/wallet';
+import { WalletState } from 'src/types';
+import { TOKENS } from 'src/utils/utils';
+
+const initialState: WalletState = {
+ userAddress: undefined,
+ userBalances: TOKENS.reduce((acc, current) => ({ ...acc, [current]: 0 }), {}),
+};
+
+const walletReducer = (
+ state: WalletState = initialState,
+ action: WalletActions
+): Loop | WalletState => {
+ if (!state) return liftState(initialState);
+ switch (action.type) {
+ case 'GOT_USER_BALANCES':
+ return {
+ ...state,
+ userBalances: action.balances.reduce(
+ (acc, current) => ({
+ ...acc,
+ [current.name.toUpperCase()]: current.balance,
+ }),
+ {}
+ ),
+ };
+ case 'FETCH_USER_BALANCES':
+ return loop(state, fetchUserBalancesCmd(state.userAddress));
+ case 'CONNECTED_WALLET':
+ return {
+ ...state,
+ userAddress: action.payload.userAddress,
+ };
+ case 'DISCONNECTED_WALLET':
+ return {
+ ...state,
+ userAddress: undefined,
+ userBalances: TOKENS.reduce(
+ (acc, current) => ({ ...acc, [current]: 0 }),
+ {}
+ ),
+ };
+ default:
+ return state;
+ }
+};
+
+export default walletReducer;
diff --git a/batcher-ui/src/service-worker.js b/batcher-ui/src/service-worker.js
deleted file mode 100644
index b86726cd..00000000
--- a/batcher-ui/src/service-worker.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/* eslint-disable no-restricted-globals */
-/* eslint-disable no-underscore-dangle */
-/* globals workbox */
-workbox.core.setCacheNameDetails({
- prefix: 'antd-pro',
- suffix: 'v5',
-});
-// Control all opened tabs ASAP
-workbox.clientsClaim();
-
-/**
- * Use precaching list generated by workbox in build process.
- * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.precaching
- */
-workbox.precaching.precacheAndRoute(self.__precacheManifest || []);
-
-/**
- * Register a navigation route.
- * https://developers.google.com/web/tools/workbox/modules/workbox-routing#how_to_register_a_navigation_route
- */
-workbox.routing.registerNavigationRoute('/index.html');
-
-/**
- * Use runtime cache:
- * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.routing#.registerRoute
- *
- * Workbox provides all common caching strategies including CacheFirst, NetworkFirst etc.
- * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.strategies
- */
-
-/** Handle API requests */
-workbox.routing.registerRoute(/\/api\//, workbox.strategies.networkFirst());
-
-/** Handle third party requests */
-workbox.routing.registerRoute(
- /^https:\/\/gw\.alipayobjects\.com\//,
- workbox.strategies.networkFirst(),
-);
-workbox.routing.registerRoute(
- /^https:\/\/cdnjs\.cloudflare\.com\//,
- workbox.strategies.networkFirst(),
-);
-workbox.routing.registerRoute(/\/color.less/, workbox.strategies.networkFirst());
-
-/** Response to client after skipping waiting with MessageChannel */
-addEventListener('message', (event) => {
- const replyPort = event.ports[0];
- const message = event.data;
- if (replyPort && message && message.type === 'skip-waiting') {
- event.waitUntil(
- self.skipWaiting().then(
- () => {
- replyPort.postMessage({
- error: null,
- });
- },
- (error) => {
- replyPort.postMessage({
- error,
- });
- },
- ),
- );
- }
-});
diff --git a/batcher-ui/src/store.ts b/batcher-ui/src/store.ts
new file mode 100644
index 00000000..a01ab805
--- /dev/null
+++ b/batcher-ui/src/store.ts
@@ -0,0 +1,28 @@
+import {
+ legacy_createStore as createStore,
+ compose,
+ applyMiddleware,
+} from 'redux';
+import { install, LoopReducer, StoreCreator } from 'redux-loop';
+import { createLogger } from 'redux-logger';
+import rootReducer from './reducers';
+import { AppState } from './types';
+
+const enhancedStore = createStore as StoreCreator;
+
+const loopReducer = rootReducer as LoopReducer;
+
+const logger = createLogger({
+ collapsed: true,
+ diff: true,
+});
+
+export const store = enhancedStore(
+ loopReducer,
+ undefined,
+ compose(install(), applyMiddleware(logger))
+);
+
+// Infer the `RootState` and `AppDispatch` types from the store itself
+export type RootState = ReturnType;
+export type AppDispatch = typeof store.dispatch;
diff --git a/batcher-ui/src/types/contract.ts b/batcher-ui/src/types/contract.ts
new file mode 100644
index 00000000..c579abcd
--- /dev/null
+++ b/batcher-ui/src/types/contract.ts
@@ -0,0 +1,149 @@
+export enum BatcherStatus {
+ OPEN = 'OPEN',
+ CLOSED = 'CLOSED',
+ CLEARED = 'CLEARED',
+ NONE = 'NONE',
+}
+
+export enum PriceStrategy {
+ WORSE = 'WORSE',
+ EXACT = 'EXACT',
+ BETTER = 'BETTER',
+}
+
+// ------ BATCHER STORAGE REPRESENTATION ------ //
+
+export type TokenNames = 'tzBTC' | 'EURL' | 'USDT';
+export type SwapNames = 'tzBTC/USDT' | 'tzBTC/EURL';
+
+type Swap = {
+ from: {
+ token: ContractToken;
+ amount: string;
+ };
+ to: ContractToken;
+};
+
+export type ContractToken = {
+ name: TokenNames;
+ address: string;
+ decimals: string;
+ standard: 'FA1.2 token' | 'FA2 token';
+};
+
+export type VolumesStorage = {
+ buy_minus_volume: string;
+ buy_exact_volume: string;
+ buy_plus_volume: string;
+ sell_minus_volume: string;
+ sell_exact_volume: string;
+ sell_plus_volume: string;
+};
+
+export type PairStorage = {
+ address_0: string;
+ address_1: string;
+ decimals_0: string;
+ decimals_1: string;
+ name_0: string;
+ name_1: string;
+ standard_0: string;
+ standard_1: string;
+};
+
+type P = {
+ [key in K]: {};
+};
+
+export type UserOrder = {
+ key: {
+ side: P<'buy'> | P<'sell'>;
+ tolerance: P<'exact'> | P<'minus'> | P<'plus'>;
+ };
+ value: string; //! amount in mutez
+};
+
+export type BatchStatusOpen = { open: string };
+export type BatchStatusClosed = {
+ closed: { closing_time: string; start_time: string };
+};
+
+type Rate = {
+ swap: Swap;
+ rate: { p: string; q: string }; // float (Rational.t)
+ when: string; // timestamp
+};
+
+export type BatchStatusCleared = {
+ cleared: {
+ at: string;
+ clearing: {
+ clearing_rate: Rate;
+ clearing_tolerance: P<'exact'> | P<'minus'> | P<'plus'>;
+ clearing_volumes: { exact: string; minus: string; plus: string };
+ total_cleared_volumes: {
+ buy_side_total_cleared_volume: string;
+ buy_side_volume_subject_to_clearing: string;
+ sell_side_total_cleared_volume: string;
+ sell_side_volume_subject_to_clearing: string;
+ };
+ };
+ rate: Rate;
+ };
+};
+
+export type BatcherStatusStorage =
+ | BatchStatusOpen
+ | BatchStatusClosed
+ | BatchStatusCleared;
+
+export const batchIsCleared = (
+ status: BatcherStatusStorage
+): status is BatchStatusCleared => {
+ return Object.keys(status)[0] === 'cleared';
+};
+
+export type BatcherStorage = {
+ metadata: number; //! ID of metadata bigmap
+ valid_tokens: Record;
+ valid_swaps: Record<
+ SwapNames,
+ {
+ swap: Swap;
+ is_disabled_for_deposits: boolean;
+ oracle_address: string;
+ oracle_precision: string;
+ oracle_asset_name: string;
+ }
+ >;
+ rates_current: number; //! ID of rates_current bigmap
+ fee_in_mutez: number;
+ batch_set: {
+ batches: number; //! ID of batches bigmap
+ current_batch_indices: Record; //! Ex: tzBTC/USDT: "300"
+ };
+ administrator: string; //! Address to admin
+ fee_recipient: string; //! Address
+ last_order_number: string; //! number in string
+ user_batch_ordertypes: number; //! ID of order book bigmap
+ limit_on_tokens_or_pairs: string; //! 10 per default
+ deposit_time_window_in_seconds: string; //! 600 at this time
+ scale_factor_for_oracle_staleness: string; //! "1"
+};
+
+export type RatesCurrentBigmap = {
+ swap: Swap;
+ rate: { p: string; q: string }; // float (Rational.t)
+ when: string; // timestamp
+};
+
+export type BatchBigmap = {
+ batch_number: string;
+ volumes: VolumesStorage;
+ status: BatcherStatusStorage;
+ pair: PairStorage;
+};
+
+export type OrderBookBigmap = {
+ [key: string]: Array;
+};
diff --git a/batcher-ui/src/types/events.ts b/batcher-ui/src/types/events.ts
new file mode 100644
index 00000000..f36b2792
--- /dev/null
+++ b/batcher-ui/src/types/events.ts
@@ -0,0 +1,24 @@
+import { RatesCurrentBigmap, BatchBigmap, OrderBookBigmap } from './contract';
+
+export type BigMapEvent = {
+ data: Array;
+ state: number;
+ type: number;
+};
+
+type BigMapEventData = {
+ action: 'update_key' | 'add_key' | 'remove_key' | 'remove';
+ bigmap: number; // bigmapId
+ content: BigMapEventDataContent;
+ contract: { address: string };
+ id: number;
+ level: number;
+ path: 'batch_set.batches' | 'rates_current' | 'user_batch_ordertypes'; // path in bigmap
+ timestamp: string;
+};
+
+type BigMapEventDataContent = {
+ hash: string;
+ key: string;
+ value: RatesCurrentBigmap | BatchBigmap | OrderBookBigmap;
+};
diff --git a/batcher-ui/src/types/index.ts b/batcher-ui/src/types/index.ts
new file mode 100644
index 00000000..aaee1352
--- /dev/null
+++ b/batcher-ui/src/types/index.ts
@@ -0,0 +1,3 @@
+export * from './contract';
+export * from './state';
+export * from './events';
\ No newline at end of file
diff --git a/batcher-ui/src/types/state.ts b/batcher-ui/src/types/state.ts
new file mode 100644
index 00000000..2a76b108
--- /dev/null
+++ b/batcher-ui/src/types/state.ts
@@ -0,0 +1,66 @@
+import { BatcherStatus, PriceStrategy, SwapNames } from './contract';
+
+type Token = {
+ address: string | undefined;
+ name: string;
+ decimals: number;
+ standard: 'FA1.2 token' | 'FA2 token' | undefined;
+ tokenId: 0;
+};
+
+export type CurrentSwap = {
+ swap: {
+ from: {
+ token: Token;
+ amount: number;
+ };
+ to: Token;
+ };
+ isReverse: boolean;
+};
+
+export type VolumesState = {
+ buy: Record;
+ sell: Record;
+};
+
+export type ExchangeState = {
+ priceStrategy: PriceStrategy;
+ currentSwap: CurrentSwap;
+ batcherStatus: {
+ status: BatcherStatus;
+ at: string | null;
+ startTime: string | null;
+ remainingTime: number;
+ };
+ batcherTimerId: number;
+ swapPairName: SwapNames;
+ batchNumber: number;
+ oraclePrice: number;
+ volumes: VolumesState;
+};
+
+export type WalletState = {
+ userAddress: string | undefined;
+ userBalances: Record;
+};
+
+export type HoldingsState = {
+ open: Record;
+ cleared: Record;
+};
+
+export type EventsState = {
+ toast: {
+ isToastOpen: boolean;
+ toastDescription: string;
+ type: 'info' | 'error';
+ };
+};
+
+export type AppState = {
+ exchange: ExchangeState;
+ wallet: WalletState;
+ events: EventsState;
+ holdings: HoldingsState;
+};
diff --git a/batcher-ui/src/typings.d.ts b/batcher-ui/src/typings.d.ts
deleted file mode 100644
index c6d7703b..00000000
--- a/batcher-ui/src/typings.d.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-declare module 'slash2';
-declare module '*.css';
-declare module '*.less';
-declare module '*.scss';
-declare module '*.sass';
-declare module '*.svg';
-declare module '*.png';
-declare module '*.jpg';
-declare module '*.jpeg';
-declare module '*.gif';
-declare module '*.bmp';
-declare module '*.tiff';
-declare module 'omit.js';
-declare module 'numeral';
-declare module '@antv/data-set';
-declare module 'mockjs';
-declare module 'react-fittext';
-declare module 'bizcharts-plugin-slider';
-
-// preview.pro.ant.design only do not use in your production ;
-// preview.pro.ant.design Dedicated environment variable, please do not use it in your project.
-declare let ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: 'site' | undefined;
-
-declare const REACT_APP_ENV: 'test' | 'dev' | 'pre' | false;
-
-declare const REACT_APP_NETWORK_TARGET;
-declare const REACT_APP_TEZOS_NODE_URI;
-declare const REACT_APP_TZKT_URI_API;
-declare const REACT_APP_BATCHER_CONTRACT_HASH;
-declare const REACT_APP_TZBTC_HASH;
-declare const REACT_APP_USDT_HASH;
-declare const REACT_APP_BATCHER_URI;
-declare const REACT_APP_PATH_TO_BATCHER_LOGO;
-declare const GA_TRACKING_ID;
diff --git a/batcher-ui/src/utils/local-storage.ts b/batcher-ui/src/utils/local-storage.ts
new file mode 100644
index 00000000..316b9c4a
--- /dev/null
+++ b/batcher-ui/src/utils/local-storage.ts
@@ -0,0 +1,16 @@
+const setByKey = (key: string, content?: unknown) => {
+ if (!content) return localStorage.removeItem(key);
+ const serializedContent = JSON.stringify(content);
+ return localStorage.setItem(key, serializedContent);
+};
+
+const getByKey = (key: string) => {
+ const content = localStorage.getItem(key);
+
+ if (content) {
+ return JSON.parse(content);
+ }
+ return null;
+};
+
+export { setByKey, getByKey };
diff --git a/batcher-ui/src/utils/utils.ts b/batcher-ui/src/utils/utils.ts
new file mode 100644
index 00000000..43216700
--- /dev/null
+++ b/batcher-ui/src/utils/utils.ts
@@ -0,0 +1,679 @@
+import {
+ add,
+ differenceInMilliseconds,
+ differenceInMinutes,
+ parseISO,
+} from 'date-fns';
+import {
+ BatcherStatus,
+ CurrentSwap,
+ UserOrder,
+ HoldingsState,
+ VolumesState,
+ VolumesStorage,
+ batchIsCleared,
+ BatcherStorage,
+ BatchBigmap,
+ OrderBookBigmap,
+ TokenNames,
+ SwapNames,
+ RatesCurrentBigmap,
+} from '../types';
+import { NetworkType } from '@airgap/beacon-sdk';
+import { getByKey } from './local-storage';
+
+export const scaleAmountDown = (amount: number, decimals: number) => {
+ const scale = 10 ** -decimals;
+ return amount * scale;
+};
+export const scaleAmountUp = (amount: number, decimals: number) => {
+ const scale = 10 ** decimals;
+ return amount * scale;
+};
+
+// Contract error codes
+var error_codes = new Map([
+ [100, 'No rate available for swap '],
+ [101, 'Invalid token address '],
+ [102, 'Invalid tezos address'],
+ [103, 'No open batch for deposits'],
+ [104, 'Batch should be cleared'],
+ [105, 'Trying to close batch which is not open'],
+ [106, 'Unable to parse side from external order'],
+ [107, 'Unable to parse tolerance from external order'],
+ [108, 'Token standard not found'],
+ [109, 'Xtz not currently supported'],
+ [110, 'Unsupported swap type'],
+ [111, 'Unable to reduce token amount to less than zero'],
+ [112, 'Too many unredeemed orders'],
+ [113, 'Insufficient swap fee'],
+ [114, 'Sender not administrator'],
+ [115, 'Token already exists but details are different'],
+ [116, 'Swap already exists'],
+ [117, 'Swap does not exist'],
+ [118, 'Endpoint does not accept tez'],
+ [119, 'Number is not a nat'],
+ [120, 'Oracle price is stale'],
+ [121, 'Oracle price is not timely'],
+ [122, 'Unable to get price from oracle'],
+ [123, 'Unable to get price from new oracle source'],
+ [124, 'Oracle price should be available before deposit'],
+ [125, 'Swap is disabled for deposits'],
+ [126, 'Upper limit on tokens has been reached'],
+ [127, 'Upper limit on swap pairs has been reached'],
+ [128, 'Cannot reduce limit on tokens to less than already exists'],
+ [129, 'Cannot reduce limit on swap pairs to less than already exists'],
+ [130, 'More tez sent than fee cost'],
+ [131, 'Cannot update deposit window to less than the minimum'],
+ [132, 'Cannot update deposit window to more than the maximum'],
+ [133, 'Oracle must be equal to minimum precision'],
+ [134, 'Swap precision is less than minimum'],
+ [135, 'Cannot update scale factor to less than the minimum'],
+ [136, 'Cannot update scale factor to more than the maximum'],
+ [137, 'Cannot remove swap pair that is not disabled'],
+]);
+export const getErrorMess = (error: any) => {
+ try {
+ console.info('Error Message', error);
+ const error_data_size = error.data.length;
+ console.info('Error Data Length', error_data_size);
+ const error_code = error.data[error_data_size - 1].with.int;
+ const error_message = error_codes.get(parseInt(error_code));
+ return error_message;
+ } catch {
+ return error instanceof Error ? error.message : 'Unknown error';
+ }
+};
+
+export const getNetworkType = () => {
+ const network = process.env.NEXT_PUBLIC_NETWORK_TARGET;
+ if (network?.includes('GHOSTNET')) {
+ return NetworkType.GHOSTNET;
+ } else {
+ return NetworkType.MAINNET;
+ }
+};
+
+// ----- BALANCES ------
+
+export type Balances = {
+ name: string;
+ balance: number;
+ decimals: number;
+}[];
+
+type TokenBalance = {
+ address: string;
+ balance: string;
+ token: {
+ contract: { address: string };
+ standard: string;
+ tokenId: string;
+ metadata: {
+ name: string;
+ symbol: string;
+ decimals: string;
+ thumbnailUri: string;
+ };
+ };
+};
+
+const checkStatus = (response: Response, noContentReturnValue?: unknown) => {
+ if (!response.ok) return Promise.reject('FETCH_ERROR');
+ if (response.status === 204) {
+ //! No content
+ return Promise.resolve(noContentReturnValue);
+ }
+ return response.json();
+};
+
+// TODO: need to configure token available in Batcher
+export const TOKENS = ['USDT', 'EURL', 'TZBTC'];
+
+export const getTokensBalancesByAccount = (userAddress: string) =>
+ fetch(
+ `${process.env.NEXT_PUBLIC_TZKT_URI_API}/v1/tokens/balances?account=${userAddress}`
+ ).then(checkStatus);
+
+export const getBalances = async (userAddress: string): Promise => {
+ const storage = await getStorage();
+ const validTokens: BatcherStorage['valid_tokens'] = storage['valid_tokens'];
+ const rawBalances = await getTokensBalancesByAccount(userAddress);
+
+ return Object.values(validTokens).map(token => {
+ const balance = rawBalances.find(
+ (b: TokenBalance) => b.token?.contract?.address === token.address
+ )?.balance;
+ const decimals = parseInt(token.decimals, 10);
+ return {
+ name: token.name,
+ decimals,
+ balance: balance ? scaleAmountDown(parseFloat(balance), decimals) : 0,
+ };
+ });
+};
+
+// ----- FETCH STORAGE AND BIGMAPS ------
+
+export const getStorage = (): Promise =>
+ fetch(
+ `${process.env.NEXT_PUBLIC_TZKT_URI_API}/v1/contracts/${process.env.NEXT_PUBLIC_BATCHER_CONTRACT_HASH}/storage`
+ ).then(checkStatus);
+
+export const getBigMapByIdAndUserAddress = (
+ userAddress?: string
+): Promise => {
+ const bigMapId: string | null = getByKey('user_batch_ordertypes');
+ if (!userAddress || !bigMapId)
+ return Promise.reject('No address or no bigmap ID for order book.');
+ return (
+ fetch(
+ `${process.env.NEXT_PUBLIC_TZKT_URI_API}/v1/bigmaps/${bigMapId}/keys/${userAddress}`
+ )
+ // TODO: improve that by parseStatus function
+ .then(response => checkStatus(response, { value: [] }))
+ .then(r => r.value)
+ );
+};
+
+export const getBigMapByIdAndBatchNumber = (
+ batchNumber: number
+): Promise => {
+ const bigMapId: string | null = getByKey('batches');
+ if (!bigMapId) return Promise.reject('No bigmap ID for batches.');
+ return fetch(
+ `${process.env.NEXT_PUBLIC_TZKT_URI_API}/v1/bigmaps/${bigMapId}/keys/${batchNumber}`
+ )
+ .then(checkStatus)
+ .then(r => r.value);
+};
+
+export const getBigMapByIdAndTokenPair = (
+ tokenPair: string
+): Promise> => {
+ const bigMapId: string | null = getByKey('rates_current');
+ if (!bigMapId) return Promise.reject('No bigmap ID for rates_current.');
+
+ return fetch(
+ `${process.env.NEXT_PUBLIC_TZKT_URI_API}/v1/bigmaps/${bigMapId}/keys`
+ )
+ .then(checkStatus)
+ .then(response =>
+ response.filter((r: any) => r.key === tokenPair).map((r: any) => r.value)
+ );
+};
+
+export const getTokensMetadata = async () => {
+ const storage = await getStorage();
+ const validTokens = storage['valid_tokens'];
+ return Promise.all(
+ Object.values(validTokens).map(async token => {
+ const icon = await fetch(
+ `${process.env.NEXT_PUBLIC_TZKT_URI_API}/v1/tokens?contract=${token.address}`
+ )
+ .then(t => t.json())
+ .then(([t]) =>
+ t.metadata.thumbnailUri
+ ? `https://ipfs.io/ipfs/${t.metadata.thumbnailUri.split('//')[1]}`
+ : undefined
+ );
+
+ return {
+ name: token.name,
+ address: token.address,
+ icon,
+ };
+ })
+ );
+};
+
+// ----- FETCH CONTRACT INFORMATIONS AND PARSING ------
+
+export const getPairsInformations = async (
+ pair: string
+): Promise<{ currentSwap: Omit; pair: string }> => {
+ const storage = await getStorage();
+ const validTokens = storage['valid_tokens'];
+ const pairs = pair.split('/') as TokenNames[];
+
+ return {
+ currentSwap: {
+ swap: {
+ from: {
+ token: {
+ ...validTokens[pairs[0]],
+ decimals: parseInt(validTokens[pairs[0]].decimals, 10),
+ tokenId: 0, //! HARD CODED
+ },
+ amount: 0,
+ },
+ to: {
+ ...validTokens[pairs[1]],
+ decimals: parseInt(validTokens[pairs[1]].decimals, 10),
+ tokenId: 0, //! HARD CODED
+ },
+ },
+ },
+ pair,
+ };
+};
+
+export const getFees = async () => {
+ const storage = await getStorage();
+ const feeInMutez: number = storage['fee_in_mutez'];
+ return feeInMutez;
+};
+
+export const fetchCurrentBatchNumber = async (
+ pair: SwapNames
+): Promise => {
+ const storage = await getStorage();
+ const currentBatchIndices = storage['batch_set']['current_batch_indices'];
+ if (!currentBatchIndices || !currentBatchIndices[pair]) {
+ return Promise.reject('No batch for this pair.');
+ }
+ return parseInt(currentBatchIndices[pair], 10);
+};
+
+const toBatcherStatus = (rawStatus: string): BatcherStatus => {
+ switch (rawStatus) {
+ case 'cleared':
+ return BatcherStatus.CLEARED;
+ case 'closed':
+ return BatcherStatus.CLOSED;
+ case 'open':
+ return BatcherStatus.OPEN;
+ default:
+ return BatcherStatus.NONE;
+ }
+};
+
+const getStatusTime = (status: string, batch: any) => {
+ switch (status) {
+ case 'open':
+ return batch.status[status];
+ case 'closed':
+ return batch.status[status].closing_time;
+ case 'cleared':
+ return batch.status[status].at;
+ default:
+ return null;
+ }
+};
+
+const getStartTime = (status: string, batch: any) => {
+ switch (status) {
+ case 'open':
+ return batch.status[status];
+ case 'closed':
+ return batch.status[status].start_time;
+ default:
+ return null;
+ }
+};
+
+export const getBatcherStatus = async (
+ batchNumber: number
+): Promise<{ status: BatcherStatus; at: string; startTime: string | null }> => {
+ const batch = await getBigMapByIdAndBatchNumber(batchNumber);
+ return mapStatus(batch);
+};
+
+export const mapStatus = (batch: BatchBigmap) => {
+ const s = Object.keys(batch.status)[0];
+ return {
+ status: toBatcherStatus(s),
+ at: new Date(getStatusTime(s, batch)).toISOString(),
+ startTime: getStartTime(s, batch)
+ ? new Date(getStartTime(s, batch)).toISOString()
+ : null,
+ };
+};
+
+export const getTimeDifference = (
+ status: BatcherStatus,
+ startTime: string | null
+) => {
+ if (status === BatcherStatus.OPEN && startTime) {
+ const now = new Date();
+ const open = parseISO(startTime);
+ const batcherClose = add(open, { minutes: 10 });
+ const diff = differenceInMinutes(batcherClose, now);
+ return diff < 0 ? 0 : diff;
+ }
+ return 0;
+};
+
+export const getTimeDifferenceInMs = (
+ status: BatcherStatus,
+ startTime: string | null
+) => {
+ if (status === BatcherStatus.OPEN && startTime) {
+ const now = new Date();
+ const open = parseISO(startTime);
+ const batcherClose = add(open, { minutes: 10 });
+ const diff = differenceInMilliseconds(batcherClose, now);
+ return diff < 0 ? 0 : diff;
+ }
+ return 0;
+};
+
+export const getCurrentRates = async (tokenPair: string) =>
+ await getBigMapByIdAndTokenPair(tokenPair);
+
+export const computeOraclePrice = (
+ rate: { p: string; q: string },
+ { buyDecimals, sellDecimals }: { buyDecimals: number; sellDecimals: number }
+) => {
+ const numerator = parseInt(rate.p);
+ const denominator = parseInt(rate.q);
+ const scaledPow = sellDecimals - buyDecimals;
+ return scaleAmountUp(numerator / denominator, scaledPow);
+};
+
+// ---- VOLUMES ----
+
+export const scaleStringAmountDown = (amount: string, decimals: number) => {
+ if (!amount) {
+ console.error('scaleStringAmountDown - amount is undefined', amount);
+ return 0;
+ } else {
+ const scale = 10 ** -decimals;
+ return Number.parseInt(amount) * scale;
+ }
+};
+
+export const toVolumes = (
+ rawVolumes: VolumesStorage,
+ { buyDecimals, sellDecimals }: { buyDecimals: number; sellDecimals: number }
+): VolumesState => {
+ return {
+ sell: {
+ BETTER: scaleStringAmountDown(rawVolumes.sell_plus_volume, sellDecimals),
+ EXACT: scaleStringAmountDown(rawVolumes.sell_exact_volume, sellDecimals),
+ WORSE: scaleStringAmountDown(rawVolumes.sell_minus_volume, sellDecimals),
+ },
+ buy: {
+ BETTER: scaleStringAmountDown(rawVolumes.buy_plus_volume, buyDecimals),
+ EXACT: scaleStringAmountDown(rawVolumes.buy_exact_volume, buyDecimals),
+ WORSE: scaleStringAmountDown(rawVolumes.buy_minus_volume, buyDecimals),
+ },
+ };
+};
+
+export const getVolumes = async (batchNumber: number) => {
+ const batch = await getBigMapByIdAndBatchNumber(batchNumber);
+ return toVolumes(batch['volumes'], {
+ buyDecimals: parseInt(batch.pair.decimals_0, 10),
+ sellDecimals: parseInt(batch.pair.decimals_1, 10),
+ });
+};
+
+// ---- HOLDINGS ----
+
+const convertHoldingToPayout = (
+ fromAmount: number, //! nb total que le user a deposé dans le batch
+ fromVolumeSubjectToClearing: number, //! nb total que le user a deposé (que l'on pourrait clear)
+ fromClearedVolume: number, //! nb total de tokens 'buy' qui a honoré l'ordre
+ toClearedVolume: number, //! nb total de tokens 'sell' qui a honoré l'ordre
+ fromDecimals: number,
+ toDecimals: number
+) => {
+ const prorata = fromAmount / fromVolumeSubjectToClearing;
+ const payout = toClearedVolume * prorata;
+ const payoutInFromTokens = fromClearedVolume * prorata;
+ const remainder = fromAmount - payoutInFromTokens;
+ const scaled_payout = Math.floor(payout) / 10 ** toDecimals;
+ const scaled_remainder = Math.floor(remainder) / 10 ** fromDecimals;
+
+ return [scaled_payout, scaled_remainder];
+};
+
+const findTokensForBatch = (batch: BatchBigmap) => {
+ const pair = batch.pair;
+ const tkns = {
+ // buy_token_name: pair.name_0,
+ // sell_token_name: pair.name_1,
+ to: { name: pair.name_0, decimals: parseInt(pair.decimals_0, 10) },
+ from: { name: pair.name_1, decimals: parseInt(pair.decimals_1, 10) },
+ };
+ return tkns;
+};
+
+const wasInClearingForBatch = (
+ side: 'sell' | 'buy',
+ tolerance: 'minus' | 'exact' | 'plus',
+ clearingTolerance: 'minus' | 'exact' | 'plus'
+) => {
+ const toNumber = (x: 'minus' | 'exact' | 'plus'): -1 | 0 | 1 =>
+ x === 'minus' ? -1 : x === 'exact' ? 0 : 1;
+
+ const clearingToleranceNumber = toNumber(
+ clearingTolerance as 'minus' | 'exact' | 'plus'
+ );
+ const toleranceNumber = toNumber(tolerance as 'minus' | 'exact' | 'plus');
+
+ if (side === 'buy') {
+ return clearingToleranceNumber >= toleranceNumber;
+ }
+ return clearingToleranceNumber <= toleranceNumber;
+};
+
+const getSideFromDeposit = (deposit: UserOrder) => {
+ const rawSide = Object.keys(deposit.key.side)[0];
+ if (rawSide !== 'buy' && rawSide !== 'sell')
+ throw new Error('Unable to parse side.');
+ return rawSide;
+};
+
+const getTolerance = (obj: {}) => {
+ const rawTolerance = Object.keys(obj)[0];
+ if (
+ rawTolerance !== 'minus' &&
+ rawTolerance !== 'exact' &&
+ rawTolerance !== 'plus'
+ )
+ throw new Error('Unable to parse tolerance.');
+
+ return rawTolerance;
+};
+
+const computeHoldingsByBatchAndDeposit = (
+ deposit: UserOrder,
+ batch: BatchBigmap,
+ currentHoldings: HoldingsState
+) => {
+ const side = getSideFromDeposit(deposit);
+
+ const tokens = findTokensForBatch(batch);
+ if (batchIsCleared(batch.status)) {
+ const clearing = batch.status['cleared'].clearing;
+ const clearedVolumes = {
+ cleared: {
+ from: parseInt(
+ clearing.total_cleared_volumes.sell_side_total_cleared_volume,
+ 10
+ ),
+ to: parseInt(
+ clearing.total_cleared_volumes.buy_side_total_cleared_volume,
+ 10
+ ),
+ },
+ subjectToClearing: {
+ from: parseInt(
+ clearing.total_cleared_volumes.sell_side_volume_subject_to_clearing,
+ 10
+ ),
+ to: parseInt(
+ clearing.total_cleared_volumes.buy_side_volume_subject_to_clearing,
+ 10
+ ),
+ },
+ };
+
+ if (
+ !wasInClearingForBatch(
+ side,
+ getTolerance(deposit.key.tolerance),
+ getTolerance(clearing.clearing_tolerance)
+ ) ||
+ clearedVolumes.cleared.to === 0 ||
+ clearedVolumes.cleared.from === 0
+ ) {
+ return {
+ ...currentHoldings,
+ cleared: {
+ ...currentHoldings.cleared,
+ [tokens.to.name]:
+ currentHoldings.cleared[tokens.to.name] +
+ (side === 'buy'
+ ? getDepositAmount(
+ parseInt(deposit.value, 10),
+ tokens.to.decimals
+ )
+ : 0),
+ [tokens.from.name]:
+ currentHoldings.cleared[tokens.from.name] +
+ (side === 'sell'
+ ? getDepositAmount(
+ parseInt(deposit.value, 10),
+ tokens.from.decimals
+ )
+ : 0),
+ },
+ };
+ } else {
+ if (side === 'sell') {
+ const payout = convertHoldingToPayout(
+ parseInt(deposit.value, 10),
+ clearedVolumes.subjectToClearing.from,
+ clearedVolumes.cleared.from,
+ clearedVolumes.cleared.to,
+ tokens.from.decimals,
+ tokens.to.decimals
+ );
+ return {
+ ...currentHoldings,
+ cleared: {
+ ...currentHoldings.cleared,
+ [tokens.to.name]:
+ currentHoldings.cleared[tokens.to.name] + payout[0],
+ [tokens.from.name]:
+ currentHoldings.cleared[tokens.from.name] + payout[1],
+ },
+ };
+ }
+ const payout = convertHoldingToPayout(
+ parseInt(deposit.value, 10),
+ clearedVolumes.subjectToClearing.to,
+ clearedVolumes.cleared.to,
+ clearedVolumes.cleared.from,
+ tokens.to.decimals,
+ tokens.from.decimals
+ );
+ return {
+ ...currentHoldings,
+ cleared: {
+ ...currentHoldings.cleared,
+ [tokens.to.name]: currentHoldings.cleared[tokens.to.name] + payout[1],
+ [tokens.from.name]:
+ currentHoldings.cleared[tokens.from.name] + payout[0],
+ },
+ };
+ }
+ } else {
+ return {
+ ...currentHoldings,
+ open: {
+ ...currentHoldings.open,
+ [tokens.to.name]:
+ currentHoldings.open[tokens.to.name] +
+ (side === 'buy'
+ ? getDepositAmount(parseInt(deposit.value, 10), tokens.to.decimals)
+ : 0),
+ [tokens.from.name]:
+ currentHoldings.open[tokens.from.name] +
+ (side === 'sell'
+ ? getDepositAmount(
+ parseInt(deposit.value, 10),
+ tokens.from.decimals
+ )
+ : 0),
+ },
+ };
+ }
+};
+
+//TODO type o1: { tzBTC: number, USDT: number }, o2:{ tzBTC: number, USDT: number }
+const addObj = (o1: any, o2: any) => {
+ return Object.keys(o1).reduce(
+ (acc, c) => {
+ return {
+ ...acc,
+ [c]: o1[c] + o2[c],
+ };
+ },
+ { tzBTC: 0, USDT: 0, EURL: 0 }
+ );
+};
+
+const computeHoldingsByBatch = (
+ deposits: UserOrder[], //! depots dans un batch
+ batch: BatchBigmap,
+ currentHoldings: HoldingsState
+) => {
+ return deposits.reduce(
+ (acc, d) => {
+ return {
+ open: addObj(
+ acc.open,
+ computeHoldingsByBatchAndDeposit(d, batch, currentHoldings).open
+ ),
+ cleared: addObj(
+ acc.cleared,
+ computeHoldingsByBatchAndDeposit(d, batch, currentHoldings).cleared
+ ),
+ };
+ },
+ {
+ open: { tzBTC: 0, USDT: 0, EURL: 0 },
+ cleared: { tzBTC: 0, USDT: 0, EURL: 0 },
+ }
+ );
+};
+
+export const computeAllHoldings = (orderbook: OrderBookBigmap) => {
+ return Promise.all(
+ Object.entries(orderbook).map(async ([batchNumber, deposits]) => {
+ const batch = await getBigMapByIdAndBatchNumber(
+ parseInt(batchNumber, 10)
+ );
+ return computeHoldingsByBatch(deposits, batch, {
+ open: { tzBTC: 0, USDT: 0, EURL: 0 },
+ cleared: { tzBTC: 0, USDT: 0, EURL: 0 },
+ });
+ })
+ ).then(holdings =>
+ holdings.reduce(
+ (acc, currentHoldings) => {
+ return {
+ open: addObj(acc.open, currentHoldings.open),
+ cleared: addObj(acc.cleared, currentHoldings.cleared),
+ };
+ },
+ {
+ open: { tzBTC: 0, USDT: 0, EURL: 0 },
+ cleared: { tzBTC: 0, USDT: 0, EURL: 0 },
+ }
+ )
+ );
+};
+
+export const getOrdersBook = async (userAddress: string) => {
+ const orderBookByBatch: { [key: number]: UserOrder[] } =
+ await getBigMapByIdAndUserAddress(userAddress);
+ return computeAllHoldings(orderBookByBatch);
+};
+
+const getDepositAmount = (depositAmount: number, decimals: number) =>
+ Math.floor(depositAmount) / 10 ** decimals;
diff --git a/batcher-ui/src/utils/webSocketUtils.ts b/batcher-ui/src/utils/webSocketUtils.ts
new file mode 100644
index 00000000..b8160ae6
--- /dev/null
+++ b/batcher-ui/src/utils/webSocketUtils.ts
@@ -0,0 +1,50 @@
+import { HubConnection, HubConnectionState } from '@microsoft/signalr';
+
+const subscribeBigMaps = (socket: HubConnection) => {
+ const batcherContractHash = process.env.NEXT_PUBLIC_BATCHER_CONTRACT_HASH;
+
+ return socket.invoke('SubscribeToBigMaps', {
+ contract: batcherContractHash,
+ });
+};
+
+export const subscribeTokenBalances = (
+ socket: HubConnection | undefined,
+ userAddress: string | undefined
+) => {
+ if (!socket || socket.state !== HubConnectionState.Connected)
+ return Promise.reject('No socket connection');
+ if (userAddress) {
+ return socket
+ .invoke('SubscribeToTokenBalances', {
+ account: userAddress,
+ })
+ .then(() => {
+ console.info('Socket connected to token balances updates.');
+ });
+ }
+ return Promise.reject('No address');
+};
+
+// const subscribeOperations = (socket: HubConnection) => {
+// const batcherContractHash = process.env.NEXT_PUBLIC_BATCHER_CONTRACT_HASH;
+
+// return socket.invoke('SubscribeToOperations', {
+// address: batcherContractHash,
+// types: 'transaction',
+// });
+// };
+
+export const setup = async (socket: HubConnection) => {
+ if (socket.state === HubConnectionState.Disconnected) {
+ await socket.start();
+ subscribeBigMaps(socket).then(() => {
+ console.info('Socket connected to bigMaps updates.', socket.state);
+ });
+
+ socket.onclose(error => {
+ if (error) console.error('Error with socket : ', error);
+ setup(socket);
+ });
+ }
+};
diff --git a/batcher-ui/styles/globals.css b/batcher-ui/styles/globals.css
new file mode 100644
index 00000000..a78ab16b
--- /dev/null
+++ b/batcher-ui/styles/globals.css
@@ -0,0 +1,22 @@
+@import url("https://fonts.googleapis.com/css2?family=Roboto+Mono:wght@100;300;500&display=swap");
+
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+
+html {
+ background-color: #1c1d22;
+ font-family: Roboto Mono;
+ color: white;
+ height: 100%;
+}
+body {
+ min-height: fit-content;
+ height: 100%;
+}
+
+a {
+ color: inherit;
+ text-decoration: none;
+}
diff --git a/batcher-ui/tailwind.config.js b/batcher-ui/tailwind.config.js
new file mode 100644
index 00000000..fe98e2d6
--- /dev/null
+++ b/batcher-ui/tailwind.config.js
@@ -0,0 +1,29 @@
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+ content: ['./pages/**/*.{js,ts,jsx,tsx}', './src/**/*.{js,ts,jsx,tsx}'],
+ theme: {
+ extend: {
+ colors: {
+ dark: '#1C1D22',
+ primary: '#D8464E',
+ darkgray: '#2B2A2E',
+ lightgray: '#7B7B7E',
+ hovergray: '#d1d5db',
+ green: '#6FE17A',
+ },
+ },
+ fontFamily: {
+ custom: ['Roboto Mono'],
+ },
+ keyframes: {
+ rotate: {
+ from: { transform: 'rotate(0deg)' },
+ to: { transform: 'rotate(180deg)' },
+ },
+ },
+ animation: {
+ rotate: 'rotate 750ms ease',
+ },
+ },
+ plugins: [],
+};
diff --git a/batcher-ui/tsconfig.json b/batcher-ui/tsconfig.json
index b4dfec74..5381223a 100644
--- a/batcher-ui/tsconfig.json
+++ b/batcher-ui/tsconfig.json
@@ -1,42 +1,46 @@
{
"compilerOptions": {
"outDir": "build/dist",
- "module": "esnext",
+ // "module": "ES2015",
"target": "esnext",
- "lib": ["esnext", "dom"],
+ "lib": [
+ "esnext",
+ "dom"
+ ],
"sourceMap": true,
"baseUrl": ".",
- "jsx": "react-jsx",
+ "jsx": "preserve",
"resolveJsonModule": true,
"allowSyntheticDefaultImports": true,
"moduleResolution": "node",
"forceConsistentCasingInFileNames": true,
"noImplicitReturns": true,
- "suppressImplicitAnyIndexErrors": true,
"noUnusedLocals": true,
- "allowJs": true,
+ "allowJs": false,
"skipLibCheck": true,
"experimentalDecorators": true,
- "strict": false,
- "paths": {
- "@/*": ["./src/*"],
- "@@/*": ["./src/.umi/*"]
- }
+ "strict": true,
+ "noEmit": true,
+ "incremental": true,
+ "esModuleInterop": true,
+ "isolatedModules": true,
+ "module": "esnext",
},
"include": [
- "mock/**/*",
"src/**/*",
- "playwright.config.ts",
"tests/**/*",
"test/**/*",
"__test__/**/*",
- "typings/**/*",
- "config/**/*",
- ".eslintrc.js",
- ".stylelintrc.js",
- ".prettierrc.js",
+ ".eslintrc.json",
+ ".prettierrc.json",
"jest.config.js",
- "mock/*"
+ "pages/*",
+ "global.d.ts"
],
- "exclude": ["node_modules", "build", "dist", "scripts", "src/.umi/*", "webpack", "jest"]
+ "exclude": [
+ "node_modules",
+ "build",
+ "dist",
+ "jest"
+ ]
}