diff --git a/README.md b/README.md index 0edfa12..db2c7da 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,32 @@ adapter. Connects to any EIP-6963 browser wallet (e.g., MetaMask). Run with `npm install && npm run dev`. +### [`app-kit-swap`](./app-kit-swap) + +Browser app that estimates and swaps USDC for EURC 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`. + +### [`app-kit-transfer-widget`](./app-kit-transfer-widget) + +React app that embeds a USDC transfer widget with +[App Kit](https://www.npmjs.com/package/@circle-fin/app-kit). Supports same-chain +`send()` and crosschain `bridge()` flows for EVM and Solana browser wallets, +including estimate, review, and retry. + +Run with `npm install && npm run dev`. + +### [`app-kit-unified-balance`](./app-kit-unified-balance) + +Browser app that deposits USDC into a unified balance from Base Sepolia and +Solana Devnet, reads the balance, and spends it on Arc Testnet using +[App Kit](https://www.npmjs.com/package/@circle-fin/app-kit) with the viem and +Solana adapters. Connects an EVM wallet and a Solana wallet. + +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, diff --git a/app-kit-bridge-evm/README.md b/app-kit-bridge-evm/README.md new file mode 100644 index 0000000..f56cb2a --- /dev/null +++ b/app-kit-bridge-evm/README.md @@ -0,0 +1,45 @@ +# Bridge USDC between EVM chains + +Use [`@circle-fin/app-kit`](https://www.npmjs.com/package/@circle-fin/app-kit) +to bridge USDC from Ethereum Sepolia to Arc Testnet with a browser wallet and +the viem adapter. + +This Vite + TypeScript page connects an EIP-6963 wallet (for example MetaMask), +creates a Circle adapter from the provider, then calls `bridge()` and +`retryBridge()` when needed. + +## Prerequisites + +- [Node.js 22 or later](https://nodejs.org/) +- An EIP-6963 browser wallet such as MetaMask +- Testnet USDC on Ethereum Sepolia +- Native gas token on Ethereum Sepolia for the wallet transaction + +This project does not require environment variables or API keys. + +## Install and run + +```bash +npm install +npm run dev +``` + +Open the local Vite URL in a browser with your wallet installed. + +```bash +npm run build +``` + +## What this example does + +1. Discovers an EIP-6963 browser wallet and requests account access. +2. Creates a viem adapter with `createViemAdapterFromProvider()`. +3. Bridges 1 USDC from `Ethereum_Sepolia` to `Arc_Testnet` with `kit.bridge()`. +4. Retries with `kit.retryBridge()` if the result state is `"error"`. +5. Streams App Kit action events into the on-page output panel. + +## Key file + +- `src/main.ts` — wallet connect, adapter creation, bridge, and retry. + Change `from` / `to` `chain` and `amount` in the bridge call for different + chains or amounts. diff --git a/app-kit-bridge-evm/package.json b/app-kit-bridge-evm/package.json index b8a7b5a..c068cbe 100644 --- a/app-kit-bridge-evm/package.json +++ b/app-kit-bridge-evm/package.json @@ -9,11 +9,11 @@ }, "devDependencies": { "typescript": "~7.0.2", - "vite": "^8.2.0" + "vite": "^8.2.1" }, "dependencies": { - "@circle-fin/app-kit": "^1.11.0", - "@circle-fin/adapter-viem-v2": "^1.14.1", - "viem": "^2.55.11" + "@circle-fin/app-kit": "^1.12.0", + "@circle-fin/adapter-viem-v2": "^1.15.1", + "viem": "^2.55.17" } } diff --git a/app-kit-bridge-solana/README.md b/app-kit-bridge-solana/README.md new file mode 100644 index 0000000..0961d11 --- /dev/null +++ b/app-kit-bridge-solana/README.md @@ -0,0 +1,47 @@ +# Bridge USDC from Solana to EVM + +Use [`@circle-fin/app-kit`](https://www.npmjs.com/package/@circle-fin/app-kit) +to bridge USDC from Solana Devnet to Arc Testnet with Solana and EVM browser +wallets. + +This Vite + TypeScript page connects a Solana wallet for the source and an +EIP-6963 EVM wallet for the destination, creates Circle adapters for both, then +calls `bridge()` and `retryBridge()` when needed. + +## Prerequisites + +- [Node.js 22 or later](https://nodejs.org/) +- An EIP-6963 EVM browser wallet such as MetaMask +- A Solana browser wallet on `window.solana` such as Phantom +- Testnet USDC on Solana Devnet +- Native gas tokens for both wallets + +This project does not require environment variables or API keys. + +## Install and run + +```bash +npm install +npm run dev +``` + +Open the local Vite URL in a browser with both wallets installed. + +```bash +npm run build +``` + +## What this example does + +1. Connects an EIP-6963 EVM wallet for the Arc Testnet destination. +2. Connects a Solana browser wallet for the Solana Devnet source. +3. Creates viem and Solana adapters from the connected providers. +4. Bridges 1 USDC from `Solana_Devnet` to `Arc_Testnet` with `kit.bridge()`. +5. Retries with `kit.retryBridge()` if the result state is `"error"`. +6. Streams App Kit action events into the on-page output panel. + +## Key file + +- `src/main.ts` — wallet connect, adapter creation, bridge, and retry. + Change `from` / `to` `chain` and `amount` in the bridge call for different + chains or amounts. diff --git a/app-kit-bridge-solana/package.json b/app-kit-bridge-solana/package.json index 6007b15..617ae3c 100644 --- a/app-kit-bridge-solana/package.json +++ b/app-kit-bridge-solana/package.json @@ -9,12 +9,12 @@ }, "devDependencies": { "typescript": "~7.0.2", - "vite": "^8.2.0" + "vite": "^8.2.1" }, "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" + "@circle-fin/adapter-solana": "^1.6.5", + "@circle-fin/adapter-viem-v2": "^1.15.1", + "@circle-fin/app-kit": "^1.12.0", + "viem": "^2.55.17" } } diff --git a/app-kit-send/README.md b/app-kit-send/README.md new file mode 100644 index 0000000..32fb879 --- /dev/null +++ b/app-kit-send/README.md @@ -0,0 +1,44 @@ +# Send USDC on an EVM chain + +Use [`@circle-fin/app-kit`](https://www.npmjs.com/package/@circle-fin/app-kit) +to estimate and send USDC on Arc Testnet with a browser wallet and the viem +adapter. + +This Vite + TypeScript page connects an EIP-6963 wallet (for example MetaMask), +creates a Circle adapter from the provider, then calls `estimateSend()` and +`send()`. + +## Prerequisites + +- [Node.js 22 or later](https://nodejs.org/) +- An EIP-6963 browser wallet such as MetaMask +- Testnet USDC on Arc Testnet +- Native gas token on Arc Testnet for the wallet transaction + +This project does not require environment variables or API keys. + +## Install and run + +```bash +npm install +npm run dev +``` + +Open the local Vite URL in a browser with your wallet installed. + +```bash +npm run build +``` + +## What this example does + +1. Discovers an EIP-6963 browser wallet and requests account access. +2. Creates a viem adapter with `createViemAdapterFromProvider()`. +3. Estimates the transfer with `kit.estimateSend()`. +4. Sends 1 USDC on `Arc_Testnet` to the entered recipient with `kit.send()`. + +## Key file + +- `src/main.ts` — wallet connect, adapter creation, estimate, and send. + Change `chain`, `amount`, and `token` in the send params for a different + chain, amount, or token. diff --git a/app-kit-send/package.json b/app-kit-send/package.json index b88fbd9..41226b4 100644 --- a/app-kit-send/package.json +++ b/app-kit-send/package.json @@ -9,11 +9,11 @@ }, "devDependencies": { "typescript": "~7.0.2", - "vite": "^8.2.0" + "vite": "^8.2.1" }, "dependencies": { - "@circle-fin/adapter-viem-v2": "^1.14.1", - "@circle-fin/app-kit": "^1.11.0", - "viem": "^2.55.11" + "@circle-fin/adapter-viem-v2": "^1.15.1", + "@circle-fin/app-kit": "^1.12.0", + "viem": "^2.55.17" } } diff --git a/app-kit-swap/.gitignore b/app-kit-swap/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/app-kit-swap/.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-swap/README.md b/app-kit-swap/README.md new file mode 100644 index 0000000..b183378 --- /dev/null +++ b/app-kit-swap/README.md @@ -0,0 +1,68 @@ +# Swap USDC on Arc Testnet + +Use [`@circle-fin/app-kit`](https://www.npmjs.com/package/@circle-fin/app-kit) +to estimate and swap USDC for EURC on Arc Testnet with a browser wallet and the +viem adapter. + +This Vite + TypeScript page connects an EIP-6963 wallet (for example MetaMask), +creates a Circle adapter from the provider, then calls `estimateSwap()` and +`swap()`. + +## Prerequisites + +- [Node.js 22 or later](https://nodejs.org/) +- An EIP-6963 browser wallet such as MetaMask +- Testnet USDC on Arc Testnet +- Native gas token on Arc Testnet for the wallet transaction + +This project does not require environment variables or API keys. + +## Install and run + +```bash +npm install +npm run dev +``` + +Open the local Vite URL in a browser with your wallet installed. + +```bash +npm run build +``` + +## What this example does + +1. Discovers an EIP-6963 browser wallet and requests account access. +2. Creates a viem adapter with `createViemAdapterFromProvider()`. +3. Estimates the swap with `kit.estimateSwap()`. +4. Swaps 1 USDC for EURC on `Arc_Testnet` with `kit.swap()`. + +## Thin liquidity on Arc Testnet + +Arc Testnet swap pools are often thin or imbalanced. Quotes and swaps can fail +even when your code and wallet setup are correct. This is an environment +limitation on testnet, not a bug in your integration. + +Common errors: + +- **No route available** — the swap router could not find a quote for that pair + or amount (liquidity path missing or temporarily unavailable). +- **On-chain simulation failed** — a quote existed, but the pool could not meet + the minimum output under the configured slippage. + +If you hit either error: + +1. Retry with a smaller `amountIn` (for example `0.1` or `1` USDC). +2. Prefer `EURC → USDC` when probing for available depth — Arc Testnet pools + are often USDC-heavy, so that direction usually has less price impact. +3. Optionally raise `config.slippageBps` above the default `300` (3%) for + testnet experiments. +4. Retry later — testnet liquidity and routing availability change over time. + +Use mainnet liquidity expectations only after you move off Arc Testnet. + +## Key file + +- `src/main.ts` — wallet connect, adapter creation, estimate, and swap. + Change `chain`, `tokenIn` / `tokenOut`, and `amountIn` in the swap params + for a different chain, pair, or amount. diff --git a/app-kit-swap/index.html b/app-kit-swap/index.html new file mode 100644 index 0000000..5248ace --- /dev/null +++ b/app-kit-swap/index.html @@ -0,0 +1,60 @@ + + + + + + + + Swap USDC on Arc Testnet + + + +
+
+ +

