From a5cb76bc1cc3a9e5eaf60489ea84920c67c7bb1d Mon Sep 17 00:00:00 2001
From: HJ Chen <221941357+hjchen-circle@users.noreply.github.com>
Date: Thu, 6 Aug 2026 02:44:45 +0000
Subject: [PATCH] feat: add documentation examples to repo
---
.github/workflows/scan.yml | 14 +
.licenseignore | 67 +
.pre-commit-config.yaml | 19 +
CONTRIBUTING.md | 23 +
LICENSE | 201 +
README.md | 51 +-
SECURITY.md | 4 +
app-kit-bridge-evm/.gitignore | 24 +
app-kit-bridge-evm/index.html | 61 +
app-kit-bridge-evm/package.json | 19 +
app-kit-bridge-evm/src/main.ts | 155 +
app-kit-bridge-evm/tsconfig.json | 23 +
app-kit-bridge-solana/.gitignore | 24 +
app-kit-bridge-solana/index.html | 65 +
app-kit-bridge-solana/package.json | 20 +
app-kit-bridge-solana/src/main.ts | 193 +
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 | 152 +
app-kit-send/tsconfig.json | 23 +
app-kit-transfer-widget/.gitignore | 24 +
app-kit-transfer-widget/.oxlintrc.json | 8 +
app-kit-transfer-widget/README.md | 167 +
app-kit-transfer-widget/index.html | 30 +
app-kit-transfer-widget/package-lock.json | 3260 +++++++++++++++++
app-kit-transfer-widget/package.json | 33 +
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 | 28 +
app-kit-transfer-widget/tsconfig.app.json | 26 +
app-kit-transfer-widget/tsconfig.json | 7 +
app-kit-transfer-widget/tsconfig.node.json | 23 +
app-kit-transfer-widget/vite.config.ts | 7 +
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 +
49 files changed, 6973 insertions(+), 1 deletion(-)
create mode 100644 .github/workflows/scan.yml
create mode 100644 .licenseignore
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/.oxlintrc.json
create mode 100644 app-kit-transfer-widget/README.md
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/.licenseignore b/.licenseignore
new file mode 100644
index 0000000..c08471d
--- /dev/null
+++ b/.licenseignore
@@ -0,0 +1,67 @@
+# Legal approval obtained to distribute
+# MPL-2.0 (Mozilla Public License 2.0)
+pkg:npm/lightningcss
+pkg:npm/lightningcss-android-arm64
+pkg:npm/lightningcss-darwin-arm64
+pkg:npm/lightningcss-darwin-x64
+pkg:npm/lightningcss-freebsd-x64
+pkg:npm/lightningcss-linux-arm-gnueabihf
+pkg:npm/lightningcss-linux-arm64-gnu
+pkg:npm/lightningcss-linux-arm64-musl
+pkg:npm/lightningcss-linux-x64-gnu
+pkg:npm/lightningcss-linux-x64-musl
+pkg:npm/lightningcss-win32-arm64-msvc
+pkg:npm/lightningcss-win32-x64-msvc
+
+# LGPL-3.0-only
+pkg:npm/rpc-websockets
+
+# Packages with compound licenses that are individually permissive
+# Apache-2.0 AND MIT
+pkg:npm/borsh
+
+# MIT AND Zlib
+pkg:npm/pako
+
+# BSD-2-Clause AND BSD-2-Clause-Views
+pkg:npm/uri-js
+
+# Apache-2.0 AND BSD-2-Clause AND CC0-1.0 AND ISC AND MIT
+pkg:npm/vite
+
+# Packages where the license scanner cannot detect the license.
+# Circle first-party (Apache-2.0)
+pkg:npm/@circle-fin/adapter-solana
+pkg:npm/@circle-fin/adapter-viem-v2
+pkg:npm/@circle-fin/app-kit
+pkg:npm/@circle-fin/bridge-kit
+pkg:npm/@circle-fin/developer-controlled-wallets
+pkg:npm/@circle-fin/earn-kit
+pkg:npm/@circle-fin/provider-cctp-v2
+pkg:npm/@circle-fin/provider-earn-service
+pkg:npm/@circle-fin/provider-gateway-v1
+pkg:npm/@circle-fin/provider-stablecoin-service-swap
+pkg:npm/@circle-fin/swap-kit
+pkg:npm/@circle-fin/unified-balance-kit
+
+# Third-party (undetected by scanner; permissive licenses)
+pkg:npm/@babel/core
+pkg:npm/@eslint/js
+pkg:npm/@rolldown/plugin-babel
+pkg:npm/@types/babel__core
+pkg:npm/@types/node
+pkg:npm/@types/react
+pkg:npm/@types/react-dom
+pkg:npm/@vitejs/plugin-react
+pkg:npm/babel-plugin-react-compiler
+pkg:npm/buffer
+pkg:npm/eslint
+pkg:npm/eslint-plugin-react-hooks
+pkg:npm/eslint-plugin-react-refresh
+pkg:npm/globals
+pkg:npm/react
+pkg:npm/react-dom
+pkg:npm/tsx
+pkg:npm/typescript
+pkg:npm/typescript-eslint
+pkg:npm/viem
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..0edfa12 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,51 @@
# 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`.
+
+### [`app-kit-send`](./app-kit-send)
+
+Browser app that estimates and sends USDC on 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`.
+
+### [`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..c8b3108
--- /dev/null
+++ b/app-kit-bridge-evm/index.html
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+ Bridge USDC (EVM to EVM) with App Kit
+
+
+
+
+
+ Bridge USDC
+
+
+
+
+
diff --git a/app-kit-bridge-evm/package.json b/app-kit-bridge-evm/package.json
new file mode 100644
index 0000000..b8a7b5a
--- /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": "~7.0.2",
+ "vite": "^8.2.0"
+ },
+ "dependencies": {
+ "@circle-fin/app-kit": "^1.11.0",
+ "@circle-fin/adapter-viem-v2": "^1.14.1",
+ "viem": "^2.55.11"
+ }
+}
diff --git a/app-kit-bridge-evm/src/main.ts b/app-kit-bridge-evm/src/main.ts
new file mode 100644
index 0000000..d5b2fa8
--- /dev/null
+++ b/app-kit-bridge-evm/src/main.ts
@@ -0,0 +1,155 @@
+/**
+ * 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 kit = new AppKit();
+let evmProvider: BrowserWalletProvider | null = null;
+
+/** Discover an EIP-6963 browser wallet (prefers MetaMask). */
+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;
+}
+
+/** Connect the EVM wallet and enable bridging. */
+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);
+ }
+}
+
+/** Bridge USDC from Ethereum Sepolia to Arc Testnet. */
+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;
+ }
+}
+
+/** Pretty-print a value into the output panel. */
+function render(value: unknown) {
+ output.textContent = JSON.stringify(
+ value,
+ (_key, currentValue) =>
+ typeof currentValue === "bigint" ? currentValue.toString() : currentValue,
+ 2,
+ );
+ output.scrollTop = 0;
+}
+
+const connectEvmButton = document.querySelector("#connectEvm")!;
+const bridgeButton = document.querySelector("#bridge")!;
+const walletInfo = document.querySelector("#evmWalletInfo")!;
+const output = document.querySelector("#output")!;
+
+/** Stream kit action events into the output panel. */
+kit.on("*", (payload) => {
+ output.textContent += `Action: ${JSON.stringify(
+ payload,
+ (_key, currentValue) =>
+ typeof currentValue === "bigint" ? currentValue.toString() : currentValue,
+ 2,
+ )}\n`;
+ output.scrollTop = output.scrollHeight;
+});
+
+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..48f352a
--- /dev/null
+++ b/app-kit-bridge-solana/index.html
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+ Bridge Kit (Solana to EVM)
+
+
+
+
+
+
+
Connect Solana wallet
+
+
+
+
+ Bridge USDC
+
+
+
+
+
diff --git a/app-kit-bridge-solana/package.json b/app-kit-bridge-solana/package.json
new file mode 100644
index 0000000..6007b15
--- /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": "~7.0.2",
+ "vite": "^8.2.0"
+ },
+ "dependencies": {
+ "@circle-fin/adapter-solana": "^1.6.4",
+ "@circle-fin/adapter-viem-v2": "^1.14.1",
+ "@circle-fin/app-kit": "^1.11.0",
+ "viem": "^2.55.11"
+ }
+}
diff --git a/app-kit-bridge-solana/src/main.ts b/app-kit-bridge-solana/src/main.ts
new file mode 100644
index 0000000..95e755b
--- /dev/null
+++ b/app-kit-bridge-solana/src/main.ts
@@ -0,0 +1,193 @@
+/**
+ * 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 kit = new AppKit();
+let evmProvider: BrowserWalletProvider | null = null;
+let solanaProvider: SolanaWalletProvider | null = null;
+
+/** Discover an EIP-6963 browser wallet (prefers MetaMask). */
+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;
+}
+
+/** Connect the EVM wallet and enable bridging. */
+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);
+ }
+}
+
+/** Connect the Solana wallet and enable bridging. */
+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);
+ }
+}
+
+/** Bridge USDC from Solana Devnet to Arc Testnet. */
+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;
+ }
+}
+
+/** Pretty-print a value into the output panel. */
+function render(value: unknown) {
+ output.textContent = JSON.stringify(
+ value,
+ (_key, currentValue) =>
+ typeof currentValue === "bigint" ? currentValue.toString() : currentValue,
+ 2,
+ );
+ output.scrollTop = 0;
+}
+
+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")!;
+
+/** Stream kit action events into the output panel. */
+kit.on("*", (payload) => {
+ output.textContent += `Action: ${JSON.stringify(
+ payload,
+ (_key, currentValue) =>
+ typeof currentValue === "bigint" ? currentValue.toString() : currentValue,
+ 2,
+ )}\n`;
+ output.scrollTop = output.scrollHeight;
+});
+
+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..b88fbd9
--- /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": "~7.0.2",
+ "vite": "^8.2.0"
+ },
+ "dependencies": {
+ "@circle-fin/adapter-viem-v2": "^1.14.1",
+ "@circle-fin/app-kit": "^1.11.0",
+ "viem": "^2.55.11"
+ }
+}
diff --git a/app-kit-send/src/main.ts b/app-kit-send/src/main.ts
new file mode 100644
index 0000000..9b71fcb
--- /dev/null
+++ b/app-kit-send/src/main.ts
@@ -0,0 +1,152 @@
+/**
+ * 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 kit = new AppKit();
+let walletProvider: BrowserWalletProvider | null = null;
+
+/** Discover an EIP-6963 browser wallet (prefers MetaMask). */
+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;
+}
+
+/** Connect the wallet and enable sending. */
+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);
+ }
+}
+
+/** Estimate and send 1 USDC on Arc Testnet to the recipient. */
+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;
+ }
+}
+
+/** Pretty-print a value into the output panel. */
+function render(value: unknown) {
+ output.textContent = JSON.stringify(
+ value,
+ (_key, currentValue) =>
+ typeof currentValue === "bigint" ? currentValue.toString() : currentValue,
+ 2,
+ );
+ output.scrollTop = 0;
+}
+
+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")!;
+
+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/.oxlintrc.json b/app-kit-transfer-widget/.oxlintrc.json
new file mode 100644
index 0000000..6fa991d
--- /dev/null
+++ b/app-kit-transfer-widget/.oxlintrc.json
@@ -0,0 +1,8 @@
+{
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
+ "plugins": ["react", "typescript", "oxc"],
+ "rules": {
+ "react/rules-of-hooks": "error",
+ "react/only-export-components": ["warn", { "allowConstantExport": true }]
+ }
+}
diff --git a/app-kit-transfer-widget/README.md b/app-kit-transfer-widget/README.md
new file mode 100644
index 0000000..33bbccf
--- /dev/null
+++ b/app-kit-transfer-widget/README.md
@@ -0,0 +1,167 @@
+# 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 # App entry 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.
+
+## 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 install the runtime
+dependencies below.
+
+The copied widget expects these runtime dependencies:
+
+- `@circle-fin/app-kit`
+- `@circle-fin/adapter-viem-v2`
+- `@circle-fin/adapter-solana`
+- `@solana/web3.js`
+- `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/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..8cc10a1
--- /dev/null
+++ b/app-kit-transfer-widget/package-lock.json
@@ -0,0 +1,3260 @@
+{
+ "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.6.4",
+ "@circle-fin/adapter-viem-v2": "^1.14.1",
+ "@circle-fin/app-kit": "^1.11.0",
+ "@solana/web3.js": "^1.98.4",
+ "react": "^19.2.8",
+ "react-dom": "^19.2.8",
+ "viem": "^2.55.11"
+ },
+ "devDependencies": {
+ "@types/node": "^24.13.3",
+ "@types/react": "^19.2.17",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^6.0.4",
+ "oxlint": "^1.75.0",
+ "typescript": "~5.9.0",
+ "vite": "^8.2.0"
+ }
+ },
+ "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/runtime": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz",
+ "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@circle-fin/adapter-solana": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/@circle-fin/adapter-solana/-/adapter-solana-1.6.4.tgz",
+ "integrity": "sha512-AIZTWNXvA4Kg6CRbmMQFnSwaoKENZZFWbI6jZgYX5Rmldj4OWpVbcwLHonXHHXEhUXrPGBR99Vj8yBrVPj+7sw==",
+ "dependencies": {
+ "@coral-xyz/anchor": "^0.31.1",
+ "@ethersproject/abi": "^5.8.0",
+ "@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",
+ "bn.js": "^5.2.3",
+ "bs58": "6.0.0",
+ "buffer": "^6.0.3",
+ "pino": "10.1.0",
+ "zod": "3.25.67"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "@solana/web3.js": "^1.98.2"
+ }
+ },
+ "node_modules/@circle-fin/adapter-viem-v2": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@circle-fin/adapter-viem-v2/-/adapter-viem-v2-1.14.1.tgz",
+ "integrity": "sha512-C6MGBO0EP1zlu14B3QD7+ko3Jg0eUTKo0mG3uAJAXE6BXXqRwRgWVNdiwIi0Sr16duOabq5QMmql3T/yNoT99A==",
+ "dependencies": {
+ "@ethersproject/abi": "^5.8.0",
+ "@ethersproject/address": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/units": "^5.8.0",
+ "@noble/hashes": "^1.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": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "viem": "^2.30.0"
+ }
+ },
+ "node_modules/@circle-fin/app-kit": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@circle-fin/app-kit/-/app-kit-1.11.0.tgz",
+ "integrity": "sha512-geO5oAoC41E7fz/xjys4ibfIMwlEBHYm2lFDFA4taFojUy9fGmJePBZVxA+7dAF15VNY6rcLSA33spOj3CixjA==",
+ "dependencies": {
+ "@circle-fin/bridge-kit": "1.12.2",
+ "@circle-fin/earn-kit": "1.4.0",
+ "@circle-fin/provider-gateway-v1": "1.1.4",
+ "@circle-fin/swap-kit": "1.5.0",
+ "@circle-fin/unified-balance-kit": "1.3.1",
+ "@coral-xyz/anchor": "^0.31.1",
+ "@ethersproject/abi": "^5.8.0",
+ "@ethersproject/address": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/keccak256": "^5.8.0",
+ "@ethersproject/units": "^5.8.0",
+ "@noble/curves": "1.4.2",
+ "@solana/web3.js": "^1.98.4",
+ "abitype": "^1.1.0",
+ "bn.js": "^5.2.3",
+ "bs58": "6.0.0",
+ "buffer": "^6.0.3",
+ "pino": "10.1.0",
+ "zod": "3.25.67"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@circle-fin/bridge-kit": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@circle-fin/bridge-kit/-/bridge-kit-1.12.2.tgz",
+ "integrity": "sha512-E2WO7NMOLkyk+GSasnIlarzcY8+6McE8ijbmvdEC+V0+CLczHH7sSbu9Yst626VzVhdWcQCMNf2AstrQDFF6tQ==",
+ "dependencies": {
+ "@circle-fin/provider-cctp-v2": "^1.10.1",
+ "@ethersproject/abi": "^5.8.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",
+ "pino": "10.1.0",
+ "zod": "3.25.67"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@circle-fin/earn-kit": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@circle-fin/earn-kit/-/earn-kit-1.4.0.tgz",
+ "integrity": "sha512-A6Ht86ZgJTON5/x9cKuJNa6j0VH3Q4YqNIuEznWPYfJiYUmuk+Xg35iFkl8+BG1W29eDixrWaxe2PC2XrDA/sQ==",
+ "dependencies": {
+ "@circle-fin/provider-earn-service": "^1.3.1",
+ "@ethersproject/abi": "^5.8.0",
+ "@ethersproject/address": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/keccak256": "^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": ">=20.0.0"
+ }
+ },
+ "node_modules/@circle-fin/provider-cctp-v2": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/@circle-fin/provider-cctp-v2/-/provider-cctp-v2-1.10.1.tgz",
+ "integrity": "sha512-nyOXiZCh2inCDTPOi6QTItc6ADChP7Y1juo8pfRY4pLdzUmlGOG+2BOERTmctBNocKFxvpkZRTYL/XY+ApvnuQ==",
+ "dependencies": {
+ "@coral-xyz/anchor": "^0.31.1",
+ "@ethersproject/abi": "^5.8.0",
+ "@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",
+ "pino": "10.1.0",
+ "zod": "3.25.67"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "@solana/web3.js": "^1.98.2"
+ },
+ "peerDependenciesMeta": {
+ "@solana/web3.js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@circle-fin/provider-earn-service": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@circle-fin/provider-earn-service/-/provider-earn-service-1.3.1.tgz",
+ "integrity": "sha512-CDu6uwnBGQ68y7312czRUO3NHTJbq3MsqmvtjfDocWkElJpGA2tpIk1VJtbZ5thmkHf/5CzrtbX2AyPHB+Ah/g==",
+ "dependencies": {
+ "@ethersproject/abi": "^5.8.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",
+ "pino": "10.1.0",
+ "viem": "^2.30.0",
+ "zod": "3.25.67"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@circle-fin/provider-gateway-v1": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@circle-fin/provider-gateway-v1/-/provider-gateway-v1-1.1.4.tgz",
+ "integrity": "sha512-/z/9GGRbbKLHNaKPwFyWQS9HUM7dthox/Qeshx/f/eFs25aSox4YVrCdla50F2ccm/sx/bri68azLNvHp13LZA==",
+ "dependencies": {
+ "@coral-xyz/anchor": "^0.31.1",
+ "@ethersproject/abi": "^5.8.0",
+ "@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",
+ "bn.js": "^5.2.3",
+ "bs58": "6.0.0",
+ "buffer": "^6.0.3",
+ "zod": "3.25.67"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@circle-fin/provider-stablecoin-service-swap": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@circle-fin/provider-stablecoin-service-swap/-/provider-stablecoin-service-swap-1.4.0.tgz",
+ "integrity": "sha512-IQUjeFBpyG3v2msLbIXKMFH8Ecdkv448gFDtogk/pm06L4MDuWKQPxNFoUZt+a8o8ogTQ1KkueUrvXj/gmG3Kw==",
+ "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",
+ "bn.js": "^5.2.3",
+ "bs58": "^6.0.0",
+ "zod": "3.25.67"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@circle-fin/swap-kit": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@circle-fin/swap-kit/-/swap-kit-1.5.0.tgz",
+ "integrity": "sha512-0qlHZgOmGfkowH88cp/8M9K4NQUBW3elgUofncaz86I1na9zkJfYTo/ROwH759e4PNcfmF7NuR+3lVTRrI+Faw==",
+ "dependencies": {
+ "@circle-fin/provider-stablecoin-service-swap": "^1.4.0",
+ "@coral-xyz/anchor": "^0.31.1",
+ "@ethersproject/abi": "^5.8.0",
+ "@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",
+ "bn.js": "^5.2.3",
+ "bs58": "6.0.0",
+ "zod": "3.25.67"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@circle-fin/unified-balance-kit": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@circle-fin/unified-balance-kit/-/unified-balance-kit-1.3.1.tgz",
+ "integrity": "sha512-zlXS0ayGY+M1rWUhUA2yz24HBDNQaka3rJWGe826XPIZ+X9MExyycB4NntfNGso2bOQq54KmZ9LwRW+eZUP8rA==",
+ "dependencies": {
+ "@circle-fin/provider-gateway-v1": "1.1.4",
+ "@coral-xyz/anchor": "^0.31.1",
+ "@ethersproject/abi": "^5.8.0",
+ "@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",
+ "bn.js": "^5.2.3",
+ "bs58": "6.0.0",
+ "zod": "3.25.67"
+ },
+ "engines": {
+ "node": ">=20.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/@ethersproject/abi": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.8.0.tgz",
+ "integrity": "sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==",
+ "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/address": "^5.8.0",
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/constants": "^5.8.0",
+ "@ethersproject/hash": "^5.8.0",
+ "@ethersproject/keccak256": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/strings": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/abstract-provider": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz",
+ "integrity": "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==",
+ "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/logger": "^5.8.0",
+ "@ethersproject/networks": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/transactions": "^5.8.0",
+ "@ethersproject/web": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/abstract-signer": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz",
+ "integrity": "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==",
+ "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/abstract-provider": "^5.8.0",
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0"
+ }
+ },
+ "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/base64": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz",
+ "integrity": "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==",
+ "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"
+ }
+ },
+ "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/hash": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz",
+ "integrity": "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==",
+ "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/abstract-signer": "^5.8.0",
+ "@ethersproject/address": "^5.8.0",
+ "@ethersproject/base64": "^5.8.0",
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/keccak256": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/strings": "^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/networks": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz",
+ "integrity": "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==",
+ "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/properties": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz",
+ "integrity": "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==",
+ "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/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/signing-key": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz",
+ "integrity": "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==",
+ "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",
+ "@ethersproject/properties": "^5.8.0",
+ "bn.js": "^5.2.1",
+ "elliptic": "6.6.1",
+ "hash.js": "1.1.7"
+ }
+ },
+ "node_modules/@ethersproject/strings": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz",
+ "integrity": "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==",
+ "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/constants": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/transactions": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz",
+ "integrity": "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==",
+ "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/address": "^5.8.0",
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/constants": "^5.8.0",
+ "@ethersproject/keccak256": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/rlp": "^5.8.0",
+ "@ethersproject/signing-key": "^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/@ethersproject/web": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz",
+ "integrity": "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==",
+ "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/base64": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/strings": "^5.8.0"
+ }
+ },
+ "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.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz",
+ "integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
+ "node_modules/@oxlint/binding-android-arm-eabi": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.77.0.tgz",
+ "integrity": "sha512-E06sKWS6PiI6HRxS1wyQg22HvApt01hI7fV+T3wUk3OSbaaP4a3hYGY/MIQDmASqCiRjBdpRQYkgMkqH82cWmQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-android-arm64": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.77.0.tgz",
+ "integrity": "sha512-NvsKz0KZxTp9cYWPLf+FXaSZwB3oO3peAjtukpOMBgse2vhQSoIIVqeO1yR0lEo/UcdZIDL18uq+kL0LzQ0ytA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-darwin-arm64": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.77.0.tgz",
+ "integrity": "sha512-bgjTn6nW4bQCFBvSvuHCpDD+sONvmpo4lGI4PxzMt1quBA+xYxhczk6RiCn3GZ9gY8uhaBbwhj9MdKGfu6T9DA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-darwin-x64": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.77.0.tgz",
+ "integrity": "sha512-aotaIttH1R6j1Rwhx0M0htgeZyGtVQqYNTVEYMN/UcgHPquGA6kmk9OyuDc3a2GKUQBC+3C3GVQCcrRPMYqAFA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-freebsd-x64": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.77.0.tgz",
+ "integrity": "sha512-nNx/wta7ksRAdYvq+l4AWjXkLxEXHALhENxjj2cYbQAIR4ybaA5L+hCbE63HOmft5czQ6ks+hb8vmEAnn7YGPg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-arm-gnueabihf": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.77.0.tgz",
+ "integrity": "sha512-tMLLjM7xXtzXisVCzkOTXNCy9bZVId2wteNwjohlFDR/jY6WagpEDA1c1wu4xRc20Hojaxj+V6DSR7gbKxijWA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-arm-musleabihf": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.77.0.tgz",
+ "integrity": "sha512-MiAFDFaqR0tmHTAyo0YDcZ5hyLREdYw/RQhc2R3cbT+8O3tB+zqPM2th9TTQ+Uo3jn/embS+DO+HyX9ztCPkOQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-arm64-gnu": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.77.0.tgz",
+ "integrity": "sha512-/xqQ3B16i1T4cyt/9Mn+4CpzhUXoBXp7kVpIwzOXNFLj5JmK1bIjsbSnX296Gg8A/o7oDtKWikFgBx0SLwztkw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-arm64-musl": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.77.0.tgz",
+ "integrity": "sha512-LSbwuRKiNCenPDcbARqAZ5RfBy7gmj7vOvfJRLeCDU3gFtSxWbhv/+VTlaUqzUhNj1gFLHB8h7ALnxa/Az6z6g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-ppc64-gnu": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.77.0.tgz",
+ "integrity": "sha512-QWdcH31mXEUe5Nq1s0CfCpceaKjIo9uZtwDjAuL681g1axf+5x8xrg/eXWaw//4NCxYZ4V4e5Hu5tvdR+pTBlg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-riscv64-gnu": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.77.0.tgz",
+ "integrity": "sha512-GnOfYgJxbcElOiPZaDFDl406ONddwvOWk2jvAAAEjwAl4GofNoHF+/HHUIBYa6bFCArlcGPi0XjC4cU1pkgF/Q==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-riscv64-musl": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.77.0.tgz",
+ "integrity": "sha512-AyEMTUCf0xY+hHF+IxqXFQIX0yQOIR8ykpY0lJNOw9xYqOzUX8dyZfRvlG0RfXwuQn2eonf/8NrMmDSZJjdqsA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-s390x-gnu": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.77.0.tgz",
+ "integrity": "sha512-sPLzEcNvxd/oyVQ5oZo92CiHkFkpBeRop13E/P3TPY+hZfXHKCOWKI70TE2RYwMKFJDc20EMjH16L7NZICtKTw==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-x64-gnu": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.77.0.tgz",
+ "integrity": "sha512-1Oh2ssH2L7lwyvkdSqaMUfsGfwU2Wfvew+obBUYjRVqhpBcUpwnsPSEr1IzVi9XqkuY10geiLsNKecqaZC34Dw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-x64-musl": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.77.0.tgz",
+ "integrity": "sha512-0j/2wRgNGO+Qj/M1uu/p57h/hFTTWWcfie0ufkbabeus2s5+/QqkCflnMOwLLN5m2GsNeWp4xdl4cPa4n7QCOQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-openharmony-arm64": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.77.0.tgz",
+ "integrity": "sha512-BJ/j54qS0usEnyDkLYURMj2iiD9h5Cyy+ppzeMSXBGRXaGRNWnj1Mw14NqWMR5E/PzdgB30OOCCzLzbRoduafw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-win32-arm64-msvc": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.77.0.tgz",
+ "integrity": "sha512-Yh8w+g2Lpx7StrvtYkoz9JJvXjB9wxgFChFNb85nrXm/wj/XTwGWS1hve9+900HL7llrntYB3YP+y32E3tRqzA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-win32-ia32-msvc": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.77.0.tgz",
+ "integrity": "sha512-zja5b7+6a7UsRFgAQSrnax5vrzliEyNPLCjfXONu/vTWswaIVZGFajJZptaeRvPE4LghtFdAzVFlexTm7MVTGA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-win32-x64-msvc": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.77.0.tgz",
+ "integrity": "sha512-+teyvPDZ2RjUvo+SuCqS/UhaJl1QtdW5fWT5NJTV61V5MIuIS90Db9LixmtEGvXixyttiK62P96MSu3UlpviBw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "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.2.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz",
+ "integrity": "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==",
+ "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.2.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz",
+ "integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==",
+ "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.2.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz",
+ "integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==",
+ "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.2.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz",
+ "integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==",
+ "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.2.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz",
+ "integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==",
+ "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.2.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz",
+ "integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==",
+ "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.2.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz",
+ "integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==",
+ "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.2.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz",
+ "integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==",
+ "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.2.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz",
+ "integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==",
+ "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.2.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz",
+ "integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==",
+ "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.2.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz",
+ "integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==",
+ "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.2.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz",
+ "integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz",
+ "integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==",
+ "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.2.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz",
+ "integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "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.23",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz",
+ "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.8.0"
+ }
+ },
+ "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/node": {
+ "version": "24.13.3",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz",
+ "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.18.0"
+ }
+ },
+ "node_modules/@types/react": {
+ "version": "19.2.18",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz",
+ "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.2.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz",
+ "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==",
+ "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/@vitejs/plugin-react": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz",
+ "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rolldown/pluginutils": "^1.0.1"
+ },
+ "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.3.0",
+ "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.3.0.tgz",
+ "integrity": "sha512-fk6Te+bojIFrMvMZrnOO+SxCB+RUksTGOzq/60ZRvs1L+BVzvi2bqt9L3W/17ZLdZsyM1FuYf65P5nlmoiH1Bg==",
+ "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/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/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/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/bn.js": {
+ "version": "5.2.5",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.5.tgz",
+ "integrity": "sha512-Vq886eXykuP5E6HcKSSStP3bJgrE6In5WKxVUvJ8XGpWWYs2xZHWqUwzCtGgEtBcxyd57KBFDPFoUfNzdaHCNg==",
+ "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/brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
+ "license": "MIT"
+ },
+ "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/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/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/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/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/elliptic": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz",
+ "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==",
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/elliptic/node_modules/bn.js": {
+ "version": "4.12.5",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz",
+ "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==",
+ "license": "MIT"
+ },
+ "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/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-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/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/hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "node_modules/hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+ "license": "MIT",
+ "dependencies": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.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/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "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/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/lightningcss": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz",
+ "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==",
+ "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.33.0",
+ "lightningcss-darwin-arm64": "1.33.0",
+ "lightningcss-darwin-x64": "1.33.0",
+ "lightningcss-freebsd-x64": "1.33.0",
+ "lightningcss-linux-arm-gnueabihf": "1.33.0",
+ "lightningcss-linux-arm64-gnu": "1.33.0",
+ "lightningcss-linux-arm64-musl": "1.33.0",
+ "lightningcss-linux-x64-gnu": "1.33.0",
+ "lightningcss-linux-x64-musl": "1.33.0",
+ "lightningcss-win32-arm64-msvc": "1.33.0",
+ "lightningcss-win32-x64-msvc": "1.33.0"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz",
+ "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==",
+ "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.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz",
+ "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==",
+ "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.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz",
+ "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==",
+ "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.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz",
+ "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==",
+ "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.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz",
+ "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==",
+ "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.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz",
+ "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==",
+ "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.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz",
+ "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==",
+ "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.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz",
+ "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==",
+ "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.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz",
+ "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==",
+ "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.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz",
+ "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==",
+ "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.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz",
+ "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==",
+ "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/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "license": "ISC"
+ },
+ "node_modules/minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
+ "license": "MIT"
+ },
+ "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.17",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz",
+ "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==",
+ "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/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/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/ox": {
+ "version": "0.14.33",
+ "resolved": "https://registry.npmjs.org/ox/-/ox-0.14.33.tgz",
+ "integrity": "sha512-rooA/4o7bBof4Ge2VH/eovfNPb/AEEYyrNj03wggc55g5HZD8Pjs/OeWhttgjic3dDcqn0r29bDuvQEdTiUemQ==",
+ "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/oxlint": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.77.0.tgz",
+ "integrity": "sha512-qnGh8XJHaQ0dprrDXNQZgS0FgjI6v+V3+X8DwmaV++5Aamy6jGKfDdQ1TUvhUxtmKFAbEf4/WeO5QZX+5WSngg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "oxlint": "bin/oxlint"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ },
+ "optionalDependencies": {
+ "@oxlint/binding-android-arm-eabi": "1.77.0",
+ "@oxlint/binding-android-arm64": "1.77.0",
+ "@oxlint/binding-darwin-arm64": "1.77.0",
+ "@oxlint/binding-darwin-x64": "1.77.0",
+ "@oxlint/binding-freebsd-x64": "1.77.0",
+ "@oxlint/binding-linux-arm-gnueabihf": "1.77.0",
+ "@oxlint/binding-linux-arm-musleabihf": "1.77.0",
+ "@oxlint/binding-linux-arm64-gnu": "1.77.0",
+ "@oxlint/binding-linux-arm64-musl": "1.77.0",
+ "@oxlint/binding-linux-ppc64-gnu": "1.77.0",
+ "@oxlint/binding-linux-riscv64-gnu": "1.77.0",
+ "@oxlint/binding-linux-riscv64-musl": "1.77.0",
+ "@oxlint/binding-linux-s390x-gnu": "1.77.0",
+ "@oxlint/binding-linux-x64-gnu": "1.77.0",
+ "@oxlint/binding-linux-x64-musl": "1.77.0",
+ "@oxlint/binding-openharmony-arm64": "1.77.0",
+ "@oxlint/binding-win32-arm64-msvc": "1.77.0",
+ "@oxlint/binding-win32-ia32-msvc": "1.77.0",
+ "@oxlint/binding-win32-x64-msvc": "1.77.0"
+ },
+ "peerDependencies": {
+ "oxlint-tsgolint": ">=7.0.2001",
+ "vite-plus": "*"
+ },
+ "peerDependenciesMeta": {
+ "oxlint-tsgolint": {
+ "optional": true
+ },
+ "vite-plus": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/pako": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-2.2.0.tgz",
+ "integrity": "sha512-zJq6RP/5q+TO2OpFV3FHzlPnFjmkb7Nc99a5SNjJE+uu/PkpChs+NIZSSzbBoD+6kjiISXjfYdwj1ZRQ81dz/w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodeca"
+ }
+ ],
+ "license": "(MIT AND Zlib)"
+ },
+ "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.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "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.25",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz",
+ "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==",
+ "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.16",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/process-warning": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.1.0.tgz",
+ "integrity": "sha512-jQSaVHsPgtyw60e1rQ/A+/ArPEj/S8pS/vFnyGa/gYFXrKk/6RuDkoqVDQ5NI5MmS01698ltlAk0NoDBNLujRw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT"
+ },
+ "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.8",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz",
+ "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.2.8",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz",
+ "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.27.0"
+ },
+ "peerDependencies": {
+ "react": "^19.2.8"
+ }
+ },
+ "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.2.3",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz",
+ "integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@oxc-project/types": "=0.143.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.2.3",
+ "@rolldown/binding-darwin-arm64": "1.2.3",
+ "@rolldown/binding-darwin-x64": "1.2.3",
+ "@rolldown/binding-freebsd-x64": "1.2.3",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.2.3",
+ "@rolldown/binding-linux-arm64-gnu": "1.2.3",
+ "@rolldown/binding-linux-arm64-musl": "1.2.3",
+ "@rolldown/binding-linux-ppc64-gnu": "1.2.3",
+ "@rolldown/binding-linux-s390x-gnu": "1.2.3",
+ "@rolldown/binding-linux-x64-gnu": "1.2.3",
+ "@rolldown/binding-linux-x64-musl": "1.2.3",
+ "@rolldown/binding-openharmony-arm64": "1.2.3",
+ "@rolldown/binding-win32-arm64-msvc": "1.2.3",
+ "@rolldown/binding-win32-x64-msvc": "1.2.3"
+ }
+ },
+ "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.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz",
+ "integrity": "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==",
+ "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.2",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.2.tgz",
+ "integrity": "sha512-54dMVAo4WIe6SKy3vBgN+9bJZqqQ8IMRevAkOLQALhi49qkkQDQfWdAZ8KQlXiEabw88ARXXdUrlvtbKQX+aKw==",
+ "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/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.2.0",
+ "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.2.0.tgz",
+ "integrity": "sha512-zLBvqpwr4Esa0kRjcrzGU6zL25lePWaCLMx0RQFrmteozIfeNdaMLpG5U7PeHzvlFkAWaRKA9/KVW4F60iB+qw==",
+ "license": "MIT",
+ "dependencies": {
+ "real-require": "^0.2.0"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
+ "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/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/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
+ "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
+ "license": "MIT"
+ },
+ "node_modules/uuid": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz",
+ "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/esm/bin/uuid"
+ }
+ },
+ "node_modules/viem": {
+ "version": "2.55.11",
+ "resolved": "https://registry.npmjs.org/viem/-/viem-2.55.11.tgz",
+ "integrity": "sha512-RR5MwtdUnFfqw6ZGoFptizywyLOkLuhTL7UafoP3Irf2upXpANakQkLgGqY4H7A7+8JBxjUs6lElGF5zuGjMEw==",
+ "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.33",
+ "ws": "8.21.0"
+ },
+ "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.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/vite": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz",
+ "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lightningcss": "^1.33.0",
+ "picomatch": "^4.0.5",
+ "postcss": "^8.5.23",
+ "rolldown": "~1.2.0",
+ "tinyglobby": "^0.2.17"
+ },
+ "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.4.0",
+ "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/ws": {
+ "version": "7.5.13",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.13.tgz",
+ "integrity": "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==",
+ "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/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"
+ }
+ }
+ }
+}
diff --git a/app-kit-transfer-widget/package.json b/app-kit-transfer-widget/package.json
new file mode 100644
index 0000000..6f253d8
--- /dev/null
+++ b/app-kit-transfer-widget/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "transfer-widget",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc -b && vite build",
+ "lint": "oxlint",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@circle-fin/adapter-solana": "^1.6.4",
+ "@circle-fin/adapter-viem-v2": "^1.14.1",
+ "@circle-fin/app-kit": "^1.11.0",
+ "@solana/web3.js": "^1.98.4",
+ "react": "^19.2.8",
+ "react-dom": "^19.2.8",
+ "viem": "^2.55.11"
+ },
+ "devDependencies": {
+ "@types/node": "^24.13.3",
+ "@types/react": "^19.2.17",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^6.0.4",
+ "oxlint": "^1.75.0",
+ "typescript": "~5.9.0",
+ "vite": "^8.2.0"
+ },
+ "overrides": {
+ "uuid": "^11.1.1"
+ }
+}
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`jqI(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
+
void openWalletChooser()}
+ >
+ Connect Wallet
+
+
+ );
+ }
+
+ function renderWalletChooser() {
+ return (
+
+
Arc Transfer
+
Select a wallet
+
+ {evmWallets.length > 0 ? (
+ evmWallets.map((evmWallet) => (
+
void handleConnectWallet(evmWallet)}
+ disabled={busyAction === "wallet"}
+ >
+
+ {evmWallet.info.name.slice(0, 1).toUpperCase()}
+
+ {evmWallet.info.name}
+
+ ))
+ ) : (
+
No EVM wallet detected.
+ )}
+
+ {hasSolanaWallet() ? (
+
void handleConnectWallet("solana")}
+ disabled={busyAction === "wallet"}
+ >
+ S
+ Solana Wallet
+
+ ) : (
+
No Solana wallet detected.
+ )}
+
+
+ );
+ }
+
+ function renderReviewScreen() {
+ if (!sourceChain || !destinationChain || !review) {
+ return null;
+ }
+
+ const sourceMeta = getChainMeta(sourceChain.name);
+ const destinationMeta = getChainMeta(destinationChain.name);
+
+ return (
+
+
setScreen("form")}
+ >
+ Back
+
+
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),
+ )}
+
+
+
+
void handleSubmitTransfer()}
+ disabled={busyAction === "submit"}
+ >
+ {busyAction === "submit" ? "Submitting..." : "Confirm & Sign"}
+
+
+ );
+ }
+
+ 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}`}
+
+
+
clearTransferState("form")}
+ >
+ New Transfer
+
+
+ );
+ }
+
+ function renderTransferForm() {
+ return (
+
+
+
Arc Transfer
+ {wallet ? (
+
+ {shortAddress(wallet.address)}
+
+ ×
+
+
+ ) : null}
+
+
+
+
+ From
+ {
+ setBalance(null);
+ setBalanceUnavailable(false);
+ setForm((currentForm) => ({
+ ...currentForm,
+ fromChain: nextFromChain,
+ }));
+ }}
+ />
+
+
{
+ setBalance(null);
+ setBalanceUnavailable(false);
+ setForm((currentForm) => ({
+ ...currentForm,
+ fromChain: currentForm.toChain,
+ toChain: currentForm.fromChain,
+ }));
+ }}
+ disabled={!canSwapRoute}
+ >
+ ↔
+
+
+
+ To
+ {
+ setForm((currentForm) => ({
+ ...currentForm,
+ toChain: nextToChain,
+ }));
+ }}
+ />
+
+
+
+
+ Recipient Address
+
+ {
+ setForm((currentForm) => ({
+ ...currentForm,
+ recipient: event.target.value,
+ }));
+ }}
+ className="text-input"
+ placeholder={
+ destinationChain?.type === "solana"
+ ? "Destination Solana address"
+ : "0x..."
+ }
+ />
+ {
+ if (!wallet || !canUseConnectedAddress) {
+ return;
+ }
+
+ setForm((currentForm) => ({
+ ...currentForm,
+ recipient: wallet.address,
+ }));
+ }}
+ disabled={!canUseConnectedAddress}
+ >
+ Use Mine
+
+
+
+
+
+ Amount (USDC)
+ {
+ setForm((currentForm) => ({
+ ...currentForm,
+ amount: event.target.value,
+ }));
+ }}
+ className="text-input amount-input"
+ inputMode="decimal"
+ />
+
+ {balance ? (
+
+ {balanceUnavailable
+ ? "Balance unavailable"
+ : `Balance: ${balance} USDC`}
+
+ ) : null}
+
+
+ {selectedMethodLabel ? (
+
Method: {selectedMethodLabel}
+ ) : null}
+
+
void handleReviewTransfer()}
+ disabled={busyAction === "review"}
+ >
+ {busyAction === "review" ? "Estimating..." : "Review Transfer"}
+
+
+ );
+ }
+
+ 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 (
+
+
setIsOpen((current) => !current)}
+ aria-haspopup="listbox"
+ aria-expanded={isOpen}
+ >
+ {selectedMeta ? (
+ <>
+
+ {selectedMeta.displayName}
+ >
+ ) : (
+ Select chain
+ )}
+
+ {isOpen ? "▲" : "▼"}
+
+
+
+ {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 (
+
{
+ onChange(chain.chain);
+ setIsOpen(false);
+ setSearch("");
+ }}
+ role="option"
+ aria-selected={isSelected}
+ >
+
+ {meta.displayName}
+ {isSelected ? ✓ : null}
+
+ );
+ })}
+
+
+ ) : 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..77a8932
--- /dev/null
+++ b/app-kit-transfer-widget/src/main.tsx
@@ -0,0 +1,28 @@
+/**
+ * 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 TransferWidget from "./components/TransferWidget";
+import "./index.css";
+
+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..6830b6f
--- /dev/null
+++ b/app-kit-transfer-widget/tsconfig.app.json
@@ -0,0 +1,26 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+ "target": "es2023",
+ "lib": ["ES2023", "DOM"],
+ "module": "esnext",
+ "types": ["vite/client"],
+ "allowArbitraryExtensions": true,
+ "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..8455dcb
--- /dev/null
+++ b/app-kit-transfer-widget/tsconfig.node.json
@@ -0,0 +1,23 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+ "target": "es2023",
+ "lib": ["ES2023"],
+ "types": ["node"],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "module": "nodenext",
+ "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..8b0f57b
--- /dev/null
+++ b/app-kit-transfer-widget/vite.config.ts
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+
+// https://vite.dev/config/
+export default defineConfig({
+ plugins: [react()],
+})
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