From e4c401c2133ffdbc0faa7b0eba6ea8ae2209efee Mon Sep 17 00:00:00 2001 From: Patrick Gray Date: Mon, 15 Jun 2026 10:08:22 -0400 Subject: [PATCH] Add Circle and Arc documentation example projects Imports the self-contained example projects referenced from the Circle and Arc developer documentation: app-kit bridge (EVM/Solana), app-kit send, app-kit transfer widget, and entity-secret-setup. --- .github/workflows/scan.yml | 14 + .pre-commit-config.yaml | 19 + CONTRIBUTING.md | 23 + LICENSE | 201 + README.md | 43 +- SECURITY.md | 4 + app-kit-bridge-evm/.gitignore | 24 + app-kit-bridge-evm/index.html | 60 + app-kit-bridge-evm/package.json | 19 + app-kit-bridge-evm/src/main.ts | 150 + app-kit-bridge-evm/tsconfig.json | 23 + app-kit-bridge-solana/.gitignore | 24 + app-kit-bridge-solana/index.html | 64 + app-kit-bridge-solana/package.json | 20 + app-kit-bridge-solana/src/main.ts | 187 + app-kit-bridge-solana/tsconfig.json | 23 + app-kit-send/.gitignore | 24 + app-kit-send/index.html | 65 + app-kit-send/package.json | 19 + app-kit-send/src/main.ts | 148 + app-kit-send/tsconfig.json | 23 + app-kit-transfer-widget/.gitignore | 24 + app-kit-transfer-widget/README.md | 185 + app-kit-transfer-widget/eslint.config.js | 40 + app-kit-transfer-widget/index.html | 30 + app-kit-transfer-widget/package-lock.json | 4375 +++++++++++++++++ app-kit-transfer-widget/package.json | 39 + app-kit-transfer-widget/public/favicon.ico | Bin 0 -> 15086 bytes .../TransferWidget/TransferWidget.css | 460 ++ .../TransferWidget/TransferWidget.tsx | 791 +++ .../src/components/TransferWidget/chains.ts | 40 + .../src/components/TransferWidget/icons.ts | 77 + .../src/components/TransferWidget/index.ts | 19 + .../src/components/TransferWidget/transfer.ts | 295 ++ .../src/components/TransferWidget/wallet.ts | 132 + app-kit-transfer-widget/src/index.css | 48 + app-kit-transfer-widget/src/main.tsx | 36 + app-kit-transfer-widget/tsconfig.app.json | 25 + app-kit-transfer-widget/tsconfig.json | 7 + app-kit-transfer-widget/tsconfig.node.json | 24 + app-kit-transfer-widget/vite.config.ts | 29 + entity-secret-setup/.env.example | 1 + entity-secret-setup/.gitignore | 34 + entity-secret-setup/README.md | 54 + entity-secret-setup/index.ts | 75 + entity-secret-setup/package.json | 13 + entity-secret-setup/tsconfig.json | 8 + scripts/check-copyright-header.sh | 45 + 48 files changed, 8082 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/scan.yml create mode 100644 .pre-commit-config.yaml create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 SECURITY.md create mode 100644 app-kit-bridge-evm/.gitignore create mode 100644 app-kit-bridge-evm/index.html create mode 100644 app-kit-bridge-evm/package.json create mode 100644 app-kit-bridge-evm/src/main.ts create mode 100644 app-kit-bridge-evm/tsconfig.json create mode 100644 app-kit-bridge-solana/.gitignore create mode 100644 app-kit-bridge-solana/index.html create mode 100644 app-kit-bridge-solana/package.json create mode 100644 app-kit-bridge-solana/src/main.ts create mode 100644 app-kit-bridge-solana/tsconfig.json create mode 100644 app-kit-send/.gitignore create mode 100644 app-kit-send/index.html create mode 100644 app-kit-send/package.json create mode 100644 app-kit-send/src/main.ts create mode 100644 app-kit-send/tsconfig.json create mode 100644 app-kit-transfer-widget/.gitignore create mode 100644 app-kit-transfer-widget/README.md create mode 100644 app-kit-transfer-widget/eslint.config.js create mode 100644 app-kit-transfer-widget/index.html create mode 100644 app-kit-transfer-widget/package-lock.json create mode 100644 app-kit-transfer-widget/package.json create mode 100644 app-kit-transfer-widget/public/favicon.ico create mode 100644 app-kit-transfer-widget/src/components/TransferWidget/TransferWidget.css create mode 100644 app-kit-transfer-widget/src/components/TransferWidget/TransferWidget.tsx create mode 100644 app-kit-transfer-widget/src/components/TransferWidget/chains.ts create mode 100644 app-kit-transfer-widget/src/components/TransferWidget/icons.ts create mode 100644 app-kit-transfer-widget/src/components/TransferWidget/index.ts create mode 100644 app-kit-transfer-widget/src/components/TransferWidget/transfer.ts create mode 100644 app-kit-transfer-widget/src/components/TransferWidget/wallet.ts create mode 100644 app-kit-transfer-widget/src/index.css create mode 100644 app-kit-transfer-widget/src/main.tsx create mode 100644 app-kit-transfer-widget/tsconfig.app.json create mode 100644 app-kit-transfer-widget/tsconfig.json create mode 100644 app-kit-transfer-widget/tsconfig.node.json create mode 100644 app-kit-transfer-widget/vite.config.ts create mode 100644 entity-secret-setup/.env.example create mode 100644 entity-secret-setup/.gitignore create mode 100644 entity-secret-setup/README.md create mode 100644 entity-secret-setup/index.ts create mode 100644 entity-secret-setup/package.json create mode 100644 entity-secret-setup/tsconfig.json create mode 100755 scripts/check-copyright-header.sh diff --git a/.github/workflows/scan.yml b/.github/workflows/scan.yml new file mode 100644 index 0000000..1c17b79 --- /dev/null +++ b/.github/workflows/scan.yml @@ -0,0 +1,14 @@ +name: Scan +on: + pull_request: + branches: [master] + push: + branches: [master] +jobs: + scan: + if: github.event_name == 'pull_request' + uses: circlefin/circle-public-github-workflows/.github/workflows/pr-scan.yaml@v1 + + release-sbom: + if: github.event_name == 'push' + uses: circlefin/circle-public-github-workflows/.github/workflows/attach-release-assets.yaml@v1 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..1e5cc11 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,19 @@ +repos: + - repo: local + hooks: + - id: check-copyright-typescript + name: Check copyright header - typescript + entry: ./scripts/check-copyright-header.sh + language: script + types: [ts] + exclude: | + (?x)^( + .github/.*| + build/.*| + dist/.*| + node_modules/.*| + docs/.*| + .*\.d\.ts$| + .*\.json$| + .*\.md$ + )$ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..7d6a57d --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,23 @@ +# Contributing to docs-examples + +Thank you for your interest in contributing to this project! + +## How to Contribute + +All contributions to this project are made subject to the terms of the +[Apache License 2.0](LICENSE). By submitting a contribution, you agree that +your contribution is licensed under those terms. + +## Reporting Issues + +Please open a GitHub issue for bug reports, feature requests, or questions. + +## Security Vulnerabilities + +Please do **not** file public GitHub issues for security vulnerabilities. +Report them privately through Circle's +[Vulnerability Disclosure Program](https://hackerone.com/circle-bbp). + +## Code of Conduct + +Please be respectful and constructive in all interactions. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f49a4e1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md index 6bc2356..2ff9e6d 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,43 @@ # docs-examples -Repository for code samples from developer documentation + +Code samples referenced from the [Circle](https://developers.circle.com/) and +[Arc](https://developers.arc.network/) developer documentation. + +Each subdirectory is a self-contained example with its own `package.json`. Clone +the repo, change into the example you want to run, install dependencies, and +follow the instructions in that example's documentation page or local README. + +## Examples + +### [`app-kit-bridge-evm`](./app-kit-bridge-evm) + +Browser app that bridges USDC from Ethereum Sepolia to Arc Testnet using +[App Kit](https://www.npmjs.com/package/@circle-fin/app-kit) with the viem +adapter. Connects to any EIP-6963 browser wallet (e.g., MetaMask). + +Run with `npm install && npm run dev`. + +### [`app-kit-bridge-solana`](./app-kit-bridge-solana) + +Browser app that bridges USDC from Solana Devnet to Arc Testnet using App Kit +with both the viem and Solana adapters. Connects an EVM wallet for the +destination and a Solana wallet for the source. + +Run with `npm install && npm run dev`. + +### [`entity-secret-setup`](./entity-secret-setup) + +Node.js script that generates a new entity secret, registers it with Circle, +writes the recovery file to disk, and adds `CIRCLE_ENTITY_SECRET` to `.env`. +Intended for first-time setup of +[developer-controlled wallets](https://developers.circle.com/w3s/developer-controlled-create-your-first-wallet). +See [`entity-secret-setup/README.md`](./entity-secret-setup/README.md) for +prerequisites and security notes. + +## License + +Apache 2.0 — see [LICENSE](./LICENSE). + +## Security + +To report a vulnerability, see [SECURITY.md](./SECURITY.md). diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..4097fd2 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,4 @@ +# Security Policy + +## Reporting a Vulnerability +Please do not file public issues on Github for security vulnerabilities. All security vulnerabilities should be reported to Circle privately, through Circle's [Bug Bounty Program](https://hackerone.com/circle-bbp). Please read through the program policy before submitting a report. \ No newline at end of file diff --git a/app-kit-bridge-evm/.gitignore b/app-kit-bridge-evm/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/app-kit-bridge-evm/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/app-kit-bridge-evm/index.html b/app-kit-bridge-evm/index.html new file mode 100644 index 0000000..e6a673c --- /dev/null +++ b/app-kit-bridge-evm/index.html @@ -0,0 +1,60 @@ + + + + + + + + Bridge Kit (EVM to EVM) + + + +
+
+ +

+
+
+
+ +