+
+
+
+ +

+    
+ + + diff --git a/app-kit-swap/package.json b/app-kit-swap/package.json new file mode 100644 index 0000000..3742342 --- /dev/null +++ b/app-kit-swap/package.json @@ -0,0 +1,19 @@ +{ + "name": "app-kit-swap", + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "typescript": "~7.0.2", + "vite": "^8.2.1" + }, + "dependencies": { + "@circle-fin/adapter-viem-v2": "^1.15.1", + "@circle-fin/app-kit": "^1.12.0", + "viem": "^2.55.17" + } +} diff --git a/app-kit-swap/src/main.ts b/app-kit-swap/src/main.ts new file mode 100644 index 0000000..82f12df --- /dev/null +++ b/app-kit-swap/src/main.ts @@ -0,0 +1,143 @@ +/** + * 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 { SwapParams } 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 swapping. */ +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"; + swapButton.disabled = !walletProvider; + } catch (error) { + render({ error: error instanceof Error ? error.message : "Unknown error" }); + } finally { + connectWalletButton.disabled = Boolean(walletProvider); + } +} + +/** Estimate and swap 1 USDC for EURC on Arc Testnet. */ +async function handleSwap() { + try { + if (!walletProvider) { + throw new Error("Connect a wallet first"); + } + + swapButton.disabled = true; + + const adapter = await createViemAdapterFromProvider({ + provider: walletProvider, + }); + + const swapParams: SwapParams = { + from: { adapter, chain: "Arc_Testnet" }, + tokenIn: "USDC", + tokenOut: "EURC", + amountIn: "1.00", + }; + + const estimate = await kit.estimateSwap(swapParams); + const result = await kit.swap(swapParams); + + render({ estimate, result }); + } catch (error) { + render({ error: error instanceof Error ? error.message : "Unknown error" }); + } finally { + swapButton.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 swapButton = document.querySelector("#swap")!; +const walletInfo = document.querySelector("#walletInfo")!; +const output = document.querySelector("#output")!; + +connectWalletButton.addEventListener("click", handleWalletConnect); +swapButton.addEventListener("click", handleSwap); diff --git a/app-kit-swap/tsconfig.json b/app-kit-swap/tsconfig.json new file mode 100644 index 0000000..1ab38c8 --- /dev/null +++ b/app-kit-swap/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/package-lock.json b/app-kit-transfer-widget/package-lock.json index 8cc10a1..67ef3ac 100644 --- a/app-kit-transfer-widget/package-lock.json +++ b/app-kit-transfer-widget/package-lock.json @@ -8,22 +8,22 @@ "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", + "@circle-fin/adapter-solana": "^1.6.5", + "@circle-fin/adapter-viem-v2": "^1.15.1", + "@circle-fin/app-kit": "^1.12.0", "@solana/web3.js": "^1.98.4", "react": "^19.2.8", "react-dom": "^19.2.8", - "viem": "^2.55.11" + "viem": "^2.55.17" }, "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" + "@types/node": "^26.2.0", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@vitejs/plugin-react": "^6.0.5", + "oxlint": "^1.78.0", + "typescript": "~7.0.2", + "vite": "^8.2.1" } }, "node_modules/@adraffy/ens-normalize": { @@ -42,9 +42,9 @@ } }, "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==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@circle-fin/adapter-solana/-/adapter-solana-1.6.5.tgz", + "integrity": "sha512-30kLPSuq0/tPA3hpNS1p3zqirDYk3VVSJtjT4DQiSf9qlN4Ps1r6fuLlBD6KmLvRVAPb+7EODLBmcaMyEed8Rw==", "dependencies": { "@coral-xyz/anchor": "^0.31.1", "@ethersproject/abi": "^5.8.0", @@ -68,9 +68,9 @@ } }, "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==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@circle-fin/adapter-viem-v2/-/adapter-viem-v2-1.15.1.tgz", + "integrity": "sha512-VzkfPjbqvfA++djJ2adTLievnIKEZVx10h3wbG+9HIJPWgF4hFIhx+MMjBkdRVzcWSga9uAGyLWFvvsMzVwNwQ==", "dependencies": { "@ethersproject/abi": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -91,15 +91,15 @@ } }, "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", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@circle-fin/app-kit/-/app-kit-1.12.0.tgz", + "integrity": "sha512-RmkG4ehc16XjiAMEQ6VEllNkhU2L6IVN8h7KKGJpkdXzwnRzytPNNJ6XJkMGIYu4xa88IzWGubwCYtD//7bjOA==", + "dependencies": { + "@circle-fin/bridge-kit": "1.13.0", + "@circle-fin/earn-kit": "1.5.0", + "@circle-fin/provider-gateway-v1": "1.2.0", + "@circle-fin/swap-kit": "1.5.1", + "@circle-fin/unified-balance-kit": "1.4.0", "@coral-xyz/anchor": "^0.31.1", "@ethersproject/abi": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -120,11 +120,11 @@ } }, "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==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@circle-fin/bridge-kit/-/bridge-kit-1.13.0.tgz", + "integrity": "sha512-nq98R26ZCPUE/yagWIvzs1ghCSprwScs+wosyNM0VSmQqd+atLQ37f1z7vD6O9Dt75RYzUzATXGChzlnEhhArw==", "dependencies": { - "@circle-fin/provider-cctp-v2": "^1.10.1", + "@circle-fin/provider-cctp-v2": "^1.10.2", "@ethersproject/abi": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/bytes": "^5.8.0", @@ -140,11 +140,11 @@ } }, "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==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@circle-fin/earn-kit/-/earn-kit-1.5.0.tgz", + "integrity": "sha512-Scoj9MOa1DgTE8Kby6r/GnedQD4+2rI1LrxYlmsgjZxoe30MtL0SX3bMRt2ksgHBMRJnXscyykIEQAxJWaTKvQ==", "dependencies": { - "@circle-fin/provider-earn-service": "^1.3.1", + "@circle-fin/provider-earn-service": "^1.4.0", "@ethersproject/abi": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/bytes": "^5.8.0", @@ -161,9 +161,9 @@ } }, "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==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@circle-fin/provider-cctp-v2/-/provider-cctp-v2-1.10.2.tgz", + "integrity": "sha512-oxTptKweZP6q7AYIOxvD7VF0CINR4k+/Gf0OvhoQ6Seyc3QIdUgtGZy9fN8SlIvgwEsXI+MzvNezjpdFE/MM4w==", "dependencies": { "@coral-xyz/anchor": "^0.31.1", "@ethersproject/abi": "^5.8.0", @@ -191,9 +191,9 @@ } }, "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==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@circle-fin/provider-earn-service/-/provider-earn-service-1.4.0.tgz", + "integrity": "sha512-Pykd5wnd7UVI66z4A5Fi//dWv0zxfBZId8pxYDcBTSyOYYvO6JQgPQ08Q0qWHyhc8oygD38VrDJBYrr+zoF1LQ==", "dependencies": { "@ethersproject/abi": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -211,9 +211,9 @@ } }, "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==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@circle-fin/provider-gateway-v1/-/provider-gateway-v1-1.2.0.tgz", + "integrity": "sha512-uIV69AcO62uXCpvvFlQBS+xTbbyQO3tZh4X9H1bz0NMH5+4lTlQVuMdOUzAI0ZFOl7YeTgYuKOsYCxqKxsVm0w==", "dependencies": { "@coral-xyz/anchor": "^0.31.1", "@ethersproject/abi": "^5.8.0", @@ -233,9 +233,9 @@ } }, "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==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@circle-fin/provider-stablecoin-service-swap/-/provider-stablecoin-service-swap-1.4.1.tgz", + "integrity": "sha512-qDCvniDm6QWKPHsOnz7k1qxOX1WhWvK/JdpSZZvH7ogE4oReqtU7xGKdD17xgD2AFcOmedIBBbn9SEbXhuw42g==", "dependencies": { "@coral-xyz/anchor": "^0.31.1", "@ethersproject/address": "^5.8.0", @@ -253,11 +253,11 @@ } }, "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==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@circle-fin/swap-kit/-/swap-kit-1.5.1.tgz", + "integrity": "sha512-Tsk5bboQ50wPU655NnpymYbO9PIbXcleDWrIbsLrX/NmN7sp5LyX5ZcAEKzLNJ5XBvuJSFhLnGpbqbL69KzmeQ==", "dependencies": { - "@circle-fin/provider-stablecoin-service-swap": "^1.4.0", + "@circle-fin/provider-stablecoin-service-swap": "^1.4.1", "@coral-xyz/anchor": "^0.31.1", "@ethersproject/abi": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -275,11 +275,11 @@ } }, "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==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@circle-fin/unified-balance-kit/-/unified-balance-kit-1.4.0.tgz", + "integrity": "sha512-hg2yQ+/P3LL1Y4AwA7qlZISj4tII1W21AAUW+NhPWjGUAhKVCOP4UKZeL5+hwqdIsiarGQ5RBLSKMP8fKQ8LVQ==", "dependencies": { - "@circle-fin/provider-gateway-v1": "1.1.4", + "@circle-fin/provider-gateway-v1": "1.2.0", "@coral-xyz/anchor": "^0.31.1", "@ethersproject/abi": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -835,9 +835,9 @@ } }, "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.78.0.tgz", + "integrity": "sha512-Bu819lmAfZMUHErrpe0cEWj3iaefuUODHSU8+UbXy67V/r7/7f4K3FL0NmbD85E+wiFLDYuhP8Zlv0XnVeXshw==", "cpu": [ "arm" ], @@ -852,9 +852,9 @@ } }, "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.78.0.tgz", + "integrity": "sha512-CDfxZgB61B7buRdY2FJoAYYPPXCZ1EoC1LKscnC5dg3kjobdxiconvAvvN1BmHyW4PyFT3jRLDag/BY/roSNBQ==", "cpu": [ "arm64" ], @@ -869,9 +869,9 @@ } }, "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.78.0.tgz", + "integrity": "sha512-2Y2U9Ahrz+OO0Ej88f9SJYq51/jUBp1Mc7iZu0ukrbeeZ3gpRGfzIFnoqfHDY96xr0GEfNrPUBFEy0nN5aD7HA==", "cpu": [ "arm64" ], @@ -886,9 +886,9 @@ } }, "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.78.0.tgz", + "integrity": "sha512-rpych6eJq6m9jDRypTEaPD1xysaEW5h9+xuxhGK/QhOg+/xaqPZrCrTNoIl/f3nEjuJeCEmstNDlrE9rJi/3/g==", "cpu": [ "x64" ], @@ -903,9 +903,9 @@ } }, "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.78.0.tgz", + "integrity": "sha512-IcMGrQT3QizkOESUJd5et+rOhVqSkNDfNik1cvrKDqIbzqx9KMtRswpFgkCuNTSwylCFLKhGUu8KmqY1ZnC0Dg==", "cpu": [ "x64" ], @@ -920,9 +920,9 @@ } }, "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.78.0.tgz", + "integrity": "sha512-/uLdoJ0IXE6vo/0f0LKjinQAp+re+VMaCWaNT8ENIv2EOCkSsc8SGaflXAuW0Jua2dq5+GLVWm1NQK7P3UFSNQ==", "cpu": [ "arm" ], @@ -937,9 +937,9 @@ } }, "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.78.0.tgz", + "integrity": "sha512-7xi4Wb/O8NRJhLoUXmDJMUVpNYvB5kefdhFU1Jb8rtae4QoXlTiLwI14X4YvAXVZLNZChP8m5qO9SQAlWQTbkQ==", "cpu": [ "arm" ], @@ -954,9 +954,9 @@ } }, "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.78.0.tgz", + "integrity": "sha512-4hFW0+fVXa3OIh1Y4A5SPkmvI4wuuBSrCVKzOyE7PTjhc7yEqZ1pmvEEeS5Lj/MaqvegFxXyF33N+6jkehxdyg==", "cpu": [ "arm64" ], @@ -974,9 +974,9 @@ } }, "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.78.0.tgz", + "integrity": "sha512-oC0mvsgBJjlMijSDEhx9KuvR9zYeHXceA9MjbuXB1F8NSR78Yj2unOBrstEvTVaq+pko+kuue6DajC00eqvTdg==", "cpu": [ "arm64" ], @@ -994,9 +994,9 @@ } }, "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.78.0.tgz", + "integrity": "sha512-XAllT5SUZS+ohjuZ3/5S0cwe0r7eboiuigeStCZ5DXRYx/2KVM2UvQXvAfyzXEimtQjAB7cDQ2YxDe2Zl2WNQQ==", "cpu": [ "ppc64" ], @@ -1014,9 +1014,9 @@ } }, "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.78.0.tgz", + "integrity": "sha512-trucMER/0QtecoXvc1y/UVqE3kwJipDwrx4oHfj+nNm3dq2zjP44WT0CfHNDPM3G1DXIkx/gY6lAD21NSCZVhA==", "cpu": [ "riscv64" ], @@ -1034,9 +1034,9 @@ } }, "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.78.0.tgz", + "integrity": "sha512-cm3O4F/HQbdzOUX5mKHqG5KDL6E5w0pnlZ+fbBy2rmLryPOowkuLagFHTopQsEIpjcaZoPOrL+BmmAytAG9HFg==", "cpu": [ "riscv64" ], @@ -1054,9 +1054,9 @@ } }, "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.78.0.tgz", + "integrity": "sha512-33wRf6HqGNsybJ3qX4cGaQN2ODPxNmc1rMa0mrTmx3eFq1VzOnvQooi9bIGVYakW8a/wmqVx1mgsUm8R2xfTiw==", "cpu": [ "s390x" ], @@ -1074,9 +1074,9 @@ } }, "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.78.0.tgz", + "integrity": "sha512-rRdISSYegj6VganMZ9tjRjijowfHJ09IZU01i0toBAqr6n5LEtwHq2IeS4FjW2RoskOHlb6efB26H5izYb3GEQ==", "cpu": [ "x64" ], @@ -1094,9 +1094,9 @@ } }, "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.78.0.tgz", + "integrity": "sha512-GmsP4rW0xTL6u5CVdcDsaN5Fbc7hBc382Wmar1kttbnwSEviM+rSINKOMQ+UQ6iH+AGwC+8gaAiwu134Tgh6Lg==", "cpu": [ "x64" ], @@ -1114,9 +1114,9 @@ } }, "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.78.0.tgz", + "integrity": "sha512-sy9yeYuADc8a+n4TLBayzMCZiHPW78DcIFVpOXTmdKHWQeM9xe5uzkqIIZmi326D5hY9XVwacipEB1p7tQjPAg==", "cpu": [ "arm64" ], @@ -1131,9 +1131,9 @@ } }, "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.78.0.tgz", + "integrity": "sha512-rjc2hF1KfMi8fZj1X/m3AmnHbdsF3rL0v6KQg0Uc880Yb2khjz+3U14sfdZ7jWTpRnN1m1NQa/TT7uU9lJWPrA==", "cpu": [ "arm64" ], @@ -1148,9 +1148,9 @@ } }, "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.78.0.tgz", + "integrity": "sha512-zcuXFVrEFHIafRfkCQT8w/Xe41o07ozl/vwHq7p94vB29xVzsB0sZGYORU1jhcYKv3Lr0J3HbJ2T4fHH5rWmvA==", "cpu": [ "ia32" ], @@ -1165,9 +1165,9 @@ } }, "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.78.0.tgz", + "integrity": "sha512-Sb5ocmLSuYeOuXd+CFOToGKp/gjXUEWDnvIGwhnh8aq8wY4TMmEnKnvbogSW7RdMZv77JSARduS7/gv+khYEjA==", "cpu": [ "x64" ], @@ -1632,12 +1632,12 @@ } }, "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==", + "version": "26.2.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.2.0.tgz", + "integrity": "sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==", "license": "MIT", "dependencies": { - "undici-types": "~7.18.0" + "undici-types": "~8.3.0" } }, "node_modules/@types/react": { @@ -1675,6 +1675,326 @@ "@types/node": "*" } }, + "node_modules/@typescript/typescript-aix-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", + "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz", + "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz", + "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz", + "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz", + "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz", + "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz", + "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-loong64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz", + "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==", + "cpu": [ + "loong64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-mips64el": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz", + "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==", + "cpu": [ + "mips64el" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz", + "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-riscv64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz", + "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-s390x": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz", + "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz", + "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz", + "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz", + "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz", + "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz", + "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-sunos-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz", + "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz", + "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz", + "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, "node_modules/@vitejs/plugin-react": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", @@ -2448,9 +2768,9 @@ "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==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "dev": true, "funding": [ { @@ -2559,9 +2879,9 @@ "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==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.78.0.tgz", + "integrity": "sha512-QgQePuxIqKOzo1KSjG2EnITEeWvWnKAm77eq8nrMtf6AGoA+zyGc4PFYtDNJSD25g/ibOwfQ851hZ4/SPkMVoA==", "dev": true, "license": "MIT", "bin": { @@ -2574,25 +2894,25 @@ "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" + "@oxlint/binding-android-arm-eabi": "1.78.0", + "@oxlint/binding-android-arm64": "1.78.0", + "@oxlint/binding-darwin-arm64": "1.78.0", + "@oxlint/binding-darwin-x64": "1.78.0", + "@oxlint/binding-freebsd-x64": "1.78.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.78.0", + "@oxlint/binding-linux-arm-musleabihf": "1.78.0", + "@oxlint/binding-linux-arm64-gnu": "1.78.0", + "@oxlint/binding-linux-arm64-musl": "1.78.0", + "@oxlint/binding-linux-ppc64-gnu": "1.78.0", + "@oxlint/binding-linux-riscv64-gnu": "1.78.0", + "@oxlint/binding-linux-riscv64-musl": "1.78.0", + "@oxlint/binding-linux-s390x-gnu": "1.78.0", + "@oxlint/binding-linux-x64-gnu": "1.78.0", + "@oxlint/binding-linux-x64-musl": "1.78.0", + "@oxlint/binding-openharmony-arm64": "1.78.0", + "@oxlint/binding-win32-arm64-msvc": "1.78.0", + "@oxlint/binding-win32-ia32-msvc": "1.78.0", + "@oxlint/binding-win32-x64-msvc": "1.78.0" }, "peerDependencies": { "oxlint-tsgolint": ">=7.0.2001", @@ -3014,22 +3334,43 @@ "license": "0BSD" }, "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", + "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", "license": "Apache-2.0", "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "tsc": "bin/tsc" }, "engines": { - "node": ">=14.17" + "node": ">=16.20.0" + }, + "optionalDependencies": { + "@typescript/typescript-aix-ppc64": "7.0.2", + "@typescript/typescript-darwin-arm64": "7.0.2", + "@typescript/typescript-darwin-x64": "7.0.2", + "@typescript/typescript-freebsd-arm64": "7.0.2", + "@typescript/typescript-freebsd-x64": "7.0.2", + "@typescript/typescript-linux-arm": "7.0.2", + "@typescript/typescript-linux-arm64": "7.0.2", + "@typescript/typescript-linux-loong64": "7.0.2", + "@typescript/typescript-linux-mips64el": "7.0.2", + "@typescript/typescript-linux-ppc64": "7.0.2", + "@typescript/typescript-linux-riscv64": "7.0.2", + "@typescript/typescript-linux-s390x": "7.0.2", + "@typescript/typescript-linux-x64": "7.0.2", + "@typescript/typescript-netbsd-arm64": "7.0.2", + "@typescript/typescript-netbsd-x64": "7.0.2", + "@typescript/typescript-openbsd-arm64": "7.0.2", + "@typescript/typescript-openbsd-x64": "7.0.2", + "@typescript/typescript-sunos-x64": "7.0.2", + "@typescript/typescript-win32-arm64": "7.0.2", + "@typescript/typescript-win32-x64": "7.0.2" } }, "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==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", "license": "MIT" }, "node_modules/uuid": { @@ -3046,9 +3387,9 @@ } }, "node_modules/viem": { - "version": "2.55.11", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.55.11.tgz", - "integrity": "sha512-RR5MwtdUnFfqw6ZGoFptizywyLOkLuhTL7UafoP3Irf2upXpANakQkLgGqY4H7A7+8JBxjUs6lElGF5zuGjMEw==", + "version": "2.55.17", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.55.17.tgz", + "integrity": "sha512-XKASpfG9jznxsU/J7Bj2k9aS0UZgU3sBcwVoQ6slD5T1RmNJHh3khmFVJuRKjrOe3uqHb0FJKbb6jwE49WtVDQ==", "funding": [ { "type": "github", @@ -3133,16 +3474,16 @@ } }, "node_modules/vite": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", - "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", + "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", - "postcss": "^8.5.23", - "rolldown": "~1.2.0", + "postcss": "^8.5.25", + "rolldown": "~1.2.1", "tinyglobby": "^0.2.17" }, "bin": { diff --git a/app-kit-transfer-widget/package.json b/app-kit-transfer-widget/package.json index 6f253d8..5f19a25 100644 --- a/app-kit-transfer-widget/package.json +++ b/app-kit-transfer-widget/package.json @@ -1,7 +1,6 @@ { "name": "transfer-widget", - "private": true, - "version": "0.0.0", + "version": "0.1.0", "type": "module", "scripts": { "dev": "vite", @@ -10,22 +9,22 @@ "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", + "@circle-fin/adapter-solana": "^1.6.5", + "@circle-fin/adapter-viem-v2": "^1.15.1", + "@circle-fin/app-kit": "^1.12.0", "@solana/web3.js": "^1.98.4", "react": "^19.2.8", "react-dom": "^19.2.8", - "viem": "^2.55.11" + "viem": "^2.55.17" }, "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" + "@types/node": "^26.2.0", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@vitejs/plugin-react": "^6.0.5", + "oxlint": "^1.78.0", + "typescript": "~7.0.2", + "vite": "^8.2.1" }, "overrides": { "uuid": "^11.1.1" diff --git a/app-kit-unified-balance/.gitignore b/app-kit-unified-balance/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/app-kit-unified-balance/.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-unified-balance/README.md b/app-kit-unified-balance/README.md new file mode 100644 index 0000000..656fabc --- /dev/null +++ b/app-kit-unified-balance/README.md @@ -0,0 +1,50 @@ +# Deposit and spend a unified USDC balance + +Use [`@circle-fin/app-kit`](https://www.npmjs.com/package/@circle-fin/app-kit) +to deposit USDC into a unified balance across chains, read that balance, and +spend it to a recipient on Arc Testnet. + +This Vite + TypeScript page connects EVM and Solana browser wallets, creates +Circle adapters with the chains this demo uses, then calls +`unifiedBalance.deposit()`, `unifiedBalance.getBalances()`, and +`unifiedBalance.spend()`. + +## Prerequisites + +- [Node.js 22 or later](https://nodejs.org/) +- An EIP-6963 EVM browser wallet such as MetaMask +- A Solana browser wallet on `window.solana` such as Phantom +- Testnet USDC on Base Sepolia and Solana Devnet +- Native gas tokens for both wallets + +This project does not require environment variables or API keys. + +## Install and run + +```bash +npm install +npm run dev +``` + +Open the local Vite URL in a browser with both wallets installed. + +```bash +npm run build +``` + +## What this example does + +1. Connects an EVM wallet and builds a viem adapter for Base Sepolia and Arc + Testnet. +2. Connects a Solana wallet and builds a Solana adapter for Solana Devnet. +3. Deposits 2 USDC from Base Sepolia with `kit.unifiedBalance.deposit()`. +4. Deposits 1 USDC from Solana Devnet with `kit.unifiedBalance.deposit()`. +5. Reads the unified balance with `kit.unifiedBalance.getBalances()`. +6. Spends 2.50 USDC to a recipient on Arc Testnet with + `kit.unifiedBalance.spend()`. + +## Key file + +- `src/main.ts` — wallet connect, adapters, deposit, balance, and spend. + Change `chain`, `amount`, and `token` on the deposit and spend calls (and + `supportedChains` on the adapters) for different chains or amounts. diff --git a/app-kit-unified-balance/index.html b/app-kit-unified-balance/index.html new file mode 100644 index 0000000..22740bd --- /dev/null +++ b/app-kit-unified-balance/index.html @@ -0,0 +1,77 @@ + + + + + + + + App Kit Unified Balance + + + +
+
+ +

