From fe667ded573f4f5ded8a427636bdfee940c9454b Mon Sep 17 00:00:00 2001 From: phroi <90913182+phroi@users.noreply.github.com> Date: Tue, 5 May 2026 16:59:14 +0000 Subject: [PATCH 1/3] refactor: start interface CCC migration Move apps/interface onto the workspace CCC packages so the UI can exercise the current preview, request, and collect flows without the old Lumos stack. Keep this as a preliminary migration by landing the new transaction wiring, failure handling, and local build setup first. --- apps/interface/README.md | 32 +- apps/interface/package.json | 39 +- apps/interface/pnpm-lock.yaml | 4431 ----------------------------- apps/interface/src/Action.tsx | 190 +- apps/interface/src/App.tsx | 111 +- apps/interface/src/Connector.tsx | 73 +- apps/interface/src/Dashboard.tsx | 1 + apps/interface/src/Form.tsx | 111 +- apps/interface/src/main.tsx | 72 +- apps/interface/src/queries.ts | 495 +--- apps/interface/src/transaction.ts | 539 ++-- apps/interface/src/utils.ts | 219 +- apps/interface/vite.config.ts | 34 + pnpm-lock.yaml | 39 +- 14 files changed, 903 insertions(+), 5483 deletions(-) delete mode 100644 apps/interface/pnpm-lock.yaml diff --git a/apps/interface/README.md b/apps/interface/README.md index d767026..05c8c89 100644 --- a/apps/interface/README.md +++ b/apps/interface/README.md @@ -1,37 +1,47 @@ -# iCKB interface +# iCKB Interface -## Run the web interface locally +iCKB interface built on top of CCC and the workspace `@ickb/*` packages. -1. Download this repo in a folder of your choice: +## Run locally + +1. Clone the monorepo: ```bash git clone https://github.com/ickb/stack.git ``` -2. Enter into the repo folder: +2. Enter the repo root: ```bash -cd stack/apps/interface +cd stack ``` -3. Install dependencies: +3. Install dependencies and materialize the local CCC workspace: ```bash +pnpm forks:bootstrap pnpm install +pnpm forks:ccc ``` -4. Build project: +4. Start the interface dev server from the repo root: ```bash -pnpm build +pnpm --filter ./apps/interface dev ``` -5. Preview the interface: +That script builds the workspace `@ickb/*` package `dist/` outputs first because the interface resolves those packages to their built CCC-compatible entrypoints during local development. + +5. Build the interface when you want a production bundle: ```bash -pnpm run preview; +pnpm --filter ./apps/interface build ``` +Like `dev`, the build script refreshes those workspace package `dist/` outputs first so a clean checkout does not rely on stale generated files. + +The interface now uses CCC-native wallet connection and transaction completion. Protocol-specific transaction construction comes from `@ickb/sdk`, then the app completes iCKB UDT balance, CKB capacity, and fees before sending. + ## Licensing -This source code, crafted with care by [Phroi](https://phroi.com/), is freely available on [GitHub](https://github.com/ickb/stack.git) and it is released under the [MIT License](../../LICENSE). \ No newline at end of file +This source code, crafted with care by [Phroi](https://phroi.com/), is freely available on [GitHub](https://github.com/ickb/stack) and it is released under the [MIT License](../../LICENSE). diff --git a/apps/interface/package.json b/apps/interface/package.json index e5932e7..5bf09ce 100644 --- a/apps/interface/package.json +++ b/apps/interface/package.json @@ -1,19 +1,29 @@ { - "name": "interface", - "version": "1.4.3", - "description": "iCKB Web DApp", + "name": "@ickb/interface", + "version": "1001.0.0", + "description": "iCKB interface built on top of CCC", + "keywords": [ + "ickb", + "ccc", + "ckb", + "blockchain" + ], "author": "phroi", "license": "MIT", - "private": false, - "homepage": "https://github.com/ickb/interface", + "homepage": "https://ickb.org", "repository": { "type": "git", - "url": "git://github.com/ickb/interface.git" + "url": "https://github.com/ickb/stack" + }, + "bugs": { + "url": "https://github.com/ickb/stack/issues" }, + "sideEffects": false, "type": "module", + "private": false, "scripts": { - "dev": "vite", - "build": "tsc && vite build", + "dev": "pnpm --filter @ickb/core --filter @ickb/order --filter @ickb/sdk --filter @ickb/utils build && vite", + "build": "pnpm --filter @ickb/core --filter @ickb/order --filter @ickb/sdk --filter @ickb/utils build && tsc && vite build", "preview": "vite preview", "lint": "eslint ./src", "clean": "rm -fr dist", @@ -34,16 +44,11 @@ }, "dependencies": { "@ckb-ccc/ccc": "catalog:", - "@ckb-lumos/base": "^0.23.0", - "@ckb-lumos/codec": "^0.23.0", - "@ckb-lumos/common-scripts": "^0.23.0", - "@ckb-lumos/config-manager": "^0.23.0", - "@ckb-lumos/helpers": "^0.23.0", - "@ckb-lumos/rpc": "^0.23.0", - "@ickb/lumos-utils": "1.4.2", - "@ickb/v1-core": "1.4.2", + "@ickb/core": "workspace:*", + "@ickb/order": "workspace:*", + "@ickb/sdk": "workspace:*", + "@ickb/utils": "workspace:*", "@tanstack/react-query": "^5.90.5", - "immutable": "^4.3.7", "react": "^19.2.0", "react-dom": "^19.2.0" } diff --git a/apps/interface/pnpm-lock.yaml b/apps/interface/pnpm-lock.yaml deleted file mode 100644 index dc35e0f..0000000 --- a/apps/interface/pnpm-lock.yaml +++ /dev/null @@ -1,4431 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@ckb-ccc/ccc': - specifier: ^1.1.17 - version: 1.1.17(typescript@5.9.2)(zod@3.24.1) - '@ckb-lumos/base': - specifier: ^0.23.0 - version: 0.23.0 - '@ckb-lumos/codec': - specifier: ^0.23.0 - version: 0.23.0 - '@ckb-lumos/common-scripts': - specifier: ^0.23.0 - version: 0.23.0 - '@ckb-lumos/config-manager': - specifier: ^0.23.0 - version: 0.23.0 - '@ckb-lumos/helpers': - specifier: ^0.23.0 - version: 0.23.0 - '@ckb-lumos/rpc': - specifier: ^0.23.0 - version: 0.23.0 - '@ickb/lumos-utils': - specifier: 1.4.2 - version: 1.4.2 - '@ickb/v1-core': - specifier: 1.4.2 - version: 1.4.2 - '@tanstack/react-query': - specifier: ^5.85.5 - version: 5.85.5(react@19.1.1) - immutable: - specifier: ^4.3.7 - version: 4.3.7 - react: - specifier: ^19.1.1 - version: 19.1.1 - react-dom: - specifier: ^19.1.1 - version: 19.1.1(react@19.1.1) - devDependencies: - '@babel/preset-react': - specifier: ^7.27.1 - version: 7.27.1(@babel/core@7.28.3) - '@eslint/js': - specifier: ^9.34.0 - version: 9.34.0 - '@tailwindcss/vite': - specifier: ^4.1.12 - version: 4.1.12(vite@6.3.5(@types/node@22.18.0)(jiti@2.5.1)(lightningcss@1.30.1)) - '@types/node': - specifier: ^22.18.0 - version: 22.18.0 - '@types/react': - specifier: ^19.1.12 - version: 19.1.12 - '@types/react-dom': - specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) - '@vitejs/plugin-basic-ssl': - specifier: ^1.2.0 - version: 1.2.0(vite@6.3.5(@types/node@22.18.0)(jiti@2.5.1)(lightningcss@1.30.1)) - '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@6.3.5(@types/node@22.18.0)(jiti@2.5.1)(lightningcss@1.30.1)) - babel-plugin-react-compiler: - specifier: latest - version: 19.1.0-rc.3 - eslint: - specifier: ^9.34.0 - version: 9.34.0(jiti@2.5.1) - eslint-plugin-react-compiler: - specifier: latest - version: 19.1.0-rc.2(eslint@9.34.0(jiti@2.5.1)) - eslint-plugin-react-hooks: - specifier: ^5.2.0 - version: 5.2.0(eslint@9.34.0(jiti@2.5.1)) - eslint-plugin-react-refresh: - specifier: ^0.4.20 - version: 0.4.20(eslint@9.34.0(jiti@2.5.1)) - prettier: - specifier: ^3.6.2 - version: 3.6.2 - prettier-plugin-tailwindcss: - specifier: ^0.6.14 - version: 0.6.14(prettier@3.6.2) - tailwindcss: - specifier: ^4.1.12 - version: 4.1.12 - typescript: - specifier: ^5.9.2 - version: 5.9.2 - typescript-eslint: - specifier: ^8.41.0 - version: 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - vite: - specifier: ^6.3.5 - version: 6.3.5(@types/node@22.18.0)(jiti@2.5.1)(lightningcss@1.30.1) - -packages: - - '@adraffy/ens-normalize@1.10.1': - resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} - - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} - engines: {node: '>=6.9.0'} - - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.27.5': - resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.26.0': - resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.28.3': - resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.26.3': - resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.27.5': - resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.28.3': - resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-annotate-as-pure@7.25.9': - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.25.9': - resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-create-class-features-plugin@7.25.9': - resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-member-expression-to-functions@7.25.9': - resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-module-transforms@7.28.3': - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-optimise-call-expression@7.25.9': - resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-plugin-utils@7.25.9': - resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-plugin-utils@7.27.1': - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-replace-supers@7.25.9': - resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.26.0': - resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.28.3': - resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.26.3': - resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/parser@7.27.5': - resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/parser@7.28.3': - resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/plugin-proposal-private-methods@7.18.6': - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-jsx@7.27.1': - resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-display-name@7.27.1': - resolution: {integrity: sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-development@7.27.1': - resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-self@7.27.1': - resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-source@7.27.1': - resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx@7.27.1': - resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-pure-annotations@7.27.1': - resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-react@7.27.1': - resolution: {integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/template@7.25.9': - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.26.4': - resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.27.4': - resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.28.3': - resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.26.3': - resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.27.6': - resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.28.2': - resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} - engines: {node: '>=6.9.0'} - - '@ckb-ccc/ccc@1.1.17': - resolution: {integrity: sha512-DlvfNqkVLefiRiKAq+DhB1biPV7YD3+hJUs46/C51oux2igDmMvRsPe9kPgLIUKzvitYkPa9Ell3GSOB5/x9cg==} - - '@ckb-ccc/core@1.11.4': - resolution: {integrity: sha512-pcfvqsRqWpyxOldNZ8gOhil+8Xz7oYhXUBLiR29HkgU42H74PuU++AJpDooc0GWQuIbRgsqn69TYk3mit4m0SA==} - - '@ckb-ccc/eip6963@1.0.25': - resolution: {integrity: sha512-/n2qjVuLaLIqgozwYYAXealRQ21R8+whfDUUPunOepC037zc9PEBvSf4In603cfethBfkDbDMQkJUbErE/TjiA==} - - '@ckb-ccc/joy-id@1.0.25': - resolution: {integrity: sha512-Ie2Y2cStEqoaJbrxpk3zMqGRD36a4OOHUTVHVOzKWbsP+Lc+l6XiICpOL/VqRtw30ouP+Mci0Tkj9CSDVW4m8Q==} - - '@ckb-ccc/nip07@1.0.25': - resolution: {integrity: sha512-Ngj4v31hLk7cH2QY0NKMsysbbRb9x848m3Dub4SNeO6rt+LnVqVvB5+dXe/JN53TzGqoMyTa3b9AgVzT6eo4VQ==} - - '@ckb-ccc/okx@1.0.25': - resolution: {integrity: sha512-keRywmB3KbmeE9YeYhI+owUaWvWWYOLrhiModKxcFaqZwfoRLu1YlnHgyXkD7ZDjtxA5GdD/8iNvI3rv/JYEUA==} - - '@ckb-ccc/rei@1.0.25': - resolution: {integrity: sha512-6pQANO7Mew3uf9VWLQY8yjNn0icV84sOge3amLbn+V5BCZ/xJ4oS8HHi7bDuUBBI1pLTWCzKhMukxkbQEwPjHQ==} - - '@ckb-ccc/shell@1.1.17': - resolution: {integrity: sha512-fJtt9ApAglfKMenH98fdhrk8QYVAdPgXFORADX05sq0CCJVXAoxfXw1jigHOmm0FeXKAnjSw8Htv6DhPf4XxAQ==} - - '@ckb-ccc/spore@1.5.9': - resolution: {integrity: sha512-F4bGWMDL62HruV1JaC8kbDB/RcsoenEA2eYOsTKA40af8HyivCYQ53Pz5dhWqzXcle2qUn51en2HVGDNpCxr7Q==} - - '@ckb-ccc/ssri@0.2.15': - resolution: {integrity: sha512-r9P/WAzps5drN6t+hl9Ma0xfX1jvNxhQEl28xe5AcOaFcBt/6QyKn7Dgv/nMfLpjg5kB5/oz970XQv8Xjtpt7Q==} - - '@ckb-ccc/udt@0.1.17': - resolution: {integrity: sha512-zwRsvpFeDbzm2o5oJnyTYliF3vy2KjVY+5ks2x+fOF0n6rjd9XelEcfUj/dRBFA+E3G0QWGVasR6f1xHfTAh1Q==} - - '@ckb-ccc/uni-sat@1.0.25': - resolution: {integrity: sha512-GHLxsEG+CiOZfZYafJudqoPZpI27k4y0DI49efot8PAmU3zKAIzTqq7beDNz0NdsKM3a5KpPXeFIIRngdkmCLw==} - - '@ckb-ccc/utxo-global@1.0.25': - resolution: {integrity: sha512-DEf3B/Qj9EIPbVh/sos8rDUqRs67ggePhwxfJjIkjua6Zam/r6z8T+KUCrqjhRQHHL377eb9uj/qBsGIDO7xAg==} - - '@ckb-ccc/xverse@1.0.25': - resolution: {integrity: sha512-7osxENdJPNRnZ72CDNqcNKmrrjVA7DEZejXHsYmYf0EcC1xca3IpMPqhFxtm2o+cNEN+sC8/lmWmoS4uRTdSoA==} - - '@ckb-lumos/base@0.23.0': - resolution: {integrity: sha512-8aLFsUyWIK0rT7GQlYFuXyiG5lQ2bLRK2GvUsxv5G7I3nJ1UyxjwvVOdtlsR/cwhzOam3ujwqASqBIayBL6GLA==} - engines: {node: '>=12.0.0'} - - '@ckb-lumos/bi@0.23.0': - resolution: {integrity: sha512-KAy+lyVpL+Al4XD+c9tHrA9DSpHkMusyXtTS81aNZi5MyL6F9jrVmFcqLorhfyfl8Fsv2sEjMe5Neo2Y+w/RJQ==} - engines: {node: '>=12.0.0'} - - '@ckb-lumos/ckb-indexer@0.23.0': - resolution: {integrity: sha512-yLODLJzvtz4M6W6OJR4iRbBTUGrKReV2dhVePPjbH/HRkRY6f6J6cEM9+qM2I3QABmaCXeAM3hWvnWU9hjalQQ==} - engines: {node: '>=12.0.0'} - - '@ckb-lumos/codec@0.23.0': - resolution: {integrity: sha512-FwYooXnsFDjlHHnlFnCTB1UbBzV72I0VjkRpeauFk5nQ4+/75xl28ywK3J14M+0aHTnYU9msXUTRDAGqC0CaNQ==} - engines: {node: '>=12.0.0'} - - '@ckb-lumos/common-scripts@0.23.0': - resolution: {integrity: sha512-Dwic0Al94afdGNu+TGAMmZiU5OVF/zvXbzhCvNmkFS25t8BxPdFjGEc0MlWBI4ZSEoGRrC0O+BOxjzfl5VxSYg==} - engines: {node: '>=12.0.0'} - - '@ckb-lumos/config-manager@0.23.0': - resolution: {integrity: sha512-MvNyzGIJTmIpEf5WJB3TkE4icZyZ2HZhFIfJB2SXDRAC84E02jxENPelCnqRbM1rlFHnxjh/5a/oCi5LcXefag==} - engines: {node: '>=12.0.0'} - - '@ckb-lumos/helpers@0.23.0': - resolution: {integrity: sha512-yfD28vSn1BBk8BA+/ivL7pF3rMsx4OPQ+UUJjsQiR1zGdkNR3zhJOecgICeddJGYDTBBDVgwHcuyoekLxQzmGg==} - engines: {node: '>=12.0.0'} - - '@ckb-lumos/light-client@0.23.0': - resolution: {integrity: sha512-O+dbfubDjl0iODiQ8Q+RVJLfuXYNCN6c0am8xEv4vvazLwfw1y/vn6fG/pFu9Mc1GahZ58y9o6fkUgs8ujH3Mg==} - engines: {node: '>=12.0.0'} - - '@ckb-lumos/rpc@0.23.0': - resolution: {integrity: sha512-NEY1Wb2cNMYdHwcZYtd8XZ3CP6WGPd25hcsudoDAFlAt9vjHsPlNiwSS7tcZCZfg1XiJy3taViVgG8pFemgpbA==} - engines: {node: '>=12.0.0'} - - '@ckb-lumos/toolkit@0.23.0': - resolution: {integrity: sha512-7LTsUFfoNCBWJLgh+V/QFnemjGw+y4mmLeQvubwYuJqIPIhIpwKUuKRzkvVG8snA8xVQSfjSSQOs5m3mKp66Kg==} - engines: {node: '>=12.0.0'} - - '@esbuild/aix-ppc64@0.25.2': - resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.2': - resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.2': - resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.25.2': - resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.2': - resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.2': - resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.2': - resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.2': - resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.2': - resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.25.2': - resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.25.2': - resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.25.2': - resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.2': - resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.25.2': - resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.2': - resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.25.2': - resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.25.2': - resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.25.2': - resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.2': - resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.2': - resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.2': - resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.25.2': - resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.2': - resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.25.2': - resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.25.2': - resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/config-array@0.21.0': - resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/config-helpers@0.3.1': - resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.15.2': - resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/js@9.34.0': - resolution: {integrity: sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/plugin-kit@0.3.5': - resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} - - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} - engines: {node: '>=18.18.0'} - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - - '@humanwhocodes/retry@0.4.2': - resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} - engines: {node: '>=18.18'} - - '@ickb/lumos-utils@1.4.2': - resolution: {integrity: sha512-sN9wZ5U9sUhK/hvLkRH7TpTgbweszLKNSOSJ6Ber9EKVqyQ0eD7qnJlGzDudmHt1Z/uEPlWBvD0cYOi61sK8Dg==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - '@ickb/v1-core@1.4.2': - resolution: {integrity: sha512-39UKHX2DnCO9fWvM2nqLnDHLzHFSNuaWmTnNfc8Tg4/XD/1iNhafKsqcQXtExcHXji5iUPtAbGWqA4H8beIlhw==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - '@isaacs/fs-minipass@4.0.1': - resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} - engines: {node: '>=18.0.0'} - - '@joyid/ckb@1.1.2': - resolution: {integrity: sha512-+e+ISF566zaKNhKNSSS5kBw8or4Kb5Xqxe/2jVkUXKkqVHSS02Trrqe0g4IjSyeN9bszzolr1XgStv2hz62tqA==} - - '@joyid/common@0.2.1': - resolution: {integrity: sha512-DjA+Cy0koTCmPzhkhHkPc0icRLE78ktZY46rXHXfkSqxwQIJ/ED/whPoeF5tkTrN+teIC/hfzVRVkEE4zh/ASQ==} - - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} - - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@jridgewell/trace-mapping@0.3.30': - resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} - - '@nervosnetwork/ckb-sdk-utils@0.109.5': - resolution: {integrity: sha512-Tx642hcJWbN8W3KzCIhIo49yzJ8LMqWopQCSBDKuRmwHesO/bvJqYojCVwfrOyROtFOPhgjyiGm5RXBuxm0KpQ==} - - '@nervosnetwork/ckb-types@0.109.5': - resolution: {integrity: sha512-5jQNjFw76YCd+Ppl+0RvBWzxwvWaKfWC5wjVFFdNAieX7xksCHfZFIeow8je7AF8uVypwe56WlLBlblxw9NBBQ==} - - '@noble/ciphers@0.5.3': - resolution: {integrity: sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w==} - - '@noble/curves@1.2.0': - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.3.2': - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@rolldown/pluginutils@1.0.0-beta.27': - resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} - - '@rollup/rollup-android-arm-eabi@4.39.0': - resolution: {integrity: sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.39.0': - resolution: {integrity: sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.39.0': - resolution: {integrity: sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.39.0': - resolution: {integrity: sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.39.0': - resolution: {integrity: sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.39.0': - resolution: {integrity: sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.39.0': - resolution: {integrity: sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.39.0': - resolution: {integrity: sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.39.0': - resolution: {integrity: sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.39.0': - resolution: {integrity: sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-loongarch64-gnu@4.39.0': - resolution: {integrity: sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': - resolution: {integrity: sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.39.0': - resolution: {integrity: sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-musl@4.39.0': - resolution: {integrity: sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.39.0': - resolution: {integrity: sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.39.0': - resolution: {integrity: sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.39.0': - resolution: {integrity: sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-win32-arm64-msvc@4.39.0': - resolution: {integrity: sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.39.0': - resolution: {integrity: sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.39.0': - resolution: {integrity: sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==} - cpu: [x64] - os: [win32] - - '@tailwindcss/node@4.1.12': - resolution: {integrity: sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==} - - '@tailwindcss/oxide-android-arm64@4.1.12': - resolution: {integrity: sha512-oNY5pq+1gc4T6QVTsZKwZaGpBb2N1H1fsc1GD4o7yinFySqIuRZ2E4NvGasWc6PhYJwGK2+5YT1f9Tp80zUQZQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@tailwindcss/oxide-darwin-arm64@4.1.12': - resolution: {integrity: sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@tailwindcss/oxide-darwin-x64@4.1.12': - resolution: {integrity: sha512-6UCsIeFUcBfpangqlXay9Ffty9XhFH1QuUFn0WV83W8lGdX8cD5/+2ONLluALJD5+yJ7k8mVtwy3zMZmzEfbLg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@tailwindcss/oxide-freebsd-x64@4.1.12': - resolution: {integrity: sha512-JOH/f7j6+nYXIrHobRYCtoArJdMJh5zy5lr0FV0Qu47MID/vqJAY3r/OElPzx1C/wdT1uS7cPq+xdYYelny1ww==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': - resolution: {integrity: sha512-v4Ghvi9AU1SYgGr3/j38PD8PEe6bRfTnNSUE3YCMIRrrNigCFtHZ2TCm8142X8fcSqHBZBceDx+JlFJEfNg5zQ==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': - resolution: {integrity: sha512-YP5s1LmetL9UsvVAKusHSyPlzSRqYyRB0f+Kl/xcYQSPLEw/BvGfxzbH+ihUciePDjiXwHh+p+qbSP3SlJw+6g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-musl@4.1.12': - resolution: {integrity: sha512-V8pAM3s8gsrXcCv6kCHSuwyb/gPsd863iT+v1PGXC4fSL/OJqsKhfK//v8P+w9ThKIoqNbEnsZqNy+WDnwQqCA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@tailwindcss/oxide-linux-x64-gnu@4.1.12': - resolution: {integrity: sha512-xYfqYLjvm2UQ3TZggTGrwxjYaLB62b1Wiysw/YE3Yqbh86sOMoTn0feF98PonP7LtjsWOWcXEbGqDL7zv0uW8Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@tailwindcss/oxide-linux-x64-musl@4.1.12': - resolution: {integrity: sha512-ha0pHPamN+fWZY7GCzz5rKunlv9L5R8kdh+YNvP5awe3LtuXb5nRi/H27GeL2U+TdhDOptU7T6Is7mdwh5Ar3A==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@tailwindcss/oxide-wasm32-wasi@4.1.12': - resolution: {integrity: sha512-4tSyu3dW+ktzdEpuk6g49KdEangu3eCYoqPhWNsZgUhyegEda3M9rG0/j1GV/JjVVsj+lG7jWAyrTlLzd/WEBg==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - bundledDependencies: - - '@napi-rs/wasm-runtime' - - '@emnapi/core' - - '@emnapi/runtime' - - '@tybys/wasm-util' - - '@emnapi/wasi-threads' - - tslib - - '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': - resolution: {integrity: sha512-iGLyD/cVP724+FGtMWslhcFyg4xyYyM+5F4hGvKA7eifPkXHRAUDFaimu53fpNg9X8dfP75pXx/zFt/jlNF+lg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@tailwindcss/oxide-win32-x64-msvc@4.1.12': - resolution: {integrity: sha512-NKIh5rzw6CpEodv/++r0hGLlfgT/gFN+5WNdZtvh6wpU2BpGNgdjvj6H2oFc8nCM839QM1YOhjpgbAONUb4IxA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@tailwindcss/oxide@4.1.12': - resolution: {integrity: sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw==} - engines: {node: '>= 10'} - - '@tailwindcss/vite@4.1.12': - resolution: {integrity: sha512-4pt0AMFDx7gzIrAOIYgYP0KCBuKWqyW8ayrdiLEjoJTT4pKTjrzG/e4uzWtTLDziC+66R9wbUqZBccJalSE5vQ==} - peerDependencies: - vite: ^5.2.0 || ^6 || ^7 - - '@tanstack/query-core@5.85.5': - resolution: {integrity: sha512-KO0WTob4JEApv69iYp1eGvfMSUkgw//IpMnq+//cORBzXf0smyRwPLrUvEe5qtAEGjwZTXrjxg+oJNP/C00t6w==} - - '@tanstack/react-query@5.85.5': - resolution: {integrity: sha512-/X4EFNcnPiSs8wM2v+b6DqS5mmGeuJQvxBglmDxl6ZQb5V26ouD2SJYAcC3VjbNwqhY2zjxVD15rDA5nGbMn3A==} - peerDependencies: - react: ^18 || ^19 - - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} - - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - - '@types/babel__traverse@7.20.6': - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - - '@types/blake2b@2.1.3': - resolution: {integrity: sha512-MFCdX0MNxFBP/xEILO5Td0kv6nI7+Q2iRWZbTL/yzH2/eDVZS5Wd1LHdsmXClvsCyzqaZfHFzZaN6BUeUCfSDA==} - - '@types/deep-freeze-strict@1.1.2': - resolution: {integrity: sha512-VvMETBojHvhX4f+ocYTySQlXMZfxKV3Jyb7iCWlWaC+exbedkv6Iv2bZZqI736qXjVguH6IH7bzwMBMfTT+zuQ==} - - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/lodash.isequal@4.5.8': - resolution: {integrity: sha512-uput6pg4E/tj2LGxCZo9+y27JNyB2OZuuI/T5F+ylVDYuqICLG2/ktjxx0v6GvVntAf8TvEzeQLcV0ffRirXuA==} - - '@types/lodash@4.17.13': - resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} - - '@types/node@22.18.0': - resolution: {integrity: sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ==} - - '@types/node@22.7.5': - resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} - - '@types/react-dom@19.1.9': - resolution: {integrity: sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==} - peerDependencies: - '@types/react': ^19.0.0 - - '@types/react@19.1.12': - resolution: {integrity: sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==} - - '@typescript-eslint/eslint-plugin@8.41.0': - resolution: {integrity: sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.41.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/parser@8.41.0': - resolution: {integrity: sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/project-service@8.41.0': - resolution: {integrity: sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/scope-manager@8.41.0': - resolution: {integrity: sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.41.0': - resolution: {integrity: sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/type-utils@8.41.0': - resolution: {integrity: sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/types@8.41.0': - resolution: {integrity: sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.41.0': - resolution: {integrity: sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/utils@8.41.0': - resolution: {integrity: sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/visitor-keys@8.41.0': - resolution: {integrity: sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@vitejs/plugin-basic-ssl@1.2.0': - resolution: {integrity: sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==} - engines: {node: '>=14.21.3'} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 - - '@vitejs/plugin-react@4.7.0': - resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - - abitype@0.8.7: - resolution: {integrity: sha512-wQ7hV8Yg/yKmGyFpqrNZufCxbszDe5es4AZGYPBitocfSqXtjrTG9JMWFcc4N30ukl2ve48aBTwt7NJxVQdU3w==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.19.1 - peerDependenciesMeta: - zod: - optional: true - - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true - - aes-js@4.0.0-beta.5: - resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - axios@1.11.0: - resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} - - b4a@1.6.7: - resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} - - babel-plugin-react-compiler@19.1.0-rc.3: - resolution: {integrity: sha512-mjRn69WuTz4adL0bXGx8Rsyk1086zFJeKmes6aK0xPuK3aaXmDJdLHqwKKMrpm6KAI1MCoUK72d2VeqQbu8YIA==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base-x@4.0.0: - resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} - - base-x@5.0.1: - resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bech32@1.1.4: - resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - - bech32@2.0.0: - resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - bip66@1.1.5: - resolution: {integrity: sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw==} - - bitcoinjs-message@2.2.0: - resolution: {integrity: sha512-103Wy3xg8Y9o+pdhGP4M3/mtQQuUWs6sPuOp1mYphSUoSMHjHTlkj32K4zxU8qMH0Ckv23emfkGlFWtoWZ7YFA==} - engines: {node: '>=0.10'} - - blake2b-wasm@2.4.0: - resolution: {integrity: sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==} - - blake2b@2.1.4: - resolution: {integrity: sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==} - - bn.js@4.12.2: - resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - - browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - - browserslist@4.24.3: - resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - bs58@5.0.0: - resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} - - bs58@6.0.0: - resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} - - bs58check@2.1.2: - resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} - - bs58check@4.0.0: - resolution: {integrity: sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==} - - buffer-equals@1.0.4: - resolution: {integrity: sha512-99MsCq0j5+RhubVEtKQgKaD6EM+UP3xJgIvQqwJ3SOLDUekzxMX1ylXBng+Wa2sh7mGT0W6RUly8ojjr1Tt6nA==} - engines: {node: '>=0.10.0'} - - buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - caniuse-lite@1.0.30001690: - resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chownr@3.0.0: - resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} - engines: {node: '>=18'} - - cipher-base@1.0.6: - resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} - engines: {node: '>= 0.10'} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} - - create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} - - cross-fetch@3.1.8: - resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} - - cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - deep-freeze-strict@1.1.1: - resolution: {integrity: sha512-QemROZMM2IvhAcCFvahdX2Vbm4S/txeq5rFYU9fh4mQP79WTMW5c/HkQ2ICl1zuzcDZdPZ6zarDxQeQMsVYoNA==} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} - engines: {node: '>=8'} - - drbg.js@1.0.1: - resolution: {integrity: sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g==} - engines: {node: '>=0.10'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - electron-to-chromium@1.5.75: - resolution: {integrity: sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==} - - elliptic@6.6.1: - resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} - - enhanced-resolve@5.18.3: - resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} - engines: {node: '>=10.13.0'} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - esbuild@0.25.2: - resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} - engines: {node: '>=18'} - hasBin: true - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-plugin-react-compiler@19.1.0-rc.2: - resolution: {integrity: sha512-oKalwDGcD+RX9mf3NEO4zOoUMeLvjSvcbbEOpquzmzqEEM2MQdp7/FY/Hx9NzmUwFzH1W9SKTz5fihfMldpEYw==} - engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} - peerDependencies: - eslint: '>=7' - - eslint-plugin-react-hooks@5.2.0: - resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - - eslint-plugin-react-refresh@0.4.20: - resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==} - peerDependencies: - eslint: '>=8.40' - - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - 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} - - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint@9.34.0: - resolution: {integrity: sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - - espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - ethers@6.15.0: - resolution: {integrity: sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==} - engines: {node: '>=14.0.0'} - - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - - fdir@6.4.5: - resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} - - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - - form-data@4.0.4: - resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} - engines: {node: '>= 6'} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hash-base@3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} - - hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - hermes-estree@0.25.1: - resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} - - hermes-parser@0.25.1: - resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - - hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} - - immutable@4.3.7: - resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} - - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@5.0.0: - resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} - peerDependencies: - ws: '*' - - jiti@2.5.1: - resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} - hasBin: true - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-xxhash@1.0.4: - resolution: {integrity: sha512-S/6Oo7ruxx5k8m4qlMnbpwQdJjRsvvfcIhIk1dA9c5y5GNhYHKYKu9krEK3QgBax6CxJuf4gRL2opgLkdzWIKg==} - engines: {node: '>=8.0.0'} - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsbi@3.1.3: - resolution: {integrity: sha512-nBJqA0C6Qns+ZxurbEoIR56wyjiUszpNy70FHvxO5ervMoCbZVE3z3kxr5nKGhlxr/9MhKTSUBs7cAwwuf3g9w==} - - jsbi@4.3.0: - resolution: {integrity: sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==} - - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - lightningcss-darwin-arm64@1.30.1: - resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - - lightningcss-darwin-x64@1.30.1: - resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - - lightningcss-freebsd-x64@1.30.1: - resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - - lightningcss-linux-arm-gnueabihf@1.30.1: - resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - - lightningcss-linux-arm64-gnu@1.30.1: - resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - - lightningcss-linux-arm64-musl@1.30.1: - resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - - lightningcss-linux-x64-gnu@1.30.1: - resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-linux-x64-musl@1.30.1: - resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-win32-arm64-msvc@1.30.1: - resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - - lightningcss-win32-x64-msvc@1.30.1: - resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - - lightningcss@1.30.1: - resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} - engines: {node: '>= 12.0.0'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - 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'} - - 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==} - - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - - minizlib@3.0.2: - resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} - engines: {node: '>= 18'} - - mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nan@2.23.0: - resolution: {integrity: sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==} - - nanoassert@2.0.0: - resolution: {integrity: sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==} - - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - 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 - - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} - engines: {node: ^10 || ^12 || >=14} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier-plugin-tailwindcss@0.6.14: - resolution: {integrity: sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==} - engines: {node: '>=14.21.3'} - peerDependencies: - '@ianvs/prettier-plugin-sort-imports': '*' - '@prettier/plugin-hermes': '*' - '@prettier/plugin-oxc': '*' - '@prettier/plugin-pug': '*' - '@shopify/prettier-plugin-liquid': '*' - '@trivago/prettier-plugin-sort-imports': '*' - '@zackad/prettier-plugin-twig': '*' - prettier: ^3.0 - prettier-plugin-astro: '*' - prettier-plugin-css-order: '*' - prettier-plugin-import-sort: '*' - prettier-plugin-jsdoc: '*' - prettier-plugin-marko: '*' - prettier-plugin-multiline-arrays: '*' - prettier-plugin-organize-attributes: '*' - prettier-plugin-organize-imports: '*' - prettier-plugin-sort-imports: '*' - prettier-plugin-style-order: '*' - prettier-plugin-svelte: '*' - peerDependenciesMeta: - '@ianvs/prettier-plugin-sort-imports': - optional: true - '@prettier/plugin-hermes': - optional: true - '@prettier/plugin-oxc': - optional: true - '@prettier/plugin-pug': - optional: true - '@shopify/prettier-plugin-liquid': - optional: true - '@trivago/prettier-plugin-sort-imports': - optional: true - '@zackad/prettier-plugin-twig': - optional: true - prettier-plugin-astro: - optional: true - prettier-plugin-css-order: - optional: true - prettier-plugin-import-sort: - optional: true - prettier-plugin-jsdoc: - optional: true - prettier-plugin-marko: - optional: true - prettier-plugin-multiline-arrays: - optional: true - prettier-plugin-organize-attributes: - optional: true - prettier-plugin-organize-imports: - optional: true - prettier-plugin-sort-imports: - optional: true - prettier-plugin-style-order: - optional: true - prettier-plugin-svelte: - optional: true - - prettier@3.6.2: - resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} - engines: {node: '>=14'} - hasBin: true - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - react-dom@19.1.1: - resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==} - peerDependencies: - react: ^19.1.1 - - react-refresh@0.17.0: - resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} - engines: {node: '>=0.10.0'} - - react@19.1.1: - resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} - engines: {node: '>=0.10.0'} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - - rollup@4.39.0: - resolution: {integrity: sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - scheduler@0.26.0: - resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} - - secp256k1@3.8.1: - resolution: {integrity: sha512-tArjQw2P0RTdY7QmkNehgp6TVvQXq6ulIhxv8gaH6YubKG/wxxAoNKcbuXjDhybbc+b2Ihc7e0xxiGN744UIiQ==} - engines: {node: '>=4.0.0'} - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - sha.js@2.4.12: - resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} - engines: {node: '>= 0.10'} - hasBin: true - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - tailwindcss@4.1.12: - resolution: {integrity: sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==} - - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - - tar@7.4.3: - resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} - engines: {node: '>=18'} - - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} - engines: {node: '>=12.0.0'} - - to-buffer@1.2.1: - resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} - engines: {node: '>= 0.4'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - - tslib@2.3.1: - resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} - - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-fest@4.6.0: - resolution: {integrity: sha512-rLjWJzQFOq4xw7MgJrCZ6T1jIOvvYElXT12r+y0CC6u67hegDHaxcPqb2fZHOGlqxugGQPNB1EnTezjBetkwkw==} - engines: {node: '>=16'} - - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - - typescript-eslint@8.41.0: - resolution: {integrity: sha512-n66rzs5OBXW3SFSnZHr2T685q1i4ODm2nulFJhMZBotaTavsS8TrI3d7bDlRSs9yWo7HmyWrN9qDu14Qv7Y0Dw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - typescript@5.9.2: - resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} - engines: {node: '>=14.17'} - hasBin: true - - uncrypto@0.1.3: - resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} - - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - update-browserslist-db@1.1.1: - resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - valibot@0.42.1: - resolution: {integrity: sha512-3keXV29Ar5b//Hqi4MbSdV7lfVp6zuYLZuA9V1PvQUsXqogr+u5lvLPLk3A4f74VUXDnf/JfWMN6sB+koJ/FFw==} - peerDependencies: - typescript: '>=5' - peerDependenciesMeta: - typescript: - optional: true - - varuint-bitcoin@1.1.2: - resolution: {integrity: sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==} - - vite@6.3.5: - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} - 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 - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yallist@5.0.0: - resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} - engines: {node: '>=18'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - zod-validation-error@3.4.0: - resolution: {integrity: sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - zod: ^3.18.0 - - zod@3.24.1: - resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} - -snapshots: - - '@adraffy/ens-normalize@1.10.1': {} - - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - - '@babel/code-frame@7.26.2': - dependencies: - '@babel/helper-validator-identifier': 7.27.1 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/code-frame@7.27.1': - dependencies: - '@babel/helper-validator-identifier': 7.27.1 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/compat-data@7.27.5': {} - - '@babel/core@7.26.0': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.3 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helpers': 7.26.0 - '@babel/parser': 7.26.3 - '@babel/template': 7.25.9 - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 - convert-source-map: 2.0.0 - debug: 4.4.0 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/core@7.28.3': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) - '@babel/helpers': 7.28.3 - '@babel/parser': 7.28.3 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.3 - '@babel/types': 7.28.2 - convert-source-map: 2.0.0 - debug: 4.4.0 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.26.3': - dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.1.0 - - '@babel/generator@7.27.5': - dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.1.0 - - '@babel/generator@7.28.3': - dependencies: - '@babel/parser': 7.28.3 - '@babel/types': 7.28.2 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 - jsesc: 3.1.0 - - '@babel/helper-annotate-as-pure@7.25.9': - dependencies: - '@babel/types': 7.27.6 - - '@babel/helper-annotate-as-pure@7.27.3': - dependencies: - '@babel/types': 7.27.6 - - '@babel/helper-compilation-targets@7.25.9': - dependencies: - '@babel/compat-data': 7.27.5 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.24.3 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-compilation-targets@7.27.2': - dependencies: - '@babel/compat-data': 7.27.5 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.24.3 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.26.4 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-globals@7.28.0': {} - - '@babel/helper-member-expression-to-functions@7.25.9': - dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.27.1': - dependencies: - '@babel/traverse': 7.28.3 - '@babel/types': 7.28.2 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.3 - transitivePeerDependencies: - - supports-color - - '@babel/helper-optimise-call-expression@7.25.9': - dependencies: - '@babel/types': 7.27.6 - - '@babel/helper-plugin-utils@7.25.9': {} - - '@babel/helper-plugin-utils@7.27.1': {} - - '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-string-parser@7.25.9': {} - - '@babel/helper-string-parser@7.27.1': {} - - '@babel/helper-validator-identifier@7.25.9': {} - - '@babel/helper-validator-identifier@7.27.1': {} - - '@babel/helper-validator-option@7.27.1': {} - - '@babel/helpers@7.26.0': - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.27.6 - - '@babel/helpers@7.28.3': - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.2 - - '@babel/parser@7.26.3': - dependencies: - '@babel/types': 7.26.3 - - '@babel/parser@7.27.5': - dependencies: - '@babel/types': 7.27.6 - - '@babel/parser@7.28.3': - dependencies: - '@babel/types': 7.28.2 - - '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-react-display-name@7.27.1(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.3) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) - '@babel/types': 7.27.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/preset-react@7.27.1(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.28.3) - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.3) - '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.3) - '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.3) - transitivePeerDependencies: - - supports-color - - '@babel/template@7.25.9': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - - '@babel/template@7.27.2': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.3 - '@babel/types': 7.28.2 - - '@babel/traverse@7.26.4': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 - '@babel/template': 7.27.2 - '@babel/types': 7.27.6 - debug: 4.4.0 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/traverse@7.27.4': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 - '@babel/template': 7.27.2 - '@babel/types': 7.27.6 - debug: 4.4.0 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/traverse@7.28.3': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.3 - '@babel/template': 7.27.2 - '@babel/types': 7.28.2 - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.26.3': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - - '@babel/types@7.27.6': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - - '@babel/types@7.28.2': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - - '@ckb-ccc/ccc@1.1.17(typescript@5.9.2)(zod@3.24.1)': - dependencies: - '@ckb-ccc/eip6963': 1.0.25(typescript@5.9.2)(zod@3.24.1) - '@ckb-ccc/joy-id': 1.0.25(typescript@5.9.2)(zod@3.24.1) - '@ckb-ccc/nip07': 1.0.25(typescript@5.9.2)(zod@3.24.1) - '@ckb-ccc/okx': 1.0.25(typescript@5.9.2)(zod@3.24.1) - '@ckb-ccc/rei': 1.0.25(typescript@5.9.2)(zod@3.24.1) - '@ckb-ccc/shell': 1.1.17(typescript@5.9.2)(zod@3.24.1) - '@ckb-ccc/uni-sat': 1.0.25(typescript@5.9.2)(zod@3.24.1) - '@ckb-ccc/utxo-global': 1.0.25(typescript@5.9.2)(zod@3.24.1) - '@ckb-ccc/xverse': 1.0.25(typescript@5.9.2)(zod@3.24.1) - transitivePeerDependencies: - - bufferutil - - debug - - encoding - - typescript - - utf-8-validate - - zod - - '@ckb-ccc/core@1.11.4(typescript@5.9.2)(zod@3.24.1)': - dependencies: - '@joyid/ckb': 1.1.2(typescript@5.9.2)(zod@3.24.1) - '@noble/ciphers': 0.5.3 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.8.0 - bech32: 2.0.0 - bitcoinjs-message: 2.2.0 - bs58check: 4.0.0 - buffer: 6.0.3 - ethers: 6.15.0 - isomorphic-ws: 5.0.0(ws@8.18.3) - ws: 8.18.3 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - zod - - '@ckb-ccc/eip6963@1.0.25(typescript@5.9.2)(zod@3.24.1)': - dependencies: - '@ckb-ccc/core': 1.11.4(typescript@5.9.2)(zod@3.24.1) - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - zod - - '@ckb-ccc/joy-id@1.0.25(typescript@5.9.2)(zod@3.24.1)': - dependencies: - '@ckb-ccc/core': 1.11.4(typescript@5.9.2)(zod@3.24.1) - '@joyid/ckb': 1.1.2(typescript@5.9.2)(zod@3.24.1) - '@joyid/common': 0.2.1(typescript@5.9.2)(zod@3.24.1) - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - zod - - '@ckb-ccc/nip07@1.0.25(typescript@5.9.2)(zod@3.24.1)': - dependencies: - '@ckb-ccc/core': 1.11.4(typescript@5.9.2)(zod@3.24.1) - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - zod - - '@ckb-ccc/okx@1.0.25(typescript@5.9.2)(zod@3.24.1)': - dependencies: - '@ckb-ccc/core': 1.11.4(typescript@5.9.2)(zod@3.24.1) - '@ckb-ccc/nip07': 1.0.25(typescript@5.9.2)(zod@3.24.1) - '@ckb-ccc/uni-sat': 1.0.25(typescript@5.9.2)(zod@3.24.1) - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - zod - - '@ckb-ccc/rei@1.0.25(typescript@5.9.2)(zod@3.24.1)': - dependencies: - '@ckb-ccc/core': 1.11.4(typescript@5.9.2)(zod@3.24.1) - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - zod - - '@ckb-ccc/shell@1.1.17(typescript@5.9.2)(zod@3.24.1)': - dependencies: - '@ckb-ccc/core': 1.11.4(typescript@5.9.2)(zod@3.24.1) - '@ckb-ccc/spore': 1.5.9(typescript@5.9.2)(zod@3.24.1) - '@ckb-ccc/ssri': 0.2.15(typescript@5.9.2)(zod@3.24.1) - '@ckb-ccc/udt': 0.1.17(typescript@5.9.2)(zod@3.24.1) - transitivePeerDependencies: - - bufferutil - - debug - - encoding - - typescript - - utf-8-validate - - zod - - '@ckb-ccc/spore@1.5.9(typescript@5.9.2)(zod@3.24.1)': - dependencies: - '@ckb-ccc/core': 1.11.4(typescript@5.9.2)(zod@3.24.1) - axios: 1.11.0 - transitivePeerDependencies: - - bufferutil - - debug - - encoding - - typescript - - utf-8-validate - - zod - - '@ckb-ccc/ssri@0.2.15(typescript@5.9.2)(zod@3.24.1)': - dependencies: - '@ckb-ccc/core': 1.11.4(typescript@5.9.2)(zod@3.24.1) - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - zod - - '@ckb-ccc/udt@0.1.17(typescript@5.9.2)(zod@3.24.1)': - dependencies: - '@ckb-ccc/core': 1.11.4(typescript@5.9.2)(zod@3.24.1) - '@ckb-ccc/ssri': 0.2.15(typescript@5.9.2)(zod@3.24.1) - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - zod - - '@ckb-ccc/uni-sat@1.0.25(typescript@5.9.2)(zod@3.24.1)': - dependencies: - '@ckb-ccc/core': 1.11.4(typescript@5.9.2)(zod@3.24.1) - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - zod - - '@ckb-ccc/utxo-global@1.0.25(typescript@5.9.2)(zod@3.24.1)': - dependencies: - '@ckb-ccc/core': 1.11.4(typescript@5.9.2)(zod@3.24.1) - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - zod - - '@ckb-ccc/xverse@1.0.25(typescript@5.9.2)(zod@3.24.1)': - dependencies: - '@ckb-ccc/core': 1.11.4(typescript@5.9.2)(zod@3.24.1) - valibot: 0.42.1(typescript@5.9.2) - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - zod - - '@ckb-lumos/base@0.23.0': - dependencies: - '@ckb-lumos/bi': 0.23.0 - '@ckb-lumos/codec': 0.23.0 - '@ckb-lumos/toolkit': 0.23.0 - '@types/blake2b': 2.1.3 - '@types/lodash.isequal': 4.5.8 - blake2b: 2.1.4 - js-xxhash: 1.0.4 - lodash.isequal: 4.5.0 - - '@ckb-lumos/bi@0.23.0': - dependencies: - jsbi: 4.3.0 - - '@ckb-lumos/ckb-indexer@0.23.0': - dependencies: - '@ckb-lumos/base': 0.23.0 - '@ckb-lumos/bi': 0.23.0 - '@ckb-lumos/codec': 0.23.0 - '@ckb-lumos/rpc': 0.23.0 - '@ckb-lumos/toolkit': 0.23.0 - cross-fetch: 3.1.8 - events: 3.3.0 - transitivePeerDependencies: - - encoding - - '@ckb-lumos/codec@0.23.0': - dependencies: - '@ckb-lumos/bi': 0.23.0 - - '@ckb-lumos/common-scripts@0.23.0': - dependencies: - '@ckb-lumos/base': 0.23.0 - '@ckb-lumos/bi': 0.23.0 - '@ckb-lumos/codec': 0.23.0 - '@ckb-lumos/config-manager': 0.23.0 - '@ckb-lumos/helpers': 0.23.0 - '@ckb-lumos/rpc': 0.23.0 - '@ckb-lumos/toolkit': 0.23.0 - bech32: 2.0.0 - bs58: 5.0.0 - immutable: 4.3.7 - transitivePeerDependencies: - - encoding - - '@ckb-lumos/config-manager@0.23.0': - dependencies: - '@ckb-lumos/base': 0.23.0 - '@ckb-lumos/bi': 0.23.0 - '@ckb-lumos/codec': 0.23.0 - '@ckb-lumos/rpc': 0.23.0 - '@types/deep-freeze-strict': 1.1.2 - deep-freeze-strict: 1.1.1 - transitivePeerDependencies: - - encoding - - '@ckb-lumos/helpers@0.23.0': - dependencies: - '@ckb-lumos/base': 0.23.0 - '@ckb-lumos/bi': 0.23.0 - '@ckb-lumos/codec': 0.23.0 - '@ckb-lumos/config-manager': 0.23.0 - '@ckb-lumos/toolkit': 0.23.0 - bech32: 2.0.0 - immutable: 4.3.7 - transitivePeerDependencies: - - encoding - - '@ckb-lumos/light-client@0.23.0': - dependencies: - '@ckb-lumos/base': 0.23.0 - '@ckb-lumos/ckb-indexer': 0.23.0 - '@ckb-lumos/rpc': 0.23.0 - cross-fetch: 3.1.8 - events: 3.3.0 - transitivePeerDependencies: - - encoding - - '@ckb-lumos/rpc@0.23.0': - dependencies: - '@ckb-lumos/base': 0.23.0 - '@ckb-lumos/bi': 0.23.0 - abort-controller: 3.0.0 - cross-fetch: 3.1.8 - transitivePeerDependencies: - - encoding - - '@ckb-lumos/toolkit@0.23.0': - dependencies: - '@ckb-lumos/bi': 0.23.0 - - '@esbuild/aix-ppc64@0.25.2': - optional: true - - '@esbuild/android-arm64@0.25.2': - optional: true - - '@esbuild/android-arm@0.25.2': - optional: true - - '@esbuild/android-x64@0.25.2': - optional: true - - '@esbuild/darwin-arm64@0.25.2': - optional: true - - '@esbuild/darwin-x64@0.25.2': - optional: true - - '@esbuild/freebsd-arm64@0.25.2': - optional: true - - '@esbuild/freebsd-x64@0.25.2': - optional: true - - '@esbuild/linux-arm64@0.25.2': - optional: true - - '@esbuild/linux-arm@0.25.2': - optional: true - - '@esbuild/linux-ia32@0.25.2': - optional: true - - '@esbuild/linux-loong64@0.25.2': - optional: true - - '@esbuild/linux-mips64el@0.25.2': - optional: true - - '@esbuild/linux-ppc64@0.25.2': - optional: true - - '@esbuild/linux-riscv64@0.25.2': - optional: true - - '@esbuild/linux-s390x@0.25.2': - optional: true - - '@esbuild/linux-x64@0.25.2': - optional: true - - '@esbuild/netbsd-arm64@0.25.2': - optional: true - - '@esbuild/netbsd-x64@0.25.2': - optional: true - - '@esbuild/openbsd-arm64@0.25.2': - optional: true - - '@esbuild/openbsd-x64@0.25.2': - optional: true - - '@esbuild/sunos-x64@0.25.2': - optional: true - - '@esbuild/win32-arm64@0.25.2': - optional: true - - '@esbuild/win32-ia32@0.25.2': - optional: true - - '@esbuild/win32-x64@0.25.2': - optional: true - - '@eslint-community/eslint-utils@4.7.0(eslint@9.34.0(jiti@2.5.1))': - dependencies: - eslint: 9.34.0(jiti@2.5.1) - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.12.1': {} - - '@eslint/config-array@0.21.0': - dependencies: - '@eslint/object-schema': 2.1.6 - debug: 4.4.0 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@eslint/config-helpers@0.3.1': {} - - '@eslint/core@0.15.2': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/eslintrc@3.3.1': - dependencies: - ajv: 6.12.6 - debug: 4.4.0 - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@9.34.0': {} - - '@eslint/object-schema@2.1.6': {} - - '@eslint/plugin-kit@0.3.5': - dependencies: - '@eslint/core': 0.15.2 - levn: 0.4.1 - - '@humanfs/core@0.19.1': {} - - '@humanfs/node@0.16.6': - dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/retry@0.3.1': {} - - '@humanwhocodes/retry@0.4.2': {} - - '@ickb/lumos-utils@1.4.2': - dependencies: - '@ckb-lumos/base': 0.23.0 - '@ckb-lumos/ckb-indexer': 0.23.0 - '@ckb-lumos/codec': 0.23.0 - '@ckb-lumos/common-scripts': 0.23.0 - '@ckb-lumos/config-manager': 0.23.0 - '@ckb-lumos/helpers': 0.23.0 - '@ckb-lumos/light-client': 0.23.0 - '@ckb-lumos/rpc': 0.23.0 - immutable: 4.3.7 - transitivePeerDependencies: - - encoding - - '@ickb/v1-core@1.4.2': - dependencies: - '@ckb-lumos/base': 0.23.0 - '@ckb-lumos/ckb-indexer': 0.23.0 - '@ckb-lumos/codec': 0.23.0 - '@ckb-lumos/common-scripts': 0.23.0 - '@ckb-lumos/config-manager': 0.23.0 - '@ckb-lumos/helpers': 0.23.0 - '@ckb-lumos/rpc': 0.23.0 - '@ickb/lumos-utils': 1.4.2 - transitivePeerDependencies: - - encoding - - '@isaacs/fs-minipass@4.0.1': - dependencies: - minipass: 7.1.2 - - '@joyid/ckb@1.1.2(typescript@5.9.2)(zod@3.24.1)': - dependencies: - '@joyid/common': 0.2.1(typescript@5.9.2)(zod@3.24.1) - '@nervosnetwork/ckb-sdk-utils': 0.109.5 - cross-fetch: 4.0.0 - uncrypto: 0.1.3 - transitivePeerDependencies: - - encoding - - typescript - - zod - - '@joyid/common@0.2.1(typescript@5.9.2)(zod@3.24.1)': - dependencies: - abitype: 0.8.7(typescript@5.9.2)(zod@3.24.1) - type-fest: 4.6.0 - transitivePeerDependencies: - - typescript - - zod - - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.30 - - '@jridgewell/gen-mapping@0.3.8': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@jridgewell/trace-mapping@0.3.30': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@nervosnetwork/ckb-sdk-utils@0.109.5': - dependencies: - '@nervosnetwork/ckb-types': 0.109.5 - bech32: 2.0.0 - elliptic: 6.6.1 - jsbi: 3.1.3 - tslib: 2.3.1 - - '@nervosnetwork/ckb-types@0.109.5': {} - - '@noble/ciphers@0.5.3': {} - - '@noble/curves@1.2.0': - dependencies: - '@noble/hashes': 1.3.2 - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.3.2': {} - - '@noble/hashes@1.8.0': {} - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - - '@rolldown/pluginutils@1.0.0-beta.27': {} - - '@rollup/rollup-android-arm-eabi@4.39.0': - optional: true - - '@rollup/rollup-android-arm64@4.39.0': - optional: true - - '@rollup/rollup-darwin-arm64@4.39.0': - optional: true - - '@rollup/rollup-darwin-x64@4.39.0': - optional: true - - '@rollup/rollup-freebsd-arm64@4.39.0': - optional: true - - '@rollup/rollup-freebsd-x64@4.39.0': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.39.0': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.39.0': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.39.0': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.39.0': - optional: true - - '@rollup/rollup-linux-loongarch64-gnu@4.39.0': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.39.0': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.39.0': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.39.0': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.39.0': - optional: true - - '@rollup/rollup-linux-x64-musl@4.39.0': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.39.0': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.39.0': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.39.0': - optional: true - - '@tailwindcss/node@4.1.12': - dependencies: - '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.18.3 - jiti: 2.5.1 - lightningcss: 1.30.1 - magic-string: 0.30.17 - source-map-js: 1.2.1 - tailwindcss: 4.1.12 - - '@tailwindcss/oxide-android-arm64@4.1.12': - optional: true - - '@tailwindcss/oxide-darwin-arm64@4.1.12': - optional: true - - '@tailwindcss/oxide-darwin-x64@4.1.12': - optional: true - - '@tailwindcss/oxide-freebsd-x64@4.1.12': - optional: true - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': - optional: true - - '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': - optional: true - - '@tailwindcss/oxide-linux-arm64-musl@4.1.12': - optional: true - - '@tailwindcss/oxide-linux-x64-gnu@4.1.12': - optional: true - - '@tailwindcss/oxide-linux-x64-musl@4.1.12': - optional: true - - '@tailwindcss/oxide-wasm32-wasi@4.1.12': - optional: true - - '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': - optional: true - - '@tailwindcss/oxide-win32-x64-msvc@4.1.12': - optional: true - - '@tailwindcss/oxide@4.1.12': - dependencies: - detect-libc: 2.0.4 - tar: 7.4.3 - optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.12 - '@tailwindcss/oxide-darwin-arm64': 4.1.12 - '@tailwindcss/oxide-darwin-x64': 4.1.12 - '@tailwindcss/oxide-freebsd-x64': 4.1.12 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.12 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.12 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.12 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.12 - '@tailwindcss/oxide-linux-x64-musl': 4.1.12 - '@tailwindcss/oxide-wasm32-wasi': 4.1.12 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.12 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.12 - - '@tailwindcss/vite@4.1.12(vite@6.3.5(@types/node@22.18.0)(jiti@2.5.1)(lightningcss@1.30.1))': - dependencies: - '@tailwindcss/node': 4.1.12 - '@tailwindcss/oxide': 4.1.12 - tailwindcss: 4.1.12 - vite: 6.3.5(@types/node@22.18.0)(jiti@2.5.1)(lightningcss@1.30.1) - - '@tanstack/query-core@5.85.5': {} - - '@tanstack/react-query@5.85.5(react@19.1.1)': - dependencies: - '@tanstack/query-core': 5.85.5 - react: 19.1.1 - - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - '@types/babel__generator': 7.6.8 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.6 - - '@types/babel__generator@7.6.8': - dependencies: - '@babel/types': 7.27.6 - - '@types/babel__template@7.4.4': - dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - - '@types/babel__traverse@7.20.6': - dependencies: - '@babel/types': 7.27.6 - - '@types/blake2b@2.1.3': {} - - '@types/deep-freeze-strict@1.1.2': {} - - '@types/estree@1.0.7': {} - - '@types/json-schema@7.0.15': {} - - '@types/lodash.isequal@4.5.8': - dependencies: - '@types/lodash': 4.17.13 - - '@types/lodash@4.17.13': {} - - '@types/node@22.18.0': - dependencies: - undici-types: 6.21.0 - - '@types/node@22.7.5': - dependencies: - undici-types: 6.19.8 - - '@types/react-dom@19.1.9(@types/react@19.1.12)': - dependencies: - '@types/react': 19.1.12 - - '@types/react@19.1.12': - dependencies: - csstype: 3.1.3 - - '@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.41.0 - '@typescript-eslint/type-utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.41.0 - eslint: 9.34.0(jiti@2.5.1) - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': - dependencies: - '@typescript-eslint/scope-manager': 8.41.0 - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.41.0 - debug: 4.4.0 - eslint: 9.34.0(jiti@2.5.1) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.41.0(typescript@5.9.2)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.9.2) - '@typescript-eslint/types': 8.41.0 - debug: 4.4.0 - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@8.41.0': - dependencies: - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/visitor-keys': 8.41.0 - - '@typescript-eslint/tsconfig-utils@8.41.0(typescript@5.9.2)': - dependencies: - typescript: 5.9.2 - - '@typescript-eslint/type-utils@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': - dependencies: - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - debug: 4.4.0 - eslint: 9.34.0(jiti@2.5.1) - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@8.41.0': {} - - '@typescript-eslint/typescript-estree@8.41.0(typescript@5.9.2)': - dependencies: - '@typescript-eslint/project-service': 8.41.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.9.2) - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/visitor-keys': 8.41.0 - debug: 4.4.0 - fast-glob: 3.3.2 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) - '@typescript-eslint/scope-manager': 8.41.0 - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) - eslint: 9.34.0(jiti@2.5.1) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.41.0': - dependencies: - '@typescript-eslint/types': 8.41.0 - eslint-visitor-keys: 4.2.1 - - '@vitejs/plugin-basic-ssl@1.2.0(vite@6.3.5(@types/node@22.18.0)(jiti@2.5.1)(lightningcss@1.30.1))': - dependencies: - vite: 6.3.5(@types/node@22.18.0)(jiti@2.5.1)(lightningcss@1.30.1) - - '@vitejs/plugin-react@4.7.0(vite@6.3.5(@types/node@22.18.0)(jiti@2.5.1)(lightningcss@1.30.1))': - dependencies: - '@babel/core': 7.28.3 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.3) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.3) - '@rolldown/pluginutils': 1.0.0-beta.27 - '@types/babel__core': 7.20.5 - react-refresh: 0.17.0 - vite: 6.3.5(@types/node@22.18.0)(jiti@2.5.1)(lightningcss@1.30.1) - transitivePeerDependencies: - - supports-color - - abitype@0.8.7(typescript@5.9.2)(zod@3.24.1): - dependencies: - typescript: 5.9.2 - optionalDependencies: - zod: 3.24.1 - - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - - acorn-jsx@5.3.2(acorn@8.15.0): - dependencies: - acorn: 8.15.0 - - acorn@8.15.0: {} - - aes-js@4.0.0-beta.5: {} - - ajv@6.12.6: - 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 - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - argparse@2.0.1: {} - - asynckit@0.4.0: {} - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.1.0 - - axios@1.11.0: - dependencies: - follow-redirects: 1.15.11 - form-data: 4.0.4 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - b4a@1.6.7: {} - - babel-plugin-react-compiler@19.1.0-rc.3: - dependencies: - '@babel/types': 7.26.3 - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base-x@4.0.0: {} - - base-x@5.0.1: {} - - base64-js@1.5.1: {} - - bech32@1.1.4: {} - - bech32@2.0.0: {} - - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - - bip66@1.1.5: - dependencies: - safe-buffer: 5.2.1 - - bitcoinjs-message@2.2.0: - dependencies: - bech32: 1.1.4 - bs58check: 2.1.2 - buffer-equals: 1.0.4 - create-hash: 1.2.0 - secp256k1: 3.8.1 - varuint-bitcoin: 1.1.2 - - blake2b-wasm@2.4.0: - dependencies: - b4a: 1.6.7 - nanoassert: 2.0.0 - - blake2b@2.1.4: - dependencies: - blake2b-wasm: 2.4.0 - nanoassert: 2.0.0 - - bn.js@4.12.2: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - brorand@1.1.0: {} - - browserify-aes@1.2.0: - dependencies: - buffer-xor: 1.0.3 - cipher-base: 1.0.6 - create-hash: 1.2.0 - evp_bytestokey: 1.0.3 - inherits: 2.0.4 - safe-buffer: 5.2.1 - - browserslist@4.24.3: - dependencies: - caniuse-lite: 1.0.30001690 - electron-to-chromium: 1.5.75 - node-releases: 2.0.19 - update-browserslist-db: 1.1.1(browserslist@4.24.3) - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - bs58@5.0.0: - dependencies: - base-x: 4.0.0 - - bs58@6.0.0: - dependencies: - base-x: 5.0.1 - - bs58check@2.1.2: - dependencies: - bs58: 4.0.1 - create-hash: 1.2.0 - safe-buffer: 5.2.1 - - bs58check@4.0.0: - dependencies: - '@noble/hashes': 1.8.0 - bs58: 6.0.0 - - buffer-equals@1.0.4: {} - - buffer-xor@1.0.3: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - callsites@3.1.0: {} - - caniuse-lite@1.0.30001690: {} - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chownr@3.0.0: {} - - cipher-base@1.0.6: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - concat-map@0.0.1: {} - - convert-source-map@2.0.0: {} - - create-hash@1.2.0: - dependencies: - cipher-base: 1.0.6 - inherits: 2.0.4 - md5.js: 1.3.5 - ripemd160: 2.0.2 - sha.js: 2.4.12 - - create-hmac@1.1.7: - dependencies: - cipher-base: 1.0.6 - create-hash: 1.2.0 - inherits: 2.0.4 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.12 - - cross-fetch@3.1.8: - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - - cross-fetch@4.0.0: - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - csstype@3.1.3: {} - - debug@4.4.0: - dependencies: - ms: 2.1.3 - - deep-freeze-strict@1.1.1: {} - - deep-is@0.1.4: {} - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - - delayed-stream@1.0.0: {} - - detect-libc@2.0.4: {} - - drbg.js@1.0.1: - dependencies: - browserify-aes: 1.2.0 - create-hash: 1.2.0 - create-hmac: 1.1.7 - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - electron-to-chromium@1.5.75: {} - - elliptic@6.6.1: - dependencies: - bn.js: 4.12.2 - 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 - - enhanced-resolve@5.18.3: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - esbuild@0.25.2: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.2 - '@esbuild/android-arm': 0.25.2 - '@esbuild/android-arm64': 0.25.2 - '@esbuild/android-x64': 0.25.2 - '@esbuild/darwin-arm64': 0.25.2 - '@esbuild/darwin-x64': 0.25.2 - '@esbuild/freebsd-arm64': 0.25.2 - '@esbuild/freebsd-x64': 0.25.2 - '@esbuild/linux-arm': 0.25.2 - '@esbuild/linux-arm64': 0.25.2 - '@esbuild/linux-ia32': 0.25.2 - '@esbuild/linux-loong64': 0.25.2 - '@esbuild/linux-mips64el': 0.25.2 - '@esbuild/linux-ppc64': 0.25.2 - '@esbuild/linux-riscv64': 0.25.2 - '@esbuild/linux-s390x': 0.25.2 - '@esbuild/linux-x64': 0.25.2 - '@esbuild/netbsd-arm64': 0.25.2 - '@esbuild/netbsd-x64': 0.25.2 - '@esbuild/openbsd-arm64': 0.25.2 - '@esbuild/openbsd-x64': 0.25.2 - '@esbuild/sunos-x64': 0.25.2 - '@esbuild/win32-arm64': 0.25.2 - '@esbuild/win32-ia32': 0.25.2 - '@esbuild/win32-x64': 0.25.2 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.34.0(jiti@2.5.1)): - dependencies: - '@babel/core': 7.26.0 - '@babel/parser': 7.26.3 - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.26.0) - eslint: 9.34.0(jiti@2.5.1) - hermes-parser: 0.25.1 - zod: 3.24.1 - zod-validation-error: 3.4.0(zod@3.24.1) - transitivePeerDependencies: - - supports-color - - eslint-plugin-react-hooks@5.2.0(eslint@9.34.0(jiti@2.5.1)): - dependencies: - eslint: 9.34.0(jiti@2.5.1) - - eslint-plugin-react-refresh@0.4.20(eslint@9.34.0(jiti@2.5.1)): - dependencies: - eslint: 9.34.0(jiti@2.5.1) - - eslint-scope@8.4.0: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint-visitor-keys@4.2.1: {} - - eslint@9.34.0(jiti@2.5.1): - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.1 - '@eslint/core': 0.15.2 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.34.0 - '@eslint/plugin-kit': 0.3.5 - '@humanfs/node': 0.16.6 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.2 - '@types/estree': 1.0.7 - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.0 - escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - optionalDependencies: - jiti: 2.5.1 - transitivePeerDependencies: - - supports-color - - espree@10.4.0: - dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 4.2.1 - - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} - - esutils@2.0.3: {} - - ethers@6.15.0: - dependencies: - '@adraffy/ens-normalize': 1.10.1 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@types/node': 22.7.5 - aes-js: 4.0.0-beta.5 - tslib: 2.7.0 - ws: 8.17.1 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - event-target-shim@5.0.1: {} - - events@3.3.0: {} - - evp_bytestokey@1.0.3: - dependencies: - md5.js: 1.3.5 - safe-buffer: 5.2.1 - - fast-deep-equal@3.1.3: {} - - fast-glob@3.3.2: - 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.8 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fastq@1.17.1: - dependencies: - reusify: 1.0.4 - - fdir@6.4.5(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - - file-entry-cache@8.0.0: - dependencies: - flat-cache: 4.0.1 - - file-uri-to-path@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat-cache@4.0.1: - dependencies: - flatted: 3.3.2 - keyv: 4.5.4 - - flatted@3.3.2: {} - - follow-redirects@1.15.11: {} - - for-each@0.3.5: - dependencies: - is-callable: 1.2.7 - - form-data@4.0.4: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - gensync@1.0.0-beta.2: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - globals@11.12.0: {} - - globals@14.0.0: {} - - gopd@1.2.0: {} - - graceful-fs@4.2.11: {} - - graphemer@1.4.0: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hash-base@3.1.0: - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - safe-buffer: 5.2.1 - - hash.js@1.1.7: - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - hermes-estree@0.25.1: {} - - hermes-parser@0.25.1: - dependencies: - hermes-estree: 0.25.1 - - hmac-drbg@1.0.1: - dependencies: - hash.js: 1.1.7 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - - ieee754@1.2.1: {} - - ignore@5.3.2: {} - - ignore@7.0.5: {} - - immutable@4.3.7: {} - - import-fresh@3.3.0: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - imurmurhash@0.1.4: {} - - inherits@2.0.4: {} - - is-callable@1.2.7: {} - - is-extglob@2.1.1: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.19 - - isarray@2.0.5: {} - - isexe@2.0.0: {} - - isomorphic-ws@5.0.0(ws@8.18.3): - dependencies: - ws: 8.18.3 - - jiti@2.5.1: {} - - js-tokens@4.0.0: {} - - js-xxhash@1.0.4: {} - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - jsbi@3.1.3: {} - - jsbi@4.3.0: {} - - jsesc@3.1.0: {} - - json-buffer@3.0.1: {} - - json-schema-traverse@0.4.1: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - json5@2.2.3: {} - - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - lightningcss-darwin-arm64@1.30.1: - optional: true - - lightningcss-darwin-x64@1.30.1: - optional: true - - lightningcss-freebsd-x64@1.30.1: - optional: true - - lightningcss-linux-arm-gnueabihf@1.30.1: - optional: true - - lightningcss-linux-arm64-gnu@1.30.1: - optional: true - - lightningcss-linux-arm64-musl@1.30.1: - optional: true - - lightningcss-linux-x64-gnu@1.30.1: - optional: true - - lightningcss-linux-x64-musl@1.30.1: - optional: true - - lightningcss-win32-arm64-msvc@1.30.1: - optional: true - - lightningcss-win32-x64-msvc@1.30.1: - optional: true - - lightningcss@1.30.1: - dependencies: - detect-libc: 2.0.4 - optionalDependencies: - lightningcss-darwin-arm64: 1.30.1 - lightningcss-darwin-x64: 1.30.1 - lightningcss-freebsd-x64: 1.30.1 - lightningcss-linux-arm-gnueabihf: 1.30.1 - lightningcss-linux-arm64-gnu: 1.30.1 - lightningcss-linux-arm64-musl: 1.30.1 - lightningcss-linux-x64-gnu: 1.30.1 - lightningcss-linux-x64-musl: 1.30.1 - lightningcss-win32-arm64-msvc: 1.30.1 - lightningcss-win32-x64-msvc: 1.30.1 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash.isequal@4.5.0: {} - - lodash.merge@4.6.2: {} - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - - magic-string@0.30.17: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - - math-intrinsics@1.1.0: {} - - md5.js@1.3.5: - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 - - merge2@1.4.1: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - minimalistic-assert@1.0.1: {} - - minimalistic-crypto-utils@1.0.1: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.1 - - minipass@7.1.2: {} - - minizlib@3.0.2: - dependencies: - minipass: 7.1.2 - - mkdirp@3.0.1: {} - - ms@2.1.3: {} - - nan@2.23.0: {} - - nanoassert@2.0.0: {} - - nanoid@3.3.8: {} - - natural-compare@1.4.0: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-releases@2.0.19: {} - - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - path-exists@4.0.0: {} - - path-key@3.1.1: {} - - picocolors@1.1.1: {} - - picomatch@2.3.1: {} - - picomatch@4.0.2: {} - - possible-typed-array-names@1.1.0: {} - - postcss@8.5.3: - dependencies: - nanoid: 3.3.8 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - prelude-ls@1.2.1: {} - - prettier-plugin-tailwindcss@0.6.14(prettier@3.6.2): - dependencies: - prettier: 3.6.2 - - prettier@3.6.2: {} - - proxy-from-env@1.1.0: {} - - punycode@2.3.1: {} - - queue-microtask@1.2.3: {} - - react-dom@19.1.1(react@19.1.1): - dependencies: - react: 19.1.1 - scheduler: 0.26.0 - - react-refresh@0.17.0: {} - - react@19.1.1: {} - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - resolve-from@4.0.0: {} - - reusify@1.0.4: {} - - ripemd160@2.0.2: - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - - rollup@4.39.0: - dependencies: - '@types/estree': 1.0.7 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.39.0 - '@rollup/rollup-android-arm64': 4.39.0 - '@rollup/rollup-darwin-arm64': 4.39.0 - '@rollup/rollup-darwin-x64': 4.39.0 - '@rollup/rollup-freebsd-arm64': 4.39.0 - '@rollup/rollup-freebsd-x64': 4.39.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.39.0 - '@rollup/rollup-linux-arm-musleabihf': 4.39.0 - '@rollup/rollup-linux-arm64-gnu': 4.39.0 - '@rollup/rollup-linux-arm64-musl': 4.39.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.39.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.39.0 - '@rollup/rollup-linux-riscv64-gnu': 4.39.0 - '@rollup/rollup-linux-riscv64-musl': 4.39.0 - '@rollup/rollup-linux-s390x-gnu': 4.39.0 - '@rollup/rollup-linux-x64-gnu': 4.39.0 - '@rollup/rollup-linux-x64-musl': 4.39.0 - '@rollup/rollup-win32-arm64-msvc': 4.39.0 - '@rollup/rollup-win32-ia32-msvc': 4.39.0 - '@rollup/rollup-win32-x64-msvc': 4.39.0 - fsevents: 2.3.3 - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - safe-buffer@5.2.1: {} - - scheduler@0.26.0: {} - - secp256k1@3.8.1: - dependencies: - bindings: 1.5.0 - bip66: 1.1.5 - bn.js: 4.12.2 - create-hash: 1.2.0 - drbg.js: 1.0.1 - elliptic: 6.6.1 - nan: 2.23.0 - safe-buffer: 5.2.1 - - semver@6.3.1: {} - - semver@7.6.3: {} - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - - sha.js@2.4.12: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - to-buffer: 1.2.1 - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - source-map-js@1.2.1: {} - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - - strip-json-comments@3.1.1: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - tailwindcss@4.1.12: {} - - tapable@2.2.1: {} - - tar@7.4.3: - dependencies: - '@isaacs/fs-minipass': 4.0.1 - chownr: 3.0.0 - minipass: 7.1.2 - minizlib: 3.0.2 - mkdirp: 3.0.1 - yallist: 5.0.0 - - tinyglobby@0.2.14: - dependencies: - fdir: 6.4.5(picomatch@4.0.2) - picomatch: 4.0.2 - - to-buffer@1.2.1: - dependencies: - isarray: 2.0.5 - safe-buffer: 5.2.1 - typed-array-buffer: 1.0.3 - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-api-utils@2.1.0(typescript@5.9.2): - dependencies: - typescript: 5.9.2 - - tslib@2.3.1: {} - - tslib@2.7.0: {} - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-fest@4.6.0: {} - - typed-array-buffer@1.0.3: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-typed-array: 1.1.15 - - typescript-eslint@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2): - dependencies: - '@typescript-eslint/eslint-plugin': 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.34.0(jiti@2.5.1) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - typescript@5.9.2: {} - - uncrypto@0.1.3: {} - - undici-types@6.19.8: {} - - undici-types@6.21.0: {} - - update-browserslist-db@1.1.1(browserslist@4.24.3): - dependencies: - browserslist: 4.24.3 - escalade: 3.2.0 - picocolors: 1.1.1 - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - util-deprecate@1.0.2: {} - - valibot@0.42.1(typescript@5.9.2): - optionalDependencies: - typescript: 5.9.2 - - varuint-bitcoin@1.1.2: - dependencies: - safe-buffer: 5.2.1 - - vite@6.3.5(@types/node@22.18.0)(jiti@2.5.1)(lightningcss@1.30.1): - dependencies: - esbuild: 0.25.2 - fdir: 6.4.5(picomatch@4.0.2) - picomatch: 4.0.2 - postcss: 8.5.3 - rollup: 4.39.0 - tinyglobby: 0.2.14 - optionalDependencies: - '@types/node': 22.18.0 - fsevents: 2.3.3 - jiti: 2.5.1 - lightningcss: 1.30.1 - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which-typed-array@1.1.19: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - word-wrap@1.2.5: {} - - ws@8.17.1: {} - - ws@8.18.3: {} - - yallist@3.1.1: {} - - yallist@5.0.0: {} - - yocto-queue@0.1.0: {} - - zod-validation-error@3.4.0(zod@3.24.1): - dependencies: - zod: 3.24.1 - - zod@3.24.1: {} diff --git a/apps/interface/src/Action.tsx b/apps/interface/src/Action.tsx index 46b7684..1f74ff6 100644 --- a/apps/interface/src/Action.tsx +++ b/apps/interface/src/Action.tsx @@ -1,16 +1,15 @@ +import { useQuery } from "@tanstack/react-query"; +import { useState, type JSX } from "react"; +import type { L1StateType } from "./queries.ts"; +import Progress from "./Progress.tsx"; import { - epochSinceValuePadding, + errorMessageOf, + hasTransactionActivity, toText, txInfoPadding, type TxInfo, type WalletConfig, } from "./utils.ts"; -import Progress from "./Progress.tsx"; -import { l1StateOptions } from "./queries.ts"; -import { useState, type JSX } from "react"; -import { isPopulated, type I8Header } from "@ickb/lumos-utils"; -import { useQuery } from "@tanstack/react-query"; -import { parseEpoch, type EpochSinceValue } from "@ckb-lumos/base/lib/since"; export default function Action({ isCkb2Udt, @@ -18,87 +17,105 @@ export default function Action({ freeze, formReset, walletConfig, + l1State, + isStateFetching, + isStateStale, }: { isCkb2Udt: boolean; amount: bigint; - freeze: (s: boolean) => void; + freeze: (value: boolean) => void; formReset: () => void; walletConfig: WalletConfig; + l1State: L1StateType | undefined; + isStateFetching: boolean; + isStateStale: boolean; }): JSX.Element { const [message, setMessage] = useState(""); - const [frozenTxInfo, _setFrozenTxInfo] = useState(txInfoPadding); + const [failure, setFailure] = useState(""); + const [frozenTxInfo, setFrozenTxInfoState] = useState(txInfoPadding); const freezeTxInfo = (txInfo: TxInfo): void => { - _setFrozenTxInfo(txInfo); - freeze(txInfo != txInfoPadding); + setFrozenTxInfoState(txInfo); + freeze(txInfo !== txInfoPadding); }; + const isFrozen = frozenTxInfo !== txInfoPadding; - const { - data: l1Data, - isStale, - isFetching, - } = useQuery(l1StateOptions(walletConfig, isFrozen)); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const { txBuilder, tipHeader } = l1Data!; - const txInfo = isFrozen ? frozenTxInfo : txBuilder(isCkb2Udt, amount); + const stateId = l1State?.stateId ?? "missing"; + const txPreviewQuery = useQuery({ + queryKey: [ + walletConfig.chain, + walletConfig.address, + "txInfo", + stateId, + isCkb2Udt, + amount.toString(), + ], + queryFn: () => { + if (!l1State) { + throw new Error("Missing L1 state"); + } + + return l1State.txBuilder(isCkb2Udt, amount); + }, + enabled: !isFrozen && l1State !== undefined, + retry: false, + }); + + if (!l1State) { + return ; + } + + const txInfo = isFrozen ? frozenTxInfo : txPreviewQuery.data ?? txInfoPadding; + const isFetching = isStateFetching || txPreviewQuery.isFetching; const isValid = - isPopulated(txInfo.tx) && - txInfo.fee > 0n && - txInfo.estimatedMaturity !== epochSinceValuePadding && - txInfo.error === ""; - const { maturity, isReady } = timeUntilEpoch( + hasTransactionActivity(txInfo.tx) && txInfo.fee > 0n && txInfo.error === ""; + const { maturity, isReady } = timeUntilMaturity( txInfo.estimatedMaturity, - tipHeader, + l1State.tipTimestamp, ); return ( - + + {failure !== "" ? {failure} : null} Fee: {toText(txInfo.fee)} CKB - - Maturity: - + Maturity: {maturity} ); @@ -108,67 +125,74 @@ async function transact( txInfo: TxInfo, freezeTxInfo: (txInfo: TxInfo) => void, setMessage: (message: string) => void, + setFailure: (message: string) => void, formReset: () => void, walletConfig: WalletConfig, ): Promise { - const { rpc, sendSigned, queryClient } = walletConfig; + const { address, chain, cccClient, queryClient, signer } = walletConfig; + try { freezeTxInfo(txInfo); + setFailure(""); setMessage("Waiting for user confirmation..."); - const txHash = await sendSigned(txInfo.tx); + const txHash = await signer.sendTransaction(txInfo.tx); - let status = "pending"; - while (status === "pending" || status === "proposed") { + let status: string | undefined = "sent"; + while (status === undefined || ["sent", "pending", "proposed"].includes(status)) { setMessage("Waiting for network confirmation..."); - await new Promise((r) => setTimeout(r, 10000)); - status = (await rpc.getTransaction(txHash)).txStatus.status; + await new Promise((resolve) => setTimeout(resolve, 10000)); + status = (await cccClient.getTransaction(txHash))?.status; } - if (status === "committed") { - setMessage("Transaction confirmed!!!"); - formReset(); - } else { - setMessage("Something went wrong, retry in a minute"); + if (status !== "committed") { + throw new Error(`Transaction ended with status: ${status}`); } - await queryClient.invalidateQueries(l1StateOptions(walletConfig, true)); - await new Promise((r) => setTimeout(r, 10000)); + + setMessage("Transaction confirmed."); + formReset(); + await queryClient.invalidateQueries({ queryKey: [chain, address] }); + await new Promise((resolve) => setTimeout(resolve, 2000)); + } catch (error) { + setFailure(errorMessageOf(error)); } finally { - setMessage(""); + await queryClient.invalidateQueries({ queryKey: [chain, address] }); freezeTxInfo(txInfoPadding); + setMessage(""); } } -function timeUntilEpoch( - e: EpochSinceValue, - tipHeader: I8Header, +function timeUntilMaturity( + estimatedMaturity: bigint, + tipTimestamp: bigint, ): { maturity: string; isReady: boolean; } { - const t = parseEpoch(tipHeader.epoch); - const epochs = e.index / e.length - t.index / t.length + e.number - t.number; - if (epochs <= 0) { + const remaining = estimatedMaturity - tipTimestamp; + if (remaining <= 0n) { return { maturity: "⌛️ Ready", isReady: true }; } - if (epochs <= 0.375) { - //90 minutes + const minute = 60_000n; + const hour = 60n * minute; + const day = 24n * hour; + + if (remaining <= 90n * minute) { return { - maturity: `⏳ ${String(Math.ceil(epochs * 4 * 60))} minutes`, + maturity: `⏳ ${String(Number((remaining + minute - 1n) / minute))} minutes`, isReady: false, }; } - if (epochs <= 6) { - //24 hours + if (remaining <= day) { return { - maturity: `⏳ ${String(1 + Math.ceil(epochs * 4))} hours`, + maturity: `⏳ ${String(Number((remaining + hour - 1n) / hour))} hours`, isReady: false, }; } return { - maturity: `⏳ ${String(1 + Math.ceil(epochs / 6))} days`, + maturity: `⏳ ${String(Number((remaining + day - 1n) / day))} days`, isReady: false, }; } diff --git a/apps/interface/src/App.tsx b/apps/interface/src/App.tsx index 032d035..c508ef7 100644 --- a/apps/interface/src/App.tsx +++ b/apps/interface/src/App.tsx @@ -1,20 +1,21 @@ import { useDeferredValue, useState, type JSX } from "react"; import { useQuery } from "@tanstack/react-query"; +import Action from "./Action.tsx"; import { Dashboard } from "./Dashboard.tsx"; import Form from "./Form.tsx"; +import Progress from "./Progress.tsx"; +import { + getL1State, + l1StateQueryKey, + type L1StateType, +} from "./queries.ts"; import { - type WalletConfig, - symbol2Direction, direction2Symbol, - toText, - sanitize, + errorMessageOf, + symbol2Direction, toBigInt, - reservedCKB, + type WalletConfig, } from "./utils.ts"; -import { headerPlaceholder, l1StateOptions } from "./queries.ts"; -import Action from "./Action.tsx"; -import Progress from "./Progress.tsx"; -import { max } from "@ickb/lumos-utils"; export default function App({ walletConfig, @@ -23,68 +24,88 @@ export default function App({ }): JSX.Element { const [isFrozen, freeze] = useState(false); const [rawText, setRawText] = useState(direction2Symbol(true)); - const symbol = rawText[0]; + const l1StateQuery = useQuery({ + retry: 2, + refetchInterval: ({ state }) => 60000 * (state.data?.hasMatchable ? 1 : 10), + staleTime: 10000, + queryKey: l1StateQueryKey(walletConfig), + queryFn: async () => await getL1State(walletConfig), + enabled: !isFrozen, + }); + const symbol = rawText.startsWith("I") ? "I" : "C"; const isCkb2Udt = symbol2Direction(symbol); - let text = sanitize(rawText); - let amount = toBigInt(text); - - const { - ckbNative, - ickbNative, - ckbAvailable, - ickbAvailable, - ckbBalance, - ickbBalance, - tipHeader, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - } = useQuery(l1StateOptions(walletConfig, isFrozen)).data!; - - const conversionCap = isCkb2Udt - ? max(ckbAvailable - reservedCKB, 0n) - : ickbAvailable; - if (amount > conversionCap) { - amount = conversionCap; - text = toText(conversionCap); - } - + const amount = toBigInt(rawText.slice(1)); const formReset = (): void => { setRawText(direction2Symbol(isCkb2Udt)); }; - const deferredActionParams = useDeferredValue({ + const deferredActionParams = useDeferredValue<{ + isCkb2Udt: boolean; + amount: bigint; + freeze: (value: boolean) => void; + formReset: () => void; + walletConfig: WalletConfig; + l1State: L1StateType | undefined; + isStateFetching: boolean; + isStateStale: boolean; + }>({ isCkb2Udt, amount, freeze, formReset, walletConfig, + l1State: l1StateQuery.data, + isStateFetching: l1StateQuery.isFetching, + isStateStale: l1StateQuery.isStale, }); - if (tipHeader === headerPlaceholder) { + if (l1StateQuery.data === undefined) { + if (l1StateQuery.isError) { + return ( + <> + + + + Unable to load live iCKB state: {errorMessageOf(l1StateQuery.error)} + + + + + ); + } + return ( <> - - Downloading the latest L1 Cell data, just for you. Hang tight! - + Loading live iCKB state... ); } + const l1State = l1StateQuery.data; + return ( <>
diff --git a/apps/interface/src/Connector.tsx b/apps/interface/src/Connector.tsx index 252a237..91054ee 100644 --- a/apps/interface/src/Connector.tsx +++ b/apps/interface/src/Connector.tsx @@ -1,13 +1,10 @@ import { useQuery } from "@tanstack/react-query"; -import { I8Script, i8ScriptPadding, scriptEq } from "@ickb/lumos-utils"; -import type { Cell } from "@ckb-lumos/base"; -import type { RootConfig } from "./utils.ts"; -import { EmptyDashboard } from "./Dashboard.tsx"; +import { ccc } from "@ckb-ccc/ccc"; +import type { JSX } from "react/jsx-runtime"; import App from "./App.tsx"; +import { EmptyDashboard } from "./Dashboard.tsx"; import Progress from "./Progress.tsx"; -import { Transaction, type Signer } from "@ckb-ccc/ccc"; -import type { TransactionSkeletonType } from "@ckb-lumos/helpers"; -import type { JSX } from "react/jsx-runtime"; +import { errorMessageOf, type RootConfig } from "./utils.ts"; export default function Connector({ rootConfig, @@ -15,7 +12,7 @@ export default function Connector({ walletName, }: { rootConfig: RootConfig; - signer: Signer; + signer: ccc.Signer; walletName: string; }): JSX.Element { const { @@ -23,81 +20,47 @@ export default function Connector({ error, data: walletConfig, } = useQuery({ - queryKey: ["walletConfig"], + queryKey: [rootConfig.chain, "walletConfig"], queryFn: async () => { if (!(await signer.isConnected())) { await signer.connect(); } - const [address, recommendedAddressObj, addressObjs] = await Promise.all([ - signer.getRecommendedAddress(), + const [recommendedAddressObj, addressObjs] = await Promise.all([ signer.getRecommendedAddressObj(), signer.getAddressObjs(), ]); - let accountLocks = [recommendedAddressObj, ...addressObjs].map((s) => - I8Script.from({ - ...i8ScriptPadding, - // eslint-disable-next-line @typescript-eslint/no-misused-spread - ...s.script, - }), + let accountLocks = [recommendedAddressObj, ...addressObjs].map(({ script }) => + ccc.Script.from(script), ); - // Keep unique account locks, preferred one is the first one + + // Keep unique account locks, preferred one is the first one. accountLocks = [ - ...new Map( - accountLocks.map((s) => [`${s.args}-${s.hashType}-${s.codeHash}`, s]), - ).values(), + ...new Map(accountLocks.map((script) => [script.toHex(), script])).values(), ]; - const expander = (c: Cell): Readonly | undefined => { - const lock = c.cellOutput.lock; - for (const s of accountLocks) { - if (scriptEq(lock, s)) { - return s; - } - } - }; - - const getTxSizeOverhead = async ( - tx: TransactionSkeletonType, - ): Promise => { - const t0 = Transaction.fromLumosSkeleton(tx); - const size0 = t0.toBytes().length; // +4 - const t1 = await signer.prepareTransaction(t0); - const size1 = t1.toBytes().length; // +4 - return size1 - size0; - }; - - const sendSigned = async ( - tx: TransactionSkeletonType, - ): Promise<`0x${string}`> => - signer.sendTransaction(Transaction.fromLumosSkeleton(tx)); - return { ...rootConfig, - address, + signer, + address: recommendedAddressObj.toString(), accountLocks, - expander, - getTxSizeOverhead, - sendSigned, + primaryLock: accountLocks[0] ?? ccc.Script.from(recommendedAddressObj.script), }; }, }); - if (isPending) + if (isPending) { return ( <> Waiting for {walletName} authorization... ); + } if (error) { - setTimeout(function () { - console.log(error); - location.reload(); - }, 10000); - return

Unable to connect to {walletName} ⚠️

; + return

Unable to connect to {walletName}: {errorMessageOf(error)}

; } return ; diff --git a/apps/interface/src/Dashboard.tsx b/apps/interface/src/Dashboard.tsx index 59146ec..72b25d0 100644 --- a/apps/interface/src/Dashboard.tsx +++ b/apps/interface/src/Dashboard.tsx @@ -24,6 +24,7 @@ export function Dashboard({ {"{"} diff --git a/apps/interface/src/Form.tsx b/apps/interface/src/Form.tsx index 05633c3..f40e164 100644 --- a/apps/interface/src/Form.tsx +++ b/apps/interface/src/Form.tsx @@ -1,19 +1,19 @@ +import type { JSX } from "react"; +import { IckbSdk, type SystemState } from "@ickb/sdk"; import { - calculateOrderRatio, + CKB, direction2Symbol, - calculateOrderResult, reservedCKB, + sanitizeAmountInput, symbol2Direction, toText, } from "./utils.ts"; -import { CKB, max, min, type I8Header } from "@ickb/lumos-utils"; -import type { JSX } from "react"; export default function Form({ rawText, setRawText, amount, - tipHeader, + system, isFrozen, ckbNative, ickbNative, @@ -23,9 +23,9 @@ export default function Form({ ickbBalance, }: { rawText: string; - setRawText: (s: string) => void; + setRawText: (value: string) => void; amount: bigint; - tipHeader: I8Header; + system: SystemState; isFrozen: boolean; ckbNative: bigint; ickbNative: bigint; @@ -34,18 +34,20 @@ export default function Form({ ckbAvailable: bigint; ickbAvailable: bigint; }): JSX.Element { - const symbol = rawText[0]; + const symbol = rawText.startsWith("I") ? "I" : direction2Symbol(true); const text = rawText.slice(1); const isCkb2Udt = symbol2Direction(symbol); const toggle = (): void => { setRawText(direction2Symbol(!isCkb2Udt) + text); }; - const nnn = min(max(ckbAvailable - reservedCKB, 0n), ckbNative); + const spendableCkb = ckbAvailable > reservedCKB ? ckbAvailable - reservedCKB : 0n; + const nativeCkb = spendableCkb < ckbNative ? spendableCkb : ckbNative; + let a = { name: "CKB", - native: nnn, - locked: ckbBalance - nnn, + native: nativeCkb, + locked: ckbBalance - nativeCkb, status: ckbBalance === ckbNative ? "✅" @@ -54,7 +56,7 @@ export default function Form({ : "⏳", }; let b = { - name: "ICKB", + name: "iCKB", native: ickbNative, locked: ickbBalance - ickbNative, status: @@ -69,48 +71,40 @@ export default function Form({ } return ( - <> - - {display(a.native, "✅")} - {a.name} - - {display(a.locked, a.status)} - - { - setRawText(symbol + e.target.value); - }} - autoComplete="off" - inputMode="decimal" - type="text" - className="col-span-3 w-full rounded border-0 bg-transparent text-center text-3xl text-amber-400 outline-none disabled:cursor-default" - aria-label="Amount to be converted" - /> - {"1 " + a.name} - - - {approxConversion(isCkb2Udt, CKB, tipHeader)} {b.name} - - - ⏳{approxConversion(isCkb2Udt, amount, tipHeader)} - - {display(b.native, "✅")} - {b.name} - - {display(b.locked, b.status)} - + + {display(a.native, "✅")} + {a.name} + {display(a.locked, a.status)} + { + setRawText(symbol + sanitizeAmountInput(event.target.value)); + }} + autoComplete="off" + inputMode="decimal" + type="text" + className="col-span-3 w-full rounded border-0 bg-transparent text-center text-3xl text-amber-400 outline-none disabled:cursor-default" + aria-label="Amount to be converted" + /> + {`1 ${a.name}`} + + {approxConversion(isCkb2Udt, CKB, system)} {b.name} + + ⏳{approxConversion(isCkb2Udt, amount, system)} - + {display(b.native, "✅")} + {b.name} + {display(b.locked, b.status)} + ); } @@ -131,14 +125,13 @@ function display(shannons: bigint, prefix: string): JSX.Element { function approxConversion( isCkb2Udt: boolean, amount: bigint, - tipHeader: I8Header, + system: SystemState, ): string { - //Worst case scenario is a 0.001% fee for bot return toText( - calculateOrderResult( + IckbSdk.estimate( isCkb2Udt, - amount, - calculateOrderRatio(isCkb2Udt, tipHeader), - ), + isCkb2Udt ? { ckbValue: amount, udtValue: 0n } : { ckbValue: 0n, udtValue: amount }, + system, + ).convertedAmount, ); } diff --git a/apps/interface/src/main.tsx b/apps/interface/src/main.tsx index 9f57bc7..b31d7eb 100644 --- a/apps/interface/src/main.tsx +++ b/apps/interface/src/main.tsx @@ -1,58 +1,54 @@ import { StrictMode } from "react"; import { createRoot } from "react-dom/client"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import Connector from "./Connector.tsx"; -import { getIckbScriptConfigs } from "@ickb/v1-core"; -import { chainConfigFrom } from "@ickb/lumos-utils"; -import { prefetchData } from "./queries.ts"; import { ccc, JoyId } from "@ckb-ccc/ccc"; +import { getConfig, IckbSdk } from "@ickb/sdk"; +import Connector from "./Connector.tsx"; +import type { RootConfig } from "./utils.ts"; import appIcon from "/favicon.png?url"; + const appName = "iCKB DApp"; -const testnetRootConfigPromise = chainConfigFrom( - "testnet", - "https://testnet.ckb.dev/", - true, - getIckbScriptConfigs, -).then((chainConfig) => { - const rootConfig = { - ...chainConfig, - queryClient: new QueryClient(), - cccClient: new ccc.ClientPublicTestnet(), - }; - // eslint-disable-next-line @typescript-eslint/no-floating-promises - prefetchData(rootConfig); - return rootConfig; -}); +function createRootConfig(chain: "mainnet" | "testnet"): RootConfig { + const { managers, bots } = getConfig(chain); -const mainnetRootConfigPromise = chainConfigFrom( - "mainnet", - "https://mainnet.ckb.dev/", - true, - getIckbScriptConfigs, -).then((chainConfig) => { - const rootConfig = { - ...chainConfig, + return { + chain, queryClient: new QueryClient(), - cccClient: new ccc.ClientPublicMainnet(), + cccClient: + chain === "mainnet" + ? new ccc.ClientPublicMainnet() + : new ccc.ClientPublicTestnet(), + sdk: new IckbSdk( + managers.ownedOwner, + managers.logic, + managers.order, + bots, + ), + managers: { + ickbUdt: managers.ickbUdt, + logic: managers.logic, + ownedOwner: managers.ownedOwner, + order: managers.order, + }, }; - // eslint-disable-next-line @typescript-eslint/no-floating-promises - prefetchData(rootConfig); - return rootConfig; -}); +} + +const rootConfigs = { + mainnet: createRootConfig("mainnet"), + testnet: createRootConfig("testnet"), +}; -export async function startApp(wallet_chain: string): Promise { - const [walletName, chain] = wallet_chain.split("_"); - const rootConfig = await (chain === "mainnet" - ? mainnetRootConfigPromise - : testnetRootConfigPromise); +export function startApp(walletChain: string): void { + const [walletName, chain] = walletChain.split("_"); + const rootConfig = chain === "mainnet" ? rootConfigs.mainnet : rootConfigs.testnet; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const signer = JoyId.getJoyIdSigners( rootConfig.cccClient, appName, ["https://ickb.org", appIcon].join(""), - ).find((i) => i.name === "CKB")!.signer; + ).find((candidate) => candidate.name === "CKB")!.signer; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const rootElement = document.getElementById("app")!; diff --git a/apps/interface/src/queries.ts b/apps/interface/src/queries.ts index 8e24fec..c60cb90 100644 --- a/apps/interface/src/queries.ts +++ b/apps/interface/src/queries.ts @@ -1,40 +1,13 @@ +import { ccc } from "@ckb-ccc/ccc"; +import type { WithdrawalGroup } from "@ickb/core"; +import { type OrderGroup } from "@ickb/order"; +import { type SystemState } from "@ickb/sdk"; +import { collect, sum } from "@ickb/utils"; import { - encodeToAddress, - type TransactionSkeletonType, -} from "@ckb-lumos/helpers"; -import { queryOptions } from "@tanstack/react-query"; -import { - CKB, - I8Header, - calculateTxFee, - capacitySifter, - ckbDelta, - hex, - i8ScriptPadding, - lockExpanderFrom, - maturityDiscriminator, - max, - shuffle, - since, - txSize, -} from "@ickb/lumos-utils"; -import { - ickbDelta, - ickbLogicScript, - ickbPoolSifter, - ickbSifter, - limitOrderScript, - orderSifter, - ownedOwnerScript, -} from "@ickb/v1-core"; -import { - txInfoPadding, - type RootConfig, - type TxInfo, - type WalletConfig, -} from "./utils.ts"; -import { addChange, base as add, convert } from "./transaction.ts"; -import type { Cell, Header, HexNumber, Transaction } from "@ckb-lumos/base"; + buildTransactionPreview, + type TransactionContext, +} from "./transaction.ts"; +import { type TxInfo, type WalletConfig } from "./utils.ts"; export interface L1StateType { ckbNative: bigint; @@ -43,201 +16,130 @@ export interface L1StateType { ickbBalance: bigint; ckbAvailable: bigint; ickbAvailable: bigint; - tipHeader: Readonly; - txBuilder: (isCkb2Udt: boolean, amount: bigint) => TxInfo; + tipTimestamp: bigint; + system: SystemState; + stateId: string; + txBuilder: (isCkb2Udt: boolean, amount: bigint) => Promise; hasMatchable: boolean; } +export function l1StateQueryKey( + walletConfig: WalletConfig, +): readonly [WalletConfig["chain"], string, "l1State"] { + return [walletConfig.chain, walletConfig.address, "l1State"] as const; +} + export function l1StateOptions( walletConfig: WalletConfig, isFrozen: boolean, -): ReturnType< - typeof queryOptions -> { - return queryOptions({ - retry: true, +): { + retry: number; + refetchInterval: (context: { state: { data?: L1StateType } }) => number; + staleTime: number; + queryKey: readonly [WalletConfig["chain"], string, "l1State"]; + queryFn: () => Promise; + enabled: boolean; +} { + return { + retry: 2, refetchInterval: ({ state }) => 60000 * (state.data?.hasMatchable ? 1 : 10), staleTime: 10000, - queryKey: [walletConfig.chain, walletConfig.address, "l1State"], - queryFn: async (): Promise => { - return getL1State(walletConfig).catch((e: unknown) => { - console.log(e); - throw e; - }); - }, - placeholderData: { - ckbNative: 6n * CKB * CKB, - ickbNative: 3n * CKB * CKB, - ckbAvailable: 6n * CKB * CKB, - ickbAvailable: 3n * CKB * CKB, - ckbBalance: 6n * CKB * CKB, - ickbBalance: 3n * CKB * CKB, - tipHeader: headerPlaceholder, - txBuilder: () => txInfoPadding, - hasMatchable: false, - }, + queryKey: l1StateQueryKey(walletConfig), + queryFn: async () => await getL1State(walletConfig), enabled: !isFrozen, - }); -} - -async function getL1State(walletConfig: WalletConfig): Promise { - const { rpc, config, expander, getTxSizeOverhead } = walletConfig; - - const mixedCells = await getMixedCells(walletConfig); - - // Prefetch feeRate and tipHeader - const feeRatePromise = rpc.getFeeRate(61n); - const tipHeaderPromise = rpc.getTipHeader(); - - // Prefetch headers - const wanted = new Set(); - const deferredGetHeader = (blockNumber: string): Readonly => { - wanted.add(blockNumber); - return headerPlaceholder; - }; - ickbSifter(mixedCells, expander, deferredGetHeader, config); - const headersPromise = getHeadersByNumber(wanted, walletConfig); - - // Prefetch txs outputs - const wantedTxsOutputs = new Set(); - const deferredGetTxsOutputs = (txHash: string): never[] => { - wantedTxsOutputs.add(txHash); - return []; }; - orderSifter(mixedCells, expander, deferredGetTxsOutputs, config); - const txsOutputsPromise = getTxsOutputs(wantedTxsOutputs, walletConfig); - - // Do potentially costly operations - const { capacities, notCapacities } = capacitySifter(mixedCells, expander); - - // Await for headers - const headers = await headersPromise; +} - // Sift through iCKB related cells - const { - udts, - receipts, - withdrawalRequestGroups, - ickbPool: pool, - notIckbs, - } = ickbSifter( - notCapacities, - expander, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - (blockNumber) => headers.get(blockNumber)!, - config, +export async function getL1State( + walletConfig: WalletConfig, +): Promise { + const sdkState = await walletConfig.sdk.getL1State( + walletConfig.cccClient, + walletConfig.accountLocks, ); + const { system, user } = sdkState; + const [accountCells, receipts, withdrawalGroups] = await Promise.all([ + getAccountCells(walletConfig), + collect( + walletConfig.managers.logic.findReceipts( + walletConfig.cccClient, + walletConfig.accountLocks, + { onChain: true }, + ), + ), + collect( + walletConfig.managers.ownedOwner.findWithdrawalGroups( + walletConfig.cccClient, + walletConfig.accountLocks, + { onChain: true, tip: system.tip }, + ), + ), + ]); - const tipHeader = I8Header.from(await tipHeaderPromise); - // Partition between ripe and non ripe withdrawal requests - const { mature, notMature } = maturityDiscriminator( - withdrawalRequestGroups, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - (g) => g.ownedWithdrawalRequest.cellOutput.type![since], - tipHeader, + const capacityCells = accountCells.filter((cell) => cell.cellOutput.type === undefined); + const udtCells = accountCells.filter((cell) => + walletConfig.managers.ickbUdt.isUdt(cell), ); - - // min lock: 1/4 epoch (~ 1 hour) - const minLock = { length: 4, index: 1, number: 0 }; - // Sort the ickbPool based on the tip header - let ickbPool = ickbPoolSifter(pool, tipHeader, minLock); - // Take a random convenient subset of max 40 deposits - if (ickbPool.length > 40) { - const n = max(Math.round(ickbPool.length / 180), 40); - ickbPool = shuffle(ickbPool.slice(0, n).map((d, i) => ({ d, i }))) - .slice(0, 40) - .sort((a, b) => a.i - b.i) - .map((a) => a.d); - } - - // Await for txsOutputs - const txsOutputs = await txsOutputsPromise; - - // Sift through Orders - const { myOrders } = orderSifter( - notIckbs, - expander, - (txHash) => txsOutputs.get(txHash) ?? [], - config, + const nativeUdtInfo = await walletConfig.managers.ickbUdt.infoFrom( + walletConfig.cccClient, + udtCells, ); - const matchableOrders = []; - const completedOrders = []; - for (const o of myOrders) { - const { isMatchable, isDualRatio } = o.info; - if (isMatchable && !isDualRatio) { - matchableOrders.push(o); + const ckbNative = + sum(0n, ...capacityCells.map((cell) => cell.cellOutput.capacity)) + + nativeUdtInfo.capacity; + const ickbNative = nativeUdtInfo.balance; + + const readyWithdrawals: WithdrawalGroup[] = []; + const pendingWithdrawals: WithdrawalGroup[] = []; + for (const group of withdrawalGroups) { + if (group.owned.isReady) { + readyWithdrawals.push(group); } else { - // Withdraw completed orders and dual ratio orders - completedOrders.push(o); + pendingWithdrawals.push(group); } } - const hasMatchable = matchableOrders.length > 0; - - const txHasNonNative = - mature.length > 0 || receipts.length > 0 || completedOrders.length > 0; - - // Calculate native balances - let txInfo = add({ capacities, udts, tipHeader }); - const ckbNative = ckbDelta(txInfo.tx, config); - const ickbNative = ickbDelta(txInfo.tx, config); - - // Calculate Available balances and baseTx - txInfo = add({ - txInfo, - myOrders: completedOrders, - receipts, - wrGroups: mature, - tipHeader, - }); - const txSizeOverheadPromise = getTxSizeOverhead(txInfo.tx); - const ckbAvailable = ckbDelta(txInfo.tx, config); - const ickbAvailable = ickbDelta(txInfo.tx, config); - - // Calculate full balances - const fullTxInfo = add({ - txInfo, - myOrders: matchableOrders, - wrGroups: notMature, - tipHeader, - }); - const ckbBalance = ckbDelta(fullTxInfo.tx, config); - const ickbBalance = ickbDelta(fullTxInfo.tx, config); - txInfo = Object.freeze({ - ...txInfo, - estimatedMaturity: fullTxInfo.estimatedMaturity, - }); - - const [txSizeOverhead, feeRate] = await Promise.all([ - txSizeOverheadPromise, - feeRatePromise, - ]); - - const calculateFee = (tx: TransactionSkeletonType): bigint => - calculateTxFee(txSize(tx) + txSizeOverhead, feeRate); - - const txBuilder = (isCkb2Udt: boolean, amount: bigint): TxInfo => { - if (amount > 0n) { - return convert( - txInfo, - isCkb2Udt, - amount, - ickbPool, - tipHeader, - calculateFee, - walletConfig, - ); - } - - if (txHasNonNative) { - return addChange(txInfo, calculateFee, walletConfig); + const availableOrders: OrderGroup[] = []; + const pendingOrders: OrderGroup[] = []; + for (const group of user.orders) { + if (group.order.isDualRatio() || !group.order.isMatchable()) { + availableOrders.push(group); + } else { + pendingOrders.push(group); } + } - return Object.freeze({ - ...txInfo, - error: "Nothing to do for now", - }); + const ckbAvailable = + ckbNative + + sumCkb(receipts) + + sumCkb(readyWithdrawals) + + sumCkb(availableOrders); + const ickbAvailable = + ickbNative + + sumUdt(receipts) + + sumUdt(readyWithdrawals) + + sumUdt(availableOrders); + + const ckbBalance = ckbAvailable + sumCkb(pendingWithdrawals) + sumCkb(pendingOrders); + const ickbBalance = ickbAvailable + sumUdt(pendingWithdrawals) + sumUdt(pendingOrders); + + const estimatedMaturity = [ + system.tip.timestamp, + ...pendingWithdrawals.map((group) => group.owned.maturity.toUnix(system.tip)), + ...pendingOrders + .map((group) => group.order.maturity) + .filter((maturity): maturity is bigint => maturity !== undefined), + ].reduce((best, maturity) => (best > maturity ? best : maturity)); + + const txContext: TransactionContext = { + system, + receipts, + readyWithdrawals, + availableOrders, + ckbAvailable, + ickbAvailable, + estimatedMaturity, }; return { @@ -247,149 +149,52 @@ async function getL1State(walletConfig: WalletConfig): Promise { ickbBalance, ckbAvailable, ickbAvailable, - tipHeader, - txBuilder, - hasMatchable, - }; -} - -export async function prefetchData(rootConfig: RootConfig): Promise { - const { queryClient } = rootConfig; - const dummy: WalletConfig = { - ...rootConfig, - accountLocks: [i8ScriptPadding], - address: encodeToAddress(i8ScriptPadding, rootConfig), - expander: lockExpanderFrom(i8ScriptPadding), - getTxSizeOverhead: () => Promise.resolve(0), - sendSigned: () => Promise.resolve("0x0"), + tipTimestamp: system.tip.timestamp, + system, + stateId: [ + walletConfig.chain, + String(system.tip.timestamp), + String(receipts.length), + String(readyWithdrawals.length), + String(pendingWithdrawals.length), + String(availableOrders.length), + String(pendingOrders.length), + ].join(":"), + txBuilder: (isCkb2Udt, amount) => + buildTransactionPreview(txContext, isCkb2Udt, amount, walletConfig), + hasMatchable: pendingOrders.length > 0, }; - - return queryClient.prefetchQuery(l1StateOptions(dummy, false)); } -async function getMixedCells( - walletConfig: WalletConfig, -): Promise { - const { accountLocks, config, rpc } = walletConfig; - - return Object.freeze( - ( - await Promise.all( - [ - ...accountLocks, - ickbLogicScript(config), - ownedOwnerScript(config), - limitOrderScript(config), - ].map((lock) => rpc.getCellsByLock(lock, "desc", "max")), - ) - ).flat(), - ); -} - -async function getTxsOutputs( - txHashes: Set, - walletConfig: WalletConfig, -): Promise>> { - const { chain, rpc, queryClient } = walletConfig; - - const known: Readonly> = - queryClient.getQueryData([chain, "txsOutputs"]) ?? Object.freeze(new Map()); - - const result = new Map(); - const batch = rpc.createBatchRequest(); - for (const txHash of txHashes) { - const outputs = known.get(txHash); - if (outputs !== undefined) { - result.set(txHash, outputs); - continue; +async function getAccountCells(walletConfig: WalletConfig): Promise { + const cells: ccc.Cell[] = []; + + for (const lock of walletConfig.accountLocks) { + for await (const cell of walletConfig.cccClient.findCellsOnChain( + { + script: lock, + scriptType: "lock", + scriptSearchMode: "exact", + withData: true, + }, + "asc", + 400, + )) { + if (!cell.cellOutput.lock.eq(lock)) { + continue; + } + + cells.push(cell); } - batch.add("getTransaction", txHash); - } - - if (batch.length === 0) { - return known; } - for (const tx of (await batch.exec()).map( - ({ transaction: tx }: { transaction: Transaction }) => tx, - )) { - result.set( - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - tx.hash!, - Object.freeze( - tx.outputs.map(({ lock, type, capacity }, index) => - Object.freeze({ - cellOutput: Object.freeze({ - lock: Object.freeze(lock), - type: Object.freeze(type), - capacity: Object.freeze(capacity), - }), - data: Object.freeze(tx.outputsData[index] ?? "0x"), - outPoint: Object.freeze({ - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - txHash: tx.hash!, - index: hex(index), - }), - } as Cell), - ), - ), - ); - } - - const frozenResult = Object.freeze(result); - queryClient.setQueryData([chain, "txsOutputs"], frozenResult); - return frozenResult; + return cells; } -async function getHeadersByNumber( - wanted: Set, - walletConfig: WalletConfig, -): Promise>>> { - const { chain, rpc, queryClient } = walletConfig; - - const known: Readonly>> = - queryClient.getQueryData([chain, "headers"]) ?? Object.freeze(new Map()); - - const result = new Map>(); - const batch = rpc.createBatchRequest(); - for (const blockNum of wanted) { - const h = known.get(blockNum); - if (h !== undefined) { - result.set(blockNum, h); - continue; - } - batch.add("getHeaderByNumber", blockNum); - } - - if (batch.length === 0) { - return known; - } - - for (const h of (await batch.exec()) as Header[]) { - result.set(h.number, I8Header.from(h)); - } - - const frozenResult = Object.freeze(result); - queryClient.setQueryData([chain, "headers"], frozenResult); - - return frozenResult; +function sumCkb(items: { ckbValue: bigint }[]): bigint { + return sum(0n, ...items.map((item) => item.ckbValue)); } -export const headerPlaceholder = I8Header.from({ - compactTarget: "0x1a08a97e", - parentHash: - "0x0000000000000000000000000000000000000000000000000000000000000000", - transactionsRoot: - "0x31bf3fdf4bc16d6ea195dbae808e2b9a8eca6941d589f6959b1d070d51ac28f7", - proposalsHash: - "0x0000000000000000000000000000000000000000000000000000000000000000", - extraHash: - "0x0000000000000000000000000000000000000000000000000000000000000000", - dao: "0x8874337e541ea12e0000c16ff286230029bfa3320800000000710b00c0fefe06", - epoch: "0x0", - hash: "0x92b197aa1fba0f63633922c61c92375c9c074a93e85963554f5499fe1450d0e5", - nonce: "0x0", - number: "0x0", - timestamp: "0x16e70e6985c", - version: "0x0", -}); +function sumUdt(items: { udtValue: bigint }[]): bigint { + return sum(0n, ...items.map((item) => item.udtValue)); +} diff --git a/apps/interface/src/transaction.ts b/apps/interface/src/transaction.ts index 1eb772e..b25fed9 100644 --- a/apps/interface/src/transaction.ts +++ b/apps/interface/src/transaction.ts @@ -1,291 +1,344 @@ -import { type TransactionSkeletonType } from "@ckb-lumos/helpers"; +import { ccc } from "@ckb-ccc/ccc"; import { - addCells, - addCkbChange, - binarySearch, - since, - type I8Cell, - type I8Header, -} from "@ickb/lumos-utils"; + ICKB_DEPOSIT_CAP, + convert, + type IckbDepositCell, + type ReceiptCell, + type WithdrawalGroup, +} from "@ickb/core"; +import { type OrderGroup } from "@ickb/order"; +import { collect, sum } from "@ickb/utils"; +import { IckbSdk, type SystemState } from "@ickb/sdk"; import { - addIckbUdtChange, - addOwnedWithdrawalRequestsChange, - addReceiptDepositsChange, - addWithdrawalRequestGroups, - ickb2Ckb, - ickbDeposit, - ickbRequestWithdrawalFrom, - orderMelt, - orderMint, - type ExtendedDeposit, - type MyOrder, - type OrderRatio, -} from "@ickb/v1-core"; -import { - calculateOrderRatio, - calculateOrderResult, - maxEpoch, - orderMaturityEstimate, + errorMessageOf, + hasTransactionActivity, txInfoPadding, type TxInfo, type WalletConfig, } from "./utils.ts"; -import { ckbSoftCapPerDeposit } from "@ickb/v1-core"; -import { - parseAbsoluteEpochSince, - parseEpoch, - type EpochSinceValue, -} from "@ckb-lumos/base/lib/since"; -import { headerPlaceholder } from "./queries.ts"; - -export function base({ - txInfo = txInfoPadding, - capacities = new Array(), - udts = new Array(), - receipts = new Array(), - wrGroups = new Array< - Readonly<{ - ownedWithdrawalRequest: I8Cell; - owner: I8Cell; - }> - >(), - myOrders = new Array(), - tipHeader = headerPlaceholder, -}): Readonly { - let { tx } = txInfo; - const estimatedMaturities = [ - txInfo.estimatedMaturity, - parseEpoch(tipHeader.epoch), - ]; - - if (myOrders.length > 0) { - tx = orderMelt(tx, myOrders); - for (const { info: i } of myOrders) { - if (!i.isMatchable || i.isDualRatio) { - continue; + +const MAX_DIRECT_DEPOSITS = 60; +const MAX_WITHDRAWAL_REQUESTS = 30; + +export interface TransactionContext { + system: SystemState; + receipts: ReceiptCell[]; + readyWithdrawals: WithdrawalGroup[]; + availableOrders: OrderGroup[]; + ckbAvailable: bigint; + ickbAvailable: bigint; + estimatedMaturity: bigint; +} + +export async function buildTransactionPreview( + context: TransactionContext, + isCkb2Udt: boolean, + amount: bigint, + walletConfig: WalletConfig, +): Promise { + try { + if (amount < 0n) { + return txInfoWithError("Amount must be positive", context.estimatedMaturity); + } + + if (isCkb2Udt && amount > context.ckbAvailable) { + return txInfoWithError("Not enough CKB", context.estimatedMaturity); + } + + if (!isCkb2Udt && amount > context.ickbAvailable) { + return txInfoWithError("Not enough iCKB", context.estimatedMaturity); + } + + const baseTx = await buildBaseTransaction(context, walletConfig); + + if (amount === 0n) { + if (!hasTransactionActivity(baseTx)) { + return txInfoWithError("Nothing to do for now", context.estimatedMaturity); } - const isCkb2Udt = i.isCkb2UdtMatchable; - estimatedMaturities.push( - orderMaturityEstimate( - isCkb2Udt, - isCkb2Udt ? i.ckbUnoccupied : i.udtAmount, - tipHeader, - ), + + return await finalizeTransaction( + baseTx, + context.estimatedMaturity, + walletConfig, ); } + + return await (isCkb2Udt + ? buildCkbToIckbPreview(baseTx, context, amount, walletConfig) + : buildIckbToCkbPreview(baseTx, context, amount, walletConfig)); + } catch (error) { + return txInfoWithError(errorMessageOf(error), context.estimatedMaturity); } - const cc = [capacities, udts, receipts].flat(); - if (cc.length > 0) { - tx = addCells(tx, "append", cc, []); - } - if (wrGroups.length > 0) { - tx = addWithdrawalRequestGroups(tx, wrGroups); - estimatedMaturities.push( - ...wrGroups.map((g) => - parseAbsoluteEpochSince( - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - g.ownedWithdrawalRequest.cellOutput.type![since], - ), - ), - ); +} + +async function buildBaseTransaction( + context: TransactionContext, + walletConfig: WalletConfig, +): Promise { + let tx = ccc.Transaction.default(); + + if (context.availableOrders.length > 0) { + tx = walletConfig.sdk.collect(tx, context.availableOrders); } - const estimatedMaturity = Object.freeze(maxEpoch(estimatedMaturities)); - return Object.freeze({ ...txInfo, tx, estimatedMaturity }); -} + if (context.receipts.length > 0) { + tx = walletConfig.managers.logic.completeDeposit(tx, context.receipts); + } -type MyExtendedDeposit = ExtendedDeposit & { ickbCumulative: bigint }; + if (context.readyWithdrawals.length > 0) { + tx = await walletConfig.managers.ownedOwner.withdraw( + tx, + context.readyWithdrawals, + walletConfig.cccClient, + ); + } -export interface ConversionAttempt { - tx: TransactionSkeletonType; - error: string; - fee: bigint; - estimatedMaturity: EpochSinceValue; + return tx; } -export function convert( - txInfo: TxInfo, - isCkb2Udt: boolean, +async function buildCkbToIckbPreview( + baseTx: ccc.Transaction, + context: TransactionContext, amount: bigint, - deposits: readonly ExtendedDeposit[], - tipHeader: I8Header, - calculateFee: (tx: TransactionSkeletonType) => bigint, walletConfig: WalletConfig, -): Readonly { - if (txInfo.error !== "") { - return txInfo; - } +): Promise { + const depositAmount = convert(false, ICKB_DEPOSIT_CAP, context.system.exchangeRatio); + const depositQuotient = depositAmount === 0n ? 0n : amount / depositAmount; + const maxDeposits = + depositQuotient > BigInt(MAX_DIRECT_DEPOSITS) + ? MAX_DIRECT_DEPOSITS + : Number(depositQuotient); - const ickbPool: MyExtendedDeposit[] = []; - if (!isCkb2Udt) { - // Filter deposits - let ickbCumulative = 0n; - for (const d of deposits) { - const c = ickbCumulative + d.ickbValue; - if (c > amount) { - continue; + return findBestAttempt(maxDeposits, async (depositCount) => { + try { + let tx = baseTx.clone(); + let estimatedMaturity = context.estimatedMaturity; + + if (depositCount > 0) { + tx = await walletConfig.managers.logic.deposit( + tx, + depositCount, + depositAmount, + walletConfig.primaryLock, + walletConfig.cccClient, + ); } - ickbCumulative = c; - ickbPool.push(Object.freeze({ ...d, ickbCumulative })); - if (ickbPool.length >= 30) { - break; + + const remainder = amount - depositAmount * BigInt(depositCount); + if (remainder > 0n) { + const amounts = { ckbValue: remainder, udtValue: 0n }; + const estimate = IckbSdk.estimate(true, amounts, context.system); + if (estimate.maturity === undefined) { + return txInfoWithError("Amount too small to build a transaction", estimatedMaturity); + } + + estimatedMaturity = maxMaturity(estimatedMaturity, estimate.maturity); + tx = await walletConfig.sdk.request( + tx, + walletConfig.primaryLock, + estimate.info, + amounts, + ); } + + return await finalizeTransaction(tx, estimatedMaturity, walletConfig); + } catch (error) { + return txInfoWithError(errorMessageOf(error), context.estimatedMaturity); } - } - Object.freeze(ickbPool); - - const ratio = calculateOrderRatio(isCkb2Udt, tipHeader); - const depositAmount = ckbSoftCapPerDeposit(tipHeader); - const N = isCkb2Udt ? Number(amount / depositAmount) : ickbPool.length; - const txCache = Array(N); - const attempt = (n: number): Readonly => { - n = N - n; - return (txCache[n] = - txCache[n] ?? - convertAttempt( - n, - isCkb2Udt, - amount, - txInfo, - ratio, - depositAmount, - ickbPool, - tipHeader, - calculateFee, - walletConfig, - )); - }; - return Object.freeze( - attempt(binarySearch(N, (n) => attempt(n).error === "")), - ); + }); } -function convertAttempt( - quantity: number, - isCkb2Udt: boolean, +async function buildIckbToCkbPreview( + baseTx: ccc.Transaction, + context: TransactionContext, amount: bigint, - txInfo: TxInfo, - ratio: OrderRatio, - depositAmount: bigint, - ickbPool: readonly MyExtendedDeposit[], - tipHeader: I8Header, - calculateFee: (tx: TransactionSkeletonType) => bigint, walletConfig: WalletConfig, -): ConversionAttempt { - let { tx } = txInfo; - const { accountLocks, config } = walletConfig; - const estimatedMaturities = [txInfo.estimatedMaturity]; - if (quantity > 0) { - if (isCkb2Udt) { - amount -= depositAmount * BigInt(quantity); - if (amount < 0n) { - return { - ...txInfo, - error: "Too many Deposits respectfully to the amount", - }; - } - tx = ickbDeposit(tx, quantity, depositAmount, config); - tx = addReceiptDepositsChange(tx, accountLocks[0], config); - } else { - if (ickbPool.length < quantity) { - return { - ...txInfo, - error: "Not enough Deposits to withdraw from", - }; - } - amount -= ickbPool[quantity - 1].ickbCumulative; - if (amount < 0n) { - return { - ...txInfo, - error: "Too many Withdrawal Requests respectfully to the amount", - }; +): Promise { + const deposits = await collect( + walletConfig.managers.logic.findDeposits(walletConfig.cccClient, { + onChain: true, + tip: context.system.tip, + }), + ); + + const candidates = deposits + .filter((deposit) => deposit.isReady) + .sort((left, right) => compareBigInt( + left.maturity.toUnix(context.system.tip), + right.maturity.toUnix(context.system.tip), + )); + + return findBestAttempt( + Math.min(candidates.length, MAX_WITHDRAWAL_REQUESTS), + async (withdrawalCount) => { + try { + let tx = ccc.Transaction.default(); + let estimatedMaturity = context.estimatedMaturity; + let remainder = amount; + + if (withdrawalCount > 0) { + const selectedDeposits = selectReadyDeposits( + candidates, + withdrawalCount, + remainder, + ); + if (selectedDeposits.length !== withdrawalCount) { + return txInfoWithError( + "Not enough ready deposits to convert now", + estimatedMaturity, + ); + } + + tx = await walletConfig.managers.ownedOwner.requestWithdrawal( + tx, + selectedDeposits, + walletConfig.primaryLock, + walletConfig.cccClient, + ); + + remainder -= sum(0n, ...selectedDeposits.map((deposit) => deposit.udtValue)); + for (const deposit of selectedDeposits) { + estimatedMaturity = maxMaturity( + estimatedMaturity, + deposit.maturity.toUnix(context.system.tip), + ); + } + } + + tx = appendTransaction(tx, baseTx); + + if (remainder > 0n) { + const amounts = { ckbValue: 0n, udtValue: remainder }; + const estimate = IckbSdk.estimate(false, amounts, context.system); + if (estimate.maturity === undefined) { + return txInfoWithError("Amount too small to build a transaction", estimatedMaturity); + } + + estimatedMaturity = maxMaturity(estimatedMaturity, estimate.maturity); + tx = await walletConfig.sdk.request( + tx, + walletConfig.primaryLock, + estimate.info, + amounts, + ); + } + + return await finalizeTransaction(tx, estimatedMaturity, walletConfig); + } catch (error) { + return txInfoWithError(errorMessageOf(error), context.estimatedMaturity); } - ickbPool = ickbPool.slice(0, quantity); - const deposits = ickbPool.map((d) => d.deposit); - tx = ickbRequestWithdrawalFrom(tx, deposits, config); - tx = addOwnedWithdrawalRequestsChange(tx, accountLocks[0], config); - estimatedMaturities.push(...ickbPool.map((d) => d.estimatedMaturity)); - } - } + }, + ); +} - let orderFee = 0n; - if (amount > 0n) { - tx = orderMint( - tx, - accountLocks[0], - config, - isCkb2Udt ? amount : undefined, - isCkb2Udt ? undefined : amount, - isCkb2Udt ? ratio : undefined, - isCkb2Udt ? undefined : ratio, +async function finalizeTransaction( + tx: ccc.Transaction, + estimatedMaturity: bigint, + walletConfig: WalletConfig, +): Promise { + tx = await walletConfig.managers.ickbUdt.completeBy(tx, walletConfig.signer); + await tx.completeFeeBy(walletConfig.signer); + + if (await ccc.isDaoOutputLimitExceeded(tx, walletConfig.cccClient)) { + throw new Error( + `NervosDAO transaction has ${String(tx.outputs.length)} output cells, exceeding the limit of 64`, ); + } - const convertedAmount = calculateOrderResult(isCkb2Udt, amount, ratio); - orderFee += isCkb2Udt - ? amount - ickb2Ckb(convertedAmount, tipHeader) - : ickb2Ckb(amount, tipHeader) - convertedAmount; + return Object.freeze({ + tx, + error: "", + fee: await tx.getFee(walletConfig.cccClient), + estimatedMaturity, + }); +} - estimatedMaturities.push( - orderMaturityEstimate(isCkb2Udt, amount, tipHeader), - ); +async function findBestAttempt( + maxQuantity: number, + build: (quantity: number) => Promise, +): Promise { + let firstError: TxInfo | undefined; + for (let quantity = maxQuantity; quantity >= 0; quantity -= 1) { + const attempt = await build(quantity); + if (attempt.error === "") { + return attempt; + } + + firstError ??= attempt; } - const estimatedMaturity = maxEpoch(estimatedMaturities); + return firstError ?? txInfoWithError("Nothing to do for now", 0n); +} - txInfo = addChange( - { ...txInfo, tx, estimatedMaturity, fee: txInfo.fee + orderFee }, - calculateFee, - walletConfig, - ); +function selectReadyDeposits( + deposits: IckbDepositCell[], + wanted: number, + amount: bigint, +): IckbDepositCell[] { + const selected: IckbDepositCell[] = []; + let cumulative = 0n; + + for (const deposit of deposits) { + if (selected.length >= wanted) { + break; + } - // Check that order provides enough fee to the bot for being matched - if (!txInfo.error && 10n * (txInfo.fee - orderFee) > orderFee) { - if (isCkb2Udt) { - return { ...txInfo, error: "CKB amount too small" }; - } else { - return { ...txInfo, error: "iCKB amount too small" }; + if (cumulative + deposit.udtValue > amount) { + continue; } + + cumulative += deposit.udtValue; + selected.push(deposit); } - return txInfo; + + return selected; } -export function addChange( - txInfo: TxInfo, - calculateFee: (tx: TransactionSkeletonType) => bigint, - walletConfig: WalletConfig, -): Readonly<{ - tx: TransactionSkeletonType; - error: string; - fee: bigint; - estimatedMaturity: EpochSinceValue; -}> { - const { accountLocks, config } = walletConfig; - const { tx: intermediateTx, freeIckbUdt: freeIckb } = addIckbUdtChange( - txInfo.tx, - accountLocks[0], - config, - ); - const { tx, txFee, freeCkb } = addCkbChange( - intermediateTx, - accountLocks[0], - calculateFee, - config, - ); +function appendTransaction( + target: ccc.Transaction, + source: ccc.Transaction, +): ccc.Transaction { + for (const cellDep of source.cellDeps) { + target.addCellDeps(cellDep); + } - const fee = txInfo.fee + txFee; - txInfo = { ...txInfo, tx, fee }; + for (const headerDep of source.headerDeps) { + if (!target.headerDeps.some((hash) => hash === headerDep)) { + target.headerDeps.push(headerDep); + } + } - if (freeCkb < 0n) { - return { ...txInfo, error: "Not enough CKB" }; + for (const input of source.inputs) { + target.inputs.push(input); } - if (freeIckb < 0n) { - return { ...txInfo, error: "Not enough iCKB" }; + target.outputs.push(...source.outputs); + target.outputsData.push(...source.outputsData); + target.witnesses.push(...source.witnesses); + + return target; +} + +function txInfoWithError(error: string, estimatedMaturity: bigint): TxInfo { + return Object.freeze({ + ...txInfoPadding, + error, + estimatedMaturity, + }); +} + +function compareBigInt(left: bigint, right: bigint): number { + if (left < right) { + return -1; } - if (tx.outputs.size > 64) { - return { ...txInfo, error: "More than 64 output cells" }; + if (left > right) { + return 1; } - return txInfo; + return 0; +} + +function maxMaturity(left: bigint, right: bigint): bigint { + return left > right ? left : right; } diff --git a/apps/interface/src/utils.ts b/apps/interface/src/utils.ts index 9935b94..8058659 100644 --- a/apps/interface/src/utils.ts +++ b/apps/interface/src/utils.ts @@ -1,160 +1,121 @@ -import type { Cell, HexString } from "@ckb-lumos/base"; -import { - TransactionSkeleton, - type TransactionSkeletonType, -} from "@ckb-lumos/helpers"; +import { ccc } from "@ckb-ccc/ccc"; import type { QueryClient } from "@tanstack/react-query"; -import { - CKB, - epochSinceAdd, - epochSinceCompare, - type ChainConfig, - type I8Header, - type I8Script, -} from "@ickb/lumos-utils"; -import { parseEpoch, type EpochSinceValue } from "@ckb-lumos/base/lib/since"; -import { ickbExchangeRatio, type OrderRatio } from "@ickb/v1-core"; - -export interface RootConfig extends ChainConfig { +import type { IckbUdt, LogicManager, OwnedOwnerManager } from "@ickb/core"; +import type { OrderManager } from "@ickb/order"; +import type { IckbSdk } from "@ickb/sdk"; + +export interface RootConfig { + chain: "mainnet" | "testnet"; + cccClient: ccc.Client; queryClient: QueryClient; + sdk: IckbSdk; + managers: { + ickbUdt: IckbUdt; + logic: LogicManager; + ownedOwner: OwnedOwnerManager; + order: OrderManager; + }; } export interface WalletConfig extends RootConfig { - address: HexString; - accountLocks: I8Script[]; - expander: (c: Cell) => I8Script | undefined; - getTxSizeOverhead: (tx: TransactionSkeletonType) => Promise; - sendSigned: (tx: TransactionSkeletonType) => Promise<`0x${string}`>; + signer: ccc.Signer; + address: string; + accountLocks: ccc.Script[]; + primaryLock: ccc.Script; } -export function symbol2Direction(s: string): boolean { - return s === "C"; -} +export type TxInfo = Readonly<{ + tx: ccc.Transaction; + error: string; + fee: bigint; + estimatedMaturity: bigint; +}>; -export function direction2Symbol(d: boolean): string { - return d ? "C" : "I"; +export const txInfoPadding: TxInfo = Object.freeze({ + tx: ccc.Transaction.default(), + error: "", + fee: 0n, + estimatedMaturity: 0n, +}); + +export const CKB = ccc.fixedPointFrom(1); + +// reservedCKB are reserved for state rent in conversions +export const reservedCKB = 600n * CKB; + +export function symbol2Direction(symbol: string): boolean { + return symbol !== "I"; } -export function sanitize(text: string): string { - // Filter leading zeros - let i = 0; - for (; i < text.length; i++) { - const c = text[i]; - if (("1" <= c && c <= "9") || c === ".") { - break; - } - } +export function direction2Symbol(isCkb2Udt: boolean): string { + return isCkb2Udt ? "C" : "I"; +} - //Filter decimal part - let dot = ""; - const decimalChars: string[] = []; - for (; i < text.length; i++) { - const c = text[i]; - if ("0" <= c && c <= "9") { - decimalChars.push(c); - } else if (c == ".") { - dot = "."; - break; +export function sanitizeAmountInput(text: string): string { + let sanitized = ""; + let seenDot = false; + let fractionalDigits = 0; + + for (const char of text) { + if (char >= "0" && char <= "9") { + if (!seenDot) { + sanitized += char; + } else if (fractionalDigits < 8) { + sanitized += char; + fractionalDigits += 1; + } + continue; } - } - //Filter fractional part - const fractionalChars: string[] = []; - for (; i < text.length && fractionalChars.length < 8; i++) { - const c = text[i]; - if ("0" <= c && c <= "9") { - fractionalChars.push(c); + if (char === "." && !seenDot) { + sanitized = sanitized === "" ? "0." : `${sanitized}.`; + seenDot = true; } } - return ( - (decimalChars.length > 0 - ? BigInt(decimalChars.join("")).toLocaleString("en-US") - : dot.length > 0 - ? "0" - : "") + - dot + - fractionalChars.join("") - ); + return sanitized; } -export function toText(n: bigint): string { - return ( - (n / CKB).toLocaleString("en-US") + - String(Number(n % CKB) / Number(CKB)).slice(1) - ); +export function toText(amount: bigint): string { + const text = ccc.fixedPointToString(amount); + return text.replace(/(\.\d*?[1-9])0+$/u, "$1").replace(/\.0*$/u, ""); } export function toBigInt(text: string): bigint { - const [decimal, ...fractionals] = text.split(",").join("").split("."); - return BigInt(decimal + (fractionals.join("") + "00000000").slice(0, 8)); -} - -// Estimate bot ability to fulfill orders: -// - CKB to iCKB orders at 100k CKB every minute -// - iCKB to CKB orders at 200 CKB every minute -export function orderMaturityEstimate( - isCkb2Udt: boolean, - amount: bigint, - tipHeader: I8Header, -): Readonly { - return Object.freeze( - epochSinceAdd(parseEpoch(tipHeader.epoch), { - number: 0, - index: 1 + Number(amount / (isCkb2Udt ? 100000n * CKB : 200n * CKB)), - length: 4 * 60, - }), - ); -} + if (text === "") { + return 0n; + } -export function maxEpoch(ee: EpochSinceValue[]): EpochSinceValue { - return ee.reduce((a, b) => (epochSinceCompare(a, b) === -1 ? b : a)); + const [wholePart, fractionalPart = ""] = text.split(".", 2); + const whole = wholePart === "" ? "0" : wholePart; + const fraction = (fractionalPart + "00000000").slice(0, 8); + return BigInt(whole) * CKB + BigInt(fraction); } -export const epochSinceValuePadding = Object.freeze({ - number: 0, - index: 0, - length: 1, -}); +export function errorMessageOf(error: unknown): string { + if (error instanceof Error && error.message) { + return error.message; + } -export type TxInfo = Readonly<{ - tx: TransactionSkeletonType; - error: string; - fee: bigint; - estimatedMaturity: EpochSinceValue; -}>; + if (typeof error === "string") { + return error; + } -export const txInfoPadding: TxInfo = Object.freeze({ - tx: TransactionSkeleton(), - error: "", - fee: 0n, - estimatedMaturity: epochSinceValuePadding, -}); + if (typeof error === "object" && error !== null) { + try { + return JSON.stringify(error); + } catch { + return "Unknown error"; + } + } -// reservedCKB are reserved for state rent in conversions -export const reservedCKB = 600n * CKB; + if (typeof error === "number" || typeof error === "boolean" || typeof error === "bigint") { + return String(error); + } -// Calculate ratio in a way to pay 0.001% fee to bot -export function calculateOrderRatio( - isCkb2Udt: boolean, - tipHeader: I8Header, -): OrderRatio { - const { ckbMultiplier, udtMultiplier } = ickbExchangeRatio(tipHeader); - return { - ckbMultiplier, - udtMultiplier: - // Pay 0.001% fee to bot - udtMultiplier + (isCkb2Udt ? 1n : -1n) * (udtMultiplier / 100000n), - }; + return "Unknown error"; } -export function calculateOrderResult( - isCkb2Udt: boolean, - amount: bigint, - ratio: OrderRatio, -): bigint { - const { ckbMultiplier, udtMultiplier } = ratio; - return isCkb2Udt - ? (amount * ckbMultiplier) / udtMultiplier - : (amount * udtMultiplier) / ckbMultiplier; +export function hasTransactionActivity(tx: ccc.Transaction): boolean { + return tx.inputs.length > 0 || tx.outputs.length > 0; } diff --git a/apps/interface/vite.config.ts b/apps/interface/vite.config.ts index e543e4d..ecbc54f 100644 --- a/apps/interface/vite.config.ts +++ b/apps/interface/vite.config.ts @@ -1,22 +1,56 @@ import tailwindcss from "@tailwindcss/vite"; import basicSsl from "@vitejs/plugin-basic-ssl"; import react from "@vitejs/plugin-react"; +import { fileURLToPath } from "node:url"; import { defineConfig } from "vite"; +const monorepoRoot = fileURLToPath(new URL("../..", import.meta.url)); + // Local CCC iteration resolves built output from forks/ccc/repo, so the // interface no longer needs the old raw-fork-source Babel/shim escape hatches. // https://vitejs.dev/config/ export default defineConfig({ + resolve: { + alias: { + "@ickb/core": fileURLToPath( + new URL("../../packages/core/dist/index.js", import.meta.url), + ), + "@ickb/order": fileURLToPath( + new URL("../../packages/order/dist/index.js", import.meta.url), + ), + "@ickb/sdk": fileURLToPath( + new URL("../../packages/sdk/dist/index.js", import.meta.url), + ), + "@ickb/utils": fileURLToPath( + new URL("../../packages/utils/dist/index.js", import.meta.url), + ), + }, + }, server: { host: true, }, plugins: [ tailwindcss(), react({ + include: [/\.[jt]sx?$/u], + exclude: [ + /\/packages\/core\/src\//u, + /\/packages\/order\/src\//u, + /\/packages\/sdk\/src\//u, + /\/packages\/utils\/src\//u, + ], babel: { plugins: [["babel-plugin-react-compiler"]], }, }), basicSsl(), ], + optimizeDeps: { + exclude: ["@ickb/core", "@ickb/order", "@ickb/sdk", "@ickb/utils"], + }, + build: { + commonjsOptions: { + include: [/node_modules/u, new RegExp(`${monorepoRoot}/packages/.+/dist/`)], + }, + }, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b52269e..6fdd061 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -108,36 +108,21 @@ importers: '@ckb-ccc/ccc': specifier: workspace:* version: link:../../forks/ccc/repo/packages/ccc - '@ckb-lumos/base': - specifier: ^0.23.0 - version: 0.23.0 - '@ckb-lumos/codec': - specifier: ^0.23.0 - version: 0.23.0 - '@ckb-lumos/common-scripts': - specifier: ^0.23.0 - version: 0.23.0 - '@ckb-lumos/config-manager': - specifier: ^0.23.0 - version: 0.23.0 - '@ckb-lumos/helpers': - specifier: ^0.23.0 - version: 0.23.0 - '@ckb-lumos/rpc': - specifier: ^0.23.0 - version: 0.23.0 - '@ickb/lumos-utils': - specifier: 1.4.2 - version: 1.4.2 - '@ickb/v1-core': - specifier: 1.4.2 - version: 1.4.2 + '@ickb/core': + specifier: workspace:* + version: link:../../packages/core + '@ickb/order': + specifier: workspace:* + version: link:../../packages/order + '@ickb/sdk': + specifier: workspace:* + version: link:../../packages/sdk + '@ickb/utils': + specifier: workspace:* + version: link:../../packages/utils '@tanstack/react-query': specifier: ^5.90.5 version: 5.100.9(react@19.2.5) - immutable: - specifier: ^4.3.7 - version: 4.3.8 react: specifier: ^19.2.0 version: 19.2.5 From a85520a157f8b36b20f70c78203a3f57fe62ae66 Mon Sep 17 00:00:00 2001 From: phroi <90913182+phroi@users.noreply.github.com> Date: Tue, 5 May 2026 17:28:21 +0000 Subject: [PATCH 2/3] fix: bound interface confirmation polling Stop the CCC confirmation loop from waiting forever when a transaction never reaches a terminal state. Surface a timeout error instead so the interface can recover and the user gets a concrete failure message. --- apps/interface/src/Action.tsx | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/apps/interface/src/Action.tsx b/apps/interface/src/Action.tsx index 1f74ff6..07c6992 100644 --- a/apps/interface/src/Action.tsx +++ b/apps/interface/src/Action.tsx @@ -130,6 +130,7 @@ async function transact( walletConfig: WalletConfig, ): Promise { const { address, chain, cccClient, queryClient, signer } = walletConfig; + const maxConfirmationChecks = 60; try { freezeTxInfo(txInfo); @@ -138,14 +139,23 @@ async function transact( const txHash = await signer.sendTransaction(txInfo.tx); let status: string | undefined = "sent"; - while (status === undefined || ["sent", "pending", "proposed"].includes(status)) { + let checks = 0; + while ( + checks < maxConfirmationChecks && + (status === undefined || ["sent", "pending", "proposed"].includes(status)) + ) { setMessage("Waiting for network confirmation..."); await new Promise((resolve) => setTimeout(resolve, 10000)); status = (await cccClient.getTransaction(txHash))?.status; + checks += 1; + } + + if (checks >= maxConfirmationChecks) { + throw new Error("Transaction confirmation timed out"); } if (status !== "committed") { - throw new Error(`Transaction ended with status: ${status}`); + throw new Error(`Transaction ended with status: ${status ?? "unknown"}`); } setMessage("Transaction confirmed."); From 1d2cd031a00bd2b27b1b9b30defb920cca04f98a Mon Sep 17 00:00:00 2001 From: phroi <90913182+phroi@users.noreply.github.com> Date: Tue, 5 May 2026 17:49:39 +0000 Subject: [PATCH 3/3] fix: harden interface CCC startup and refresh Guard the JoyID signer lookup so the app fails with a concrete error when no CKB signer is available, and trim redundant refresh work in the confirmation path. Keep the exact cell search path direct by dropping a now-redundant lock equality recheck. --- apps/interface/src/Action.tsx | 1 - apps/interface/src/main.tsx | 10 +++++++--- apps/interface/src/queries.ts | 4 ---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/apps/interface/src/Action.tsx b/apps/interface/src/Action.tsx index 07c6992..0a51c37 100644 --- a/apps/interface/src/Action.tsx +++ b/apps/interface/src/Action.tsx @@ -160,7 +160,6 @@ async function transact( setMessage("Transaction confirmed."); formReset(); - await queryClient.invalidateQueries({ queryKey: [chain, address] }); await new Promise((resolve) => setTimeout(resolve, 2000)); } catch (error) { setFailure(errorMessageOf(error)); diff --git a/apps/interface/src/main.tsx b/apps/interface/src/main.tsx index b31d7eb..e020ecb 100644 --- a/apps/interface/src/main.tsx +++ b/apps/interface/src/main.tsx @@ -43,12 +43,16 @@ export function startApp(walletChain: string): void { const [walletName, chain] = walletChain.split("_"); const rootConfig = chain === "mainnet" ? rootConfigs.mainnet : rootConfigs.testnet; - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const signer = JoyId.getJoyIdSigners( + const signerInfo = JoyId.getJoyIdSigners( rootConfig.cccClient, appName, ["https://ickb.org", appIcon].join(""), - ).find((candidate) => candidate.name === "CKB")!.signer; + ).find((candidate) => candidate.name === "CKB"); + if (!signerInfo) { + throw new Error("CKB signer not found. Please ensure it is enabled in your JoyID app."); + } + + const { signer } = signerInfo; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const rootElement = document.getElementById("app")!; diff --git a/apps/interface/src/queries.ts b/apps/interface/src/queries.ts index c60cb90..140b5e5 100644 --- a/apps/interface/src/queries.ts +++ b/apps/interface/src/queries.ts @@ -180,10 +180,6 @@ async function getAccountCells(walletConfig: WalletConfig): Promise "asc", 400, )) { - if (!cell.cellOutput.lock.eq(lock)) { - continue; - } - cells.push(cell); } }