+    
+ + + diff --git a/app-kit-bridge-evm/package.json b/app-kit-bridge-evm/package.json new file mode 100644 index 0000000..f29102a --- /dev/null +++ b/app-kit-bridge-evm/package.json @@ -0,0 +1,19 @@ +{ + "name": "app-kit-bridge-evm", + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "typescript": "~6.0.3", + "vite": "^8.0.13" + }, + "dependencies": { + "@circle-fin/app-kit": "^1.5.1", + "@circle-fin/adapter-viem-v2": "^1.11.0", + "viem": "^2.49.3" + } +} diff --git a/app-kit-bridge-evm/src/main.ts b/app-kit-bridge-evm/src/main.ts new file mode 100644 index 0000000..01a5fbb --- /dev/null +++ b/app-kit-bridge-evm/src/main.ts @@ -0,0 +1,150 @@ +/** + * Copyright 2026 Circle Internet Group, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { AppKit } from "@circle-fin/app-kit"; +import { createViemAdapterFromProvider } from "@circle-fin/adapter-viem-v2"; +import type { CreateViemAdapterFromProviderParams } from "@circle-fin/adapter-viem-v2"; + +type BrowserWalletProvider = CreateViemAdapterFromProviderParams["provider"]; + +type EIP6963ProviderDetail = { + info: { + uuid: string; + name: string; + icon: string; + rdns: string; + }; + provider: BrowserWalletProvider; +}; + +declare global { + interface WindowEventMap { + "eip6963:announceProvider": CustomEvent; + } +} + +const connectEvmButton = document.querySelector("#connectEvm")!; +const bridgeButton = document.querySelector("#bridge")!; +const walletInfo = document.querySelector("#evmWalletInfo")!; +const output = document.querySelector("#output")!; + +const kit = new AppKit(); +let evmProvider: BrowserWalletProvider | null = null; + +function render(value: unknown) { + output.textContent = JSON.stringify( + value, + (_key, currentValue) => + typeof currentValue === "bigint" ? currentValue.toString() : currentValue, + 2, + ); + output.scrollTop = 0; +} + +kit.on("*", (payload) => { + output.textContent += `Action: ${JSON.stringify( + payload, + (_key, currentValue) => + typeof currentValue === "bigint" ? currentValue.toString() : currentValue, + 2, + )}\n`; + output.scrollTop = output.scrollHeight; +}); + +async function getProvider(): Promise { + const providers = new Map(); + + const onAnnounce = ((event: CustomEvent) => { + providers.set(event.detail.info.uuid, event.detail); + }) as EventListener; + + window.addEventListener("eip6963:announceProvider", onAnnounce); + window.dispatchEvent(new Event("eip6963:requestProvider")); + await new Promise((resolve) => window.setTimeout(resolve, 250)); + window.removeEventListener("eip6963:announceProvider", onAnnounce); + + const selectedProvider = + [...providers.values()].find( + ({ info }) => info.rdns === "io.metamask" || info.name === "MetaMask", + )?.provider ?? [...providers.values()][0]?.provider; + + if (!selectedProvider) { + throw new Error("No EIP-6963 browser wallet found"); + } + + return selectedProvider; +} + +async function handleEvmConnect() { + try { + connectEvmButton.disabled = true; + + evmProvider = await getProvider(); + await evmProvider.request({ + method: "eth_requestAccounts", + params: undefined, + }); + const accounts = (await evmProvider.request({ + method: "eth_accounts", + params: undefined, + })) as string[]; + + walletInfo.textContent = accounts[0] ?? "Connected"; + bridgeButton.disabled = !evmProvider; + } catch (error) { + render({ error: error instanceof Error ? error.message : "Unknown error" }); + } finally { + connectEvmButton.disabled = Boolean(evmProvider); + } +} + +async function handleBridge() { + try { + if (!evmProvider) { + throw new Error("Connect an EVM wallet first"); + } + + bridgeButton.disabled = true; + + const evmAdapter = await createViemAdapterFromProvider({ + provider: evmProvider, + }); + + let result = await kit.bridge({ + from: { adapter: evmAdapter, chain: "Ethereum_Sepolia" }, + to: { adapter: evmAdapter, chain: "Arc_Testnet" }, + amount: "1.00", + }); + + if (result.state === "error") { + result = await kit.retryBridge(result, { + from: evmAdapter, + to: evmAdapter, + }); + } + + render(result); + } catch (error) { + render({ error: error instanceof Error ? error.message : "Unknown error" }); + } finally { + bridgeButton.disabled = false; + } +} + +connectEvmButton.addEventListener("click", handleEvmConnect); +bridgeButton.addEventListener("click", handleBridge); diff --git a/app-kit-bridge-evm/tsconfig.json b/app-kit-bridge-evm/tsconfig.json new file mode 100644 index 0000000..1ab38c8 --- /dev/null +++ b/app-kit-bridge-evm/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "es2023", + "module": "esnext", + "lib": ["ES2023", "DOM"], + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/app-kit-bridge-solana/.gitignore b/app-kit-bridge-solana/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/app-kit-bridge-solana/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/app-kit-bridge-solana/index.html b/app-kit-bridge-solana/index.html new file mode 100644 index 0000000..3d98af0 --- /dev/null +++ b/app-kit-bridge-solana/index.html @@ -0,0 +1,64 @@ + + + + + + + + Bridge Kit (Solana to EVM) + + + +
+
+ +

+
+
+ +

+
+
+
+ +

+    
+ + + diff --git a/app-kit-bridge-solana/package.json b/app-kit-bridge-solana/package.json new file mode 100644 index 0000000..ff94f7d --- /dev/null +++ b/app-kit-bridge-solana/package.json @@ -0,0 +1,20 @@ +{ + "name": "app-kit-bridge-solana", + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "typescript": "~6.0.3", + "vite": "^8.0.13" + }, + "dependencies": { + "@circle-fin/adapter-solana": "^1.5.8", + "@circle-fin/adapter-viem-v2": "^1.11.0", + "@circle-fin/app-kit": "^1.5.1", + "viem": "^2.49.3" + } +} diff --git a/app-kit-bridge-solana/src/main.ts b/app-kit-bridge-solana/src/main.ts new file mode 100644 index 0000000..6d72411 --- /dev/null +++ b/app-kit-bridge-solana/src/main.ts @@ -0,0 +1,187 @@ +/** + * Copyright 2026 Circle Internet Group, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { AppKit } from "@circle-fin/app-kit"; +import { createViemAdapterFromProvider } from "@circle-fin/adapter-viem-v2"; +import { createSolanaAdapterFromProvider } from "@circle-fin/adapter-solana"; +import type { CreateViemAdapterFromProviderParams } from "@circle-fin/adapter-viem-v2"; +import type { CreateSolanaAdapterFromProviderParams } from "@circle-fin/adapter-solana"; + +type BrowserWalletProvider = CreateViemAdapterFromProviderParams["provider"]; + +type EIP6963ProviderDetail = { + info: { + uuid: string; + name: string; + icon: string; + rdns: string; + }; + provider: BrowserWalletProvider; +}; + +type SolanaWalletProvider = CreateSolanaAdapterFromProviderParams["provider"]; + +declare global { + interface WindowEventMap { + "eip6963:announceProvider": CustomEvent; + } + interface Window { + solana?: SolanaWalletProvider; + } +} + +const connectEvmButton = document.querySelector("#connectEvm")!; +const connectSolButton = document.querySelector("#connectSol")!; +const bridgeButton = document.querySelector("#bridge")!; +const walletInfo = document.querySelector("#evmWalletInfo")!; +const solanaWalletInfo = + document.querySelector("#solanaWalletInfo")!; +const output = document.querySelector("#output")!; + +const kit = new AppKit(); +let evmProvider: BrowserWalletProvider | null = null; +let solanaProvider: SolanaWalletProvider | null = null; + +function render(value: unknown) { + output.textContent = JSON.stringify( + value, + (_key, currentValue) => + typeof currentValue === "bigint" ? currentValue.toString() : currentValue, + 2, + ); + output.scrollTop = 0; +} + +kit.on("*", (payload) => { + output.textContent += `Action: ${JSON.stringify( + payload, + (_key, currentValue) => + typeof currentValue === "bigint" ? currentValue.toString() : currentValue, + 2, + )}\n`; + output.scrollTop = output.scrollHeight; +}); + +async function getProvider(): Promise { + const providers = new Map(); + + const onAnnounce = ((event: CustomEvent) => { + providers.set(event.detail.info.uuid, event.detail); + }) as EventListener; + + window.addEventListener("eip6963:announceProvider", onAnnounce); + window.dispatchEvent(new Event("eip6963:requestProvider")); + await new Promise((resolve) => window.setTimeout(resolve, 250)); + window.removeEventListener("eip6963:announceProvider", onAnnounce); + + const selectedProvider = + [...providers.values()].find( + ({ info }) => info.rdns === "io.metamask" || info.name === "MetaMask", + )?.provider ?? [...providers.values()][0]?.provider; + + if (!selectedProvider) { + throw new Error("No EIP-6963 browser wallet found"); + } + + return selectedProvider; +} + +async function handleEvmConnect() { + try { + connectEvmButton.disabled = true; + + evmProvider = await getProvider(); + await evmProvider.request({ + method: "eth_requestAccounts", + params: undefined, + }); + const accounts = (await evmProvider.request({ + method: "eth_accounts", + params: undefined, + })) as string[]; + + walletInfo.textContent = accounts[0] ?? "Connected"; + bridgeButton.disabled = !evmProvider || !solanaProvider; + } catch (error) { + render({ error: error instanceof Error ? error.message : "Unknown error" }); + } finally { + connectEvmButton.disabled = Boolean(evmProvider); + } +} + +async function handleSolanaConnect() { + try { + connectSolButton.disabled = true; + + if (!window.solana) { + throw new Error("No Solana browser wallet found"); + } + + solanaProvider = window.solana; + const connection = await solanaProvider.connect(); + solanaWalletInfo.textContent = + connection.publicKey?.toString() ?? + solanaProvider.publicKey?.toString() ?? + "Connected"; + bridgeButton.disabled = !evmProvider || !solanaProvider; + } catch (error) { + render({ error: error instanceof Error ? error.message : "Unknown error" }); + } finally { + connectSolButton.disabled = Boolean(solanaProvider); + } +} + +async function handleBridge() { + try { + if (!evmProvider || !solanaProvider) { + throw new Error("Connect both wallets first"); + } + + bridgeButton.disabled = true; + + const evmAdapter = await createViemAdapterFromProvider({ + provider: evmProvider, + }); + const solanaAdapter = await createSolanaAdapterFromProvider({ + provider: solanaProvider, + }); + + let result = await kit.bridge({ + from: { adapter: solanaAdapter, chain: "Solana_Devnet" }, + to: { adapter: evmAdapter, chain: "Arc_Testnet" }, + amount: "1.00", + }); + + if (result.state === "error") { + result = await kit.retryBridge(result, { + from: solanaAdapter, + to: evmAdapter, + }); + } + + render(result); + } catch (error) { + render({ error: error instanceof Error ? error.message : "Unknown error" }); + } finally { + bridgeButton.disabled = false; + } +} + +connectEvmButton.addEventListener("click", handleEvmConnect); +connectSolButton.addEventListener("click", handleSolanaConnect); +bridgeButton.addEventListener("click", handleBridge); diff --git a/app-kit-bridge-solana/tsconfig.json b/app-kit-bridge-solana/tsconfig.json new file mode 100644 index 0000000..1ab38c8 --- /dev/null +++ b/app-kit-bridge-solana/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "es2023", + "module": "esnext", + "lib": ["ES2023", "DOM"], + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/app-kit-send/.gitignore b/app-kit-send/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/app-kit-send/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/app-kit-send/index.html b/app-kit-send/index.html new file mode 100644 index 0000000..73e7735 --- /dev/null +++ b/app-kit-send/index.html @@ -0,0 +1,65 @@ + + + + + + + + Send USDC on Arc Testnet + + + +
+
+ +

+
+
+
+
+ + + +
+ +

+    
+ + + diff --git a/app-kit-send/package.json b/app-kit-send/package.json new file mode 100644 index 0000000..0a08aa5 --- /dev/null +++ b/app-kit-send/package.json @@ -0,0 +1,19 @@ +{ + "name": "app-kit-send", + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "typescript": "~6.0.2", + "vite": "^8.0.12" + }, + "dependencies": { + "@circle-fin/adapter-viem-v2": "^1.11.2", + "@circle-fin/app-kit": "^1.7.0", + "viem": "^2.52.2" + } +} diff --git a/app-kit-send/src/main.ts b/app-kit-send/src/main.ts new file mode 100644 index 0000000..90cc4b4 --- /dev/null +++ b/app-kit-send/src/main.ts @@ -0,0 +1,148 @@ +/** + * Copyright 2026 Circle Internet Group, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { AppKit } from "@circle-fin/app-kit"; +import type { SendParams } from "@circle-fin/app-kit"; +import { createViemAdapterFromProvider } from "@circle-fin/adapter-viem-v2"; +import type { CreateViemAdapterFromProviderParams } from "@circle-fin/adapter-viem-v2"; + +type BrowserWalletProvider = CreateViemAdapterFromProviderParams["provider"]; + +type EIP6963ProviderDetail = { + info: { + uuid: string; + name: string; + icon: string; + rdns: string; + }; + provider: BrowserWalletProvider; +}; + +declare global { + interface WindowEventMap { + "eip6963:announceProvider": CustomEvent; + } +} + +const connectWalletButton = + document.querySelector("#connectWallet")!; +const recipientAddressInput = + document.querySelector("#recipientAddress")!; +const sendButton = document.querySelector("#send")!; +const walletInfo = document.querySelector("#walletInfo")!; +const output = document.querySelector("#output")!; + +const kit = new AppKit(); +let walletProvider: BrowserWalletProvider | null = null; + +function render(value: unknown) { + output.textContent = JSON.stringify( + value, + (_key, currentValue) => + typeof currentValue === "bigint" ? currentValue.toString() : currentValue, + 2, + ); + output.scrollTop = 0; +} + +async function getProvider(): Promise { + const providers = new Map(); + + const onAnnounce = ((event: CustomEvent) => { + providers.set(event.detail.info.uuid, event.detail); + }) as EventListener; + + window.addEventListener("eip6963:announceProvider", onAnnounce); + window.dispatchEvent(new Event("eip6963:requestProvider")); + await new Promise((resolve) => window.setTimeout(resolve, 250)); + window.removeEventListener("eip6963:announceProvider", onAnnounce); + + const selectedProvider = + [...providers.values()].find( + ({ info }) => info.rdns === "io.metamask" || info.name === "MetaMask", + )?.provider ?? [...providers.values()][0]?.provider; + + if (!selectedProvider) { + throw new Error("No EIP-6963 browser wallet found"); + } + + return selectedProvider; +} + +async function handleWalletConnect() { + try { + connectWalletButton.disabled = true; + + walletProvider = await getProvider(); + await walletProvider.request({ + method: "eth_requestAccounts", + params: undefined, + }); + const accounts = (await walletProvider.request({ + method: "eth_accounts", + params: undefined, + })) as string[]; + + walletInfo.textContent = accounts[0] ?? "Connected"; + sendButton.disabled = !walletProvider; + } catch (error) { + render({ error: error instanceof Error ? error.message : "Unknown error" }); + } finally { + connectWalletButton.disabled = Boolean(walletProvider); + } +} + +async function handleSend(event: Event) { + event.preventDefault(); + + try { + if (!walletProvider) { + throw new Error("Connect a wallet first"); + } + + sendButton.disabled = true; + + const recipientAddress = recipientAddressInput.value.trim(); + if (!recipientAddress) { + throw new Error("Enter a recipient address"); + } + + const adapter = await createViemAdapterFromProvider({ + provider: walletProvider, + }); + + const sendParams: SendParams = { + from: { adapter, chain: "Arc_Testnet" }, + to: recipientAddress, + amount: "1.00", + token: "USDC", + }; + + const estimate = await kit.estimateSend(sendParams); + const result = await kit.send(sendParams); + + render({ estimate, result }); + } catch (error) { + render({ error: error instanceof Error ? error.message : "Unknown error" }); + } finally { + sendButton.disabled = false; + } +} + +connectWalletButton.addEventListener("click", handleWalletConnect); +sendButton.addEventListener("click", handleSend); diff --git a/app-kit-send/tsconfig.json b/app-kit-send/tsconfig.json new file mode 100644 index 0000000..1ab38c8 --- /dev/null +++ b/app-kit-send/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "es2023", + "module": "esnext", + "lib": ["ES2023", "DOM"], + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/app-kit-transfer-widget/.gitignore b/app-kit-transfer-widget/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/app-kit-transfer-widget/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/app-kit-transfer-widget/README.md b/app-kit-transfer-widget/README.md new file mode 100644 index 0000000..d917499 --- /dev/null +++ b/app-kit-transfer-widget/README.md @@ -0,0 +1,185 @@ +# Embed a USDC Transfer Widget + +Build an embedded USDC transfer surface that lets a connected wallet send USDC +on one chain or bridge USDC across chains through App Kit. + +This React + Vite project demonstrates a practical transfer flow for apps that +want to hide low-level routing decisions from users. The widget discovers a +browser wallet, creates the right Circle adapter, estimates the route, and then +uses: + +- `send()` for same-chain USDC transfers +- `bridge()` for crosschain USDC transfers through either CCTP Forwarder or + direct mint routes +- `retryBridge()` when a bridge attempt returns an error state + +The entered amount is treated as the amount the recipient should receive. For a +crosschain bridge, the review screen also shows the estimated total source cost. + +## What You Will Build + +- A wallet connection flow for injected EVM wallets and Solana browser wallets +- App Kit adapter creation from the connected browser wallet +- Chain options derived from App Kit support rather than hardcoded lists +- Same-chain USDC transfer execution with `send()` +- Crosschain USDC bridge execution through CCTP Forwarder or direct mint routes +- Transfer review that shows destination amount, estimated fee, total source + amount, recipient, and method +- Basic bridge retry handling for recoverable bridge error states + +## How The Widget Works + +```text +Connect wallet + -> create Circle adapter + -> choose source chain, destination chain, recipient, and amount + -> estimate transfer + -> review amount and fees + -> sign and submit + -> show explorer links for completed steps +``` + +The widget chooses the transfer method from the selected route: + +| Route | App Kit method | Behavior | +| --- | --- | --- | +| Same source and destination chain | `send()` | Transfers USDC on the connected chain. | +| Different source and destination chains, destination supports Forwarder | `bridge()` with `useForwarder: true` | Bridges USDC crosschain and sends to the entered recipient address. | +| Different source and destination chains, EVM direct mint route | `bridge()` with a destination adapter | Bridges USDC crosschain using the connected EVM wallet as the destination adapter. | + +## Prerequisites + +- [Node.js v22+](https://nodejs.org/) +- A supported injected EVM wallet, Solana browser wallet, or both + - EVM wallet discovery uses EIP-6963 provider announcements. + - Solana wallet detection expects a browser wallet on `window.solana`. +- Testnet USDC on the source chain you want to use +- Native gas token on the source chain for the wallet transaction +- Familiarity with [App Kit](https://developers.circle.com/arc/app-kit) + +This project does not require environment variables or API keys. + +## Set Up + +Install dependencies: + +```bash +npm install +``` + +Start the development server: + +```bash +npm run dev +``` + +Open the local Vite URL in a browser with a supported wallet installed. + +Build the production bundle: + +```bash +npm run build +``` + +## Run A Transfer + +1. Connect an EVM or Solana wallet. +2. Select a source chain supported by the connected wallet type. +3. Select a destination chain. +4. Enter a recipient address. +5. Enter the USDC amount the recipient should receive. +6. Review the estimated fee and total source amount. +7. Confirm and sign in your wallet. + +For crosschain bridges, the widget sends the entered amount to `bridge()` and +shows the entered amount plus estimated USDC bridge fees as the total source +amount during review. + +When the transfer completes, the widget shows explorer links for any App Kit +steps that returned an explorer URL. + +## Project Structure + +```text +src/ + components/ + TransferWidget/ + TransferWidget.tsx # UI state, screens, and user actions + transfer.ts # App Kit setup, estimation, send, bridge, retry + wallet.ts # Wallet discovery, connection, adapter creation + TransferWidget.css + index.ts + main.tsx # Browser Buffer setup and widget mount + index.css +``` + +## Key Implementation Files + +- `src/components/TransferWidget/wallet.ts` discovers EIP-6963 EVM wallets, + detects Solana wallets, connects the selected wallet, and creates the matching + Circle adapter. +- `src/components/TransferWidget/transfer.ts` creates the App Kit instance, + fetches supported testnet chains, estimates send and bridge routes, executes + transfers, and retries bridge flows when needed. +- `src/components/TransferWidget/TransferWidget.tsx` owns the widget screens: + connect, wallet selection, transfer form, review, submitting, and success. + +## App Kit Runtime Note + +App Kit currently expects `Buffer` to exist before its browser modules evaluate. +This project sets the browser polyfill in `src/main.tsx` before importing the +widget: + +```ts +import { Buffer } from "buffer"; + +if (!("Buffer" in globalThis)) { + Object.assign(globalThis, { Buffer }); +} + +const { default: TransferWidget } = await import("./components/TransferWidget"); +``` + +Keep this setup if you move the widget into another Vite app. + +## Copying Into Another App + +This repository is a runnable app, not a packaged component library. If you copy +`src/components/TransferWidget/` into another React app, also copy or recreate +the setup in `src/main.tsx` so `Buffer` exists before the widget imports App Kit. + +The copied widget expects these runtime dependencies: + +- `@circle-fin/app-kit` +- `@circle-fin/adapter-viem-v2` +- `@circle-fin/adapter-solana` +- `buffer` +- `react` +- `react-dom` +- `viem` + +## Commands + +| Command | What it does | +| --- | --- | +| `npm run dev` | Starts the local Vite development server. | +| `npm run build` | Runs TypeScript and creates a production build. | +| `npm run lint` | Runs ESLint. | +| `npm run preview` | Serves the production build locally. | + +## Production Considerations + +Before adapting this pattern for a live app: + +- Validate recipient addresses for the selected destination chain. +- Handle unsupported wallet, chain, and route states explicitly. +- Decide whether to support only testnets, only mainnets, or both. +- Add stronger transaction status handling and user-facing recovery paths. +- Persist transfer attempts if users may close the browser mid-flow. +- Keep route support derived from App Kit where possible so chain support does + not drift from the SDK. + +## Reuse Boundary + +This repository does not currently publish a stable package API, package +exports, or a library build. diff --git a/app-kit-transfer-widget/eslint.config.js b/app-kit-transfer-widget/eslint.config.js new file mode 100644 index 0000000..9083e47 --- /dev/null +++ b/app-kit-transfer-widget/eslint.config.js @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2026, Circle Internet Group, Inc. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + globals: globals.browser, + }, + }, +]) diff --git a/app-kit-transfer-widget/index.html b/app-kit-transfer-widget/index.html new file mode 100644 index 0000000..c06b3f9 --- /dev/null +++ b/app-kit-transfer-widget/index.html @@ -0,0 +1,30 @@ + + + + + + + + transfer-widget + + +
+ + + diff --git a/app-kit-transfer-widget/package-lock.json b/app-kit-transfer-widget/package-lock.json new file mode 100644 index 0000000..f058b42 --- /dev/null +++ b/app-kit-transfer-widget/package-lock.json @@ -0,0 +1,4375 @@ +{ + "name": "transfer-widget", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "transfer-widget", + "version": "0.0.0", + "dependencies": { + "@circle-fin/adapter-solana": "^1.5.9", + "@circle-fin/adapter-viem-v2": "^1.11.1", + "@circle-fin/app-kit": "^1.6.1", + "buffer": "^6.0.3", + "react": "^19.2.6", + "react-dom": "^19.2.6", + "viem": "^2.51.2" + }, + "devDependencies": { + "@babel/core": "^7.29.7", + "@eslint/js": "^10.0.1", + "@rolldown/plugin-babel": "^0.2.3", + "@types/babel__core": "^7.20.5", + "@types/node": "^25.9.1", + "@types/react": "^19.2.15", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.2", + "babel-plugin-react-compiler": "^1.0.0", + "eslint": "^10.4.0", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.6.0", + "typescript": "^6.0.3", + "typescript-eslint": "^8.60.0", + "vite": "^8.0.14" + } + }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", + "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", + "license": "MIT" + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@circle-fin/adapter-solana": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/@circle-fin/adapter-solana/-/adapter-solana-1.5.9.tgz", + "integrity": "sha512-JxR7OIggzc9KaGZKGFPveb0eLM3NxDBsGKynzKR+cs0Us2Qw8iKWht0D2d+MJLO5idaIn7QOj4U2bp2Sm5HGFw==", + "dependencies": { + "@coral-xyz/anchor": "^0.31.1", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/units": "^5.8.0", + "@noble/curves": "1.4.2", + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "bs58": "6.0.0", + "buffer": "^6.0.3", + "zod": "3.25.67" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.2" + } + }, + "node_modules/@circle-fin/adapter-viem-v2": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@circle-fin/adapter-viem-v2/-/adapter-viem-v2-1.11.1.tgz", + "integrity": "sha512-JZAuEJ0QdNjHxOl8QyAWgLEBFpbMs9wubdwY8Yr5p8sPtDt1jEtFHAUVwu0tVqvMOGApuROxFCORM4sl1K1Qaw==", + "dependencies": { + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/units": "^5.8.0", + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "bs58": "6.0.0", + "zod": "3.25.67" + }, + "peerDependencies": { + "viem": "^2.30.0" + } + }, + "node_modules/@circle-fin/app-kit": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@circle-fin/app-kit/-/app-kit-1.6.1.tgz", + "integrity": "sha512-R7WOBBfhcQhGSC/4NjpzOy/VGaobpj8oCzg+wUMn6uNVveNqFbzsdKbywo+Zf3JLdlyHkEzeACEnb6hwl7ijLg==", + "dependencies": { + "@circle-fin/bridge-kit": "1.10.1", + "@circle-fin/earn-kit": "1.0.1", + "@circle-fin/provider-gateway-v1": "1.0.5", + "@circle-fin/swap-kit": "1.2.2", + "@circle-fin/unified-balance-kit": "1.1.2", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/units": "^5.8.0", + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "bs58": "6.0.0", + "zod": "3.25.67" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@circle-fin/bridge-kit": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@circle-fin/bridge-kit/-/bridge-kit-1.10.1.tgz", + "integrity": "sha512-mPSnbzU5DWkasQBrVZVw2VNZdee0dQIaIH2MqnNZUyQAgSTnreR2AcPsc4MMmxLMy/63waSugVEJrGowcuKfhw==", + "dependencies": { + "@circle-fin/provider-cctp-v2": "^1.8.2", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/units": "^5.8.0", + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "bs58": "6.0.0", + "pino": "10.1.0", + "zod": "3.25.67" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@circle-fin/earn-kit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@circle-fin/earn-kit/-/earn-kit-1.0.1.tgz", + "integrity": "sha512-Usmh7+uNPj3VLaHofmPcxLrxFZPmURLs+vusGcw/j4txhYr8WudOFReaBXBxj32FlTvGJGbP+SvGDPwx+IzT2g==", + "dependencies": { + "@circle-fin/provider-earn-service": "^1.0.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/units": "^5.8.0", + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "bs58": "6.0.0", + "zod": "3.25.67" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@circle-fin/provider-cctp-v2": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@circle-fin/provider-cctp-v2/-/provider-cctp-v2-1.8.2.tgz", + "integrity": "sha512-LteANKMrDBpglyyr3qv39z/amwTUqZcMOx1Njn4aGioTeheyCqNEkr+wwAzoGT236APWjXkPfyjVKYNq6GTyyw==", + "dependencies": { + "@coral-xyz/anchor": "^0.31.1", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/units": "^5.8.0", + "@noble/curves": "1.4.2", + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "bs58": "6.0.0", + "buffer": "^6.0.3", + "zod": "3.25.67" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.2" + }, + "peerDependenciesMeta": { + "@solana/web3.js": { + "optional": true + } + } + }, + "node_modules/@circle-fin/provider-earn-service": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@circle-fin/provider-earn-service/-/provider-earn-service-1.0.0.tgz", + "integrity": "sha512-HwUMndejHPOoXwneu5aJLAzSAzOjL1vdd5Q1bQg33KN3Py5oQq3l2NedlN/zk4ytSwyzZVOcTQ83fYbw9csaGg==", + "dependencies": { + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/units": "^5.8.0", + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "bs58": "6.0.0", + "zod": "3.25.67" + } + }, + "node_modules/@circle-fin/provider-gateway-v1": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@circle-fin/provider-gateway-v1/-/provider-gateway-v1-1.0.5.tgz", + "integrity": "sha512-mn7Ru5j+rVKlgsnW43B/2HgQxRBLE1Ic10unJhMfKWHnQhnA/1MPgc50OQPAPiZFbGSHPvZ+ir4ABTM1lF+EgQ==", + "dependencies": { + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/units": "^5.8.0", + "@noble/curves": "1.4.2", + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "bs58": "6.0.0", + "zod": "3.25.67" + } + }, + "node_modules/@circle-fin/provider-stablecoin-service-swap": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@circle-fin/provider-stablecoin-service-swap/-/provider-stablecoin-service-swap-1.1.4.tgz", + "integrity": "sha512-i2eE88btNqN9FDEgHFDQ8ghxXyA77zBh7sCQhH8ozcdh6io6eU2TijasQbLKmeIKmxtPrVEGpejc9E8WvWrLIw==", + "dependencies": { + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "zod": "3.25.67" + } + }, + "node_modules/@circle-fin/swap-kit": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@circle-fin/swap-kit/-/swap-kit-1.2.2.tgz", + "integrity": "sha512-Abr6D1vWqz71lxihvClWV0vhNsIk4y2nuwR7UG/S8cNV831rMrKRWznPfcJ5vSZsgJHOYuO/FLCvL3J5jnl3LQ==", + "dependencies": { + "@circle-fin/provider-stablecoin-service-swap": "^1.1.4", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/units": "^5.8.0", + "@noble/curves": "1.4.2", + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "bs58": "6.0.0", + "zod": "3.25.67" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@circle-fin/unified-balance-kit": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@circle-fin/unified-balance-kit/-/unified-balance-kit-1.1.2.tgz", + "integrity": "sha512-DFrGsiJrv0hpjPOnSaSyfBnVBGoJOlaM8VyWfGvYkJifBxCk/QRdeePKapnCz3reRBhWDgQSVzDfHxevbNK0gA==", + "dependencies": { + "@circle-fin/provider-gateway-v1": "1.0.5", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/units": "^5.8.0", + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "bs58": "6.0.0", + "zod": "3.25.67" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@coral-xyz/anchor": { + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.31.1.tgz", + "integrity": "sha512-QUqpoEK+gi2S6nlYc2atgT2r41TT3caWr/cPUEL8n8Md9437trZ68STknq897b82p5mW0XrTBNOzRbmIRJtfsA==", + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "@coral-xyz/anchor-errors": "^0.31.1", + "@coral-xyz/borsh": "^0.31.1", + "@noble/hashes": "^1.3.1", + "@solana/web3.js": "^1.69.0", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "eventemitter3": "^4.0.7", + "pako": "^2.0.3", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=17" + } + }, + "node_modules/@coral-xyz/anchor-errors": { + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor-errors/-/anchor-errors-0.31.1.tgz", + "integrity": "sha512-NhNEku4F3zzUSBtrYz84FzYWm48+9OvmT1Hhnwr6GnPQry2dsEqH/ti/7ASjjpoFTWRnPXrjAIT1qM6Isop+LQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/@coral-xyz/anchor/node_modules/base-x": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/@coral-xyz/anchor/node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "license": "MIT", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/@coral-xyz/borsh": { + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.31.1.tgz", + "integrity": "sha512-9N8AU9F0ubriKfNE3g1WF0/4dtlGXoBN/hd1PvbNBamBNwRgHxH4P+o3Zt7rSEloW1HUs6LfZEchlx9fW7POYw==", + "license": "Apache-2.0", + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.69.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz", + "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@ethersproject/address": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz", + "integrity": "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/rlp": "^5.8.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz", + "integrity": "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/bytes": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz", + "integrity": "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.8.0" + } + }, + "node_modules/@ethersproject/constants": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz", + "integrity": "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.8.0" + } + }, + "node_modules/@ethersproject/keccak256": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz", + "integrity": "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/logger": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz", + "integrity": "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT" + }, + "node_modules/@ethersproject/rlp": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz", + "integrity": "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0" + } + }, + "node_modules/@ethersproject/units": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.8.0.tgz", + "integrity": "sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/logger": "^5.8.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.132.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.132.0.tgz", + "integrity": "sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.2.tgz", + "integrity": "sha512-ZS4D1JPGn/MYQN/SYDWftIE/nVsM8j/AFOYEzAoOE2O3NktQOZru+/vYXGbR/qtdLdIfGCP0lcoJiYVzsEz+iQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.2.tgz", + "integrity": "sha512-vdFA9+C/rekyGce7WqHs/xoT0ioZEWaOFyZLIV1mEeNFaFDUQrPIo8Vs2GvJ6eetb3rzDUtUBgzto3ExpXJB3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.2.tgz", + "integrity": "sha512-BewSOwTHazv77DTYiAZXSqqKZ4KP/KonFisDMVU7PImxoWfB2aepnPhd2E4SWz3zDzYgDNbs6jBmTdgNnF02GA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.2.tgz", + "integrity": "sha512-m41o7M0YWtUdqk61Tb+jnKb2rN++iRdIASlExkUoKfIAH30DOHCB8fVLzSUpbWHHU8esmEioY62PxzexE8MBuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.2.tgz", + "integrity": "sha512-jcojB9H7W/jS29pMKWAK1N+fU99vXodHDTatS3b3y/XSOCiHo0kkA74pL3jJmkoQtYpOCxDvaKs1fo2Ij/1X5w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.2.tgz", + "integrity": "sha512-1jn6qDU5iiOgFgygDzKUuKP0maTi0/f1+sBLgvij/76C77Nm3ts6ufz9Bjg5q5dduxiUIxtq86JIoBvo1xQ4Ig==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.2.tgz", + "integrity": "sha512-QVLO/czFMdoMFSqlX3bcswcJNm/23r+qoa/jgtmFc/qEp6/jXmIkDjF/XIo8dPfGaiwy1xfQn8o77L79GeXFgw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.2.tgz", + "integrity": "sha512-hgO5Abm0w5UL6FEa2iFnZqo2KlK7TQ5QhV5x09hujBf7t5KzHQ1VmfPuTpqRy/rNlSxua3eWH374xxiVrP+lcA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.2.tgz", + "integrity": "sha512-fy8rXxuYEu602abC8MUNaPjYLIFzReOaEIEMKMUa0rFEUxNpVXhs15KSSQ4qlqSaM7B6rcj9rDZgADh/IGDzLQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.2.tgz", + "integrity": "sha512-0+bOkiQ779+r1WpoHOWHqncvyySci0vKph+myNDYb+im6meJAzHQXay6oEgnkHuUGouM1LKTZwqKpBow6Kj7CQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.2.tgz", + "integrity": "sha512-mjSkrzZK5Qsl0a9d1JgILOiuZOSDTVdKENcSXBoqbzSrspLR/4/IRVDo5wd2GgZjNss/viBFJdeq+j7qH2nypw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.2.tgz", + "integrity": "sha512-1v5vHasdfQAZoEHakBV72LIFAC9JjnymsiKxp+GEr/ma3+NJCPSaYK+qavInOovJkgwFrs7GccX2d6IgDA3Z5w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.2.tgz", + "integrity": "sha512-mb1VobWn6NheziTk5/WEaR6AKVbrwT5sOi6C7zk3gy/pD1qtJfU1j4PgTo2NJnOtbL9Dl3Aeei8w9jJ7qC2jZQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.2.tgz", + "integrity": "sha512-SqKonF56vA/L2yHwHYcEp2P34URpOZ7d1fS635cTkpDnUtEGdUbhI6NzsPdqeSWvAAeGDrxjWjNmibDIdFf9/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.2.tgz", + "integrity": "sha512-v7qRI7gXLRINcOGXt+7YmAZ6iFuyZVMIoXAxhd8oP+DR9dLfL9GfNIx7PLMxmhZdvq8waUJBQiWN9EKNy+TRBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/plugin-babel": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/plugin-babel/-/plugin-babel-0.2.3.tgz", + "integrity": "sha512-+zEk16yGlz1F9STiRr6uG9hmIXb6nprjLczV/htGptYuLoCuxb+itZ03RKCEeOhBpDDd1NU7qF6x1VLMUp62bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=22.12.0 || ^24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.29.0 || ^8.0.0-rc.1", + "@babel/plugin-transform-runtime": "^7.29.0 || ^8.0.0-rc.1", + "@babel/runtime": "^7.27.0 || ^8.0.0-rc.1", + "rolldown": "^1.0.0-rc.5", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@babel/plugin-transform-runtime": { + "optional": true + }, + "@babel/runtime": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@scure/base": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@solana/buffer-layout": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", + "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", + "license": "MIT", + "dependencies": { + "buffer": "~6.0.3" + }, + "engines": { + "node": ">=5.10" + } + }, + "node_modules/@solana/codecs-core": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.3.0.tgz", + "integrity": "sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@solana/codecs-numbers": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.3.0.tgz", + "integrity": "sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.3.0", + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@solana/errors": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.3.0.tgz", + "integrity": "sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==", + "license": "MIT", + "dependencies": { + "chalk": "^5.4.1", + "commander": "^14.0.0" + }, + "bin": { + "errors": "bin/cli.mjs" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@solana/web3.js": { + "version": "1.98.4", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.4.tgz", + "integrity": "sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.0", + "@noble/curves": "^1.4.2", + "@noble/hashes": "^1.4.0", + "@solana/buffer-layout": "^4.0.1", + "@solana/codecs-numbers": "^2.1.0", + "agentkeepalive": "^4.5.0", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.1", + "node-fetch": "^2.7.0", + "rpc-websockets": "^9.0.2", + "superstruct": "^2.0.2" + } + }, + "node_modules/@solana/web3.js/node_modules/base-x": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/@solana/web3.js/node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "license": "MIT", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/@solana/web3.js/node_modules/superstruct": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", + "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.21.tgz", + "integrity": "sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/react": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.15.tgz", + "integrity": "sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.0.tgz", + "integrity": "sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/type-utils": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.60.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.0.tgz", + "integrity": "sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.0.tgz", + "integrity": "sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.60.0", + "@typescript-eslint/types": "^8.60.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz", + "integrity": "sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz", + "integrity": "sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.0.tgz", + "integrity": "sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.0.tgz", + "integrity": "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz", + "integrity": "sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.60.0", + "@typescript-eslint/tsconfig-utils": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.0.tgz", + "integrity": "sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz", + "integrity": "sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.2.tgz", + "integrity": "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/abitype": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.4.tgz", + "integrity": "sha512-dpKH+N27vRjarMVTFFkeY445VTKftzGWpL0FiT7xmVmzQRKazZexzC5uHG0f6XKsVLAuUlndnbGau6lRejClxg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3.22.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/babel-plugin-react-compiler": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", + "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.32", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.32.tgz", + "integrity": "sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bn.js": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "license": "MIT" + }, + "node_modules/borsh": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", + "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", + "license": "Apache-2.0", + "dependencies": { + "bn.js": "^5.2.0", + "bs58": "^4.0.0", + "text-encoding-utf-8": "^1.0.2" + } + }, + "node_modules/borsh/node_modules/base-x": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/borsh/node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "license": "MIT", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", + "dependencies": { + "base-x": "^5.0.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-layout": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/buffer-layout/-/buffer-layout-1.2.2.tgz", + "integrity": "sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==", + "license": "MIT", + "engines": { + "node": ">=4.5" + } + }, + "node_modules/bufferutil": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz", + "integrity": "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.361", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.361.tgz", + "integrity": "sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA==", + "dev": true, + "license": "ISC" + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "license": "MIT" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", + "license": "MIT", + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.4.0.tgz", + "integrity": "sha512-loXy6bWOoP3EP6JA7jo6p5jMpBJmHmsNZM5SFRHLdh1MGOPurMnNBj4ZlAbaqUAaQWbCr7jHV4P7gzAyryZWkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.6.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz", + "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "engines": { + "node": "> 0.1.90" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-stable-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz", + "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", + "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/isows": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz", + "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/jayson": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.3.0.tgz", + "integrity": "sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==", + "license": "MIT", + "dependencies": { + "@types/connect": "^3.4.33", + "@types/node": "^12.12.54", + "@types/ws": "^7.4.4", + "commander": "^2.20.3", + "delay": "^5.0.0", + "es6-promisify": "^5.0.0", + "eyes": "^0.1.8", + "isomorphic-ws": "^4.0.1", + "json-stringify-safe": "^5.0.1", + "stream-json": "^1.9.1", + "uuid": "^8.3.2", + "ws": "^7.5.10" + }, + "bin": { + "jayson": "bin/jayson.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jayson/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "license": "MIT" + }, + "node_modules/jayson/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-releases": { + "version": "2.0.46", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.46.tgz", + "integrity": "sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ox": { + "version": "0.14.25", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.14.25.tgz", + "integrity": "sha512-8DoibKtxE8yw63Y2jjMhlbjaURev6WCx4QR4MWLusl2/qIaeTzMJMBIYIDl1KOF45+8H1Ur6eLTdPlUoO8PlRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.11.0", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "1.9.1", + "@noble/hashes": "^1.8.0", + "@scure/bip32": "^1.7.0", + "@scure/bip39": "^1.6.0", + "abitype": "^1.2.3", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/ox/node_modules/@noble/curves": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", + "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ox/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "license": "(MIT AND Zlib)" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pino": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-10.1.0.tgz", + "integrity": "sha512-0zZC2ygfdqvqK8zJIr1e+wT1T/L+LF6qvqvbzEQ6tiMAoTqEVK9a1K3YRu8HEUvGEvNqZyPJTtb2sNIoTkB83w==", + "license": "MIT", + "dependencies": { + "@pinojs/redact": "^0.4.0", + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", + "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", + "license": "MIT" + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process-warning": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", + "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz", + "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.6" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/rolldown": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.2.tgz", + "integrity": "sha512-oZx5zVDtVB44AW3eaifgDml1gWRDZGvjcfdxonE4swNPG98PrrXjaO/KrnUjzlMnztCCRVlUueA1kCXhARGk6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.132.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.2", + "@rolldown/binding-darwin-arm64": "1.0.2", + "@rolldown/binding-darwin-x64": "1.0.2", + "@rolldown/binding-freebsd-x64": "1.0.2", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.2", + "@rolldown/binding-linux-arm64-gnu": "1.0.2", + "@rolldown/binding-linux-arm64-musl": "1.0.2", + "@rolldown/binding-linux-ppc64-gnu": "1.0.2", + "@rolldown/binding-linux-s390x-gnu": "1.0.2", + "@rolldown/binding-linux-x64-gnu": "1.0.2", + "@rolldown/binding-linux-x64-musl": "1.0.2", + "@rolldown/binding-openharmony-arm64": "1.0.2", + "@rolldown/binding-wasm32-wasi": "1.0.2", + "@rolldown/binding-win32-arm64-msvc": "1.0.2", + "@rolldown/binding-win32-x64-msvc": "1.0.2" + } + }, + "node_modules/rpc-websockets": { + "version": "9.3.9", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-9.3.9.tgz", + "integrity": "sha512-2iQDaTB4g5fDB2ihrTFSJSibCEuxaRi1q7qTW7ZO9/M5/TC+ToHA4D9/ffNLEbAoHNNrcdeP05oATNk44SKZXA==", + "license": "LGPL-3.0-only", + "dependencies": { + "@swc/helpers": "^0.5.11", + "@types/uuid": "^10.0.0", + "@types/ws": "^8.2.2", + "buffer": "^6.0.3", + "eventemitter3": "^5.0.1", + "uuid": "^14.0.0", + "ws": "^8.5.0" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/kozjak" + }, + "optionalDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^6.0.0" + } + }, + "node_modules/rpc-websockets/node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/rpc-websockets/node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/rpc-websockets/node_modules/utf-8-validate": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-6.0.6.tgz", + "integrity": "sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/rpc-websockets/node_modules/uuid": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz", + "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/rpc-websockets/node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sonic-boom": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", + "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/stream-chain": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", + "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", + "license": "BSD-3-Clause" + }, + "node_modules/stream-json": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz", + "integrity": "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==", + "license": "BSD-3-Clause", + "dependencies": { + "stream-chain": "^2.2.5" + } + }, + "node_modules/superstruct": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz", + "integrity": "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==", + "license": "MIT" + }, + "node_modules/text-encoding-utf-8": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", + "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==" + }, + "node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "license": "MIT", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", + "license": "MIT" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.60.0.tgz", + "integrity": "sha512-9f65qWLZdAW9m1JaxBDUHcqRUfL8bkxxXL7XxEfI+F09q56PkBvIfCjLF3yInsDM/BBmwkqmCQdCZe/RYlIWEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.60.0", + "@typescript-eslint/parser": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/utils": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/viem": { + "version": "2.51.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.51.2.tgz", + "integrity": "sha512-2x4YAtr3PUPIW++Ov96clnWtRsyqMfpFfooQRIxCpAMsTgxioJTdIQ0ywbjhlHDCUJEGM6M8q8ILOeaPRViH9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@noble/curves": "1.9.1", + "@noble/hashes": "1.8.0", + "@scure/bip32": "1.7.0", + "@scure/bip39": "1.6.0", + "abitype": "1.2.3", + "isows": "1.0.7", + "ox": "0.14.25", + "ws": "8.20.1" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/viem/node_modules/@noble/curves": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", + "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/abitype": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.3.tgz", + "integrity": "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3.22.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/viem/node_modules/ws": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz", + "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/vite": { + "version": "8.0.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.14.tgz", + "integrity": "sha512-s4BJJ+5y1pYL6Otw51FHhVJQhPnuRinKig64g/1+EUNaJsd3gCKdD31IPFvswUgW9/60QT9oFHbZHbQK5imcxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "1.0.2", + "tinyglobby": "^0.2.16" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.67", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", + "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/app-kit-transfer-widget/package.json b/app-kit-transfer-widget/package.json new file mode 100644 index 0000000..e6a3090 --- /dev/null +++ b/app-kit-transfer-widget/package.json @@ -0,0 +1,39 @@ +{ + "name": "transfer-widget", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@circle-fin/adapter-solana": "^1.5.9", + "@circle-fin/adapter-viem-v2": "^1.11.1", + "@circle-fin/app-kit": "^1.6.1", + "buffer": "^6.0.3", + "react": "^19.2.6", + "react-dom": "^19.2.6", + "viem": "^2.51.2" + }, + "devDependencies": { + "@babel/core": "^7.29.7", + "@eslint/js": "^10.0.1", + "@rolldown/plugin-babel": "^0.2.3", + "@types/babel__core": "^7.20.5", + "@types/node": "^25.9.1", + "@types/react": "^19.2.15", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.2", + "babel-plugin-react-compiler": "^1.0.0", + "eslint": "^10.4.0", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.6.0", + "typescript": "^6.0.3", + "typescript-eslint": "^8.60.0", + "vite": "^8.0.14" + } +} diff --git a/app-kit-transfer-widget/public/favicon.ico b/app-kit-transfer-widget/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a68da7a170b96bb8943d58e93e34edd6ebb99b8a GIT binary patch literal 15086 zcmds8SyNj{mR3hiL_bcy)N@yK#6(QJ_0v37&mZU?P;dP(Gd)#ydEWtJyp(HkZSAs+ zO}V^4*#>NE;{_WG#&&rHv)EuZNk~ExLOWWobeC_wyjNEU5RxDqU5?3!~@ImhPA1oF-pZ$SX@&14R#bWuKAN)JN zVH3;WSjF?VQ2>0%x|y|=^$lx`RbyRi5p6{uqA$^>==;OBfwiy?_W3buFY7<6h_OB{ z#ITlo_VE$xqkk6YBIAg$KUyR9Jw^Katsd=J4GjcY|62hqF>ZY&G`yqOO|nYTz>nS~ znK3ahy%v=vek62tZG~1)%gWHAaVT~-t!KI}ub`w6l=k0Jm19P;2Rs17Hz`FTK= zIgT)$Yc9)lnmw)F&ZsK1cnaAkBS@dUg>=JJq)uK&s{Rtv^}nz-B7O24(x=WsI?a0a zEHX{!k!fy%Jn$S^G6ArUHIzq%y1@3rzE@rZzf%%%k0O1h1E~{jNd4G?)UiuQ9lyZe zO~igahy4tshMyt*^b=_~1?lH{NM}w!YCMVT<#SL5pF&Hg*x{<@BfmZnc;#!8qC)kC zAT{?A=QX5`lHWfz>)6x8o~~#8`4aK9K)TQh>0%2q7cL;vNdBKWsbkNaJ%-G=qsW~9 z2Qn9rA$#W{w19WDbI~j2fY^mkP;pUgUdqZ{;wI0Jwi>RX6 zl(H3v7GsS>p!&Q}CdVOn-$v$A1L-0D#_w3aMfSpX$hJ2?b&Ugx(2a_V>CaT$K(Ts| z{^`~NcFIh;p%u!w9gs4m4+ONj97Jr@NEnh%xJ_z~pK`1?^IhV9e<%{V9ul%K^AQQZfm~}Ivwyj78 zuR>F4FE|g%=oIy_#jrCc&u~u8Ak#v9ZQ*=0@&5cN%J)g?=qY5|&OmwI4Q-CR6?B;V z)ks5tG?4Fd>jBn%kgpwrI@(={9F_IoH93N$y&AE}b%;!@N5rugvg9!66*P>IhVvJT z+ep*Socn>ad{3IFtCx>M8F@nf7T8S6yXqK*e4TS}xfV*>UMP2t0IBH8d^O&b5i$*O zpdHDnO$L7J1|;Sh4gQ-wb1hY-thASnIs2Zok>^ez^GiK#=W*huofO!Gu3n(5Hy?rW z^oBu$IS<)1)V?+-SBd{>HIy5*(8fABN*RbIj$&6;f@G^kV&YRB|Ga$%C-oHA; zjRyXy&ybm?+zNiP2+WaS3*62f2!&b=+p51Q@rN`j&#qI(1^@T+x(~|0P0m4%$3mB# zeNb=gV%-k4V>dM4>k=K7ex-!&B0ce$jz4bQ3Z+1HWX_FmrVcZXO>nt(A{?PSS5UOn zJmeeS5_=t#E0py+-*Ubdc&r7ves|PBy}1?Y?QPI(_bTYM_$P{wYwP%@27dc)s2Tbw zxgw>;G3(r=<99l@VlHsjd{y?UK5c>Aw%@QbHxJUL7U)#m2eqpX>aEShzZu%7SfbWe zWbfHL{)C-8$u96Iofv@Eu`S2{9f;1~uXqr3>KSGHfMI9aX=mKS3vE*&s6G3MeLrdTZi$x&;2-ihEbBPoT6@euSO5S+gAf{W@p@`+eQ5oSWfv*Fsk4<5WA|Q_${hhj#ZQOgysN!qKc)Xyqtudgh&pYA8nI?4CW zPoQ;w2Ka}{^|s=Bef_c;>(~6$IxJnkq_hnlSC!6xyK4)q?w#<4nvg9r4;eml#&07i zy@smMf0HF>Ug~X%b7t-xvq@-!TqExid)ME&E8N8Q{uS|+eL?>rZL6aGuG9U8sO~>Z z=9>v#&qwdVN#5ICn=v)B6_f5An4GPHGjs-l_yf!(9>N+uhrz%hJP*|1S#Ur6(vU#| z*Q-2s(Q9}T+I`ym&c74?{{WA701DUkH5Uz8`frKJoc}f@{I~N3{+q_|K>~qb6Q)VS z)XWx4xVPdB>xg$JUe8ux$XAV*bGz|kZWo^Vcj4E-ZafJcfKM8LQYdS33fjmy;{F5> z*zbP|*xHD^tp8T>gQfm+m~$Y-p0itXk4Ha6O{P#muco;bZxAelGf&7Q{DrJ5hE9by=xqwG2!ZULRD}EqeXi5x;nQyp%*`VY1 z+cqNT{sI~5ua=(&{Y#yWj2u8*nm{Byq}O?A5@{ufq~gO+{?14>dgc$qY0@C{RVE!mx62oSUBn>D7a>RS0e%1Iw{5_zeFHqxo8Wfs zMli@&p~StqD)t5|k4q_otfh3_eH5-kcen}y|D8w;?!~^utUOvC$Ko#p_74|7D)CE` zkx2|v{`Zsrn~8s8&i~v3hr0^iz|V*#ULZ+5kYpb+N?5OHc@DAcH2mq87@KdxQ|fMS zsK&q_uEyPHEqY_$!zVNLv$~?^%GjiG=Zo`@m8KE$d`JIndv5*R3_E=Y!+vhVgtr>w zz5^JW`y8YG!x;7-!b^WGp85B{v_Gc&cSq{*EPe_R#l_h%ZCXV{=<&l`4DsWNTI4^X zBrpyXi`<6Sy`TG+9bCV*EVlnS`#F%epN9Q6@jndJ;&JqASW{idXq5Nzc0NCP?j|3< z&C#&x__?q>iV{U6dK)g!e%k+POnP=>%(H{`e>?5}4&DC0^zB05+#Y@Xea`jwdH5^X zlbw)M#z{Iv} z!sifvlkok@#^3o(sbc!?rXQ*MGnL{I-@#$A{2sjS<2fN-HSw_4Vo}8PFBXd=u79*x zqT>3m7K=k%e{Zq$itBp|*L~vm?<^McDt`WdD*FU61@!fb-v#tL#BcJ&dv<82LEq#x1u`^9jG=d6Q8+Pv*YVvJ=N_^dLzMNElj1sD`$WlmgFh4GCk=6*kcep5H;SE66>S z=v0>nz87*{Qr5Ic0#fS(p5YMZIdW$?#Mt^7lry1(7sp(+ID5hK3)w3tnERyp zE}io?^?T*<%TPxz!vzxLSB#VV)C!T4moBz3Hy7ksF`ftDH5A}^j(K9D9OjBTGs#@_QRefQ zb8KfGDIPLkExl4$ir6)dnVLC*sC5fcVX6gXT^=6OWi5S*`SXj+qhG$nJnm`cahXHE zdJgh~8_f627&^chhwA2;k~ZcOMJ}$lfqfJ;pG6-k@j=9yAB-|Lm zS7IMTEW~k`<9~{j_b0aD`8CG1L;iCJhgv8Pv^5#BP1qZ=@Lmgf$?va;gZZnc6e}SQ zLMHo~NI!F)kG?Ob3r24oOPboQk1vI8>(3PKKYi|la5=Xjp6D}2U3?`5b)dt@Uv_e= zgb^dvCc2>B+y=F)n&UG*U#_SbNaO2t{%7^Pun-+Lyv#|un2(Gz4zyBHoy^N$qrBZb z07Q+PrsjIC=Nz?;P2@>Yaa-J-7@u=5=HDDYTR1-Bf}E7aZF0X<*C6Mb`JY?Nv(4wm zpLu5F3-2;#Qpxx$@qgwZoQ};1gf3GaC<8@`CdR)}1-1JtAZh5lX6<0kY#s9l+biQg zUvTbcef;T}-AHE`6EDCZVkL@}<};o(7^Zz1Xd+{My5~ zyYW5$T4@u-*gc;xU-pvEi79BWT;qBU3}{Oz6ADcrJ5e!L!T-e1Q>P z4Tk4x@hbQ=`h$n@D6og|^J=)#kM%r~W~c4EzYcgw-YYqtEQTP)7Hhz=BJAG0eGh`n zO9Y%%NGFH$-w1n@p-o60en%DDj7baqb9xVv|K|{hb>-x*51vFfCSt$n^b7uXG4|XOttf7; z?+rM3N&icnDe=$#K>N2HHpXLx{Eae~^@@3{fmtJmCFJiB^H&eTd(j^|g_OE*CZafT z`k4B@gzwAxpW<9jGBu0<^H7et?=bG&%kg(o{&!)(Ux!!WqnL_cg+DVwTToGMa?yT- z7%KC>IiF(wg$#;(uUYkHrRTbk4U7D5;fwR-`>em&{-Xdxg?uO^r{a6j_p-fD;a((% z<2TuV7UCdIb8jGYRM?5-c9IWQD5hOA^?SwrH{%F@VNBtV4n`Sz8F>(OpB|C0ywxK5 z?9KJ>;8)92y&t1oF!F6R z=0fAv?c7_v;GSmG*iSSzaNHA6dgxnadH#C*F@5HPJWHG^>_fj-laq+sc)o}0kT|O) zTSs_4p0vBBAa|XI@{qnyf@j4#4iMM!rB#XbA?Z3opVq@Oj=OoZeL6pe=HZ^Hoon^H z58C5@0N#Q8JM%_~^%u0?iDYttPA%l*xvBkZ&$Cj`z6ECc&1U(lz#p^j(DD1{PQdN^ z0rRQXh%krbPw;<7JT!qxuCc;j3{T|SnK$B`X^dwcQ;|+?LDKL9PU4NX3IlUBctZcj znf{e>@DzBkk^B?+zkJEhK{oaRA!i+8(R)0uE&K>ClClSm)IIcY{c3ARcw+nW64eWs*F&;Y3Gc*U#8`+21tl-I_bzjKOGWivIx)k%{(bN#aJd+U3 u+K^=)d`Z#eH>U$@)*n*|b2t{s^OEtzPm|uf{`S&>?PHvDwMDcMZT}AmGLG2* literal 0 HcmV?d00001 diff --git a/app-kit-transfer-widget/src/components/TransferWidget/TransferWidget.css b/app-kit-transfer-widget/src/components/TransferWidget/TransferWidget.css new file mode 100644 index 0000000..75d2645 --- /dev/null +++ b/app-kit-transfer-widget/src/components/TransferWidget/TransferWidget.css @@ -0,0 +1,460 @@ +/** + * Copyright 2026 Circle Internet Group, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +.widget-card { + --border-radius: 0.5em; + --widget-text-primary: #eef4ff; + --widget-text-secondary: #b6c4dd; + --widget-surface: rgba(17, 31, 52, 1); + --widget-border: rgba(136, 158, 196, 0.24); + --widget-accent: #afc7ea; + --widget-accent-text: #112238; + + width: min(100%, 30em); + border: 1px solid var(--widget-border); + background: + linear-gradient(180deg, rgba(40, 57, 84, 0.98) 0%, rgba(35, 49, 73, 0.98) 100%); + border-radius: var(--border-radius); + padding: 2em; + box-sizing: border-box; + position: relative; + display: flex; + flex-direction: column; + min-width: 350px; +} + +.wallet-connected, +.wallet-disconnected { + display: flex; + flex-direction: column; +} + +.wallet-connected { + gap: 1.5em; +} + +.wallet-disconnected { + text-align: center; + width: 100%; + gap: 0.5em; +} + +.panel-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1em; +} + +.panel-title { + margin: 0; + color: var(--widget-text-primary); +} + +.wallet-list { + width: 100%; + display: flex; + flex-direction: column; + gap: 0.5em; +} + +.wallet-row, +.chain-select, +.text-input, +.ghost-button, +.wallet-pill, +.token-pill, +.status-banner, +.step-chip { + border-radius: var(--border-radius); +} + +.wallet-row { + border: 1px solid var(--widget-border); + background: var(--widget-surface); + color: var(--widget-text-primary); + display: flex; + align-items: center; + gap: 1em; + padding: 1em; + cursor: pointer; +} + +.wallet-row:disabled, +.primary-button:disabled, +.ghost-button:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.wallet-badge, +.success-badge, +.spinner { + display: inline-grid; + place-items: center; + flex: 0 0 auto; +} + +.wallet-badge { + width: 2em; + height: 2em; + border-radius: var(--border-radius); + font-size: smaller; + font-weight: bold; +} + +.wallet-badge-evm { + background: linear-gradient(135deg, #f6851b, #c06105); + color: #1d1205; +} + +.wallet-badge-solana { + background: linear-gradient(135deg, #cabdff, #7d68ff); + color: #160a36; +} + +.route-block { + display: flex; + align-items: end; +} + +.chain-select { + position: relative; + background: var(--widget-surface); + border: 1px solid var(--widget-border); +} + +.chain-select-toggle { + border: none; + background: transparent; + color: var(--widget-text-primary); + appearance: none; + cursor: pointer; + padding-block: 0.75em; + text-align: left; + padding-inline-start: 1em; + anchor-name: --chain-select; + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.5em; + width: 100%; +} + +.chain-icon { + width: 1.25em; + height: 1.25em; +} + +.chain-name { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.chain-select-arrow { + margin-inline: auto 0.5em; + color: var(--widget-text-secondary); + font-size: smaller; +} + +.chain-dropdown { + position: absolute; + font-size: smaller; + width: 100%; + z-index: 1; +} + +.chain-list { + max-height: 200px; + overflow-y: auto; + scrollbar-width: thin; +} + +.chain-list button { + padding: 0.5em; + width: 100%; + border: none; + display: flex; + gap: 0.5em; + background: var(--widget-surface); + color: var(--widget-text-primary); + cursor: pointer; +} + +.swap-button { + width: 2em; + border: none; + background: transparent; + color: var(--widget-text-secondary); + font-size: 1.5rem; + cursor: pointer; + flex: none; + padding-block-end: 0.5em; +} + +.swap-button:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.field-block { + display: flex; + flex-direction: column; + gap: 0.5em; + width: 100%; + min-width: 0; +} + +.field-label { + text-transform: uppercase; + font-size: smaller; + color: var(--widget-text-secondary); +} + +.inline-field { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 0.5em; +} + +.token-pill, +.wallet-pill { + min-height: 2.5em; +} + +.text-input { + width: 100%; + border: 1px solid var(--widget-border); + background: var(--widget-surface); + color: var(--widget-text-primary); + padding: 0.75em; + font: inherit; + box-sizing: border-box; +} + +.text-input::placeholder { + color: var(--widget-text-secondary); +} + +.ghost-button, +.token-pill, +.wallet-pill { + border: 1px solid var(--widget-border); + background: var(--widget-surface); + color: var(--widget-text-secondary); + cursor: pointer; + padding-inline: 0.5em; +} + +.ghost-button{ + font-size: smaller; + padding-inline: 1em; + font-weight: 600; +} + +.token-pill, +.wallet-pill { + display: inline-flex; + align-items: center; + justify-content: center; +} + +.wallet-pill { + gap: 0.5em; + border-radius: var(--border-radius); + color: var(--widget-text-primary); + font-family: monospace; + padding-inline-start: 1em; + border-radius: 3em; +} + +.wallet-pill-dismiss { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-size: larger; +} + +.status-banner { + border: 1px solid var(--widget-accent); + background: var(--widget-surface); + color: var(--widget-text-secondary); + text-align: center; + padding: 1em 0.5em; + font-size: smaller; +} + +.primary-button { + width: 100%; + border: none; + padding: 1em; + border-radius: var(--border-radius); + background: var(--widget-accent); + color: var(--widget-accent-text); + font: inherit; + cursor: pointer; +} + +.back-link { + width: fit-content; + border: none; + color: var(--widget-text-secondary); + text-decoration: underline; + background: transparent; + padding-inline: 0; + font: inherit; + cursor: pointer; +} + +.route-summary { + display: flex; + align-items: center; + justify-content: center; + gap: 1em; + border-radius: var(--border-radius); + background: var(--widget-surface); + padding: 1em; +} + +.route-chain { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5em; + color: var(--widget-text-primary); +} + +.route-arrow { + color: var(--widget-text-secondary); + font-size: larger; +} + +.review-grid { + display: grid; + grid-template-columns: 1fr auto; + margin: 0; + border-top: 1px solid var(--widget-border); + font-size: smaller; +} + +.review-grid dt, +.review-grid dd { + margin: 0; + padding: 0.75em 0; + border-bottom: 1px solid var(--widget-border); +} + +.review-grid dt { + color: var(--widget-text-secondary); +} + +.review-grid dd { + color: var(--widget-text-primary); + text-align: right; +} + +.spinner { + width: 3.5em; + height: 3.5em; + border-radius: 50%; + margin: 1em auto; + border: 3px solid var(--widget-border); + border-top-color: var(--widget-accent); + animation: spin 1s linear infinite; +} + +.status-panel { + text-align: center; +} + +.support-copy, +.processing-route, +.success-copy { + color: var(--widget-text-secondary); + font-size: smaller; + margin: 0; +} + +.processing-route { + display: flex; + gap: 0.5em; + align-items: center; + justify-content: center; +} + +.success-badge { + width: 2em; + height: 2em; + border-radius: 50%; + margin: 0.5em auto; + background: linear-gradient(180deg, #3bd47f, #1bb85d); + color: white; + font-size: 2rem; +} + +.step-links { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 0.5em; +} + +.step-chip { + display: inline-flex; + align-items: center; + gap: 0.5em; + text-decoration: none; + background: var(--widget-surface); + color: var(--widget-text-primary); + border: 1px solid var(--widget-border); + padding: 1em; + font-size: small; +} + +.step-state { + color: #4ae289; +} + +.error-banner { + border-radius: var(--border-radius); + border: 1px solid rgba(255, 122, 122, 0.25); + background: rgba(118, 28, 37, 0.28); + color: #ffd3d5; + padding: 1em; + line-height: 1.4; + max-height: 10em; + overflow: auto; + white-space: pre-wrap; + word-break: break-all; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +@media (max-width: 560px) { + .swap-button { + transform: rotate(90deg); + justify-self: center; + } +} diff --git a/app-kit-transfer-widget/src/components/TransferWidget/TransferWidget.tsx b/app-kit-transfer-widget/src/components/TransferWidget/TransferWidget.tsx new file mode 100644 index 0000000..02fdc9a --- /dev/null +++ b/app-kit-transfer-widget/src/components/TransferWidget/TransferWidget.tsx @@ -0,0 +1,791 @@ +/** + * Copyright (c) 2026, Circle Internet Group, Inc. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { useEffect, useState, type ReactNode } from "react"; +import { getErrorMessage, type ChainDefinition } from "@circle-fin/app-kit"; +import "./TransferWidget.css"; +import { getChainMeta } from "./chains"; +import { + detectTransferMethod, + estimateTransfer, + executeTransfer, + getSupportedChains, + usesForwarder, + type ChainId, + type TransferEstimate, + type TransferResult, +} from "./transfer"; +import { + connectBrowserWallet, + discoverInjectedEvmWallets, + hasSolanaWallet, + type BrowserWalletDetail, + type ConnectedWallet, +} from "./wallet"; + +type Screen = + | "connect" + | "wallets" + | "form" + | "review" + | "submitting" + | "success"; + +type FormState = { + fromChain: ChainId | ""; + toChain: ChainId | ""; + recipient: string; + amount: string; +}; + +type ChainSelectProps = { + chains: ChainDefinition[]; + value: ChainId | ""; + onChange: (chain: ChainId | "") => void; +}; + +const emptyForm: FormState = { + fromChain: "", + toChain: "", + recipient: "", + amount: "", +}; + +function TransferWidget() { + const [initialChainState] = useState(() => { + try { + return { + supportedChains: getSupportedChains(), + error: null as string | null, + }; + } catch (chainError) { + return { + supportedChains: [] as ChainDefinition[], + error: getErrorMessage(chainError) ?? "Unable to load supported chains", + }; + } + }); + const [screen, setScreen] = useState("connect"); + const [wallet, setWallet] = useState(null); + const [evmWallets, setEvmWallets] = useState([]); + const [form, setForm] = useState(emptyForm); + const [review, setReview] = useState(null); + const [result, setResult] = useState(null); + const [balance, setBalance] = useState(null); + const [balanceUnavailable, setBalanceUnavailable] = useState(false); + const [statusMessage, setStatusMessage] = useState( + "Processing transfer transaction...", + ); + const [supportedChains] = useState( + initialChainState.supportedChains, + ); + const [error, setError] = useState(initialChainState.error); + const [busyAction, setBusyAction] = useState< + "wallet" | "review" | "submit" | null + >(null); + + const chainMap = new Map( + supportedChains.map((chain) => [chain.chain, chain] as const), + ); + const sourceChain = form.fromChain + ? (chainMap.get(form.fromChain) ?? null) + : null; + const destinationChain = form.toChain + ? (chainMap.get(form.toChain) ?? null) + : null; + const availableSourceChains = wallet + ? supportedChains.filter((chain) => chain.type === wallet.kind) + : []; + const canUseDirectMint = (chain: ChainDefinition) => + wallet?.kind === "evm" && chain.type === "evm"; + const availableDestinationChains = wallet + ? supportedChains.filter( + (chain) => usesForwarder(chain) || canUseDirectMint(chain), + ) + : []; + const canUseConnectedAddress = Boolean( + wallet && destinationChain && wallet.kind === destinationChain.type, + ); + const selectedMethod = + sourceChain && destinationChain + ? detectTransferMethod(sourceChain, destinationChain) + : null; + const selectedMethodLabel = destinationChain + ? getTransferMethodLabel(selectedMethod, usesForwarder(destinationChain)) + : null; + const canSwapRoute = Boolean( + wallet && + sourceChain && + destinationChain && + destinationChain.type === wallet.kind, + ); + + useEffect(() => { + if (!wallet || !sourceChain) { + return; + } + + let cancelled = false; + + const syncBalance = async () => { + try { + if (!cancelled) { + setBalanceUnavailable(false); + } + + const request = await wallet.adapter.prepareAction( + "usdc.balanceOf", + {}, + { chain: sourceChain }, + ); + const value = await request.execute(); + + if (!cancelled) { + setBalance(formatUsdcBalance(value)); + } + } catch { + if (!cancelled) { + setBalance("Unavailable"); + setBalanceUnavailable(true); + } + } + }; + + void syncBalance(); + + return () => { + cancelled = true; + }; + }, [wallet, sourceChain]); + + async function openWalletChooser() { + setError(null); + + try { + const discoveredWallets = await discoverInjectedEvmWallets(); + setEvmWallets(discoveredWallets); + } catch (discoveryError) { + setError(getErrorMessage(discoveryError) ?? "Unknown error"); + } + + setScreen("wallets"); + } + + async function handleConnectWallet( + walletChoice: BrowserWalletDetail | "solana", + ) { + setBusyAction("wallet"); + setError(null); + + try { + const connectedWallet = await connectBrowserWallet(walletChoice); + + setWallet(connectedWallet); + clearTransferState("form"); + } catch (connectionError) { + setError(getErrorMessage(connectionError) ?? "Unknown error"); + } finally { + setBusyAction(null); + } + } + + function disconnectWallet() { + setWallet(null); + clearTransferState("connect"); + } + + async function handleReviewTransfer() { + if (!wallet || !sourceChain || !destinationChain) { + setError("Connect a wallet and choose a valid route first"); + return; + } + + if (!form.recipient.trim()) { + setError("Recipient address is required"); + return; + } + + const amount = Number.parseFloat(form.amount); + + if (!Number.isFinite(amount) || amount <= 0) { + setError("Enter a valid USDC amount"); + return; + } + + setBusyAction("review"); + setError(null); + + try { + const estimate = await estimateTransfer( + wallet, + sourceChain, + destinationChain, + form.amount, + form.recipient, + ); + setReview(estimate); + setScreen("review"); + } catch (reviewError) { + setError(getErrorMessage(reviewError) ?? "Unknown error"); + } finally { + setBusyAction(null); + } + } + + async function handleSubmitTransfer() { + if (!wallet || !sourceChain || !destinationChain || !review) { + setError("Review the transfer before submitting"); + return; + } + + setBusyAction("submit"); + setError(null); + setStatusMessage( + review.method === "send" + ? "Processing send transaction..." + : "Processing bridge transaction...", + ); + setScreen("submitting"); + + try { + const transferResult = await executeTransfer( + wallet, + sourceChain, + destinationChain, + form.recipient, + review, + () => setStatusMessage("Retrying bridge after an initial failure..."), + ); + + if (transferResult.state === "error") { + const failedStep = transferResult.steps.find( + (step) => step.state === "error" && step.errorMessage, + ); + setResult(transferResult); + setError(failedStep?.errorMessage ?? "Transfer failed"); + setScreen("review"); + return; + } + + setResult(transferResult); + setScreen("success"); + } catch (submitError) { + setError(getErrorMessage(submitError) ?? "Unknown error"); + setScreen("review"); + } finally { + setBusyAction(null); + } + } + + function clearTransferState(nextScreen: Screen) { + setReview(null); + setResult(null); + setError(null); + setBalance(null); + setBalanceUnavailable(false); + setStatusMessage("Processing transfer transaction..."); + setForm(emptyForm); + setScreen(nextScreen); + } + + function renderConnectScreen() { + return ( +
+

Arc Transfer

+

Send or bridge USDC across chains

+ +
+ ); + } + + function renderWalletChooser() { + return ( +
+

Arc Transfer

+

Select a wallet

+
+ {evmWallets.length > 0 ? ( + evmWallets.map((evmWallet) => ( + + )) + ) : ( +

No EVM wallet detected.

+ )} + + {hasSolanaWallet() ? ( + + ) : ( +

No Solana wallet detected.

+ )} +
+
+ ); + } + + function renderReviewScreen() { + if (!sourceChain || !destinationChain || !review) { + return null; + } + + const sourceMeta = getChainMeta(sourceChain.name); + const destinationMeta = getChainMeta(destinationChain.name); + + return ( +
+ +

Review Transfer

+ +
+
+ + {sourceMeta.displayName} +
+ +
+ + {destinationMeta.displayName} +
+
+ +
+
You receive
+
{formatDisplayAmount(review.destinationAmount)} USDC
+
Estimated fee
+
{formatFee(review)}
+
Total from source
+
{formatDisplayAmount(review.totalSourceAmount)} USDC
+
Recipient
+
{shortAddress(form.recipient, 6, 4)}
+
Method
+
+ {getTransferMethodLabel( + review.method, + Boolean(review.useForwarder), + )} +
+
+ + +
+ ); + } + + function renderSubmittingScreen() { + if (!sourceChain || !destinationChain || !review) { + return null; + } + + return ( +
+ +

+ {review.method === "send" ? "Sending" : "Bridging"}{" "} + {formatDisplayAmount(review.destinationAmount)} USDC +

+

+ {sourceChain.name} + + {destinationChain.name} +

+

{statusMessage}

+
+ ); + } + + function renderSuccessScreen() { + if (!sourceChain || !destinationChain || !result) { + return null; + } + + return ( +
+ +

Transfer Complete

+

+ {result.method === "send" + ? `${formatDisplayAmount(result.amount)} USDC sent on ${sourceChain.name}` + : `${formatDisplayAmount(result.amount)} USDC from ${sourceChain.name} to ${destinationChain.name}`} +

+
+ {result.steps + .filter((step) => step.explorerUrl) + .map((step) => ( + + + {step.name} View → + + ))} +
+ +
+ ); + } + + function renderTransferForm() { + return ( +
+
+

Arc Transfer

+ {wallet ? ( +
+ {shortAddress(wallet.address)} + +
+ ) : null} +
+ +
+
+ From + { + setBalance(null); + setBalanceUnavailable(false); + setForm((currentForm) => ({ + ...currentForm, + fromChain: nextFromChain, + })); + }} + /> +
+ + +
+ To + { + setForm((currentForm) => ({ + ...currentForm, + toChain: nextToChain, + })); + }} + /> +
+
+ + + + + + {selectedMethodLabel ? ( +
Method: {selectedMethodLabel}
+ ) : null} + + +
+ ); + } + + let content: ReactNode = renderTransferForm(); + + if (screen === "connect") { + content = renderConnectScreen(); + } else if (screen === "wallets") { + content = renderWalletChooser(); + } else if (screen === "review") { + content = renderReviewScreen() ?? renderTransferForm(); + } else if (screen === "submitting") { + content = renderSubmittingScreen() ?? renderTransferForm(); + } else if (screen === "success") { + content = renderSuccessScreen() ?? renderTransferForm(); + } + + return ( +
+ {content} + {error ?

{error}

: null} +
+ ); +} + +function ChainSelect({ chains, value, onChange }: ChainSelectProps) { + const [isOpen, setIsOpen] = useState(false); + const [search, setSearch] = useState(""); + const selectedChain = chains.find((chain) => chain.chain === value) ?? null; + const selectedMeta = selectedChain ? getChainMeta(selectedChain.name) : null; + const searchTerm = search.trim().toLowerCase(); + const filteredChains = searchTerm + ? chains.filter((chain) => { + const meta = getChainMeta(chain.name); + return ( + meta.displayName.toLowerCase().includes(searchTerm) || + chain.name.toLowerCase().includes(searchTerm) + ); + }) + : chains; + + return ( +
+ + + {isOpen ? ( +
+ setSearch(event.target.value)} + placeholder="Search chains..." + autoFocus + /> +
+ {filteredChains.length === 0 ? ( +
No chains found
+ ) : null} + {filteredChains.map((chain) => { + const meta = getChainMeta(chain.name); + const isSelected = chain.chain === value; + + return ( + + ); + })} +
+
+ ) : null} +
+ ); +} + +function formatUsdcBalance(value: unknown): string { + const bigintValue = + typeof value === "bigint" + ? value + : BigInt(typeof value === "string" ? value : String(value)); + const whole = bigintValue / 1_000_000n; + const decimals = (bigintValue % 1_000_000n).toString().padStart(6, "0"); + const trimmedDecimals = decimals.replace(/0+$/, ""); + + return trimmedDecimals + ? `${whole.toString()}.${trimmedDecimals}` + : whole.toString(); +} + +function formatDisplayAmount(value: string): string { + const amount = Number.parseFloat(value); + return Number.isFinite(amount) ? amount.toFixed(2).replace(/\.00$/, "") : "0"; +} + +function formatFee(review: TransferEstimate): string { + return review.feeAmount === "0" + ? "No fee" + : `${review.feeAmount} ${review.feeToken}`; +} + +function getTransferMethodLabel( + method: TransferEstimate["method"] | null, + useForwarder: boolean, +): string | null { + if (!method) { + return null; + } + + if (method === "send") { + return "Send"; + } + + return useForwarder ? "CCTP + Forwarder" : "CCTP Direct Mint"; +} + +function shortAddress(value: string, head = 4, tail = 4): string { + if (value.length <= head + tail + 3) { + return value; + } + + return `${value.slice(0, head)}...${value.slice(-tail)}`; +} + +export default TransferWidget; diff --git a/app-kit-transfer-widget/src/components/TransferWidget/chains.ts b/app-kit-transfer-widget/src/components/TransferWidget/chains.ts new file mode 100644 index 0000000..c597ca8 --- /dev/null +++ b/app-kit-transfer-widget/src/components/TransferWidget/chains.ts @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2026, Circle Internet Group, Inc. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// widget/chains.ts - Testnet chain metadata for the embedded transfer widget. +// App Kit owns chain availability; this file only decorates SDK chains for the UI. + +import { CHAIN_ICONS, PLACEHOLDER_ICON } from "./icons"; + +export type ChainMeta = { + name: string; + displayName: string; + icon: string; +}; + +const DISPLAY_NAME_OVERRIDES: Record = { + "Apothem Network": "XDC Apothem", +}; + +export function getChainMeta(chainName: string): ChainMeta { + return { + name: chainName, + displayName: DISPLAY_NAME_OVERRIDES[chainName] ?? chainName, + icon: CHAIN_ICONS[chainName] ?? PLACEHOLDER_ICON, + }; +} diff --git a/app-kit-transfer-widget/src/components/TransferWidget/icons.ts b/app-kit-transfer-widget/src/components/TransferWidget/icons.ts new file mode 100644 index 0000000..db3e19c --- /dev/null +++ b/app-kit-transfer-widget/src/components/TransferWidget/icons.ts @@ -0,0 +1,77 @@ +/** + * Copyright (c) 2026, Circle Internet Group, Inc. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Icons for the embedded transfer widget. +// Source: euclid/packages/icons/src/svg/blockchain optimized SVG assets. + +function svgDataUri(svg: string): string { + return `data:image/svg+xml,${encodeURIComponent(svg)}`; +} + +const ARBITRUM_ICON = svgDataUri(``); +const ARC_ICON = svgDataUri(``); +const AVALANCHE_ICON = svgDataUri(``); +const BASE_ICON = svgDataUri(``); +const CODEX_ICON = svgDataUri(``); +const EDGE_ICON = svgDataUri(``); +const ETHEREUM_ICON = svgDataUri(``); +const HYPEREVM_ICON = svgDataUri(``); +const INJECTIVE_ICON = svgDataUri(``); +const INK_ICON = svgDataUri(``); +const LINEA_ICON = svgDataUri(``); +const MONAD_ICON = svgDataUri(``); +const MORPH_ICON = svgDataUri(``); +const OPTIMISM_ICON = svgDataUri(``); +const PHAROS_ICON = svgDataUri(``); +const PLUME_ICON = svgDataUri(``); +const POLYGON_ICON = svgDataUri(``); +const SEI_ICON = svgDataUri(``); +const SOLANA_ICON = svgDataUri(``); +const SONIC_ICON = svgDataUri(``); +const UNICHAIN_ICON = svgDataUri(``); +const WORLD_CHAIN_ICON = svgDataUri(``); +const XDC_ICON = svgDataUri(``); +const UNKNOWN_ICON = svgDataUri(``); + +export const PLACEHOLDER_ICON = UNKNOWN_ICON; + +export const CHAIN_ICONS: Record = { + "Arbitrum Sepolia": ARBITRUM_ICON, + "Arc Testnet": ARC_ICON, + "Avalanche Fuji": AVALANCHE_ICON, + "Base Sepolia": BASE_ICON, + "Codex Testnet": CODEX_ICON, + "Edge Testnet": EDGE_ICON, + "Ethereum Sepolia": ETHEREUM_ICON, + "HyperEVM Testnet": HYPEREVM_ICON, + "Injective Testnet": INJECTIVE_ICON, + "Ink Sepolia": INK_ICON, + "Linea Sepolia": LINEA_ICON, + "Monad Testnet": MONAD_ICON, + "Morph Hoodi": MORPH_ICON, + "Optimism Sepolia": OPTIMISM_ICON, + "Pharos Atlantic": PHAROS_ICON, + "Plume Testnet": PLUME_ICON, + "Polygon Amoy": POLYGON_ICON, + "Sei Testnet": SEI_ICON, + "Solana Devnet": SOLANA_ICON, + "Sonic Testnet": SONIC_ICON, + "Unichain Sepolia": UNICHAIN_ICON, + "World Chain Sepolia": WORLD_CHAIN_ICON, + "Apothem Network": XDC_ICON, +}; diff --git a/app-kit-transfer-widget/src/components/TransferWidget/index.ts b/app-kit-transfer-widget/src/components/TransferWidget/index.ts new file mode 100644 index 0000000..a81284a --- /dev/null +++ b/app-kit-transfer-widget/src/components/TransferWidget/index.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2026, Circle Internet Group, Inc. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { default } from "./TransferWidget"; diff --git a/app-kit-transfer-widget/src/components/TransferWidget/transfer.ts b/app-kit-transfer-widget/src/components/TransferWidget/transfer.ts new file mode 100644 index 0000000..911ed93 --- /dev/null +++ b/app-kit-transfer-widget/src/components/TransferWidget/transfer.ts @@ -0,0 +1,295 @@ +/** + * Copyright (c) 2026, Circle Internet Group, Inc. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + AppKit, + type BridgeResult, + type BridgeStep, + type ChainDefinition, + type EstimatedGas, +} from "@circle-fin/app-kit"; +import type { ConnectedWallet } from "./wallet"; + +export type ChainId = ChainDefinition["chain"]; +export type TransferMethod = "send" | "bridge"; + +export type TransferEstimate = { + method: TransferMethod; + destinationAmount: string; + totalSourceAmount: string; + feeAmount: string; + feeToken: string; + useForwarder?: boolean; +}; + +export type TransferResult = { + method: TransferMethod; + amount: string; + state: "success" | "error"; + steps: BridgeStep[]; + useForwarder?: boolean; +}; + +let cachedKit: AppKit | null = null; +let cachedSupportedChains: ChainDefinition[] | null = null; +let hasRegisteredDebugLogging = false; + +type BridgeTransferParams = Parameters[0]; +type BridgeTransferChain = BridgeTransferParams["from"]["chain"]; +type BridgeDestination = BridgeTransferParams["to"]; +type MicroUsdc = bigint; + +const USDC_DECIMALS = 6; +const USDC_SCALE = 10n ** BigInt(USDC_DECIMALS); + +function getKit(): AppKit { + if (!cachedKit) { + cachedKit = new AppKit(); + } + + if (import.meta.env.DEV && !hasRegisteredDebugLogging) { + cachedKit.on("*", (payload) => { + console.log("[AppKit event]", payload); + }); + hasRegisteredDebugLogging = true; + } + + return cachedKit; +} + +export function getSupportedChains(): ChainDefinition[] { + if (!cachedSupportedChains) { + cachedSupportedChains = getKit() + .getSupportedChains("bridge") + .filter((chain) => chain.isTestnet); + } + + return cachedSupportedChains; +} + +export function detectTransferMethod( + sourceChain: ChainDefinition, + destinationChain: ChainDefinition, +): TransferMethod { + return sourceChain.chain === destinationChain.chain ? "send" : "bridge"; +} + +export function usesForwarder(destinationChain: ChainDefinition): boolean { + return Boolean(destinationChain.cctp?.forwarderSupported.destination); +} + +function getBridgeDestination( + wallet: ConnectedWallet, + destinationChain: ChainDefinition, + recipient: string, + useForwarder: boolean, +): BridgeDestination { + if (useForwarder) { + return { + chain: destinationChain.chain as BridgeTransferChain, + recipientAddress: recipient.trim(), + useForwarder: true, + }; + } + + return { + adapter: wallet.adapter, + chain: destinationChain.chain as BridgeTransferChain, + recipientAddress: recipient.trim(), + }; +} + +function parseUsdcAmount(value: string, allowZero = false): MicroUsdc { + const trimmedValue = value.trim(); + const match = /^(\d+)(?:\.(\d{1,6}))?$/.exec(trimmedValue); + + if (!match) { + throw new Error("Enter a valid USDC amount with up to 6 decimal places"); + } + + const [, whole, fraction = ""] = match; + const parsedAmount = + BigInt(whole) * USDC_SCALE + + BigInt(fraction.padEnd(USDC_DECIMALS, "0")); + + if (parsedAmount < 0n || (!allowZero && parsedAmount === 0n)) { + throw new Error("Enter a valid USDC amount"); + } + + return parsedAmount; +} + +function formatUsdcAmount(value: MicroUsdc): string { + const whole = value / USDC_SCALE; + const fraction = (value % USDC_SCALE) + .toString() + .padStart(USDC_DECIMALS, "0") + .replace(/0+$/, ""); + + return fraction ? `${whole.toString()}.${fraction}` : whole.toString(); +} + +function formatSmallestUnitFee(value: string, decimals: number): string { + try { + const bigintValue = BigInt(value); + const whole = bigintValue / 10n ** BigInt(decimals); + const fraction = (bigintValue % 10n ** BigInt(decimals)) + .toString() + .padStart(decimals, "0") + .replace(/0+$/, ""); + + return fraction ? `${whole.toString()}.${fraction}` : whole.toString(); + } catch { + return value; + } +} + +function getFeeDisplay(chain: ChainDefinition, estimatedGas: EstimatedGas): string { + if (chain.type === "solana") { + return formatSmallestUnitFee(estimatedGas.fee, 9); + } + + if (chain.name.includes("Arc")) { + return formatSmallestUnitFee(estimatedGas.fee, 18); + } + + return formatSmallestUnitFee(estimatedGas.fee, 18); +} + +export async function estimateTransfer( + wallet: ConnectedWallet, + sourceChain: ChainDefinition, + destinationChain: ChainDefinition, + amount: string, + recipient: string, +): Promise { + const requestedAmount = parseUsdcAmount(amount); + const normalizedAmount = formatUsdcAmount(requestedAmount); + const method = detectTransferMethod(sourceChain, destinationChain); + const kit = getKit(); + + if (method === "send") { + const estimatedGas = await kit.estimateSend({ + from: { adapter: wallet.adapter, chain: sourceChain.chain }, + to: recipient.trim(), + amount: normalizedAmount, + token: "USDC", + }); + + return { + method, + destinationAmount: normalizedAmount, + totalSourceAmount: normalizedAmount, + feeAmount: getFeeDisplay(sourceChain, estimatedGas), + feeToken: + sourceChain.type === "solana" + ? "SOL" + : sourceChain.name.includes("Arc") + ? "USDC" + : "native gas token", + useForwarder: false, + }; + } + + const useForwarder = usesForwarder(destinationChain); + const bridgeEstimate = await kit.estimateBridge({ + from: { + adapter: wallet.adapter, + chain: sourceChain.chain as BridgeTransferChain, + }, + to: getBridgeDestination(wallet, destinationChain, recipient, useForwarder), + amount: normalizedAmount, + token: "USDC", + }); + + const bridgeFee = bridgeEstimate.fees.reduce( + (sum, fee) => + sum + (fee.amount ? parseUsdcAmount(fee.amount, true) : 0n), + 0n, + ); + const feeAmount = formatUsdcAmount(bridgeFee); + const totalSourceAmount = formatUsdcAmount(requestedAmount + bridgeFee); + + return { + method, + destinationAmount: normalizedAmount, + totalSourceAmount, + feeAmount, + feeToken: "USDC", + useForwarder, + }; +} + +export async function executeTransfer( + wallet: ConnectedWallet, + sourceChain: ChainDefinition, + destinationChain: ChainDefinition, + recipient: string, + estimate: TransferEstimate, + onRetryBridge?: () => void, +): Promise { + const kit = getKit(); + + if (estimate.method === "send") { + const step = await kit.send({ + from: { adapter: wallet.adapter, chain: sourceChain.chain }, + to: recipient.trim(), + amount: estimate.destinationAmount, + token: "USDC", + }); + + return { + method: "send", + amount: estimate.destinationAmount, + state: step.state === "success" ? "success" : "error", + steps: [step], + useForwarder: false, + }; + } + + let bridgeResult: BridgeResult = await kit.bridge({ + from: { + adapter: wallet.adapter, + chain: sourceChain.chain as BridgeTransferChain, + }, + to: getBridgeDestination( + wallet, + destinationChain, + recipient, + Boolean(estimate.useForwarder), + ), + amount: estimate.destinationAmount, + token: "USDC", + }); + + if (bridgeResult.state === "error") { + onRetryBridge?.(); + bridgeResult = await kit.retryBridge(bridgeResult, { + from: wallet.adapter, + to: estimate.useForwarder ? undefined : wallet.adapter, + }); + } + + return { + method: "bridge", + amount: estimate.destinationAmount, + state: bridgeResult.state === "success" ? "success" : "error", + steps: bridgeResult.steps, + useForwarder: estimate.useForwarder, + }; +} diff --git a/app-kit-transfer-widget/src/components/TransferWidget/wallet.ts b/app-kit-transfer-widget/src/components/TransferWidget/wallet.ts new file mode 100644 index 0000000..da19f5d --- /dev/null +++ b/app-kit-transfer-widget/src/components/TransferWidget/wallet.ts @@ -0,0 +1,132 @@ +/** + * Copyright (c) 2026, Circle Internet Group, Inc. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { AdapterContext } from "@circle-fin/app-kit"; +import type { CreateSolanaAdapterFromProviderParams } from "@circle-fin/adapter-solana"; +import type { CreateViemAdapterFromProviderParams } from "@circle-fin/adapter-viem-v2"; + +export type BridgeAdapter = AdapterContext["adapter"]; +export type EvmProvider = CreateViemAdapterFromProviderParams["provider"]; +export type SolanaProvider = CreateSolanaAdapterFromProviderParams["provider"]; +export type WalletKind = "evm" | "solana"; + +export type BrowserWalletDetail = { + info: { + uuid: string; + name: string; + icon: string; + rdns: string; + }; + provider: EvmProvider; +}; + +export type ConnectedWallet = { + kind: WalletKind; + label: string; + address: string; + adapter: BridgeAdapter; +}; + +declare global { + interface WindowEventMap { + "eip6963:announceProvider": CustomEvent; + } + + interface Window { + solana?: SolanaProvider; + } +} + +export function hasSolanaWallet(): boolean { + return Boolean(window.solana); +} + +export async function discoverInjectedEvmWallets(): Promise { + const providers = new Map(); + + const onAnnounce = ((event: CustomEvent) => { + providers.set(event.detail.info.uuid, event.detail); + }) as EventListener; + + window.addEventListener("eip6963:announceProvider", onAnnounce); + window.dispatchEvent(new Event("eip6963:requestProvider")); + await new Promise((resolve) => { + window.setTimeout(resolve, 250); + }); + window.removeEventListener("eip6963:announceProvider", onAnnounce); + + return [...providers.values()]; +} + +async function connectEvmWallet(walletChoice: BrowserWalletDetail): Promise { + const { provider } = walletChoice; + + await provider.request({ + method: "eth_requestAccounts", + params: undefined, + }); + + const accounts = await provider.request({ + method: "eth_accounts", + params: undefined, + }); + const address = Array.isArray(accounts) ? String(accounts[0] ?? "") : ""; + + if (!address) { + throw new Error("Wallet connected, but no account address was returned"); + } + + const { createViemAdapterFromProvider } = await import("@circle-fin/adapter-viem-v2"); + const adapter = await createViemAdapterFromProvider({ provider }); + + return { + kind: "evm", + label: walletChoice.info.name, + address, + adapter, + }; +} + +async function connectSolanaWallet(): Promise { + const provider = window.solana; + + if (!provider) { + throw new Error("No Solana browser wallet found"); + } + + const connection = await provider.connect(); + const address = connection.publicKey?.toString() ?? provider.publicKey?.toString() ?? ""; + + if (!address) { + throw new Error("Wallet connected, but no public key was returned"); + } + + const { createSolanaAdapterFromProvider } = await import("@circle-fin/adapter-solana"); + const adapter = await createSolanaAdapterFromProvider({ provider }); + + return { + kind: "solana", + label: "Solana Wallet", + address, + adapter, + }; +} + +export async function connectBrowserWallet(walletChoice: BrowserWalletDetail | "solana"): Promise { + return walletChoice === "solana" ? connectSolanaWallet() : connectEvmWallet(walletChoice); +} diff --git a/app-kit-transfer-widget/src/index.css b/app-kit-transfer-widget/src/index.css new file mode 100644 index 0000000..9eea6d5 --- /dev/null +++ b/app-kit-transfer-widget/src/index.css @@ -0,0 +1,48 @@ +/** + * Copyright 2026 Circle Internet Group, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +:root { + font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, Adwaita Sans, Cantarell, Ubuntu, roboto, noto, helvetica, arial, sans-serif; + color: #e6eefc; + background: + radial-gradient(circle at top, #1a2740 0%, #0d1526 48%, #09101d 100%); + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +* { + box-sizing: border-box; +} + +html, +body, +#root { + min-height: 100%; +} + +button, +input, +select { + font: inherit; +} + +.widget-card { + margin-inline: auto; +} \ No newline at end of file diff --git a/app-kit-transfer-widget/src/main.tsx b/app-kit-transfer-widget/src/main.tsx new file mode 100644 index 0000000..fa50f32 --- /dev/null +++ b/app-kit-transfer-widget/src/main.tsx @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2026, Circle Internet Group, Inc. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import { Buffer } from "buffer"; +import "./index.css"; + +if (!("Buffer" in globalThis)) { + Object.assign(globalThis, { Buffer }); +} + +// App Kit currently expects Buffer to exist before its modules evaluate. +const { default: TransferWidget } = await import( + "./components/TransferWidget" +); +createRoot(document.getElementById("root")!).render( + + + , +); diff --git a/app-kit-transfer-widget/tsconfig.app.json b/app-kit-transfer-widget/tsconfig.app.json new file mode 100644 index 0000000..7f42e5f --- /dev/null +++ b/app-kit-transfer-widget/tsconfig.app.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023", "DOM"], + "module": "esnext", + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/app-kit-transfer-widget/tsconfig.json b/app-kit-transfer-widget/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/app-kit-transfer-widget/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/app-kit-transfer-widget/tsconfig.node.json b/app-kit-transfer-widget/tsconfig.node.json new file mode 100644 index 0000000..d3c52ea --- /dev/null +++ b/app-kit-transfer-widget/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023"], + "module": "esnext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/app-kit-transfer-widget/vite.config.ts b/app-kit-transfer-widget/vite.config.ts new file mode 100644 index 0000000..1e009be --- /dev/null +++ b/app-kit-transfer-widget/vite.config.ts @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2026, Circle Internet Group, Inc. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { defineConfig } from 'vite' +import react, { reactCompilerPreset } from '@vitejs/plugin-react' +import babel from '@rolldown/plugin-babel' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + react(), + babel({ presets: [reactCompilerPreset()] }) + ], +}) diff --git a/entity-secret-setup/.env.example b/entity-secret-setup/.env.example new file mode 100644 index 0000000..39eeaec --- /dev/null +++ b/entity-secret-setup/.env.example @@ -0,0 +1 @@ +CIRCLE_API_KEY= \ No newline at end of file diff --git a/entity-secret-setup/.gitignore b/entity-secret-setup/.gitignore new file mode 100644 index 0000000..103c27a --- /dev/null +++ b/entity-secret-setup/.gitignore @@ -0,0 +1,34 @@ +# dependencies +node_modules + +# output +out +dist +*.tgz + +# code coverage +coverage +*.lcov + +# logs +logs +_.log +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# caches +.eslintcache +.cache +*.tsbuildinfo + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/entity-secret-setup/README.md b/entity-secret-setup/README.md new file mode 100644 index 0000000..fea2570 --- /dev/null +++ b/entity-secret-setup/README.md @@ -0,0 +1,54 @@ +# Entity secret setup + +This example generates a new entity secret, registers it with Circle, saves the +recovery file locally, and writes `CIRCLE_ENTITY_SECRET` to `.env`. + +Use this script only for first-time setup. If `.env` already contains +`CIRCLE_ENTITY_SECRET`, the script exits without making changes. + +## What this script does + +When you run the script, it: + +1. Reads `CIRCLE_API_KEY` from `.env` or your shell environment. +2. Generates a new 32-byte entity secret. +3. Registers the entity secret with Circle. +4. Saves the recovery file to `./output/recovery-file.dat`. +5. Writes `CIRCLE_ENTITY_SECRET` to `./.env`. + +## Prerequisites + +Before you run the script: + +- Create an API key in [Circle Console](https://console.circle.com/). +- Install [Node.js 22 or later](https://nodejs.org/). +- Create a `.env` file with `CIRCLE_API_KEY=` or export it in your shell. +- Do not add `CIRCLE_ENTITY_SECRET` manually. The script writes it to `.env`. +- Make sure `.env` does not already contain `CIRCLE_ENTITY_SECRET`. + +## Install dependencies + +```bash +npm install +``` + +## Run the script + +```bash +npx tsx index.ts +``` + +## Important security notes + +- Store the entity secret securely. Do not commit it to version control. +- Store the recovery file separately from the entity secret. +- If you lose both the entity secret and the recovery file, you permanently lose + access to your developer-controlled wallets. +- This script is for first-time registration only. Do not use it for rotation + or recovery flows. + +For the full entity secret lifecycle, see: + +- [Entity secret and wallet set](../../circle-docs/wallets/dev-controlled/entity-secret-and-wallet-set.mdx) +- [How the Entity Secret Works](../../circle-docs/wallets/dev-controlled/entity-secret-management.mdx) +- [How-to: Generate and Register Your Entity Secret](../../circle-docs/wallets/dev-controlled/register-entity-secret.mdx) diff --git a/entity-secret-setup/index.ts b/entity-secret-setup/index.ts new file mode 100644 index 0000000..9e7480f --- /dev/null +++ b/entity-secret-setup/index.ts @@ -0,0 +1,75 @@ +/** + * Copyright 2026 Circle Internet Group, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import crypto from "node:crypto"; +import { mkdir, readFile, writeFile } from "node:fs/promises"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { registerEntitySecretCiphertext } from "@circle-fin/developer-controlled-wallets"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const envPath = path.join(__dirname, ".env"); +const recoveryFilePath = path.join(__dirname, "output", "recovery-file.dat"); + +async function main() { + const apiKey = process.env.CIRCLE_API_KEY; + if (!apiKey) { + throw new Error( + "CIRCLE_API_KEY is required. Add it to .env or set it as an environment variable.", + ); + } + + const existingEnv = await readFile(envPath, "utf8").catch( + (err: NodeJS.ErrnoException) => { + if (err.code === "ENOENT") return ""; + throw err; + }, + ); + + if (existingEnv.match(/^CIRCLE_ENTITY_SECRET=.*$/m)) { + throw new Error( + `CIRCLE_ENTITY_SECRET already exists in ${envPath}. Refusing to overwrite it.`, + ); + } + + console.log("Registering Entity Secret..."); + await mkdir(path.dirname(recoveryFilePath), { recursive: true }); + + const entitySecret = crypto.randomBytes(32).toString("hex"); + + await registerEntitySecretCiphertext({ + apiKey, + entitySecret, + recoveryFileDownloadPath: recoveryFilePath, + }); + + const nextEnv = existingEnv.trimEnd() + ? `${existingEnv.trimEnd()}\nCIRCLE_ENTITY_SECRET=${entitySecret}\n` + : `CIRCLE_ENTITY_SECRET=${entitySecret}\n`; + + await writeFile(envPath, nextEnv, "utf8"); + + console.log("Entity Secret registered."); + console.log(`Recovery file saved to ${recoveryFilePath}`); + console.log(`Updated ${envPath}`); +} + +main().catch((err) => { + console.error("Error:", err.message || err); + process.exit(1); +}); diff --git a/entity-secret-setup/package.json b/entity-secret-setup/package.json new file mode 100644 index 0000000..c5eebde --- /dev/null +++ b/entity-secret-setup/package.json @@ -0,0 +1,13 @@ +{ + "name": "entity-secret-setup", + "module": "index.ts", + "type": "module", + "dependencies": { + "tsx": "^4.22.3", + "@circle-fin/developer-controlled-wallets": "^10.3.1" + }, + "devDependencies": { + "@types/node": "^25.9.1", + "typescript": "^6.0.3" + } +} diff --git a/entity-secret-setup/tsconfig.json b/entity-secret-setup/tsconfig.json new file mode 100644 index 0000000..90fec2f --- /dev/null +++ b/entity-secret-setup/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "strict": true + } +} \ No newline at end of file diff --git a/scripts/check-copyright-header.sh b/scripts/check-copyright-header.sh new file mode 100755 index 0000000..114b2f1 --- /dev/null +++ b/scripts/check-copyright-header.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +export PATH=$PATH:$(go env GOPATH)/bin + +if ! command -v addlicense &> /dev/null +then + echo "installing addlicense..." + go install github.com/google/addlicense@latest +fi + +license() { + local year=$(date +'%Y') + + cat < /dev/null 2>&1 ; then + echo "$file is not with copyright header" + addlicense -f <(license '%f') "$file" + fi +done