+
+
+ +

+
+
+
+ + + +
+ + + +
+
+

+    
+  
+
diff --git a/app-kit-unified-balance/package.json b/app-kit-unified-balance/package.json
new file mode 100644
index 0000000..442dcf0
--- /dev/null
+++ b/app-kit-unified-balance/package.json
@@ -0,0 +1,20 @@
+{
+  "name": "app-kit-unified-balance",
+  "version": "0.1.0",
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "build": "tsc && vite build",
+    "preview": "vite preview"
+  },
+  "devDependencies": {
+    "typescript": "~7.0.2",
+    "vite": "^8.2.1"
+  },
+  "dependencies": {
+    "@circle-fin/adapter-solana": "^1.6.5",
+    "@circle-fin/adapter-viem-v2": "^1.15.1",
+    "@circle-fin/app-kit": "^1.12.0",
+    "viem": "^2.55.17"
+  }
+}
diff --git a/app-kit-unified-balance/src/main.ts b/app-kit-unified-balance/src/main.ts
new file mode 100644
index 0000000..e8ee0ae
--- /dev/null
+++ b/app-kit-unified-balance/src/main.ts
@@ -0,0 +1,300 @@
+/**
+ * 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 { ArcTestnet, BaseSepolia, SolanaDevnet } from "@circle-fin/app-kit/chains";
+import { createSolanaAdapterFromProvider } from "@circle-fin/adapter-solana";
+import type {
+  CreateSolanaAdapterFromProviderParams,
+  SolanaAdapter,
+} from "@circle-fin/adapter-solana";
+import { createViemAdapterFromProvider } from "@circle-fin/adapter-viem-v2";
+import type {
+  CreateViemAdapterFromProviderParams,
+  ViemAdapter,
+} from "@circle-fin/adapter-viem-v2";
+
+type EvmWalletProvider = CreateViemAdapterFromProviderParams["provider"];
+type SolanaWalletProvider = CreateSolanaAdapterFromProviderParams["provider"];
+
+type EIP6963ProviderDetail = {
+  info: {
+    uuid: string;
+    name: string;
+    icon: string;
+    rdns: string;
+  };
+  provider: EvmWalletProvider;
+};
+
+declare global {
+  interface Window {
+    solana?: SolanaWalletProvider;
+  }
+
+  interface WindowEventMap {
+    "eip6963:announceProvider": CustomEvent;
+  }
+}
+
+const kit = new AppKit();
+let evmAdapter: ViemAdapter | null = null;
+let solanaAdapter: SolanaAdapter | null = null;
+
+/** Discover an EIP-6963 browser wallet (prefers MetaMask). */
+async function getEvmProvider(): 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 build an adapter for Base Sepolia + Arc Testnet. */
+async function handleEvmConnect() {
+  try {
+    connectEvmButton.disabled = true;
+
+    const provider = await getEvmProvider();
+    await provider.request({
+      method: "eth_requestAccounts",
+      params: undefined,
+    });
+    const accounts = (await provider.request({
+      method: "eth_accounts",
+      params: undefined,
+    })) as string[];
+
+    // Create the adapter once at connect time with the chains this demo uses
+    evmAdapter = await createViemAdapterFromProvider({
+      provider,
+      capabilities: {
+        supportedChains: [BaseSepolia, ArcTestnet],
+      },
+    });
+    evmWalletInfo.textContent = accounts[0] ?? "Connected";
+  } catch (error) {
+    evmAdapter = null;
+    render({ error: error instanceof Error ? error.message : "Unknown error" });
+  } finally {
+    connectEvmButton.disabled = Boolean(evmAdapter);
+    updateActionButtons();
+  }
+}
+
+/** Connect the Solana wallet and build an adapter for Solana Devnet. */
+async function handleSolanaConnect() {
+  try {
+    connectSolanaButton.disabled = true;
+
+    const provider = window.solana;
+    if (!provider) {
+      throw new Error("No Solana browser wallet found");
+    }
+
+    const connection = await provider.connect();
+    const connectedAddress =
+      connection.publicKey?.toString() ?? provider.publicKey?.toString() ?? null;
+
+    // Create the adapter once at connect time for Solana Devnet
+    solanaAdapter = await createSolanaAdapterFromProvider({
+      provider,
+      capabilities: {
+        supportedChains: [SolanaDevnet],
+      },
+    });
+    solanaWalletInfo.textContent = connectedAddress ?? "Connected";
+  } catch (error) {
+    solanaAdapter = null;
+    render({ error: error instanceof Error ? error.message : "Unknown error" });
+  } finally {
+    connectSolanaButton.disabled = Boolean(solanaAdapter);
+    updateActionButtons();
+  }
+}
+
+/** Deposit 2 USDC from Base Sepolia into the unified balance. */
+async function handleDepositBase() {
+  try {
+    if (!evmAdapter) {
+      throw new Error("Connect an EVM wallet first");
+    }
+
+    depositBaseButton.disabled = true;
+
+    // Switch the wallet to Base Sepolia before depositing
+    await evmAdapter.ensureChain(BaseSepolia);
+
+    const result = await kit.unifiedBalance.deposit({
+      from: { adapter: evmAdapter, chain: "Base_Sepolia" },
+      amount: "2.00",
+      token: "USDC",
+    });
+
+    render(result);
+  } catch (error) {
+    render({ error: error instanceof Error ? error.message : "Unknown error" });
+  } finally {
+    updateActionButtons();
+  }
+}
+
+/** Deposit 1 USDC from Solana Devnet into the unified balance. */
+async function handleDepositSolana() {
+  try {
+    if (!solanaAdapter) {
+      throw new Error("Connect a Solana wallet first");
+    }
+
+    depositSolanaButton.disabled = true;
+
+    const result = await kit.unifiedBalance.deposit({
+      from: { adapter: solanaAdapter, chain: "Solana_Devnet" },
+      amount: "1.00",
+      token: "USDC",
+    });
+
+    render(result);
+  } catch (error) {
+    render({ error: error instanceof Error ? error.message : "Unknown error" });
+  } finally {
+    updateActionButtons();
+  }
+}
+
+/** Read the unified USDC balance across connected wallets. */
+async function handleCheckBalance() {
+  try {
+    checkBalanceButton.disabled = true;
+
+    // Include every connected adapter as a balance source
+    const sources = [
+      ...(evmAdapter ? [{ adapter: evmAdapter }] : []),
+      ...(solanaAdapter ? [{ adapter: solanaAdapter }] : []),
+    ];
+
+    const balances = await kit.unifiedBalance.getBalances({
+      sources,
+      networkType: "testnet",
+      includePending: true,
+    });
+
+    render(balances);
+  } catch (error) {
+    render({ error: error instanceof Error ? error.message : "Unknown error" });
+  } finally {
+    updateActionButtons();
+  }
+}
+
+/** Spend 2.50 USDC from the unified balance to a recipient on Arc Testnet. */
+async function handleSpend(event: SubmitEvent) {
+  event.preventDefault();
+
+  try {
+    if (!evmAdapter || !solanaAdapter) {
+      throw new Error("Connect both wallets first");
+    }
+
+    spendButton.disabled = true;
+
+    const recipientAddress = recipientAddressInput.value.trim();
+
+    // Pull liquidity from both chains and deliver on Arc Testnet
+    const result = await kit.unifiedBalance.spend({
+      amount: "2.50",
+      token: "USDC",
+      from: [{ adapter: evmAdapter }, { adapter: solanaAdapter }],
+      to: {
+        adapter: evmAdapter,
+        chain: "Arc_Testnet",
+        recipientAddress,
+      },
+    });
+
+    render(result);
+  } catch (error) {
+    render({ error: error instanceof Error ? error.message : "Unknown error" });
+  } finally {
+    updateActionButtons();
+  }
+}
+
+/** Enable deposit / balance / spend actions based on which wallets are connected. */
+function updateActionButtons() {
+  const hasEvmAdapter = Boolean(evmAdapter);
+  const hasSolanaAdapter = Boolean(solanaAdapter);
+
+  depositBaseButton.disabled = !hasEvmAdapter;
+  depositSolanaButton.disabled = !hasSolanaAdapter;
+  checkBalanceButton.disabled = !hasEvmAdapter && !hasSolanaAdapter;
+  spendButton.disabled = !(hasEvmAdapter && hasSolanaAdapter);
+}
+
+/** 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 connectSolanaButton =
+  document.querySelector("#connectSolana")!;
+const depositBaseButton =
+  document.querySelector("#depositBase")!;
+const depositSolanaButton =
+  document.querySelector("#depositSolana")!;
+const checkBalanceButton =
+  document.querySelector("#checkBalance")!;
+const spendForm = document.querySelector("form")!;
+const spendButton = document.querySelector("#spend")!;
+const recipientAddressInput =
+  document.querySelector("#recipientAddress")!;
+const evmWalletInfo = document.querySelector("#evmWalletInfo")!;
+const solanaWalletInfo =
+  document.querySelector("#solanaWalletInfo")!;
+const output = document.querySelector("#output")!;
+
+connectEvmButton.addEventListener("click", handleEvmConnect);
+connectSolanaButton.addEventListener("click", handleSolanaConnect);
+depositBaseButton.addEventListener("click", handleDepositBase);
+depositSolanaButton.addEventListener("click", handleDepositSolana);
+checkBalanceButton.addEventListener("click", handleCheckBalance);
+spendForm.addEventListener("submit", handleSpend);
+updateActionButtons();
diff --git a/app-kit-unified-balance/tsconfig.json b/app-kit-unified-balance/tsconfig.json
new file mode 100644
index 0000000..1ab38c8
--- /dev/null
+++ b/app-kit-unified-balance/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"]
+}