From e0c5b8e9fdec96ae81c5d70ddaf2ef4cd9847fd3 Mon Sep 17 00:00:00 2001 From: devinxl Date: Mon, 8 Jan 2024 16:46:27 +0800 Subject: [PATCH] feat: add uploadkit, website and examples --- .changeset/README.md | 8 + .changeset/config.json | 16 + .eslintignore | 3 + .eslintrc.cjs | 12 + .github/ISSUE_TEMPLATE/bug_report.yml | 72 + .github/PULL_REQUEST_TEMPLATE.md | 32 + .github/actions/setup/action.yaml | 25 + .github/workflows/docs.yaml | 38 + .github/workflows/release.yaml | 44 + .gitignore | 28 + .husky/commit-msg | 4 + .husky/pre-commit | 4 + .lintstagedrc.js | 4 + .prettierignore | 3 + .prettierrc | 9 + CONTRIBUTING.md | 56 + LICENSE | 21 + README.md | 92 + commitlint.config.js | 10 + examples/nextjs-with-rainbowkit/.gitignore | 36 + examples/nextjs-with-rainbowkit/README.md | 40 + .../nextjs-with-rainbowkit/next.config.js | 6 + examples/nextjs-with-rainbowkit/package.json | 32 + .../nextjs-with-rainbowkit/pages/_app.tsx | 68 + .../pages/_document.tsx | 16 + .../nextjs-with-rainbowkit/pages/chains.ts | 66 + .../nextjs-with-rainbowkit/pages/client.ts | 9 + .../nextjs-with-rainbowkit/pages/index.tsx | 3 + .../pages/offchainauth.ts | 38 + examples/nextjs-with-rainbowkit/pages/sp.ts | 40 + .../nextjs-with-rainbowkit/public/favicon.ico | Bin 0 -> 25931 bytes .../nextjs-with-rainbowkit/styles/globals.css | 18 + examples/nextjs-with-rainbowkit/tsconfig.json | 22 + examples/nextjs-with-walletkit/.gitignore | 36 + examples/nextjs-with-walletkit/README.md | 40 + examples/nextjs-with-walletkit/next.config.js | 6 + examples/nextjs-with-walletkit/package.json | 30 + examples/nextjs-with-walletkit/pages/_app.tsx | 65 + .../nextjs-with-walletkit/pages/_document.tsx | 16 + .../nextjs-with-walletkit/pages/chains.ts | 62 + .../nextjs-with-walletkit/pages/client.ts | 8 + .../nextjs-with-walletkit/pages/index.tsx | 3 + .../pages/offchainauth.ts | 38 + examples/nextjs-with-walletkit/pages/sp.ts | 40 + .../nextjs-with-walletkit/public/favicon.ico | Bin 0 -> 25931 bytes .../nextjs-with-walletkit/styles/globals.css | 18 + examples/nextjs-with-walletkit/tsconfig.json | 22 + examples/vite-with-walletkit/index.html | 22 + examples/vite-with-walletkit/package.json | 34 + examples/vite-with-walletkit/public/vite.svg | 1 + examples/vite-with-walletkit/src/App.tsx | 61 + examples/vite-with-walletkit/src/chains.ts | 66 + examples/vite-with-walletkit/src/client.ts | 8 + examples/vite-with-walletkit/src/global.css | 14 + examples/vite-with-walletkit/src/main.tsx | 12 + .../vite-with-walletkit/src/vite-env.d.ts | 1 + examples/vite-with-walletkit/tsconfig.json | 25 + .../vite-with-walletkit/tsconfig.node.json | 10 + examples/vite-with-walletkit/vite.config.ts | 10 + package.json | 33 + packages/uploadkit/README.md | 92 + packages/uploadkit/dev/App.tsx | 82 + packages/uploadkit/dev/bucket.ts | 58 + packages/uploadkit/dev/chains.ts | 78 + packages/uploadkit/dev/client.ts | 9 + packages/uploadkit/dev/components/Icons.tsx | 39 + .../dev/components/ProgressExample.tsx | 31 + packages/uploadkit/dev/global.css | 14 + packages/uploadkit/dev/index.html | 49 + packages/uploadkit/dev/main.tsx | 12 + packages/uploadkit/dev/sp.ts | 28 + packages/uploadkit/dev/vite.config.ts | 23 + packages/uploadkit/package.json | 73 + .../src/base/components/Box/index.tsx | 21 + .../src/base/components/Box/styles.css.ts | 21 + .../src/base/components/Button/index.tsx | 16 + .../src/base/components/Button/styles.css.ts | 21 + .../base/components/CircleProgress/index.tsx | 48 + .../components/CircleProgress/style.css.ts | 0 .../src/base/components/IconButton/index.tsx | 20 + .../base/components/IconButton/styles.css.ts | 15 + .../base/components/LineProgress/index.tsx | 21 + .../base/components/LineProgress/style.css.ts | 29 + .../src/base/components/Link/index.tsx | 21 + .../src/base/components/Link/styles.css.ts | 13 + .../src/base/components/Loading/index.tsx | 20 + .../src/base/components/Loading/style.css.ts | 20 + .../base/components/Modal/ModalBody/index.tsx | 11 + .../components/Modal/ModalBody/styles.css.ts | 10 + .../components/Modal/ModalFooter/index.tsx | 11 + .../Modal/ModalFooter/styles.css.ts | 12 + .../components/Modal/ModalHeader/index.tsx | 11 + .../Modal/ModalHeader/styles.css.ts | 15 + .../src/base/components/Modal/index.tsx | 60 + .../src/base/components/Modal/styles.css.ts | 51 + .../src/base/components/Portal/index.tsx | 34 + .../src/base/components/Text/index.tsx | 10 + .../base/components/Transition/fade.css.ts | 27 + .../src/base/components/Transition/index.tsx | 50 + .../components/Transition/modalSlide.css.ts | 29 + .../components/Transition/toastSlide.css.ts | 42 + .../base/components/toast/ToastComponent.tsx | 55 + .../src/base/components/toast/ToastManager.ts | 47 + .../base/components/toast/ToastProvider.tsx | 39 + .../src/base/components/toast/index.tsx | 28 + .../src/base/components/toast/styles.css.ts | 44 + packages/uploadkit/src/base/constant/index.ts | 1 + .../uploadkit/src/base/hooks/useClipboard.ts | 51 + .../uploadkit/src/base/hooks/useDisclosure.ts | 19 + .../uploadkit/src/base/hooks/useIsMounted.ts | 11 + .../uploadkit/src/base/hooks/useKeyDown.ts | 28 + .../uploadkit/src/base/hooks/useResponsive.ts | 31 + .../uploadkit/src/base/hooks/useScrollLock.ts | 16 + .../uploadkit/src/base/icons/AlertIcon.tsx | 22 + .../uploadkit/src/base/icons/BackIcon.tsx | 13 + .../uploadkit/src/base/icons/CloseIcon.tsx | 13 + .../uploadkit/src/base/icons/CopyIcon.tsx | 18 + .../src/base/icons/DownArrowIcon.tsx | 13 + .../uploadkit/src/base/icons/ErrorIcon.tsx | 34 + .../uploadkit/src/base/icons/ExitIcon.tsx | 13 + .../uploadkit/src/base/icons/ForwardIcon.tsx | 13 + .../uploadkit/src/base/icons/InfoIcon.tsx | 17 + .../uploadkit/src/base/icons/ObjectIcon.tsx | 29 + .../uploadkit/src/base/icons/ObjectsIcon.tsx | 239 + .../uploadkit/src/base/icons/RefreshIcon.tsx | 58 + .../uploadkit/src/base/icons/SuccessIcon.tsx | 15 + .../uploadkit/src/base/icons/UploadIcon.tsx | 24 + .../uploadkit/src/base/icons/WalletIcon.tsx | 13 + packages/uploadkit/src/base/utils/common.ts | 32 + packages/uploadkit/src/base/utils/css.ts | 29 + packages/uploadkit/src/base/utils/mobile.ts | 23 + .../uploadkit/src/base/vanilla/global.css.ts | 5 + .../uploadkit/src/base/vanilla/index.css.ts | 25 + .../src/components/DragArea/index.tsx | 168 + .../src/components/DragArea/style.css.ts | 63 + .../src/components/FeeProvider/context.ts | 37 + .../src/components/FeeProvider/index.tsx | 74 + .../src/components/GlobalTasks/index.tsx | 230 + .../src/components/ModalProvider/context.ts | 17 + .../src/components/ModalProvider/index.tsx | 57 + .../uploadkit/src/components/Navbar/index.tsx | 37 + .../src/components/Navbar/styles.css.ts | 9 + .../src/components/RouteProvider/context.tsx | 17 + .../src/components/RouteProvider/index.tsx | 75 + .../components/TaskManagementButton/index.tsx | 70 + .../TaskManagementButton/style.css.ts | 34 + .../src/components/ThemeProvider/context.ts | 14 + .../src/components/ThemeProvider/index.tsx | 150 + .../src/components/TotalFee/index.tsx | 53 + .../src/components/TotalFee/style.css.ts | 56 + .../src/components/UploadButton/index.tsx | 198 + .../src/components/UploadButton/styles.css.ts | 70 + .../src/components/UploadKitButton/index.tsx | 43 + .../components/UploadKitButton/styles.css.ts | 18 + .../src/components/UploadKitModal/index.tsx | 26 + .../components/UploadKitProvider/context.ts | 36 + .../components/UploadKitProvider/index.tsx | 55 + .../src/components/UploadList/index.tsx | 69 + .../src/components/UploadList/style.css.ts | 62 + .../src/components/UploadProgress/index.tsx | 20 + .../components/UploadProgress/style.css.ts | 26 + .../src/components/UploadProvider/index.tsx | 23 + .../src/components/UploadProvider/reducer.ts | 160 + .../src/components/UploadProvider/types.ts | 88 + .../src/components/WaitList/index.tsx | 66 + .../src/components/WaitList/style.css.ts | 54 + packages/uploadkit/src/constants/index.ts | 5 + .../getDefaultProviderOptions.ts | 35 + packages/uploadkit/src/facade/bucket.ts | 74 + packages/uploadkit/src/facade/common.ts | 36 + packages/uploadkit/src/facade/error.ts | 129 + packages/uploadkit/src/facade/object.ts | 64 + packages/uploadkit/src/facade/offchainauth.ts | 43 + packages/uploadkit/src/facade/payment.ts | 159 + packages/uploadkit/src/facade/sp.ts | 46 + packages/uploadkit/src/facade/tx.ts | 125 + packages/uploadkit/src/facade/wallet.ts | 15 + .../uploadkit/src/hooks/useAsyncEffect.ts | 38 + .../uploadkit/src/hooks/useSettlementFee.ts | 22 + packages/uploadkit/src/hooks/useSingleton.ts | 15 + .../src/hooks/useTaskManagementButton.ts | 21 + packages/uploadkit/src/hooks/useTotalFee.ts | 84 + .../uploadkit/src/hooks/useUploadDisable.ts | 34 + .../uploadkit/src/hooks/useUploadModal.ts | 24 + .../uploadkit/src/hooks/useUploadQueue.ts | 11 + .../src/hooks/useUploadQueueStatus.ts | 38 + packages/uploadkit/src/index.ts | 18 + packages/uploadkit/src/pages/Upload/index.tsx | 14 + packages/uploadkit/src/pages/Wait/index.tsx | 29 + packages/uploadkit/src/themes/base.ts | 104 + packages/uploadkit/src/types.ts | 7 + packages/uploadkit/src/utils/bucket.ts | 26 + packages/uploadkit/src/utils/common.ts | 39 + packages/uploadkit/src/utils/css.ts | 29 + packages/uploadkit/src/utils/fee.ts | 35 + packages/uploadkit/src/utils/math.ts | 7 + packages/uploadkit/src/utils/mobile.ts | 23 + packages/uploadkit/src/utils/network.ts | 6 + packages/uploadkit/src/utils/object.ts | 161 + packages/uploadkit/src/utils/time.ts | 3 + packages/uploadkit/styles.css/package.json | 3 + packages/uploadkit/tsconfig.json | 32 + packages/uploadkit/tsconfig.node.json | 10 + packages/uploadkit/vite.config.ts | 45 + pnpm-lock.yaml | 9365 +++++++++++++++++ pnpm-workspace.yaml | 4 + website/index.html | 28 + website/package.json | 49 + website/plugins/rehype-code-meta.ts | 16 + website/src/App.tsx | 21 + .../components/CodeBlock/CopyButton/index.tsx | 15 + .../components/CodeBlock/Highlight/index.tsx | 34 + .../components/CodeBlock/LiveCode/index.tsx | 40 + .../components/CodeBlock/LiveCode/scope.tsx | 19 + website/src/components/CodeBlock/index.tsx | 26 + website/src/components/CodeBlock/styles.tsx | 25 + .../src/components/Layout/Header/index.tsx | 40 + .../Layout/SwitchColorMode/index.tsx | 35 + website/src/components/Layout/index.tsx | 15 + website/src/components/MDXComponent/index.tsx | 40 + website/src/components/PropsTable/index.tsx | 75 + website/src/components/SvgIcon/GitHubIcon.tsx | 7 + website/src/components/UploadKit/chains.ts | 78 + website/src/components/UploadKit/client.ts | 9 + website/src/components/UploadKit/index.tsx | 61 + website/src/global.d.ts | 8 + website/src/main.tsx | 13 + website/src/pages/index.mdx | 356 + website/src/theme/index.tsx | 10 + website/src/vite-env.d.ts | 1 + website/tsconfig.json | 25 + website/tsconfig.node.json | 10 + website/vite.config.ts | 23 + 233 files changed, 18053 insertions(+) create mode 100644 .changeset/README.md create mode 100644 .changeset/config.json create mode 100644 .eslintignore create mode 100644 .eslintrc.cjs create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/actions/setup/action.yaml create mode 100644 .github/workflows/docs.yaml create mode 100644 .github/workflows/release.yaml create mode 100644 .gitignore create mode 100644 .husky/commit-msg create mode 100755 .husky/pre-commit create mode 100644 .lintstagedrc.js create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 commitlint.config.js create mode 100644 examples/nextjs-with-rainbowkit/.gitignore create mode 100644 examples/nextjs-with-rainbowkit/README.md create mode 100644 examples/nextjs-with-rainbowkit/next.config.js create mode 100644 examples/nextjs-with-rainbowkit/package.json create mode 100644 examples/nextjs-with-rainbowkit/pages/_app.tsx create mode 100644 examples/nextjs-with-rainbowkit/pages/_document.tsx create mode 100644 examples/nextjs-with-rainbowkit/pages/chains.ts create mode 100644 examples/nextjs-with-rainbowkit/pages/client.ts create mode 100644 examples/nextjs-with-rainbowkit/pages/index.tsx create mode 100644 examples/nextjs-with-rainbowkit/pages/offchainauth.ts create mode 100644 examples/nextjs-with-rainbowkit/pages/sp.ts create mode 100644 examples/nextjs-with-rainbowkit/public/favicon.ico create mode 100644 examples/nextjs-with-rainbowkit/styles/globals.css create mode 100644 examples/nextjs-with-rainbowkit/tsconfig.json create mode 100644 examples/nextjs-with-walletkit/.gitignore create mode 100644 examples/nextjs-with-walletkit/README.md create mode 100644 examples/nextjs-with-walletkit/next.config.js create mode 100644 examples/nextjs-with-walletkit/package.json create mode 100644 examples/nextjs-with-walletkit/pages/_app.tsx create mode 100644 examples/nextjs-with-walletkit/pages/_document.tsx create mode 100644 examples/nextjs-with-walletkit/pages/chains.ts create mode 100644 examples/nextjs-with-walletkit/pages/client.ts create mode 100644 examples/nextjs-with-walletkit/pages/index.tsx create mode 100644 examples/nextjs-with-walletkit/pages/offchainauth.ts create mode 100644 examples/nextjs-with-walletkit/pages/sp.ts create mode 100644 examples/nextjs-with-walletkit/public/favicon.ico create mode 100644 examples/nextjs-with-walletkit/styles/globals.css create mode 100644 examples/nextjs-with-walletkit/tsconfig.json create mode 100644 examples/vite-with-walletkit/index.html create mode 100644 examples/vite-with-walletkit/package.json create mode 100644 examples/vite-with-walletkit/public/vite.svg create mode 100644 examples/vite-with-walletkit/src/App.tsx create mode 100644 examples/vite-with-walletkit/src/chains.ts create mode 100644 examples/vite-with-walletkit/src/client.ts create mode 100644 examples/vite-with-walletkit/src/global.css create mode 100644 examples/vite-with-walletkit/src/main.tsx create mode 100644 examples/vite-with-walletkit/src/vite-env.d.ts create mode 100644 examples/vite-with-walletkit/tsconfig.json create mode 100644 examples/vite-with-walletkit/tsconfig.node.json create mode 100644 examples/vite-with-walletkit/vite.config.ts create mode 100644 package.json create mode 100644 packages/uploadkit/README.md create mode 100644 packages/uploadkit/dev/App.tsx create mode 100644 packages/uploadkit/dev/bucket.ts create mode 100644 packages/uploadkit/dev/chains.ts create mode 100644 packages/uploadkit/dev/client.ts create mode 100644 packages/uploadkit/dev/components/Icons.tsx create mode 100644 packages/uploadkit/dev/components/ProgressExample.tsx create mode 100644 packages/uploadkit/dev/global.css create mode 100644 packages/uploadkit/dev/index.html create mode 100644 packages/uploadkit/dev/main.tsx create mode 100644 packages/uploadkit/dev/sp.ts create mode 100644 packages/uploadkit/dev/vite.config.ts create mode 100644 packages/uploadkit/package.json create mode 100644 packages/uploadkit/src/base/components/Box/index.tsx create mode 100644 packages/uploadkit/src/base/components/Box/styles.css.ts create mode 100644 packages/uploadkit/src/base/components/Button/index.tsx create mode 100644 packages/uploadkit/src/base/components/Button/styles.css.ts create mode 100644 packages/uploadkit/src/base/components/CircleProgress/index.tsx create mode 100644 packages/uploadkit/src/base/components/CircleProgress/style.css.ts create mode 100644 packages/uploadkit/src/base/components/IconButton/index.tsx create mode 100644 packages/uploadkit/src/base/components/IconButton/styles.css.ts create mode 100644 packages/uploadkit/src/base/components/LineProgress/index.tsx create mode 100644 packages/uploadkit/src/base/components/LineProgress/style.css.ts create mode 100644 packages/uploadkit/src/base/components/Link/index.tsx create mode 100644 packages/uploadkit/src/base/components/Link/styles.css.ts create mode 100644 packages/uploadkit/src/base/components/Loading/index.tsx create mode 100644 packages/uploadkit/src/base/components/Loading/style.css.ts create mode 100644 packages/uploadkit/src/base/components/Modal/ModalBody/index.tsx create mode 100644 packages/uploadkit/src/base/components/Modal/ModalBody/styles.css.ts create mode 100644 packages/uploadkit/src/base/components/Modal/ModalFooter/index.tsx create mode 100644 packages/uploadkit/src/base/components/Modal/ModalFooter/styles.css.ts create mode 100644 packages/uploadkit/src/base/components/Modal/ModalHeader/index.tsx create mode 100644 packages/uploadkit/src/base/components/Modal/ModalHeader/styles.css.ts create mode 100644 packages/uploadkit/src/base/components/Modal/index.tsx create mode 100644 packages/uploadkit/src/base/components/Modal/styles.css.ts create mode 100644 packages/uploadkit/src/base/components/Portal/index.tsx create mode 100644 packages/uploadkit/src/base/components/Text/index.tsx create mode 100644 packages/uploadkit/src/base/components/Transition/fade.css.ts create mode 100644 packages/uploadkit/src/base/components/Transition/index.tsx create mode 100644 packages/uploadkit/src/base/components/Transition/modalSlide.css.ts create mode 100644 packages/uploadkit/src/base/components/Transition/toastSlide.css.ts create mode 100644 packages/uploadkit/src/base/components/toast/ToastComponent.tsx create mode 100644 packages/uploadkit/src/base/components/toast/ToastManager.ts create mode 100644 packages/uploadkit/src/base/components/toast/ToastProvider.tsx create mode 100644 packages/uploadkit/src/base/components/toast/index.tsx create mode 100644 packages/uploadkit/src/base/components/toast/styles.css.ts create mode 100644 packages/uploadkit/src/base/constant/index.ts create mode 100644 packages/uploadkit/src/base/hooks/useClipboard.ts create mode 100644 packages/uploadkit/src/base/hooks/useDisclosure.ts create mode 100644 packages/uploadkit/src/base/hooks/useIsMounted.ts create mode 100644 packages/uploadkit/src/base/hooks/useKeyDown.ts create mode 100644 packages/uploadkit/src/base/hooks/useResponsive.ts create mode 100644 packages/uploadkit/src/base/hooks/useScrollLock.ts create mode 100644 packages/uploadkit/src/base/icons/AlertIcon.tsx create mode 100644 packages/uploadkit/src/base/icons/BackIcon.tsx create mode 100644 packages/uploadkit/src/base/icons/CloseIcon.tsx create mode 100644 packages/uploadkit/src/base/icons/CopyIcon.tsx create mode 100644 packages/uploadkit/src/base/icons/DownArrowIcon.tsx create mode 100644 packages/uploadkit/src/base/icons/ErrorIcon.tsx create mode 100644 packages/uploadkit/src/base/icons/ExitIcon.tsx create mode 100644 packages/uploadkit/src/base/icons/ForwardIcon.tsx create mode 100644 packages/uploadkit/src/base/icons/InfoIcon.tsx create mode 100644 packages/uploadkit/src/base/icons/ObjectIcon.tsx create mode 100644 packages/uploadkit/src/base/icons/ObjectsIcon.tsx create mode 100644 packages/uploadkit/src/base/icons/RefreshIcon.tsx create mode 100644 packages/uploadkit/src/base/icons/SuccessIcon.tsx create mode 100644 packages/uploadkit/src/base/icons/UploadIcon.tsx create mode 100644 packages/uploadkit/src/base/icons/WalletIcon.tsx create mode 100644 packages/uploadkit/src/base/utils/common.ts create mode 100644 packages/uploadkit/src/base/utils/css.ts create mode 100644 packages/uploadkit/src/base/utils/mobile.ts create mode 100644 packages/uploadkit/src/base/vanilla/global.css.ts create mode 100644 packages/uploadkit/src/base/vanilla/index.css.ts create mode 100644 packages/uploadkit/src/components/DragArea/index.tsx create mode 100644 packages/uploadkit/src/components/DragArea/style.css.ts create mode 100644 packages/uploadkit/src/components/FeeProvider/context.ts create mode 100644 packages/uploadkit/src/components/FeeProvider/index.tsx create mode 100644 packages/uploadkit/src/components/GlobalTasks/index.tsx create mode 100644 packages/uploadkit/src/components/ModalProvider/context.ts create mode 100644 packages/uploadkit/src/components/ModalProvider/index.tsx create mode 100644 packages/uploadkit/src/components/Navbar/index.tsx create mode 100644 packages/uploadkit/src/components/Navbar/styles.css.ts create mode 100644 packages/uploadkit/src/components/RouteProvider/context.tsx create mode 100644 packages/uploadkit/src/components/RouteProvider/index.tsx create mode 100644 packages/uploadkit/src/components/TaskManagementButton/index.tsx create mode 100644 packages/uploadkit/src/components/TaskManagementButton/style.css.ts create mode 100644 packages/uploadkit/src/components/ThemeProvider/context.ts create mode 100644 packages/uploadkit/src/components/ThemeProvider/index.tsx create mode 100644 packages/uploadkit/src/components/TotalFee/index.tsx create mode 100644 packages/uploadkit/src/components/TotalFee/style.css.ts create mode 100644 packages/uploadkit/src/components/UploadButton/index.tsx create mode 100644 packages/uploadkit/src/components/UploadButton/styles.css.ts create mode 100644 packages/uploadkit/src/components/UploadKitButton/index.tsx create mode 100644 packages/uploadkit/src/components/UploadKitButton/styles.css.ts create mode 100644 packages/uploadkit/src/components/UploadKitModal/index.tsx create mode 100644 packages/uploadkit/src/components/UploadKitProvider/context.ts create mode 100644 packages/uploadkit/src/components/UploadKitProvider/index.tsx create mode 100644 packages/uploadkit/src/components/UploadList/index.tsx create mode 100644 packages/uploadkit/src/components/UploadList/style.css.ts create mode 100644 packages/uploadkit/src/components/UploadProgress/index.tsx create mode 100644 packages/uploadkit/src/components/UploadProgress/style.css.ts create mode 100644 packages/uploadkit/src/components/UploadProvider/index.tsx create mode 100644 packages/uploadkit/src/components/UploadProvider/reducer.ts create mode 100644 packages/uploadkit/src/components/UploadProvider/types.ts create mode 100644 packages/uploadkit/src/components/WaitList/index.tsx create mode 100644 packages/uploadkit/src/components/WaitList/style.css.ts create mode 100644 packages/uploadkit/src/constants/index.ts create mode 100644 packages/uploadkit/src/defaultConfig/getDefaultProviderOptions.ts create mode 100644 packages/uploadkit/src/facade/bucket.ts create mode 100644 packages/uploadkit/src/facade/common.ts create mode 100644 packages/uploadkit/src/facade/error.ts create mode 100644 packages/uploadkit/src/facade/object.ts create mode 100644 packages/uploadkit/src/facade/offchainauth.ts create mode 100644 packages/uploadkit/src/facade/payment.ts create mode 100644 packages/uploadkit/src/facade/sp.ts create mode 100644 packages/uploadkit/src/facade/tx.ts create mode 100644 packages/uploadkit/src/facade/wallet.ts create mode 100644 packages/uploadkit/src/hooks/useAsyncEffect.ts create mode 100644 packages/uploadkit/src/hooks/useSettlementFee.ts create mode 100644 packages/uploadkit/src/hooks/useSingleton.ts create mode 100644 packages/uploadkit/src/hooks/useTaskManagementButton.ts create mode 100644 packages/uploadkit/src/hooks/useTotalFee.ts create mode 100644 packages/uploadkit/src/hooks/useUploadDisable.ts create mode 100644 packages/uploadkit/src/hooks/useUploadModal.ts create mode 100644 packages/uploadkit/src/hooks/useUploadQueue.ts create mode 100644 packages/uploadkit/src/hooks/useUploadQueueStatus.ts create mode 100644 packages/uploadkit/src/index.ts create mode 100644 packages/uploadkit/src/pages/Upload/index.tsx create mode 100644 packages/uploadkit/src/pages/Wait/index.tsx create mode 100644 packages/uploadkit/src/themes/base.ts create mode 100644 packages/uploadkit/src/types.ts create mode 100644 packages/uploadkit/src/utils/bucket.ts create mode 100644 packages/uploadkit/src/utils/common.ts create mode 100644 packages/uploadkit/src/utils/css.ts create mode 100644 packages/uploadkit/src/utils/fee.ts create mode 100644 packages/uploadkit/src/utils/math.ts create mode 100644 packages/uploadkit/src/utils/mobile.ts create mode 100644 packages/uploadkit/src/utils/network.ts create mode 100644 packages/uploadkit/src/utils/object.ts create mode 100644 packages/uploadkit/src/utils/time.ts create mode 100644 packages/uploadkit/styles.css/package.json create mode 100644 packages/uploadkit/tsconfig.json create mode 100644 packages/uploadkit/tsconfig.node.json create mode 100644 packages/uploadkit/vite.config.ts create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 website/index.html create mode 100644 website/package.json create mode 100644 website/plugins/rehype-code-meta.ts create mode 100644 website/src/App.tsx create mode 100644 website/src/components/CodeBlock/CopyButton/index.tsx create mode 100644 website/src/components/CodeBlock/Highlight/index.tsx create mode 100644 website/src/components/CodeBlock/LiveCode/index.tsx create mode 100644 website/src/components/CodeBlock/LiveCode/scope.tsx create mode 100644 website/src/components/CodeBlock/index.tsx create mode 100644 website/src/components/CodeBlock/styles.tsx create mode 100644 website/src/components/Layout/Header/index.tsx create mode 100644 website/src/components/Layout/SwitchColorMode/index.tsx create mode 100644 website/src/components/Layout/index.tsx create mode 100644 website/src/components/MDXComponent/index.tsx create mode 100644 website/src/components/PropsTable/index.tsx create mode 100644 website/src/components/SvgIcon/GitHubIcon.tsx create mode 100644 website/src/components/UploadKit/chains.ts create mode 100644 website/src/components/UploadKit/client.ts create mode 100644 website/src/components/UploadKit/index.tsx create mode 100644 website/src/global.d.ts create mode 100644 website/src/main.tsx create mode 100644 website/src/pages/index.mdx create mode 100644 website/src/theme/index.tsx create mode 100644 website/src/vite-env.d.ts create mode 100644 website/tsconfig.json create mode 100644 website/tsconfig.node.json create mode 100644 website/vite.config.ts diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 0000000..e5b6d8d --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000..57a81b1 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [ + "example-nextjs-with-rainbowkit", + "example-nextjs-with-walletkit", + "example-vite-with-walletkit", + "website" + ] +} \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..2ff8f9d --- /dev/null +++ b/.eslintignore @@ -0,0 +1,3 @@ +.next +dist +**/*.md \ No newline at end of file diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..9676a4b --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,12 @@ +module.exports = { + env: { browser: true, es2020: true, node: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + parser: '@typescript-eslint/parser', + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + plugins: ['react-refresh'], + rules: {}, +}; diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..c305cca --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,72 @@ +name: Bug Report +description: File a bug/issue +title: '[bug]' +labels: [bug] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! The more info you provide, the more we can help you. + + - type: input + attributes: + label: Greenfield UploadKit Version + description: What version of Greenfield UploadKit are you using? + placeholder: 1.0.0 + validations: + required: true + + - type: input + attributes: + label: '@bnb-chain/greenfield-js-sdk Version' + description: What version of @bnb-chain/greenfield-js-sdk are you using? + placeholder: 1.0.0 + validations: + required: true + + - type: input + attributes: + label: '@bnb-chain/reed-solomon Version' + description: What version of @bnb-chain/reed-solomon are you using? + placeholder: 1.0.0 + validations: + required: true + + - type: input + attributes: + label: '@bnb-chain/greenfield-cosmos-types Version' + description: What version of @bnb-chain/greenfield-cosmos-types are you using? + placeholder: 1.0.0 + validations: + required: true + + - type: textarea + attributes: + label: Describe the bug + description: A clear and concise description of what the bug is. + validations: + required: false + + - type: textarea + attributes: + label: Expected behavior + description: A concise description of what you expected to happen. + validations: + required: false + + - type: textarea + attributes: + label: Steps to reproduce + description: Steps or code snippets to reproduce the behavior. + validations: + required: false + + - type: textarea + attributes: + label: Anything else? + description: | + Browser info? Screenshots? Anything that will give us more context about the issue you are encountering! + + Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. + validations: + required: false diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..68e6da9 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,32 @@ +## Description + + + +## Issue ticket number and link + + + + + + +## Types of changes + + + +- [ ] Docs change / refactoring / dependency upgrade +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to change) + +## Checklist + + + + +- [ ] My code follows the code style of this project. +- [ ] I have updated changeset +- [ ] My change requires a change to the documentation. +- [ ] I have updated the documentation accordingly. +- [ ] I have read the **CONTRIBUTING** document. +- [ ] I have added tests to cover my changes. +- [ ] All new and existing tests passed. diff --git a/.github/actions/setup/action.yaml b/.github/actions/setup/action.yaml new file mode 100644 index 0000000..991955d --- /dev/null +++ b/.github/actions/setup/action.yaml @@ -0,0 +1,25 @@ +name: 'setup' +description: Prepare the environment + +runs: + using: composite + steps: + - name: Setup node.js + uses: actions/setup-node@v3 + with: + node-version: 20 + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + id: pnpm-install + with: + version: 8 + run_install: false + + - name: Setup pnpm config + shell: bash + run: pnpm config set store-dir .pnpm-store + + - name: Install dependencies + shell: bash + run: pnpm install diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml new file mode 100644 index 0000000..8807ec5 --- /dev/null +++ b/.github/workflows/docs.yaml @@ -0,0 +1,38 @@ +name: Deploy docs +on: + push: + branches: + - main + - alpha + +jobs: + release: + name: deploy docs + if: github.repository == 'node-real/greenfield-uploadkit' + timeout-minutes: 10 + runs-on: ubuntu-latest + steps: + - name: Checkout code repository + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - uses: ./.github/actions/setup + + - name: Build docs + run: pnpm build:docs + + - name: Redirect + run: | + mkdir -p ./website/dist/website/dist + cat << EOF > "./website/dist/website/dist/index.html" + + EOF + + - name: Deploy docs + uses: JamesIves/github-pages-deploy-action@v4 + with: + folder: ./website/dist + branch: 'docs' + clean: true + force: true diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..f42af0b --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,44 @@ +name: Release +on: + push: + branches: + - main + - alpha + - 0.x + - 0.x-alpha + +jobs: + release: + name: release + if: github.repository == 'node-real/greenfield-uploadkit' + timeout-minutes: 10 + runs-on: ubuntu-latest + steps: + - name: Checkout code repository + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - uses: ./.github/actions/setup + + - name: Build packages + run: pnpm build + + - name: Creating .npmrc + run: | + cat << EOF > "$HOME/.npmrc" + //registry.npmjs.org/:_authToken=$NPM_TOKEN + EOF + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Create and publish versions + uses: changesets/action@v1 + with: + version: pnpm ci:version + publish: pnpm ci:publish + commit: 'chore: update versions' + title: 'chore: update versions' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d55baa6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +build +dist-ssr +*.local +.next + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +.npmrc +.pnpm-store \ No newline at end of file diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100644 index 0000000..4f15872 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname $0)/_/husky.sh" + +npx --no-install commitlint --edit $1 diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..8c40444 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname $0)/_/husky.sh" + +npx lint-staged diff --git a/.lintstagedrc.js b/.lintstagedrc.js new file mode 100644 index 0000000..7c37248 --- /dev/null +++ b/.lintstagedrc.js @@ -0,0 +1,4 @@ +module.exports = { + '*.{js,jsx,ts,tsx}': ['prettier --write', 'eslint --fix'], + '*.{html,md,mdx}': 'prettier --write', +}; diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..2ff8f9d --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +.next +dist +**/*.md \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..e788456 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "arrowParens": "always", + "printWidth": 100, + "proseWrap": "always", + "semi": true, + "singleQuote": true, + "trailingComma": "all", + "tabWidth": 2 +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..a233f34 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,56 @@ +# Greenfield UploadKit Contribution Guide + +Thanks for your interest in contributing to Greenfield UploadKit! Please take a moment to review this document before submitting a pull request. + +## Prerequisites + +This project relies on [`nodejs`](https://nodejs.org/en), and uses [`pnpm`](https://pnpm.io) as a package manager, make sure you have them installed: + +- [node.js](https://nodejs.org/en/) v16 or higher +- [npm](https://pnpm.io) v8 or higher + +Then simply clone the repository and enter the directory: + +```sh +git clone https://github.com/node-real/greenfield-uploadkit.git +git cd greenfield-uploadkit +``` + +## Development environment + +Install the dependencies and start the local development environment: + +```sh +pnpm install +pnpm dev +``` + +In default, this will run a [vite example](./packages/uploadkit/dev), you can use this example for development and debugging. Any changes in `packages/uploadkit` will trigger a refresh. + +## Coding standards + +We use `eslint` and our code formatting rules are defined in [.eslintrc.cjs](./.eslintrc.cjs), you can check your code by running: + +```sh +pnpm lint +``` + +Besides, before committing, git hook will automatically run eslint to check and fix errors. + +## Tests + +Any changes need a test, please make sure all your changes are tested before committing. + +## Reporting a bug + +Just submit an issue though [github issue page](https://github.com/node-real/greenfield-uploadkit/issues). + +## Release notes + +A complete development workflow like following: + +1. Create a new branch out of `main` branch +2. Make some changes, fix bugs or add new features +3. Run `pnpm changeset` to create a new changeset +4. Commit the code, code review is required, after code review, we can merge the code to `main` branch +5. Then [github action](https://github.com/node-real/greenfield-uploadkit/actions) will automatically execute and create a new [release PR](https://github.com/node-real/greenfield-uploadkit/pulls), merge this PR, a new version will be released diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c748339 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 node-real + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8d0e13a --- /dev/null +++ b/README.md @@ -0,0 +1,92 @@ +# Greenfield UploadKit + +Greenfield UploadKit is a React component library for easily uploading objects to BNB Greenfield. + +## Features + +- 💡 Typescript — Get types straight out of the box. +- 🌱 Ecosystem Standards — Built on top of [@bnb-chain/greenfield-js-sdk](https://github.com/bnb-chain/greenfield-js-sdk/tree/main/packages/js-sdk), [wagmi](https://wagmi.sh/) and [viem](https://viem.sh/). +- 🎨 Customization — Easily customizing themes. + +## Documentation + +For full documentation, visit [here](https://node-real.github.io/greenfield-uploadkit). + +## Examples + +The following examples are provided in the [examples](./examples/) folder of this repo. + +- [nextjs-with-wallkit](./examples/nextjs-with-walletkit/) +- [nextjs-with-rainbowkit](./examples/nextjs-with-rainbowkit/) +- [vite-with-walletkit](./examples/vite-with-walletkit/) + +## Installation + +```bash +npm i wagmi viem @bnb-chain/greenfield-js-sdk @bnb-chain/greenfield-cosmos-types @bnb-chain/reed-solomon +``` + +## Usage +Before using Greenfield UploadKit, you need to switch your network to the BNB Greenfield Chain. We recommend using [@totejs/walletkit](https://github.com/node-real/walletkit) to connect your wallet and manage the network. This integration will ensure a seamless experience when working with Greenfield UploadKit. + +```tsx +import { WagmiConfig, createConfig } from 'wagmi'; +import { + SwitchNetworkModal, + WalletKitButton, + WalletKitOptions, + WalletKitProvider, + getDefaultConfig, +} from '@totejs/walletkit'; +import { trustWallet, metaMask, walletConnect } from '@totejs/walletkit/wallets'; +import { UploadKitButton, UploadKitOptions, UploadKitProvider } from '@node-real/greenfield-uploadkit'; +import { chains } from './chains'; +import { client } from './client'; + +import '@node-real/greenfield-uploadkit/styles.css'; +import '@totejs/walletkit/styles.css'; + +const config = createConfig( + getDefaultConfig({ + autoConnect: true, + appName: 'WalletKit', + + /* WC 2.0 requires a project ID (get one here: https://cloud.walletconnect.com/sign-in) */ + walletConnectProjectId: '22d482af814af0b8d5ba3d394a28c5fc', + + chains, + connectors: [trustWallet(), metaMask(), walletConnect()], + }), +); + +const options: WalletKitOptions = { + initialChainId: 5600, +}; + +const uploadKitOptions: UploadKitOptions = { + client: client, +}; + +export default function App({ Component, pageProps }: AppProps) { + return ( + + + + + + + + + + + ); +} +``` + +## Contributing + +Please follow our [UploadKit Contribution Guide](./CONTRIBUTING.md). + +## License + +See [LICENSE](./LICENSE) for more information. diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..be8201b --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,10 @@ +module.exports = { + extends: ['@commitlint/config-conventional'], + rules: { + 'subject-case': [ + 2, + 'never', + ['sentence-case', 'start-case', 'pascal-case', 'upper-case', 'lower-case'], + ], + }, +}; diff --git a/examples/nextjs-with-rainbowkit/.gitignore b/examples/nextjs-with-rainbowkit/.gitignore new file mode 100644 index 0000000..fd3dbb5 --- /dev/null +++ b/examples/nextjs-with-rainbowkit/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/examples/nextjs-with-rainbowkit/README.md b/examples/nextjs-with-rainbowkit/README.md new file mode 100644 index 0000000..a75ac52 --- /dev/null +++ b/examples/nextjs-with-rainbowkit/README.md @@ -0,0 +1,40 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file. + +[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`. + +The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/examples/nextjs-with-rainbowkit/next.config.js b/examples/nextjs-with-rainbowkit/next.config.js new file mode 100644 index 0000000..91ef62f --- /dev/null +++ b/examples/nextjs-with-rainbowkit/next.config.js @@ -0,0 +1,6 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: true, +}; + +module.exports = nextConfig; diff --git a/examples/nextjs-with-rainbowkit/package.json b/examples/nextjs-with-rainbowkit/package.json new file mode 100644 index 0000000..e78a74c --- /dev/null +++ b/examples/nextjs-with-rainbowkit/package.json @@ -0,0 +1,32 @@ +{ + "name": "example-nextjs-with-rainbowkit", + "version": "0.0.1", + "author": "node-real", + "private": "true", + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@bnb-chain/greenfield-cosmos-types": "0.4.0-alpha.30", + "@bnb-chain/greenfield-js-sdk": "1.2.0", + "@bnb-chain/reed-solomon": "^1.1.3", + "@node-real/greenfield-uploadkit": "workspace:*", + "@rainbow-me/rainbowkit": "^1.3.3", + "@totejs/walletkit": "^1.0.8", + "axios": "^1.6.3", + "next": "^13.5.6", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "viem": "^1.19.9", + "wagmi": "^1.4.7" + }, + "devDependencies": { + "@types/node": "^20.10.0", + "@types/react": "^18.2.39", + "@types/react-dom": "^18.2.17", + "typescript": "^5.3.2" + } +} diff --git a/examples/nextjs-with-rainbowkit/pages/_app.tsx b/examples/nextjs-with-rainbowkit/pages/_app.tsx new file mode 100644 index 0000000..8622f20 --- /dev/null +++ b/examples/nextjs-with-rainbowkit/pages/_app.tsx @@ -0,0 +1,68 @@ +import Head from 'next/head'; +import type { AppProps } from 'next/app'; +import { WagmiConfig, configureChains, createConfig } from 'wagmi'; +import { ConnectButton } from '@rainbow-me/rainbowkit'; +import { + UploadKitButton, + UploadKitOptions, + UploadKitProvider, +} from '@node-real/greenfield-uploadkit'; +import { + RainbowKitProvider, + connectorsForWallets, + getDefaultWallets, +} from '@rainbow-me/rainbowkit'; +import { publicProvider } from 'wagmi/providers/public'; +import { chains } from './chains'; +import { client } from './client'; + +import '@/styles/globals.css'; +import '@node-real/greenfield-uploadkit/styles.css'; +import '@rainbow-me/rainbowkit/styles.css'; + +const { chains: configChains, publicClient } = configureChains(chains, [publicProvider()]); + +const { wallets } = getDefaultWallets({ + /* WC 2.0 requires a project ID (get one here: https://cloud.walletconnect.com/sign-in) */ + projectId: '22d482af814af0b8d5ba3d394a28c5fc', + appName: 'greenfield js sdk demo', + chains: configChains, +}); + +const connectors = connectorsForWallets([...wallets]); + +const wagmiConfig = createConfig({ + // autoConnect: true, + connectors, + publicClient, +}); + +const uploadOptions: UploadKitOptions = { + client: client, + sp: { + operatorAddress: '0x89A1CC91B642DECbC4789474694C606E0E0c420b', + endpoint: 'https://gnfd-testnet-sp1.bnbchain.org', + }, + visibility: 'VISIBILITY_TYPE_PRIVATE', +}; + +export default function App({ Component, pageProps }: AppProps) { + return ( + <> + + UploadKit Next.js with rainbowkit Example + + + {/* TODO */} + + + +
+ + +
+
+
+ + ); +} diff --git a/examples/nextjs-with-rainbowkit/pages/_document.tsx b/examples/nextjs-with-rainbowkit/pages/_document.tsx new file mode 100644 index 0000000..4e058e5 --- /dev/null +++ b/examples/nextjs-with-rainbowkit/pages/_document.tsx @@ -0,0 +1,16 @@ +import { Html, Head, Main, NextScript } from 'next/document'; +import { EthereumScript } from '@totejs/walletkit'; + +export default function Document() { + return ( + + + + + +
+ + + + ); +} diff --git a/examples/nextjs-with-rainbowkit/pages/chains.ts b/examples/nextjs-with-rainbowkit/pages/chains.ts new file mode 100644 index 0000000..ac01fce --- /dev/null +++ b/examples/nextjs-with-rainbowkit/pages/chains.ts @@ -0,0 +1,66 @@ +import { bsc, bscTestnet } from 'wagmi/chains'; + +export const chains = [ + { + id: 5600, + name: 'BNB Greenfield Chain Testnet', + network: 'BNB Greenfield Chain Testnet', + nativeCurrency: { + name: 'BNB', + symbol: 'tBNB', + decimals: 18, + }, + rpcUrls: { + default: { + http: ['https://gnfd-testnet-fullnode-tendermint-us.bnbchain.org'], + }, + public: { + http: ['https://gnfd-testnet-fullnode-tendermint-us.bnbchain.org'], + }, + }, + blockExplorers: { + etherscan: { + name: `BNB Greenfield Chain Testnet Scan`, + url: 'https://testnet.greenfieldscan.com', + }, + default: { + name: `BNB Greenfield Chain Testnet Scan`, + url: 'https://testnet.greenfieldscan.com', + }, + }, + iconUrl: + 'https://github.com/wagmi-dev/wagmi/assets/5653652/44446c8c-5c72-4e89-b8eb-3042ef618eed', + }, + { + id: 1017, + name: 'BNB Greenfield Chain', + network: 'BNB Greenfield Chain', + nativeCurrency: { + name: 'BNB', + symbol: 'BNB', + decimals: 18, + }, + rpcUrls: { + default: { + http: ['https://greenfield-chain.bnbchain.org'], + }, + public: { + http: ['https://greenfield-chain.bnbchain.org'], + }, + }, + blockExplorers: { + etherscan: { + name: `BNB Greenfield Mainnet Scan`, + url: 'https://greenfieldscan.com', + }, + default: { + name: `BNB Greenfield Mainnet Scan`, + url: 'https://greenfieldscan.com', + }, + }, + iconUrl: + 'https://github.com/wagmi-dev/wagmi/assets/5653652/44446c8c-5c72-4e89-b8eb-3042ef618eed', + }, + bscTestnet, + bsc, +]; diff --git a/examples/nextjs-with-rainbowkit/pages/client.ts b/examples/nextjs-with-rainbowkit/pages/client.ts new file mode 100644 index 0000000..dbec588 --- /dev/null +++ b/examples/nextjs-with-rainbowkit/pages/client.ts @@ -0,0 +1,9 @@ +import { Client } from '@bnb-chain/greenfield-js-sdk'; + +const GRPC_URL = 'https://gnfd-testnet-fullnode-tendermint-us.bnbchain.org'; + +const GREEN_CHAIN_ID = 5600; + +export const client = Client.create(GRPC_URL, String(GREEN_CHAIN_ID), { + zkCryptoUrl: 'https://unpkg.com/@bnb-chain/greenfield-zk-crypto@0.0.3/dist/node/zk-crypto.wasm', +}); diff --git a/examples/nextjs-with-rainbowkit/pages/index.tsx b/examples/nextjs-with-rainbowkit/pages/index.tsx new file mode 100644 index 0000000..4032352 --- /dev/null +++ b/examples/nextjs-with-rainbowkit/pages/index.tsx @@ -0,0 +1,3 @@ +export default function Home() { + return null; +} diff --git a/examples/nextjs-with-rainbowkit/pages/offchainauth.ts b/examples/nextjs-with-rainbowkit/pages/offchainauth.ts new file mode 100644 index 0000000..cf2c405 --- /dev/null +++ b/examples/nextjs-with-rainbowkit/pages/offchainauth.ts @@ -0,0 +1,38 @@ +import { IReturnOffChainAuthKeyPairAndUpload } from '@bnb-chain/greenfield-js-sdk'; +import { getAllSps } from './sp'; +import { client } from './client'; + +export const getOffChainAuthKeys = async (address: string, provider: any) => { + const storageResStr = localStorage.getItem(address); + + if (storageResStr) { + const storageRes = JSON.parse(storageResStr) as IReturnOffChainAuthKeyPairAndUpload; + if (storageRes.expirationTime < Date.now()) { + alert('Your auth key has expired, please generate a new one'); + localStorage.removeItem(address); + return; + } + return storageRes; + } + + const allSps = await getAllSps(); + const offchainAuthRes = await client.offchainauth.genOffChainAuthKeyPairAndUpload( + { + sps: allSps, + chainId: 5600, + expirationMs: 5 * 24 * 60 * 60 * 1000, + domain: window.location.origin, + address, + }, + provider, + ); + + const { code, body: offChainData } = offchainAuthRes; + if (code !== 0 || !offChainData) { + throw offchainAuthRes; + } + + localStorage.setItem(address, JSON.stringify(offChainData)); + + return offChainData; +}; diff --git a/examples/nextjs-with-rainbowkit/pages/sp.ts b/examples/nextjs-with-rainbowkit/pages/sp.ts new file mode 100644 index 0000000..d126dd6 --- /dev/null +++ b/examples/nextjs-with-rainbowkit/pages/sp.ts @@ -0,0 +1,40 @@ +import { client } from './client'; + +export const getSps = async () => { + const sps = await client.sp.getStorageProviders(); + const finalSps = (sps ?? []).filter((v: any) => v.endpoint.includes('nodereal')); + + return finalSps; +}; + +export const getAllSps = async () => { + const sps = await getSps(); + + return sps.map((sp) => { + return { + address: sp.operatorAddress, + endpoint: sp.endpoint, + name: sp.description?.moniker, + }; + }); +}; + +export const selectSp = async () => { + const finalSps = await getSps(); + + const selectIndex = Math.floor(Math.random() * finalSps.length); + + const secondarySpAddresses = [ + ...finalSps.slice(0, selectIndex), + ...finalSps.slice(selectIndex + 1), + ].map((item) => item.operatorAddress); + const selectSpInfo = { + id: finalSps[selectIndex].id, + endpoint: finalSps[selectIndex].endpoint, + primarySpAddress: finalSps[selectIndex]?.operatorAddress, + sealAddress: finalSps[selectIndex].sealAddress, + secondarySpAddresses, + }; + + return selectSpInfo; +}; diff --git a/examples/nextjs-with-rainbowkit/public/favicon.ico b/examples/nextjs-with-rainbowkit/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/examples/nextjs-with-rainbowkit/styles/globals.css b/examples/nextjs-with-rainbowkit/styles/globals.css new file mode 100644 index 0000000..3dfda9b --- /dev/null +++ b/examples/nextjs-with-rainbowkit/styles/globals.css @@ -0,0 +1,18 @@ +:root { + --font-mono: Inter, -apple-system, system-ui, ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono', + 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro', + 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace; +} + +* { + box-sizing: border-box; + padding: 0; + margin: 0; +} + +html, +body { + max-width: 100vw; + overflow-x: hidden; + font-family: var(--font-mono); +} diff --git a/examples/nextjs-with-rainbowkit/tsconfig.json b/examples/nextjs-with-rainbowkit/tsconfig.json new file mode 100644 index 0000000..670224f --- /dev/null +++ b/examples/nextjs-with-rainbowkit/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/examples/nextjs-with-walletkit/.gitignore b/examples/nextjs-with-walletkit/.gitignore new file mode 100644 index 0000000..fd3dbb5 --- /dev/null +++ b/examples/nextjs-with-walletkit/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/examples/nextjs-with-walletkit/README.md b/examples/nextjs-with-walletkit/README.md new file mode 100644 index 0000000..a75ac52 --- /dev/null +++ b/examples/nextjs-with-walletkit/README.md @@ -0,0 +1,40 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file. + +[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`. + +The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/examples/nextjs-with-walletkit/next.config.js b/examples/nextjs-with-walletkit/next.config.js new file mode 100644 index 0000000..91ef62f --- /dev/null +++ b/examples/nextjs-with-walletkit/next.config.js @@ -0,0 +1,6 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: true, +}; + +module.exports = nextConfig; diff --git a/examples/nextjs-with-walletkit/package.json b/examples/nextjs-with-walletkit/package.json new file mode 100644 index 0000000..842e9eb --- /dev/null +++ b/examples/nextjs-with-walletkit/package.json @@ -0,0 +1,30 @@ +{ + "name": "example-nextjs-with-walletkit", + "version": "0.0.1", + "author": "node-real", + "private": "true", + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@bnb-chain/greenfield-cosmos-types": "0.4.0-alpha.30", + "@bnb-chain/greenfield-js-sdk": "1.2.0", + "@bnb-chain/reed-solomon": "^1.1.3", + "@node-real/greenfield-uploadkit": "workspace:*", + "axios": "^1.6.3", + "next": "^13.5.6", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "viem": "^1.19.9", + "wagmi": "^1.4.7" + }, + "devDependencies": { + "@types/node": "^20.10.0", + "@types/react": "^18.2.39", + "@types/react-dom": "^18.2.17", + "typescript": "^5.3.2" + } +} diff --git a/examples/nextjs-with-walletkit/pages/_app.tsx b/examples/nextjs-with-walletkit/pages/_app.tsx new file mode 100644 index 0000000..e84dd57 --- /dev/null +++ b/examples/nextjs-with-walletkit/pages/_app.tsx @@ -0,0 +1,65 @@ +import Head from 'next/head'; +import type { AppProps } from 'next/app'; +import { chains } from './chains'; +import { WagmiConfig, createConfig } from 'wagmi'; +import { + SwitchNetworkModal, + WalletKitButton, + WalletKitOptions, + WalletKitProvider, + getDefaultConfig, +} from '@totejs/walletkit'; +import { trustWallet, metaMask, walletConnect } from '@totejs/walletkit/wallets'; +import { + UploadKitButton, + UploadKitOptions, + UploadKitProvider, +} from '@node-real/greenfield-uploadkit'; +import { client } from './client'; + +import '@/styles/globals.css'; +import '@node-real/greenfield-uploadkit/styles.css'; +import '@totejs/walletkit/styles.css'; + +const config = createConfig( + getDefaultConfig({ + autoConnect: true, + appName: 'WalletKit', + + /* WC 2.0 requires a project ID (get one here: https://cloud.walletconnect.com/sign-in) */ + walletConnectProjectId: '22d482af814af0b8d5ba3d394a28c5fc', + + chains, + connectors: [trustWallet(), metaMask(), walletConnect()], + }), +); + +const options: WalletKitOptions = { + initialChainId: 5600, +}; + +const uploadOptions: UploadKitOptions = { + client: client, + visibility: 'VISIBILITY_TYPE_PRIVATE', +}; + +export default function App({ Component, pageProps }: AppProps) { + return ( + <> + + Greenfield UploadKit Next.js Example + + + + + +
+ + + +
+
+
+ + ); +} diff --git a/examples/nextjs-with-walletkit/pages/_document.tsx b/examples/nextjs-with-walletkit/pages/_document.tsx new file mode 100644 index 0000000..4e058e5 --- /dev/null +++ b/examples/nextjs-with-walletkit/pages/_document.tsx @@ -0,0 +1,16 @@ +import { Html, Head, Main, NextScript } from 'next/document'; +import { EthereumScript } from '@totejs/walletkit'; + +export default function Document() { + return ( + + + + + +
+ + + + ); +} diff --git a/examples/nextjs-with-walletkit/pages/chains.ts b/examples/nextjs-with-walletkit/pages/chains.ts new file mode 100644 index 0000000..9869156 --- /dev/null +++ b/examples/nextjs-with-walletkit/pages/chains.ts @@ -0,0 +1,62 @@ +import { bsc, bscTestnet } from 'wagmi/chains'; + +export const chains = [ + { + id: 5600, + name: 'BNB Greenfield Chain Testnet', + network: 'BNB Greenfield Chain Testnet', + nativeCurrency: { + name: 'BNB', + symbol: 'tBNB', + decimals: 18, + }, + rpcUrls: { + default: { + http: ['https://gnfd-testnet-fullnode-tendermint-us.bnbchain.org'], + }, + public: { + http: ['https://gnfd-testnet-fullnode-tendermint-us.bnbchain.org'], + }, + }, + blockExplorers: { + etherscan: { + name: `BNB Greenfield Chain Testnet Scan`, + url: 'https://testnet.greenfieldscan.com', + }, + default: { + name: `BNB Greenfield Chain Testnet Scan`, + url: 'https://testnet.greenfieldscan.com', + }, + }, + }, + { + id: 1017, + name: 'BNB Greenfield Chain', + network: 'BNB Greenfield Chain', + nativeCurrency: { + name: 'BNB', + symbol: 'BNB', + decimals: 18, + }, + rpcUrls: { + default: { + http: ['https://greenfield-chain.bnbchain.org'], + }, + public: { + http: ['https://greenfield-chain.bnbchain.org'], + }, + }, + blockExplorers: { + etherscan: { + name: `BNB Greenfield Mainnet Scan`, + url: 'https://greenfieldscan.com', + }, + default: { + name: `BNB Greenfield Mainnet Scan`, + url: 'https://greenfieldscan.com', + }, + }, + }, + bscTestnet, + bsc, +]; diff --git a/examples/nextjs-with-walletkit/pages/client.ts b/examples/nextjs-with-walletkit/pages/client.ts new file mode 100644 index 0000000..ec9c8ba --- /dev/null +++ b/examples/nextjs-with-walletkit/pages/client.ts @@ -0,0 +1,8 @@ +import { Client } from '@bnb-chain/greenfield-js-sdk'; + +const GRPC_URL = 'https://gnfd-testnet-fullnode-tendermint-us.bnbchain.org'; +const GREEN_CHAIN_ID = 5600; + +export const client = Client.create(GRPC_URL, String(GREEN_CHAIN_ID), { + zkCryptoUrl: 'https://unpkg.com/@bnb-chain/greenfield-zk-crypto@0.0.3/dist/node/zk-crypto.wasm', +}); diff --git a/examples/nextjs-with-walletkit/pages/index.tsx b/examples/nextjs-with-walletkit/pages/index.tsx new file mode 100644 index 0000000..4032352 --- /dev/null +++ b/examples/nextjs-with-walletkit/pages/index.tsx @@ -0,0 +1,3 @@ +export default function Home() { + return null; +} diff --git a/examples/nextjs-with-walletkit/pages/offchainauth.ts b/examples/nextjs-with-walletkit/pages/offchainauth.ts new file mode 100644 index 0000000..cf2c405 --- /dev/null +++ b/examples/nextjs-with-walletkit/pages/offchainauth.ts @@ -0,0 +1,38 @@ +import { IReturnOffChainAuthKeyPairAndUpload } from '@bnb-chain/greenfield-js-sdk'; +import { getAllSps } from './sp'; +import { client } from './client'; + +export const getOffChainAuthKeys = async (address: string, provider: any) => { + const storageResStr = localStorage.getItem(address); + + if (storageResStr) { + const storageRes = JSON.parse(storageResStr) as IReturnOffChainAuthKeyPairAndUpload; + if (storageRes.expirationTime < Date.now()) { + alert('Your auth key has expired, please generate a new one'); + localStorage.removeItem(address); + return; + } + return storageRes; + } + + const allSps = await getAllSps(); + const offchainAuthRes = await client.offchainauth.genOffChainAuthKeyPairAndUpload( + { + sps: allSps, + chainId: 5600, + expirationMs: 5 * 24 * 60 * 60 * 1000, + domain: window.location.origin, + address, + }, + provider, + ); + + const { code, body: offChainData } = offchainAuthRes; + if (code !== 0 || !offChainData) { + throw offchainAuthRes; + } + + localStorage.setItem(address, JSON.stringify(offChainData)); + + return offChainData; +}; diff --git a/examples/nextjs-with-walletkit/pages/sp.ts b/examples/nextjs-with-walletkit/pages/sp.ts new file mode 100644 index 0000000..d126dd6 --- /dev/null +++ b/examples/nextjs-with-walletkit/pages/sp.ts @@ -0,0 +1,40 @@ +import { client } from './client'; + +export const getSps = async () => { + const sps = await client.sp.getStorageProviders(); + const finalSps = (sps ?? []).filter((v: any) => v.endpoint.includes('nodereal')); + + return finalSps; +}; + +export const getAllSps = async () => { + const sps = await getSps(); + + return sps.map((sp) => { + return { + address: sp.operatorAddress, + endpoint: sp.endpoint, + name: sp.description?.moniker, + }; + }); +}; + +export const selectSp = async () => { + const finalSps = await getSps(); + + const selectIndex = Math.floor(Math.random() * finalSps.length); + + const secondarySpAddresses = [ + ...finalSps.slice(0, selectIndex), + ...finalSps.slice(selectIndex + 1), + ].map((item) => item.operatorAddress); + const selectSpInfo = { + id: finalSps[selectIndex].id, + endpoint: finalSps[selectIndex].endpoint, + primarySpAddress: finalSps[selectIndex]?.operatorAddress, + sealAddress: finalSps[selectIndex].sealAddress, + secondarySpAddresses, + }; + + return selectSpInfo; +}; diff --git a/examples/nextjs-with-walletkit/public/favicon.ico b/examples/nextjs-with-walletkit/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/examples/nextjs-with-walletkit/styles/globals.css b/examples/nextjs-with-walletkit/styles/globals.css new file mode 100644 index 0000000..3dfda9b --- /dev/null +++ b/examples/nextjs-with-walletkit/styles/globals.css @@ -0,0 +1,18 @@ +:root { + --font-mono: Inter, -apple-system, system-ui, ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono', + 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro', + 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace; +} + +* { + box-sizing: border-box; + padding: 0; + margin: 0; +} + +html, +body { + max-width: 100vw; + overflow-x: hidden; + font-family: var(--font-mono); +} diff --git a/examples/nextjs-with-walletkit/tsconfig.json b/examples/nextjs-with-walletkit/tsconfig.json new file mode 100644 index 0000000..670224f --- /dev/null +++ b/examples/nextjs-with-walletkit/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/examples/vite-with-walletkit/index.html b/examples/vite-with-walletkit/index.html new file mode 100644 index 0000000..be383aa --- /dev/null +++ b/examples/vite-with-walletkit/index.html @@ -0,0 +1,22 @@ + + + + + + + WalletKit Vite Example + + + + +
+ + + diff --git a/examples/vite-with-walletkit/package.json b/examples/vite-with-walletkit/package.json new file mode 100644 index 0000000..6bf1cb3 --- /dev/null +++ b/examples/vite-with-walletkit/package.json @@ -0,0 +1,34 @@ +{ + "name": "example-vite-with-walletkit", + "version": "0.0.1", + "author": "node-real", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@bnb-chain/greenfield-cosmos-types": "0.4.0-alpha.30", + "@bnb-chain/greenfield-js-sdk": "1.2.0", + "@bnb-chain/reed-solomon": "^1.1.3", + "@node-real/greenfield-uploadkit": "workspace:*", + "@totejs/walletkit": "^1.0.8", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "viem": "^1.19.9", + "wagmi": "^1.4.7" + }, + "devDependencies": { + "@types/react": "^18.2.39", + "@types/react-dom": "^18.2.17", + "@vitejs/plugin-react": "^4.2.0", + "typescript": "^5.3.2", + "vconsole": "^3.15.1", + "vite": "^4.5.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" + } +} diff --git a/examples/vite-with-walletkit/public/vite.svg b/examples/vite-with-walletkit/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/examples/vite-with-walletkit/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/vite-with-walletkit/src/App.tsx b/examples/vite-with-walletkit/src/App.tsx new file mode 100644 index 0000000..12bc673 --- /dev/null +++ b/examples/vite-with-walletkit/src/App.tsx @@ -0,0 +1,61 @@ +import '@totejs/walletkit/styles.css'; +import { WagmiConfig, createConfig } from 'wagmi'; +import { chains } from './chains'; +import { + WalletKitButton, + WalletKitProvider, + getDefaultConfig, + WalletKitOptions, + SwitchNetworkModal, +} from '@totejs/walletkit'; +import { trustWallet, metaMask, walletConnect } from '@totejs/walletkit/wallets'; +import { + UploadKitButton, + UploadKitOptions, + UploadKitProvider, +} from '@node-real/greenfield-uploadkit'; +import { client } from './client'; +import '@node-real/greenfield-uploadkit/styles.css'; +import '@totejs/walletkit/styles.css'; + +const config = createConfig( + getDefaultConfig({ + autoConnect: true, + appName: 'WalletKit', + + /* WC 2.0 requires a project ID (get one here: https://cloud.walletconnect.com/sign-in) */ + walletConnectProjectId: '22d482af814af0b8d5ba3d394a28c5fc', + + chains, + connectors: [trustWallet(), metaMask(), walletConnect()], + }), +); + +const options: WalletKitOptions = { + initialChainId: 5600, +}; + +const uploadOptions: UploadKitOptions = { + client: client, + visibility: 'VISIBILITY_TYPE_PUBLIC_READ', +}; + +export default function App() { + return ( + + + + +
+ + {/* + 👇 Here's the SwitchNetworkModal + If the user switches to a network that is not supported by our dapp, + this modal will be displayed to remind the user to switch to our supported networks. + */} + +
+
+
+ ); +} diff --git a/examples/vite-with-walletkit/src/chains.ts b/examples/vite-with-walletkit/src/chains.ts new file mode 100644 index 0000000..ac01fce --- /dev/null +++ b/examples/vite-with-walletkit/src/chains.ts @@ -0,0 +1,66 @@ +import { bsc, bscTestnet } from 'wagmi/chains'; + +export const chains = [ + { + id: 5600, + name: 'BNB Greenfield Chain Testnet', + network: 'BNB Greenfield Chain Testnet', + nativeCurrency: { + name: 'BNB', + symbol: 'tBNB', + decimals: 18, + }, + rpcUrls: { + default: { + http: ['https://gnfd-testnet-fullnode-tendermint-us.bnbchain.org'], + }, + public: { + http: ['https://gnfd-testnet-fullnode-tendermint-us.bnbchain.org'], + }, + }, + blockExplorers: { + etherscan: { + name: `BNB Greenfield Chain Testnet Scan`, + url: 'https://testnet.greenfieldscan.com', + }, + default: { + name: `BNB Greenfield Chain Testnet Scan`, + url: 'https://testnet.greenfieldscan.com', + }, + }, + iconUrl: + 'https://github.com/wagmi-dev/wagmi/assets/5653652/44446c8c-5c72-4e89-b8eb-3042ef618eed', + }, + { + id: 1017, + name: 'BNB Greenfield Chain', + network: 'BNB Greenfield Chain', + nativeCurrency: { + name: 'BNB', + symbol: 'BNB', + decimals: 18, + }, + rpcUrls: { + default: { + http: ['https://greenfield-chain.bnbchain.org'], + }, + public: { + http: ['https://greenfield-chain.bnbchain.org'], + }, + }, + blockExplorers: { + etherscan: { + name: `BNB Greenfield Mainnet Scan`, + url: 'https://greenfieldscan.com', + }, + default: { + name: `BNB Greenfield Mainnet Scan`, + url: 'https://greenfieldscan.com', + }, + }, + iconUrl: + 'https://github.com/wagmi-dev/wagmi/assets/5653652/44446c8c-5c72-4e89-b8eb-3042ef618eed', + }, + bscTestnet, + bsc, +]; diff --git a/examples/vite-with-walletkit/src/client.ts b/examples/vite-with-walletkit/src/client.ts new file mode 100644 index 0000000..ec9c8ba --- /dev/null +++ b/examples/vite-with-walletkit/src/client.ts @@ -0,0 +1,8 @@ +import { Client } from '@bnb-chain/greenfield-js-sdk'; + +const GRPC_URL = 'https://gnfd-testnet-fullnode-tendermint-us.bnbchain.org'; +const GREEN_CHAIN_ID = 5600; + +export const client = Client.create(GRPC_URL, String(GREEN_CHAIN_ID), { + zkCryptoUrl: 'https://unpkg.com/@bnb-chain/greenfield-zk-crypto@0.0.3/dist/node/zk-crypto.wasm', +}); diff --git a/examples/vite-with-walletkit/src/global.css b/examples/vite-with-walletkit/src/global.css new file mode 100644 index 0000000..0a9ac47 --- /dev/null +++ b/examples/vite-with-walletkit/src/global.css @@ -0,0 +1,14 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; + + margin: 0; + padding: 0; +} diff --git a/examples/vite-with-walletkit/src/main.tsx b/examples/vite-with-walletkit/src/main.tsx new file mode 100644 index 0000000..a7ad651 --- /dev/null +++ b/examples/vite-with-walletkit/src/main.tsx @@ -0,0 +1,12 @@ +import '@totejs/walletkit/styles.css'; +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App.tsx'; +import './global.css'; + +// eslint-disable-next-line @typescript-eslint/no-non-null-assertion +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +); diff --git a/examples/vite-with-walletkit/src/vite-env.d.ts b/examples/vite-with-walletkit/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/examples/vite-with-walletkit/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/examples/vite-with-walletkit/tsconfig.json b/examples/vite-with-walletkit/tsconfig.json new file mode 100644 index 0000000..a7fc6fb --- /dev/null +++ b/examples/vite-with-walletkit/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/examples/vite-with-walletkit/tsconfig.node.json b/examples/vite-with-walletkit/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/examples/vite-with-walletkit/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/vite-with-walletkit/vite.config.ts b/examples/vite-with-walletkit/vite.config.ts new file mode 100644 index 0000000..501ceb3 --- /dev/null +++ b/examples/vite-with-walletkit/vite.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + build: { + minify: false, + }, +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..407ce68 --- /dev/null +++ b/package.json @@ -0,0 +1,33 @@ +{ + "name": "greenfield-uploadkit", + "version": "0.0.1", + "author": "node-real", + "packageManager": "pnpm@8.9.2", + "description": "Greenfield UploadKit is a React component library for easily uploading objects to BNB Greenfield.", + "license": "MIT", + "scripts": { + "prepare": "husky install", + "lint": "pnpm eslint .", + "dev": "pnpm --F @node-real/greenfield-uploadkit dev", + "build": "pnpm --F @node-real/greenfield-uploadkit build", + "dev:docs": "pnpm --F @node-real/greenfield-uploadkit build:watch & pnpm --F website dev", + "build:docs": "pnpm --F @node-real/greenfield-uploadkit build && pnpm --F website build", + "pre:enter": "pnpm changeset pre enter alpha", + "pre:exit": "pnpm changeset pre exit", + "ci:version": "pnpm changeset version && cp README.md packages/uploadkit/README.md", + "ci:publish": "pnpm changeset publish" + }, + "devDependencies": { + "@changesets/cli": "^2.27.1", + "@commitlint/cli": "^18.4.3", + "@commitlint/config-conventional": "^18.4.3", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", + "eslint": "^8.54.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.3.5", + "husky": "^8.0.3", + "lint-staged": "^15.1.0", + "prettier": "^3.1.0" + } +} diff --git a/packages/uploadkit/README.md b/packages/uploadkit/README.md new file mode 100644 index 0000000..ed43114 --- /dev/null +++ b/packages/uploadkit/README.md @@ -0,0 +1,92 @@ +# Greenfield UploadKit + +Greenfield UploadKit is a React component library for easily uploading objects to BNB Greenfield. + +## Features + +- 💡 Typescript — Get types straight out of the box. +- 🌱 Ecosystem Standards — Built on top of [@bnb-chain/greenfield-js-sdk](https://github.com/bnb-chain/greenfield-js-sdk/tree/main/packages/js-sdk), [wagmi](https://wagmi.sh/), and [viem](https://viem.sh/). +- 🎨 Customization — Easily customizing themes. + +## Documentation + +For full documentation, visit [here](https://node-real.github.io/greenfield-uploadkit). + +## Examples + +The following examples are provided in the [examples](./examples/) folder of this repo. + +- [nextjs-with-wallkit](./examples/nextjs-with-walletkit/) +- [nextjs-with-rainbowkit](./examples/nextjs-with-rainbowkit/) +- [vite-with-walletkit](./examples/vite-with-walletkit/) + +## Installation + +```bash +npm i wagmi viem @bnb-chain/greenfield-js-sdk @bnb-chain/greenfield-cosmos-types @bnb-chain/reed-solomon +``` + +## Usage +Before using Greenfield UploadKit, you need to switch your network to the BNB Greenfield Chain. We recommend using [@totejs/walletkit](https://github.com/node-real/walletkit) to connect your wallet and manage the network. This integration will ensure a seamless experience when working with Greenfield UploadKit. + +```tsx +import { WagmiConfig, createConfig } from 'wagmi'; +import { + SwitchNetworkModal, + WalletKitButton, + WalletKitOptions, + WalletKitProvider, + getDefaultConfig, +} from '@totejs/walletkit'; +import { trustWallet, metaMask, walletConnect } from '@totejs/walletkit/wallets'; +import { UploadKitButton, UploadKitOptions, UploadKitProvider } from '@node-real/greenfield-uploadkit'; +import { chains } from './chains'; +import { client } from './client'; + +import '@node-real/greenfield-uploadkit/styles.css'; +import '@totejs/walletkit/styles.css'; + +const config = createConfig( + getDefaultConfig({ + autoConnect: true, + appName: 'WalletKit', + + /* WC 2.0 requires a project ID (get one here: https://cloud.walletconnect.com/sign-in) */ + walletConnectProjectId: '22d482af814af0b8d5ba3d394a28c5fc', + + chains, + connectors: [trustWallet(), metaMask(), walletConnect()], + }), +); + +const options: WalletKitOptions = { + initialChainId: 5600, +}; + +const uploadKitOptions: UploadKitOptions = { + client: client, +}; + +export default function App({ Component, pageProps }: AppProps) { + return ( + + + + + + + + + + + ); +} +``` + +## Contributing + +Please follow our [UploadKit Contribution Guide](./CONTRIBUTING.md). + +## License + +See [LICENSE](./LICENSE) for more information. diff --git a/packages/uploadkit/dev/App.tsx b/packages/uploadkit/dev/App.tsx new file mode 100644 index 0000000..35843a2 --- /dev/null +++ b/packages/uploadkit/dev/App.tsx @@ -0,0 +1,82 @@ +import { useState } from 'react'; +import { UploadKitButton } from '@/components/UploadKitButton'; +import { UploadKitProvider } from '@/components/UploadKitProvider'; +import { UploadKitOptions } from '@/components/UploadKitProvider/context'; + +import { WagmiConfig, createConfig } from 'wagmi'; +import { + SwitchNetworkModal, + WalletKitButton, + WalletKitOptions, + WalletKitProvider, + getDefaultConfig, +} from '@totejs/walletkit'; +import { trustWallet, metaMask, walletConnect } from '@totejs/walletkit/wallets'; +import { chains } from './chains'; +import '@totejs/walletkit/styles.css'; +import { client } from './client'; +import ProgressBarExample from './components/ProgressExample'; +import { Icons } from './components/Icons'; +import { Link } from '@/base/components/Link'; + +const config = createConfig( + getDefaultConfig({ + autoConnect: true, + appName: 'WalletKit', + + // WalletConnect 2.0 requires a projectId which you can create quickly + // and easily for free over at WalletConnect Cloud https://cloud.walletconnect.com/sign-in + walletConnectProjectId: 'e68a1816d39726c2afabf05661a32767', + + chains, + connectors: [trustWallet(), metaMask(), walletConnect()], + }), +); + +const options: WalletKitOptions = { + initialChainId: 5600, +}; + +const uploadOptions: UploadKitOptions = { + client: client, + bucketName: 'test-upload-kit', + sp: { + operatorAddress: '0x89A1CC91B642DECbC4789474694C606E0E0c420b', + endpoint: 'https://gnfd-testnet-sp1.bnbchain.org', + }, + visibility: 'VISIBILITY_TYPE_PRIVATE', + // onError: console.log, +}; + +export default function App() { + const [mode, setMode] = useState('light'); + const nextMode = mode === 'light' ? 'dark' : 'light'; + + return ( + +
mode: {mode}
+ +
+ + + + +
+ + +
+
+
+ + ); +} + +function Example() { + return ( +
+ + + Link component +
+ ); +} diff --git a/packages/uploadkit/dev/bucket.ts b/packages/uploadkit/dev/bucket.ts new file mode 100644 index 0000000..449d550 --- /dev/null +++ b/packages/uploadkit/dev/bucket.ts @@ -0,0 +1,58 @@ +import { BroadcastResponse, resolve } from '@/facade/common'; +import { ErrorResponse, broadcastFault, createTxFault, simulateFault } from '@/facade/error'; +import { AuthType } from '@/facade/tx'; +import { signTypedDataCallback } from '@/facade/wallet'; +import { + Client, + CreateBucketApprovalRequest, + ISimulateGasFee, + TxResponse, +} from '@bnb-chain/greenfield-js-sdk'; +import { Connector } from 'wagmi'; + +export const simulateCreateBucket = async ( + params: CreateBucketApprovalRequest, + authType: AuthType, + client: Client, +): Promise<[ISimulateGasFee, null, TxResponse] | ErrorResponse> => { + const [createBucketTx, error1] = await client.bucket + .createBucket(params, authType) + .then(resolve, createTxFault); + + if (!createBucketTx) return [null, error1]; + + const [simulateInfo, error2] = await createBucketTx + .simulate({ + denom: 'BNB', + }) + .then(resolve, simulateFault); + + if (!simulateInfo) return [null, error2]; + + return [simulateInfo, null, createBucketTx]; +}; + +export const createBucket = async ( + params: CreateBucketApprovalRequest, + authType: AuthType, + connector: Connector, + client: Client, +): BroadcastResponse => { + const [simulateInfo, error, createBucketTx] = await simulateCreateBucket( + params, + authType, + client, + ); + if (!simulateInfo) return [null, error]; + + const payload = { + denom: 'BNB', + gasLimit: Number(simulateInfo?.gasLimit), + gasPrice: simulateInfo?.gasPrice || '5000000000', + payer: params.creator, + granter: '', + signTypedDataCallback: signTypedDataCallback(connector), + }; + + return createBucketTx.broadcast(payload).then(resolve, broadcastFault); +}; diff --git a/packages/uploadkit/dev/chains.ts b/packages/uploadkit/dev/chains.ts new file mode 100644 index 0000000..9834634 --- /dev/null +++ b/packages/uploadkit/dev/chains.ts @@ -0,0 +1,78 @@ +import { bsc, mainnet } from 'wagmi/chains'; + +export const chains = [ + { + id: 5600, + name: 'BNB Greenfield Testnet', + network: 'BNB Greenfield Testnet', + nativeCurrency: { + name: 'tBNB', + symbol: 'tBNB', + decimals: 18, + }, + rpcUrls: { + default: { + http: ['https://gnfd-testnet-fullnode-tendermint-us.bnbchain.org'], + }, + public: { + http: ['https://gnfd-testnet-fullnode-tendermint-us.bnbchain.org'], + }, + }, + blockExplorers: { + etherscan: { + name: `BNB Greenfield Testnet Scan`, + url: 'https://greenfield-chain.bnbchain.org', + }, + default: { + name: `BNB Greenfield Testnet Scan`, + url: 'https://greenfield-chain.bnbchain.org', + }, + }, + }, + { + id: 204, + name: 'opBNB Mainnet', + network: 'opBNB Mainnet', + nativeCurrency: { + name: 'tcBNB', + symbol: 'tcBNB', + decimals: 18, + }, + rpcUrls: { + default: { + http: ['https://opbnb-mainnet-rpc.bnbchain.org'], + }, + public: { + http: ['https://opbnb-mainnet-rpc.bnbchain.org'], + }, + }, + blockExplorers: { + etherscan: { name: 'opBNBScan', url: `https://mainnet.opbnbscan.com` }, + default: { name: 'opBNBScan', url: `https://mainnet.opbnbscan.com` }, + }, + }, + { + id: 97, + name: 'BSC Testnet', + network: 'BSC Testnet', + nativeCurrency: { + name: 'tBNB', + symbol: 'tBNB', + decimals: 18, + }, + rpcUrls: { + default: { + http: [`https://data-seed-prebsc-1-s1.binance.org:8545`], + }, + public: { + http: [`https://data-seed-prebsc-1-s1.binance.org:8545`], + }, + }, + blockExplorers: { + etherscan: { name: 'BSC Testnet Scan', url: `https://testnet.bscscan.com` }, + default: { name: 'BSC Testnet Scan', url: `https://testnet.bscscan.com` }, + }, + }, + bsc, + mainnet, +]; diff --git a/packages/uploadkit/dev/client.ts b/packages/uploadkit/dev/client.ts new file mode 100644 index 0000000..dbec588 --- /dev/null +++ b/packages/uploadkit/dev/client.ts @@ -0,0 +1,9 @@ +import { Client } from '@bnb-chain/greenfield-js-sdk'; + +const GRPC_URL = 'https://gnfd-testnet-fullnode-tendermint-us.bnbchain.org'; + +const GREEN_CHAIN_ID = 5600; + +export const client = Client.create(GRPC_URL, String(GREEN_CHAIN_ID), { + zkCryptoUrl: 'https://unpkg.com/@bnb-chain/greenfield-zk-crypto@0.0.3/dist/node/zk-crypto.wasm', +}); diff --git a/packages/uploadkit/dev/components/Icons.tsx b/packages/uploadkit/dev/components/Icons.tsx new file mode 100644 index 0000000..153a994 --- /dev/null +++ b/packages/uploadkit/dev/components/Icons.tsx @@ -0,0 +1,39 @@ +import { SuccessIcon } from '@/base/icons/SuccessIcon'; +import { AlertIcon } from '@/base/icons/AlertIcon'; +import { BackIcon } from '@/base/icons/BackIcon'; +import { CopyIcon } from '@/base/icons/CopyIcon'; +import { DownArrowIcon } from '@/base/icons/DownArrowIcon'; +import { ErrorIcon } from '@/base/icons/ErrorIcon'; +import { ExitIcon } from '@/base/icons/ExitIcon'; +import { ForwardIcon } from '@/base/icons/ForwardIcon'; +import { InfoIcon } from '@/base/icons/InfoIcon'; +import { ObjectIcon } from '@/base/icons/ObjectIcon'; +import { ObjectsIcon } from '@/base/icons/ObjectsIcon'; +import { RefreshIcon } from '@/base/icons/RefreshIcon'; +import { WalletIcon } from '@/base/icons/WalletIcon'; +import { CloseIcon } from '@/base/icons/CloseIcon'; +import { UploadIcon } from '@/base/icons/UploadIcon'; +export const Icons = () => { + return ( + <> +

icons

+
+ + + + + + + + + + + + + + + +
+ + ); +}; diff --git a/packages/uploadkit/dev/components/ProgressExample.tsx b/packages/uploadkit/dev/components/ProgressExample.tsx new file mode 100644 index 0000000..ad837f5 --- /dev/null +++ b/packages/uploadkit/dev/components/ProgressExample.tsx @@ -0,0 +1,31 @@ +import { CircleProgressBar } from '@/base/components/CircleProgress'; +import { LineProgressBar } from '@/base/components/LineProgress'; +import { UploadProgress } from '@/components/UploadProgress'; +import { useState, useEffect } from 'react'; + +export default function ProgressBarExample() { + const [progress, setProgress] = useState(0); + useEffect(() => { + const interval = setInterval(() => { + setProgress((prevProgress) => { + if (prevProgress >= 100) { + clearInterval(interval); + return 100; + } + return prevProgress + 1; + }); + }, 1000); + + return () => { + clearInterval(interval); + }; + }, []); + return ( + <> +

Progress Bar

+ + + + + ); +} diff --git a/packages/uploadkit/dev/global.css b/packages/uploadkit/dev/global.css new file mode 100644 index 0000000..0a9ac47 --- /dev/null +++ b/packages/uploadkit/dev/global.css @@ -0,0 +1,14 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; + + margin: 0; + padding: 0; +} diff --git a/packages/uploadkit/dev/index.html b/packages/uploadkit/dev/index.html new file mode 100644 index 0000000..95160db --- /dev/null +++ b/packages/uploadkit/dev/index.html @@ -0,0 +1,49 @@ + + + + + + + UploadKit Test Demo + + + + + +
+ + + diff --git a/packages/uploadkit/dev/main.tsx b/packages/uploadkit/dev/main.tsx new file mode 100644 index 0000000..9413b25 --- /dev/null +++ b/packages/uploadkit/dev/main.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App.tsx'; +import './global.css'; + +// eslint-disable-next-line @typescript-eslint/no-non-null-assertion +ReactDOM.createRoot(document.getElementById('root')!).render( + // TODO react strict mode will rerender + // + , + // , +); diff --git a/packages/uploadkit/dev/sp.ts b/packages/uploadkit/dev/sp.ts new file mode 100644 index 0000000..a0b1733 --- /dev/null +++ b/packages/uploadkit/dev/sp.ts @@ -0,0 +1,28 @@ +import { client } from './client'; + +export const getSps = async () => { + const sps = await client.sp.getStorageProviders(); + const finalSps = (sps ?? []).filter((v: any) => v.endpoint.includes('nodereal')); + + return finalSps; +}; + +export const getRandomSp = async () => { + const finalSps = await getSps(); + + const selectIndex = Math.floor(Math.random() * finalSps.length); + + const secondarySpAddresses = [ + ...finalSps.slice(0, selectIndex), + ...finalSps.slice(selectIndex + 1), + ].map((item) => item.operatorAddress); + const selectSpInfo = { + id: finalSps[selectIndex].id, + endpoint: finalSps[selectIndex].endpoint, + primarySpAddress: finalSps[selectIndex]?.operatorAddress, + sealAddress: finalSps[selectIndex].sealAddress, + secondarySpAddresses, + }; + + return selectSpInfo; +}; diff --git a/packages/uploadkit/dev/vite.config.ts b/packages/uploadkit/dev/vite.config.ts new file mode 100644 index 0000000..f917976 --- /dev/null +++ b/packages/uploadkit/dev/vite.config.ts @@ -0,0 +1,23 @@ +import path from 'path'; + +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin'; + +export default defineConfig({ + root: './dev', + plugins: [ + react(), + vanillaExtractPlugin({ + identifiers: ({ hash }) => `uk_${hash}`, + }), + ], + resolve: { + alias: { + '@': path.resolve(__dirname, '../src'), + process: 'process/browser', + stream: 'stream-browserify', + util: 'util', + }, + }, +}); diff --git a/packages/uploadkit/package.json b/packages/uploadkit/package.json new file mode 100644 index 0000000..39dcccb --- /dev/null +++ b/packages/uploadkit/package.json @@ -0,0 +1,73 @@ +{ + "name": "@node-real/greenfield-uploadkit", + "version": "0.0.1", + "author": "node-real", + "description": "Greenfield UploadKit is a React component library for easily uploading objects to BNB Greenfield.", + "homepage": "https://node-real.github.io/greenfield-uploadkit", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/node-real/greenfield-uploadkit.git", + "directory": "packages/greenfield-uploadkit" + }, + "keywords": [ + "Greenfield UploadKit", + "BNB Greenfield" + ], + "type": "module", + "files": [ + "dist", + "styles.css" + ], + "main": "./dist/src/index.js", + "types": "./dist/src/index.d.ts", + "exports": { + ".": "./dist/index.js", + "./styles.css": "./dist/style.css" + }, + "scripts": { + "dev": "vite --config ./dev/vite.config.ts --port 3011 --host 0.0.0.0", + "build:watch": "vite build --watch --emptyOutDir=false", + "build": "vite build" + }, + "peerDependencies": { + "@bnb-chain/greenfield-cosmos-types": ">=0.4.0-alpha.30", + "@bnb-chain/greenfield-js-sdk": ">=1.2.0", + "@bnb-chain/reed-solomon": ">=1.1.3", + "react": ">=17", + "react-dom": ">=17", + "viem": ">=1", + "wagmi": ">=1" + }, + "devDependencies": { + "@bnb-chain/greenfield-cosmos-types": "0.4.0-alpha.30", + "@bnb-chain/greenfield-js-sdk": "1.2.0", + "@bnb-chain/reed-solomon": "^1.1.3", + "@rollup/plugin-inject": "^5.0.3", + "@rollup/plugin-node-resolve": "^15.2.3", + "@totejs/walletkit": "^1.0.8", + "@types/qrcode": "^1.5.5", + "@types/react": "^18.2.39", + "@types/react-dom": "^18.2.17", + "@vanilla-extract/css": "^1.14.0", + "@vanilla-extract/vite-plugin": "^3.9.2", + "@vitejs/plugin-react": "^4.2.0", + "ahooks": "^3.7.8", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "rollup-plugin-peer-deps-external": "^2.2.4", + "typescript": "^5.3.2", + "viem": "^1.19.9", + "vite": "^4.5.0", + "vite-plugin-dts": "^3.6.3", + "wagmi": "^1.4.7" + }, + "dependencies": { + "@ethersproject/wallet": "^5.7.0", + "axios": "^1.6.3", + "bignumber.js": "^9.1.2" + } +} \ No newline at end of file diff --git a/packages/uploadkit/src/base/components/Box/index.tsx b/packages/uploadkit/src/base/components/Box/index.tsx new file mode 100644 index 0000000..3467f35 --- /dev/null +++ b/packages/uploadkit/src/base/components/Box/index.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import { clsBox } from './styles.css'; +import { cx } from '@/base/utils/css'; + +type HTMLProperties = Omit, 'as'>; + +export interface BoxProps extends HTMLProperties { + as?: React.ElementType; +} + +export const Box = React.forwardRef((props: BoxProps, ref: any) => { + const { as = 'div', className, ...restProps } = props; + + return React.createElement(as, { + ref, + className: cx(clsBox, className), + ...restProps, + }); +}); + +Box.displayName = 'Box'; diff --git a/packages/uploadkit/src/base/components/Box/styles.css.ts b/packages/uploadkit/src/base/components/Box/styles.css.ts new file mode 100644 index 0000000..cc74e3a --- /dev/null +++ b/packages/uploadkit/src/base/components/Box/styles.css.ts @@ -0,0 +1,21 @@ +import { style } from '@vanilla-extract/css'; + +export const clsBox = style({ + WebkitTapHighlightColor: 'rgba(0, 0, 0, 0)', + margin: 0, + padding: 0, + boxSizing: 'border-box', + transitionProperty: 'background,color,opacity', + transitionDuration: '0.2s', + textDecoration: 'none', + '::before': { + margin: 0, + padding: 0, + boxSizing: 'border-box', + }, + '::after': { + margin: 0, + padding: 0, + boxSizing: 'border-box', + }, +}); diff --git a/packages/uploadkit/src/base/components/Button/index.tsx b/packages/uploadkit/src/base/components/Button/index.tsx new file mode 100644 index 0000000..4b58f61 --- /dev/null +++ b/packages/uploadkit/src/base/components/Button/index.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import { clsButton } from './styles.css'; +import { Box, BoxProps } from '../Box'; +import { cx } from '@/base/utils/css'; + +export type ButtonProps = BoxProps; + +export const Button = React.forwardRef((props: ButtonProps, ref: any) => { + const { className, ...restProps } = props; + + return ( + + ); +}); + +Button.displayName = 'Button'; diff --git a/packages/uploadkit/src/base/components/Button/styles.css.ts b/packages/uploadkit/src/base/components/Button/styles.css.ts new file mode 100644 index 0000000..859a999 --- /dev/null +++ b/packages/uploadkit/src/base/components/Button/styles.css.ts @@ -0,0 +1,21 @@ +import { cssVar } from '@/utils/css'; +import { style } from '@vanilla-extract/css'; + +export const clsButton = style({ + display: 'inline-flex', + alignItems: 'center', + justifyContent: 'center', + userSelect: 'none', + outline: 'none', + border: 'none', + cursor: 'pointer', + height: 56, + padding: '0 16px', + fontSize: 16, + fontWeight: 500, + lineHeight: '19px', + ':disabled': { + cursor: 'not-allowed', + backgroundColor: cssVar('disabled'), + }, +}); diff --git a/packages/uploadkit/src/base/components/CircleProgress/index.tsx b/packages/uploadkit/src/base/components/CircleProgress/index.tsx new file mode 100644 index 0000000..216600d --- /dev/null +++ b/packages/uploadkit/src/base/components/CircleProgress/index.tsx @@ -0,0 +1,48 @@ +import { cssVar } from '@/utils/css'; + +export const CircleProgressBar = ({ + percentage, + circleWidth, +}: { + percentage: number; + circleWidth: number; +}) => { + const strokeWidth = 4; + const radius = circleWidth / 2 - strokeWidth; + + const dashArray = radius * Math.PI * 2; + const dashOffset = dashArray - (dashArray * percentage) / 100; + + return ( +
+ + + + + +
+ ); +}; diff --git a/packages/uploadkit/src/base/components/CircleProgress/style.css.ts b/packages/uploadkit/src/base/components/CircleProgress/style.css.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/uploadkit/src/base/components/IconButton/index.tsx b/packages/uploadkit/src/base/components/IconButton/index.tsx new file mode 100644 index 0000000..f3cb89c --- /dev/null +++ b/packages/uploadkit/src/base/components/IconButton/index.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { ButtonProps, Button } from '../Button'; +import { clsIconButton } from './styles.css'; +import { cx } from '@/base/utils/css'; + +export interface IconButtonProps extends ButtonProps { + icon: React.ReactElement; +} + +export const IconButton = (props: IconButtonProps) => { + const { className, icon, ...restProps } = props; + + return ( + + ); +}; + +IconButton.displayName = 'IconButton'; diff --git a/packages/uploadkit/src/base/components/IconButton/styles.css.ts b/packages/uploadkit/src/base/components/IconButton/styles.css.ts new file mode 100644 index 0000000..afd549a --- /dev/null +++ b/packages/uploadkit/src/base/components/IconButton/styles.css.ts @@ -0,0 +1,15 @@ +import { cssVar } from '@/base/utils/css'; +import { hover } from '@/base/vanilla/index.css'; +import { style } from '@vanilla-extract/css'; + +export const clsIconButton = style({ + width: 24, + height: 24, + borderRadius: cssVar('navButton', 'radii'), + padding: 0, + background: 'transparent', + color: cssVar('navButtonText'), + '@media': hover({ + background: cssVar('navButtonBackgroundHover'), + }), +}); diff --git a/packages/uploadkit/src/base/components/LineProgress/index.tsx b/packages/uploadkit/src/base/components/LineProgress/index.tsx new file mode 100644 index 0000000..c895211 --- /dev/null +++ b/packages/uploadkit/src/base/components/LineProgress/index.tsx @@ -0,0 +1,21 @@ +import { Box } from '../Box'; +import { clsProgress, clsProgressLine, clsProgressLineInner, clsProgressText } from './style.css'; +import { cx } from '@/base/utils/css'; + +export type ProgressProps = { + progress: number; +}; + +export function LineProgressBar({ progress }: ProgressProps) { + return ( + + {progress}% + + + + + ); +} diff --git a/packages/uploadkit/src/base/components/LineProgress/style.css.ts b/packages/uploadkit/src/base/components/LineProgress/style.css.ts new file mode 100644 index 0000000..9332f0f --- /dev/null +++ b/packages/uploadkit/src/base/components/LineProgress/style.css.ts @@ -0,0 +1,29 @@ +import { cssVar } from '@/base/utils/css'; +import { mobile } from '@/base/vanilla/index.css'; +import { style } from '@vanilla-extract/css'; + +export const clsProgress = style({ + width: '100%', + maxWidth: 120, +}); + +export const clsProgressText = style({ + fontSize: 12, + fontWeight: 500, + color: cssVar('disabled'), + marginBottom: 4, +}); + +export const clsProgressLine = style({ + width: '100%', + height: 4, + backgroundColor: '#f5f5f5', + borderRadius: 2, + overflow: 'hidden', +}); + +export const clsProgressLineInner = style({ + height: '100%', + backgroundColor: '#1184EE', + transition: 'width 0.3s ease-in-out', +}); diff --git a/packages/uploadkit/src/base/components/Link/index.tsx b/packages/uploadkit/src/base/components/Link/index.tsx new file mode 100644 index 0000000..d6d2b26 --- /dev/null +++ b/packages/uploadkit/src/base/components/Link/index.tsx @@ -0,0 +1,21 @@ +import { cx } from '@/base/utils/css'; +import { Box, BoxProps } from '../Box'; +import { clsLink } from './styles.css'; + +export type LinkProps = BoxProps; + +export const Link = (props: LinkProps) => { + const { className, ...restProps } = props; + + return ( + + ); +}; + +Link.displayName = 'Link'; diff --git a/packages/uploadkit/src/base/components/Link/styles.css.ts b/packages/uploadkit/src/base/components/Link/styles.css.ts new file mode 100644 index 0000000..25f82bd --- /dev/null +++ b/packages/uploadkit/src/base/components/Link/styles.css.ts @@ -0,0 +1,13 @@ +import { cssVar } from '@/base/utils/css'; +import { hover } from '@/base/vanilla/index.css'; +import { style } from '@vanilla-extract/css'; + +export const clsLink = style({ + textDecoration: 'none', + ':visited': { + color: 'unset', + }, + '@media': hover({ + color: cssVar('blue'), + }), +}); diff --git a/packages/uploadkit/src/base/components/Loading/index.tsx b/packages/uploadkit/src/base/components/Loading/index.tsx new file mode 100644 index 0000000..f4f3373 --- /dev/null +++ b/packages/uploadkit/src/base/components/Loading/index.tsx @@ -0,0 +1,20 @@ +import { SVGIconProps } from '@/types'; +import { clsSpinner } from './style.css'; + +export const Loading = (props: SVGIconProps) => ( +
+ + + +
+); diff --git a/packages/uploadkit/src/base/components/Loading/style.css.ts b/packages/uploadkit/src/base/components/Loading/style.css.ts new file mode 100644 index 0000000..34428c4 --- /dev/null +++ b/packages/uploadkit/src/base/components/Loading/style.css.ts @@ -0,0 +1,20 @@ +import { keyframes, style } from '@vanilla-extract/css'; + +const clsLoadingKeyFrames = keyframes({ + '0%': { + transform: 'rotate(0deg)', + }, + '100%': { + transform: 'rotate(360deg)', + }, +}); + +export const clsSpinner = style({ + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + animationName: clsLoadingKeyFrames, + animationDuration: '800ms', + animationIterationCount: 'infinite', + animationTimingFunction: 'linear', +}); diff --git a/packages/uploadkit/src/base/components/Modal/ModalBody/index.tsx b/packages/uploadkit/src/base/components/Modal/ModalBody/index.tsx new file mode 100644 index 0000000..ea46eaa --- /dev/null +++ b/packages/uploadkit/src/base/components/Modal/ModalBody/index.tsx @@ -0,0 +1,11 @@ +import { cx } from '@/base/utils/css'; +import { clsModalBody } from './styles.css'; +import { Box, BoxProps } from '../../Box'; + +export type ModalBodyProps = BoxProps; + +export function ModalBody(props: ModalBodyProps) { + const { className, ...restProps } = props; + + return ; +} diff --git a/packages/uploadkit/src/base/components/Modal/ModalBody/styles.css.ts b/packages/uploadkit/src/base/components/Modal/ModalBody/styles.css.ts new file mode 100644 index 0000000..4ed0f21 --- /dev/null +++ b/packages/uploadkit/src/base/components/Modal/ModalBody/styles.css.ts @@ -0,0 +1,10 @@ +import { style } from '@vanilla-extract/css'; + +export const clsModalBody = style({ + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + textAlign: 'center', + overflow: 'scroll', + flex: 1, +}); diff --git a/packages/uploadkit/src/base/components/Modal/ModalFooter/index.tsx b/packages/uploadkit/src/base/components/Modal/ModalFooter/index.tsx new file mode 100644 index 0000000..55bf0e1 --- /dev/null +++ b/packages/uploadkit/src/base/components/Modal/ModalFooter/index.tsx @@ -0,0 +1,11 @@ +import { cx } from '@/base/utils/css'; +import { Box, BoxProps } from '../../Box'; +import { clsModalFooter } from './styles.css'; + +export type ModalFooterProps = BoxProps; + +export function ModalFooter(props: ModalFooterProps) { + const { className, ...restProps } = props; + + return ; +} diff --git a/packages/uploadkit/src/base/components/Modal/ModalFooter/styles.css.ts b/packages/uploadkit/src/base/components/Modal/ModalFooter/styles.css.ts new file mode 100644 index 0000000..34e2efd --- /dev/null +++ b/packages/uploadkit/src/base/components/Modal/ModalFooter/styles.css.ts @@ -0,0 +1,12 @@ +import { style } from '@vanilla-extract/css'; + +export const clsModalFooter = style({ + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + // alignItems: 'flex-end', + // marginTop: 32, + // borderTop: '1px solid rgba(0, 0, 0, 0.06)', + // height: 100, + // boxShadow: '0px 16px 48px 0px rgba(0, 0, 0, 0.16)', +}); diff --git a/packages/uploadkit/src/base/components/Modal/ModalHeader/index.tsx b/packages/uploadkit/src/base/components/Modal/ModalHeader/index.tsx new file mode 100644 index 0000000..816bdfd --- /dev/null +++ b/packages/uploadkit/src/base/components/Modal/ModalHeader/index.tsx @@ -0,0 +1,11 @@ +import { cx } from '@/base/utils/css'; +import { clsModalHeader } from './styles.css'; +import { Box, BoxProps } from '../../Box'; + +export type ModalHeaderProps = BoxProps; + +export function ModalHeader(props: ModalHeaderProps) { + const { className, ...restProps } = props; + + return ; +} diff --git a/packages/uploadkit/src/base/components/Modal/ModalHeader/styles.css.ts b/packages/uploadkit/src/base/components/Modal/ModalHeader/styles.css.ts new file mode 100644 index 0000000..4f90ebe --- /dev/null +++ b/packages/uploadkit/src/base/components/Modal/ModalHeader/styles.css.ts @@ -0,0 +1,15 @@ +import { mobile } from '@/base/vanilla/index.css'; +import { style } from '@vanilla-extract/css'; + +export const clsModalHeader = style({ + fontWeight: 600, + display: 'flex', + fontSize: 24, + lineHeight: '29px', + justifyContent: 'center', + textAlign: 'center', + '@media': mobile({ + fontSize: 18, + lineHeight: '22px', + }), +}); diff --git a/packages/uploadkit/src/base/components/Modal/index.tsx b/packages/uploadkit/src/base/components/Modal/index.tsx new file mode 100644 index 0000000..c6563e7 --- /dev/null +++ b/packages/uploadkit/src/base/components/Modal/index.tsx @@ -0,0 +1,60 @@ +import { useKeyDown } from '@/base/hooks/useKeyDown'; +import { cx } from '@/base/utils/css'; +import { BoxProps, Box } from '../Box'; +import { Portal } from '../Portal'; +import { Transition } from '../Transition'; +import { clsModal, clsModalOverlay, clsModalContent } from './styles.css'; +import { useScrollLock } from '@/base/hooks/useScrollLock'; +import { useResponsive } from '@/base/hooks/useResponsive'; + +export interface ModalProps extends BoxProps { + isOpen: boolean; + onClose: () => void; + children?: React.ReactNode; + contentClassName?: string; + closeOnEsc?: boolean; + closeOnOverlayClick?: boolean; +} + +export function Modal(props: ModalProps) { + const { + className, + isOpen, + onClose, + children, + contentClassName, + closeOnEsc = true, + closeOnOverlayClick = true, + ...restProps + } = props; + + useKeyDown({ + key: 'Escape', + enabled: isOpen && closeOnEsc, + handler() { + onClose(); + }, + }); + + useScrollLock(isOpen); + + const { isMobileLayout } = useResponsive(); + + return ( + + + + closeOnOverlayClick && onClose()} + /> + + + {children} + + + + + + ); +} diff --git a/packages/uploadkit/src/base/components/Modal/styles.css.ts b/packages/uploadkit/src/base/components/Modal/styles.css.ts new file mode 100644 index 0000000..6ccfb41 --- /dev/null +++ b/packages/uploadkit/src/base/components/Modal/styles.css.ts @@ -0,0 +1,51 @@ +import { cssVar } from '@/base/utils/css'; +import { mobile } from '@/base/vanilla/index.css'; +import { style } from '@vanilla-extract/css'; + +export const clsModal = style({ + zIndex: cssVar('modal', 'zIndices'), + position: 'fixed', + left: 0, + top: 0, + width: '100%', + height: '100%', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + color: cssVar('text'), + margin: 0, + padding: 0, + transition: 'all 0.3s', + boxSizing: 'border-box', + '@media': mobile({ + alignItems: 'flex-end', + }), +}); + +export const clsModalOverlay = style({ + position: 'absolute', + width: '100%', + height: '100%', + backgroundColor: cssVar('modalOverlay'), +}); + +export const clsModalContent = style({ + position: 'absolute', + display: 'flex', + flexDirection: 'column', + background: cssVar('modalBackground'), + padding: '24px 24px 40px', + width: 'calc(100% - 32px)', + maxWidth: 640, + height: 533, + borderRadius: cssVar('modal', 'radii'), + '@media': mobile({ + width: '100%', + maxWidth: '100vw', + borderBottomLeftRadius: 0, + borderBottomRightRadius: 0, + paddingBottom: 40, + left: 0, + bottom: 0, + }), +}); diff --git a/packages/uploadkit/src/base/components/Portal/index.tsx b/packages/uploadkit/src/base/components/Portal/index.tsx new file mode 100644 index 0000000..714e5e8 --- /dev/null +++ b/packages/uploadkit/src/base/components/Portal/index.tsx @@ -0,0 +1,34 @@ +import { useEffect, useRef, useState } from 'react'; +import { createPortal } from 'react-dom'; + +export interface PortalProps { + children: React.ReactNode; +} + +export const Portal = (props: PortalProps) => { + const { children } = props; + + const portal = useRef(); + const [, forceUpdate] = useState({}); + + useEffect(() => { + const host = document.body; + + portal.current = document.createElement('div'); + portal.current.setAttribute('class', 'uk-portal'); + + host.appendChild(portal.current); + forceUpdate({}); + + const portalNode = portal.current; + return () => { + if (host.contains(portalNode)) { + host.removeChild(portalNode); + } + }; + }, []); + + return portal.current ? createPortal(children, portal.current) : null; +}; + +Portal.displayName = 'Portal'; diff --git a/packages/uploadkit/src/base/components/Text/index.tsx b/packages/uploadkit/src/base/components/Text/index.tsx new file mode 100644 index 0000000..37b64a9 --- /dev/null +++ b/packages/uploadkit/src/base/components/Text/index.tsx @@ -0,0 +1,10 @@ +import { Box, BoxProps } from '../Box'; + +export type TextProps = BoxProps; + +export const Text = (props: TextProps) => { + const { ...restProps } = props; + return ; +}; + +Text.displayName = 'Text'; diff --git a/packages/uploadkit/src/base/components/Transition/fade.css.ts b/packages/uploadkit/src/base/components/Transition/fade.css.ts new file mode 100644 index 0000000..62840e5 --- /dev/null +++ b/packages/uploadkit/src/base/components/Transition/fade.css.ts @@ -0,0 +1,27 @@ +import { keyframes, style } from '@vanilla-extract/css'; + +const fadeInFrames = keyframes({ + '0%': { + opacity: 0, + }, + '100%': { + opacity: 1, + }, +}); + +const fadeOutFrames = keyframes({ + '0%': { + opacity: 1, + }, + '100%': { + opacity: 0, + }, +}); + +export const clsFadeIn = style({ + animation: `${fadeInFrames} 0.2s forwards`, +}); + +export const clsFadeOut = style({ + animation: `${fadeOutFrames} 0.2s forwards`, +}); diff --git a/packages/uploadkit/src/base/components/Transition/index.tsx b/packages/uploadkit/src/base/components/Transition/index.tsx new file mode 100644 index 0000000..58b7d7c --- /dev/null +++ b/packages/uploadkit/src/base/components/Transition/index.tsx @@ -0,0 +1,50 @@ +import React, { useEffect, useState } from 'react'; +import { cx } from '@/base/utils/css'; +import { clsFadeIn, clsFadeOut } from './fade.css'; +import { clsToastSlideIn, clsToastSlideOut } from './toastSlide.css'; +import { clsModalSlideIn, clsModalSlideOut } from './modalSlide.css'; + +const animationMap = { + fade: [clsFadeOut, clsFadeIn], + 'toast-slide': [clsToastSlideOut, clsToastSlideIn], + 'modal-slide': [clsModalSlideOut, clsModalSlideIn], +}; + +export interface TransitionProps { + in: boolean; + children: React.ReactElement; + variant?: keyof typeof animationMap; + onExit?: () => void; +} + +export const Transition = (props: TransitionProps) => { + const { in: show, children, variant = 'fade', onExit } = props; + + const { className, onAnimationEnd, ...restProps } = children.props; + + const [isMounted, setIsMounted] = useState(show); + + useEffect(() => { + if (show) { + setIsMounted(true); + } + }, [show]); + + const onPlayEnd = (e: AnimationEvent) => { + onAnimationEnd?.(e); + if (!show) { + onExit?.(); + setIsMounted(false); + } + }; + + if (!isMounted) { + return null; + } + + return React.cloneElement(children, { + className: cx(animationMap[variant][Number(show)], className), + onAnimationEnd: onPlayEnd, + ...restProps, + }); +}; diff --git a/packages/uploadkit/src/base/components/Transition/modalSlide.css.ts b/packages/uploadkit/src/base/components/Transition/modalSlide.css.ts new file mode 100644 index 0000000..4c02aec --- /dev/null +++ b/packages/uploadkit/src/base/components/Transition/modalSlide.css.ts @@ -0,0 +1,29 @@ +import { keyframes, style } from '@vanilla-extract/css'; + +const modalSlideInFrames = keyframes({ + '0%': { + transform: 'translateY(40%)', + }, + '100%': { + transform: 'translateY(0%)', + }, +}); + +const modalSlideOutFrames = keyframes({ + '0%': { + transform: 'translateY(0%)', + }, + '100%': { + transform: 'translateY(40%)', + }, +}); + +export const clsModalSlideIn = style({ + animation: `${modalSlideInFrames} 0.2s forwards ease-out`, + transformOrigin: 'bottom center', +}); + +export const clsModalSlideOut = style({ + animation: `${modalSlideOutFrames} 0.2s forwards ease-out`, + transformOrigin: 'bottom center', +}); diff --git a/packages/uploadkit/src/base/components/Transition/toastSlide.css.ts b/packages/uploadkit/src/base/components/Transition/toastSlide.css.ts new file mode 100644 index 0000000..6e4f60c --- /dev/null +++ b/packages/uploadkit/src/base/components/Transition/toastSlide.css.ts @@ -0,0 +1,42 @@ +import { keyframes, style } from '@vanilla-extract/css'; + +const toastSlideInFrames = keyframes({ + '0%': { + opacity: 0, + transform: 'translateY(-24px) scale(0.85)', + maxHeight: 0, + }, + '100%': { + opacity: 1, + transform: 'translateY(0) scale(1)', + maxHeight: 200, + }, +}); + +const toastSlideOutFrames = keyframes({ + '0%': { + opacity: 1, + transform: 'scale(1)', + maxHeight: 200, + }, + '50%': { + opacity: 0, + transform: 'scale(0.85)', + maxHeight: 0, + }, + '100%': { + opacity: 0, + transform: 'scale(0.85)', + maxHeight: 0, + }, +}); + +export const clsToastSlideIn = style({ + animation: `${toastSlideInFrames} 0.4s forwards`, + transformOrigin: '50% 50% 0px', +}); + +export const clsToastSlideOut = style({ + animation: `${toastSlideOutFrames} 0.4s forwards`, + transformOrigin: '50% 50% 0px', +}); diff --git a/packages/uploadkit/src/base/components/toast/ToastComponent.tsx b/packages/uploadkit/src/base/components/toast/ToastComponent.tsx new file mode 100644 index 0000000..dc82cfd --- /dev/null +++ b/packages/uploadkit/src/base/components/toast/ToastComponent.tsx @@ -0,0 +1,55 @@ +import { useEffect, useState } from 'react'; +import { clsIconWrapper, clsDescWrapper, clsContainer } from './styles.css'; +import { ErrorIcon } from '@/base/icons/ErrorIcon'; +import { InfoIcon } from '@/base/icons/InfoIcon'; +import { ToastOptions } from '.'; +import { Box } from '../Box'; +import { Transition } from '../Transition'; +import { ToastManager } from './ToastManager'; + +const iconMap: Record = { + info: , + error: , +}; + +export function ToastComponent(props: ToastOptions) { + const { variant = 'info', description, duration, toastId } = props; + + const [show, setShow] = useState(true); + const [delay, setDelay] = useState(duration); + + useEffect(() => { + if (delay) { + const timer = setTimeout(() => { + setShow(false); + }, delay); + + return () => { + clearTimeout(timer); + }; + } + }, [delay]); + + const onExit = () => { + ToastManager.remove(toastId); + }; + + const onMouseEnter = () => { + setDelay(undefined); + }; + + const onMouseLeave = () => { + setDelay(duration); + }; + + return ( + + + + {iconMap[variant]} + {description} + + + + ); +} diff --git a/packages/uploadkit/src/base/components/toast/ToastManager.ts b/packages/uploadkit/src/base/components/toast/ToastManager.ts new file mode 100644 index 0000000..9a521e3 --- /dev/null +++ b/packages/uploadkit/src/base/components/toast/ToastManager.ts @@ -0,0 +1,47 @@ +import { ToastOptions } from '.'; + +type SubscribeFuncType = (toastList: ToastOptions[]) => void; + +export const ToastManager = { + listeners: [] as SubscribeFuncType[], + toastList: [] as ToastOptions[], + autoIncreaseId: 0, + + add(options: ToastOptions) { + const toastId = this.autoIncreaseId++; + + this.toastList.unshift({ + toastId, + ...options, + }); + + this.notify(); + + return toastId; + }, + + remove(toastId?: number) { + const index = this.toastList.findIndex((item) => item.toastId === toastId); + if (index > -1) { + this.toastList.splice(index, 1); + this.notify(); + } + }, + + notify() { + this.listeners.forEach((fn) => { + fn([...this.toastList]); + }); + }, + + subscribe(fn: SubscribeFuncType) { + this.listeners.push(fn); + }, + + unsubscribe(fn: SubscribeFuncType) { + const index = this.listeners.findIndex((item) => item === fn); + if (index > -1) { + this.listeners.splice(index, 1); + } + }, +}; diff --git a/packages/uploadkit/src/base/components/toast/ToastProvider.tsx b/packages/uploadkit/src/base/components/toast/ToastProvider.tsx new file mode 100644 index 0000000..87dcb7c --- /dev/null +++ b/packages/uploadkit/src/base/components/toast/ToastProvider.tsx @@ -0,0 +1,39 @@ +import { useEffect, useState } from 'react'; +import { Portal } from '../Portal'; +import { ToastManager } from './ToastManager'; +import { ToastOptions } from '.'; +import { ToastComponent } from './ToastComponent'; +import { Box } from '../Box'; +import { clsToastRoot } from './styles.css'; +import { cx } from '@/base/utils/css'; + +export const ToastProvider = () => { + const [toastList, setToastList] = useState([]); + + useEffect(() => { + const update = (newList: ToastOptions[]) => { + setToastList(newList); + }; + + ToastManager.subscribe(update); + return () => { + ToastManager.unsubscribe(update); + }; + }, []); + + return ( + <> + {toastList.length > 0 && ( + + + {toastList.map((item) => ( + + ))} + + + )} + + ); +}; + +ToastProvider.displayName = 'ToastProvider'; diff --git a/packages/uploadkit/src/base/components/toast/index.tsx b/packages/uploadkit/src/base/components/toast/index.tsx new file mode 100644 index 0000000..5cb7a9e --- /dev/null +++ b/packages/uploadkit/src/base/components/toast/index.tsx @@ -0,0 +1,28 @@ +import { ToastManager } from './ToastManager'; + +export type ToastVariantType = 'info' | 'error'; + +export interface ToastOptions { + description: React.ReactNode; + variant?: ToastVariantType; + duration?: number; + toastId?: number; +} + +export const toast = (props: ToastOptions) => { + const { variant = 'info', duration = 3000, ...restProps } = props; + + return ToastManager.add({ + variant, + duration, + ...restProps, + }); +}; + +toast.info = (props: ToastOptions) => { + return toast({ variant: 'info', ...props }); +}; + +toast.error = (props: ToastOptions) => { + return toast({ variant: 'error', ...props }); +}; diff --git a/packages/uploadkit/src/base/components/toast/styles.css.ts b/packages/uploadkit/src/base/components/toast/styles.css.ts new file mode 100644 index 0000000..4810f48 --- /dev/null +++ b/packages/uploadkit/src/base/components/toast/styles.css.ts @@ -0,0 +1,44 @@ +import { cssVar } from '@/base/utils/css'; +import { style } from '@vanilla-extract/css'; + +export const clsToastRoot = style({ + position: 'fixed', + top: 0, + left: '50%', + transform: 'translateX(-50%)', + zIndex: cssVar('toast', 'zIndices'), + padding: 8, + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + pointerEvents: 'none', + width: '100%', + color: cssVar('text'), + maxWidth: 500, +}); + +export const clsContainer = style({ + display: 'inline-flex', + alignItems: 'center', + padding: '16px', + margin: 8, + background: cssVar('toastBackground'), + position: 'relative', + boxShadow: cssVar('toast', 'shadows'), + borderRadius: cssVar('toast', 'radii'), + wordWrap: 'break-word', + pointerEvents: 'all', +}); + +export const clsIconWrapper = style({ + display: 'flex', + alignItems: 'center', + justifyContent: 'center', +}); + +export const clsDescWrapper = style({ + marginLeft: '8px', + fontWeight: 500, + fontSize: '14px', + lineHeight: '1.4', +}); diff --git a/packages/uploadkit/src/base/constant/index.ts b/packages/uploadkit/src/base/constant/index.ts new file mode 100644 index 0000000..5756286 --- /dev/null +++ b/packages/uploadkit/src/base/constant/index.ts @@ -0,0 +1 @@ +export const MOBILE_MEDIA = 'screen and (max-width: 767px)'; diff --git a/packages/uploadkit/src/base/hooks/useClipboard.ts b/packages/uploadkit/src/base/hooks/useClipboard.ts new file mode 100644 index 0000000..4e68f2f --- /dev/null +++ b/packages/uploadkit/src/base/hooks/useClipboard.ts @@ -0,0 +1,51 @@ +import { useCallback, useEffect, useState } from 'react'; + +export function useClipboard(initialValue: string, timeout = 1500) { + const [hasCopied, setHasCopied] = useState(false); + const [value, setValue] = useState(initialValue); + + const onCopy = useCallback(() => { + const didCopy = copy(value); + setHasCopied(didCopy); + }, [value]); + + useEffect(() => { + let timer: any; + + if (hasCopied) { + timer = setTimeout(() => { + setHasCopied(false); + }, timeout); + } + + return () => { + timer && clearTimeout(timer); + }; + }, [timeout, hasCopied]); + + return { value, setValue, onCopy, hasCopied }; +} + +function copy(value: string) { + try { + const textarea = document.createElement('textarea'); + textarea.value = value; + + textarea.style.position = 'absolute'; + textarea.style.zIndex = '-1'; + + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + + document.body.removeChild(textarea); + } catch (err) { + if (navigator.clipboard) { + navigator.clipboard.writeText(value); + } else { + return false; + } + } + + return true; +} diff --git a/packages/uploadkit/src/base/hooks/useDisclosure.ts b/packages/uploadkit/src/base/hooks/useDisclosure.ts new file mode 100644 index 0000000..87ef5d8 --- /dev/null +++ b/packages/uploadkit/src/base/hooks/useDisclosure.ts @@ -0,0 +1,19 @@ +import { useCallback, useState } from 'react'; + +export function useDisclosure() { + const [isOpen, setIsOpen] = useState(false); + + const onOpen = useCallback(() => { + setIsOpen(true); + }, []); + + const onClose = useCallback(() => { + setIsOpen(false); + }, []); + + return { + isOpen, + onOpen, + onClose, + }; +} diff --git a/packages/uploadkit/src/base/hooks/useIsMounted.ts b/packages/uploadkit/src/base/hooks/useIsMounted.ts new file mode 100644 index 0000000..601f78f --- /dev/null +++ b/packages/uploadkit/src/base/hooks/useIsMounted.ts @@ -0,0 +1,11 @@ +import { useEffect, useState } from 'react'; + +export function useIsMounted() { + const [isMounted, setIsMounted] = useState(false); + + useEffect(() => { + setIsMounted(true); + }, []); + + return isMounted; +} diff --git a/packages/uploadkit/src/base/hooks/useKeyDown.ts b/packages/uploadkit/src/base/hooks/useKeyDown.ts new file mode 100644 index 0000000..67ee7d5 --- /dev/null +++ b/packages/uploadkit/src/base/hooks/useKeyDown.ts @@ -0,0 +1,28 @@ +import { useEffect } from 'react'; + +export interface UseKeyDownProps { + key?: string; + enabled?: boolean; + handler?: () => void; +} + +export function useKeyDown(props: UseKeyDownProps = {}) { + const { key = 'Enter', enabled = true, handler } = props; + + useEffect(() => { + if (!enabled) { + return; + } + + const onKeyDown = (e: KeyboardEvent) => { + if (e.code === key) { + handler?.(); + } + }; + + window.addEventListener('keydown', onKeyDown); + return () => { + window.removeEventListener('keydown', onKeyDown); + }; + }, [enabled, handler, key]); +} diff --git a/packages/uploadkit/src/base/hooks/useResponsive.ts b/packages/uploadkit/src/base/hooks/useResponsive.ts new file mode 100644 index 0000000..af156a1 --- /dev/null +++ b/packages/uploadkit/src/base/hooks/useResponsive.ts @@ -0,0 +1,31 @@ +import { useEffect, useState } from 'react'; +import { MOBILE_MEDIA } from '../constant'; + +export function useMediaQuery(query: string) { + const [isMatched, setIsMatched] = useState(false); + + useEffect(() => { + const onChange = () => { + const isMatched = window.matchMedia(query).matches; + setIsMatched(isMatched); + }; + + onChange(); + + const matchMedia = window.matchMedia(query); + matchMedia.addEventListener('change', onChange); + return () => { + matchMedia.removeEventListener('change', onChange); + }; + }, [query]); + + return isMatched; +} + +export const useResponsive = () => { + const isMobileLayout = useMediaQuery(MOBILE_MEDIA); + + return { + isMobileLayout, + }; +}; diff --git a/packages/uploadkit/src/base/hooks/useScrollLock.ts b/packages/uploadkit/src/base/hooks/useScrollLock.ts new file mode 100644 index 0000000..13c719a --- /dev/null +++ b/packages/uploadkit/src/base/hooks/useScrollLock.ts @@ -0,0 +1,16 @@ +import { useEffect } from 'react'; + +export function useScrollLock(isLocked = false) { + useEffect(() => { + if (!isLocked) { + return; + } + + const originalOverflow = document.documentElement.style.overflow; + document.documentElement.style.overflow = 'hidden'; + + return () => { + document.documentElement.style.overflow = originalOverflow; + }; + }, [isLocked]); +} diff --git a/packages/uploadkit/src/base/icons/AlertIcon.tsx b/packages/uploadkit/src/base/icons/AlertIcon.tsx new file mode 100644 index 0000000..5f035e4 --- /dev/null +++ b/packages/uploadkit/src/base/icons/AlertIcon.tsx @@ -0,0 +1,22 @@ +import { SVGIconProps } from '@/types'; + +export const AlertIcon = (props: SVGIconProps) => { + return ( + + + + + + ); +}; diff --git a/packages/uploadkit/src/base/icons/BackIcon.tsx b/packages/uploadkit/src/base/icons/BackIcon.tsx new file mode 100644 index 0000000..4514fe5 --- /dev/null +++ b/packages/uploadkit/src/base/icons/BackIcon.tsx @@ -0,0 +1,13 @@ +import { SVGIconProps } from '@/types'; + +export const BackIcon = (props: SVGIconProps) => { + return ( + + + + ); +}; diff --git a/packages/uploadkit/src/base/icons/CloseIcon.tsx b/packages/uploadkit/src/base/icons/CloseIcon.tsx new file mode 100644 index 0000000..ca1f5bf --- /dev/null +++ b/packages/uploadkit/src/base/icons/CloseIcon.tsx @@ -0,0 +1,13 @@ +import { SVGIconProps } from '@/types'; + +export const CloseIcon = (props: SVGIconProps) => { + return ( + + + + ); +}; diff --git a/packages/uploadkit/src/base/icons/CopyIcon.tsx b/packages/uploadkit/src/base/icons/CopyIcon.tsx new file mode 100644 index 0000000..c69ad8f --- /dev/null +++ b/packages/uploadkit/src/base/icons/CopyIcon.tsx @@ -0,0 +1,18 @@ +import { SVGIconProps } from '@/types'; + +export const CopyIcon = (props: SVGIconProps) => { + return ( + + + + + ); +}; diff --git a/packages/uploadkit/src/base/icons/DownArrowIcon.tsx b/packages/uploadkit/src/base/icons/DownArrowIcon.tsx new file mode 100644 index 0000000..edcae3d --- /dev/null +++ b/packages/uploadkit/src/base/icons/DownArrowIcon.tsx @@ -0,0 +1,13 @@ +import { SVGIconProps } from '@/types'; + +export const DownArrowIcon = (props: SVGIconProps) => { + return ( + + + + ); +}; diff --git a/packages/uploadkit/src/base/icons/ErrorIcon.tsx b/packages/uploadkit/src/base/icons/ErrorIcon.tsx new file mode 100644 index 0000000..56e5a71 --- /dev/null +++ b/packages/uploadkit/src/base/icons/ErrorIcon.tsx @@ -0,0 +1,34 @@ +import { SVGIconProps } from '@/types'; +import { cssVar } from '../utils/css'; + +export const ErrorIcon = (props: SVGIconProps) => { + const errorColor = cssVar('error'); + return ( + + + + + + + + ); +}; diff --git a/packages/uploadkit/src/base/icons/ExitIcon.tsx b/packages/uploadkit/src/base/icons/ExitIcon.tsx new file mode 100644 index 0000000..02e711a --- /dev/null +++ b/packages/uploadkit/src/base/icons/ExitIcon.tsx @@ -0,0 +1,13 @@ +import { SVGIconProps } from '@/types'; + +export const ExitIcon = (props: SVGIconProps) => { + return ( + + + + ); +}; diff --git a/packages/uploadkit/src/base/icons/ForwardIcon.tsx b/packages/uploadkit/src/base/icons/ForwardIcon.tsx new file mode 100644 index 0000000..1aedfe4 --- /dev/null +++ b/packages/uploadkit/src/base/icons/ForwardIcon.tsx @@ -0,0 +1,13 @@ +import { SVGIconProps } from '@/types'; + +export const ForwardIcon = (props: SVGIconProps) => { + return ( + + + + ); +}; diff --git a/packages/uploadkit/src/base/icons/InfoIcon.tsx b/packages/uploadkit/src/base/icons/InfoIcon.tsx new file mode 100644 index 0000000..6942184 --- /dev/null +++ b/packages/uploadkit/src/base/icons/InfoIcon.tsx @@ -0,0 +1,17 @@ +import { SVGIconProps } from '@/types'; + +export const InfoIcon = (props: SVGIconProps) => { + return ( + + + + + + ); +}; diff --git a/packages/uploadkit/src/base/icons/ObjectIcon.tsx b/packages/uploadkit/src/base/icons/ObjectIcon.tsx new file mode 100644 index 0000000..884802e --- /dev/null +++ b/packages/uploadkit/src/base/icons/ObjectIcon.tsx @@ -0,0 +1,29 @@ +import { SVGIconProps } from '@/types'; + +export const ObjectIcon = (props: SVGIconProps) => { + return ( + + + + + + + + + ); +}; diff --git a/packages/uploadkit/src/base/icons/ObjectsIcon.tsx b/packages/uploadkit/src/base/icons/ObjectsIcon.tsx new file mode 100644 index 0000000..edbce11 --- /dev/null +++ b/packages/uploadkit/src/base/icons/ObjectsIcon.tsx @@ -0,0 +1,239 @@ +import { SVGIconProps } from '@/types'; + +export const ObjectsIcon = (props: SVGIconProps) => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/packages/uploadkit/src/base/icons/RefreshIcon.tsx b/packages/uploadkit/src/base/icons/RefreshIcon.tsx new file mode 100644 index 0000000..bf85f74 --- /dev/null +++ b/packages/uploadkit/src/base/icons/RefreshIcon.tsx @@ -0,0 +1,58 @@ +import { SVGIconProps } from '@/types'; + +export const RefreshIcon = (props: SVGIconProps) => { + return ( + + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/packages/uploadkit/src/base/icons/SuccessIcon.tsx b/packages/uploadkit/src/base/icons/SuccessIcon.tsx new file mode 100644 index 0000000..0afde56 --- /dev/null +++ b/packages/uploadkit/src/base/icons/SuccessIcon.tsx @@ -0,0 +1,15 @@ +import { SVGIconProps } from '@/types'; + +export const SuccessIcon = (props: SVGIconProps) => { + return ( + + + + + ); +}; diff --git a/packages/uploadkit/src/base/icons/UploadIcon.tsx b/packages/uploadkit/src/base/icons/UploadIcon.tsx new file mode 100644 index 0000000..4baf984 --- /dev/null +++ b/packages/uploadkit/src/base/icons/UploadIcon.tsx @@ -0,0 +1,24 @@ +import { SVGIconProps } from '@/types'; + +export const UploadIcon = (props: SVGIconProps) => { + return ( + + + + + + ); +}; diff --git a/packages/uploadkit/src/base/icons/WalletIcon.tsx b/packages/uploadkit/src/base/icons/WalletIcon.tsx new file mode 100644 index 0000000..f0ff23d --- /dev/null +++ b/packages/uploadkit/src/base/icons/WalletIcon.tsx @@ -0,0 +1,13 @@ +import { SVGIconProps } from '@/types'; + +export const WalletIcon = (props: SVGIconProps) => { + return ( + + + + ); +}; diff --git a/packages/uploadkit/src/base/utils/common.ts b/packages/uploadkit/src/base/utils/common.ts new file mode 100644 index 0000000..68a6639 --- /dev/null +++ b/packages/uploadkit/src/base/utils/common.ts @@ -0,0 +1,32 @@ +export function isObject(item: any) { + return item && typeof item === 'object' && !Array.isArray(item) && item !== null; +} + +export function deepMerge(target: any, source: any) { + if (isObject(target) && isObject(source)) { + for (const key in source) { + if (isObject(source[key])) { + if (!target[key]) Object.assign(target, { [key]: {} }); + deepMerge(target[key], source[key]); + } else { + Object.assign(target, { [key]: source[key] }); + } + } + } + + return target; +} + +export function formatBytes(bytes: number, decimals = 2): string { + if (bytes === 0) { + return '0 Bytes'; + } + + const k = 1024; + const dm = decimals < 0 ? 0 : decimals; + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + + const i = Math.floor(Math.log(bytes) / Math.log(k)); + + return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; +} diff --git a/packages/uploadkit/src/base/utils/css.ts b/packages/uploadkit/src/base/utils/css.ts new file mode 100644 index 0000000..ec9f240 --- /dev/null +++ b/packages/uploadkit/src/base/utils/css.ts @@ -0,0 +1,29 @@ +export function cx(...classNames: Array) { + if (!classNames.length) return; + return classNames.filter(Boolean).join(' '); +} + +export function cssVar(name: string, type = 'colors') { + return `var(--uk-${type}-${name.replace(/\./g, '-')})`; +} + +export function rgba( + firstValue: number | string, + secondValue?: number, + thirdValue?: number, + fourthValue = 1, +): string { + if (typeof firstValue === 'string') { + if (firstValue.startsWith('#')) { + const hexStr = firstValue.slice(1); + const formatStr = hexStr.length === 3 ? hexStr.replace(/[A-F\d]/gi, '$&$&') : hexStr; + const hexArr = formatStr.match(/.{2}/g)?.map((v) => parseInt(v, 16)); + + if (hexArr?.length === 3) { + return rgba(hexArr[0], hexArr[1], hexArr[2], secondValue); + } + } + } + + return `rgba(${firstValue}, ${secondValue}, ${thirdValue}, ${fourthValue})`; +} diff --git a/packages/uploadkit/src/base/utils/mobile.ts b/packages/uploadkit/src/base/utils/mobile.ts new file mode 100644 index 0000000..228fbfd --- /dev/null +++ b/packages/uploadkit/src/base/utils/mobile.ts @@ -0,0 +1,23 @@ +export function isAndroid(): boolean { + return typeof navigator !== 'undefined' && /android/i.test(navigator.userAgent); +} + +export function isSmallIOS(): boolean { + return typeof navigator !== 'undefined' && /iPhone|iPod/.test(navigator.userAgent); +} + +export function isLargeIOS(): boolean { + return ( + typeof navigator !== 'undefined' && + (/iPad/.test(navigator.userAgent) || + (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) + ); +} + +export function isIOS(): boolean { + return isSmallIOS() || isLargeIOS(); +} + +export function isMobile(): boolean { + return isAndroid() || isIOS(); +} diff --git a/packages/uploadkit/src/base/vanilla/global.css.ts b/packages/uploadkit/src/base/vanilla/global.css.ts new file mode 100644 index 0000000..0a47976 --- /dev/null +++ b/packages/uploadkit/src/base/vanilla/global.css.ts @@ -0,0 +1,5 @@ +import { globalStyle } from '@vanilla-extract/css'; + +globalStyle('.uk-drop-zone', { + width: '100%', +}); diff --git a/packages/uploadkit/src/base/vanilla/index.css.ts b/packages/uploadkit/src/base/vanilla/index.css.ts new file mode 100644 index 0000000..763d7e0 --- /dev/null +++ b/packages/uploadkit/src/base/vanilla/index.css.ts @@ -0,0 +1,25 @@ +import { ComplexStyleRule } from '@vanilla-extract/css'; +import { MOBILE_MEDIA } from '../constant'; + +export function hover(props: ComplexStyleRule): any { + return { + '(hover: hover) and (pointer: fine)': { + ':hover': { + ...props, + }, + }, + screen: { + ':active': { + ...props, + }, + }, + }; +} + +export function mobile(props: ComplexStyleRule): any { + return { + [MOBILE_MEDIA]: { + ...props, + }, + }; +} diff --git a/packages/uploadkit/src/components/DragArea/index.tsx b/packages/uploadkit/src/components/DragArea/index.tsx new file mode 100644 index 0000000..22bb82e --- /dev/null +++ b/packages/uploadkit/src/components/DragArea/index.tsx @@ -0,0 +1,168 @@ +import { Box, BoxProps } from '@/base/components/Box'; +import { cx } from '@/utils/css'; +import React from 'react'; +import { + clsDragArea, + clsDragAreaContainer, + clsDragAreaDisable, + clsDragAreaDragging, + clsDragAreaInput, + clsDragAreaLink, + clsDragAreaSm, + clsDragAreaText, + clsDragAreaTitle, +} from './style.css'; +import { useUpload } from '../UploadProvider'; +import { ObjectsIcon } from '@/base/icons/ObjectsIcon'; +import { Text } from '@/base/components/Text'; +import { WaitObject } from '../UploadProvider/types'; +import { TransferItemFlat, flattenTransferItems, validateFile } from '@/utils/object'; +import { useUploadKitContext } from '../UploadKitProvider/context'; +import { RECOMMEND_MAX_OBJECT_SIZE } from '@/defaultConfig/getDefaultProviderOptions'; +import { useUploadDisable } from '@/hooks/useUploadDisable'; + +export type DragAreaProps = BoxProps; +export function DragArea(props: DragAreaProps) { + const { className, ...restProps } = props; + const input = React.useRef(null); + const drag = React.useRef(null); + const drop = React.useRef(null); + const [dragging, setDragging] = React.useState(false); + const { dragAreaDisabled } = useUploadDisable(); + const { state, dispatch } = useUpload(); + const { + options: { maxObjectSize, maxObjectCount, onError }, + } = useUploadKitContext(); + const errorHandler = (errorMsg: string) => { + onError && onError(errorMsg); + }; + React.useEffect(() => { + drop && drop.current && drop.current.addEventListener('dragover', handleDragOver); + drop && drop.current && drop.current.addEventListener('drop', handleDrop); + drop && drop.current && drop.current.addEventListener('dragenter', handleDragEnter); + drop && drop.current && drop.current.addEventListener('dragleave', handleDragLeave); + + return () => { + drop && drop.current && drop.current.removeEventListener('dragover', handleDragOver); + drop && drop.current && drop.current.removeEventListener('drop', handleDrop); + drop && drop.current && drop.current.removeEventListener('dragenter', handleDragEnter); + drop && drop.current && drop.current.removeEventListener('dragleave', handleDragLeave); + }; + }, [dragAreaDisabled]); + + const handleDragOver = (e: DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + }; + + const handleDrop = async (e: DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + setDragging(false); + + const { items } = e.dataTransfer || {}; + + if (!items) return; + const objects = await flattenTransferItems(items); + handleSelectFiles(objects); + }; + + const handleDragEnter = (e: DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + + // if (e.target !== drag.current) { + setDragging(true); + // onDragEnter && onDragEnter(); + // } + }; + + const handleDragLeave = (e: DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + + // if (e.target === drag.current) { + setDragging(false); + // onDragLeave && onDragLeave(); + // } + }; + + const handleSelectFiles = (files: FileList | TransferItemFlat) => { + if (dragAreaDisabled) return; + const queue = [] as WaitObject[]; + if (maxObjectCount && Object.keys(files).length > maxObjectCount) { + return errorHandler( + `Please limit the upload to a maximum of ${maxObjectCount} objects at a time.`, + ); + } + Object.values(files).forEach((file: File) => { + const errorMsg = validateFile(file, maxObjectSize || RECOMMEND_MAX_OBJECT_SIZE); + const time = +new Date(); + const id = parseInt(String(time * Math.random())); + queue.push({ + file, + status: errorMsg ? 'ERROR' : 'WAIT', + id, + time, + msg: errorMsg || '', + type: file.type, + size: file.size, + name: file.name, + relativePath: '', + }); + }); + dispatch({ + type: 'SET_WAIT_QUEUE', + payload: queue, + }); + }; + + const onInputChange = (e: React.ChangeEvent) => { + const files = e.target.files; + if (!files) return; + handleSelectFiles(files); + }; + const openFileDialog = () => { + input && input.current && input.current.click(); + }; + + const hasWaitQueue = state.waitQueue && state.waitQueue.length > 0; + + const ukDragAreaStyle = React.useMemo(() => { + return cx( + clsDragArea, + !dragAreaDisabled && dragging ? clsDragAreaDragging : '', + hasWaitQueue ? clsDragAreaSm : '', + ); + }, [dragAreaDisabled, dragging, hasWaitQueue]); + + const disableStyle = dragAreaDisabled ? clsDragAreaDisable : ''; + + return ( + + + + + + Drag and drop here + + + or + + browse files + + + + + ); +} diff --git a/packages/uploadkit/src/components/DragArea/style.css.ts b/packages/uploadkit/src/components/DragArea/style.css.ts new file mode 100644 index 0000000..b7a6f21 --- /dev/null +++ b/packages/uploadkit/src/components/DragArea/style.css.ts @@ -0,0 +1,63 @@ +import { cssVar } from '@/base/utils/css'; +import { style } from '@vanilla-extract/css'; + +export const clsDragAreaContainer = style({ + position: 'relative', + width: '100%', +}); + +export const clsDragAreaInput = style({ + position: 'absolute', + top: 0, + left: 0, + width: '100%', + height: '100%', + cursor: 'default', + visibility: 'hidden', +}); + +export const clsDragAreaInputDisable = style({ + display: 'none', +}); + +export const clsDragArea = style({ + width: '100%', + border: `1px dashed ${cssVar('disabled')}`, + height: 350, + display: 'flex', + gap: 8, + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'center', + cursor: 'pointer', +}); + +export const clsDragAreaSm = style({ + height: 56, + gap: 4, + flexDirection: 'row', +}); + +export const clsDragAreaDragging = style({ + border: `1px dashed ${cssVar('blue')}`, +}); + +export const clsDragAreaTitle = style({ + fontSize: 16, + fontWeight: 700, +}); + +export const clsDragAreaText = style({ + display: 'inline', + fontWeight: 500, +}); + +export const clsDragAreaLink = style({ + color: cssVar('blue'), + display: 'inline', + fontWeight: 500, +}); + +export const clsDragAreaDisable = style({ + color: cssVar('disabled'), +}); diff --git a/packages/uploadkit/src/components/FeeProvider/context.ts b/packages/uploadkit/src/components/FeeProvider/context.ts new file mode 100644 index 0000000..784373c --- /dev/null +++ b/packages/uploadkit/src/components/FeeProvider/context.ts @@ -0,0 +1,37 @@ +import React from 'react'; + +export type GasObjects = { + [msgTypeUrl: string]: { + gasLimit: number; + msgTypeUrl: string; + gasFee: number; + perItemFee: number; + }; +}; + +export type GasHub = { + gasPrice: string; + gasObjects: GasObjects; +}; + +export type StoreParams = { + readPrice: string; + primarySpStorePrice: string; + secondarySpStorePrice: string; + validatorTaxRate: string; + minChargeSize: number; + redundantDataChunkNum: number; + redundantParityChunkNum: number; + reserveTime: string; +}; +export interface FeeContextProps { + gasHub: GasHub; + storeParams: StoreParams; +} + +export const FeeContext = React.createContext({} as FeeContextProps); + +export function useFee() { + const context = React.useContext(FeeContext); + return context; +} diff --git a/packages/uploadkit/src/components/FeeProvider/index.tsx b/packages/uploadkit/src/components/FeeProvider/index.tsx new file mode 100644 index 0000000..e79dedf --- /dev/null +++ b/packages/uploadkit/src/components/FeeProvider/index.tsx @@ -0,0 +1,74 @@ +import { useState } from 'react'; +import { FeeContext, GasObjects, StoreParams } from './context'; +import useAsyncEffect from '@/hooks/useAsyncEffect'; +import { getStoreFeeParams } from '@/facade/payment'; +import { useUploadKitContext } from '../UploadKitProvider/context'; +import { Long, MsgGrantAllowanceTypeUrl } from '@bnb-chain/greenfield-js-sdk'; + +export const GAS_PRICE = '0.000000005'; + +export interface FeeProviderProps { + children: React.ReactNode; +} + +export function FeeProvider(props: FeeProviderProps) { + const { children } = props; + const { + options: { client }, + } = useUploadKitContext(); + const [gasHub, setGasHub] = useState({ + gasPrice: GAS_PRICE, + gasObjects: {} as GasObjects, + }); + const [storeParams, setStoreParams] = useState({} as StoreParams); + + useAsyncEffect(async () => { + const storeFeeParams = await getStoreFeeParams(client); + setStoreParams(storeFeeParams); + const { gasPrice } = gasHub; + const res = await client.gashub.getMsgGasParams({ + msgTypeUrls: [], + pagination: { + countTotal: true, + key: Uint8Array.from([]), + limit: Long.fromInt(1000), + offset: Long.fromInt(0), + reverse: false, + }, + }); + + const tempGasObjects = {} as GasObjects; + res.msgGasParams.forEach((item) => { + let gasLimit = item.fixedType?.fixedGas.low || 0; + let gasFee = +gasPrice * gasLimit; + let perItemFee = 0; + if (item.msgTypeUrl === MsgGrantAllowanceTypeUrl) { + gasLimit = item.grantAllowanceType?.fixedGas.low || 0; + gasFee = +gasPrice * gasLimit; + perItemFee = (item.grantAllowanceType?.gasPerItem.low || 0) * +gasPrice; + } + + tempGasObjects[item.msgTypeUrl] = { + msgTypeUrl: item.msgTypeUrl, + gasLimit, + gasFee, + perItemFee, + }; + }); + setGasHub({ + gasPrice: gasPrice, + gasObjects: tempGasObjects, + }); + }, []); + + return ( + + {children} + + ); +} diff --git a/packages/uploadkit/src/components/GlobalTasks/index.tsx b/packages/uploadkit/src/components/GlobalTasks/index.tsx new file mode 100644 index 0000000..76b224a --- /dev/null +++ b/packages/uploadkit/src/components/GlobalTasks/index.tsx @@ -0,0 +1,230 @@ +import { useUpload } from '../UploadProvider'; +import { useMemo } from 'react'; +import { UploadObject } from '../UploadProvider/types'; +import { ReedSolomon } from '@bnb-chain/reed-solomon'; +import useSingleton from '@/hooks/useSingleton'; +import { CreateObjectApprovalRequest } from '@bnb-chain/greenfield-js-sdk'; +import { parseErrorXml } from '@/utils/common'; +import { TMakePutObjectHeaders, getCreateObjectTx, makePutObjectHeaders } from '@/facade/object'; +import { AuthType, broadcastTmpTx } from '@/facade/tx'; +import { useAccount } from 'wagmi'; +import axios from 'axios'; +import { useUploadKitContext } from '../UploadKitProvider/context'; +import useAsyncEffect from '@/hooks/useAsyncEffect'; + +export const GlobalTasks = () => { + const { state, dispatch } = useUpload(); + const { address } = useAccount(); + const { + options: { client }, + } = useUploadKitContext(); + const { uploadQueue, tmpAccount, selectedSp, seedString } = state; + const rs = useSingleton(ReedSolomon); + const hashTask = useMemo(() => { + const hashQueue = uploadQueue.filter((task: UploadObject) => task.status === 'HASH'); + const wQueue = uploadQueue.filter((task: UploadObject) => task.status === 'WAIT'); + const res = hashQueue.length ? null : wQueue[0] ? wQueue[0] : null; + + return res; + }, [JSON.stringify(uploadQueue)]); + const signTask = useMemo(() => { + const signQueue = uploadQueue.filter((task: UploadObject) => task.status === 'SIGN'); + const hashedQueue = uploadQueue.filter((task: UploadObject) => task.status === 'HASHED'); + const uploadingQueue = uploadQueue.filter((task: UploadObject) => task.status === 'UPLOAD'); + if (uploadingQueue.length || !!signQueue.length) { + return null; + } + + return hashedQueue[0] ? hashedQueue[0] : null; + }, [JSON.stringify(uploadQueue)]); + + const uploadTask = useMemo(() => { + const uploadingQueue = uploadQueue.filter((t: UploadObject) => t.status === 'UPLOAD'); + const signedQueue = uploadQueue.filter((t: UploadObject) => t.status === 'SIGNED'); + const uploadingOffset = 1 - uploadingQueue.length; + if (uploadingOffset <= 0) return []; + + return signedQueue.slice(0, uploadingOffset).map((p: UploadObject) => p.id); + }, [JSON.stringify(uploadQueue)]); + + useAsyncEffect(async () => { + if (!hashTask) return; + dispatch({ + type: 'SET_UPLOAD_TASK_STATUS', + payload: { + id: hashTask.id, + status: 'HASH', + }, + }); + const fileBytes = await hashTask.waitObject.file.arrayBuffer(); + const checkSumRes = rs.encode(new Uint8Array(fileBytes)); + if (!checkSumRes) { + return dispatch({ + type: 'SET_UPLOAD_TASK_ERROR_MSG', + payload: { + id: hashTask.id, + msg: 'calculating hash error', + }, + }); + } + dispatch({ + type: 'SET_UPLOAD_TASK_CHECKSUM', + payload: { + id: hashTask.id, + checksum: checkSumRes, + }, + }); + }, [hashTask, dispatch]); + + // 2. Sign + useAsyncEffect(async () => { + if (!signTask) return; + dispatch({ + type: 'SET_UPLOAD_TASK_STATUS', + payload: { + id: signTask.id, + status: 'SIGN', + }, + }); + + const createObjectPayload: CreateObjectApprovalRequest = { + bucketName: signTask.bucketName, + objectName: signTask.waitObject.name, + creator: tmpAccount.address, + visibility: signTask.visibility, + fileType: signTask.waitObject.type || 'application/octet-stream', + contentLength: signTask.waitObject.size, + expectCheckSums: signTask.checksum, + duration: 5000, + }; + + const [createObjectTx, _createError] = await getCreateObjectTx( + createObjectPayload, + { + type: 'ECDSA', + privateKey: tmpAccount.privateKey, + }, + client, + ); + if (createObjectTx === null || _createError) { + return dispatch({ + type: 'SET_UPLOAD_TASK_ERROR_MSG', + payload: { + id: signTask.id, + msg: _createError, + }, + }); + } + const [res, bError] = await broadcastTmpTx(createObjectTx, tmpAccount, address!); + + if (res === null || bError) { + return dispatch({ + type: 'SET_UPLOAD_TASK_ERROR_MSG', + payload: { + id: signTask.id, + msg: bError, + }, + }); + } + + dispatch({ + type: 'SET_UPLOAD_TASK_CREATE_HASH', + payload: { + id: signTask.id, + createHash: res.transactionHash, + }, + }); + }, [signTask, dispatch]); + + const runUploadTask = async (task: UploadObject) => { + dispatch({ + type: 'SET_UPLOAD_TASK_STATUS', + payload: { + id: task.id, + status: 'UPLOAD', + }, + }); + const payload: TMakePutObjectHeaders = { + bucketName: task.bucketName, + objectName: task.waitObject.name, + body: task.waitObject.file, + endpoint: selectedSp.endpoint, + txnHash: task.createHash, + }; + const authType = { + type: 'EDDSA', + seed: seedString, + domain: window.location.origin, + address, + } as AuthType; + const [uploadOptions, poError] = await makePutObjectHeaders(payload, authType, client); + + if (!uploadOptions || poError) { + return dispatch({ + type: 'SET_UPLOAD_TASK_ERROR_MSG', + payload: { + id: task.id, + msg: poError, + }, + }); + } + const { url, headers } = uploadOptions; + + axios + .put(url, task.waitObject.file, { + async onUploadProgress(progressEvent) { + const progress = Math.round( + (progressEvent.loaded / (progressEvent.total as number)) * 100, + ); + dispatch({ + type: 'SET_UPLOAD_TASK_PROGRESS', + payload: { + id: task.id, + progress, + }, + }); + }, + + headers: { + Authorization: headers.get('Authorization'), + 'content-type': headers.get('content-type'), + 'x-gnfd-app-domain': headers.get('x-gnfd-app-domain'), + 'x-gnfd-content-sha256': headers.get('x-gnfd-content-sha256'), + 'x-gnfd-date': headers.get('x-gnfd-date'), + 'x-gnfd-expiry-timestamp': headers.get('x-gnfd-expiry-timestamp'), + 'x-gnfd-txn-hash': headers.get('x-gnfd-txn-hash'), + 'x-gnfd-user-address': headers.get('x-gnfd-user-address'), + }, + }) + .catch(async (e: Response | any) => { + console.log('upload error', e); + const { message } = await parseErrorXml(e); + const authExpired = [ + 'bad signature', + 'invalid signature', + 'user public key is expired', + ].includes(message || ''); + setTimeout(() => { + dispatch({ + type: 'SET_UPLOAD_TASK_ERROR_MSG', + payload: { + id: task.id, + msg: authExpired + ? 'Authentication expired.' + : message || e?.message || 'upload error', + }, + }); + }, 200); + }); + }; + + // 3. Upload + useAsyncEffect(async () => { + if (!uploadTask) return; + + const tasks = uploadQueue.filter((t: UploadObject) => uploadTask.includes(t.id)); + tasks.forEach(runUploadTask); + }, [uploadTask.join('')]); + + return <>; +}; diff --git a/packages/uploadkit/src/components/ModalProvider/context.ts b/packages/uploadkit/src/components/ModalProvider/context.ts new file mode 100644 index 0000000..c10df89 --- /dev/null +++ b/packages/uploadkit/src/components/ModalProvider/context.ts @@ -0,0 +1,17 @@ +import React, { useContext } from 'react'; + +export interface ModalContextProps { + isClosable: boolean; + closeOnEsc?: boolean; + closeOnOverlayClick?: boolean; + isOpen: boolean; + onClose: () => void; + onOpen: () => void; +} + +export const ModalContext = React.createContext({} as ModalContextProps); + +export function useModal() { + const context = useContext(ModalContext); + return context; +} diff --git a/packages/uploadkit/src/components/ModalProvider/index.tsx b/packages/uploadkit/src/components/ModalProvider/index.tsx new file mode 100644 index 0000000..ebb2d3f --- /dev/null +++ b/packages/uploadkit/src/components/ModalProvider/index.tsx @@ -0,0 +1,57 @@ +import { useDisclosure } from '@/base/hooks/useDisclosure'; +import { useMemo, useState } from 'react'; +import { useRouter } from '../RouteProvider/context'; +import { useUploadKitContext } from '../UploadKitProvider/context'; +import { ModalContext } from './context'; +import { useUpload } from '../UploadProvider'; + +export interface ModalProviderProps { + children: React.ReactNode; +} + +export function ModalProvider(props: ModalProviderProps) { + const { children } = props; + const [isClosable, setIsClosable] = useState(true); + const { isOpen, onClose, onOpen } = useDisclosure(); + const { dispatch } = useUpload(); + const router = useRouter(); + const { options } = useUploadKitContext(); + const { closeModalOnEsc, closeModalOnOverlayClick } = options; + + const value = useMemo(() => { + const onResetWaitQueue = () => { + dispatch({ + type: 'RESET_WAIT_QUEUE', + }); + }; + + return { + isClosable, + closeOnEsc: closeModalOnEsc, + closeOnOverlayClick: closeModalOnOverlayClick, + isOpen, + onClose() { + onClose(); + setTimeout(() => { + setIsClosable(true); + router.reset(); + onResetWaitQueue(); + }, 300); + }, + onOpen() { + onOpen(); + }, + }; + }, [ + closeModalOnEsc, + closeModalOnOverlayClick, + dispatch, + isClosable, + isOpen, + onClose, + onOpen, + router, + ]); + + return {children}; +} diff --git a/packages/uploadkit/src/components/Navbar/index.tsx b/packages/uploadkit/src/components/Navbar/index.tsx new file mode 100644 index 0000000..6d67031 --- /dev/null +++ b/packages/uploadkit/src/components/Navbar/index.tsx @@ -0,0 +1,37 @@ +import { BoxProps, Box } from '@/base/components/Box'; +import { IconButton } from '@/base/components/IconButton'; +import { BackIcon } from '@/base/icons/BackIcon'; +import { CloseIcon } from '@/base/icons/CloseIcon'; +import { cx } from '@/index'; +import { useModal } from '../ModalProvider/context'; +import { useRouter } from '../RouteProvider/context'; +import { clsNavbar } from './styles.css'; + +export interface NavbarProps extends BoxProps { + showBack?: boolean; + onBack?: () => void; +} + +export function Navbar(props: NavbarProps) { + const { className, showBack = false, onBack, ...restProps } = props; + + const { onClose: onCloseModal } = useModal(); + const router = useRouter(); + + const onBeforeBack = () => { + onBack?.(); + router.back(); + }; + + return ( + + {showBack && ( + } onClick={onBeforeBack} /> + )} + + Upload Objects + + } onClick={onCloseModal} /> + + ); +} diff --git a/packages/uploadkit/src/components/Navbar/styles.css.ts b/packages/uploadkit/src/components/Navbar/styles.css.ts new file mode 100644 index 0000000..bc5d7c0 --- /dev/null +++ b/packages/uploadkit/src/components/Navbar/styles.css.ts @@ -0,0 +1,9 @@ +import { style } from '@vanilla-extract/css'; + +export const clsNavbar = style({ + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + width: '100%', + marginBottom: 16, +}); diff --git a/packages/uploadkit/src/components/RouteProvider/context.tsx b/packages/uploadkit/src/components/RouteProvider/context.tsx new file mode 100644 index 0000000..a5d4367 --- /dev/null +++ b/packages/uploadkit/src/components/RouteProvider/context.tsx @@ -0,0 +1,17 @@ +import React, { useContext } from 'react'; + +export interface RouteContextProps { + route: string; + page: React.ReactNode; + back: () => void; + replace: (nextRoute: string) => void; + push: (nextRoute: string) => void; + reset: () => void; +} + +export const RouteContext = React.createContext({} as RouteContextProps); + +export function useRouter() { + const context = useContext(RouteContext); + return context; +} diff --git a/packages/uploadkit/src/components/RouteProvider/index.tsx b/packages/uploadkit/src/components/RouteProvider/index.tsx new file mode 100644 index 0000000..22f7192 --- /dev/null +++ b/packages/uploadkit/src/components/RouteProvider/index.tsx @@ -0,0 +1,75 @@ +import { useState, useRef, useMemo, useCallback } from 'react'; +import { RouteContext } from './context'; +import { WaitPage } from '@/pages/Wait'; +import { UploadPage } from '@/pages/Upload'; + +export const routes = { + DRAG: 'Drag', + UPLOAD: 'Upload', +}; + +export interface RouteProviderProps { + children: React.ReactNode; +} + +export function RouteProvider(props: RouteProviderProps) { + const { children } = props; + + const [route, setRoute] = useState(''); + const { current: history } = useRef([]); + + const page = useMemo(() => { + switch (route) { + case routes.DRAG: + return ; + case routes.UPLOAD: + return ; + } + return null; + }, [route]); + + const back = useCallback(() => { + history.pop(); + const nextRoute = history[history.length - 1]; + if (nextRoute) { + setRoute(nextRoute); + } + }, [history]); + + const push = useCallback( + (nextRoute: string) => { + if (history[history.length - 1] !== nextRoute) { + history.push(nextRoute); + setRoute(nextRoute); + } + }, + [history], + ); + + const replace = useCallback( + (nextRoute: string) => { + if (history[history.length - 1] !== nextRoute) { + history[history.length - 1] = nextRoute; + setRoute(nextRoute); + } + }, + [history], + ); + + const reset = useCallback(() => { + history.length = 0; + }, [history]); + + const value = useMemo(() => { + return { + route, + page, + back, + push, + replace, + reset, + }; + }, [back, page, push, replace, reset, route]); + + return {children}; +} diff --git a/packages/uploadkit/src/components/TaskManagementButton/index.tsx b/packages/uploadkit/src/components/TaskManagementButton/index.tsx new file mode 100644 index 0000000..d936ec6 --- /dev/null +++ b/packages/uploadkit/src/components/TaskManagementButton/index.tsx @@ -0,0 +1,70 @@ +import { Box } from '@/base/components/Box'; +import { CloseIcon } from '@/base/icons/CloseIcon'; +import { UploadIcon } from '@/base/icons/UploadIcon'; +import { SuccessIcon } from '@/base/icons/SuccessIcon'; +import { AlertIcon } from '@/base/icons/AlertIcon'; +import { cx } from '@/base/utils/css'; +import { + clsTaskManagementButton, + clsTaskManagementButtonContent, + clsTaskManagementButtonText, +} from './style.css'; +import { IconButton } from '@/base/components/IconButton'; +import { useUploadQueueStatus } from '@/hooks/useUploadQueueStatus'; +import { useRouter } from '../RouteProvider/context'; +import { routes } from '../RouteProvider'; +import { useModal } from '../ModalProvider/context'; +import { useUpload } from '../UploadProvider'; +import { useUploadKitContext } from '../UploadKitProvider/context'; + +export function TaskManagementButton() { + const { onOpen } = useModal(); + const router = useRouter(); + const { + options: { taskManagementButton }, + } = useUploadKitContext(); + const { + state: { taskManagement }, + dispatch, + } = useUpload(); + + const status = useUploadQueueStatus(); + + const onButtonClick = () => { + router.push(routes.UPLOAD); + onOpen(); + }; + + const onTaskManagementClose = () => { + dispatch({ + type: 'SET_TASK_MANAGEMENT_DISPLAY', + payload: false, + }); + }; + + if (!taskManagement || !taskManagementButton) return null; + + return ( + + + {status === 1 && } + {status === 2 && } + {status === 3 && } + + {status === 0 && 'Waiting...'} + {status === 1 && 'Uploading...'} + {status === 2 && 'Upload Complete'} + {status === 3 && 'Upload Error'} + + + } + onClick={onTaskManagementClose} + /> + + ); +} diff --git a/packages/uploadkit/src/components/TaskManagementButton/style.css.ts b/packages/uploadkit/src/components/TaskManagementButton/style.css.ts new file mode 100644 index 0000000..ac2e68c --- /dev/null +++ b/packages/uploadkit/src/components/TaskManagementButton/style.css.ts @@ -0,0 +1,34 @@ +import { cssVar } from '@/base/utils/css'; +import { style } from '@vanilla-extract/css'; + +export const clsTaskManagementButton = style({ + position: 'fixed', + right: 40, + bottom: 40, + zIndex: cssVar('taskManagementButton', 'zIndices'), + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + gap: 8, + width: 'fit-content', + height: 32, + padding: '6px 8px', + borderRadius: 16, + boxShadow: cssVar('button', 'shadows'), + backgroundColor: cssVar('bgNormal'), + color: cssVar('text'), + cursor: 'pointer', +}); + +export const clsTaskManagementButtonContent = style({ + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + gap: 8, +}); + +export const clsTaskManagementButtonText = style({ + fontSize: 12, + fontWeight: 500, + color: cssVar('text'), +}); diff --git a/packages/uploadkit/src/components/ThemeProvider/context.ts b/packages/uploadkit/src/components/ThemeProvider/context.ts new file mode 100644 index 0000000..ddfe6bc --- /dev/null +++ b/packages/uploadkit/src/components/ThemeProvider/context.ts @@ -0,0 +1,14 @@ +import React, { useContext } from 'react'; + +export type ColorMode = 'light' | 'dark'; + +export interface ThemeContextProps { + colorMode: ColorMode; +} + +export const ThemeContext = React.createContext({} as ThemeContextProps); + +export function useTheme() { + const context = useContext(ThemeContext); + return context; +} diff --git a/packages/uploadkit/src/components/ThemeProvider/index.tsx b/packages/uploadkit/src/components/ThemeProvider/index.tsx new file mode 100644 index 0000000..e7b2887 --- /dev/null +++ b/packages/uploadkit/src/components/ThemeProvider/index.tsx @@ -0,0 +1,150 @@ +import { deepMerge } from '@/base/utils/common'; +import { CustomTheme, base } from '@/themes/base'; +import { useEffect, useMemo, useState } from 'react'; +import { ColorMode, ThemeContext } from './context'; + +export type ThemeMode = 'auto' | ColorMode; + +export type ThemeVariant = 'base'; + +export interface ThemeProviderProps { + variant: ThemeVariant; + mode: ThemeMode; + children: React.ReactNode; + customTheme?: CustomTheme; +} + +const themeMap: Record = { + base, +}; + +export function ThemeProvider(props: ThemeProviderProps) { + const { variant, mode, customTheme, children } = props; + + const styleContent = useMemo(() => { + const theme = themeMap[variant]; + + const lightTheme = deepMerge(theme.light ?? theme, customTheme?.light ?? customTheme); + const darkTheme = deepMerge(theme.dark ?? theme, customTheme?.dark ?? customTheme); + + const lightCssVars = createCssVars(lightTheme, '--uk-light'); + const darkCssVars = createCssVars(darkTheme, '--uk-dark'); + const lightPointer = createPointer(lightCssVars); + const darkPointer = createPointer(darkCssVars); + + const lightCssVarsContent = createStyleContent(lightCssVars); + const darkCssVarsContent = createStyleContent(darkCssVars); + const lightPointerContent = createStyleContent(lightPointer); + const darkPointerContent = createStyleContent(darkPointer); + + if (mode === 'light') { + return `body { + ${lightPointerContent}; + ${lightCssVarsContent}; + }`; + } + if (mode === 'dark') { + return `body { + ${darkPointerContent}; + ${darkCssVarsContent}; + }`; + } + if (mode === 'auto') { + return `body { + ${lightCssVarsContent}; + ${darkCssVarsContent}; + @media (prefers-color-scheme: light) { + ${lightPointerContent}; + } + @media (prefers-color-scheme: dark) { + ${darkPointerContent}; + } + }`; + } + + return ''; + }, [customTheme, mode, variant]); + + useEffect(() => { + const id = 'uk-cssvars'; + + let styleElement = document.getElementById(id); + if (!styleElement) { + styleElement = document.createElement('style'); + + styleElement.id = id; + document.head.appendChild(styleElement); + } + + styleElement.textContent = styleContent; + }, [styleContent]); + + const [colorMode, setColorMode] = useState('light'); + + useEffect(() => { + if (mode === 'auto') { + const matchMedia = window.matchMedia('(prefers-color-scheme: dark)'); + + const onChange = () => { + const cm = matchMedia.matches ? 'dark' : 'light'; + setColorMode(cm); + }; + onChange(); + + matchMedia.addEventListener('change', onChange); + return () => { + matchMedia.removeEventListener('change', onChange); + }; + } else { + setColorMode(mode); + } + }, [mode]); + + const value = useMemo(() => { + return { + colorMode, + }; + }, [colorMode]); + + return {children}; +} + +function createCssVars(theme: Record, prefix = '') { + const cssVars: Record = {}; + + const walk = (input: Record, prefix = '') => { + Object.entries(input).forEach(([key, value]) => { + const varName = `${prefix}-${key}`; + if (typeof value !== 'object') { + cssVars[varName] = value; + } else { + walk(value, varName); + } + }); + }; + + walk(theme as any, prefix); + + return cssVars; +} + +function createStyleContent(cssVars: Record) { + return Object.entries(cssVars) + .map(([key, value]) => { + return `${key}: ${value}`; + }) + .join(';'); +} + +function createPointer(cssVars: Record) { + const pointers: Record = {}; + + Object.keys(cssVars).forEach((item) => { + // eslint-disable-next-line no-useless-escape + const key = item.replace(/\-light|\-dark/g, ''); + const value = `var(${item})`; + pointers[key] = value; + }); + + return pointers; +} diff --git a/packages/uploadkit/src/components/TotalFee/index.tsx b/packages/uploadkit/src/components/TotalFee/index.tsx new file mode 100644 index 0000000..82c6390 --- /dev/null +++ b/packages/uploadkit/src/components/TotalFee/index.tsx @@ -0,0 +1,53 @@ +import { Box, BoxProps } from '@/base/components/Box'; +import { Text } from '@/base/components/Text'; +import { + clsTotalFee, + clsTotalFeeAmount, + clsTotalFeeLabel, + clsTotalInfo, + clsTotalUpload, + clsTotalUploadContent, + clsTotalUploadLabel, + clsTotalUploadNum, + clsTotalUploadSlash, +} from './style.css'; +import { cx } from '@/base/utils/css'; +import { useUpload } from '../UploadProvider'; +import { formatBytes } from '@/base/utils/common'; +import { useTotalFee } from '@/hooks/useTotalFee'; + +export type TotalFeeProps = BoxProps; + +export function TotalFee(props: TotalFeeProps) { + const { totalFee, objectsCount, objectsSize } = useTotalFee(); + const { className } = props; + const { + state: { waitQueue }, + } = useUpload(); + const hasWaitQueue = waitQueue && waitQueue.length > 0; + if (!hasWaitQueue) return null; + return ( + + + + Total Upload: + + + + {formatBytes(objectsSize)} + + / + + {objectsCount} Objects + + + + + + Estimated Total Fees: + + {totalFee} BNB + + + ); +} diff --git a/packages/uploadkit/src/components/TotalFee/style.css.ts b/packages/uploadkit/src/components/TotalFee/style.css.ts new file mode 100644 index 0000000..33fbbb3 --- /dev/null +++ b/packages/uploadkit/src/components/TotalFee/style.css.ts @@ -0,0 +1,56 @@ +import { cssVar } from '@/base/utils/css'; +import { style } from '@vanilla-extract/css'; + +export const clsTotalInfo = style({ + display: 'flex', + flexDirection: 'column', + gap: 8, + padding: '16px 0 0', + borderTop: '1px solid rgba(0, 0, 0, 0.06)', +}); + +export const clsTotalUpload = style({ + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + padding: '8px 0', +}); +export const clsTotalUploadLabel = style({ + fontSize: 14, + fontWeight: 400, + color: cssVar('totalFeeLabel'), +}); +export const clsTotalUploadContent = style({ + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + gap: 4, +}); +export const clsTotalUploadNum = style({ + fontSize: 14, + fontWeight: 600, +}); + +export const clsTotalUploadSlash = style({ + fontSize: 14, + fontWeight: 400, + color: cssVar('totalFeeLabel'), +}); + +export const clsTotalFee = style({ + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + backgroundColor: cssVar('bgBottom'), + borderRadius: 4, + padding: '8px 12px', +}); + +export const clsTotalFeeLabel = style({ + fontSize: 14, + fontWeight: 600, +}); + +export const clsTotalFeeAmount = style({ + color: cssVar('totalFeeLabel'), +}); diff --git a/packages/uploadkit/src/components/UploadButton/index.tsx b/packages/uploadkit/src/components/UploadButton/index.tsx new file mode 100644 index 0000000..3c568d9 --- /dev/null +++ b/packages/uploadkit/src/components/UploadButton/index.tsx @@ -0,0 +1,198 @@ +import { useUpload } from '@/components/UploadProvider'; +import { ButtonProps, Button } from '@/base/components/Button'; +import { clsUploadButton } from './styles.css'; +import { cx } from '@/base/utils/css'; +import { useNetwork, useAccount } from 'wagmi'; +import { getCreateBucketTx } from '@/facade/bucket'; +import { CreateBucketApprovalRequest } from '@bnb-chain/greenfield-js-sdk'; +import { getSps } from '@/facade/sp'; +import { getOffChainAuthKeys } from '@/facade/offchainauth'; +import { useUploadKitContext } from '@/components/UploadKitProvider/context'; +import { getCreateTmpAccountTx } from '@/facade/payment'; +import { broadcastMulTxs } from '@/facade/tx'; +import { useRouter } from '@/components/RouteProvider/context'; +import { routes } from '@/components/RouteProvider'; +import { Loading } from '@/base/components/Loading'; +import { useTotalFee } from '@/hooks/useTotalFee'; +import { toast } from '@/base/components/toast'; +import { bucketIsExist, getRandomBucketName } from '@/utils/bucket'; +import { BN } from '@/utils/math'; +import { useUploadDisable } from '@/hooks/useUploadDisable'; + +export const DEFAULT_UPLOAD_BUTTON_TEXT = 'Upload'; +export const TEMP_ACCOUNT_SAFE_RATE = 1.05; +export const CHARGED_READ_QUOTA = '0'; + +export const UploadButton = (props: ButtonProps) => { + const { className, children, ...restProps } = props; + const router = useRouter(); + const { chain } = useNetwork(); + const { totalFee } = useTotalFee(); + const { address, connector } = useAccount(); + const { + options: { seedString, sp, visibility, bucketName, onError }, + } = useUploadKitContext(); + const { isGnfd, uploadButtonDisabled } = useUploadDisable(); + const { + state: { loading }, + dispatch, + } = useUpload(); + const { + options: { client }, + } = useUploadKitContext(); + const setLoading = (show: boolean) => { + dispatch({ + type: 'SET_IS_LOADING', + payload: show, + }); + }; + + const errorHandler = (errorMsg: string) => { + setLoading(false); + onError && onError(errorMsg); + toast.error({ + description: errorMsg, + }); + }; + + const onSubmit = async () => { + if (!connector || !address || !chain || !visibility) { + return errorHandler('No connector, please connect wallet first'); + } + + // 1. get sp Address; + setLoading(true); + let selectSp; + if (sp?.operatorAddress && sp?.endpoint) { + selectSp = sp; + } else { + const [sps, error] = await getSps(client); + if (!sps || error) { + return errorHandler(error); + } + const randomSp = sps[Math.floor(Math.random() * sps.length)]; + selectSp = { + operatorAddress: randomSp.operatorAddress, + endpoint: randomSp.endpoint, + }; + } + dispatch({ + type: 'SET_SELECTED_SP', + payload: selectSp, + }); + + // 2. get offchainauth + let seed; + if (seedString) { + seed = seedString; + } else { + const provider = await connector?.getProvider(); + + const [offChainData, error2] = await getOffChainAuthKeys({ + address: address as string, + provider, + client, + chainId: chain.id, + }); + if (!offChainData || error2) { + return errorHandler(error2); + } + seed = offChainData.seedString; + } + dispatch({ + type: 'SET_SEED_STRING', + payload: seed, + }); + + // 3. gen a create bucket tx + const txs = []; + let isExisted = false; + if (bucketName) { + isExisted = await bucketIsExist({ bucketName, endpoint: selectSp.endpoint }, client); + } + const createBucketName = bucketName || getRandomBucketName(); + if (!isExisted) { + const createBucketPayload: CreateBucketApprovalRequest = { + bucketName: createBucketName, + creator: address as string, + paymentAddress: address as string, + visibility: 'VISIBILITY_TYPE_PUBLIC_READ', + chargedReadQuota: CHARGED_READ_QUOTA, + spInfo: { + primarySpAddress: selectSp.operatorAddress, + }, + }; + const [createBucketTx, ctError] = await getCreateBucketTx( + createBucketPayload, + { + type: 'EDDSA', + domain: window.location.origin, + seed: seed, + address, + }, + client, + ); + if (!createBucketTx || ctError) { + return errorHandler(ctError); + } + txs.push(createBucketTx); + } + + const [ctaRes, ctaError] = await getCreateTmpAccountTx({ + address: address as string, + bucketName: createBucketName, + amount: BN(totalFee).times(TEMP_ACCOUNT_SAFE_RATE).toNumber(), + client, + }); + if (!ctaRes || ctaError) { + return errorHandler(ctaError); + } + txs.push(...ctaRes.txs); + const [res, mtError] = await broadcastMulTxs({ + txs: txs, + address, + client, + connector, + }); + if (res === null || mtError) { + return errorHandler(mtError); + } + setLoading(false); + dispatch({ + type: 'SET_TMP_ACCOUNT', + payload: ctaRes.tmpAccount, + }); + dispatch({ + type: 'SET_UPLOAD_QUEUE', + payload: { + bucketName: createBucketName, + spAddress: selectSp.operatorAddress, + visibility, + }, + }); + router.push(routes.UPLOAD); + }; + + return ( + <> + + + ); +}; + +UploadButton.displayName = 'UploadButton'; diff --git a/packages/uploadkit/src/components/UploadButton/styles.css.ts b/packages/uploadkit/src/components/UploadButton/styles.css.ts new file mode 100644 index 0000000..19b9562 --- /dev/null +++ b/packages/uploadkit/src/components/UploadButton/styles.css.ts @@ -0,0 +1,70 @@ +import { cssVar } from '@/base/utils/css'; +import { hover } from '@/base/vanilla/index.css'; +import { style, keyframes, globalStyle } from '@vanilla-extract/css'; + +export const clsUploadButton = style({ + width: '100%', + height: 48, + fontSize: 16, + fontWeight: 500, + borderRadius: cssVar('navButton', 'radii'), + padding: 0, + background: 'transparent', + color: cssVar('buttonText'), + marginTop: 16, + backgroundColor: cssVar('buttonBackground'), + '@media': hover({ + // background: cssVar('navButtonBackgroundHover'), + }), +}); + +export const clsContainer = style({ + position: 'relative', + width: 24, + height: 24, + display: 'flex', + alignItems: 'center', + justifyContent: 'center', +}); + +export const clsLogo = style({ + borderRadius: '50%', + overflow: 'hidden', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', +}); + +globalStyle(`${clsLogo} > *`, { + width: 20, + height: 20, +}); + +export const clsErrorCircle = style({ + borderRadius: '50%', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + width: '100%', + height: '100%', + position: 'absolute', + border: `2px solid ${cssVar('error')}`, + marginTop: 2, +}); + +const rotateSpinner = keyframes({ + '0%': { + transform: 'rotate(0deg)', + }, + '100%': { + transform: 'rotate(360deg)', + }, +}); + +export const clsLoading = style({ + animation: `${rotateSpinner} 1200ms linear infinite`, + position: 'absolute', + left: '50%', + transformOrigin: '1px 50%', + marginTop: 2, +}); diff --git a/packages/uploadkit/src/components/UploadKitButton/index.tsx b/packages/uploadkit/src/components/UploadKitButton/index.tsx new file mode 100644 index 0000000..5cd85d0 --- /dev/null +++ b/packages/uploadkit/src/components/UploadKitButton/index.tsx @@ -0,0 +1,43 @@ +import { ButtonProps, Button } from '@/base/components/Button'; +import { useIsMounted } from '@/base/hooks/useIsMounted'; +import { useModal, cx } from '@/index'; +import React, { useCallback } from 'react'; +import { clsUploadKitButton } from './styles.css'; +import { useRouter } from '../RouteProvider/context'; +import { routes } from '../RouteProvider'; +import { UploadQueueStatus, useUploadQueueStatus } from '@/hooks/useUploadQueueStatus'; + +export type UploadKitButtonProps = ButtonProps; + +export const UploadKitButton = React.forwardRef((props: UploadKitButtonProps, ref: any) => { + const { className, onClick, children, ...restProps } = props; + const { onOpen } = useModal(); + const isMounted = useIsMounted(); + const router = useRouter(); + const status = useUploadQueueStatus(); + const onClickButton = useCallback( + (e: React.MouseEvent) => { + [UploadQueueStatus.SUCCESS, UploadQueueStatus.FAILED, UploadQueueStatus.EMPTY].includes( + status, + ) + ? router.push(routes.DRAG) + : router.push(routes.UPLOAD); + onOpen(); + onClick?.(e); + }, + [onClick, onOpen, router, status], + ); + + if (!isMounted) return null; + + return ( + + ); +}); diff --git a/packages/uploadkit/src/components/UploadKitButton/styles.css.ts b/packages/uploadkit/src/components/UploadKitButton/styles.css.ts new file mode 100644 index 0000000..4ca0821 --- /dev/null +++ b/packages/uploadkit/src/components/UploadKitButton/styles.css.ts @@ -0,0 +1,18 @@ +import { hover } from '@/base/vanilla/index.css'; +import { cssVar } from '@/base/utils/css'; +import { style } from '@vanilla-extract/css'; + +export const clsUploadKitButton = style({ + height: 40, + padding: '0 12px', + fontSize: 14, + lineHeight: '17px', + borderRadius: cssVar('uploadKitButton', 'radii'), + background: cssVar('uploadKitButtonBackground'), + color: cssVar('uploadKitButtonText'), + gap: 8, + '@media': hover({ + background: cssVar('uploadKitButtonBackgroundHover'), + color: cssVar('uploadKitButtonTextHover'), + }), +}); diff --git a/packages/uploadkit/src/components/UploadKitModal/index.tsx b/packages/uploadkit/src/components/UploadKitModal/index.tsx new file mode 100644 index 0000000..caf58b9 --- /dev/null +++ b/packages/uploadkit/src/components/UploadKitModal/index.tsx @@ -0,0 +1,26 @@ +import { Modal } from '@/base/components/Modal'; +import { useIsMounted } from '@/base/hooks/useIsMounted'; +import { useModal } from '../ModalProvider/context'; +import { useRouter } from '../RouteProvider/context'; +import { TaskManagementButton } from '../TaskManagementButton'; + +export function UploadKitModal() { + const { isOpen, onClose, closeOnEsc, closeOnOverlayClick } = useModal(); + const { page } = useRouter(); + const isMounted = useIsMounted(); + const { isClosable } = useModal(); + + if (!isMounted) return null; + + return ( + + {page} + + ); +} diff --git a/packages/uploadkit/src/components/UploadKitProvider/context.ts b/packages/uploadkit/src/components/UploadKitProvider/context.ts new file mode 100644 index 0000000..a0654f0 --- /dev/null +++ b/packages/uploadkit/src/components/UploadKitProvider/context.ts @@ -0,0 +1,36 @@ +import { createContext, useContext } from 'react'; +import { Client } from '@bnb-chain/greenfield-js-sdk'; +import { Sp } from '@/components/UploadProvider/types'; +import { VisibilityType } from '@bnb-chain/greenfield-cosmos-types/greenfield/storage/common'; + +export interface UploadKitOptions { + client: Client; + seedString?: string; + checksumFn?: (file: File) => Promise; + + bucketName?: string; + sp?: Sp; + visibility?: keyof typeof VisibilityType; + + maxObjectSize?: number; + maxObjectCount?: number; + + taskManagementButton?: boolean; + + closeModalAfterConnected?: boolean; + closeModalOnEsc?: boolean; + closeModalOnOverlayClick?: boolean; + + onError?: (errorMsg: string) => void; +} + +export interface UploadKitContextProps { + options: UploadKitOptions; +} + +export const UploadKitContext = createContext({} as UploadKitContextProps); + +export function useUploadKitContext() { + const context = useContext(UploadKitContext); + return context; +} diff --git a/packages/uploadkit/src/components/UploadKitProvider/index.tsx b/packages/uploadkit/src/components/UploadKitProvider/index.tsx new file mode 100644 index 0000000..d27a5c9 --- /dev/null +++ b/packages/uploadkit/src/components/UploadKitProvider/index.tsx @@ -0,0 +1,55 @@ +import { CustomTheme } from '@/themes/base'; +import { ThemeMode, ThemeProvider, ThemeVariant } from '../ThemeProvider'; +import { UploadKitContext, UploadKitOptions } from './context'; +import { RouteProvider } from '../RouteProvider'; +import { ModalProvider } from '../ModalProvider'; +import { ToastProvider } from '@/base/components/toast/ToastProvider'; +import { UploadKitModal } from '../UploadKitModal'; +import { useMemo } from 'react'; +import { getDefaultProviderOptions } from '@/defaultConfig/getDefaultProviderOptions'; +import { UploadProvider } from '@/components/UploadProvider'; +import '@/base/vanilla/global.css'; +import { GlobalTasks } from '../GlobalTasks'; +import { TaskManagementButton } from '../TaskManagementButton'; +import { FeeProvider } from '../FeeProvider'; + +export interface UploadKitProviderProps { + options: UploadKitOptions; + children: React.ReactNode; + theme?: ThemeVariant; + mode?: ThemeMode; + customTheme?: CustomTheme; +} + +export const UploadKitProvider = (props: UploadKitProviderProps) => { + const { children, theme = 'base', mode = 'light', options, customTheme } = props; + + const value = useMemo(() => { + const finalOptions = getDefaultProviderOptions(options); + return { + options: finalOptions, + }; + }, [options]); + + return ( + <> + + + + + + + {children} + + + + + + + + + + + + ); +}; diff --git a/packages/uploadkit/src/components/UploadList/index.tsx b/packages/uploadkit/src/components/UploadList/index.tsx new file mode 100644 index 0000000..92ae2ee --- /dev/null +++ b/packages/uploadkit/src/components/UploadList/index.tsx @@ -0,0 +1,69 @@ +import { useUpload } from '../UploadProvider'; +import { UploadObject } from '../UploadProvider/types'; +import { cx } from '@/base/utils/css'; +import { UploadIcon } from '@/base/icons/UploadIcon'; +import { formatBytes } from '@/base/utils/common'; +import { + clsUploadListEmpty, + clsWaitItem, + clsWaitItemContent, + clsWaitItemDesc, + clsWaitItemIcon, + clsWaitItemIconSm, + clsWaitItemName, + clsWaitItemStatus, +} from './style.css'; +import { Box, BoxProps } from '@/base/components/Box'; +import { Text } from '@/base/components/Text'; +import { SuccessIcon } from '@/base/icons/SuccessIcon'; +import { LineProgressBar } from '@/base/components/LineProgress'; +import { clsWaitItemError } from '../WaitList/style.css'; +import { ErrorIcon } from '@/base/icons/ErrorIcon'; + +export type WaitListProps = BoxProps; + +export function UploadList(props: WaitListProps) { + const { className } = props; + const { + state: { uploadQueue }, + } = useUpload(); + const hasUploadTask = uploadQueue && uploadQueue.length > 0; + + const UploadStatus = ({ task }: { task: UploadObject }) => { + if (task.status === 'FINISH') { + return ; + } else if (['ERROR', 'CANCEL'].includes(task.status)) { + return ; + } else { + return ; + } + }; + if (!hasUploadTask) + return No Data; + + return ( + <> + {uploadQueue.map((item: UploadObject, index: number) => ( + + + + + + {item.waitObject.name} + {item.status !== 'ERROR' && ( + + {formatBytes(item.waitObject.size)} + + )} + {item.status === 'ERROR' && ( + {item.msg} + )} + + + + + + ))} + + ); +} diff --git a/packages/uploadkit/src/components/UploadList/style.css.ts b/packages/uploadkit/src/components/UploadList/style.css.ts new file mode 100644 index 0000000..f9ea080 --- /dev/null +++ b/packages/uploadkit/src/components/UploadList/style.css.ts @@ -0,0 +1,62 @@ +import { style } from '@vanilla-extract/css'; +import { cssVar } from '@/base/utils/css'; + +export const clsWaitItem = style({ + display: 'flex', + padding: '12px 4px', + width: '100%', + justifyContent: 'space-between', + alignItems: 'center', + gap: 16, +}); +export const clsWaitItemIcon = style({ + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + border: `1px solid ${cssVar('border')}`, + width: 40, + height: 40, + borderRadius: '50%', +}); + +export const clsWaitItemIconSm = style({ + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + border: `1px solid ${cssVar('border')}`, + width: 24, + height: 24, + borderRadius: '50%', +}); +export const clsWaitItemContent = style({ + display: 'flex', + flexDirection: 'column', + flex: 1, + textAlign: 'left', +}); +export const clsWaitItemName = style({ + fontWeight: 600, +}); + +export const clsWaitItemDesc = style({ + color: cssVar('textSecondary'), +}); + +export const clsWaitItemStatus = style({ + minWidth: 100, + textAlign: 'right', + display: 'flex', + justifyContent: 'flex-end', +}); + +export const clsUploadListEmpty = style({ + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + gap: 16, + width: '100%', + height: '100%', + padding: '0 16px', + textAlign: 'center', +}); diff --git a/packages/uploadkit/src/components/UploadProgress/index.tsx b/packages/uploadkit/src/components/UploadProgress/index.tsx new file mode 100644 index 0000000..fa681a6 --- /dev/null +++ b/packages/uploadkit/src/components/UploadProgress/index.tsx @@ -0,0 +1,20 @@ +import { Box } from '@/base/components/Box'; +import { clsUploadProgress, clsUploadProgressIcon } from './style.css'; +import { SuccessIcon } from '@/base/icons/SuccessIcon'; +import { cx } from '@/base/utils/css'; + +export function UploadProgress({ progress }: { progress: number }) { + return ( + + + + + + ); +} diff --git a/packages/uploadkit/src/components/UploadProgress/style.css.ts b/packages/uploadkit/src/components/UploadProgress/style.css.ts new file mode 100644 index 0000000..db58f72 --- /dev/null +++ b/packages/uploadkit/src/components/UploadProgress/style.css.ts @@ -0,0 +1,26 @@ +import { style } from '@vanilla-extract/css'; + +export const clsUploadProgress = style({ + position: 'relative', + width: 32, + height: 32, + borderRadius: '50%', + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + '::before': { + content: '', + position: 'absolute', + height: 28, + width: 28, + borderRadius: '50%', + background: '#fff', + }, +}); + +export const clsUploadProgressIcon = style({ + position: 'relative', + display: 'flex', + justifyContent: 'center', + alignItems: 'center', +}); diff --git a/packages/uploadkit/src/components/UploadProvider/index.tsx b/packages/uploadkit/src/components/UploadProvider/index.tsx new file mode 100644 index 0000000..105ecd2 --- /dev/null +++ b/packages/uploadkit/src/components/UploadProvider/index.tsx @@ -0,0 +1,23 @@ +import { createContext, useContext, useReducer } from 'react'; +import { reducer, initialState } from './reducer'; +import { Action, UploadState } from './types'; + +export type UploadContextProps = { state: UploadState; dispatch: React.Dispatch }; + +export type UploadProviderProps = { + children: React.ReactNode; +}; + +export const UploadContext = createContext({} as UploadContextProps); + +export const UploadProvider = (props: UploadProviderProps) => { + const { children } = props; + const [state, dispatch] = useReducer(reducer, initialState); + + return {children}; +}; + +export function useUpload() { + const context = useContext(UploadContext); + return context; +} diff --git a/packages/uploadkit/src/components/UploadProvider/reducer.ts b/packages/uploadkit/src/components/UploadProvider/reducer.ts new file mode 100644 index 0000000..67f3e68 --- /dev/null +++ b/packages/uploadkit/src/components/UploadProvider/reducer.ts @@ -0,0 +1,160 @@ +import { Reducer, UploadState, TTmpAccount, UploadObject } from './types'; + +export const initialState: UploadState = { + loading: false, + taskManagement: true, + seedString: '', + waitQueue: [], + uploadQueue: [], + tmpAccount: {} as TTmpAccount, +}; + +export const reducer: Reducer = (state, action) => { + state = state || initialState; + + switch (action.type) { + case 'SET_IS_LOADING': { + return { + ...state, + loading: action.payload, + }; + } + case 'SET_TASK_MANAGEMENT_DISPLAY': { + return { + ...state, + taskManagement: action.payload, + }; + } + case 'SET_SEED_STRING': { + return { + ...state, + seedString: action.payload, + }; + } + case 'SET_SELECTED_SP': { + return { + ...state, + selectedSp: action.payload, + }; + } + case 'SET_TMP_ACCOUNT': { + return { + ...state, + tmpAccount: action.payload, + }; + } + case 'SET_WAIT_QUEUE': { + return { + ...state, + waitQueue: [...state.waitQueue, ...action.payload], + }; + } + case 'RESET_WAIT_QUEUE': { + return { + ...state, + waitQueue: [], + }; + } + case 'REMOVE_WAIT_TASK': { + return { + ...state, + waitQueue: state.waitQueue.filter((item) => item.id !== action.payload.id), + }; + } + case 'SET_UPLOAD_QUEUE': { + const { payload } = action; + const waitQueue = state.waitQueue; + const uploadTasks = waitQueue.map((task) => { + const uploadTask: UploadObject = { + bucketName: payload.bucketName, + prefixFolders: [''], + spAddress: payload.spAddress, + id: task.id, + waitObject: task, + msg: '', + status: 'WAIT', + progress: 0, + checksum: [], + visibility: payload.visibility, + createHash: '', + }; + return uploadTask; + }); + + return { + ...state, + uploadQueue: uploadTasks, + }; + } + case 'RESET_UPLOAD_QUEUE': { + return { + ...state, + uploadQueue: [], + }; + } + case 'SET_UPLOAD_TASK_CHECKSUM': { + const { id, checksum } = action.payload; + const queue = state.uploadQueue; + const task = queue.find((item) => item.id === id); + if (!task) return state; + task.status = task.status !== 'CANCEL' ? 'HASHED' : 'CANCEL'; + task.checksum = checksum; + return { + ...state, + uploadQueue: queue, + }; + } + case 'SET_UPLOAD_TASK_CREATE_HASH': { + const { id, createHash } = action.payload; + const queue = state.uploadQueue; + const task = queue.find((item) => item.id === id); + if (!task) return state; + task.createHash = createHash; + task.status = task.status !== 'CANCEL' ? 'SIGNED' : 'CANCEL'; + return { + ...state, + uploadQueue: queue, + }; + } + case 'SET_UPLOAD_TASK_PROGRESS': { + const { id, progress } = action.payload; + const queue = state.uploadQueue; + const task = queue.find((item) => item.id === id); + if (!task) return state; // Return state instead of undefined + task.progress = progress; + if (progress === 100) { + task.status = 'FINISH'; + } + return { + ...state, + uploadQueue: queue, + }; + } + case 'SET_UPLOAD_TASK_ERROR_MSG': { + const { id, msg } = action.payload; + const queue = state.uploadQueue; + const task = queue.find((item) => item.id === id); + if (!task) return state; // Return state instead of undefined + task.status = 'ERROR'; + task.msg = msg; + return { + ...state, + uploadQueue: queue, + }; + } + case 'SET_UPLOAD_TASK_STATUS': { + const { id, status } = action.payload; + const queue = state.uploadQueue; + const task = queue.find((item) => item.id === id); + if (!task) return state; + task.status = status; + return { + ...state, + uploadQueue: queue, + }; + } + default: { + return state; + } + } +}; diff --git a/packages/uploadkit/src/components/UploadProvider/types.ts b/packages/uploadkit/src/components/UploadProvider/types.ts new file mode 100644 index 0000000..ad42ce5 --- /dev/null +++ b/packages/uploadkit/src/components/UploadProvider/types.ts @@ -0,0 +1,88 @@ +import { VisibilityType } from '@bnb-chain/greenfield-cosmos-types/greenfield/storage/common'; + +export type WaitStatus = 'CHECK' | 'WAIT' | 'ERROR'; + +export type UploadStatus = + | 'WAIT' + | 'HASH' + | 'HASHED' + | 'SIGN' + | 'SIGNED' + | 'UPLOAD' + // | 'SEAL' + | 'FINISH' + | 'ERROR' + | 'CANCEL'; + +export type TTmpAccount = { + address: string; + privateKey: string; +}; + +export type WaitObject = { + file: File; + status: WaitStatus; + id: number; + time: number; + msg: string; + type: string; + size: number; + name: string; + lockFee?: string; + relativePath: string; +}; + +export type UploadObject = { + bucketName: string; + prefixFolders: string[]; + id: number; + spAddress: string; + waitObject: WaitObject; + checksum: string[]; + status: UploadStatus; + visibility: keyof typeof VisibilityType; + createHash: string; + msg: string; + progress: number; +}; + +export interface Sp { + operatorAddress: string; + endpoint: string; +} + +export interface UploadState { + loading: boolean; + taskManagement: boolean; + seedString: string; + selectedSp: Sp; + waitQueue: WaitObject[]; + uploadQueue: UploadObject[]; + tmpAccount: TTmpAccount; +} + +export type Action = + | { type: 'SET_IS_LOADING'; payload: boolean } + | { type: 'SET_TASK_MANAGEMENT_DISPLAY'; payload: boolean } + | { type: 'SET_SEED_STRING'; payload: string } + | { type: 'SET_SELECTED_SP'; payload: Sp } + | { type: 'SET_TMP_ACCOUNT'; payload: TTmpAccount } + | { type: 'SET_WAIT_QUEUE'; payload: WaitObject[] } + | { type: 'RESET_WAIT_QUEUE' } + | { type: 'REMOVE_WAIT_TASK'; payload: { id: number } } + | { + type: 'SET_UPLOAD_QUEUE'; + payload: { + bucketName: string; + spAddress: string; + visibility: keyof typeof VisibilityType; + }; + } + | { type: 'RESET_UPLOAD_QUEUE' } + | { type: 'SET_UPLOAD_TASK_PROGRESS'; payload: { id: number; progress: number } } + | { type: 'SET_UPLOAD_TASK_STATUS'; payload: { id: number; status: UploadStatus } } + | { type: 'SET_UPLOAD_TASK_CHECKSUM'; payload: { id: number; checksum: string[] } } + | { type: 'SET_UPLOAD_TASK_CREATE_HASH'; payload: { id: number; createHash: string } } + | { type: 'SET_UPLOAD_TASK_ERROR_MSG'; payload: { id: number; msg: string } }; + +export type Reducer = (state: UploadState, action: Action) => UploadState; diff --git a/packages/uploadkit/src/components/WaitList/index.tsx b/packages/uploadkit/src/components/WaitList/index.tsx new file mode 100644 index 0000000..3234301 --- /dev/null +++ b/packages/uploadkit/src/components/WaitList/index.tsx @@ -0,0 +1,66 @@ +import { useUpload } from '../UploadProvider'; +import { WaitObject } from '../UploadProvider/types'; +import { cx } from '@/base/utils/css'; +import { IconButton } from '@/base/components/IconButton'; +import { CloseIcon } from '@/base/icons/CloseIcon'; +import { UploadIcon } from '@/base/icons/UploadIcon'; +import { formatBytes } from '@/base/utils/common'; +import { + clsWaitItem, + clsWaitItemCloseIcon, + clsWaitItemContent, + clsWaitItemDesc, + clsWaitItemError, + clsWaitItemIcon, + clsWaitItemName, +} from './style.css'; +import { Box, BoxProps } from '@/base/components/Box'; +import { Text } from '@/base/components/Text'; + +export type WaitListProps = BoxProps; + +export function WaitList(props: WaitListProps) { + const { className } = props; + const { + state: { waitQueue }, + dispatch, + } = useUpload(); + const hasWaitQueue = waitQueue && waitQueue.length > 0; + const onRemove = (id: number) => { + return dispatch({ + type: 'REMOVE_WAIT_TASK', + payload: { + id, + }, + }); + }; + + if (!hasWaitQueue) return null; + return ( + <> + {waitQueue.map((item: WaitObject, index: number) => ( + + + + + + {item.name} + {item.status === 'WAIT' && ( + + {formatBytes(item.size)} + + )} + {item.status === 'ERROR' && ( + {item.msg} + )} + + } + onClick={() => onRemove(item.id)} + /> + + ))} + + ); +} diff --git a/packages/uploadkit/src/components/WaitList/style.css.ts b/packages/uploadkit/src/components/WaitList/style.css.ts new file mode 100644 index 0000000..9fc92de --- /dev/null +++ b/packages/uploadkit/src/components/WaitList/style.css.ts @@ -0,0 +1,54 @@ +import { style } from '@vanilla-extract/css'; +import { cssVar } from '@/base/utils/css'; + +export const clsWaitItem = style({ + display: 'flex', + padding: '12px 4px', + marginRight: 16, + width: 'calc(100% - 16px)', + justifyContent: 'space-between', + alignItems: 'center', + gap: 16, +}); +export const clsWaitItemIcon = style({ + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + border: `1px solid ${cssVar('border')}`, + width: 40, + height: 40, + borderRadius: '50%', +}); + +export const clsWaitItemIconSm = style({ + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + border: `1px solid ${cssVar('border')}`, + width: 24, + height: 24, + borderRadius: '50%', +}); + +export const clsWaitItemContent = style({ + display: 'flex', + flexDirection: 'column', + flex: 1, + textAlign: 'left', +}); + +export const clsWaitItemName = style({ + fontWeight: 600, + marginBottom: 4, +}); + +export const clsWaitItemDesc = style({ + color: cssVar('textSecondary'), +}); + +export const clsWaitItemCloseIcon = style({}); + +export const clsWaitItemError = style({ + color: '#EE3911', + fontSize: 14, +}); diff --git a/packages/uploadkit/src/constants/index.ts b/packages/uploadkit/src/constants/index.ts new file mode 100644 index 0000000..e0e66d3 --- /dev/null +++ b/packages/uploadkit/src/constants/index.ts @@ -0,0 +1,5 @@ +export const CRYPTOCURRENCY_DISPLAY_PRECISION = 8; +export const FIAT_CURRENCY_DISPLAY_PRECISION = 2; + +export const gnfdChainIds = [9000, 5600, 1017]; +export const bscChainIds = [56, 97]; diff --git a/packages/uploadkit/src/defaultConfig/getDefaultProviderOptions.ts b/packages/uploadkit/src/defaultConfig/getDefaultProviderOptions.ts new file mode 100644 index 0000000..22bf7f1 --- /dev/null +++ b/packages/uploadkit/src/defaultConfig/getDefaultProviderOptions.ts @@ -0,0 +1,35 @@ +import { toast } from '@/base/components/toast'; +import { UploadKitOptions } from '..'; + +export const RECOMMEND_MAX_OBJECT_SIZE = 56 * 1024 * 1024; +export const RECOMMEND_MAX_OBJECT_COUNT = 100; + +export function getDefaultProviderOptions(options: UploadKitOptions) { + const { ...restOptions } = options; + + const mergedOptions: UploadKitOptions = { + maxObjectSize: RECOMMEND_MAX_OBJECT_SIZE, + maxObjectCount: RECOMMEND_MAX_OBJECT_COUNT, + + visibility: 'VISIBILITY_TYPE_PUBLIC_READ', + + taskManagementButton: true, + + closeModalAfterConnected: true, + closeModalOnEsc: true, + closeModalOnOverlayClick: true, + + onError, + ...restOptions, + }; + + return mergedOptions; +} + +function onError(errorMsg: string) { + if (errorMsg) { + toast.error({ + description: errorMsg, + }); + } +} diff --git a/packages/uploadkit/src/facade/bucket.ts b/packages/uploadkit/src/facade/bucket.ts new file mode 100644 index 0000000..b10bd01 --- /dev/null +++ b/packages/uploadkit/src/facade/bucket.ts @@ -0,0 +1,74 @@ +import { BroadcastResponse, resolve } from './common'; +import { ErrorResponse, broadcastFault, createTxFault, simulateFault } from './error'; +import { + Client, + CreateBucketApprovalRequest, + ISimulateGasFee, + TxResponse, +} from '@bnb-chain/greenfield-js-sdk'; +import { Connector } from 'wagmi'; +import { signTypedDataCallback } from './wallet'; +import { AuthType } from '@/facade/tx'; +import { commonFault } from './error'; + +export const simulateCreateBucket = async ( + params: CreateBucketApprovalRequest, + authType: AuthType, + client: Client, +): Promise<[ISimulateGasFee, null, TxResponse] | ErrorResponse> => { + const [createBucketTx, error1] = await client.bucket + .createBucket(params, authType) + .then(resolve, createTxFault); + + if (!createBucketTx) return [null, error1]; + + const [simulateInfo, error2] = await createBucketTx + .simulate({ + denom: 'BNB', + }) + .then(resolve, simulateFault); + + if (!simulateInfo) return [null, error2]; + + return [simulateInfo, null, createBucketTx]; +}; + +export const createBucket = async ( + params: CreateBucketApprovalRequest, + authType: AuthType, + connector: Connector, + client: Client, +): BroadcastResponse => { + const [simulateInfo, error, createBucketTx] = await simulateCreateBucket( + params, + authType, + client, + ); + if (!simulateInfo) return [null, error]; + + const payload = { + denom: 'BNB', + gasLimit: Number(simulateInfo?.gasLimit), + gasPrice: simulateInfo?.gasPrice || '5000000000', + payer: params.creator, + granter: '', + signTypedDataCallback: signTypedDataCallback(connector), + }; + + return createBucketTx.broadcast(payload).then(resolve, broadcastFault); +}; + +export const getCreateBucketTx = async ( + params: CreateBucketApprovalRequest, + authType: AuthType, + client: Client, +): Promise<[TxResponse, null] | ErrorResponse> => { + return client.bucket.createBucket(params, authType).then(resolve, createTxFault); +}; + +export const getBucketMeta = ( + options: { bucketName: string; endpoint: string }, + client: Client, +) => { + return client.bucket.getBucketMeta(options).then(resolve, commonFault); +}; diff --git a/packages/uploadkit/src/facade/common.ts b/packages/uploadkit/src/facade/common.ts new file mode 100644 index 0000000..2001f45 --- /dev/null +++ b/packages/uploadkit/src/facade/common.ts @@ -0,0 +1,36 @@ +import { TxResponse } from '@bnb-chain/greenfield-js-sdk'; +import { ErrorResponse } from './error'; +import { Client } from '@bnb-chain/greenfield-js-sdk'; + +export const resolve = (r: R): [R, null] => [r, null]; + +export type DeliverResponse = Awaited>; + +export type BroadcastResponse = Promise; + +export const uploadRequest = ({ + url, + file, + headers, + onProgress, +}: { + url: string; + file: File; + headers: Headers; + onProgress: (progress: number) => void; +}) => + new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest(); + xhr.upload.addEventListener('progress', (e) => onProgress(e.loaded / e.total)); + xhr.addEventListener('load', () => resolve({ status: xhr.status, body: xhr.responseText })); + xhr.addEventListener('error', () => reject(new Error('File upload failed'))); + xhr.addEventListener('abort', () => reject(new Error('File upload aborted'))); + xhr.open('PUT', url, true); + + Object.entries(headers).forEach(([key, value]) => { + xhr.setRequestHeader(key, value); + }); + const formData = new FormData(); + formData.append('file', file); + xhr.send(formData); + }); diff --git a/packages/uploadkit/src/facade/error.ts b/packages/uploadkit/src/facade/error.ts new file mode 100644 index 0000000..7c5a6c4 --- /dev/null +++ b/packages/uploadkit/src/facade/error.ts @@ -0,0 +1,129 @@ +export const ErrorMsgMap: Record = { + '4001': 'User rejected the request.', + '4100': 'The requested account and/or method has not been authorized by the user.', + '4200': 'The requested method is not supported by this Network provider.', + '4900': 'Your wallet is disconnected. Please check your network connectivity status.', + '4901': + 'You are not connected to the correct chain for this transaction. Switch your network and retry.', + '-32700': + 'Your request object is incomplete. Please make sure the object sent to the contract does contain all the data that it requires.', +}; + +export type ErrorMsg = string; + +export const E_GET_GAS_FEE_LACK_BALANCE_ERROR = `Insufficient balance for gas estimation.`; +export const UNKNOWN_ERROR = `Unknown error. Please try again later.`; +export const E_SP_PRICE_FAILED = `Get SP storage price failed.`; +export const E_USER_REJECT_STATUS_NUM = '4001'; +export const E_NOT_FOUND = 'NOT_FOUND'; +export const E_PERMISSION_DENIED = 'PERMISSION_DENIED'; +export const E_NO_QUOTA = 'NO_QUOTA'; +export const E_UNKNOWN = 'UNKNOWN'; +export const E_OFF_CHAIN_AUTH = 'OFF_CHAIN_AUTH'; +export const E_SP_NOT_FOUND = 'SP_NOT_FOUND'; +export const E_GET_QUOTA_FAILED = 'GET_QUOTA_FAILED'; +export const E_NOT_BROWSER = 'NOT_BROWSER'; +export const E_REQUEST_PENDING_NUM = '-32002'; +export const E_FILE_TOO_LARGE = 'OBJECT_TOO_LARGE'; +export const E_FILE_IS_EMPTY = 'FILE_IS_EMPTY'; +export const E_OBJECT_NAME_EMPTY = 'OBJECT_NAME_EMPTY'; +export const E_OBJECT_NAME_TOO_LONG = 'OBJECT_NAME_TOO_LONG'; +export const E_OBJECT_NAME_NOT_UTF8 = 'OBJECT_NAME_NOT_UTF8'; +export const E_OBJECT_NAME_CONTAINS_SLASH = 'OBJECT_NAME_CONTAINS_SLASH'; +export const E_CAL_OBJECT_HASH = 'CAL_OBJECT_HASH'; +export const E_OBJECT_NAME_EXISTS = 'OBJECT_NAME_EXISTS'; +export const E_OBJECT_NOT_EXISTS = 'No such object'; +export const E_FOLDER_NAME_EXISTS = 'FOLDER_NAME_EXISTS'; +export const E_FOLDER_NAME_TOO_LONG = 'FOLDER_NAME_TOO_LONG'; +export const E_FULL_OBJECT_NAME_TOO_LONG = 'FULL_OBJECT_NAME_TOO_LONG'; +export const E_MAX_FOLDER_DEPTH = 'MAX_FOLDER_DEPTH'; +export const E_ACCOUNT_BALANCE_NOT_ENOUGH = 'ACCOUNT_BALANCE_NOT_ENOUGH'; +export const E_NO_PERMISSION = 'NO_PERMISSION'; +export const E_SP_STORAGE_PRICE_FAILED = 'SP_STORAGE_PRICE_FAILED'; + +export declare class BroadcastTxError extends Error { + readonly code: number; + readonly codespace: string; + readonly log: string | undefined; + + constructor(code: number, codespace: string, log: string | undefined); +} + +export type ErrorResponse = [null, ErrorMsg]; + +export const simulateFault = (e: any): ErrorResponse => { + console.error('SimulateFault', e); + if ( + e?.message.includes('static balance is not enough') || + e?.message.includes('balance not enough') + ) { + return [null, E_GET_GAS_FEE_LACK_BALANCE_ERROR]; + } + if (e?.message.includes('No such object')) { + return [null, E_OBJECT_NOT_EXISTS]; + } + return [null, e?.message || UNKNOWN_ERROR]; +}; + +export const broadcastFault = (e: BroadcastTxError): ErrorResponse => { + console.log('broadcastFault', e); + const { code = '' } = e; + if (String(code) === E_USER_REJECT_STATUS_NUM) { + return [null, ErrorMsgMap[E_USER_REJECT_STATUS_NUM]]; + } + return [null, e?.message || UNKNOWN_ERROR]; +}; + +export const createTxFault = (e: any): ErrorResponse => { + const { code = '', message } = e; + console.error('CreateTxFault', e); + if ( + (code === -1 && + (e as any).statusCode === 500 && + [ + 'Get create object approval error.', + 'Get create bucket approval error.', + 'user public key is expired', + 'invalid signature', + 'bad signature', + ].includes(message)) || + ((e as any).statusCode === 400 && + ['user public key is expired', 'invalid signature', 'bad signature'].includes(message)) + ) { + return [null, E_OFF_CHAIN_AUTH]; + } + if ((e as any).statusCode === 429) { + return [null, 'SP not available. Try later.']; + } + return [null, e?.message || UNKNOWN_ERROR]; +}; + +export const offChainAuthFault = (e: any): ErrorResponse => { + console.log(e); + if (e?.response?.status === 500) { + return [null, E_OFF_CHAIN_AUTH]; + } + if (e?.message) { + return [null, e?.message]; + } + + return [null, '']; +}; + +export const commonFault = (e: any): ErrorResponse => { + if (e?.message) { + return [null, e?.message]; + } + return [null, UNKNOWN_ERROR]; +}; + +export const queryLockFeeFault = (e: any): ErrorResponse => { + if (e?.message.includes('storage price')) { + return [null, E_SP_PRICE_FAILED]; + } + if (e?.message) { + return [null, e?.message]; + } + + return [null, UNKNOWN_ERROR]; +}; diff --git a/packages/uploadkit/src/facade/object.ts b/packages/uploadkit/src/facade/object.ts new file mode 100644 index 0000000..c04304c --- /dev/null +++ b/packages/uploadkit/src/facade/object.ts @@ -0,0 +1,64 @@ +import { + CreateObjectApprovalRequest, + Client, + METHOD_PUT, + SpMetaInfo, + isValidBucketName, + isValidObjectName, + PutObjectRequest, +} from '@bnb-chain/greenfield-js-sdk'; +import { resolve } from './common'; +import { ErrorResponse, createTxFault } from './error'; +import { AuthType } from '@/facade/tx'; + +export const getCreateObjectTx = async ( + configParam: CreateObjectApprovalRequest, + authType: AuthType, + client: Client, +) => { + return client.object.createObject(configParam, authType).then(resolve, createTxFault); +}; + +export type TMakePutObjectHeaders = PutObjectRequest & { + endpoint: string; +}; + +export const makePutObjectHeaders = async ( + configParam: TMakePutObjectHeaders, + authType: AuthType, + client: Client, +): Promise< + ErrorResponse | [{ url: string; headers: Headers; method: string; params: URLSearchParams }, null] +> => { + const { bucketName, objectName, txnHash, body, endpoint } = configParam; + if (!isValidBucketName(bucketName)) { + return [null, 'Error bucket name']; + } + if (!isValidObjectName(objectName)) { + return [null, 'Error object name']; + } + if (!txnHash) { + return [null, 'Transaction hash is empty, please check.']; + } + const method = METHOD_PUT; + const params = new URLSearchParams(); + const payload = { + objectName, + bucketName, + txnHash, + contentType: body.type || 'text/plain', + body, + }; + const { reqMeta, url } = await SpMetaInfo.getPutObjectMetaInfo(endpoint, payload); + const headers = await client.spClient.signHeaders(reqMeta, authType); + + return [ + { + url, + headers, + method, + params, + }, + null, + ]; +}; diff --git a/packages/uploadkit/src/facade/offchainauth.ts b/packages/uploadkit/src/facade/offchainauth.ts new file mode 100644 index 0000000..ce5cfb5 --- /dev/null +++ b/packages/uploadkit/src/facade/offchainauth.ts @@ -0,0 +1,43 @@ +import { Client, IReturnOffChainAuthKeyPairAndUpload } from '@bnb-chain/greenfield-js-sdk'; +import { getSps } from './sp'; +import { ErrorResponse, UNKNOWN_ERROR } from './error'; + +export const OFF_CHAIN_AUTH_EXPIRATION_MS = 5 * 24 * 60 * 60 * 1000; +export const getOffChainAuthKeys = async ({ + address, + provider, + client, + chainId, +}: { + address: string; + chainId: number; + provider: any; + client: Client; +}): Promise => { + const [allSps, error] = await getSps(client); + if (allSps === null || error) { + return [null, error]; + } + const sps = allSps.map((sp) => ({ + address: sp.operatorAddress, + endpoint: sp.endpoint, + name: sp.description?.moniker, + })); + const offchainAuthRes = await client.offchainauth.genOffChainAuthKeyPairAndUpload( + { + sps: sps, + chainId: chainId, + expirationMs: OFF_CHAIN_AUTH_EXPIRATION_MS, + domain: window.location.origin, + address, + }, + provider, + ); + + const { code, body: offChainData } = offchainAuthRes; + if (code !== 0 || !offChainData) { + return [null, offchainAuthRes.message || UNKNOWN_ERROR]; + } + + return [offChainData, null]; +}; diff --git a/packages/uploadkit/src/facade/payment.ts b/packages/uploadkit/src/facade/payment.ts new file mode 100644 index 0000000..674caa0 --- /dev/null +++ b/packages/uploadkit/src/facade/payment.ts @@ -0,0 +1,159 @@ +import { TTmpAccount } from '@/components/UploadProvider/types'; +import { ErrorResponse, commonFault, createTxFault } from './error'; +import { + GRNToString, + MsgCreateObjectTypeUrl, + PermissionTypes, + newBucketGRN, + TxResponse, + Client, + Long, +} from '@bnb-chain/greenfield-js-sdk'; +import { Wallet } from '@ethersproject/wallet'; +import { parseEther } from 'viem'; +import { resolve } from './common'; +import { toTimestamp } from '@/utils/object'; +import { BN } from '@/utils/math'; +import { CRYPTOCURRENCY_DISPLAY_PRECISION } from '@/constants'; +import { getTimestampInSeconds } from '@/utils/time'; + +export interface getCreateTmpAccountTxParams { + address: string; + bucketName: string; + amount: number; + client: Client; +} + +export const getCreateTmpAccountTx = async ({ + address, + bucketName, + amount, + client, +}: getCreateTmpAccountTxParams): Promise< + | ErrorResponse + | [ + { + txs: TxResponse[]; + tmpAccount: TTmpAccount; + }, + null, + ] +> => { + //messages and resources are different for create and delete + + const grantAllowedMessage = [MsgCreateObjectTypeUrl]; + const statementAction = [PermissionTypes.ActionType.ACTION_CREATE_OBJECT]; + + // 1. create temporary account + const wallet = Wallet.createRandom(); + + // 2. allow temporary account to submit specified tx and amount + const curTimeStamp = +new Date(); + const expirationTimestamp = Math.floor(curTimeStamp + 10 * 60 * 60 * 1000); + const expirationDate = new Date(expirationTimestamp); + const [grantAllowanceTx, allowError] = await client.feegrant + .grantAllowance({ + granter: address, + grantee: wallet.address, + allowedMessages: grantAllowedMessage, + amount: parseEther(amount <= 0 ? '0.1' : String(amount)).toString(), + denom: 'BNB', + expirationTime: toTimestamp(expirationDate), + }) + .then(resolve, createTxFault); + + if (allowError) return [null, allowError]; + + const resources = [GRNToString(newBucketGRN(bucketName))]; + + // 3. Put bucket policy so that the temporary account can create objects within this bucket + const statement: PermissionTypes.Statement = { + effect: PermissionTypes.Effect.EFFECT_ALLOW, + actions: statementAction, + resources: resources, + }; + + const [putPolicyTx, createTxError] = await client.bucket + .putBucketPolicy(bucketName, { + operator: address, + statements: [statement], + principal: { + type: PermissionTypes.PrincipalType.PRINCIPAL_TYPE_GNFD_ACCOUNT, + value: wallet.address, + }, + }) + .then(resolve, createTxFault); + + if (createTxError) return [null, createTxError]; + + const data = { + txs: [grantAllowanceTx!, putPolicyTx!], + tmpAccount: { + address: wallet.address, + privateKey: wallet.privateKey, + }, + }; + + return [data, null]; +}; + +export const getGasFees = async (client: Client) => { + return await client.gashub + .getMsgGasParams({ + msgTypeUrls: [], + pagination: { + countTotal: true, + key: Uint8Array.from([]), + limit: Long.fromInt(1000), + offset: Long.fromInt(0), + reverse: false, + }, + }) + .then(resolve, commonFault); +}; + +export const getStoreFeeParams = async (client: Client) => { + const now = getTimestampInSeconds(); + const [globalSpStoragePrice, { params: storageParams }, { params: paymentParams }] = + await Promise.all([ + client.sp.getQueryGlobalSpStorePriceByTime({ timestamp: Long.fromNumber(now) }), + client.storage.params(), + client.payment.params(), + ]); + + const { + minChargeSize = new Long(0), + redundantDataChunkNum = 0, + redundantParityChunkNum = 0, + } = (storageParams && storageParams.versionedParams) || {}; + + const { reserveTime, validatorTaxRate } = paymentParams?.versionedParams || {}; + const storeFeeParamsPayload = { + primarySpStorePrice: globalSpStoragePrice?.globalSpStorePrice.primaryStorePrice || '', + readPrice: globalSpStoragePrice?.globalSpStorePrice.readPrice || '', + secondarySpStorePrice: globalSpStoragePrice?.globalSpStorePrice.secondaryStorePrice || '', + validatorTaxRate: validatorTaxRate || '', + minChargeSize: minChargeSize.toNumber(), + redundantDataChunkNum, + redundantParityChunkNum, + reserveTime: reserveTime?.toString() || '', + }; + + return storeFeeParamsPayload; +}; + +export const getSettlementFee = async (address: string, client: Client) => { + const [res, error] = await client.payment.getStreamRecord(address).then(resolve, commonFault); + if (!res || error) return [null, error]; + const { streamRecord } = res; + const curTime = Math.floor(+new Date() / 1000); + const storedTime = curTime - Number(streamRecord.crudTimestamp.low); + const amount = BN(streamRecord.netflowRate) + .dividedBy(10 ** 18) + .times(storedTime) + .dp(CRYPTOCURRENCY_DISPLAY_PRECISION) + .abs() + .toString(); + + return [amount, null]; +}; diff --git a/packages/uploadkit/src/facade/sp.ts b/packages/uploadkit/src/facade/sp.ts new file mode 100644 index 0000000..ef4b6eb --- /dev/null +++ b/packages/uploadkit/src/facade/sp.ts @@ -0,0 +1,46 @@ +import { Client } from '@bnb-chain/greenfield-js-sdk'; +import { resolve } from './common'; +import { ErrorResponse, commonFault } from './error'; +import { StorageProvider } from '@bnb-chain/greenfield-cosmos-types/greenfield/sp/types'; + +export const getSps = async ( + client: Client, +): Promise => { + const [sps, error] = await client.sp.getStorageProviders().then(resolve, commonFault); + if (sps === null || error) { + return [null, error]; + } + const finalSps = (sps ?? []).filter((sp) => sp.endpoint.startsWith('https')); + + return [finalSps, null]; +}; + +export const getNonce = async ({ + spEndpoint, + userAddress, + spName, + domain, +}: { + spEndpoint: string; + userAddress: string; + spName: string; + domain: string; +}) => { + const url = `${spEndpoint}/auth/request_nonce`; + const headers = new Headers({ + 'X-Gnfd-User-Address': userAddress, + 'X-Gnfd-App-Domain': domain, + }); + try { + const result = await fetch(url, { + headers, + }); + if (!result.ok) { + return [null, `${spName} not available!`]; + } + + return [true, null]; + } catch (error) { + return [null, `${spName} not available!`]; + } +}; diff --git a/packages/uploadkit/src/facade/tx.ts b/packages/uploadkit/src/facade/tx.ts new file mode 100644 index 0000000..fbc8fa4 --- /dev/null +++ b/packages/uploadkit/src/facade/tx.ts @@ -0,0 +1,125 @@ +import { TxResponse } from '@bnb-chain/greenfield-js-sdk'; +import { ErrorResponse, UNKNOWN_ERROR, broadcastFault, simulateFault } from './error'; +import { Client } from '@bnb-chain/greenfield-js-sdk'; +import { DeliverResponse, resolve } from './common'; +import { signTypedDataCallback } from './wallet'; +import { TTmpAccount } from '@/components/UploadProvider/types'; + +/** + * ECDSA Signature + */ +export type ECDSA = { + type: 'ECDSA'; + privateKey: string; +}; +/** + * EDDSA Signature + */ +export type EDDSA = { + type: 'EDDSA'; + seed: string; + domain: string; + address: string; +}; +export type AuthType = ECDSA | EDDSA; + +export const broadcastMulTxs = async ({ + txs, + address, + client, + connector, +}: { + txs: TxResponse[]; + address: `0x${string}`; + client: Client; + connector: any; +}): Promise => { + const multiTxs = await client.txClient.multiTx(txs); + const [simulateInfo, simulateError] = await multiTxs + .simulate({ + denom: 'BNB', + }) + .then(resolve, simulateFault); + + if (simulateInfo === null || simulateError) return [null, simulateError]; + + const payload = { + denom: 'BNB', + gasLimit: Number(simulateInfo.gasLimit), + gasPrice: simulateInfo.gasPrice, + payer: address, + granter: '', + signTypedDataCallback: signTypedDataCallback(connector), + }; + const [res, error] = await multiTxs.broadcast(payload).then(resolve, broadcastFault); + + if ((res && res.code !== 0) || error) { + return [null, error || UNKNOWN_ERROR]; + } + + return [true, null]; +}; + +export const broadcastTmpTx = async ( + tx: TxResponse, + tmpAccount: TTmpAccount, + address: `0x${string}`, +): Promise => { + if (!tx) { + return [null, 'tx is null']; + } + const [simulateInfo, simulateError] = await tx + .simulate({ + denom: 'BNB', + }) + .then(resolve, simulateFault); + if (simulateInfo === null || simulateError) return [null, simulateError]; + const broadcastPayload = { + denom: 'BNB', + gasLimit: Number(simulateInfo?.gasLimit), + gasPrice: simulateInfo?.gasPrice || '5000000000', + payer: tmpAccount.address, + granter: address, + privateKey: tmpAccount.privateKey, + }; + + const [res, error] = await tx.broadcast(broadcastPayload).then(resolve, broadcastFault); + + if (!res || (res && res.code !== 0) || error) { + return [null, error || UNKNOWN_ERROR]; + } + + return [res, error]; +}; + +export const broadcastTx = async ( + tx: TxResponse, + address: `0x${string}`, + connector: any, +): Promise => { + if (!tx) { + return [null, 'tx is null']; + } + const [simulateInfo, simulateError] = await tx + .simulate({ + denom: 'BNB', + }) + .then(resolve, simulateFault); + if (simulateInfo === null || simulateError) return [null, simulateError]; + const broadcastPayload = { + denom: 'BNB', + gasLimit: Number(simulateInfo?.gasLimit), + gasPrice: simulateInfo?.gasPrice || '5000000000', + payer: address, + granter: '', + signTypedDataCallback: signTypedDataCallback(connector), + }; + + const [res, error] = await tx.broadcast(broadcastPayload).then(resolve, broadcastFault); + + if (!res || (res && res.code !== 0) || error) { + return [null, error || UNKNOWN_ERROR]; + } + + return [res, error]; +}; diff --git a/packages/uploadkit/src/facade/wallet.ts b/packages/uploadkit/src/facade/wallet.ts new file mode 100644 index 0000000..7ef36c8 --- /dev/null +++ b/packages/uploadkit/src/facade/wallet.ts @@ -0,0 +1,15 @@ +import { Connector } from 'wagmi'; + +export const signTypedDataV4 = async (provider: any, addr: string, message: string) => { + return await provider?.request({ + method: 'eth_signTypedData_v4', + params: [addr, message], + }); +}; + +export const signTypedDataCallback = (connector: Connector) => { + return async (addr: string, message: string) => { + const provider = await connector.getProvider(); + return await signTypedDataV4(provider, addr, message); + }; +}; diff --git a/packages/uploadkit/src/hooks/useAsyncEffect.ts b/packages/uploadkit/src/hooks/useAsyncEffect.ts new file mode 100644 index 0000000..66c4cff --- /dev/null +++ b/packages/uploadkit/src/hooks/useAsyncEffect.ts @@ -0,0 +1,38 @@ +import { isFunction } from '@/utils/common'; +import type { DependencyList } from 'react'; +import { useEffect } from 'react'; + +function isAsyncGenerator( + val: AsyncGenerator | Promise, +): val is AsyncGenerator { + return isFunction((val as AsyncGenerator)[Symbol.asyncIterator]); +} + +function useAsyncEffect( + effect: () => AsyncGenerator | Promise, + deps?: DependencyList, +) { + useEffect(() => { + const e = effect(); + let cancelled = false; + async function execute() { + if (isAsyncGenerator(e)) { + // eslint-disable-next-line no-constant-condition + while (true) { + const result = await e.next(); + if (result.done || cancelled) { + break; + } + } + } else { + await e; + } + } + execute(); + return () => { + cancelled = true; + }; + }, deps); +} + +export default useAsyncEffect; diff --git a/packages/uploadkit/src/hooks/useSettlementFee.ts b/packages/uploadkit/src/hooks/useSettlementFee.ts new file mode 100644 index 0000000..30c08ad --- /dev/null +++ b/packages/uploadkit/src/hooks/useSettlementFee.ts @@ -0,0 +1,22 @@ +import { useUploadKitContext } from '@/components/UploadKitProvider/context'; +import { getSettlementFee } from '@/facade/payment'; +import { useAsyncEffect } from 'ahooks'; +import { useState } from 'react'; + +export const useSettlementFee = (address: string) => { + const [settlementFee, setSettlementFee] = useState('-1'); + const { + options: { client }, + } = useUploadKitContext(); + useAsyncEffect(async () => { + if (!address) return; + + const [fee, error] = await getSettlementFee(address, client); + error ? setSettlementFee('0') : setSettlementFee(fee as string); + }, [address]); + + return { + loading: settlementFee === '-1', + settlementFee, + }; +}; diff --git a/packages/uploadkit/src/hooks/useSingleton.ts b/packages/uploadkit/src/hooks/useSingleton.ts new file mode 100644 index 0000000..83c6044 --- /dev/null +++ b/packages/uploadkit/src/hooks/useSingleton.ts @@ -0,0 +1,15 @@ +import { useState } from 'react'; + +const useSingleton = (singletonClass: { new (): T }): T => { + const [instance, setInstance] = useState(null); + + if (!instance) { + const newSingleton = new singletonClass(); + setInstance(newSingleton); + return newSingleton; + } + + return instance; +}; + +export default useSingleton; diff --git a/packages/uploadkit/src/hooks/useTaskManagementButton.ts b/packages/uploadkit/src/hooks/useTaskManagementButton.ts new file mode 100644 index 0000000..45cf92f --- /dev/null +++ b/packages/uploadkit/src/hooks/useTaskManagementButton.ts @@ -0,0 +1,21 @@ +import { useUpload } from '@/components/UploadProvider'; + +export const useTaskManagementButton = () => { + const { + state: { taskManagement }, + dispatch, + } = useUpload(); + + const onHide = () => { + dispatch({ type: 'SET_TASK_MANAGEMENT_DISPLAY', payload: false }); + }; + const onShow = () => { + dispatch({ type: 'SET_TASK_MANAGEMENT_DISPLAY', payload: true }); + }; + + return { + isShow: taskManagement, + onShow, + onHide, + }; +}; diff --git a/packages/uploadkit/src/hooks/useTotalFee.ts b/packages/uploadkit/src/hooks/useTotalFee.ts new file mode 100644 index 0000000..f1f2d18 --- /dev/null +++ b/packages/uploadkit/src/hooks/useTotalFee.ts @@ -0,0 +1,84 @@ +import { useFee } from '@/components/FeeProvider/context'; +import { useUpload } from '@/components/UploadProvider'; +import { useEffect, useMemo, useState } from 'react'; +import { useAccount } from 'wagmi'; +import { useSettlementFee } from './useSettlementFee'; +import { BN } from '@/utils/math'; +import { + MsgCreateObjectTypeUrl, + MsgGrantAllowanceTypeUrl, + MsgPutPolicyTypeUrl, +} from '@bnb-chain/greenfield-js-sdk'; +import { CRYPTOCURRENCY_DISPLAY_PRECISION } from '@/constants'; +import BigNumber from 'bignumber.js'; +import { WaitObject } from '@/components/UploadProvider/types'; +import { getStoreNetflowRate } from '@/utils/fee'; + +export function useTotalFee() { + const { + state: { waitQueue }, + } = useUpload(); + const [totalFee, setTotalFee] = useState('0'); + const { gasHub, storeParams } = useFee(); + const { gasObjects = {} } = gasHub || {}; + const { address } = useAccount(); + const { settlementFee } = useSettlementFee(address as string); + const createTmpAccountGasFee = useMemo(() => { + const grantAllowTxFee = BN(gasObjects[MsgGrantAllowanceTypeUrl]?.gasFee || 0).plus( + BN(gasObjects[MsgGrantAllowanceTypeUrl]?.perItemFee || 0).times(1), + ); + const putPolicyTxFee = BN(gasObjects[MsgPutPolicyTypeUrl]?.gasFee); + + return grantAllowTxFee.plus(putPolicyTxFee).dp(CRYPTOCURRENCY_DISPLAY_PRECISION).toString(); + }, [gasObjects]); + const { + size, + num, + storeFee: rawStoreFee, + } = useMemo(() => { + return waitQueue.reduce( + (acc: { size: number; num: string; storeFee: BigNumber }, cur: WaitObject) => { + if (cur.status === 'WAIT') { + acc.size += cur.size; + acc.num += 1; + acc.storeFee = acc.storeFee.plus( + BN(getStoreNetflowRate(cur.size || 0, storeParams)).times(storeParams.reserveTime), + ); + return acc; + } + return acc; + }, + { size: 0, num: 0, storeFee: BN(0) }, + ); + }, [storeParams, waitQueue]); + const { gasFee } = gasObjects?.[MsgCreateObjectTypeUrl] || {}; + + const storeFee = BN(rawStoreFee) + .dividedBy(10 ** 18) + .dp(CRYPTOCURRENCY_DISPLAY_PRECISION) + .toString(); + const objectsGasFee = BN(num) + .times(gasFee || 0) + .dp(CRYPTOCURRENCY_DISPLAY_PRECISION) + .toString(); + + useEffect(() => { + const totalFee = BN(objectsGasFee) + .plus(createTmpAccountGasFee) + .plus(settlementFee) + .plus(storeFee) + .dp(CRYPTOCURRENCY_DISPLAY_PRECISION) + .toString(); + setTotalFee(totalFee); + }, [createTmpAccountGasFee, objectsGasFee, settlementFee, storeFee]); + + return { + objectsCount: num, + objectsSize: size, + totalFee, + settlementFee, + objectsGasFee, + createTmpAccountGasFee, + storeFee, + }; +} diff --git a/packages/uploadkit/src/hooks/useUploadDisable.ts b/packages/uploadkit/src/hooks/useUploadDisable.ts new file mode 100644 index 0000000..630c47b --- /dev/null +++ b/packages/uploadkit/src/hooks/useUploadDisable.ts @@ -0,0 +1,34 @@ +import { useUpload } from '@/components/UploadProvider'; +import { WaitObject } from '@/components/UploadProvider/types'; +import { isGnfdChain } from '@/utils/network'; +import { useEffect, useState } from 'react'; +import { useNetwork } from 'wagmi'; + +export const useUploadDisable = () => { + const [uploadButtonDisabled, setUploadButtonDisabled] = useState(false); + const [dragAreaDisabled, setDragAreaDisabled] = useState(false); + const [isGnfd, setIsGnfd] = useState(false); + const { chain } = useNetwork(); + const { + state: { loading, waitQueue }, + } = useUpload(); + useEffect(() => { + const isGnfd = isGnfdChain(chain?.id); + const buttonDisabled = + loading || + !isGnfd || + waitQueue.length === 0 || + (waitQueue.length > 0 && waitQueue.every((item: WaitObject) => item.status !== 'WAIT')); + + const dragDisabled = loading || !isGnfd; + setIsGnfd(isGnfd); + setUploadButtonDisabled(buttonDisabled); + setDragAreaDisabled(dragDisabled); + }, [chain?.id, loading, waitQueue]); + + return { + isGnfd, + uploadButtonDisabled, + dragAreaDisabled, + }; +}; diff --git a/packages/uploadkit/src/hooks/useUploadModal.ts b/packages/uploadkit/src/hooks/useUploadModal.ts new file mode 100644 index 0000000..2c109b7 --- /dev/null +++ b/packages/uploadkit/src/hooks/useUploadModal.ts @@ -0,0 +1,24 @@ +import { useModal } from '@/components/ModalProvider/context'; +import { routes } from '@/components/RouteProvider'; +import { useRouter } from '@/components/RouteProvider/context'; + +export const useUploadModal = () => { + const router = useRouter(); + const { onOpen, onClose } = useModal(); + const onOpenDragModal = () => { + router.push(routes.DRAG); + onOpen(); + }; + const onOpenUploadModal = () => { + router.push(routes.UPLOAD); + onOpen(); + }; + const onCloseModal = () => { + onClose(); + }; + return { + onOpenDragModal, + onOpenUploadModal, + onCloseModal, + }; +}; diff --git a/packages/uploadkit/src/hooks/useUploadQueue.ts b/packages/uploadkit/src/hooks/useUploadQueue.ts new file mode 100644 index 0000000..2cba6e3 --- /dev/null +++ b/packages/uploadkit/src/hooks/useUploadQueue.ts @@ -0,0 +1,11 @@ +import { useUpload } from '@/components/UploadProvider'; + +export const useUploadQueue = () => { + const { + state: { uploadQueue }, + } = useUpload(); + + return { + uploadQueue, + }; +}; diff --git a/packages/uploadkit/src/hooks/useUploadQueueStatus.ts b/packages/uploadkit/src/hooks/useUploadQueueStatus.ts new file mode 100644 index 0000000..96d4e83 --- /dev/null +++ b/packages/uploadkit/src/hooks/useUploadQueueStatus.ts @@ -0,0 +1,38 @@ +import { useUpload } from '@/components/UploadProvider'; +import { UploadObject } from '@/components/UploadProvider/types'; +import { useEffect, useState } from 'react'; + +export enum UploadQueueStatus { + EMPTY = 0, + UPLOADING = 1, + SUCCESS = 2, + FAILED = 3, +} + +export const useUploadQueueStatus = () => { + const [status, setStatus] = useState(UploadQueueStatus.EMPTY); + const { + state: { uploadQueue }, + } = useUpload(); + + useEffect(() => { + const allStatus = uploadQueue.map((item: UploadObject) => item.status); + const uniqueStatus = [...new Set(allStatus)] as string[]; + if (uploadQueue.length === 0) { + return setStatus(UploadQueueStatus.EMPTY); + } + if ( + uniqueStatus.some((item: string) => + ['WAIT', 'HASH', 'HASHED', 'SIGN', 'SIGNED', 'UPLOAD'].includes(item), + ) + ) { + setStatus(UploadQueueStatus.UPLOADING); + } else if (uniqueStatus.length === 1 && uniqueStatus[0] === 'FINISH') { + setStatus(UploadQueueStatus.SUCCESS); + } else { + setStatus(UploadQueueStatus.FAILED); + } + }, [JSON.stringify(uploadQueue)]); + + return status; +}; diff --git a/packages/uploadkit/src/index.ts b/packages/uploadkit/src/index.ts new file mode 100644 index 0000000..9c296b9 --- /dev/null +++ b/packages/uploadkit/src/index.ts @@ -0,0 +1,18 @@ +// components +export * from './components/UploadKitButton'; +export * from './components/UploadKitProvider/context'; +export * from './components/UploadKitProvider'; +export { useUpload } from './components/UploadProvider/index'; +export { useModal } from './components/ModalProvider/context'; + +export * from './hooks/useUploadQueue'; +export * from './hooks/useUploadModal'; +export * from './hooks/useTaskManagementButton'; +export { type ThemeMode, type ThemeVariant } from './components/ThemeProvider'; + +// utils +export * from './base/utils/mobile'; +export * from './base/utils/css'; + +// types +export * from './types'; diff --git a/packages/uploadkit/src/pages/Upload/index.tsx b/packages/uploadkit/src/pages/Upload/index.tsx new file mode 100644 index 0000000..9477b4c --- /dev/null +++ b/packages/uploadkit/src/pages/Upload/index.tsx @@ -0,0 +1,14 @@ +import { ModalBody } from '@/base/components/Modal/ModalBody'; +import { Navbar } from '@/components/Navbar'; +import { UploadList } from '@/components/UploadList'; + +export function UploadPage() { + return ( + <> + Upload Objects + + + + + ); +} diff --git a/packages/uploadkit/src/pages/Wait/index.tsx b/packages/uploadkit/src/pages/Wait/index.tsx new file mode 100644 index 0000000..b3a9267 --- /dev/null +++ b/packages/uploadkit/src/pages/Wait/index.tsx @@ -0,0 +1,29 @@ +import { ModalBody } from '@/base/components/Modal/ModalBody'; +import { ModalFooter } from '@/base/components/Modal/ModalFooter'; +import { UploadButton } from '@/components/UploadButton'; +import { Navbar } from '@/components/Navbar'; +import { WaitList } from '@/components/WaitList'; +import { TotalFee } from '@/components/TotalFee'; +import { useUpload } from '@/components/UploadProvider'; +import { DragArea } from '@/components/DragArea'; + +export function WaitPage() { + const { + state: { waitQueue }, + } = useUpload(); + const hasWaitQueue = waitQueue && waitQueue.length > 0; + return ( + <> + Upload Objects + {hasWaitQueue && } + + {!hasWaitQueue && } + + + + + + + + ); +} diff --git a/packages/uploadkit/src/themes/base.ts b/packages/uploadkit/src/themes/base.ts new file mode 100644 index 0000000..b3d1e16 --- /dev/null +++ b/packages/uploadkit/src/themes/base.ts @@ -0,0 +1,104 @@ +import { rgba, DeepPartial } from '..'; + +const radii = { + common: '8px', + modal: '12px', + + navButton: '4px', + button: 'var(--uk-radii-common)', + uploadKitButton: 'var(--uk-radii-common)', + toast: 'var(--uk-radii-common)', +}; + +const zIndices = { + taskManagementButton: 1200, + modal: 1300, + toast: 1500, +}; + +export const base = { + light: { + colors: { + text: '#1E2026', + textSecondary: '#76808F', + error: '#D9304E', + errorActive: '#B82942', + border: '#E6E8EA', + disabled: '#AEB4BC', + blue: '#1184EE', + + bgNormal: '#fff', + bgBottom: '#F5F5F5', + + modalBackground: '#fff', + modalOverlay: 'rgba(0, 0, 0, 0.5)', + + totalFeeLabel: '#474D57', + + buttonText: '#fff', + buttonTextHover: 'var(--uk-colors-text)', + buttonBackground: '#1E2026', + buttonBackgroundHover: rgba('#F0B90B', 0.1), + + uploadKitButtonText: 'var(--uk-colors-text)', + uploadKitButtonTextHover: 'var(--uk-colors-text)', + uploadKitButtonBackground: '#f5f5f5', + uploadKitButtonBackgroundHover: '#e6e8ea', + + navButtonText: 'var(--uk-colors-textSecondary)', + navButtonBackgroundHover: 'var(--uk-colors-border)', + + toastBackground: 'var(--uk-colors-modalBackground)', + }, + shadows: { + toast: '0px 4px 24px rgba(0, 0, 0, 0.08)', + button: '0px 4px 24px 0px rgba(0, 0, 0, 0.08)', + }, + radii, + zIndices, + }, + dark: { + colors: { + text: '#fff', + textSecondary: '#76808F', + error: '#D9304E', + errorActive: '#B82942', + border: '#2e323a', + disabled: '#5E6673', + blue: '#1184EE', + + bgBottom: '#000', + bgNormal: '#1E2026', + + modalBackground: '#1E2026', + modalOverlay: rgba('#000', 0.5), + + totalFeeLabel: '#fff', + buttonText: 'var(--uk-colors-text)', + buttonTextHover: 'var(--uk-colors-text)', + buttonBackground: '#14151a', + buttonBackgroundHover: rgba('#F0B90B', 0.1), + + uploadKitButtonText: 'var(--uk-colors-text)', + uploadKitButtonTextHover: 'var(--uk-colors-text)', + uploadKitButtonBackground: '#2b2f36', + uploadKitButtonBackgroundHover: '#2e323a', + + navButtonText: 'var(--uk-colors-textSecondary)', + navButtonBackgroundHover: 'var(--uk-colors-border)', + + toastBackground: 'var(--uk-colors-modalBackground)', + }, + shadows: { + toast: '0px 4px 24px rgba(0, 0, 0, 0.08)', + button: '0px 4px 24px 0px rgba(0, 0, 0, 0.08)', + }, + radii, + zIndices, + }, +}; + +export type Theme = (typeof base)['light']; +export type ThemeWithMode = typeof base; + +export type CustomTheme = DeepPartial & DeepPartial; diff --git a/packages/uploadkit/src/types.ts b/packages/uploadkit/src/types.ts new file mode 100644 index 0000000..bc22a70 --- /dev/null +++ b/packages/uploadkit/src/types.ts @@ -0,0 +1,7 @@ +export type DeepPartial = T extends object + ? { + [P in keyof T]?: DeepPartial; + } + : T; + +export type SVGIconProps = React.SVGProps; diff --git a/packages/uploadkit/src/utils/bucket.ts b/packages/uploadkit/src/utils/bucket.ts new file mode 100644 index 0000000..52b751a --- /dev/null +++ b/packages/uploadkit/src/utils/bucket.ts @@ -0,0 +1,26 @@ +import { getBucketMeta } from '@/facade/bucket'; +import { Client } from '@bnb-chain/greenfield-js-sdk'; + +const getRandomString = (length: number): string => { + const characters = 'abcdefghijklmnopqrstuvwxyz0123456789'; + return Array.from( + { length }, + () => characters[Math.floor(Math.random() * characters.length)], + ).join(''); +}; + +export const getRandomBucketName = () => { + return `bucket-${getRandomString(8)}`; +}; + +export const bucketIsExist = async ( + options: { bucketName: string; endpoint: string }, + client: Client, +) => { + const [exist, error] = await getBucketMeta(options, client); + + if (!exist || error) { + return false; + } + return true; +}; diff --git a/packages/uploadkit/src/utils/common.ts b/packages/uploadkit/src/utils/common.ts new file mode 100644 index 0000000..6ef867f --- /dev/null +++ b/packages/uploadkit/src/utils/common.ts @@ -0,0 +1,39 @@ +export function isObject(item: any) { + return item && typeof item === 'object' && !Array.isArray(item) && item !== null; +} + +export function deepMerge(target: any, source: any) { + if (isObject(target) && isObject(source)) { + for (const key in source) { + if (isObject(source[key])) { + if (!target[key]) Object.assign(target, { [key]: {} }); + deepMerge(target[key], source[key]); + } else { + Object.assign(target, { [key]: source[key] }); + } + } + } + + return target; +} + +export const isFunction = (value: unknown): value is (...args: any) => any => + typeof value === 'function'; + +export const parseErrorXml = async (result: any) => { + try { + const xmlText = await result?.response?.data; + const xml = await new window.DOMParser().parseFromString(xmlText, 'text/xml'); + const code = (xml as XMLDocument).getElementsByTagName('Code')[0].textContent; + const message = (xml as XMLDocument).getElementsByTagName('Message')[0].textContent; + return { + code, + message, + }; + } catch { + return { + code: null, + message: null, + }; + } +}; diff --git a/packages/uploadkit/src/utils/css.ts b/packages/uploadkit/src/utils/css.ts new file mode 100644 index 0000000..ec9f240 --- /dev/null +++ b/packages/uploadkit/src/utils/css.ts @@ -0,0 +1,29 @@ +export function cx(...classNames: Array) { + if (!classNames.length) return; + return classNames.filter(Boolean).join(' '); +} + +export function cssVar(name: string, type = 'colors') { + return `var(--uk-${type}-${name.replace(/\./g, '-')})`; +} + +export function rgba( + firstValue: number | string, + secondValue?: number, + thirdValue?: number, + fourthValue = 1, +): string { + if (typeof firstValue === 'string') { + if (firstValue.startsWith('#')) { + const hexStr = firstValue.slice(1); + const formatStr = hexStr.length === 3 ? hexStr.replace(/[A-F\d]/gi, '$&$&') : hexStr; + const hexArr = formatStr.match(/.{2}/g)?.map((v) => parseInt(v, 16)); + + if (hexArr?.length === 3) { + return rgba(hexArr[0], hexArr[1], hexArr[2], secondValue); + } + } + } + + return `rgba(${firstValue}, ${secondValue}, ${thirdValue}, ${fourthValue})`; +} diff --git a/packages/uploadkit/src/utils/fee.ts b/packages/uploadkit/src/utils/fee.ts new file mode 100644 index 0000000..0edf7ef --- /dev/null +++ b/packages/uploadkit/src/utils/fee.ts @@ -0,0 +1,35 @@ +import { StoreParams } from '@/components/FeeProvider/context'; +import { BN } from './math'; + +export const getStoreNetflowRate = (size: number, storeFeeParams: StoreParams) => { + const { + primarySpStorePrice, + secondarySpStorePrice, + redundantDataChunkNum, + redundantParityChunkNum, + minChargeSize, + validatorTaxRate, + } = storeFeeParams; + const chargeSize = size >= minChargeSize ? size : minChargeSize; + const primarySpRate = BN(primarySpStorePrice).dividedBy(Math.pow(10, 18)).times(BN(chargeSize)); + const secondarySpNum = redundantDataChunkNum + redundantParityChunkNum; + let secondarySpRate = BN(secondarySpStorePrice).dividedBy(Math.pow(10, 18)).times(BN(chargeSize)); + secondarySpRate = secondarySpRate.times(secondarySpNum); + const validatorTax = BN(validatorTaxRate) + .dividedBy(Math.pow(10, 18)) + .times(primarySpRate.plus(secondarySpRate)); + const netflowRate = primarySpRate.plus(secondarySpRate).plus(validatorTax); + + return netflowRate.toString(); +}; + +export const getQuotaNetflowRate = (size: number, storeFeeParams: StoreParams) => { + const { validatorTaxRate, readPrice } = storeFeeParams; + const primaryQuotaRate = BN(readPrice) + .dividedBy(10 ** 18) + .times(size); + const taxRate = BN(validatorTaxRate) + .dividedBy(10 ** 18) + .times(primaryQuotaRate); + return primaryQuotaRate.plus(taxRate).toString(); +}; diff --git a/packages/uploadkit/src/utils/math.ts b/packages/uploadkit/src/utils/math.ts new file mode 100644 index 0000000..4fff109 --- /dev/null +++ b/packages/uploadkit/src/utils/math.ts @@ -0,0 +1,7 @@ +import BigNumber from 'bignumber.js'; + +BigNumber.config({ + EXPONENTIAL_AT: 18, +}); + +export const BN = BigNumber; diff --git a/packages/uploadkit/src/utils/mobile.ts b/packages/uploadkit/src/utils/mobile.ts new file mode 100644 index 0000000..228fbfd --- /dev/null +++ b/packages/uploadkit/src/utils/mobile.ts @@ -0,0 +1,23 @@ +export function isAndroid(): boolean { + return typeof navigator !== 'undefined' && /android/i.test(navigator.userAgent); +} + +export function isSmallIOS(): boolean { + return typeof navigator !== 'undefined' && /iPhone|iPod/.test(navigator.userAgent); +} + +export function isLargeIOS(): boolean { + return ( + typeof navigator !== 'undefined' && + (/iPad/.test(navigator.userAgent) || + (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) + ); +} + +export function isIOS(): boolean { + return isSmallIOS() || isLargeIOS(); +} + +export function isMobile(): boolean { + return isAndroid() || isIOS(); +} diff --git a/packages/uploadkit/src/utils/network.ts b/packages/uploadkit/src/utils/network.ts new file mode 100644 index 0000000..fcff773 --- /dev/null +++ b/packages/uploadkit/src/utils/network.ts @@ -0,0 +1,6 @@ +import { gnfdChainIds } from '@/constants'; + +export const isGnfdChain = (chainId?: number) => { + if (!chainId) return false; + return gnfdChainIds.includes(chainId); +}; diff --git a/packages/uploadkit/src/utils/object.ts b/packages/uploadkit/src/utils/object.ts new file mode 100644 index 0000000..95444bf --- /dev/null +++ b/packages/uploadkit/src/utils/object.ts @@ -0,0 +1,161 @@ +import { VisibilityType } from '@bnb-chain/greenfield-cosmos-types/greenfield/storage/common'; +import { Long } from '@bnb-chain/greenfield-js-sdk'; + +export type TKey = keyof typeof VisibilityType; + +export type TReverseVisibilityType = { + [K in number]: TKey; +}; + +export type DragItemProps = { + items: DataTransferItemList; +}; + +export type DragMonitorProps = { + isOver: boolean; +}; + +export type TransferItemTree = { + [key: string]: File; +}; + +export type TransferItemFlat = { + [key: string]: File; +}; + +const StringIsNumber = (value: string) => !isNaN(Number(value)); + +export const convertVisibility = () => { + const reverseVisibilityType: any = {} as TReverseVisibilityType; + Object.keys(VisibilityType) + .filter(StringIsNumber) + .forEach((item: any) => { + reverseVisibilityType[item] = VisibilityType[item]; + }); + + return reverseVisibilityType; +}; + +export const reverseVisibilityType = convertVisibility(); + +export const isUTF8 = (str: string): boolean => { + try { + new TextDecoder('utf-8').decode(new TextEncoder().encode(str)); + return true; + } catch { + return false; + } +}; + +interface Timestamp { + seconds: Long; + nanos: number; +} + +export function toTimestamp(date: Date): Timestamp { + const milliseconds = date.getTime(); + const seconds = new Long(Math.floor(milliseconds / 1000)); + const nanos = date.getMilliseconds() * 1000000; + + return { seconds, nanos }; +} + +export const validateFile = (file: File, maxSize: number) => { + if (!file || file.size <= 0) { + return 'Object is empty'; + } + if (file.size > maxSize) { + return 'Object is too large'; + } + if (file.name.length > 256) { + return 'The object name must be between 1 and 256 characters long.'; + } + if (file.name.includes('//')) { + return 'The object name contains a slash (/).'; + } + + return ''; +}; + +function trimStart(str: string, chars: string) { + const pattern = new RegExp(`^[${chars}]+`); + return str.replace(pattern, ''); +} + +export const isFileEntry = (entry: FileSystemEntry): entry is FileSystemFileEntry => { + return entry.isFile; +}; + +export const isDirectoryEntry = (entry: FileSystemEntry): entry is FileSystemDirectoryEntry => { + return entry.isDirectory; +}; + +export const traverseEntry = async ( + entry: FileSystemEntry | null, + tree: TransferItemTree = {}, +): Promise => { + if (!entry) return tree; + + const path = trimStart(entry.fullPath, '/'); + + if (isFileEntry(entry)) { + return new Promise((resolve) => { + entry.file((file) => { + tree[path] = file; + resolve(tree); + }); + }); + } + + if (isDirectoryEntry(entry)) { + const newPath = path + '/'; + tree[newPath] = new File([], newPath, { type: 'text/plain' }); + const reader = entry.createReader(); + return new Promise((resolve) => { + reader.readEntries(async (entries) => { + const entryTree = await Promise.all(entries.map((entry) => traverseEntry(entry, tree))); + resolve(entryTree.reduce((r, c) => ({ ...r, ...c }), {})); + }); + }); + } + return tree; +}; + +export const traverseTransferItems = async (items: DataTransferItemList) => { + const trees = await Promise.all( + Array.from(items, (item) => traverseEntry(item.webkitGetAsEntry())), + ); + return trees.reduce((r, c) => ({ ...r, ...c }), {}); +}; + +export const flatEntry = async ( + entry: FileSystemEntry | null, + flat: TransferItemFlat = {}, +): Promise => { + if (!entry) return flat; + + if (isFileEntry(entry)) { + return new Promise((resolve) => { + entry.file((file) => { + flat[file.name] = file; + resolve(flat); + }); + }); + } + + if (isDirectoryEntry(entry)) { + const reader = entry.createReader(); + return new Promise((resolve) => { + reader.readEntries(async (entries) => { + const entryFlat = await Promise.all(entries.map((entry) => flatEntry(entry, flat))); + resolve(entryFlat.reduce((r, c) => ({ ...r, ...c }), {})); + }); + }); + } + return flat; +}; + +export const flattenTransferItems = async (items: DataTransferItemList) => { + const flats = await Promise.all(Array.from(items, (item) => flatEntry(item.webkitGetAsEntry()))); + return flats.reduce((r, c) => ({ ...r, ...c }), {}); +}; diff --git a/packages/uploadkit/src/utils/time.ts b/packages/uploadkit/src/utils/time.ts new file mode 100644 index 0000000..3ce17cc --- /dev/null +++ b/packages/uploadkit/src/utils/time.ts @@ -0,0 +1,3 @@ +export const getTimestampInSeconds = () => { + return Math.floor(+new Date() / 1000); +}; diff --git a/packages/uploadkit/styles.css/package.json b/packages/uploadkit/styles.css/package.json new file mode 100644 index 0000000..7d0e3bc --- /dev/null +++ b/packages/uploadkit/styles.css/package.json @@ -0,0 +1,3 @@ +{ + "main": "../dist/style.css" +} diff --git a/packages/uploadkit/tsconfig.json b/packages/uploadkit/tsconfig.json new file mode 100644 index 0000000..889f2f0 --- /dev/null +++ b/packages/uploadkit/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src"], + // dev development + // "include": ["src", "dev"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/uploadkit/tsconfig.node.json b/packages/uploadkit/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/packages/uploadkit/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/uploadkit/vite.config.ts b/packages/uploadkit/vite.config.ts new file mode 100644 index 0000000..65f0c69 --- /dev/null +++ b/packages/uploadkit/vite.config.ts @@ -0,0 +1,45 @@ +import { defineConfig } from 'vite'; +// The default Vite plugin for React projects. +import react from '@vitejs/plugin-react'; +// Write your styles in TypeScript (or JavaScript) with locally scoped class names and CSS Variables, then generate static CSS files at build time. +import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin'; +// A Vite plugin that generates declaration files (*.d.ts) from .ts(x) or .vue source files when using Vite in library mode. +import dts from 'vite-plugin-dts'; +// A Rollup plugin which locates modules using the Node resolution algorithm, for using third party modules in node_modules +import nodeResolve from '@rollup/plugin-node-resolve'; +// Automatically externalize peerDependencies in a rollup bundle. +import peerDepsExternal from 'rollup-plugin-peer-deps-external'; +import path from 'path'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react(), + vanillaExtractPlugin({ + identifiers: ({ hash }) => `uk_${hash}`, + }), + dts(), + ], + resolve: { + alias: { + '@': path.resolve(__dirname, 'src'), + }, + }, + build: { + target: 'esnext', + minify: false, + lib: { + formats: ['es'], + entry: { + index: 'src/index.ts', + }, + }, + rollupOptions: { + external: ['react', 'react-dom', 'viem', 'wagmi', '@bnb-chain/greenfield-js-sdk'], + plugins: [peerDepsExternal(), nodeResolve()], + output: { + chunkFileNames: 'common.js', + }, + }, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..98279d2 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,9365 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: false + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@changesets/cli': + specifier: ^2.27.1 + version: 2.27.1 + '@commitlint/cli': + specifier: ^18.4.3 + version: 18.4.3 + '@commitlint/config-conventional': + specifier: ^18.4.3 + version: 18.4.3 + '@typescript-eslint/eslint-plugin': + specifier: ^5.62.0 + version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.54.0) + '@typescript-eslint/parser': + specifier: ^5.62.0 + version: 5.62.0(eslint@8.54.0) + eslint: + specifier: ^8.54.0 + version: 8.54.0 + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.0(eslint@8.54.0) + eslint-plugin-react-refresh: + specifier: ^0.3.5 + version: 0.3.5(eslint@8.54.0) + husky: + specifier: ^8.0.3 + version: 8.0.3 + lint-staged: + specifier: ^15.1.0 + version: 15.1.0 + prettier: + specifier: ^3.1.0 + version: 3.1.0 + + examples/nextjs-with-rainbowkit: + dependencies: + '@bnb-chain/greenfield-cosmos-types': + specifier: 0.4.0-alpha.30 + version: 0.4.0-alpha.30 + '@bnb-chain/greenfield-js-sdk': + specifier: 1.2.0 + version: 1.2.0 + '@bnb-chain/reed-solomon': + specifier: ^1.1.3 + version: 1.1.3 + '@node-real/greenfield-uploadkit': + specifier: workspace:* + version: link:../../packages/uploadkit + '@rainbow-me/rainbowkit': + specifier: ^1.3.3 + version: 1.3.3(@types/react@18.2.39)(react-dom@18.2.0)(react@18.2.0)(viem@1.19.9)(wagmi@1.4.7) + '@totejs/walletkit': + specifier: ^1.0.8 + version: 1.0.8(react-dom@18.2.0)(react@18.2.0)(viem@1.19.9)(wagmi@1.4.7) + axios: + specifier: ^1.6.3 + version: 1.6.3 + next: + specifier: ^13.5.6 + version: 13.5.6(react-dom@18.2.0)(react@18.2.0) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + viem: + specifier: ^1.19.9 + version: 1.19.9(typescript@5.3.2) + wagmi: + specifier: ^1.4.7 + version: 1.4.7(@types/react@18.2.39)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2)(viem@1.19.9) + devDependencies: + '@types/node': + specifier: ^20.10.0 + version: 20.10.0 + '@types/react': + specifier: ^18.2.39 + version: 18.2.39 + '@types/react-dom': + specifier: ^18.2.17 + version: 18.2.17 + typescript: + specifier: ^5.3.2 + version: 5.3.2 + + examples/nextjs-with-walletkit: + dependencies: + '@bnb-chain/greenfield-cosmos-types': + specifier: 0.4.0-alpha.30 + version: 0.4.0-alpha.30 + '@bnb-chain/greenfield-js-sdk': + specifier: 1.2.0 + version: 1.2.0 + '@bnb-chain/reed-solomon': + specifier: ^1.1.3 + version: 1.1.3 + '@node-real/greenfield-uploadkit': + specifier: workspace:* + version: link:../../packages/uploadkit + axios: + specifier: ^1.6.3 + version: 1.6.3 + next: + specifier: ^13.5.6 + version: 13.5.6(react-dom@18.2.0)(react@18.2.0) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + viem: + specifier: ^1.19.9 + version: 1.19.9(typescript@5.3.2) + wagmi: + specifier: ^1.4.7 + version: 1.4.7(@types/react@18.2.39)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2)(viem@1.19.9) + devDependencies: + '@types/node': + specifier: ^20.10.0 + version: 20.10.0 + '@types/react': + specifier: ^18.2.39 + version: 18.2.39 + '@types/react-dom': + specifier: ^18.2.17 + version: 18.2.17 + typescript: + specifier: ^5.3.2 + version: 5.3.2 + + examples/vite-with-walletkit: + dependencies: + '@bnb-chain/greenfield-cosmos-types': + specifier: 0.4.0-alpha.30 + version: 0.4.0-alpha.30 + '@bnb-chain/greenfield-js-sdk': + specifier: 1.2.0 + version: 1.2.0 + '@bnb-chain/reed-solomon': + specifier: ^1.1.3 + version: 1.1.3 + '@node-real/greenfield-uploadkit': + specifier: workspace:* + version: link:../../packages/uploadkit + '@totejs/walletkit': + specifier: ^1.0.8 + version: 1.0.8(react-dom@18.2.0)(react@18.2.0)(viem@1.19.9)(wagmi@1.4.7) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + viem: + specifier: ^1.19.9 + version: 1.19.9(typescript@5.3.2) + wagmi: + specifier: ^1.4.7 + version: 1.4.7(@types/react@18.2.39)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2)(viem@1.19.9) + devDependencies: + '@types/react': + specifier: ^18.2.39 + version: 18.2.39 + '@types/react-dom': + specifier: ^18.2.17 + version: 18.2.17 + '@vitejs/plugin-react': + specifier: ^4.2.0 + version: 4.2.1(vite@4.5.0) + buffer: + specifier: ^6.0.3 + version: 6.0.3 + events: + specifier: ^3.3.0 + version: 3.3.0 + process: + specifier: ^0.11.10 + version: 0.11.10 + typescript: + specifier: ^5.3.2 + version: 5.3.2 + vconsole: + specifier: ^3.15.1 + version: 3.15.1 + vite: + specifier: ^4.5.0 + version: 4.5.0 + + packages/uploadkit: + dependencies: + '@ethersproject/wallet': + specifier: ^5.7.0 + version: 5.7.0 + axios: + specifier: ^1.6.3 + version: 1.6.3 + bignumber.js: + specifier: ^9.1.2 + version: 9.1.2 + devDependencies: + '@bnb-chain/greenfield-cosmos-types': + specifier: 0.4.0-alpha.30 + version: 0.4.0-alpha.30 + '@bnb-chain/greenfield-js-sdk': + specifier: 1.2.0 + version: 1.2.0 + '@bnb-chain/reed-solomon': + specifier: ^1.1.3 + version: 1.1.3 + '@rollup/plugin-inject': + specifier: ^5.0.3 + version: 5.0.5 + '@rollup/plugin-node-resolve': + specifier: ^15.2.3 + version: 15.2.3 + '@totejs/walletkit': + specifier: ^1.0.8 + version: 1.0.8(react-dom@18.2.0)(react@18.2.0)(viem@1.19.9)(wagmi@1.4.7) + '@types/qrcode': + specifier: ^1.5.5 + version: 1.5.5 + '@types/react': + specifier: ^18.2.39 + version: 18.2.39 + '@types/react-dom': + specifier: ^18.2.17 + version: 18.2.17 + '@vanilla-extract/css': + specifier: ^1.14.0 + version: 1.14.0 + '@vanilla-extract/vite-plugin': + specifier: ^3.9.2 + version: 3.9.2(vite@4.5.0) + '@vitejs/plugin-react': + specifier: ^4.2.0 + version: 4.2.1(vite@4.5.0) + ahooks: + specifier: ^3.7.8 + version: 3.7.8(react@18.2.0) + buffer: + specifier: ^6.0.3 + version: 6.0.3 + events: + specifier: ^3.3.0 + version: 3.3.0 + process: + specifier: ^0.11.10 + version: 0.11.10 + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + rollup-plugin-peer-deps-external: + specifier: ^2.2.4 + version: 2.2.4 + typescript: + specifier: ^5.3.2 + version: 5.3.2 + viem: + specifier: ^1.19.9 + version: 1.19.9(typescript@5.3.2) + vite: + specifier: ^4.5.0 + version: 4.5.0 + vite-plugin-dts: + specifier: ^3.6.3 + version: 3.6.3(typescript@5.3.2)(vite@4.5.0) + wagmi: + specifier: ^1.4.7 + version: 1.4.7(@types/react@18.2.39)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2)(viem@1.19.9) + + website: + dependencies: + '@bnb-chain/greenfield-cosmos-types': + specifier: 0.4.0-alpha.30 + version: 0.4.0-alpha.30 + '@bnb-chain/greenfield-js-sdk': + specifier: 1.2.0 + version: 1.2.0 + '@bnb-chain/reed-solomon': + specifier: ^1.1.3 + version: 1.1.3 + '@emotion/react': + specifier: ^11.11.1 + version: 11.11.1(@types/react@18.2.39)(react@18.2.0) + '@emotion/styled': + specifier: ^11.11.0 + version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.39)(react@18.2.0) + '@mdx-js/mdx': + specifier: ~2.1.5 + version: 2.1.5 + '@mdx-js/react': + specifier: ~2.2.1 + version: 2.2.1(react@18.2.0) + '@node-real/greenfield-uploadkit': + specifier: workspace:* + version: link:../packages/uploadkit + '@totejs/icons': + specifier: ^2.19.0 + version: 2.19.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) + '@totejs/uikit': + specifier: ^2.54.2 + version: 2.54.2(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) + '@totejs/walletkit': + specifier: ^1.0.8 + version: 1.0.8(react-dom@18.2.0)(react@18.2.0)(viem@1.19.9)(wagmi@1.4.7) + prism-react-renderer: + specifier: ~1.3.5 + version: 1.3.5(react@18.2.0) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-live: + specifier: ~2.4.1 + version: 2.4.1(react-dom@18.2.0)(react@18.2.0) + react-router-dom: + specifier: ~6.6.2 + version: 6.6.2(react-dom@18.2.0)(react@18.2.0) + unified: + specifier: ~10.1.2 + version: 10.1.2 + unist-util-visit: + specifier: ~4.1.2 + version: 4.1.2 + viem: + specifier: ^1.19.9 + version: 1.19.9(typescript@5.3.2) + wagmi: + specifier: ^1.4.7 + version: 1.4.7(@types/react@18.2.39)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2)(viem@1.19.9) + devDependencies: + '@mdx-js/rollup': + specifier: ~2.2.1 + version: 2.2.1 + '@types/mdx': + specifier: ~2.0.10 + version: 2.0.10 + '@types/node': + specifier: ~18.6.5 + version: 18.6.5 + '@types/react': + specifier: ^18.2.39 + version: 18.2.39 + '@types/react-dom': + specifier: ^18.2.17 + version: 18.2.17 + '@vitejs/plugin-react': + specifier: ~4.1.1 + version: 4.1.1(vite@4.5.0) + buffer: + specifier: ^6.0.3 + version: 6.0.3 + events: + specifier: ^3.3.0 + version: 3.3.0 + process: + specifier: ^0.11.10 + version: 0.11.10 + remark-gfm: + specifier: ~3.0.1 + version: 3.0.1 + ts-node: + specifier: ~10.9.1 + version: 10.9.1(@types/node@18.6.5)(typescript@5.3.2) + typescript: + specifier: ^5.3.2 + version: 5.3.2 + vite: + specifier: ~4.5.0 + version: 4.5.0(@types/node@18.6.5) + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@adraffy/ens-normalize@1.10.0: + resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + dev: true + + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + + /@babel/code-frame@7.23.4: + resolution: {integrity: sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + dev: true + + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + dev: true + + /@babel/compat-data@7.23.2: + resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.23.3: + resolution: {integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.4 + '@babel/generator': 7.23.4 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) + '@babel/helpers': 7.23.4 + '@babel/parser': 7.23.4 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.4 + '@babel/types': 7.23.4 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/core@7.23.6: + resolution: {integrity: sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) + '@babel/helpers': 7.23.6 + '@babel/parser': 7.23.6 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.6 + '@babel/types': 7.23.6 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.23.4: + resolution: {integrity: sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.4 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + dev: true + + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.2 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.23.4: + resolution: {integrity: sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.4 + '@babel/types': 7.23.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helpers@7.23.6: + resolution: {integrity: sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.6 + '@babel/types': 7.23.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser@7.23.4: + resolution: {integrity: sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.4 + dev: true + + /@babel/parser@7.23.6: + resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.3): + resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.3): + resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/runtime@7.23.4: + resolution: {integrity: sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + dev: true + + /@babel/traverse@7.23.4: + resolution: {integrity: sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.4 + '@babel/generator': 7.23.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.4 + '@babel/types': 7.23.4 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/traverse@7.23.6: + resolution: {integrity: sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.23.4: + resolution: {integrity: sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@babel/types@7.23.6: + resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + /@bnb-chain/greenfield-cosmos-types@0.4.0-alpha.30: + resolution: {integrity: sha512-nYThWPZHfq/bDMEu+Sw9cMMqgTk4NEg+PH9GkvN2OMgpo8QuCDy3Eh4C1g6lJy0BFv+ilethoPmKjSeEwa1m8g==} + dependencies: + long: 4.0.0 + protobufjs: 6.11.4 + + /@bnb-chain/greenfield-js-sdk@1.2.0: + resolution: {integrity: sha512-xYYK+4WXGiqX7MBNqRij2zo/3HI3mMwtuUOQS3qOoWkHG6oWUAKeBPxUNKz6RuPigZYAckAH0XcrJT0kjJIB+g==} + dependencies: + '@bnb-chain/greenfield-cosmos-types': 0.4.0-alpha.30 + '@bnb-chain/greenfield-zk-crypto': 1.0.0 + '@cosmjs/proto-signing': 0.32.2 + '@cosmjs/stargate': 0.32.2 + '@cosmjs/tendermint-rpc': 0.32.2 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/units': 5.7.0 + '@metamask/eth-sig-util': 5.1.0 + cross-fetch: 3.1.8 + dayjs: 1.11.10 + ethereum-cryptography: 2.1.2 + fast-xml-parser: 4.3.2 + lodash.clonedeep: 4.5.0 + lodash.get: 4.4.2 + lodash.mapvalues: 4.6.0 + lodash.set: 4.3.2 + lodash.sortby: 4.7.0 + long: 5.2.3 + reflect-metadata: 0.1.14 + tsyringe: 4.8.0 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - utf-8-validate + + /@bnb-chain/greenfield-zk-crypto@1.0.0: + resolution: {integrity: sha512-QlHNIleujENh02oPidtLFVNMArVpSQDdV9omOUTLjKA1j2/rrd4OKfMLh1gpeVKl53vw50ReGkbm2VlBXTZRbQ==} + + /@bnb-chain/reed-solomon@1.1.3: + resolution: {integrity: sha512-DMLMPCjGPn2Mc6eFQ1boEqiq3iPgn+KuNl+ozY27b7bf+73YU1tHQ8jp+Dxq/wGv0hv8yfJaWXibiphtBY+B4w==} + dependencies: + '@ethersproject/base64': 5.7.0 + ethereum-cryptography: 2.1.2 + + /@changesets/apply-release-plan@7.0.0: + resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} + dependencies: + '@babel/runtime': 7.23.4 + '@changesets/config': 3.0.0 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.5.4 + dev: true + + /@changesets/assemble-release-plan@6.0.0: + resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} + dependencies: + '@babel/runtime': 7.23.4 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.0.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.5.4 + dev: true + + /@changesets/changelog-git@0.2.0: + resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + dependencies: + '@changesets/types': 6.0.0 + dev: true + + /@changesets/cli@2.27.1: + resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} + hasBin: true + dependencies: + '@babel/runtime': 7.23.4 + '@changesets/apply-release-plan': 7.0.0 + '@changesets/assemble-release-plan': 6.0.0 + '@changesets/changelog-git': 0.2.0 + '@changesets/config': 3.0.0 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.0.0 + '@changesets/get-release-plan': 4.0.0 + '@changesets/git': 3.0.0 + '@changesets/logger': 0.1.0 + '@changesets/pre': 2.0.0 + '@changesets/read': 0.6.0 + '@changesets/types': 6.0.0 + '@changesets/write': 0.3.0 + '@manypkg/get-packages': 1.1.3 + '@types/semver': 7.5.6 + ansi-colors: 4.1.3 + chalk: 2.4.2 + ci-info: 3.9.0 + enquirer: 2.4.1 + external-editor: 3.1.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + meow: 6.1.1 + outdent: 0.5.0 + p-limit: 2.3.0 + preferred-pm: 3.1.2 + resolve-from: 5.0.0 + semver: 7.5.4 + spawndamnit: 2.0.0 + term-size: 2.2.1 + tty-table: 4.2.3 + dev: true + + /@changesets/config@3.0.0: + resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.0.0 + '@changesets/logger': 0.1.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.5 + dev: true + + /@changesets/errors@0.2.0: + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + dependencies: + extendable-error: 0.1.7 + dev: true + + /@changesets/get-dependents-graph@2.0.0: + resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} + dependencies: + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + chalk: 2.4.2 + fs-extra: 7.0.1 + semver: 7.5.4 + dev: true + + /@changesets/get-release-plan@4.0.0: + resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} + dependencies: + '@babel/runtime': 7.23.4 + '@changesets/assemble-release-plan': 6.0.0 + '@changesets/config': 3.0.0 + '@changesets/pre': 2.0.0 + '@changesets/read': 0.6.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + dev: true + + /@changesets/get-version-range-type@0.4.0: + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + dev: true + + /@changesets/git@3.0.0: + resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} + dependencies: + '@babel/runtime': 7.23.4 + '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.5 + spawndamnit: 2.0.0 + dev: true + + /@changesets/logger@0.1.0: + resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} + dependencies: + chalk: 2.4.2 + dev: true + + /@changesets/parse@0.4.0: + resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + dependencies: + '@changesets/types': 6.0.0 + js-yaml: 3.14.1 + dev: true + + /@changesets/pre@2.0.0: + resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} + dependencies: + '@babel/runtime': 7.23.4 + '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + dev: true + + /@changesets/read@0.6.0: + resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} + dependencies: + '@babel/runtime': 7.23.4 + '@changesets/git': 3.0.0 + '@changesets/logger': 0.1.0 + '@changesets/parse': 0.4.0 + '@changesets/types': 6.0.0 + chalk: 2.4.2 + fs-extra: 7.0.1 + p-filter: 2.1.0 + dev: true + + /@changesets/types@4.1.0: + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + dev: true + + /@changesets/types@6.0.0: + resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + dev: true + + /@changesets/write@0.3.0: + resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} + dependencies: + '@babel/runtime': 7.23.4 + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + prettier: 2.8.8 + dev: true + + /@coinbase/wallet-sdk@3.7.2: + resolution: {integrity: sha512-lIGvXMsgpsQWci/XOMQIJ2nIZ8JUy/L+bvC0wkRaYarr0YylwpXrJ2gRM3hCXPS477pkyO7N/kSiAoRgEXUdJQ==} + engines: {node: '>= 10.0.0'} + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + '@solana/web3.js': 1.87.6 + bind-decorator: 1.0.11 + bn.js: 5.2.1 + buffer: 6.0.3 + clsx: 1.2.1 + eth-block-tracker: 6.1.0 + eth-json-rpc-filters: 5.1.0 + eth-rpc-errors: 4.0.2 + json-rpc-engine: 6.1.0 + keccak: 3.0.4 + preact: 10.19.2 + qs: 6.11.2 + rxjs: 6.6.7 + sha.js: 2.4.11 + stream-browserify: 3.0.0 + util: 0.12.5 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + /@commitlint/cli@18.4.3: + resolution: {integrity: sha512-zop98yfB3A6NveYAZ3P1Mb6bIXuCeWgnUfVNkH4yhIMQpQfzFwseadazOuSn0OOfTt0lWuFauehpm9GcqM5lww==} + engines: {node: '>=v18'} + hasBin: true + dependencies: + '@commitlint/format': 18.4.3 + '@commitlint/lint': 18.4.3 + '@commitlint/load': 18.4.3 + '@commitlint/read': 18.4.3 + '@commitlint/types': 18.4.3 + execa: 5.1.1 + lodash.isfunction: 3.0.9 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - typescript + dev: true + + /@commitlint/config-conventional@18.4.3: + resolution: {integrity: sha512-729eRRaNta7JZF07qf6SAGSghoDEp9mH7yHU0m7ff0q89W97wDrWCyZ3yoV3mcQJwbhlmVmZPTkPcm7qiAu8WA==} + engines: {node: '>=v18'} + dependencies: + conventional-changelog-conventionalcommits: 7.0.2 + dev: true + + /@commitlint/config-validator@18.4.3: + resolution: {integrity: sha512-FPZZmTJBARPCyef9ohRC9EANiQEKSWIdatx5OlgeHKu878dWwpyeFauVkhzuBRJFcCA4Uvz/FDtlDKs008IHcA==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 18.4.3 + ajv: 8.12.0 + dev: true + + /@commitlint/ensure@18.4.3: + resolution: {integrity: sha512-MI4fwD9TWDVn4plF5+7JUyLLbkOdzIRBmVeNlk4dcGlkrVA+/l5GLcpN66q9LkFsFv6G2X31y89ApA3hqnqIFg==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 18.4.3 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + dev: true + + /@commitlint/execute-rule@18.4.3: + resolution: {integrity: sha512-t7FM4c+BdX9WWZCPrrbV5+0SWLgT3kCq7e7/GhHCreYifg3V8qyvO127HF796vyFql75n4TFF+5v1asOOWkV1Q==} + engines: {node: '>=v18'} + dev: true + + /@commitlint/format@18.4.3: + resolution: {integrity: sha512-8b+ItXYHxAhRAXFfYki5PpbuMMOmXYuzLxib65z2XTqki59YDQJGpJ/wB1kEE5MQDgSTQWtKUrA8n9zS/1uIDQ==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 18.4.3 + chalk: 4.1.2 + dev: true + + /@commitlint/is-ignored@18.4.3: + resolution: {integrity: sha512-ZseOY9UfuAI32h9w342Km4AIaTieeFskm2ZKdrG7r31+c6zGBzuny9KQhwI9puc0J3GkUquEgKJblCl7pMnjwg==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 18.4.3 + semver: 7.5.4 + dev: true + + /@commitlint/lint@18.4.3: + resolution: {integrity: sha512-18u3MRgEXNbnYkMOWoncvq6QB8/90m9TbERKgdPqVvS+zQ/MsuRhdvHYCIXGXZxUb0YI4DV2PC4bPneBV/fYuA==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/is-ignored': 18.4.3 + '@commitlint/parse': 18.4.3 + '@commitlint/rules': 18.4.3 + '@commitlint/types': 18.4.3 + dev: true + + /@commitlint/load@18.4.3: + resolution: {integrity: sha512-v6j2WhvRQJrcJaj5D+EyES2WKTxPpxENmNpNG3Ww8MZGik3jWRXtph0QTzia5ZJyPh2ib5aC/6BIDymkUUM58Q==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/config-validator': 18.4.3 + '@commitlint/execute-rule': 18.4.3 + '@commitlint/resolve-extends': 18.4.3 + '@commitlint/types': 18.4.3 + '@types/node': 18.18.13 + chalk: 4.1.2 + cosmiconfig: 8.3.6 + cosmiconfig-typescript-loader: 5.0.0(@types/node@18.18.13)(cosmiconfig@8.3.6) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + transitivePeerDependencies: + - typescript + dev: true + + /@commitlint/message@18.4.3: + resolution: {integrity: sha512-ddJ7AztWUIoEMAXoewx45lKEYEOeOlBVWjk8hDMUGpprkuvWULpaXczqdjwVtjrKT3JhhN+gMs8pm5G3vB2how==} + engines: {node: '>=v18'} + dev: true + + /@commitlint/parse@18.4.3: + resolution: {integrity: sha512-eoH7CXM9L+/Me96KVcfJ27EIIbA5P9sqw3DqjJhRYuhaULIsPHFs5S5GBDCqT0vKZQDx0DgxhMpW6AQbnKrFtA==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 18.4.3 + conventional-changelog-angular: 7.0.0 + conventional-commits-parser: 5.0.0 + dev: true + + /@commitlint/read@18.4.3: + resolution: {integrity: sha512-H4HGxaYA6OBCimZAtghL+B+SWu8ep4X7BwgmedmqWZRHxRLcX2q0bWBtUm5FsMbluxbOfrJwOs/Z0ah4roP/GQ==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/top-level': 18.4.3 + '@commitlint/types': 18.4.3 + fs-extra: 11.2.0 + git-raw-commits: 2.0.11 + minimist: 1.2.8 + dev: true + + /@commitlint/resolve-extends@18.4.3: + resolution: {integrity: sha512-30sk04LZWf8+SDgJrbJCjM90gTg2LxsD9cykCFeFu+JFHvBFq5ugzp2eO/DJGylAdVaqxej3c7eTSE64hR/lnw==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/config-validator': 18.4.3 + '@commitlint/types': 18.4.3 + import-fresh: 3.3.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/rules@18.4.3: + resolution: {integrity: sha512-8KIeukDf45BiY+Lul1T0imSNXF0sMrlLG6JpLLKolkmYVQ6PxxoNOriwyZ3UTFFpaVbPy0rcITaV7U9JCAfDTA==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/ensure': 18.4.3 + '@commitlint/message': 18.4.3 + '@commitlint/to-lines': 18.4.3 + '@commitlint/types': 18.4.3 + execa: 5.1.1 + dev: true + + /@commitlint/to-lines@18.4.3: + resolution: {integrity: sha512-fy1TAleik4Zfru1RJ8ZU6cOSvgSVhUellxd3WZV1D5RwHZETt1sZdcA4mQN2y3VcIZsUNKkW0Mq8CM9/L9harQ==} + engines: {node: '>=v18'} + dev: true + + /@commitlint/top-level@18.4.3: + resolution: {integrity: sha512-E6fJPBLPFL5R8+XUNSYkj4HekIOuGMyJo3mIx2PkYc3clel+pcWQ7TConqXxNWW4x1ugigiIY2RGot55qUq1hw==} + engines: {node: '>=v18'} + dependencies: + find-up: 5.0.0 + dev: true + + /@commitlint/types@18.4.3: + resolution: {integrity: sha512-cvzx+vtY/I2hVBZHCLrpoh+sA0hfuzHwDc+BAFPimYLjJkpHnghQM+z8W/KyLGkygJh3BtI3xXXq+dKjnSWEmA==} + engines: {node: '>=v18'} + dependencies: + chalk: 4.1.2 + dev: true + + /@confio/ics23@0.6.8: + resolution: {integrity: sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==} + dependencies: + '@noble/hashes': 1.3.2 + protobufjs: 6.11.4 + + /@cosmjs/amino@0.32.2: + resolution: {integrity: sha512-lcK5RCVm4OfdAooxKcF2+NwaDVVpghOq6o/A40c2mHXDUzUoRZ33VAHjVJ9Me6vOFxshrw/XEFn1f4KObntjYA==} + dependencies: + '@cosmjs/crypto': 0.32.2 + '@cosmjs/encoding': 0.32.2 + '@cosmjs/math': 0.32.2 + '@cosmjs/utils': 0.32.2 + + /@cosmjs/crypto@0.32.2: + resolution: {integrity: sha512-RuxrYKzhrPF9g6NmU7VEq++Hn1vZJjqqJpZ9Tmw9lOYOV8BUsv+j/0BE86kmWi7xVJ7EwxiuxYsKuM8IR18CIA==} + dependencies: + '@cosmjs/encoding': 0.32.2 + '@cosmjs/math': 0.32.2 + '@cosmjs/utils': 0.32.2 + '@noble/hashes': 1.3.2 + bn.js: 5.2.1 + elliptic: 6.5.4 + libsodium-wrappers-sumo: 0.7.13 + + /@cosmjs/encoding@0.32.2: + resolution: {integrity: sha512-WX7m1wLpA9V/zH0zRcz4EmgZdAv1F44g4dbXOgNj1eXZw1PIGR12p58OEkLN51Ha3S4DKRtCv5CkhK1KHEvQtg==} + dependencies: + base64-js: 1.5.1 + bech32: 1.1.4 + readonly-date: 1.0.0 + + /@cosmjs/json-rpc@0.32.2: + resolution: {integrity: sha512-lan2lOgmz4yVE/HR8eCOSiII/1OudIulk8836koyIDCsPEpt6eKBuctnAD168vABGArKccLAo7Mr2gy9nrKrOQ==} + dependencies: + '@cosmjs/stream': 0.32.2 + xstream: 11.14.0 + + /@cosmjs/math@0.32.2: + resolution: {integrity: sha512-b8+ruAAY8aKtVKWSft2IvtCVCUH1LigIlf9ALIiY8n9jtM4kMASiaRbQ/27etnSAInV88IaezKK9rQZrtxTjcw==} + dependencies: + bn.js: 5.2.1 + + /@cosmjs/proto-signing@0.32.2: + resolution: {integrity: sha512-UV4WwkE3W3G3s7wwU9rizNcUEz2g0W8jQZS5J6/3fiN0mRPwtPKQ6EinPN9ASqcAJ7/VQH4/9EPOw7d6XQGnqw==} + dependencies: + '@cosmjs/amino': 0.32.2 + '@cosmjs/crypto': 0.32.2 + '@cosmjs/encoding': 0.32.2 + '@cosmjs/math': 0.32.2 + '@cosmjs/utils': 0.32.2 + cosmjs-types: 0.9.0 + + /@cosmjs/socket@0.32.2: + resolution: {integrity: sha512-Qc8jaw4uSBJm09UwPgkqe3g9TBFx4ZR9HkXpwT6Z9I+6kbLerXPR0Gy3NSJFSUgxIfTpO8O1yqoWAyf0Ay17Mw==} + dependencies: + '@cosmjs/stream': 0.32.2 + isomorphic-ws: 4.0.1(ws@7.5.9) + ws: 7.5.9 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + /@cosmjs/stargate@0.32.2: + resolution: {integrity: sha512-AsJa29fT7Jd4xt9Ai+HMqhyj7UQu7fyYKdXj/8+/9PD74xe6lZSYhQPcitUmMLJ1ckKPgXSk5Dd2LbsQT0IhZg==} + dependencies: + '@confio/ics23': 0.6.8 + '@cosmjs/amino': 0.32.2 + '@cosmjs/encoding': 0.32.2 + '@cosmjs/math': 0.32.2 + '@cosmjs/proto-signing': 0.32.2 + '@cosmjs/stream': 0.32.2 + '@cosmjs/tendermint-rpc': 0.32.2 + '@cosmjs/utils': 0.32.2 + cosmjs-types: 0.9.0 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + + /@cosmjs/stream@0.32.2: + resolution: {integrity: sha512-gpCufLfHAD8Zp1ZKge7AHbDf4RA0TZp66wZY6JaQR5bSiEF2Drjtp4mwXZPGejtaUMnaAgff3LrUzPJfKYdQwg==} + dependencies: + xstream: 11.14.0 + + /@cosmjs/tendermint-rpc@0.32.2: + resolution: {integrity: sha512-DXyJHDmcAfCix4H/7/dKR0UMdshP01KxJOXHdHxBCbLIpck94BsWD3B2ZTXwfA6sv98so9wOzhp7qGQa5malxg==} + dependencies: + '@cosmjs/crypto': 0.32.2 + '@cosmjs/encoding': 0.32.2 + '@cosmjs/json-rpc': 0.32.2 + '@cosmjs/math': 0.32.2 + '@cosmjs/socket': 0.32.2 + '@cosmjs/stream': 0.32.2 + '@cosmjs/utils': 0.32.2 + axios: 1.6.3 + readonly-date: 1.0.0 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + + /@cosmjs/utils@0.32.2: + resolution: {integrity: sha512-Gg5t+eR7vPJMAmhkFt6CZrzPd0EKpAslWwk5rFVYZpJsM8JG5KT9XQ99hgNM3Ov6ScNoIWbXkpX27F6A9cXR4Q==} + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@emotion/babel-plugin@11.11.0: + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + dependencies: + '@babel/helper-module-imports': 7.22.15 + '@babel/runtime': 7.23.4 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.2 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + dev: false + + /@emotion/cache@11.11.0: + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + dev: false + + /@emotion/hash@0.9.1: + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + + /@emotion/is-prop-valid@1.2.1: + resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} + dependencies: + '@emotion/memoize': 0.8.1 + dev: false + + /@emotion/memoize@0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + dev: false + + /@emotion/react@11.11.1(@types/react@18.2.39)(react@18.2.0): + resolution: {integrity: sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.4 + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.2 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + '@types/react': 18.2.39 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + dev: false + + /@emotion/serialize@1.1.2: + resolution: {integrity: sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==} + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.2 + dev: false + + /@emotion/sheet@1.2.2: + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + dev: false + + /@emotion/styled@11.11.0(@emotion/react@11.11.1)(@types/react@18.2.39)(react@18.2.0): + resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.4 + '@emotion/babel-plugin': 11.11.0 + '@emotion/is-prop-valid': 1.2.1 + '@emotion/react': 11.11.1(@types/react@18.2.39)(react@18.2.0) + '@emotion/serialize': 1.1.2 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + '@types/react': 18.2.39 + react: 18.2.0 + dev: false + + /@emotion/unitless@0.8.1: + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + dev: false + + /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0): + resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + dev: false + + /@emotion/utils@1.2.1: + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + dev: false + + /@emotion/weak-memoize@0.3.1: + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + dev: false + + /@esbuild/android-arm64@0.17.6: + resolution: {integrity: sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.6: + resolution: {integrity: sha512-bSC9YVUjADDy1gae8RrioINU6e1lCkg3VGVwm0QQ2E1CWcC4gnMce9+B6RpxuSsrsXsk1yojn7sp1fnG8erE2g==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.6: + resolution: {integrity: sha512-MVcYcgSO7pfu/x34uX9u2QIZHmXAB7dEiLQC5bBl5Ryqtpj9lT2sg3gNDEsrPEmimSJW2FXIaxqSQ501YLDsZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.6: + resolution: {integrity: sha512-bsDRvlbKMQMt6Wl08nHtFz++yoZHsyTOxnjfB2Q95gato+Yi4WnRl13oC2/PJJA9yLCoRv9gqT/EYX0/zDsyMA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.6: + resolution: {integrity: sha512-xh2A5oPrYRfMFz74QXIQTQo8uA+hYzGWJFoeTE8EvoZGHb+idyV4ATaukaUvnnxJiauhs/fPx3vYhU4wiGfosg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.6: + resolution: {integrity: sha512-EnUwjRc1inT4ccZh4pB3v1cIhohE2S4YXlt1OvI7sw/+pD+dIE4smwekZlEPIwY6PhU6oDWwITrQQm5S2/iZgg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.6: + resolution: {integrity: sha512-Uh3HLWGzH6FwpviUcLMKPCbZUAFzv67Wj5MTwK6jn89b576SR2IbEp+tqUHTr8DIl0iDmBAf51MVaP7pw6PY5Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.6: + resolution: {integrity: sha512-bUR58IFOMJX523aDVozswnlp5yry7+0cRLCXDsxnUeQYJik1DukMY+apBsLOZJblpH+K7ox7YrKrHmJoWqVR9w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.6: + resolution: {integrity: sha512-7YdGiurNt7lqO0Bf/U9/arrPWPqdPqcV6JCZda4LZgEn+PTQ5SMEI4MGR52Bfn3+d6bNEGcWFzlIxiQdS48YUw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.6: + resolution: {integrity: sha512-ujp8uoQCM9FRcbDfkqECoARsLnLfCUhKARTP56TFPog8ie9JG83D5GVKjQ6yVrEVdMie1djH86fm98eY3quQkQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.6: + resolution: {integrity: sha512-y2NX1+X/Nt+izj9bLoiaYB9YXT/LoaQFYvCkVD77G/4F+/yuVXYCWz4SE9yr5CBMbOxOfBcy/xFL4LlOeNlzYQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.6: + resolution: {integrity: sha512-09AXKB1HDOzXD+j3FdXCiL/MWmZP0Ex9eR8DLMBVcHorrWJxWmY8Nms2Nm41iRM64WVx7bA/JVHMv081iP2kUA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.6: + resolution: {integrity: sha512-AmLhMzkM8JuqTIOhxnX4ubh0XWJIznEynRnZAVdA2mMKE6FAfwT2TWKTwdqMG+qEaeyDPtfNoZRpJbD4ZBv0Tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.6: + resolution: {integrity: sha512-Y4Ri62PfavhLQhFbqucysHOmRamlTVK10zPWlqjNbj2XMea+BOs4w6ASKwQwAiqf9ZqcY9Ab7NOU4wIgpxwoSQ==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.6: + resolution: {integrity: sha512-SPUiz4fDbnNEm3JSdUW8pBJ/vkop3M1YwZAVwvdwlFLoJwKEZ9L98l3tzeyMzq27CyepDQ3Qgoba44StgbiN5Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.6: + resolution: {integrity: sha512-a3yHLmOodHrzuNgdpB7peFGPx1iJ2x6m+uDvhP2CKdr2CwOaqEFMeSqYAHU7hG+RjCq8r2NFujcd/YsEsFgTGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.6: + resolution: {integrity: sha512-EanJqcU/4uZIBreTrnbnre2DXgXSa+Gjap7ifRfllpmyAU7YMvaXmljdArptTHmjrkkKm9BK6GH5D5Yo+p6y5A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.6: + resolution: {integrity: sha512-xaxeSunhQRsTNGFanoOkkLtnmMn5QbA0qBhNet/XLVsc+OVkpIWPHcr3zTW2gxVU5YOHFbIHR9ODuaUdNza2Vw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.6: + resolution: {integrity: sha512-gnMnMPg5pfMkZvhHee21KbKdc6W3GR8/JuE0Da1kjwpK6oiFU3nqfHuVPgUX2rsOx9N2SadSQTIYV1CIjYG+xw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.6: + resolution: {integrity: sha512-G95n7vP1UnGJPsVdKXllAJPtqjMvFYbN20e8RK8LVLhlTiSOH1sd7+Gt7rm70xiG+I5tM58nYgwWrLs6I1jHqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.6: + resolution: {integrity: sha512-96yEFzLhq5bv9jJo5JhTs1gI+1cKQ83cUpyxHuGqXVwQtY5Eq54ZEsKs8veKtiKwlrNimtckHEkj4mRh4pPjsg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.6: + resolution: {integrity: sha512-n6d8MOyUrNp6G4VSpRcgjs5xj4A91svJSaiwLIDWVWEsZtpN5FA9NlBbZHDmAJc2e8e6SF4tkBD3HAvPF+7igA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.54.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.3: + resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.23.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.54.0: + resolution: {integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@ethereumjs/rlp@4.0.1: + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + + /@ethereumjs/util@8.1.0: + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.1.2 + micro-ftch: 0.3.1 + + /@ethersproject/abstract-provider@5.7.0: + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + dev: false + + /@ethersproject/abstract-signer@5.7.0: + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + dev: false + + /@ethersproject/address@5.7.0: + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 + dev: false + + /@ethersproject/base64@5.7.0: + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + dependencies: + '@ethersproject/bytes': 5.7.0 + + /@ethersproject/basex@5.7.0: + resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/properties': 5.7.0 + dev: false + + /@ethersproject/bignumber@5.7.0: + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + bn.js: 5.2.1 + + /@ethersproject/bytes@5.7.0: + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + dependencies: + '@ethersproject/logger': 5.7.0 + + /@ethersproject/constants@5.7.0: + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + + /@ethersproject/hash@5.7.0: + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@ethersproject/hdnode@5.7.0: + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + dev: false + + /@ethersproject/json-wallets@5.7.0: + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + dev: false + + /@ethersproject/keccak256@5.7.0: + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + dependencies: + '@ethersproject/bytes': 5.7.0 + js-sha3: 0.8.0 + dev: false + + /@ethersproject/logger@5.7.0: + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + + /@ethersproject/networks@5.7.1: + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/pbkdf2@5.7.0: + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/sha2': 5.7.0 + dev: false + + /@ethersproject/properties@5.7.0: + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + dependencies: + '@ethersproject/logger': 5.7.0 + + /@ethersproject/random@5.7.0: + resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/rlp@5.7.0: + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/sha2@5.7.0: + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + hash.js: 1.1.7 + dev: false + + /@ethersproject/signing-key@5.7.0: + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + bn.js: 5.2.1 + elliptic: 6.5.4 + hash.js: 1.1.7 + + /@ethersproject/strings@5.7.0: + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + + /@ethersproject/transactions@5.7.0: + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + dev: false + + /@ethersproject/units@5.7.0: + resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + + /@ethersproject/wallet@5.7.0: + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + dev: false + + /@ethersproject/web@5.7.1: + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + dependencies: + '@ethersproject/base64': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@ethersproject/wordlists@5.7.0: + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.20 + dev: true + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@ledgerhq/connect-kit-loader@1.1.2: + resolution: {integrity: sha512-mscwGroSJQrCTjtNGBu+18FQbZYA4+q6Tyx6K7CXHl6AwgZKbWfZYdgP2F+fyZcRUdGRsMX8QtvU61VcGGtO1A==} + + /@lit-labs/ssr-dom-shim@1.1.2: + resolution: {integrity: sha512-jnOD+/+dSrfTWYfSXBXlo5l5f0q1UuJo3tkbMDCYA2lKUYq79jaxqtGEvnRoh049nt1vdo1+45RinipU6FGY2g==} + + /@lit/reactive-element@1.6.3: + resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} + dependencies: + '@lit-labs/ssr-dom-shim': 1.1.2 + + /@manypkg/find-root@1.1.0: + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + dependencies: + '@babel/runtime': 7.23.4 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + dev: true + + /@manypkg/get-packages@1.1.3: + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + dependencies: + '@babel/runtime': 7.23.4 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + dev: true + + /@mdx-js/mdx@2.1.5: + resolution: {integrity: sha512-zEG0lt+Bl/r5U6e0TOS7qDbsXICtemfAPquxWFsMbdzrvlWaqMGemLl+sjVpqlyaaiCiGVQBSGdCk0t1qXjkQg==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/mdx': 2.0.10 + estree-util-build-jsx: 2.2.2 + estree-util-is-identifier-name: 2.1.0 + estree-util-to-js: 1.2.0 + estree-walker: 3.0.3 + hast-util-to-estree: 2.3.3 + markdown-extensions: 1.1.1 + periscopic: 3.1.0 + remark-mdx: 2.3.0 + remark-parse: 10.0.2 + remark-rehype: 10.1.0 + unified: 10.1.2 + unist-util-position-from-estree: 1.1.2 + unist-util-stringify-position: 3.0.3 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + + /@mdx-js/react@2.2.1(react@18.2.0): + resolution: {integrity: sha512-YdXcMcEnqZhzql98RNrqYo9cEhTTesBiCclEtoiQUbJwx87q9453GTapYU6kJ8ZZ2ek1Vp25SiAXEFy5O/eAPw==} + peerDependencies: + react: '>=16' + dependencies: + '@types/mdx': 2.0.10 + '@types/react': 18.2.39 + react: 18.2.0 + dev: false + + /@mdx-js/rollup@2.2.1: + resolution: {integrity: sha512-wpGeK9iO7gPEIyC/ZTiggLY/MkEWDj5IWSsjlpkefgjb5RbmUukXU6/D2rHA+VAopxigS3NlaIL2ctpYBi4fmg==} + peerDependencies: + rollup: '>=2' + dependencies: + '@mdx-js/mdx': 2.1.5 + '@rollup/pluginutils': 5.1.0 + source-map: 0.7.4 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@metamask/eth-sig-util@5.1.0: + resolution: {integrity: sha512-mlgziIHYlA9pi/XZerChqg4NocdOgBPB9NmxgXWQO2U2hH8RGOJQrz6j/AIKkYxgCMIE2PY000+joOwXfzeTDQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@ethereumjs/util': 8.1.0 + bn.js: 4.12.0 + ethereum-cryptography: 2.1.2 + ethjs-util: 0.1.6 + tweetnacl: 1.0.3 + tweetnacl-util: 0.15.1 + + /@metamask/safe-event-emitter@2.0.0: + resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==} + + /@metamask/utils@3.6.0: + resolution: {integrity: sha512-9cIRrfkWvHblSiNDVXsjivqa9Ak0RYo/1H6tqTqTbAx+oBK2Sva0lWDHxGchOqA7bySGUJKAWSNJvH6gdHZ0gQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.4 + semver: 7.5.4 + superstruct: 1.0.3 + transitivePeerDependencies: + - supports-color + + /@microsoft/api-extractor-model@7.28.2: + resolution: {integrity: sha512-vkojrM2fo3q4n4oPh4uUZdjJ2DxQ2+RnDQL/xhTWSRUNPF6P4QyrvY357HBxbnltKcYu+nNNolVqc6TIGQ73Ig==} + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.61.0 + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/api-extractor@7.38.3: + resolution: {integrity: sha512-xt9iYyC5f39281j77JTA9C3ISJpW1XWkCcnw+2vM78CPnro6KhPfwQdPDfwS5JCPNuq0grm8cMdPUOPvrchDWw==} + hasBin: true + dependencies: + '@microsoft/api-extractor-model': 7.28.2 + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.61.0 + '@rushstack/rig-package': 0.5.1 + '@rushstack/ts-command-line': 4.17.1 + colors: 1.2.5 + lodash: 4.17.21 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.0.4 + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/tsdoc-config@0.16.2: + resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + dependencies: + '@microsoft/tsdoc': 0.14.2 + ajv: 6.12.6 + jju: 1.4.0 + resolve: 1.19.0 + dev: true + + /@microsoft/tsdoc@0.14.2: + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + dev: true + + /@motionone/animation@10.16.3: + resolution: {integrity: sha512-QUGWpLbMFLhyqKlngjZhjtxM8IqiJQjLK0DF+XOF6od9nhSvlaeEpOY/UMCRVcZn/9Tr2rZO22EkuCIjYdI74g==} + dependencies: + '@motionone/easing': 10.16.3 + '@motionone/types': 10.16.3 + '@motionone/utils': 10.16.3 + tslib: 2.6.2 + + /@motionone/dom@10.16.4: + resolution: {integrity: sha512-HPHlVo/030qpRj9R8fgY50KTN4Ko30moWRTA3L3imrsRBmob93cTYmodln49HYFbQm01lFF7X523OkKY0DX6UA==} + dependencies: + '@motionone/animation': 10.16.3 + '@motionone/generators': 10.16.4 + '@motionone/types': 10.16.3 + '@motionone/utils': 10.16.3 + hey-listen: 1.0.8 + tslib: 2.6.2 + + /@motionone/easing@10.16.3: + resolution: {integrity: sha512-HWTMZbTmZojzwEuKT/xCdvoMPXjYSyQvuVM6jmM0yoGU6BWzsmYMeB4bn38UFf618fJCNtP9XeC/zxtKWfbr0w==} + dependencies: + '@motionone/utils': 10.16.3 + tslib: 2.6.2 + + /@motionone/generators@10.16.4: + resolution: {integrity: sha512-geFZ3w0Rm0ZXXpctWsSf3REGywmLLujEjxPYpBR0j+ymYwof0xbV6S5kGqqsDKgyWKVWpUInqQYvQfL6fRbXeg==} + dependencies: + '@motionone/types': 10.16.3 + '@motionone/utils': 10.16.3 + tslib: 2.6.2 + + /@motionone/svelte@10.16.4: + resolution: {integrity: sha512-zRVqk20lD1xqe+yEDZhMYgftsuHc25+9JSo+r0a0OWUJFocjSV9D/+UGhX4xgJsuwB9acPzXLr20w40VnY2PQA==} + dependencies: + '@motionone/dom': 10.16.4 + tslib: 2.6.2 + + /@motionone/types@10.16.3: + resolution: {integrity: sha512-W4jkEGFifDq73DlaZs3HUfamV2t1wM35zN/zX7Q79LfZ2sc6C0R1baUHZmqc/K5F3vSw3PavgQ6HyHLd/MXcWg==} + + /@motionone/utils@10.16.3: + resolution: {integrity: sha512-WNWDksJIxQkaI9p9Z9z0+K27xdqISGNFy1SsWVGaiedTHq0iaT6iZujby8fT/ZnZxj1EOaxJtSfUPCFNU5CRoA==} + dependencies: + '@motionone/types': 10.16.3 + hey-listen: 1.0.8 + tslib: 2.6.2 + + /@motionone/vue@10.16.4: + resolution: {integrity: sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==} + dependencies: + '@motionone/dom': 10.16.4 + tslib: 2.6.2 + + /@next/env@13.5.6: + resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} + dev: false + + /@next/swc-darwin-arm64@13.5.6: + resolution: {integrity: sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-x64@13.5.6: + resolution: {integrity: sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-gnu@13.5.6: + resolution: {integrity: sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-musl@13.5.6: + resolution: {integrity: sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-gnu@13.5.6: + resolution: {integrity: sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-musl@13.5.6: + resolution: {integrity: sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-arm64-msvc@13.5.6: + resolution: {integrity: sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-ia32-msvc@13.5.6: + resolution: {integrity: sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-x64-msvc@13.5.6: + resolution: {integrity: sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@noble/curves@1.1.0: + resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} + dependencies: + '@noble/hashes': 1.3.1 + + /@noble/curves@1.2.0: + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + dependencies: + '@noble/hashes': 1.3.2 + + /@noble/hashes@1.3.1: + resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} + engines: {node: '>= 16'} + + /@noble/hashes@1.3.2: + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@popperjs/core@2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + dev: false + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + /@rainbow-me/rainbowkit@1.3.3(@types/react@18.2.39)(react-dom@18.2.0)(react@18.2.0)(viem@1.19.9)(wagmi@1.4.7): + resolution: {integrity: sha512-IsUlBCy4SZfo6zFEZgPvGr1MLe/rK4sZzoBtYHRPjRqDHTXrYqDsp3ThTIZWh2HSIq0jU5gMA/94mFnT5kwMLA==} + engines: {node: '>=12.4'} + peerDependencies: + react: '>=17' + react-dom: '>=17' + viem: ~0.3.19 || ^1.0.0 + wagmi: ~1.0.1 || ~1.1.0 || ~1.2.0 || ~1.3.0 || ~1.4.0 + dependencies: + '@vanilla-extract/css': 1.14.0 + '@vanilla-extract/dynamic': 2.1.0 + '@vanilla-extract/sprinkles': 1.6.1(@vanilla-extract/css@1.14.0) + clsx: 2.1.0 + i18n-js: 4.3.2 + qrcode: 1.5.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.7(@types/react@18.2.39)(react@18.2.0) + ua-parser-js: 1.0.37 + viem: 1.19.9(typescript@5.3.2) + wagmi: 1.4.7(@types/react@18.2.39)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2)(viem@1.19.9) + transitivePeerDependencies: + - '@types/react' + dev: false + + /@remix-run/router@1.2.1: + resolution: {integrity: sha512-XiY0IsyHR+DXYS5vBxpoBe/8veTeoRpMHP+vDosLZxL5bnpetzI0igkxkLZS235ldLzyfkxF+2divEwWHP3vMQ==} + engines: {node: '>=14'} + dev: false + + /@rollup/plugin-inject@5.0.5: + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.1.0 + estree-walker: 2.0.2 + magic-string: 0.30.5 + dev: true + + /@rollup/plugin-node-resolve@15.2.3: + resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.1.0 + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.8 + dev: true + + /@rollup/pluginutils@5.1.0: + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@rushstack/node-core-library@3.61.0: + resolution: {integrity: sha512-tdOjdErme+/YOu4gPed3sFS72GhtWCgNV9oDsHDnoLY5oDfwjKUc9Z+JOZZ37uAxcm/OCahDHfuu2ugqrfWAVQ==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + colors: 1.2.5 + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + z-schema: 5.0.5 + dev: true + + /@rushstack/rig-package@0.5.1: + resolution: {integrity: sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==} + dependencies: + resolve: 1.22.8 + strip-json-comments: 3.1.1 + dev: true + + /@rushstack/ts-command-line@4.17.1: + resolution: {integrity: sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==} + dependencies: + '@types/argparse': 1.0.38 + argparse: 1.0.10 + colors: 1.2.5 + string-argv: 0.3.2 + dev: true + + /@safe-global/safe-apps-provider@0.17.1(typescript@5.3.2): + resolution: {integrity: sha512-lYfRqrbbK1aKU1/UGkYWc/X7PgySYcumXKc5FB2uuwAs2Ghj8uETuW5BrwPqyjBknRxutFbTv+gth/JzjxAhdQ==} + dependencies: + '@safe-global/safe-apps-sdk': 8.0.0(typescript@5.3.2) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + /@safe-global/safe-apps-sdk@8.0.0(typescript@5.3.2): + resolution: {integrity: sha512-gYw0ki/EAuV1oSyMxpqandHjnthZjYYy+YWpTAzf8BqfXM3ItcZLpjxfg+3+mXW8HIO+3jw6T9iiqEXsqHaMMw==} + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.13.2 + viem: 1.19.9(typescript@5.3.2) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + /@safe-global/safe-apps-sdk@8.1.0(typescript@5.3.2): + resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.13.2 + viem: 1.19.9(typescript@5.3.2) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + /@safe-global/safe-gateway-typescript-sdk@3.13.2: + resolution: {integrity: sha512-kGlJecJHBzGrGTq/yhLANh56t+Zur6Ubpt+/w03ARX1poDb4TM8vKU3iV8tuYpk359PPWp+Qvjnqb9oW2YQcYw==} + engines: {node: '>=16'} + + /@scure/base@1.1.3: + resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} + + /@scure/bip32@1.3.1: + resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} + dependencies: + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.3 + + /@scure/bip32@1.3.2: + resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + dependencies: + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.3 + + /@scure/bip39@1.2.1: + resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + dependencies: + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.3 + + /@solana/buffer-layout@4.0.1: + resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} + engines: {node: '>=5.10'} + dependencies: + buffer: 6.0.3 + + /@solana/web3.js@1.87.6: + resolution: {integrity: sha512-LkqsEBgTZztFiccZZXnawWa8qNCATEqE97/d0vIwjTclmVlc8pBpD1DmjfVHtZ1HS5fZorFlVhXfpwnCNDZfyg==} + dependencies: + '@babel/runtime': 7.23.4 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@solana/buffer-layout': 4.0.1 + agentkeepalive: 4.5.0 + bigint-buffer: 1.1.5 + bn.js: 5.2.1 + borsh: 0.7.0 + bs58: 4.0.1 + buffer: 6.0.3 + fast-stable-stringify: 1.0.0 + jayson: 4.1.0 + node-fetch: 2.7.0 + rpc-websockets: 7.8.0 + superstruct: 0.14.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + /@stablelib/aead@1.0.1: + resolution: {integrity: sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==} + + /@stablelib/binary@1.0.1: + resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} + dependencies: + '@stablelib/int': 1.0.1 + + /@stablelib/bytes@1.0.1: + resolution: {integrity: sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==} + + /@stablelib/chacha20poly1305@1.0.1: + resolution: {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 + + /@stablelib/chacha@1.0.1: + resolution: {integrity: sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==} + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/wipe': 1.0.1 + + /@stablelib/constant-time@1.0.1: + resolution: {integrity: sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==} + + /@stablelib/ed25519@1.0.3: + resolution: {integrity: sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==} + dependencies: + '@stablelib/random': 1.0.2 + '@stablelib/sha512': 1.0.1 + '@stablelib/wipe': 1.0.1 + + /@stablelib/hash@1.0.1: + resolution: {integrity: sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==} + + /@stablelib/hkdf@1.0.1: + resolution: {integrity: sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g==} + dependencies: + '@stablelib/hash': 1.0.1 + '@stablelib/hmac': 1.0.1 + '@stablelib/wipe': 1.0.1 + + /@stablelib/hmac@1.0.1: + resolution: {integrity: sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==} + dependencies: + '@stablelib/constant-time': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + + /@stablelib/int@1.0.1: + resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} + + /@stablelib/keyagreement@1.0.1: + resolution: {integrity: sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==} + dependencies: + '@stablelib/bytes': 1.0.1 + + /@stablelib/poly1305@1.0.1: + resolution: {integrity: sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==} + dependencies: + '@stablelib/constant-time': 1.0.1 + '@stablelib/wipe': 1.0.1 + + /@stablelib/random@1.0.2: + resolution: {integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==} + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/wipe': 1.0.1 + + /@stablelib/sha256@1.0.1: + resolution: {integrity: sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==} + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + + /@stablelib/sha512@1.0.1: + resolution: {integrity: sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==} + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + + /@stablelib/wipe@1.0.1: + resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} + + /@stablelib/x25519@1.0.3: + resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} + dependencies: + '@stablelib/keyagreement': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/wipe': 1.0.1 + + /@swc/helpers@0.5.2: + resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} + dependencies: + tslib: 2.6.2 + dev: false + + /@tanstack/query-core@4.36.1: + resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} + + /@tanstack/query-persist-client-core@4.36.1: + resolution: {integrity: sha512-eocgCeI7D7TRv1IUUBMfVwOI0wdSmMkBIbkKhqEdTrnUHUQEeOaYac8oeZk2cumAWJdycu6P/wB+WqGynTnzXg==} + dependencies: + '@tanstack/query-core': 4.36.1 + + /@tanstack/query-sync-storage-persister@4.36.1: + resolution: {integrity: sha512-yMEt5hWe2+1eclf1agMtXHnPIkxEida0lYWkfdhR8U6KXk/lO4Vca6piJmhKI85t0NHlx3l/z6zX+t/Fn5O9NA==} + dependencies: + '@tanstack/query-persist-client-core': 4.36.1 + + /@tanstack/react-query-persist-client@4.36.1(@tanstack/react-query@4.36.1): + resolution: {integrity: sha512-32I5b9aAu4NCiXZ7Te/KEQLfHbYeTNriVPrKYcvEThnZ9tlW01vLcSoxpUIsMYRsembvJUUAkzYBAiZHLOd6pQ==} + peerDependencies: + '@tanstack/react-query': ^4.36.1 + dependencies: + '@tanstack/query-persist-client-core': 4.36.1 + '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react@18.2.0) + + /@tanstack/react-query@4.36.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@tanstack/query-core': 4.36.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-sync-external-store: 1.2.0(react@18.2.0) + + /@totejs/icons@2.18.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vlHs2MR+DDMAeJdvwnyigtBN4fl+Y3WY66FmjU9q/G2WfnYeJqgSXtycy4tu+tol5i2SiWQ8EBg7ecCxF2jvQQ==} + peerDependencies: + '@emotion/react': '>=11' + '@emotion/styled': '>=11' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@emotion/react': 11.11.1(@types/react@18.2.39)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.39)(react@18.2.0) + '@totejs/styled-system': 2.14.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@totejs/icons@2.19.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-aK/iWk1yvVgPnekxNrb2wd+37VPQmFO+p9+Oqof3MsBvAd+mKMXlIwuQguoUMq9FjF+vdxk+2v3ySzuqebB4BQ==} + peerDependencies: + '@emotion/react': '>=11' + '@emotion/styled': '>=11' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@emotion/react': 11.11.1(@types/react@18.2.39)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.39)(react@18.2.0) + '@totejs/styled-system': 2.14.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@totejs/styled-system@2.14.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Tzs5hs+nXhA20Pp6arQPuAfW9vZ5bo5ISaSCcuOMkg5Or82eeWIicoVDGHNzyOeN+b9AumREzwwo+8sz/jETZA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@totejs/uikit@2.54.2(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-jUlIoSUewWCKfzewjRFKTr4bHve8Ro52kP4xRUzJUtuavGZSWXKOy0OaRWVUjjkiZ31ZDLZLzP7ZJDhpslocug==} + peerDependencies: + '@emotion/react': '>=11' + '@emotion/styled': '>=11' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@emotion/react': 11.11.1(@types/react@18.2.39)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.39)(react@18.2.0) + '@popperjs/core': 2.11.8 + '@totejs/icons': 2.18.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) + '@totejs/styled-system': 2.14.0(react-dom@18.2.0)(react@18.2.0) + '@xobotyi/scrollbar-width': 1.9.5 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-fast-compare: 3.2.2 + dev: false + + /@totejs/walletkit@1.0.8(react-dom@18.2.0)(react@18.2.0)(viem@1.19.9)(wagmi@1.4.7): + resolution: {integrity: sha512-mBxH4jQBHMyhq+MykvdWaoXfbOi0rUJQpURu/qyZYyhUHKhldN7rYo0C2acjcWwi9h4yMeIJs49b9wvfcd7a/A==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + viem: ^1.0.0 + wagmi: ^1.0.0 + dependencies: + qrcode: 1.5.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + viem: 1.19.9(typescript@5.3.2) + wagmi: 1.4.7(@types/react@18.2.39)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2)(viem@1.19.9) + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: true + + /@types/acorn@4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + dependencies: + '@types/estree': 1.0.5 + + /@types/argparse@1.0.38: + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + dev: true + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + '@types/babel__generator': 7.6.7 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.4 + dev: true + + /@types/babel__generator@7.6.7: + resolution: {integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + dev: true + + /@types/babel__traverse@7.20.4: + resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@types/buble@0.20.5: + resolution: {integrity: sha512-CNpql2WPrZloamMweLkyM42nPsUVa10NDurkhTB5+tGu8SstDd568dothJi7tFSAsbqJK0rSb83W9ZwGt8My/A==} + dependencies: + magic-string: 0.25.9 + dev: false + + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + dependencies: + '@types/node': 20.10.0 + + /@types/debug@4.1.12: + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + dependencies: + '@types/ms': 0.7.34 + + /@types/estree-jsx@1.0.3: + resolution: {integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==} + dependencies: + '@types/estree': 1.0.5 + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + /@types/hast@2.3.8: + resolution: {integrity: sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==} + dependencies: + '@types/unist': 2.0.10 + + /@types/js-cookie@2.2.7: + resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} + dev: true + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true + + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + + /@types/mdast@3.0.15: + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + dependencies: + '@types/unist': 2.0.10 + + /@types/mdx@2.0.10: + resolution: {integrity: sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg==} + + /@types/minimist@1.2.5: + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + dev: true + + /@types/ms@0.7.34: + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + /@types/node@12.20.55: + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + /@types/node@18.18.13: + resolution: {integrity: sha512-vXYZGRrSCreZmq1rEjMRLXJhiy8MrIeVasx+PCVlP414N7CJLHnMf+juVvjdprHyH+XRy3zKZLHeNueOpJCn0g==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/node@18.6.5: + resolution: {integrity: sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==} + dev: true + + /@types/node@20.10.0: + resolution: {integrity: sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==} + dependencies: + undici-types: 5.26.5 + + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + dev: true + + /@types/parse-json@4.0.2: + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + dev: false + + /@types/prop-types@15.7.11: + resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + + /@types/qrcode@1.5.5: + resolution: {integrity: sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==} + dependencies: + '@types/node': 20.10.0 + dev: true + + /@types/react-dom@18.2.17: + resolution: {integrity: sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==} + dependencies: + '@types/react': 18.2.39 + dev: true + + /@types/react@18.2.39: + resolution: {integrity: sha512-Oiw+ppED6IremMInLV4HXGbfbG6GyziY3kqAwJYOR0PNbkYDmLWQA3a95EhdSmamsvbkJN96ZNN+YD+fGjzSBA==} + dependencies: + '@types/prop-types': 15.7.11 + '@types/scheduler': 0.16.8 + csstype: 3.1.2 + + /@types/resolve@1.20.2: + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + dev: true + + /@types/scheduler@0.16.8: + resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + + /@types/semver@7.5.6: + resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + dev: true + + /@types/trusted-types@2.0.6: + resolution: {integrity: sha512-HYtNooPvUY9WAVRBr4u+4Qa9fYD1ze2IUlAD3HoA6oehn1taGwBx3Oa52U4mTslTS+GAExKpaFu39Y5xUEwfjg==} + + /@types/unist@2.0.10: + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + + /@types/ws@7.4.7: + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + dependencies: + '@types/node': 20.10.0 + + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.54.0): + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 5.62.0(eslint@8.54.0) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.54.0) + '@typescript-eslint/utils': 5.62.0(eslint@8.54.0) + debug: 4.3.4 + eslint: 8.54.0 + graphemer: 1.4.0 + ignore: 5.3.0 + natural-compare-lite: 1.4.0 + semver: 7.5.4 + tsutils: 3.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@5.62.0(eslint@8.54.0): + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: 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 + eslint: 8.54.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: true + + /@typescript-eslint/type-utils@5.62.0(eslint@8.54.0): + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0 + '@typescript-eslint/utils': 5.62.0(eslint@8.54.0) + debug: 4.3.4 + eslint: 8.54.0 + tsutils: 3.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree@5.62.0: + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.62.0(eslint@8.54.0): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.6 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0 + eslint: 8.54.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /@vanilla-extract/babel-plugin-debug-ids@1.0.3: + resolution: {integrity: sha512-vm4jYu1xhSa6ofQ9AhIpR3DkAp4c+eoR1Rpm8/TQI4DmWbmGbOjYRcqV0aWsfaIlNhN4kFuxFMKBNN9oG6iRzA==} + dependencies: + '@babel/core': 7.23.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@vanilla-extract/css@1.14.0: + resolution: {integrity: sha512-rYfm7JciWZ8PFzBM/HDiE2GLnKI3xJ6/vdmVJ5BSgcCZ5CxRlM9Cjqclni9lGzF3eMOijnUhCd/KV8TOzyzbMA==} + dependencies: + '@emotion/hash': 0.9.1 + '@vanilla-extract/private': 1.0.3 + chalk: 4.1.2 + css-what: 6.1.0 + cssesc: 3.0.0 + csstype: 3.1.2 + deep-object-diff: 1.1.9 + deepmerge: 4.3.1 + media-query-parser: 2.0.2 + modern-ahocorasick: 1.0.1 + outdent: 0.8.0 + + /@vanilla-extract/dynamic@2.1.0: + resolution: {integrity: sha512-8zl0IgBYRtgD1h+56Zu13wHTiMTJSVEa4F7RWX9vTB/5Xe2KtjoiqApy/szHPVFA56c+ex6A4GpCQjT1bKXbYw==} + dependencies: + '@vanilla-extract/private': 1.0.3 + dev: false + + /@vanilla-extract/integration@6.2.4: + resolution: {integrity: sha512-+AfymNMVq9sEUe0OJpdCokmPZg4Zi6CqKaW/PnUOfDwEn53ighHOMOBl5hAgxYR8Kiz9NG43Bn00mkjWlFi+ng==} + dependencies: + '@babel/core': 7.23.6 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.6) + '@vanilla-extract/babel-plugin-debug-ids': 1.0.3 + '@vanilla-extract/css': 1.14.0 + esbuild: 0.17.6 + eval: 0.1.8 + find-up: 5.0.0 + javascript-stringify: 2.1.0 + lodash: 4.17.21 + mlly: 1.4.2 + outdent: 0.8.0 + vite: 4.5.0 + vite-node: 0.28.5 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /@vanilla-extract/private@1.0.3: + resolution: {integrity: sha512-17kVyLq3ePTKOkveHxXuIJZtGYs+cSoev7BlP+Lf4916qfDhk/HBjvlYDe8egrea7LNPHKwSZJK/bzZC+Q6AwQ==} + + /@vanilla-extract/sprinkles@1.6.1(@vanilla-extract/css@1.14.0): + resolution: {integrity: sha512-N/RGKwGAAidBupZ436RpuweRQHEFGU+mvAqBo8PRMAjJEmHoPDttV8RObaMLrJHWLqvX+XUMinHUnD0hFRQISw==} + peerDependencies: + '@vanilla-extract/css': ^1.0.0 + dependencies: + '@vanilla-extract/css': 1.14.0 + dev: false + + /@vanilla-extract/vite-plugin@3.9.2(vite@4.5.0): + resolution: {integrity: sha512-WYgWiEs+nw+lNazyW0Ixp0MMgtNgPL+8fFKrol1V5XoNIzRrYPGfuLhRI7PwheSWQVGF7OOer0kUWQcLey1vOQ==} + peerDependencies: + vite: ^2.2.3 || ^3.0.0 || ^4.0.3 || ^5.0.0 + dependencies: + '@vanilla-extract/integration': 6.2.4 + outdent: 0.8.0 + postcss: 8.4.31 + postcss-load-config: 4.0.2(postcss@8.4.31) + vite: 4.5.0 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + - ts-node + dev: true + + /@vitejs/plugin-react@4.1.1(vite@4.5.0): + resolution: {integrity: sha512-Jie2HERK+uh27e+ORXXwEP5h0Y2lS9T2PRGbfebiHGlwzDO0dEnd2aNtOR/qjBlPb1YgxwAONeblL1xqLikLag==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.3) + '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.3) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.0 + vite: 4.5.0(@types/node@18.6.5) + transitivePeerDependencies: + - supports-color + dev: true + + /@vitejs/plugin-react@4.2.1(vite@4.5.0): + resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.6) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.0 + vite: 4.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@volar/language-core@1.10.10: + resolution: {integrity: sha512-nsV1o3AZ5n5jaEAObrS3MWLBWaGwUj/vAsc15FVNIv+DbpizQRISg9wzygsHBr56ELRH8r4K75vkYNMtsSNNWw==} + dependencies: + '@volar/source-map': 1.10.10 + dev: true + + /@volar/source-map@1.10.10: + resolution: {integrity: sha512-GVKjLnifV4voJ9F0vhP56p4+F3WGf+gXlRtjFZsv6v3WxBTWU3ZVeaRaEHJmWrcv5LXmoYYpk/SC25BKemPRkg==} + dependencies: + muggle-string: 0.3.1 + dev: true + + /@volar/typescript@1.10.10: + resolution: {integrity: sha512-4a2r5bdUub2m+mYVnLu2wt59fuoYWe7nf0uXtGHU8QQ5LDNfzAR0wK7NgDiQ9rcl2WT3fxT2AA9AylAwFtj50A==} + dependencies: + '@volar/language-core': 1.10.10 + path-browserify: 1.0.1 + dev: true + + /@vue/compiler-core@3.3.9: + resolution: {integrity: sha512-+/Lf68Vr/nFBA6ol4xOtJrW+BQWv3QWKfRwGSm70jtXwfhZNF4R/eRgyVJYoxFRhdCTk/F6g99BP0ffPgZihfQ==} + dependencies: + '@babel/parser': 7.23.6 + '@vue/shared': 3.3.9 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + dev: true + + /@vue/compiler-dom@3.3.9: + resolution: {integrity: sha512-nfWubTtLXuT4iBeDSZ5J3m218MjOy42Vp2pmKVuBKo2/BLcrFUX8nCSr/bKRFiJ32R8qbdnnnBgRn9AdU5v0Sg==} + dependencies: + '@vue/compiler-core': 3.3.9 + '@vue/shared': 3.3.9 + dev: true + + /@vue/language-core@1.8.22(typescript@5.3.2): + resolution: {integrity: sha512-bsMoJzCrXZqGsxawtUea1cLjUT9dZnDsy5TuZ+l1fxRMzUGQUG9+Ypq4w//CqpWmrx7nIAJpw2JVF/t258miRw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@volar/language-core': 1.10.10 + '@volar/source-map': 1.10.10 + '@vue/compiler-dom': 3.3.9 + '@vue/shared': 3.3.9 + computeds: 0.0.1 + minimatch: 9.0.3 + muggle-string: 0.3.1 + typescript: 5.3.2 + vue-template-compiler: 2.7.15 + dev: true + + /@vue/shared@3.3.9: + resolution: {integrity: sha512-ZE0VTIR0LmYgeyhurPTpy4KzKsuDyQbMSdM49eKkMnT5X4VfFBLysMzjIZhLEFQYjjOVVfbvUDHckwjDFiO2eA==} + dev: true + + /@wagmi/connectors@3.1.5(@types/react@18.2.39)(react@18.2.0)(typescript@5.3.2)(viem@1.19.9): + resolution: {integrity: sha512-aE4rWZbivqWa9HqjiLDPtwROH2b1Az+lBVMeZ3o/aFxGNGNEkdrSAMOUG15/UFy3VnN6HqGOtTobOBZ10JhfNQ==} + peerDependencies: + typescript: '>=5.0.4' + viem: '>=0.3.35' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@coinbase/wallet-sdk': 3.7.2 + '@ledgerhq/connect-kit-loader': 1.1.2 + '@safe-global/safe-apps-provider': 0.17.1(typescript@5.3.2) + '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.3.2) + '@walletconnect/ethereum-provider': 2.10.2(@walletconnect/modal@2.6.2) + '@walletconnect/legacy-provider': 2.0.0 + '@walletconnect/modal': 2.6.2(@types/react@18.2.39)(react@18.2.0) + '@walletconnect/utils': 2.10.2 + abitype: 0.8.7(typescript@5.3.2) + eventemitter3: 4.0.7 + typescript: 5.3.2 + viem: 1.19.9(typescript@5.3.2) + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - '@types/react' + - bufferutil + - encoding + - lokijs + - react + - supports-color + - utf-8-validate + - zod + + /@wagmi/core@1.4.7(@types/react@18.2.39)(react@18.2.0)(typescript@5.3.2)(viem@1.19.9): + resolution: {integrity: sha512-PiOIGni8ArQoPmuDylHX38zMt2nPnTYRIluIqiduKyGCM61X/tf10a0rafUMOOphDPudZu1TacNDhCSeoh/LEA==} + peerDependencies: + typescript: '>=5.0.4' + viem: '>=0.3.35' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@wagmi/connectors': 3.1.5(@types/react@18.2.39)(react@18.2.0)(typescript@5.3.2)(viem@1.19.9) + abitype: 0.8.7(typescript@5.3.2) + eventemitter3: 4.0.7 + typescript: 5.3.2 + viem: 1.19.9(typescript@5.3.2) + zustand: 4.4.7(@types/react@18.2.39)(react@18.2.0) + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - '@types/react' + - bufferutil + - encoding + - immer + - lokijs + - react + - supports-color + - utf-8-validate + - zod + + /@walletconnect/core@2.10.2: + resolution: {integrity: sha512-JQz/xp3SLEpTeRQctdck2ugSBVEpMxoSE+lFi2voJkZop1hv6P+uqr6E4PzjFluAjeAnKlT1xvra0aFWjPWVcw==} + 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.2 + '@walletconnect/utils': 2.10.2 + events: 3.3.0 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - lokijs + - utf-8-validate + + /@walletconnect/crypto@1.0.3: + resolution: {integrity: sha512-+2jdORD7XQs76I2Odgr3wwrtyuLUXD/kprNVsjWRhhhdO9Mt6WqVzOPu0/t7OHSmgal8k7SoBQzUc5hu/8zL/g==} + dependencies: + '@walletconnect/encoding': 1.0.2 + '@walletconnect/environment': 1.0.1 + '@walletconnect/randombytes': 1.0.3 + aes-js: 3.1.2 + hash.js: 1.1.7 + tslib: 1.14.1 + + /@walletconnect/encoding@1.0.2: + resolution: {integrity: sha512-CrwSBrjqJ7rpGQcTL3kU+Ief+Bcuu9PH6JLOb+wM6NITX1GTxR/MfNwnQfhLKK6xpRAyj2/nM04OOH6wS8Imag==} + dependencies: + is-typedarray: 1.0.0 + tslib: 1.14.1 + typedarray-to-buffer: 3.1.5 + + /@walletconnect/environment@1.0.1: + resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} + dependencies: + tslib: 1.14.1 + + /@walletconnect/ethereum-provider@2.10.2(@walletconnect/modal@2.6.2): + resolution: {integrity: sha512-QMYFZ6+rVq2CJLdIPdKK0j1Qm66UA27oQU5V2SrL8EVwl7wFfm0Bq7fnL+qAWeDpn612dNeNErpk/ROa1zWlWg==} + peerDependencies: + '@walletconnect/modal': '>=2' + peerDependenciesMeta: + '@walletconnect/modal': + optional: true + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/modal': 2.6.2(@types/react@18.2.39)(react@18.2.0) + '@walletconnect/sign-client': 2.10.2 + '@walletconnect/types': 2.10.2 + '@walletconnect/universal-provider': 2.10.2 + '@walletconnect/utils': 2.10.2 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - encoding + - lokijs + - utf-8-validate + + /@walletconnect/events@1.0.1: + resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + + /@walletconnect/heartbeat@1.2.1: + resolution: {integrity: sha512-yVzws616xsDLJxuG/28FqtZ5rzrTA4gUjdEMTbWB5Y8V1XHRmqq4efAxCw5ie7WjbXFSUyBHaWlMR+2/CpQC5Q==} + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + tslib: 1.14.1 + + /@walletconnect/jsonrpc-http-connection@1.0.7: + resolution: {integrity: sha512-qlfh8fCfu8LOM9JRR9KE0s0wxP6ZG9/Jom8M0qsoIQeKF3Ni0FyV4V1qy/cc7nfI46SLQLSl4tgWSfLiE1swyQ==} + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + cross-fetch: 3.1.8 + tslib: 1.14.1 + transitivePeerDependencies: + - encoding + + /@walletconnect/jsonrpc-provider@1.0.13: + resolution: {integrity: sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g==} + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + tslib: 1.14.1 + + /@walletconnect/jsonrpc-types@1.0.3: + resolution: {integrity: sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw==} + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + + /@walletconnect/jsonrpc-utils@1.0.8: + resolution: {integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==} + dependencies: + '@walletconnect/environment': 1.0.1 + '@walletconnect/jsonrpc-types': 1.0.3 + tslib: 1.14.1 + + /@walletconnect/jsonrpc-ws-connection@1.0.13: + resolution: {integrity: sha512-mfOM7uFH4lGtQxG+XklYuFBj6dwVvseTt5/ahOkkmpcAEgz2umuzu7fTR+h5EmjQBdrmYyEBOWADbeaFNxdySg==} + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + tslib: 1.14.1 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + /@walletconnect/keyvaluestorage@1.0.2: + resolution: {integrity: sha512-U/nNG+VLWoPFdwwKx0oliT4ziKQCEoQ27L5Hhw8YOFGA2Po9A9pULUYNWhDgHkrb0gYDNt//X7wABcEWWBd3FQ==} + peerDependencies: + '@react-native-async-storage/async-storage': 1.x + lokijs: 1.x + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + lokijs: + optional: true + dependencies: + safe-json-utils: 1.1.1 + tslib: 1.14.1 + + /@walletconnect/legacy-client@2.0.0: + resolution: {integrity: sha512-v5L7rYk9loVnfvUf0mF+76bUPFaU5/Vh7mzL6/950CD/yoGdzYZ3Kj+L7mkC6HPMEGeQsBP1+sqBuiVGZ/aODA==} + dependencies: + '@walletconnect/crypto': 1.0.3 + '@walletconnect/encoding': 1.0.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/legacy-types': 2.0.0 + '@walletconnect/legacy-utils': 2.0.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 6.14.1 + + /@walletconnect/legacy-modal@2.0.0: + resolution: {integrity: sha512-jckNd8lMhm4X7dX9TDdxM3bXKJnaqkRs6K2Mo5j6GmbIF9Eyx40jZ5+q457RVxvM6ciZEDT5s1wBHWdWoOo+9Q==} + dependencies: + '@walletconnect/legacy-types': 2.0.0 + '@walletconnect/legacy-utils': 2.0.0 + copy-to-clipboard: 3.3.3 + preact: 10.19.2 + qrcode: 1.5.3 + + /@walletconnect/legacy-provider@2.0.0: + resolution: {integrity: sha512-A8xPebMI1A+50HbWwTpFCbwP7G+1NGKdTKyg8BUUg3h3Y9JucpC1W6w/x0v1Xw7qFEqQnz74LoIN/A3ytH9xrQ==} + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/legacy-client': 2.0.0 + '@walletconnect/legacy-modal': 2.0.0 + '@walletconnect/legacy-types': 2.0.0 + '@walletconnect/legacy-utils': 2.0.0 + transitivePeerDependencies: + - encoding + + /@walletconnect/legacy-types@2.0.0: + resolution: {integrity: sha512-sOVrA7HUdbI1OwKyPOQU0/DdvTSVFlsXWpAk2K2WvP2erTkBWPMTJq6cv2BmKdoJ3p6gLApT7sd+jHi3OF71uw==} + dependencies: + '@walletconnect/jsonrpc-types': 1.0.3 + + /@walletconnect/legacy-utils@2.0.0: + resolution: {integrity: sha512-CPWxSVVXw0kgNCxvU126g4GiV3mzXmC8IPJ15twE46aJ1FX+RHEIfAzFMFz2F2+fEhBxL63A7dwNQKDXorRPcQ==} + dependencies: + '@walletconnect/encoding': 1.0.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/legacy-types': 2.0.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 6.14.1 + + /@walletconnect/logger@2.0.1: + resolution: {integrity: sha512-SsTKdsgWm+oDTBeNE/zHxxr5eJfZmE9/5yp/Ku+zJtcTAjELb3DXueWkDXmE9h8uHIbJzIb5wj5lPdzyrjT6hQ==} + dependencies: + pino: 7.11.0 + tslib: 1.14.1 + + /@walletconnect/modal-core@2.6.2(@types/react@18.2.39)(react@18.2.0): + resolution: {integrity: sha512-cv8ibvdOJQv2B+nyxP9IIFdxvQznMz8OOr/oR/AaUZym4hjXNL/l1a2UlSQBXrVjo3xxbouMxLb3kBsHoYP2CA==} + dependencies: + valtio: 1.11.2(@types/react@18.2.39)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - react + + /@walletconnect/modal-ui@2.6.2(@types/react@18.2.39)(react@18.2.0): + resolution: {integrity: sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA==} + dependencies: + '@walletconnect/modal-core': 2.6.2(@types/react@18.2.39)(react@18.2.0) + lit: 2.8.0 + motion: 10.16.2 + qrcode: 1.5.3 + transitivePeerDependencies: + - '@types/react' + - react + + /@walletconnect/modal@2.6.2(@types/react@18.2.39)(react@18.2.0): + resolution: {integrity: sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA==} + dependencies: + '@walletconnect/modal-core': 2.6.2(@types/react@18.2.39)(react@18.2.0) + '@walletconnect/modal-ui': 2.6.2(@types/react@18.2.39)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - react + + /@walletconnect/randombytes@1.0.3: + resolution: {integrity: sha512-35lpzxcHFbTN3ABefC9W+uBpNZl1GC4Wpx0ed30gibfO/y9oLdy1NznbV96HARQKSBV9J9M/rrtIvf6a23jfYw==} + dependencies: + '@walletconnect/encoding': 1.0.2 + '@walletconnect/environment': 1.0.1 + randombytes: 2.1.0 + tslib: 1.14.1 + + /@walletconnect/relay-api@1.0.9: + resolution: {integrity: sha512-Q3+rylJOqRkO1D9Su0DPE3mmznbAalYapJ9qmzDgK28mYF9alcP3UwG/og5V7l7CFOqzCLi7B8BvcBUrpDj0Rg==} + dependencies: + '@walletconnect/jsonrpc-types': 1.0.3 + tslib: 1.14.1 + + /@walletconnect/relay-auth@1.0.4: + resolution: {integrity: sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==} + dependencies: + '@stablelib/ed25519': 1.0.3 + '@stablelib/random': 1.0.2 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + tslib: 1.14.1 + uint8arrays: 3.1.1 + + /@walletconnect/safe-json@1.0.2: + resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} + dependencies: + tslib: 1.14.1 + + /@walletconnect/sign-client@2.10.2: + resolution: {integrity: sha512-vviSLV3f92I0bReX+OLr1HmbH0uIzYEQQFd1MzIfDk9PkfFT/LLAHhUnDaIAMkIdippqDcJia+5QEtT4JihL3Q==} + dependencies: + '@walletconnect/core': 2.10.2 + '@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.2 + '@walletconnect/utils': 2.10.2 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - lokijs + - utf-8-validate + + /@walletconnect/time@1.0.2: + resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} + dependencies: + tslib: 1.14.1 + + /@walletconnect/types@2.10.2: + resolution: {integrity: sha512-luNV+07Wdla4STi9AejseCQY31tzWKQ5a7C3zZZaRK/di+rFaAAb7YW04OP4klE7tw/mJRGPTlekZElmHxO8kQ==} + 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 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - lokijs + + /@walletconnect/universal-provider@2.10.2: + resolution: {integrity: sha512-wFgI0LbQ3D56sgaUMsgOHCM5m8WLxiC71BGuCKQfApgsbNMVKugYVy2zWHyUyi8sqTQHI+uSaVpDev4UHq9LEw==} + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.0.1 + '@walletconnect/sign-client': 2.10.2 + '@walletconnect/types': 2.10.2 + '@walletconnect/utils': 2.10.2 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - encoding + - lokijs + - utf-8-validate + + /@walletconnect/utils@2.10.2: + resolution: {integrity: sha512-syxXRpc2yhSknMu3IfiBGobxOY7fLfLTJuw+ppKaeO6WUdZpIit3wfuGOcc0Ms3ZPFCrGfyGOoZsCvgdXtptRg==} + 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.2 + '@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.1 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - lokijs + + /@walletconnect/window-getters@1.0.1: + resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} + dependencies: + tslib: 1.14.1 + + /@walletconnect/window-metadata@1.0.1: + resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} + dependencies: + '@walletconnect/window-getters': 1.0.1 + tslib: 1.14.1 + + /@xobotyi/scrollbar-width@1.9.5: + resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} + dev: false + + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + + /abitype@0.8.7(typescript@5.3.2): + resolution: {integrity: sha512-wQ7hV8Yg/yKmGyFpqrNZufCxbszDe5es4AZGYPBitocfSqXtjrTG9JMWFcc4N30ukl2ve48aBTwt7NJxVQdU3w==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.19.1 + peerDependenciesMeta: + zod: + optional: true + dependencies: + typescript: 5.3.2 + + /abitype@0.9.8(typescript@5.3.2): + resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.19.1 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + dependencies: + typescript: 5.3.2 + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + + /acorn-walk@8.3.0: + resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + + /aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + dev: false + + /aes-js@3.1.2: + resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} + + /agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + dependencies: + humanize-ms: 1.2.1 + + /ahooks-v3-count@1.0.0: + resolution: {integrity: sha512-V7uUvAwnimu6eh/PED4mCDjE7tokeZQLKlxg9lCTMPhN+NjsSbtdacByVlR1oluXQzD3MOw55wylDmQo4+S9ZQ==} + dev: true + + /ahooks@3.7.8(react@18.2.0): + resolution: {integrity: sha512-e/NMlQWoCjaUtncNFIZk3FG1ImSkV/JhScQSkTqnftakRwdfZWSw6zzoWSG9OMYqPNs2MguDYBUFFC6THelWXA==} + engines: {node: '>=8.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.23.4 + '@types/js-cookie': 2.2.7 + ahooks-v3-count: 1.0.0 + dayjs: 1.11.10 + intersection-observer: 0.12.2 + js-cookie: 2.2.1 + lodash: 4.17.21 + react: 18.2.0 + resize-observer-polyfill: 1.5.1 + screenfull: 5.2.0 + tslib: 2.6.2 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: true + + /ansi-escapes@5.0.0: + resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.5 + is-array-buffer: 3.0.2 + dev: true + + /array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + dev: true + + /arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + dev: true + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + + /async-mutex@0.2.6: + resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} + dependencies: + tslib: 2.6.2 + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + /atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + /axios@1.6.3: + resolution: {integrity: sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==} + dependencies: + follow-redirects: 1.15.3 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + /babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + dependencies: + '@babel/runtime': 7.23.4 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + dev: false + + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base-x@3.0.9: + resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + dependencies: + safe-buffer: 5.2.1 + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + + /better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + dependencies: + is-windows: 1.0.2 + dev: true + + /bigint-buffer@1.1.5: + resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} + engines: {node: '>= 10.0.0'} + requiresBuild: true + dependencies: + bindings: 1.5.0 + + /bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + dev: false + + /bind-decorator@1.0.11: + resolution: {integrity: sha512-yzkH0uog6Vv/vQ9+rhSKxecnqGUZHYncg7qS7voz3Q76+TAi1SGiOKk2mlOvusQnFz9Dc4BC/NMkeXu11YgjJg==} + + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + + /bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + + /bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + + /borsh@0.7.0: + resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + dependencies: + bn.js: 5.2.1 + bs58: 4.0.1 + text-encoding-utf-8: 1.0.2 + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /breakword@1.0.6: + resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} + dependencies: + wcwidth: 1.0.1 + dev: true + + /brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001565 + electron-to-chromium: 1.4.578 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) + dev: true + + /browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001565 + electron-to-chromium: 1.4.616 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) + dev: true + + /bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + dependencies: + base-x: 3.0.9 + + /buble@0.19.6: + resolution: {integrity: sha512-9kViM6nJA1Q548Jrd06x0geh+BG2ru2+RMDkIHHgJY/8AcyCs34lTHwra9BX7YdPrZXd5aarkpr/SY8bmPgPdg==} + hasBin: true + dependencies: + chalk: 2.4.2 + magic-string: 0.25.9 + minimist: 1.2.8 + os-homedir: 1.0.2 + regexpu-core: 4.8.0 + vlq: 1.0.1 + dev: false + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /bufferutil@4.0.8: + resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.6.1 + + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + /caniuse-lite@1.0.30001565: + resolution: {integrity: sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==} + + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: true + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false + + /cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + + /clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + + /clsx@2.1.0: + resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} + engines: {node: '>=6'} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + + /colors@1.2.5: + resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} + engines: {node: '>=0.1.90'} + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + dev: true + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + requiresBuild: true + dev: true + optional: true + + /compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + + /component-props@1.1.1: + resolution: {integrity: sha512-69pIRJs9fCCHRqCz3390YF2LV1Lu6iEMZ5zuVqqUn+G20V9BNXlMs0cWawWeW9g4Ynmg29JmkG6R7/lUJoGd1Q==} + dev: false + + /component-xor@0.0.4: + resolution: {integrity: sha512-ZIt6sla8gfo+AFVRZoZOertcnD5LJaY2T9CKE2j13NJxQt/mUafD69Bl7/Y4AnpI2LGjiXH7cOfJDx/n2G9edA==} + dev: false + + /computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-changelog-conventionalcommits@7.0.2: + resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} + engines: {node: '>=16'} + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 2.0.0 + meow: 12.1.1 + split2: 4.2.0 + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: false + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /copy-text-to-clipboard@3.2.0: + resolution: {integrity: sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==} + engines: {node: '>=12'} + dev: true + + /copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + dependencies: + toggle-selection: 1.0.6 + + /core-js@3.33.3: + resolution: {integrity: sha512-lo0kOocUlLKmm6kv/FswQL8zbkH7mVsLJ/FULClOhv8WRVmKLVcs6XPNQAzstfeJTCHMyButEwG+z1kHxHoDZw==} + requiresBuild: true + + /cosmiconfig-typescript-loader@5.0.0(@types/node@18.18.13)(cosmiconfig@8.3.6): + resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} + engines: {node: '>=v16'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=8.2' + typescript: '>=4' + dependencies: + '@types/node': 18.18.13 + cosmiconfig: 8.3.6 + jiti: 1.21.0 + dev: true + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: false + + /cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: true + + /cosmjs-types@0.9.0: + resolution: {integrity: sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==} + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + /cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + /csv-generate@3.4.3: + resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} + dev: true + + /csv-parse@4.16.3: + resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} + dev: true + + /csv-stringify@5.6.5: + resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} + dev: true + + /csv@5.5.3: + resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} + engines: {node: '>= 0.1.90'} + dependencies: + csv-generate: 3.4.3 + csv-parse: 4.16.3 + csv-stringify: 5.6.5 + stream-transform: 2.1.3 + dev: true + + /dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: true + + /dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + + /de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deep-object-diff@1.1.9: + resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 + object-keys: 1.1.1 + + /delay@5.0.0: + resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + engines: {node: '>=10'} + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + /detect-browser@5.3.0: + resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + + /detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + dev: false + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + + /dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-iterator@1.0.0: + resolution: {integrity: sha512-7dsMOQI07EMU98gQM8NSB3GsAiIeBYIPKpnxR3c9xOvdvBjChAcOM0iJ222I3p5xyiZO9e5oggkNaCusuTdYig==} + dependencies: + component-props: 1.1.1 + component-xor: 0.0.4 + dev: false + + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + + /duplexify@4.1.2: + resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.1 + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /electron-to-chromium@1.4.578: + resolution: {integrity: sha512-V0ZhSu1BQZKfG0yNEL6Dadzik8E1vAzfpVOapdSiT9F6yapEJ3Bk+4tZ4SMPdWiUchCgnM/ByYtBzp5ntzDMIA==} + dev: true + + /electron-to-chromium@1.4.616: + resolution: {integrity: sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==} + dev: true + + /elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + + /enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + + /es-abstract@1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.2 + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + es-set-tostringtag: 2.0.2 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.2 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + internal-slot: 1.0.6 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.0.1 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.13 + dev: true + + /es-set-tostringtag@2.0.2: + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + has-tostringtag: 1.0.0 + hasown: 2.0.0 + dev: true + + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + dependencies: + hasown: 2.0.0 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + /es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + dependencies: + es6-promise: 4.2.8 + + /esbuild@0.17.6: + resolution: {integrity: sha512-TKFRp9TxrJDdRWfSsSERKEovm6v30iHnrjlcGhLBOtReE28Yp1VSBRfO3GTaOFMoxsNerx4TjrhzSuma9ha83Q==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.6 + '@esbuild/android-arm64': 0.17.6 + '@esbuild/android-x64': 0.17.6 + '@esbuild/darwin-arm64': 0.17.6 + '@esbuild/darwin-x64': 0.17.6 + '@esbuild/freebsd-arm64': 0.17.6 + '@esbuild/freebsd-x64': 0.17.6 + '@esbuild/linux-arm': 0.17.6 + '@esbuild/linux-arm64': 0.17.6 + '@esbuild/linux-ia32': 0.17.6 + '@esbuild/linux-loong64': 0.17.6 + '@esbuild/linux-mips64el': 0.17.6 + '@esbuild/linux-ppc64': 0.17.6 + '@esbuild/linux-riscv64': 0.17.6 + '@esbuild/linux-s390x': 0.17.6 + '@esbuild/linux-x64': 0.17.6 + '@esbuild/netbsd-x64': 0.17.6 + '@esbuild/openbsd-x64': 0.17.6 + '@esbuild/sunos-x64': 0.17.6 + '@esbuild/win32-arm64': 0.17.6 + '@esbuild/win32-ia32': 0.17.6 + '@esbuild/win32-x64': 0.17.6 + dev: true + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: true + + /eslint-plugin-react-hooks@4.6.0(eslint@8.54.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.54.0 + dev: true + + /eslint-plugin-react-refresh@0.3.5(eslint@8.54.0): + resolution: {integrity: sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==} + peerDependencies: + eslint: '>=7' + dependencies: + eslint: 8.54.0 + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.54.0: + resolution: {integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.3 + '@eslint/js': 8.54.0 + '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + 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 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint-visitor-keys: 3.4.3 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-util-attach-comments@2.1.1: + resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} + dependencies: + '@types/estree': 1.0.5 + + /estree-util-build-jsx@2.2.2: + resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} + dependencies: + '@types/estree-jsx': 1.0.3 + estree-util-is-identifier-name: 2.1.0 + estree-walker: 3.0.3 + + /estree-util-is-identifier-name@2.1.0: + resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + + /estree-util-to-js@1.2.0: + resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} + dependencies: + '@types/estree-jsx': 1.0.3 + astring: 1.8.6 + source-map: 0.7.4 + + /estree-util-visit@1.2.1: + resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/unist': 2.0.10 + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.5 + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /eth-block-tracker@6.1.0: + resolution: {integrity: sha512-K9SY8+/xMBi4M5HHTDdxnpEqEEGjbNpzHFqvxyjMZej8InV/B+CkFRKM6W+uvrFJ7m8Zd1E0qUkseU3vdIDFYQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + '@metamask/utils': 3.6.0 + json-rpc-random-id: 1.0.1 + pify: 3.0.0 + transitivePeerDependencies: + - supports-color + + /eth-json-rpc-filters@5.1.0: + resolution: {integrity: sha512-fos+9xmoa1A2Ytsc9eYof17r81BjdJOUcGcgZn4K/tKdCCTb+a8ytEtwlu1op5qsXFDlgGmstTELFrDEc89qEQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + async-mutex: 0.2.6 + eth-query: 2.1.2 + json-rpc-engine: 6.1.0 + pify: 5.0.0 + + /eth-query@2.1.2: + resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} + dependencies: + json-rpc-random-id: 1.0.1 + xtend: 4.0.2 + + /eth-rpc-errors@4.0.2: + resolution: {integrity: sha512-n+Re6Gu8XGyfFy1it0AwbD1x0MUzspQs0D5UiPs1fFPCr6WAwZM+vbIhXheBFrpgosqN9bs5PqlB4Q61U/QytQ==} + dependencies: + fast-safe-stringify: 2.1.1 + + /ethereum-cryptography@2.1.2: + resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} + dependencies: + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.1 + '@scure/bip32': 1.3.1 + '@scure/bip39': 1.2.1 + + /ethjs-util@0.1.6: + resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + is-hex-prefixed: 1.0.0 + strip-hex-prefix: 1.0.0 + + /eval@0.1.8: + resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} + engines: {node: '>= 0.8'} + dependencies: + '@types/node': 20.10.0 + require-like: 0.1.2 + dev: true + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: true + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: false + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + /extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + dev: true + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true + + /eyes@0.1.8: + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fast-redact@3.3.0: + resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} + engines: {node: '>=6'} + + /fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + /fast-stable-stringify@1.0.0: + resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + + /fast-xml-parser@4.3.2: + resolution: {integrity: sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==} + hasBin: true + dependencies: + strnum: 1.0.5 + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + + /find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: false + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + dependencies: + micromatch: 4.0.5 + pkg-dir: 4.2.0 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true + + /follow-redirects@1.15.3: + resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + /fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + + /get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + dev: false + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + dev: true + + /git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: false + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + dependencies: + ini: 1.3.8 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.2 + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + dependencies: + get-intrinsic: 1.2.2 + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /hast-util-to-estree@2.3.3: + resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.3 + '@types/hast': 2.3.8 + '@types/unist': 2.0.10 + comma-separated-tokens: 2.0.3 + estree-util-attach-comments: 2.1.1 + estree-util-is-identifier-name: 2.1.0 + hast-util-whitespace: 2.0.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdxjs-esm: 1.3.1 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 4.0.4 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + /hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /hey-listen@1.0.8: + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + + /hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /human-id@1.0.2: + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + + /humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + dependencies: + ms: 2.1.3 + + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /i18n-js@4.3.2: + resolution: {integrity: sha512-n8gbEbQEueym2/q2yrZk5/xKWjFcKtg3/Escw4JHSVWa8qtKqP8j7se3UjkRbHlO/REqFA0V/MG1q8tEfyHeOA==} + dependencies: + bignumber.js: 9.1.2 + lodash: 4.17.21 + make-plural: 7.3.0 + dev: false + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + + /internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + hasown: 2.0.0 + side-channel: 1.0.4 + dev: true + + /intersection-observer@0.12.2: + resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} + dev: true + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + /is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + /is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: true + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + /is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + dependencies: + '@types/estree': 1.0.5 + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + dependencies: + better-path-resolve: 1.0.0 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + dependencies: + text-extensions: 2.4.0 + dev: true + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.13 + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isomorphic-ws@4.0.1(ws@7.5.9): + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '*' + dependencies: + ws: 7.5.9 + + /isows@1.0.3(ws@8.13.0): + resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.13.0 + + /javascript-stringify@2.1.0: + resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} + dev: true + + /jayson@4.1.0: + resolution: {integrity: sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@types/connect': 3.4.38 + '@types/node': 12.20.55 + '@types/ws': 7.4.7 + JSONStream: 1.3.5 + commander: 2.20.3 + delay: 5.0.0 + es6-promisify: 5.0.0 + eyes: 0.1.8 + isomorphic-ws: 4.0.1(ws@7.5.9) + json-stringify-safe: 5.0.1 + uuid: 8.3.2 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: true + + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + dev: true + + /js-cookie@2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + dev: true + + /js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: false + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-rpc-engine@6.1.0: + resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} + engines: {node: '>=10.0.0'} + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + eth-rpc-errors: 4.0.2 + + /json-rpc-random-id@1.0.1: + resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + /keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.6.1 + readable-stream: 3.6.2 + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /keyvaluestorage-interface@1.0.0: + resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /libsodium-sumo@0.7.13: + resolution: {integrity: sha512-zTGdLu4b9zSNLfovImpBCbdAA4xkpkZbMnSQjP8HShyOutnGjRHmSOKlsylh1okao6QhLiz7nG98EGn+04cZjQ==} + + /libsodium-wrappers-sumo@0.7.13: + resolution: {integrity: sha512-lz4YdplzDRh6AhnLGF2Dj2IUj94xRN6Bh8T0HLNwzYGwPehQJX6c7iYVrFUPZ3QqxE0bqC+K0IIqqZJYWumwSQ==} + dependencies: + libsodium-sumo: 0.7.13 + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /lint-staged@15.1.0: + resolution: {integrity: sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==} + engines: {node: '>=18.12.0'} + hasBin: true + dependencies: + chalk: 5.3.0 + commander: 11.1.0 + debug: 4.3.4 + execa: 8.0.1 + lilconfig: 2.1.0 + listr2: 7.0.2 + micromatch: 4.0.5 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /listr2@7.0.2: + resolution: {integrity: sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==} + engines: {node: '>=16.0.0'} + dependencies: + cli-truncate: 3.1.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 5.0.1 + rfdc: 1.3.0 + wrap-ansi: 8.1.0 + dev: true + + /lit-element@3.3.3: + resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} + dependencies: + '@lit-labs/ssr-dom-shim': 1.1.2 + '@lit/reactive-element': 1.6.3 + lit-html: 2.8.0 + + /lit-html@2.8.0: + resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} + dependencies: + '@types/trusted-types': 2.0.6 + + /lit@2.8.0: + resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} + dependencies: + '@lit/reactive-element': 1.6.3 + lit-element: 3.3.3 + lit-html: 2.8.0 + + /load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + + /lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + + /lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + dev: true + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + + /lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + dev: true + + /lodash.mapvalues@4.6.0: + resolution: {integrity: sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==} + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: true + + /lodash.set@4.3.2: + resolution: {integrity: sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==} + + /lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + dev: true + + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + /lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true + + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true + + /lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-update@5.0.1: + resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + ansi-escapes: 5.0.0 + cli-cursor: 4.0.0 + slice-ansi: 5.0.0 + strip-ansi: 7.1.0 + wrap-ansi: 8.1.0 + dev: true + + /long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + + /lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: false + + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /make-plural@7.3.0: + resolution: {integrity: sha512-/K3BC0KIsO+WK2i94LkMPv3wslMrazrQhfi5We9fMbLlLjzoOSJWr7TAdupLlDWaJcWxwoNosBkhFDejiu5VDw==} + dev: false + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /markdown-extensions@1.1.1: + resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} + engines: {node: '>=0.10.0'} + + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: true + + /mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.10 + unist-util-visit: 4.1.2 + + /mdast-util-find-and-replace@2.2.2: + resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} + dependencies: + '@types/mdast': 3.0.15 + escape-string-regexp: 5.0.0 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: true + + /mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.10 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + + /mdast-util-gfm-autolink-literal@1.0.3: + resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + dependencies: + '@types/mdast': 3.0.15 + ccount: 2.0.1 + mdast-util-find-and-replace: 2.2.2 + micromark-util-character: 1.2.0 + dev: true + + /mdast-util-gfm-footnote@1.0.2: + resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-markdown: 1.5.0 + micromark-util-normalize-identifier: 1.1.0 + dev: true + + /mdast-util-gfm-strikethrough@1.0.3: + resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-markdown: 1.5.0 + dev: true + + /mdast-util-gfm-table@1.0.7: + resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + dependencies: + '@types/mdast': 3.0.15 + markdown-table: 3.0.3 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-gfm-task-list-item@1.0.2: + resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-markdown: 1.5.0 + dev: true + + /mdast-util-gfm@2.0.2: + resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} + dependencies: + mdast-util-from-markdown: 1.3.1 + mdast-util-gfm-autolink-literal: 1.0.3 + mdast-util-gfm-footnote: 1.0.2 + mdast-util-gfm-strikethrough: 1.0.3 + mdast-util-gfm-table: 1.0.7 + mdast-util-gfm-task-list-item: 1.0.2 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-mdx-expression@1.3.2: + resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 2.3.8 + '@types/mdast': 3.0.15 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + + /mdast-util-mdx-jsx@2.1.4: + resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 2.3.8 + '@types/mdast': 3.0.15 + '@types/unist': 2.0.10 + ccount: 2.0.1 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 4.0.2 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + transitivePeerDependencies: + - supports-color + + /mdast-util-mdx@2.0.1: + resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} + dependencies: + mdast-util-from-markdown: 1.3.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdx-jsx: 2.1.4 + mdast-util-mdxjs-esm: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + + /mdast-util-mdxjs-esm@1.3.1: + resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 2.3.8 + '@types/mdast': 3.0.15 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + + /mdast-util-phrasing@3.0.1: + resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + dependencies: + '@types/mdast': 3.0.15 + unist-util-is: 5.2.1 + + /mdast-util-to-hast@12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + dependencies: + '@types/hast': 2.3.8 + '@types/mdast': 3.0.15 + mdast-util-definitions: 5.1.2 + micromark-util-sanitize-uri: 1.2.0 + trim-lines: 3.0.1 + unist-util-generated: 2.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + + /mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.10 + longest-streak: 3.1.0 + mdast-util-phrasing: 3.0.1 + mdast-util-to-string: 3.2.0 + micromark-util-decode-string: 1.1.0 + unist-util-visit: 4.1.2 + zwitch: 2.0.4 + + /mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + dependencies: + '@types/mdast': 3.0.15 + + /media-query-parser@2.0.2: + resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} + dependencies: + '@babel/runtime': 7.23.4 + + /meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + dev: true + + /meow@6.1.1: + resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} + engines: {node: '>=8'} + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 2.5.0 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.13.1 + yargs-parser: 18.1.3 + dev: true + + /meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + + /micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + /micromark-extension-gfm-autolink-literal@1.0.5: + resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-extension-gfm-footnote@1.1.2: + resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} + dependencies: + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-extension-gfm-strikethrough@1.0.7: + resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-extension-gfm-table@1.0.7: + resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-extension-gfm-tagfilter@1.0.2: + resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} + dependencies: + micromark-util-types: 1.1.0 + dev: true + + /micromark-extension-gfm-task-list-item@1.0.5: + resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-extension-gfm@2.0.3: + resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} + dependencies: + micromark-extension-gfm-autolink-literal: 1.0.5 + micromark-extension-gfm-footnote: 1.1.2 + micromark-extension-gfm-strikethrough: 1.0.7 + micromark-extension-gfm-table: 1.0.7 + micromark-extension-gfm-tagfilter: 1.0.2 + micromark-extension-gfm-task-list-item: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-extension-mdx-expression@1.0.8: + resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + dependencies: + '@types/estree': 1.0.5 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + /micromark-extension-mdx-jsx@1.0.5: + resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + estree-util-is-identifier-name: 2.1.0 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + + /micromark-extension-mdx-md@1.0.1: + resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + dependencies: + micromark-util-types: 1.1.0 + + /micromark-extension-mdxjs-esm@1.0.5: + resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + dependencies: + '@types/estree': 1.0.5 + micromark-core-commonmark: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + + /micromark-extension-mdxjs@1.0.1: + resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + micromark-extension-mdx-expression: 1.0.8 + micromark-extension-mdx-jsx: 1.0.5 + micromark-extension-mdx-md: 1.0.1 + micromark-extension-mdxjs-esm: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + + /micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + /micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + /micromark-factory-mdx-expression@1.0.9: + resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + dependencies: + '@types/estree': 1.0.5 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + + /micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + + /micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + /micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + /micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + /micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + dependencies: + micromark-util-symbol: 1.1.0 + + /micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + /micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + + /micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + dependencies: + micromark-util-symbol: 1.1.0 + + /micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + + /micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + + /micromark-util-events-to-acorn@1.2.3: + resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + '@types/unist': 2.0.10 + estree-util-visit: 1.2.1 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + + /micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + + /micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + dependencies: + micromark-util-symbol: 1.1.0 + + /micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + dependencies: + micromark-util-types: 1.1.0 + + /micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + + /micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + /micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + + /micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + + /micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + /minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /mixme@0.5.10: + resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} + engines: {node: '>= 8.0.0'} + dev: true + + /mlly@1.4.2: + resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} + dependencies: + acorn: 8.11.2 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.3.2 + dev: true + + /modern-ahocorasick@1.0.1: + resolution: {integrity: sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==} + + /motion@10.16.2: + resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} + dependencies: + '@motionone/animation': 10.16.3 + '@motionone/dom': 10.16.4 + '@motionone/svelte': 10.16.4 + '@motionone/types': 10.16.3 + '@motionone/utils': 10.16.3 + '@motionone/vue': 10.16.4 + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /muggle-string@0.3.1: + resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + dev: true + + /multiformats@9.9.0: + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + + /mutation-observer@1.0.3: + resolution: {integrity: sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA==} + dev: true + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /next@13.5.6(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==} + engines: {node: '>=16.14.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + sass: + optional: true + dependencies: + '@next/env': 13.5.6 + '@swc/helpers': 0.5.2 + busboy: 1.6.0 + caniuse-lite: 1.0.30001565 + postcss: 8.4.31 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-jsx: 5.1.1(react@18.2.0) + watchpack: 2.4.0 + optionalDependencies: + '@next/swc-darwin-arm64': 13.5.6 + '@next/swc-darwin-x64': 13.5.6 + '@next/swc-linux-arm64-gnu': 13.5.6 + '@next/swc-linux-arm64-musl': 13.5.6 + '@next/swc-linux-x64-gnu': 13.5.6 + '@next/swc-linux-x64-musl': 13.5.6 + '@next/swc-win32-arm64-msvc': 13.5.6 + '@next/swc-win32-ia32-msvc': 13.5.6 + '@next/swc-win32-x64-msvc': 13.5.6 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + + /node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + + /node-gyp-build@4.6.1: + resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==} + hasBin: true + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.13.1 + semver: 7.5.4 + validate-npm-package-license: 3.0.4 + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /on-exit-leak-free@0.2.0: + resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /os-homedir@1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} + dev: false + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + dev: true + + /outdent@0.8.0: + resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} + + /p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + dependencies: + p-map: 2.1.0 + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + dependencies: + '@types/unist': 2.0.10 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.22.13 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + /pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + dev: true + + /periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + dependencies: + '@types/estree': 1.0.5 + estree-walker: 3.0.3 + is-reference: 3.0.2 + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: true + + /pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + + /pino-abstract-transport@0.5.0: + resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + dependencies: + duplexify: 4.1.2 + split2: 4.2.0 + + /pino-std-serializers@4.0.0: + resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + + /pino@7.11.0: + resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} + hasBin: true + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.3.0 + on-exit-leak-free: 0.2.0 + pino-abstract-transport: 0.5.0 + pino-std-serializers: 4.0.0 + process-warning: 1.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.1.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 2.8.0 + thread-stream: 0.15.2 + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.2 + pathe: 1.1.1 + dev: true + + /pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + + /postcss-load-config@4.0.2(postcss@8.4.31): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.0.0 + postcss: 8.4.31 + yaml: 2.3.4 + dev: true + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /preact@10.19.2: + resolution: {integrity: sha512-UA9DX/OJwv6YwP9Vn7Ti/vF80XL+YA5H2l7BpCtUr3ya8LWHFzpiO5R+N7dN16ujpIxhekRFuOOF82bXX7K/lg==} + + /preferred-pm@3.1.2: + resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: 4.0.0 + which-pm: 2.0.0 + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /prettier@3.1.0: + resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /prism-react-renderer@1.3.5(react@18.2.0): + resolution: {integrity: sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==} + peerDependencies: + react: '>=0.14.9' + dependencies: + react: 18.2.0 + dev: false + + /process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: true + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: false + + /property-information@6.4.0: + resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} + + /protobufjs@6.11.4: + resolution: {integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==} + hasBin: true + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/long': 4.0.2 + '@types/node': 20.10.0 + long: 4.0.0 + + /proxy-compare@2.5.1: + resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + /pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /qrcode@1.5.3: + resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + dijkstrajs: 1.0.3 + encode-utf8: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + + /query-string@6.14.1: + resolution: {integrity: sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==} + engines: {node: '>=6'} + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + + /query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + + /react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: false + + /react-live@2.4.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-r+32f7oV/kBs3QZBRvaT+9vOkQW47UZrDpgwUe5FiIMOl7sdo5pmISgb7Zpj5PGHgY6XQaiXs3FEh+IWw3KbRg==} + engines: {node: '>= 0.12.0', npm: '>= 2.0.0'} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@types/buble': 0.20.5 + buble: 0.19.6 + core-js: 3.33.3 + dom-iterator: 1.0.0 + prism-react-renderer: 1.3.5(react@18.2.0) + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-simple-code-editor: 0.11.3(react-dom@18.2.0)(react@18.2.0) + unescape: 1.0.1 + dev: false + + /react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: true + + /react-remove-scroll-bar@2.3.4(@types/react@18.2.39)(react@18.2.0): + resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} + 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 + dependencies: + '@types/react': 18.2.39 + react: 18.2.0 + react-style-singleton: 2.2.1(@types/react@18.2.39)(react@18.2.0) + tslib: 2.6.2 + dev: false + + /react-remove-scroll@2.5.7(@types/react@18.2.39)(react@18.2.0): + resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} + 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 + dependencies: + '@types/react': 18.2.39 + react: 18.2.0 + react-remove-scroll-bar: 2.3.4(@types/react@18.2.39)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.39)(react@18.2.0) + tslib: 2.6.2 + use-callback-ref: 1.3.1(@types/react@18.2.39)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.39)(react@18.2.0) + dev: false + + /react-router-dom@6.6.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-6SCDXxRQqW5af8ImOqKza7icmQ47/EMbz572uFjzvcArg3lZ+04PxSPp8qGs+p2Y+q+b+S/AjXv8m8dyLndIIA==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@remix-run/router': 1.2.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.6.2(react@18.2.0) + dev: false + + /react-router@6.6.2(react@18.2.0): + resolution: {integrity: sha512-uJPG55Pek3orClbURDvfljhqFvMgJRo59Pktywkk8hUUkTY2aRfza8Yhl/vZQXs+TNQyr6tu+uqz/fLxPICOGQ==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' + dependencies: + '@remix-run/router': 1.2.1 + react: 18.2.0 + dev: false + + /react-simple-code-editor@0.11.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7bVI4Yd1aNCeuldErXUt8ksaAG5Fi+GZ6vp3mtFBnckKdzsQtrgkDvdwMFXIhwTGG+mUYmk5ZpMo0axSW9JBzA==} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-style-singleton@2.2.1(@types/react@18.2.39)(react@18.2.0): + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + 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 + dependencies: + '@types/react': 18.2.39 + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + /readonly-date@1.0.0: + resolution: {integrity: sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==} + + /real-require@0.1.0: + resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} + engines: {node: '>= 12.13.0'} + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /reflect-metadata@0.1.14: + resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} + + /regenerate-unicode-properties@9.0.0: + resolution: {integrity: sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: false + + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: false + + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + + /regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + set-function-name: 2.0.1 + dev: true + + /regexpu-core@4.8.0: + resolution: {integrity: sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 9.0.0 + regjsgen: 0.5.2 + regjsparser: 0.7.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + dev: false + + /regjsgen@0.5.2: + resolution: {integrity: sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==} + dev: false + + /regjsparser@0.7.0: + resolution: {integrity: sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: false + + /remark-gfm@3.0.1: + resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + dependencies: + '@types/mdast': 3.0.15 + mdast-util-gfm: 2.0.2 + micromark-extension-gfm: 2.0.3 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /remark-mdx@2.3.0: + resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} + dependencies: + mdast-util-mdx: 2.0.1 + micromark-extension-mdxjs: 1.0.1 + transitivePeerDependencies: + - supports-color + + /remark-parse@10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + dependencies: + '@types/mdast': 3.0.15 + mdast-util-from-markdown: 1.3.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + + /remark-rehype@10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + dependencies: + '@types/hast': 2.3.8 + '@types/mdast': 3.0.15 + mdast-util-to-hast: 12.3.0 + unified: 10.1.2 + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /require-like@0.1.2: + resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} + dev: true + + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + /resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + dependencies: + global-dirs: 0.1.1 + dev: true + + /resolve@1.19.0: + resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rfdc@1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup-plugin-peer-deps-external@2.2.4: + resolution: {integrity: sha512-AWdukIM1+k5JDdAqV/Cxd+nejvno2FVLVeZ74NKggm3Q5s9cbbcOgUPGdbxPi4BXu7xGaZ8HG12F+thImYu/0g==} + peerDependencies: + rollup: '*' + dev: true + + /rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /rpc-websockets@7.8.0: + resolution: {integrity: sha512-AStkq6KDvSAmA4WiwlK1pDvj/33BWmExTATUokC0v+NhWekXSTNzXS5OGXeYwq501/pj6lBZMofg/h4dx4/tCg==} + dependencies: + '@babel/runtime': 7.23.4 + eventemitter3: 4.0.7 + uuid: 8.3.2 + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + + /safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-json-utils@1.1.1: + resolution: {integrity: sha512-SAJWGKDs50tAbiDXLf89PDwt9XYkWyANFWVzn4dTXl5QyI8t2o/bW5/OJl3lvc2WVU4MEpTo9Yz5NVFNsp+OJQ==} + + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-regex: 1.1.4 + dev: true + + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + + /screenfull@5.2.0: + resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} + engines: {node: '>=0.10.0'} + dev: true + + /scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + dev: false + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.1 + dev: true + + /sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + /shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /smartwrap@2.0.2: + resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + array.prototype.flat: 1.3.2 + breakword: 1.0.6 + grapheme-splitter: 1.0.4 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + yargs: 15.4.1 + dev: true + + /sonic-boom@2.8.0: + resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + dependencies: + atomic-sleep: 1.0.0 + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: false + + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + /spawndamnit@2.0.0: + resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + dependencies: + cross-spawn: 5.1.0 + signal-exit: 3.0.7 + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.16 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.16 + dev: true + + /spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + dev: true + + /split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + + /split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + /stream-shift@1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + + /stream-transform@2.1.3: + resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} + dependencies: + mixme: 0.5.10 + dev: true + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false + + /strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + + /string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + + /stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + is-hex-prefixed: 1.0.0 + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + + /style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + dependencies: + inline-style-parser: 0.1.1 + + /styled-jsx@5.1.1(react@18.2.0): + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + client-only: 0.0.1 + react: 18.2.0 + dev: false + + /stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + dev: false + + /superstruct@0.14.2: + resolution: {integrity: sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==} + + /superstruct@1.0.3: + resolution: {integrity: sha512-8iTn3oSS8nRGn+C2pgXSKPI3jmpm6FExNazNpjvqS6ZUJQCej3PUXEKM8NjHBOs54ExM+LPW/FBRhymrdcCiSg==} + engines: {node: '>=14.0.0'} + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /symbol-observable@2.0.3: + resolution: {integrity: sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==} + engines: {node: '>=0.10'} + + /term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + dev: true + + /text-encoding-utf-8@1.0.2: + resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + + /text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /thread-stream@0.15.2: + resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + dependencies: + real-require: 0.1.0 + + /through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + + /ts-node@10.9.1(@types/node@18.6.5)(typescript@5.3.2): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 18.6.5 + acorn: 8.11.2 + acorn-walk: 8.3.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.3.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + /tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + 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' + dependencies: + tslib: 1.14.1 + dev: true + + /tsyringe@4.8.0: + resolution: {integrity: sha512-YB1FG+axdxADa3ncEtRnQCFq/M0lALGLxSZeVNbTU8NqhOVc51nnv2CISTcvc1kyv6EGPtXVr0v6lWeDxiijOA==} + engines: {node: '>= 6.0.0'} + dependencies: + tslib: 1.14.1 + + /tty-table@4.2.3: + resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + chalk: 4.1.2 + csv: 5.5.3 + kleur: 4.1.5 + smartwrap: 2.0.2 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + yargs: 17.7.2 + dev: true + + /tweetnacl-util@0.15.1: + resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + + /tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: true + + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.5 + for-each: 0.3.3 + is-typed-array: 1.1.12 + dev: true + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + + /typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /typescript@5.3.2: + resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==} + engines: {node: '>=14.17'} + hasBin: true + + /ua-parser-js@1.0.37: + resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} + dev: false + + /ufo@1.3.2: + resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} + dev: true + + /uint8arrays@3.1.1: + resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} + dependencies: + multiformats: 9.9.0 + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.5 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /unescape@1.0.1: + resolution: {integrity: sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + dev: false + + /unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: false + + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + dev: false + + /unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + dev: false + + /unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: false + + /unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + dependencies: + '@types/unist': 2.0.10 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 5.3.7 + + /unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + + /unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + dependencies: + '@types/unist': 2.0.10 + + /unist-util-position-from-estree@1.1.2: + resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} + dependencies: + '@types/unist': 2.0.10 + + /unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + dependencies: + '@types/unist': 2.0.10 + + /unist-util-remove-position@4.0.2: + resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + dependencies: + '@types/unist': 2.0.10 + unist-util-visit: 4.1.2 + + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + dependencies: + '@types/unist': 2.0.10 + + /unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + + /unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: true + + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.1 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /update-browserslist-db@1.0.13(browserslist@4.22.2): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.2 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /use-callback-ref@1.3.1(@types/react@18.2.39)(react@18.2.0): + resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==} + 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 + dependencies: + '@types/react': 18.2.39 + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /use-sidecar@1.1.2(@types/react@18.2.39)(react@18.2.0): + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + 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 + dependencies: + '@types/react': 18.2.39 + detect-node-es: 1.1.0 + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /use-sync-external-store@1.2.0(react@18.2.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + + /utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.6.1 + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.12 + which-typed-array: 1.1.13 + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + /uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + dequal: 2.0.3 + diff: 5.1.0 + kleur: 4.1.5 + sade: 1.8.1 + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /validator@13.11.0: + resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + engines: {node: '>= 0.10'} + dev: true + + /valtio@1.11.2(@types/react@18.2.39)(react@18.2.0): + resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=16.8' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + dependencies: + '@types/react': 18.2.39 + proxy-compare: 2.5.1 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + + /vconsole@3.15.1: + resolution: {integrity: sha512-KH8XLdrq9T5YHJO/ixrjivHfmF2PC2CdVoK6RWZB4yftMykYIaXY1mxZYAic70vADM54kpMQF+dYmvl5NRNy1g==} + dependencies: + '@babel/runtime': 7.23.4 + copy-text-to-clipboard: 3.2.0 + core-js: 3.33.3 + mutation-observer: 1.0.3 + dev: true + + /vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + dependencies: + '@types/unist': 2.0.10 + unist-util-stringify-position: 3.0.3 + + /vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + dependencies: + '@types/unist': 2.0.10 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + + /viem@1.19.9(typescript@5.3.2): + resolution: {integrity: sha512-Sf9U2x4jU0S/FALqYypcspWOGene0NZyD470oUripNhE0Ta6uOE/OgE4toTDVfRxov8qw0JFinr/wPGxYE3+HQ==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 + abitype: 0.9.8(typescript@5.3.2) + isows: 1.0.3(ws@8.13.0) + typescript: 5.3.2 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + /vite-node@0.28.5: + resolution: {integrity: sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==} + engines: {node: '>=v14.16.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.4.2 + pathe: 1.1.1 + picocolors: 1.0.0 + source-map: 0.6.1 + source-map-support: 0.5.21 + vite: 4.5.0 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-plugin-dts@3.6.3(typescript@5.3.2)(vite@4.5.0): + resolution: {integrity: sha512-NyRvgobl15rYj65coi/gH7UAEH+CpSjh539DbGb40DfOTZSvDLNYTzc8CK4460W+LqXuMK7+U3JAxRB3ksrNPw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + '@microsoft/api-extractor': 7.38.3 + '@rollup/pluginutils': 5.1.0 + '@vue/language-core': 1.8.22(typescript@5.3.2) + debug: 4.3.4 + kolorist: 1.8.0 + typescript: 5.3.2 + vite: 4.5.0 + vue-tsc: 1.8.22(typescript@5.3.2) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + dev: true + + /vite@4.5.0: + resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.18.20 + postcss: 8.4.31 + rollup: 3.29.4 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vite@4.5.0(@types/node@18.6.5): + resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.6.5 + esbuild: 0.18.20 + postcss: 8.4.31 + rollup: 3.29.4 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vlq@1.0.1: + resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} + dev: false + + /vue-template-compiler@2.7.15: + resolution: {integrity: sha512-yQxjxMptBL7UAog00O8sANud99C6wJF+7kgbcwqkvA38vCGF7HWE66w0ZFnS/kX5gSoJr/PQ4/oS3Ne2pW37Og==} + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + dev: true + + /vue-tsc@1.8.22(typescript@5.3.2): + resolution: {integrity: sha512-j9P4kHtW6eEE08aS5McFZE/ivmipXy0JzrnTgbomfABMaVKx37kNBw//irL3+LlE3kOo63XpnRigyPC3w7+z+A==} + hasBin: true + peerDependencies: + typescript: '*' + dependencies: + '@volar/typescript': 1.10.10 + '@vue/language-core': 1.8.22(typescript@5.3.2) + semver: 7.5.4 + typescript: 5.3.2 + dev: true + + /wagmi@1.4.7(@types/react@18.2.39)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.2)(viem@1.19.9): + resolution: {integrity: sha512-/k8gA9S6RnwU6Qroxs630jAFvRIx+DSKpCP1owgAEGWc7D2bAJHljwRSCRTGENz48HyJ4V3R7KYV1yImxPvM3A==} + peerDependencies: + react: '>=17.0.0' + typescript: '>=5.0.4' + viem: '>=0.3.35' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@tanstack/query-sync-storage-persister': 4.36.1 + '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query-persist-client': 4.36.1(@tanstack/react-query@4.36.1) + '@wagmi/core': 1.4.7(@types/react@18.2.39)(react@18.2.0)(typescript@5.3.2)(viem@1.19.9) + abitype: 0.8.7(typescript@5.3.2) + react: 18.2.0 + typescript: 5.3.2 + use-sync-external-store: 1.2.0(react@18.2.0) + viem: 1.19.9(typescript@5.3.2) + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - '@types/react' + - bufferutil + - encoding + - immer + - lokijs + - react-dom + - react-native + - supports-color + - utf-8-validate + - zod + + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: false + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + /which-pm@2.0.0: + resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + engines: {node: '>=8.15'} + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: true + + /which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /ws@7.5.9: + resolution: {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 + + /ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /ws@8.14.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + + /xstream@11.14.0: + resolution: {integrity: sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw==} + dependencies: + globalthis: 1.0.3 + symbol-observable: 2.0.3 + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: false + + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + dev: true + + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /z-schema@5.0.5: + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + lodash.get: 4.4.2 + lodash.isequal: 4.5.0 + validator: 13.11.0 + optionalDependencies: + commander: 9.5.0 + dev: true + + /zustand@4.4.7(@types/react@18.2.39)(react@18.2.0): + resolution: {integrity: sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + dependencies: + '@types/react': 18.2.39 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..3ed6256 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,4 @@ +packages: + - 'packages/*' + - 'examples/*' + - 'website' diff --git a/website/index.html b/website/index.html new file mode 100644 index 0000000..81ca526 --- /dev/null +++ b/website/index.html @@ -0,0 +1,28 @@ + + + + + + + + + + UploadKit + + + + +
+ + + diff --git a/website/package.json b/website/package.json new file mode 100644 index 0000000..ee0c2ec --- /dev/null +++ b/website/package.json @@ -0,0 +1,49 @@ +{ + "name": "website", + "version": "0.0.1", + "author": "node-real", + "private": "true", + "type": "module", + "homepage": "https://node-real.github.io/walletkit", + "scripts": { + "dev": "vite --host 0.0.0.0", + "build": "tsc && vite build" + }, + "dependencies": { + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@mdx-js/mdx": "~2.1.5", + "@mdx-js/react": "~2.2.1", + "@totejs/icons": "^2.19.0", + "@totejs/uikit": "^2.54.2", + "@totejs/walletkit": "^1.0.8", + "@node-real/greenfield-uploadkit": "workspace:*", + "@bnb-chain/greenfield-cosmos-types": "0.4.0-alpha.30", + "@bnb-chain/greenfield-js-sdk": "1.2.0", + "@bnb-chain/reed-solomon": "^1.1.3", + "prism-react-renderer": "~1.3.5", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-live": "~2.4.1", + "react-router-dom": "~6.6.2", + "unified": "~10.1.2", + "unist-util-visit": "~4.1.2", + "viem": "^1.19.9", + "wagmi": "^1.4.7" + }, + "devDependencies": { + "@mdx-js/rollup": "~2.2.1", + "@types/mdx": "~2.0.10", + "@types/node": "~18.6.5", + "@types/react": "^18.2.39", + "@types/react-dom": "^18.2.17", + "@vitejs/plugin-react": "~4.1.1", + "remark-gfm": "~3.0.1", + "ts-node": "~10.9.1", + "typescript": "^5.3.2", + "vite": "~4.5.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" + } +} diff --git a/website/plugins/rehype-code-meta.ts b/website/plugins/rehype-code-meta.ts new file mode 100644 index 0000000..d9fd73d --- /dev/null +++ b/website/plugins/rehype-code-meta.ts @@ -0,0 +1,16 @@ +import { Plugin } from 'unified'; +import { visit } from 'unist-util-visit'; + +export const rehypeMdxCodeMeta: Plugin = () => { + return (tree) => { + visit(tree, 'element', (node: any) => { + if (node.tagName !== 'code' || !node.data) return; + + node.properties = node.properties || {}; + node.data.meta.split(' ').forEach((t: string) => { + const [key, value] = t.split('='); + node.properties[key] = value; + }); + }); + }; +}; diff --git a/website/src/App.tsx b/website/src/App.tsx new file mode 100644 index 0000000..fa45360 --- /dev/null +++ b/website/src/App.tsx @@ -0,0 +1,21 @@ +import '@totejs/walletkit/styles.css'; +import '@node-real/greenfield-uploadkit/styles.css'; +import { ThemeProvider } from '@totejs/uikit'; +import { Routes, Route } from 'react-router-dom'; + +import { theme } from './theme'; +import { Layout } from './components/Layout'; +import DocsPage from './pages/index.mdx'; +import { MDXComponents } from './components/MDXComponent'; + +export default function App() { + return ( + + + + } /> + + + + ); +} diff --git a/website/src/components/CodeBlock/CopyButton/index.tsx b/website/src/components/CodeBlock/CopyButton/index.tsx new file mode 100644 index 0000000..7825bf1 --- /dev/null +++ b/website/src/components/CodeBlock/CopyButton/index.tsx @@ -0,0 +1,15 @@ +import { Button, useClipboard } from '@totejs/uikit'; + +interface CopyButtonProps { + code: string; +} + +export default function CopyButton({ code }: CopyButtonProps) { + const { hasCopied, onCopy } = useClipboard(code); + + return ( + + ); +} diff --git a/website/src/components/CodeBlock/Highlight/index.tsx b/website/src/components/CodeBlock/Highlight/index.tsx new file mode 100644 index 0000000..65fe76d --- /dev/null +++ b/website/src/components/CodeBlock/Highlight/index.tsx @@ -0,0 +1,34 @@ +import { Box } from '@totejs/uikit'; +import BaseHighlight, { Language, defaultProps, PrismTheme } from 'prism-react-renderer'; + +import CopyButton from '../CopyButton'; +import { EditorStyles } from '../styles'; + +export interface HighlightProps { + rawCode: string; + language: Language; + theme: PrismTheme; +} + +export default function Highlight(props: HighlightProps) { + const { rawCode, language, ...otherProps } = props; + + return ( + + {({ className, style, tokens, getLineProps, getTokenProps }) => ( + +
+            {tokens.map((line, i) => (
+              
+ {line.map((token, key) => ( + + ))} +
+ ))} +
+ +
+ )} +
+ ); +} diff --git a/website/src/components/CodeBlock/LiveCode/index.tsx b/website/src/components/CodeBlock/LiveCode/index.tsx new file mode 100644 index 0000000..3297f70 --- /dev/null +++ b/website/src/components/CodeBlock/LiveCode/index.tsx @@ -0,0 +1,40 @@ +import { useState } from 'react'; +import { LiveProvider, LiveEditor, LiveError, LivePreview } from 'react-live'; +import { Language, PrismTheme } from 'prism-react-renderer'; +import { Box } from '@totejs/uikit'; + +import scope from './scope'; +import { EditorStyles, PreviewStyles } from '../styles'; +import CopyButton from '../CopyButton'; + +export interface LiveCodeProps { + rawCode: string; + language: Language; + theme: PrismTheme; +} + +export default function LiveCode(props: LiveCodeProps) { + const { rawCode, language, ...otherProps } = props; + const [editorCode, setEditorCode] = useState(rawCode); + + const onChange = (newCode: string) => { + setEditorCode(newCode.trim()); + }; + + const liveProviderProps = { + code: editorCode, + scope, + ...otherProps, + }; + + return ( + + + + + + + + + ); +} diff --git a/website/src/components/CodeBlock/LiveCode/scope.tsx b/website/src/components/CodeBlock/LiveCode/scope.tsx new file mode 100644 index 0000000..7c32e3b --- /dev/null +++ b/website/src/components/CodeBlock/LiveCode/scope.tsx @@ -0,0 +1,19 @@ +import * as icon from '@totejs/icons'; +import * as uikit from '@totejs/uikit'; +import * as walletkit from '@totejs/walletkit'; +import React from 'react'; +import * as wagmi from 'wagmi'; + +import { chains } from '../../UploadKit/chains'; + +const scope = { + React, + chains, + ...icon, + ...uikit, + ...React, + ...walletkit, + ...wagmi, +}; + +export default scope; diff --git a/website/src/components/CodeBlock/index.tsx b/website/src/components/CodeBlock/index.tsx new file mode 100644 index 0000000..8720f3d --- /dev/null +++ b/website/src/components/CodeBlock/index.tsx @@ -0,0 +1,26 @@ +import { useEffect, useState } from 'react'; +import theme from 'prism-react-renderer/themes/nightOwl'; + +import LiveCode from './LiveCode'; +import Highlight from './Highlight'; + +export default function CodeBlock(props: any) { + const [isMounted, setIsMounted] = useState(false); + + useEffect(() => { + setIsMounted(true); + }, []); + + const { children, className, live = true } = props; + + const _live = live === 'true' || live === true; + + const language = className?.replace('language-', ''); + const rawCode = children.trim(); + + if (isMounted && _live && language === 'jsx') { + return ; + } + + return ; +} diff --git a/website/src/components/CodeBlock/styles.tsx b/website/src/components/CodeBlock/styles.tsx new file mode 100644 index 0000000..a893e62 --- /dev/null +++ b/website/src/components/CodeBlock/styles.tsx @@ -0,0 +1,25 @@ +export const EditorStyles = { + position: 'relative' as any, + marginTop: 12, + marginBottom: 12, + borderRadius: 8, + padding: 10, + background: '#011627', + sx: { + '> pre': { + w: '100%', + overflowX: 'auto', + '.token-line:first-of-type:last-of-type': { + lineHeight: '24px', + }, + }, + }, +}; + +export const PreviewStyles = { + marginTop: 12, + marginBottom: 12, + borderRadius: 8, + padding: 10, + borderWidth: 1, +}; diff --git a/website/src/components/Layout/Header/index.tsx b/website/src/components/Layout/Header/index.tsx new file mode 100644 index 0000000..39fb29b --- /dev/null +++ b/website/src/components/Layout/Header/index.tsx @@ -0,0 +1,40 @@ +import { Flex, HStack, Heading, IconButton, Link } from '@totejs/uikit'; + +import { GitHubIcon } from '../../SvgIcon/GitHubIcon'; +import { SwitchColorMode } from '../SwitchColorMode'; + +export function Header() { + return ( + <> + + + + Greenfield UploadKit + + + } color="readable.normal" /> + + + + + + ); +} diff --git a/website/src/components/Layout/SwitchColorMode/index.tsx b/website/src/components/Layout/SwitchColorMode/index.tsx new file mode 100644 index 0000000..f161005 --- /dev/null +++ b/website/src/components/Layout/SwitchColorMode/index.tsx @@ -0,0 +1,35 @@ +import { MoonIcon, SunIcon } from '@totejs/icons'; +import { Circle, Flex, useColorMode } from '@totejs/uikit'; + +export function SwitchColorMode() { + const { colorMode, toggleColorMode } = useColorMode(); + + return ( + + + + + + + + + ); +} diff --git a/website/src/components/Layout/index.tsx b/website/src/components/Layout/index.tsx new file mode 100644 index 0000000..9b0ea21 --- /dev/null +++ b/website/src/components/Layout/index.tsx @@ -0,0 +1,15 @@ +import { Box, Flex } from '@totejs/uikit'; +import { Header } from './Header'; + +export function Layout(props: React.PropsWithChildren) { + return ( + + +
+ + {props.children} + + + + ); +} diff --git a/website/src/components/MDXComponent/index.tsx b/website/src/components/MDXComponent/index.tsx new file mode 100644 index 0000000..be90009 --- /dev/null +++ b/website/src/components/MDXComponent/index.tsx @@ -0,0 +1,40 @@ +import * as UIKit from '@totejs/uikit'; + +import CodeBlock from '../CodeBlock'; +import PropsTable from '../PropsTable'; +import UploadKitExample from '../UploadKit'; + +export const MDXComponents = { + PropsTable, + UploadKitExample, + h1: (props: any) => , + h2: (props: any) => { + const { children, ...restProps } = props; + + return ( + + + {children} + + ); + }, + h3: (props: any) => , + h4: (props: any) => , + code: (props: any) => { + if (props.className) { + return ; + } + return ; + }, + pre: (props: any) => , + p: (props: any) => , + table: (props: any) => ( + + ), + thead: (props: any) => , + tr: (props: any) => , + th: (props: any) => , + td: (props: any) => , + ul: (props: any) =>
    , + a: (props: any) => , +}; diff --git a/website/src/components/PropsTable/index.tsx b/website/src/components/PropsTable/index.tsx new file mode 100644 index 0000000..b13905f --- /dev/null +++ b/website/src/components/PropsTable/index.tsx @@ -0,0 +1,75 @@ +import { Box, Flex, Text } from '@totejs/uikit'; + +interface RowProps { + name: string; + value: any; +} + +function Row(props: RowProps) { + const { name, value } = props; + return ( + + + {name}: + + {value + ''} + + ); +} + +interface PropItem { + name: string; + required: boolean; + type: string; + default: string | boolean; + desc: string; +} + +interface PropsTableProps { + data: Array; +} + +export default function PropsTable(props: PropsTableProps) { + const { data } = props; + + return ( + + {data.map((item, index) => { + return ( + + + + {item.name} + + {item.required && ( + + required + + )} + + + {item.type !== undefined && } + {item.default !== undefined && } + {item.desc !== undefined && } + + + ); + })} + + ); +} diff --git a/website/src/components/SvgIcon/GitHubIcon.tsx b/website/src/components/SvgIcon/GitHubIcon.tsx new file mode 100644 index 0000000..6f80c05 --- /dev/null +++ b/website/src/components/SvgIcon/GitHubIcon.tsx @@ -0,0 +1,7 @@ +import { Icon, IconProps } from '@totejs/icons'; + +export const GitHubIcon = (props: IconProps) => ( + + + +); diff --git a/website/src/components/UploadKit/chains.ts b/website/src/components/UploadKit/chains.ts new file mode 100644 index 0000000..9834634 --- /dev/null +++ b/website/src/components/UploadKit/chains.ts @@ -0,0 +1,78 @@ +import { bsc, mainnet } from 'wagmi/chains'; + +export const chains = [ + { + id: 5600, + name: 'BNB Greenfield Testnet', + network: 'BNB Greenfield Testnet', + nativeCurrency: { + name: 'tBNB', + symbol: 'tBNB', + decimals: 18, + }, + rpcUrls: { + default: { + http: ['https://gnfd-testnet-fullnode-tendermint-us.bnbchain.org'], + }, + public: { + http: ['https://gnfd-testnet-fullnode-tendermint-us.bnbchain.org'], + }, + }, + blockExplorers: { + etherscan: { + name: `BNB Greenfield Testnet Scan`, + url: 'https://greenfield-chain.bnbchain.org', + }, + default: { + name: `BNB Greenfield Testnet Scan`, + url: 'https://greenfield-chain.bnbchain.org', + }, + }, + }, + { + id: 204, + name: 'opBNB Mainnet', + network: 'opBNB Mainnet', + nativeCurrency: { + name: 'tcBNB', + symbol: 'tcBNB', + decimals: 18, + }, + rpcUrls: { + default: { + http: ['https://opbnb-mainnet-rpc.bnbchain.org'], + }, + public: { + http: ['https://opbnb-mainnet-rpc.bnbchain.org'], + }, + }, + blockExplorers: { + etherscan: { name: 'opBNBScan', url: `https://mainnet.opbnbscan.com` }, + default: { name: 'opBNBScan', url: `https://mainnet.opbnbscan.com` }, + }, + }, + { + id: 97, + name: 'BSC Testnet', + network: 'BSC Testnet', + nativeCurrency: { + name: 'tBNB', + symbol: 'tBNB', + decimals: 18, + }, + rpcUrls: { + default: { + http: [`https://data-seed-prebsc-1-s1.binance.org:8545`], + }, + public: { + http: [`https://data-seed-prebsc-1-s1.binance.org:8545`], + }, + }, + blockExplorers: { + etherscan: { name: 'BSC Testnet Scan', url: `https://testnet.bscscan.com` }, + default: { name: 'BSC Testnet Scan', url: `https://testnet.bscscan.com` }, + }, + }, + bsc, + mainnet, +]; diff --git a/website/src/components/UploadKit/client.ts b/website/src/components/UploadKit/client.ts new file mode 100644 index 0000000..dbec588 --- /dev/null +++ b/website/src/components/UploadKit/client.ts @@ -0,0 +1,9 @@ +import { Client } from '@bnb-chain/greenfield-js-sdk'; + +const GRPC_URL = 'https://gnfd-testnet-fullnode-tendermint-us.bnbchain.org'; + +const GREEN_CHAIN_ID = 5600; + +export const client = Client.create(GRPC_URL, String(GREEN_CHAIN_ID), { + zkCryptoUrl: 'https://unpkg.com/@bnb-chain/greenfield-zk-crypto@0.0.3/dist/node/zk-crypto.wasm', +}); diff --git a/website/src/components/UploadKit/index.tsx b/website/src/components/UploadKit/index.tsx new file mode 100644 index 0000000..479d5dc --- /dev/null +++ b/website/src/components/UploadKit/index.tsx @@ -0,0 +1,61 @@ +import { WagmiConfig, createConfig } from 'wagmi'; + +import { + WalletKitButton, + WalletKitProvider, + getDefaultConfig, + WalletKitOptions, + SwitchNetworkModal, +} from '@totejs/walletkit'; +import { metaMask, trustWallet, walletConnect } from '@totejs/walletkit/wallets'; +import { + UploadKitProvider, + UploadKitOptions, + UploadKitButton, +} from '@node-real/greenfield-uploadkit'; + +import { chains } from './chains'; +import { Box, useColorMode } from '@totejs/uikit'; +import { client } from './client'; + +const config = createConfig( + getDefaultConfig({ + appName: 'WalletKit', + chains, + walletConnectProjectId: 'e68a1816d39726c2afabf05661a32767', // + autoConnect: false, + connectors: [trustWallet(), metaMask(), walletConnect()], + }), +); + +const options: WalletKitOptions = { + initialChainId: 5600, // Once connected to the wallet, which chain you want to use +}; + +const uploadOptions: UploadKitOptions = { + client: client, + sp: { + operatorAddress: '0x89A1CC91B642DECbC4789474694C606E0E0c420b', + endpoint: 'https://gnfd-testnet-sp1.bnbchain.org', + }, + visibility: 'VISIBILITY_TYPE_PRIVATE', +}; + +export default function App() { + const { colorMode } = useColorMode(); + + return ( + + + + + +
    + + +
    +
    +
    +
    + ); +} diff --git a/website/src/global.d.ts b/website/src/global.d.ts new file mode 100644 index 0000000..7131ee1 --- /dev/null +++ b/website/src/global.d.ts @@ -0,0 +1,8 @@ +interface MenuItem { + label: string; + path: string; + icon?: React.ReactNode; + element?: any; + redirect?: string; + children?: MenuItem[]; +} diff --git a/website/src/main.tsx b/website/src/main.tsx new file mode 100644 index 0000000..b9028cb --- /dev/null +++ b/website/src/main.tsx @@ -0,0 +1,13 @@ +import ReactDOM from 'react-dom/client'; +import { ColorModeScript } from '@totejs/uikit'; +import { HashRouter } from 'react-router-dom'; + +import App from './App'; +import { theme } from './theme'; + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + + , +); diff --git a/website/src/pages/index.mdx b/website/src/pages/index.mdx new file mode 100644 index 0000000..c5ac9de --- /dev/null +++ b/website/src/pages/index.mdx @@ -0,0 +1,356 @@ +# Quick start + +## Installation + +```bash +npm i wagmi viem @bnb-chain/greenfield-js-sdk @bnb-chain/greenfield-cosmos-types @bnb-chain/reed-solomon +``` + +- wagmi > 1.0.0 +- viem > 1.0.0 +- @bnb-chain/greenfield-js-sdk >= 1.2.0 +- @bnb-chain/reed-solomon >= 1.1.3 +- @bnb-chain/greenfield-cosmos-types >= 0.4.0-alpha.30 + +## Examples + +- [nextjs-with-walletkit](https://github.com/node-real/greenfield-uploadkit/examples/nextjs-with-walletkit) +- [nextjs-with-rainbowkit](https://github.com/node-real/greenfield-uploadkit/examples/nextjs-with-rainbowkitnextjs-with-rainbowkit) +- [vite-with-walletkit](https://github.com/node-real/greenfield-uploadkit/examples/vite-with-walletkit) + +## Playground + +In this example, we use [@totejs/walletkit](https://github.com/node-real/walletkit) as the component +for connecting the wallet. + + + +## How to use + +### 1. Import @node-real/greenfield-uploadkit styles + +```tsx live=false +// 👇 Import @node-real/greenfield-uploadkit styles here. +import '@node-real/greenfield-uploadkit/styles.css'; + +import { WagmiConfig, createConfig } from 'wagmi'; +import { chains } from './chains'; +// ... +``` + +### 2. Add chain configurations + +```tsx live=false +import { bsc, bscTestnet } from 'wagmi/chains'; + +export const chains = [ + { + id: 5600, + name: 'BNB Greenfield Chain Testnet', + network: 'BNB Greenfield Chain Testnet', + nativeCurrency: { + name: 'BNB', + symbol: 'tBNB', + decimals: 18, + }, + rpcUrls: { + default: { + http: ['https://gnfd-testnet-fullnode-tendermint-us.bnbchain.org'], + }, + public: { + http: ['https://gnfd-testnet-fullnode-tendermint-us.bnbchain.org'], + }, + }, + blockExplorers: { + etherscan: { + name: `BNB Greenfield Chain Testnet Scan`, + url: 'https://testnet.greenfieldscan.com', + }, + default: { + name: `BNB Greenfield Chain Testnet Scan`, + url: 'https://testnet.greenfieldscan.com', + }, + }, + }, + { + id: 1017, + name: 'BNB Greenfield Chain', + network: 'BNB Greenfield Chain', + nativeCurrency: { + name: 'BNB', + symbol: 'BNB', + decimals: 18, + }, + rpcUrls: { + default: { + http: ['https://greenfield-chain.bnbchain.org'], + }, + public: { + http: ['https://greenfield-chain.bnbchain.org'], + }, + }, + blockExplorers: { + etherscan: { + name: `BNB Greenfield Mainnet Scan`, + url: 'https://greenfieldscan.com', + }, + default: { + name: `BNB Greenfield Mainnet Scan`, + url: 'https://greenfieldscan.com', + }, + }, + }, + bscTestnet, + bsc, +]; +``` + +### 3. Add client configurations + +```tsx live=false +import { Client } from '@bnb-chain/greenfield-js-sdk'; + +const GRPC_URL = 'https://gnfd-testnet-fullnode-tendermint-us.bnbchain.org'; + +const GREEN_CHAIN_ID = 5600; + +export const client = Client.create(GRPC_URL, String(GREEN_CHAIN_ID), { + zkCryptoUrl: 'https://unpkg.com/@bnb-chain/greenfield-zk-crypto@0.0.3/dist/node/zk-crypto.wasm', +}); +``` + +### 3. Add @totejs/walletkit as the wallet connection library, or connect with rainbowkit or wamgi. + +```bash +npm install @totejs/walletkit +``` + +### 4. Add WagmiConfig, WalletKitProvider and UploadKitProvider to your project. + +```tsx live=false +import { WagmiConfig, createConfig } from 'wagmi'; +import { + SwitchNetworkModal, + WalletKitButton, + WalletKitOptions, + WalletKitProvider, + getDefaultConfig, +} from '@totejs/walletkit'; +import { trustWallet, metaMask, walletConnect } from '@totejs/walletkit/wallets'; +import { + UploadKitButton, + UploadKitOptions, + UploadKitProvider, +} from '@node-real/greenfield-uploadkit'; +import { chains } from './chains'; +import { client } from './client'; + +import '@node-real/greenfield-uploadkit/styles.css'; +import '@totejs/walletkit/styles.css'; + +const config = createConfig( + getDefaultConfig({ + autoConnect: true, + appName: 'WalletKit', + + /* WC 2.0 requires a project ID (get one here: https://cloud.walletconnect.com/sign-in) */ + walletConnectProjectId: '22d482af814af0b8d5ba3d394a28c5fc', + + chains, + connectors: [trustWallet(), metaMask(), walletConnect()], + }), +); + +const options: WalletKitOptions = { + initialChainId: 5600, +}; + +const uploadKitOptions: UploadKitOptions = { + client: client, +}; + +export default function App({ Component, pageProps }: AppProps) { + return ( + + + + + +
    + + +
    +
    +
    + ); +} +``` + +## useUploadModal + +Use the useUploadModal hook to show/dismiss the specific modal. It must be used within a +``. + +- `onOpenDragModal`: Open the drag files modal. +- `onOpenUploadModal`: Open the upload tasks modal. +- `onCloseModal`: Close the upload Modal. + +## useUploadQueue + +Use the useUploadQueue hook to get details about the upload task queue. + +- `uploadQueue`: Details of the upload task queue. + +## useTaskManagementButton + +Use the useTaskManagementButton hook to show/dismiss the bottom -right button. + +- `isShow`: Indicates whether the button is displayed. +- `onShow`: Function to display the button. +- `onHide`: Function to hide the button. + +## Handle upload errors by yourself + +```tsx live=false + + + +``` + +## Customizing theme + +```tsx live=false +type ThemeMode = 'auto' | 'dark' | 'light'; +type ThemeVariant = 'base'; + + + +; +``` + +An example for custom theme as follows, or you can configure themes in both light and dark modes, +for more details, please click [here](). + +```tsx live=false +export const customTheme = { + light: { + colors: { + text: '#1E2026', + textSecondary: '#76808F', + error: '#D9304E', + errorActive: '#B82942', + border: '#E6E8EA', + disabled: '#AEB4BC', + blue: '#1184EE', + + bgNormal: '#fff', + bgBottom: '#F5F5F5', + + modalBackground: '#fff', + modalOverlay: 'rgba(0, 0, 0, 0.5)', + + totalFeeLabel: '#474D57', + + buttonText: '#fff', + buttonTextHover: 'var(--uk-colors-text)', + buttonBackground: '#1E2026', + buttonBackgroundHover: rgba('#F0B90B', 0.1), + + uploadKitButtonText: 'var(--uk-colors-text)', + uploadKitButtonTextHover: 'var(--uk-colors-text)', + uploadKitButtonBackground: '#f5f5f5', + uploadKitButtonBackgroundHover: '#e6e8ea', + + navButtonText: 'var(--uk-colors-textSecondary)', + navButtonBackgroundHover: 'var(--uk-colors-border)', + + toastBackground: 'var(--uk-colors-modalBackground)', + }, + shadows: { + toast: '0px 4px 24px rgba(0, 0, 0, 0.08)', + button: '0px 4px 24px 0px rgba(0, 0, 0, 0.08)', + }, + radii, + zIndices, + }, + dark: { + colors: { + text: '#fff', + textSecondary: '#76808F', + error: '#D9304E', + errorActive: '#B82942', + border: '#2e323a', + disabled: '#5E6673', + blue: '#1184EE', + + bgBottom: '#000', + bgNormal: '#1E2026', + + modalBackground: '#1E2026', + modalOverlay: rgba('#000', 0.5), + + totalFeeLabel: '#fff', + buttonText: 'var(--uk-colors-text)', + buttonTextHover: 'var(--uk-colors-text)', + buttonBackground: '#14151a', + buttonBackgroundHover: rgba('#F0B90B', 0.1), + + uploadKitButtonText: 'var(--uk-colors-text)', + uploadKitButtonTextHover: 'var(--uk-colors-text)', + uploadKitButtonBackground: '#2b2f36', + uploadKitButtonBackgroundHover: '#2e323a', + + navButtonText: 'var(--uk-colors-textSecondary)', + navButtonBackgroundHover: 'var(--uk-colors-border)', + + toastBackground: 'var(--uk-colors-modalBackground)', + }, + shadows: { + toast: '0px 4px 24px rgba(0, 0, 0, 0.08)', + button: '0px 4px 24px 0px rgba(0, 0, 0, 0.08)', + }, + radii, + zIndices, + }, +}; +``` + +## Type definitions + +### 1. UploadKitProviderProps + +```tsx live=false +export interface UploadKitProviderProps { + options: UploadKitOptions; + children: React.ReactNode; + theme?: ThemeVariant; + mode?: ThemeMode; + customTheme?: CustomTheme; +} +``` + +### 2. UploadKitOptions + +```tsx live=false +export interface UploadKitOptions { + client: Client; + seedString?: string; + checksumFn?: (file: File) => Promise; + bucketName?: string; + sp?: Sp; + visibility?: keyof typeof VisibilityType; + maxObjectSize?: number; + maxObjectCount?: number; + taskManagementButton?: boolean; + closeModalAfterConnected?: boolean; + closeModalOnEsc?: boolean; + closeModalOnOverlayClick?: boolean; + onError?: (errorMsg: string) => void; +} +``` diff --git a/website/src/theme/index.tsx b/website/src/theme/index.tsx new file mode 100644 index 0000000..17906a2 --- /dev/null +++ b/website/src/theme/index.tsx @@ -0,0 +1,10 @@ +import { Theme } from '@totejs/uikit'; + +export const theme: Theme = { + config: { + useSystemColorMode: false, + initialColorMode: 'system', + storageType: 'localStorage', + storageKey: 'uploadkit-color-mode', + }, +}; diff --git a/website/src/vite-env.d.ts b/website/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/website/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/website/tsconfig.json b/website/tsconfig.json new file mode 100644 index 0000000..a7fc6fb --- /dev/null +++ b/website/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/website/tsconfig.node.json b/website/tsconfig.node.json new file mode 100644 index 0000000..2308f1d --- /dev/null +++ b/website/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["plugins", "vite.config.ts"] +} diff --git a/website/vite.config.ts b/website/vite.config.ts new file mode 100644 index 0000000..9c0b62e --- /dev/null +++ b/website/vite.config.ts @@ -0,0 +1,23 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import mdx from '@mdx-js/rollup'; +import remarkGfm from 'remark-gfm'; + +import { rehypeMdxCodeMeta } from './plugins/rehype-code-meta'; + +const mdxOptions = { + remarkPlugins: [remarkGfm], + rehypePlugins: [rehypeMdxCodeMeta], +}; + +export default defineConfig({ + base: './', + server: { + port: 8002, + open: true, + fs: { + strict: false, + }, + }, + plugins: [react(), mdx(mdxOptions)], +});