From 6b36e33a55ba0a455d931aea9332efba53ea2d8e Mon Sep 17 00:00:00 2001 From: Frederico Dal Grande Date: Thu, 4 Jun 2026 18:13:17 -0300 Subject: [PATCH 1/4] update dependencies to include app kit packages --- package-lock.json | 2956 ++++++++++++++++++++++++++++----------------- package.json | 2 + 2 files changed, 1864 insertions(+), 1094 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9e5bb0f..05de657 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,13 +5,10 @@ "packages": { "": { "dependencies": { - "@circle-fin/bridge-kit": "^1.1.2", - "@circle-fin/developer-controlled-wallets": "^8.4.1", - "@circle-fin/modular-wallets-core": "^1.0.11", - "@hookform/resolvers": "^5.2.2", - "@metamask/delegation-toolkit": "^0.13.0", + "@circle-fin/adapter-circle-wallets": "^1.3.2", + "@circle-fin/app-kit": "^1.7.0", + "@circle-fin/developer-controlled-wallets": "^10.0.1", "@radix-ui/react-alert-dialog": "^1.1.15", - "@radix-ui/react-checkbox": "^1.3.1", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-label": "^2.1.7", @@ -25,10 +22,8 @@ "@supabase/supabase-js": "latest", "@tanstack/react-query": "^5.90.2", "@tanstack/react-table": "^8.21.3", - "axios": "^1.12.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "cmdk": "^1.1.1", "date-fns": "^4.1.0", "lucide-react": "^0.511.0", "next": "latest", @@ -36,26 +31,26 @@ "react": "^19.0.0", "react-day-picker": "^9.11.0", "react-dom": "^19.0.0", - "react-hook-form": "^7.63.0", "sonner": "^2.0.7", "tailwind-merge": "^3.3.0", - "viem": "^2.38.0", - "wagmi": "^2.17.5", - "zod": "^4.1.11" + "viem": "^2.44.4", + "wagmi": "^2.19.5" }, "devDependencies": { "@eslint/eslintrc": "^3", "@tailwindcss/postcss": "^4.1.13", - "@types/node": "^20", + "@types/node": "^22", "@types/react": "^19", "@types/react-dom": "^19", - "baseline-browser-mapping": "^2.9.3", "eslint": "^9", "eslint-config-next": "15.3.1", "postcss": "^8", "tailwindcss": "^4.1.13", "tailwindcss-animate": "^1.0.7", "typescript": "^5" + }, + "engines": { + "node": ">=22.0.0" } }, "node_modules/@adraffy/ens-normalize": { @@ -222,24 +217,262 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@circle-fin/adapter-circle-wallets": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@circle-fin/adapter-circle-wallets/-/adapter-circle-wallets-1.3.2.tgz", + "integrity": "sha512-fXdG+HoSc/nQYbfKVVKVVXSgMbXQ9Y6RNFFvu+BhCC+RvWQJ3ZVjv172fNHMFn32lTjK8xXb/tJr2ZcnFtTTIw==", + "dependencies": { + "@circle-fin/adapter-solana-kit": "1.4.11", + "@circle-fin/adapter-viem-v2": "1.11.2", + "@circle-fin/developer-controlled-wallets": "^9.2.1", + "@circle-fin/smart-contract-platform": "^9.2.1", + "@circle-fin/usdckit": "0.25.1", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/units": "^5.8.0", + "@solana/kit": "^5.0.0", + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "bs58": "6.0.0", + "viem": "^2.30.0", + "zod": "3.25.67" + } + }, + "node_modules/@circle-fin/adapter-circle-wallets/node_modules/@circle-fin/developer-controlled-wallets": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@circle-fin/developer-controlled-wallets/-/developer-controlled-wallets-9.6.0.tgz", + "integrity": "sha512-DTmXKtBG7De21W6Kf8BNm5Cd27s4Rl73RItABjYkvlaEJSYpkkaS1hTeJGGewWh3C3LiROimNm0q+HAPneGmZw==", + "dependencies": { + "axios": "^1.12.2" + } + }, + "node_modules/@circle-fin/adapter-circle-wallets/node_modules/zod": { + "version": "3.25.67", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", + "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@circle-fin/adapter-solana-kit": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@circle-fin/adapter-solana-kit/-/adapter-solana-kit-1.4.11.tgz", + "integrity": "sha512-451hov8sx7DRg3TaqHuCSs2yjTMHnweJ0QpMuuOzTU5vKCOFDn0fKCU20e62zdIVSRZuA37DkPYR/BkIkRWEhA==", + "dependencies": { + "@coral-xyz/anchor": "0.31.1", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/units": "^5.8.0", + "@noble/curves": "1.4.2", + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "bs58": "6.0.0", + "zod": "3.25.67" + }, + "peerDependencies": { + "@solana/kit": "^5.0.0", + "@solana/web3.js": "^1.98.2" + } + }, + "node_modules/@circle-fin/adapter-solana-kit/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/@circle-fin/adapter-solana-kit/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/@circle-fin/adapter-solana-kit/node_modules/zod": { + "version": "3.25.67", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", + "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@circle-fin/adapter-viem-v2": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@circle-fin/adapter-viem-v2/-/adapter-viem-v2-1.11.2.tgz", + "integrity": "sha512-kfMk6bS41MVuajkyyZoaBI5cq2iSOVc1vSC6RnayJAWvIgoYmmZ59WQ6pJpgOqA+PqZ8afD+nxRS9/wJsCzbTA==", + "dependencies": { + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/units": "^5.8.0", + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "bs58": "6.0.0", + "zod": "3.25.67" + }, + "peerDependencies": { + "viem": "^2.30.0" + } + }, + "node_modules/@circle-fin/adapter-viem-v2/node_modules/zod": { + "version": "3.25.67", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", + "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@circle-fin/app-kit": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@circle-fin/app-kit/-/app-kit-1.7.0.tgz", + "integrity": "sha512-A1NL0pgA3fwuE2G4TsuFel4BmpABBUi1PWISz4XS7M3bahjGk8qcr88kMrZ+8mDWAhIZr4x0164DBocdWvmMWw==", + "dependencies": { + "@circle-fin/bridge-kit": "1.10.2", + "@circle-fin/earn-kit": "1.1.0", + "@circle-fin/provider-gateway-v1": "1.0.6", + "@circle-fin/swap-kit": "1.2.3", + "@circle-fin/unified-balance-kit": "1.1.3", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/units": "^5.8.0", + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "bs58": "6.0.0", + "zod": "3.25.67" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@circle-fin/app-kit/node_modules/zod": { + "version": "3.25.67", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", + "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/@circle-fin/bridge-kit": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@circle-fin/bridge-kit/-/bridge-kit-1.5.0.tgz", - "integrity": "sha512-7Ia06YXN00Dhm0E9ycW9sd10zfXdA1NqHKCsdiSxIHjyV+xktWaxMhtXEbqGjtKq6FuxiOycpBmsJyHgDZFZ+Q==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@circle-fin/bridge-kit/-/bridge-kit-1.10.2.tgz", + "integrity": "sha512-Qakvn8rw5vZMySA6z1oh2LjBlFvONQjkPXJ2RaIsMbIjEzEjPys6o4gCOg0/SOZzSbMvDRMHQ/V6Xw6ogAPYfQ==", "dependencies": { - "@circle-fin/provider-cctp-v2": "^1.3.0", + "@circle-fin/provider-cctp-v2": "^1.8.3", "@ethersproject/address": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/units": "^5.8.0", "@solana/web3.js": "^1.98.4", "abitype": "^1.1.0", "bs58": "6.0.0", + "pino": "10.1.0", "zod": "3.25.67" }, "engines": { "node": ">=16.0.0" } }, + "node_modules/@circle-fin/bridge-kit/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/@circle-fin/bridge-kit/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/@circle-fin/bridge-kit/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/@circle-fin/bridge-kit/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/@circle-fin/bridge-kit/node_modules/process-warning": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@circle-fin/bridge-kit/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/@circle-fin/bridge-kit/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/@circle-fin/bridge-kit/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/@circle-fin/bridge-kit/node_modules/zod": { "version": "3.25.67", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", @@ -250,35 +483,66 @@ } }, "node_modules/@circle-fin/developer-controlled-wallets": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@circle-fin/developer-controlled-wallets/-/developer-controlled-wallets-8.4.1.tgz", - "integrity": "sha512-mqlKJxRD4rl4PQWUfxLUeLhQd0BO23uU7Ig9czY4YyoK8Z6dDten+0eIodGNkg8bJdgxkl5WW7KL5ma+C2I41Q==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@circle-fin/developer-controlled-wallets/-/developer-controlled-wallets-10.6.0.tgz", + "integrity": "sha512-EVXVaJ1lNRznJ7osyL4DQDm3RQmwLiCyWqr8Rs/m0RsdKwmcykossyLycXeyQZvsj5ExUS8iVDlHzNqUjs5FKg==", "dependencies": { - "axios": "^1.12.2" + "axios": "^1.15.0" + }, + "peerDependencies": { + "@solana/codecs-strings": "^2.0.0", + "@solana/kit": "^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "@solana/web3.js": "^1.63.0" + }, + "peerDependenciesMeta": { + "@solana/codecs-strings": { + "optional": true + }, + "@solana/kit": { + "optional": true + }, + "@solana/web3.js": { + "optional": true + } } }, - "node_modules/@circle-fin/modular-wallets-core": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@circle-fin/modular-wallets-core/-/modular-wallets-core-1.0.13.tgz", - "integrity": "sha512-ohRRpmjqSToHRUIRAdB7EMMnX3qNTUp9XYCRaaHU71922LWavUAhzn7itHoTOQYd0P8kvm52/OBh/N+lH71a8g==", - "license": "Apache-2.0", + "node_modules/@circle-fin/earn-kit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@circle-fin/earn-kit/-/earn-kit-1.1.0.tgz", + "integrity": "sha512-2z0BXvlei/BUBq7JDGAMnMdM2x9X3RcISsrYbFnHdHA7O5qn1lbpKiRs70JC+RjTZ8tN347W1/qVvI+wTH+Akw==", "dependencies": { - "uuid": "^11.0.3", - "viem": "^2.21.27", - "web3": "^4.13.0", - "webauthn-p256": "0.0.5" + "@circle-fin/provider-earn-service": "^1.1.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/units": "^5.8.0", + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "bs58": "6.0.0", + "zod": "3.25.67" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@circle-fin/earn-kit/node_modules/zod": { + "version": "3.25.67", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", + "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/@circle-fin/provider-cctp-v2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@circle-fin/provider-cctp-v2/-/provider-cctp-v2-1.3.0.tgz", - "integrity": "sha512-cmWLHRqzOCPjjuwWH333REjpI/4/wNltXoin2HSE39LbO/vYFm0w576cMx7FNE7m3KxErdHbNNRiL6/ruH/urg==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@circle-fin/provider-cctp-v2/-/provider-cctp-v2-1.8.3.tgz", + "integrity": "sha512-fQFusHJM8lgtbrItbxpBuicHtmEXQuhSkSqJKmXytxPOdwecLXecybAuk/XORKe2Itxei9WvMIWB9LRqCmnKpg==", "dependencies": { "@coral-xyz/anchor": "^0.31.1", "@ethersproject/address": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/units": "^5.8.0", - "@solana/spl-token": "0.4.14", + "@noble/curves": "1.4.2", "@solana/web3.js": "^1.98.4", "abitype": "^1.1.0", "bs58": "6.0.0", @@ -286,27 +550,907 @@ "zod": "3.25.67" }, "peerDependencies": { - "@solana/spl-token": "^0.4.13", "@solana/web3.js": "^1.98.2" }, "peerDependenciesMeta": { - "@solana/spl-token": { - "optional": true - }, "@solana/web3.js": { "optional": true } } }, - "node_modules/@circle-fin/provider-cctp-v2/node_modules/zod": { - "version": "3.25.67", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", - "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", + "node_modules/@circle-fin/provider-cctp-v2/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/@circle-fin/provider-cctp-v2/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/@circle-fin/provider-cctp-v2/node_modules/zod": { + "version": "3.25.67", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", + "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@circle-fin/provider-earn-service": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@circle-fin/provider-earn-service/-/provider-earn-service-1.1.0.tgz", + "integrity": "sha512-o+7ERDPaVDY7Q8oiGwUkCvlC4xyxVwSIjXlvrOkBafiQAPXbJRBNNUZrmjVW8dJhyYGF4hr6A2Qv4eoJJTBltg==", + "dependencies": { + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/units": "^5.8.0", + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "bs58": "6.0.0", + "zod": "3.25.67" + } + }, + "node_modules/@circle-fin/provider-earn-service/node_modules/zod": { + "version": "3.25.67", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", + "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@circle-fin/provider-gateway-v1": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@circle-fin/provider-gateway-v1/-/provider-gateway-v1-1.0.6.tgz", + "integrity": "sha512-fmKCmGHaICBpFWhT7nZnth2FcG2WnWvmTSDHoP7ygvDPoBtABLbFIwJRuAhaDqkVafCeVTR1s0QflTf425ggWw==", + "dependencies": { + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/units": "^5.8.0", + "@noble/curves": "1.4.2", + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "bs58": "6.0.0", + "zod": "3.25.67" + } + }, + "node_modules/@circle-fin/provider-gateway-v1/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/@circle-fin/provider-gateway-v1/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/@circle-fin/provider-gateway-v1/node_modules/zod": { + "version": "3.25.67", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", + "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@circle-fin/provider-stablecoin-service-swap": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@circle-fin/provider-stablecoin-service-swap/-/provider-stablecoin-service-swap-1.1.5.tgz", + "integrity": "sha512-noEy3DdZgzWRuSpKv+MMp68Ntslq7DnneKOwkYrLod9AZuw/GEGaaa6Ux21wixZrStt0TUK+65GRyXUM+0Dnvw==", + "dependencies": { + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "zod": "3.25.67" + } + }, + "node_modules/@circle-fin/provider-stablecoin-service-swap/node_modules/zod": { + "version": "3.25.67", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", + "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@circle-fin/smart-contract-platform": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@circle-fin/smart-contract-platform/-/smart-contract-platform-9.6.0.tgz", + "integrity": "sha512-3Xk2a5YX0fG2rEebiKFsWdj+gtdjN+leRocYsA0zNJrTnzPPnnRKUeCYdbFB5QCDqZC+94N4lPQHYUj0P8SN5g==", + "dependencies": { + "axios": "^1.12.2" + } + }, + "node_modules/@circle-fin/swap-kit": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@circle-fin/swap-kit/-/swap-kit-1.2.3.tgz", + "integrity": "sha512-m+Bby+WuPpQ9RPXVJLs2D5PZRL9YhPvt81iOirAd+y/Laylixfx2hqJlCH+XMdXARjyVte5Q0xSuo+b9hLm1zA==", + "dependencies": { + "@circle-fin/provider-stablecoin-service-swap": "^1.1.5", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/units": "^5.8.0", + "@noble/curves": "1.4.2", + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "bs58": "6.0.0", + "zod": "3.25.67" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@circle-fin/swap-kit/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/@circle-fin/swap-kit/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/@circle-fin/swap-kit/node_modules/zod": { + "version": "3.25.67", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", + "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@circle-fin/unified-balance-kit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@circle-fin/unified-balance-kit/-/unified-balance-kit-1.1.3.tgz", + "integrity": "sha512-sMR3fw2vmMcr3jLgFq8eJI2UprSO3/coe2i7zWedE73YRvDzyhSYqz5pnCqcGLVuefedcdzhqXJUHXeqtX0YFg==", + "dependencies": { + "@circle-fin/provider-gateway-v1": "1.0.6", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/units": "^5.8.0", + "@solana/web3.js": "^1.98.4", + "abitype": "^1.1.0", + "bs58": "6.0.0", + "zod": "3.25.67" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@circle-fin/unified-balance-kit/node_modules/zod": { + "version": "3.25.67", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", + "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@circle-fin/usdckit": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@circle-fin/usdckit/-/usdckit-0.25.1.tgz", + "integrity": "sha512-TyrDCwXtaQ1dSeNp9xK0ft6jdsWWa+yjl2tuC9WCVXml1cogFr+AqzD5DTILY1YWCgwN1LYIpQDmv7PLBYsEPw==", + "license": "Apache-2.0", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@circle-fin/developer-controlled-wallets": "^10.0.1", + "@circle-fin/smart-contract-platform": "^10.0.1", + "@inquirer/prompts": "^7.5.3", + "@solana-program/token": "^0.5.1", + "@solana-program/token-2022": "^0.4.2", + "@solana/kit": "^2.3.0", + "@wagmi/core": "^2.20.3", + "axios": "^1.13.5", + "commander": "^14.0.0", + "pino": "^9.9.0", + "uuid": "^11.0.3", + "viem": "^2.46.3" + }, + "bin": { + "usdckit": "dist/esm/cli/index.mjs" + }, + "engines": { + "node": ">=20.19", + "npm": ">=7.0.0" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@circle-fin/smart-contract-platform": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@circle-fin/smart-contract-platform/-/smart-contract-platform-10.6.0.tgz", + "integrity": "sha512-TDIBRYQeFitjXdB9c+sFmKBlxct1Gpnh/7XD/4aVDK5p0Vx5KEhSiL4Ghv0yX5H3n0W5KurMqJmqcsTM4JYJGA==", + "dependencies": { + "axios": "^1.15.0" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana-program/token": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@solana-program/token/-/token-0.5.1.tgz", + "integrity": "sha512-bJvynW5q9SFuVOZ5vqGVkmaPGA0MCC+m9jgJj1nk5m20I389/ms69ASnhWGoOPNcie7S9OwBX0gTj2fiyWpfag==", + "license": "Apache-2.0", + "peerDependencies": { + "@solana/kit": "^2.1.0" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/accounts": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/accounts/-/accounts-2.3.0.tgz", + "integrity": "sha512-QgQTj404Z6PXNOyzaOpSzjgMOuGwG8vC66jSDB+3zHaRcEPRVRd2sVSrd1U6sHtnV3aiaS6YyDuPQMheg4K2jw==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.3.0", + "@solana/codecs-core": "2.3.0", + "@solana/codecs-strings": "2.3.0", + "@solana/errors": "2.3.0", + "@solana/rpc-spec": "2.3.0", + "@solana/rpc-types": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/addresses": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/addresses/-/addresses-2.3.0.tgz", + "integrity": "sha512-ypTNkY2ZaRFpHLnHAgaW8a83N0/WoqdFvCqf4CQmnMdFsZSdC7qOwcbd7YzdaQn9dy+P2hybewzB+KP7LutxGA==", + "license": "MIT", + "dependencies": { + "@solana/assertions": "2.3.0", + "@solana/codecs-core": "2.3.0", + "@solana/codecs-strings": "2.3.0", + "@solana/errors": "2.3.0", + "@solana/nominal-types": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/assertions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/assertions/-/assertions-2.3.0.tgz", + "integrity": "sha512-Ekoet3khNg3XFLN7MIz8W31wPQISpKUGDGTylLptI+JjCDWx3PIa88xjEMqFo02WJ8sBj2NLV64Xg1sBcsHjZQ==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/fast-stable-stringify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/fast-stable-stringify/-/fast-stable-stringify-2.3.0.tgz", + "integrity": "sha512-KfJPrMEieUg6D3hfQACoPy0ukrAV8Kio883llt/8chPEG3FVTX9z/Zuf4O01a15xZmBbmQ7toil2Dp0sxMJSxw==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/functional": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/functional/-/functional-2.3.0.tgz", + "integrity": "sha512-AgsPh3W3tE+nK3eEw/W9qiSfTGwLYEvl0rWaxHht/lRcuDVwfKRzeSa5G79eioWFFqr+pTtoCr3D3OLkwKz02Q==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/instructions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/instructions/-/instructions-2.3.0.tgz", + "integrity": "sha512-PLMsmaIKu7hEAzyElrk2T7JJx4D+9eRwebhFZpy2PXziNSmFF929eRHKUsKqBFM3cYR1Yy3m6roBZfA+bGE/oQ==", + "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/@circle-fin/usdckit/node_modules/@solana/keys": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/keys/-/keys-2.3.0.tgz", + "integrity": "sha512-ZVVdga79pNH+2pVcm6fr2sWz9HTwfopDVhYb0Lh3dh+WBmJjwkabXEIHey2rUES7NjFa/G7sV8lrUn/v8LDCCQ==", + "license": "MIT", + "dependencies": { + "@solana/assertions": "2.3.0", + "@solana/codecs-core": "2.3.0", + "@solana/codecs-strings": "2.3.0", + "@solana/errors": "2.3.0", + "@solana/nominal-types": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/kit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/kit/-/kit-2.3.0.tgz", + "integrity": "sha512-sb6PgwoW2LjE5oTFu4lhlS/cGt/NB3YrShEyx7JgWFWysfgLdJnhwWThgwy/4HjNsmtMrQGWVls0yVBHcMvlMQ==", + "license": "MIT", + "dependencies": { + "@solana/accounts": "2.3.0", + "@solana/addresses": "2.3.0", + "@solana/codecs": "2.3.0", + "@solana/errors": "2.3.0", + "@solana/functional": "2.3.0", + "@solana/instructions": "2.3.0", + "@solana/keys": "2.3.0", + "@solana/programs": "2.3.0", + "@solana/rpc": "2.3.0", + "@solana/rpc-parsed-types": "2.3.0", + "@solana/rpc-spec-types": "2.3.0", + "@solana/rpc-subscriptions": "2.3.0", + "@solana/rpc-types": "2.3.0", + "@solana/signers": "2.3.0", + "@solana/sysvars": "2.3.0", + "@solana/transaction-confirmation": "2.3.0", + "@solana/transaction-messages": "2.3.0", + "@solana/transactions": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/nominal-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/nominal-types/-/nominal-types-2.3.0.tgz", + "integrity": "sha512-uKlMnlP4PWW5UTXlhKM8lcgIaNj8dvd8xO4Y9l+FVvh9RvW2TO0GwUO6JCo7JBzCB0PSqRJdWWaQ8pu1Ti/OkA==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/programs": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/programs/-/programs-2.3.0.tgz", + "integrity": "sha512-UXKujV71VCI5uPs+cFdwxybtHZAIZyQkqDiDnmK+DawtOO9mBn4Nimdb/6RjR2CXT78mzO9ZCZ3qfyX+ydcB7w==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.3.0", + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/promises": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/promises/-/promises-2.3.0.tgz", + "integrity": "sha512-GjVgutZKXVuojd9rWy1PuLnfcRfqsaCm7InCiZc8bqmJpoghlyluweNc7ml9Y5yQn1P2IOyzh9+p/77vIyNybQ==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/rpc": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc/-/rpc-2.3.0.tgz", + "integrity": "sha512-ZWN76iNQAOCpYC7yKfb3UNLIMZf603JckLKOOLTHuy9MZnTN8XV6uwvDFhf42XvhglgUjGCEnbUqWtxQ9pa/pQ==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.3.0", + "@solana/fast-stable-stringify": "2.3.0", + "@solana/functional": "2.3.0", + "@solana/rpc-api": "2.3.0", + "@solana/rpc-spec": "2.3.0", + "@solana/rpc-spec-types": "2.3.0", + "@solana/rpc-transformers": "2.3.0", + "@solana/rpc-transport-http": "2.3.0", + "@solana/rpc-types": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/rpc-api": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-api/-/rpc-api-2.3.0.tgz", + "integrity": "sha512-UUdiRfWoyYhJL9PPvFeJr4aJ554ob2jXcpn4vKmRVn9ire0sCbpQKYx6K8eEKHZWXKrDW8IDspgTl0gT/aJWVg==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.3.0", + "@solana/codecs-core": "2.3.0", + "@solana/codecs-strings": "2.3.0", + "@solana/errors": "2.3.0", + "@solana/keys": "2.3.0", + "@solana/rpc-parsed-types": "2.3.0", + "@solana/rpc-spec": "2.3.0", + "@solana/rpc-transformers": "2.3.0", + "@solana/rpc-types": "2.3.0", + "@solana/transaction-messages": "2.3.0", + "@solana/transactions": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/rpc-parsed-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-parsed-types/-/rpc-parsed-types-2.3.0.tgz", + "integrity": "sha512-B5pHzyEIbBJf9KHej+zdr5ZNAdSvu7WLU2lOUPh81KHdHQs6dEb310LGxcpCc7HVE8IEdO20AbckewDiAN6OCg==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/rpc-spec": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-spec/-/rpc-spec-2.3.0.tgz", + "integrity": "sha512-fA2LMX4BMixCrNB2n6T83AvjZ3oUQTu7qyPLyt8gHQaoEAXs8k6GZmu6iYcr+FboQCjUmRPgMaABbcr9j2J9Sw==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.3.0", + "@solana/rpc-spec-types": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/rpc-spec-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-spec-types/-/rpc-spec-types-2.3.0.tgz", + "integrity": "sha512-xQsb65lahjr8Wc9dMtP7xa0ZmDS8dOE2ncYjlvfyw/h4mpdXTUdrSMi6RtFwX33/rGuztQ7Hwaid5xLNSLvsFQ==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/rpc-subscriptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions/-/rpc-subscriptions-2.3.0.tgz", + "integrity": "sha512-Uyr10nZKGVzvCOqwCZgwYrzuoDyUdwtgQRefh13pXIrdo4wYjVmoLykH49Omt6abwStB0a4UL5gX9V4mFdDJZg==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.3.0", + "@solana/fast-stable-stringify": "2.3.0", + "@solana/functional": "2.3.0", + "@solana/promises": "2.3.0", + "@solana/rpc-spec-types": "2.3.0", + "@solana/rpc-subscriptions-api": "2.3.0", + "@solana/rpc-subscriptions-channel-websocket": "2.3.0", + "@solana/rpc-subscriptions-spec": "2.3.0", + "@solana/rpc-transformers": "2.3.0", + "@solana/rpc-types": "2.3.0", + "@solana/subscribable": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/rpc-subscriptions-api": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-api/-/rpc-subscriptions-api-2.3.0.tgz", + "integrity": "sha512-9mCjVbum2Hg9KGX3LKsrI5Xs0KX390lS+Z8qB80bxhar6MJPugqIPH8uRgLhCW9GN3JprAfjRNl7our8CPvsPQ==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.3.0", + "@solana/keys": "2.3.0", + "@solana/rpc-subscriptions-spec": "2.3.0", + "@solana/rpc-transformers": "2.3.0", + "@solana/rpc-types": "2.3.0", + "@solana/transaction-messages": "2.3.0", + "@solana/transactions": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/rpc-subscriptions-channel-websocket": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-channel-websocket/-/rpc-subscriptions-channel-websocket-2.3.0.tgz", + "integrity": "sha512-2oL6ceFwejIgeWzbNiUHI2tZZnaOxNTSerszcin7wYQwijxtpVgUHiuItM/Y70DQmH9sKhmikQp+dqeGalaJxw==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.3.0", + "@solana/functional": "2.3.0", + "@solana/rpc-subscriptions-spec": "2.3.0", + "@solana/subscribable": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3", + "ws": "^8.18.0" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/rpc-subscriptions-spec": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-spec/-/rpc-subscriptions-spec-2.3.0.tgz", + "integrity": "sha512-rdmVcl4PvNKQeA2l8DorIeALCgJEMSu7U8AXJS1PICeb2lQuMeaR+6cs/iowjvIB0lMVjYN2sFf6Q3dJPu6wWg==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.3.0", + "@solana/promises": "2.3.0", + "@solana/rpc-spec-types": "2.3.0", + "@solana/subscribable": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/rpc-transformers": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-transformers/-/rpc-transformers-2.3.0.tgz", + "integrity": "sha512-UuHYK3XEpo9nMXdjyGKkPCOr7WsZsxs7zLYDO1A5ELH3P3JoehvrDegYRAGzBS2VKsfApZ86ZpJToP0K3PhmMA==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.3.0", + "@solana/functional": "2.3.0", + "@solana/nominal-types": "2.3.0", + "@solana/rpc-spec-types": "2.3.0", + "@solana/rpc-types": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/rpc-transport-http": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-transport-http/-/rpc-transport-http-2.3.0.tgz", + "integrity": "sha512-HFKydmxGw8nAF5N+S0NLnPBDCe5oMDtI2RAmW8DMqP4U3Zxt2XWhvV1SNkAldT5tF0U1vP+is6fHxyhk4xqEvg==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.3.0", + "@solana/rpc-spec": "2.3.0", + "@solana/rpc-spec-types": "2.3.0", + "undici-types": "^7.11.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/rpc-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-types/-/rpc-types-2.3.0.tgz", + "integrity": "sha512-O09YX2hED2QUyGxrMOxQ9GzH1LlEwwZWu69QbL4oYmIf6P5dzEEHcqRY6L1LsDVqc/dzAdEs/E1FaPrcIaIIPw==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.3.0", + "@solana/codecs-core": "2.3.0", + "@solana/codecs-numbers": "2.3.0", + "@solana/codecs-strings": "2.3.0", + "@solana/errors": "2.3.0", + "@solana/nominal-types": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/signers": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/signers/-/signers-2.3.0.tgz", + "integrity": "sha512-OSv6fGr/MFRx6J+ZChQMRqKNPGGmdjkqarKkRzkwmv7v8quWsIRnJT5EV8tBy3LI4DLO/A8vKiNSPzvm1TdaiQ==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.3.0", + "@solana/codecs-core": "2.3.0", + "@solana/errors": "2.3.0", + "@solana/instructions": "2.3.0", + "@solana/keys": "2.3.0", + "@solana/nominal-types": "2.3.0", + "@solana/transaction-messages": "2.3.0", + "@solana/transactions": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/subscribable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/subscribable/-/subscribable-2.3.0.tgz", + "integrity": "sha512-DkgohEDbMkdTWiKAoatY02Njr56WXx9e/dKKfmne8/Ad6/2llUIrax78nCdlvZW9quXMaXPTxZvdQqo9N669Og==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/sysvars": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/sysvars/-/sysvars-2.3.0.tgz", + "integrity": "sha512-LvjADZrpZ+CnhlHqfI5cmsRzX9Rpyb1Ox2dMHnbsRNzeKAMhu9w4ZBIaeTdO322zsTr509G1B+k2ABD3whvUBA==", + "license": "MIT", + "dependencies": { + "@solana/accounts": "2.3.0", + "@solana/codecs": "2.3.0", + "@solana/errors": "2.3.0", + "@solana/rpc-types": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/transaction-confirmation": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/transaction-confirmation/-/transaction-confirmation-2.3.0.tgz", + "integrity": "sha512-UiEuiHCfAAZEKdfne/XljFNJbsKAe701UQHKXEInYzIgBjRbvaeYZlBmkkqtxwcasgBTOmEaEKT44J14N9VZDw==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.3.0", + "@solana/codecs-strings": "2.3.0", + "@solana/errors": "2.3.0", + "@solana/keys": "2.3.0", + "@solana/promises": "2.3.0", + "@solana/rpc": "2.3.0", + "@solana/rpc-subscriptions": "2.3.0", + "@solana/rpc-types": "2.3.0", + "@solana/transaction-messages": "2.3.0", + "@solana/transactions": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/transaction-messages": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/transaction-messages/-/transaction-messages-2.3.0.tgz", + "integrity": "sha512-bgqvWuy3MqKS5JdNLH649q+ngiyOu5rGS3DizSnWwYUd76RxZl1kN6CoqHSrrMzFMvis6sck/yPGG3wqrMlAww==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.3.0", + "@solana/codecs-core": "2.3.0", + "@solana/codecs-data-structures": "2.3.0", + "@solana/codecs-numbers": "2.3.0", + "@solana/errors": "2.3.0", + "@solana/functional": "2.3.0", + "@solana/instructions": "2.3.0", + "@solana/nominal-types": "2.3.0", + "@solana/rpc-types": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/node_modules/@solana/transactions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/transactions/-/transactions-2.3.0.tgz", + "integrity": "sha512-LnTvdi8QnrQtuEZor5Msje61sDpPstTVwKg4y81tNxDhiyomjuvnSNLAq6QsB9gIxUqbNzPZgOG9IU4I4/Uaug==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.3.0", + "@solana/codecs-core": "2.3.0", + "@solana/codecs-data-structures": "2.3.0", + "@solana/codecs-numbers": "2.3.0", + "@solana/codecs-strings": "2.3.0", + "@solana/errors": "2.3.0", + "@solana/functional": "2.3.0", + "@solana/instructions": "2.3.0", + "@solana/keys": "2.3.0", + "@solana/nominal-types": "2.3.0", + "@solana/rpc-types": "2.3.0", + "@solana/transaction-messages": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@circle-fin/usdckit/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/@circle-fin/usdckit/node_modules/pino": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.14.0.tgz", + "integrity": "sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==", + "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/@circle-fin/usdckit/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/@circle-fin/usdckit/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/@circle-fin/usdckit/node_modules/process-warning": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@circle-fin/usdckit/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/@circle-fin/usdckit/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/@circle-fin/usdckit/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", - "funding": { - "url": "https://github.com/sponsors/colinhacks" + "dependencies": { + "real-require": "^0.2.0" } }, + "node_modules/@circle-fin/usdckit/node_modules/undici-types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.27.0.tgz", + "integrity": "sha512-sqqlwW3zm+cE82GwKdGyn3pcze7LXlx/4jUgA0vtAf6Fa81KMrJqc3VfWmmeOTUIElW9IdPsLwMUIpiOZQgK3A==", + "license": "MIT" + }, "node_modules/@coinbase/cdp-sdk": { "version": "1.44.0", "resolved": "https://registry.npmjs.org/@coinbase/cdp-sdk/-/cdp-sdk-1.44.0.tgz", @@ -1023,18 +2167,6 @@ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "license": "MIT" }, - "node_modules/@hookform/resolvers": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.2.2.tgz", - "integrity": "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==", - "license": "MIT", - "dependencies": { - "@standard-schema/utils": "^0.3.0" - }, - "peerDependencies": { - "react-hook-form": "^7.55.0" - } - }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -1402,155 +2534,489 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@inquirer/number": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/node": ">=18" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@inquirer/password": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/node": ">=18" }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@inquirer/prompts": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.3.2", + "@inquirer/confirm": "^5.1.21", + "@inquirer/editor": "^4.2.23", + "@inquirer/expand": "^4.0.23", + "@inquirer/input": "^4.3.1", + "@inquirer/number": "^3.0.23", + "@inquirer/password": "^4.0.23", + "@inquirer/rawlist": "^4.1.11", + "@inquirer/search": "^3.2.2", + "@inquirer/select": "^4.4.2" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/node": ">=18" }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, + "node_modules/@inquirer/rawlist": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", + "license": "MIT", "dependencies": { - "@emnapi/runtime": "^1.7.0" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], + "node_modules/@inquirer/search": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], + "node_modules/@inquirer/select": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "license": "MIT", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@jridgewell/gen-mapping": { @@ -1618,97 +3084,6 @@ "@lit-labs/ssr-dom-shim": "^1.5.0" } }, - "node_modules/@metamask/7715-permission-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@metamask/7715-permission-types/-/7715-permission-types-0.3.0.tgz", - "integrity": "sha512-+bqFNe6/YCe2LZapiVJO3/hn7BSJLExYT+cDJS1spJocPeVsTyURv3IjblZxRqTOv+igTwrYbh45LvdkgzxkZQ==", - "license": "(MIT-0 OR Apache-2.0)", - "engines": { - "node": "^18.18 || >=20" - } - }, - "node_modules/@metamask/abi-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@metamask/abi-utils/-/abi-utils-3.0.0.tgz", - "integrity": "sha512-a/l0DiSIr7+CBYVpHygUa3ztSlYLFCQMsklLna+t6qmNY9+eIO5TedNxhyIyvaJ+4cN7TLy0NQFbp9FV3X2ktg==", - "license": "(Apache-2.0 AND MIT)", - "dependencies": { - "@metamask/superstruct": "^3.1.0", - "@metamask/utils": "^11.0.1" - }, - "engines": { - "node": "^18.18 || ^20.14 || >=22" - } - }, - "node_modules/@metamask/delegation-abis": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@metamask/delegation-abis/-/delegation-abis-0.11.0.tgz", - "integrity": "sha512-tnNGFDLQ5jfgPhHJaT5JwvF759nja1iGAG00REbk1Ufir+TxjxTmF8L9MbJifZmUh4fnyqV4Ik6NAOYVNBPVBg==", - "license": "(MIT-0 OR Apache-2.0)", - "engines": { - "node": "^18.18 || >=20" - } - }, - "node_modules/@metamask/delegation-core": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@metamask/delegation-core/-/delegation-core-0.2.0.tgz", - "integrity": "sha512-leP40qoxhTmexfeY/neZ9XkhmUiq8fHh3ax4wmmTB5CG6VuXStn2LzLz875RiBtjwU3c4IqaZljxvwC1dUuWVw==", - "license": "(MIT-0 OR Apache-2.0)", - "dependencies": { - "@metamask/abi-utils": "^3.0.0", - "@metamask/utils": "^11.4.0", - "@noble/hashes": "^1.8.0" - }, - "engines": { - "node": "^18.18 || >=20" - } - }, - "node_modules/@metamask/delegation-deployments": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@metamask/delegation-deployments/-/delegation-deployments-0.12.0.tgz", - "integrity": "sha512-9SB5DhLAnbpIWbFxP3UKPXLhCt8iiRjBBjZ7hqF5dMXy9buBEDpCRg+FJYRxYRecwporrTVrv+NfKUyCbL2ncw==", - "license": "(MIT-0 OR Apache-2.0)", - "engines": { - "node": "^18.18 || >=20" - } - }, - "node_modules/@metamask/delegation-toolkit": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@metamask/delegation-toolkit/-/delegation-toolkit-0.13.0.tgz", - "integrity": "sha512-SVc2gcnKQ8KQodugfuXMs49pHO1x9AYw3Wmdg4yBEsgm5TF5zPpWFmAj+bOL8q+Fn+mHJAibFIrJBtS970G9Dw==", - "deprecated": "Renamed to @metamask/smart-accounts-kit", - "license": "(MIT-0 OR Apache-2.0)", - "dependencies": { - "@metamask/7715-permission-types": "^0.3.0", - "@metamask/delegation-abis": "^0.11.0", - "@metamask/delegation-core": "^0.2.0", - "@metamask/delegation-deployments": "^0.12.0", - "buffer": "^6.0.3", - "webauthn-p256": "^0.0.10" - }, - "engines": { - "node": "^18.18 || >=20" - }, - "peerDependencies": { - "viem": "^2.31.4" - } - }, - "node_modules/@metamask/delegation-toolkit/node_modules/webauthn-p256": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/webauthn-p256/-/webauthn-p256-0.0.10.tgz", - "integrity": "sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "license": "MIT", - "dependencies": { - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.4.0" - } - }, "node_modules/@metamask/eth-json-rpc-provider": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@metamask/eth-json-rpc-provider/-/eth-json-rpc-provider-1.0.1.tgz", @@ -2507,6 +3882,12 @@ "url": "https://paulmillr.com/funding/" } }, + "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/@radix-ui/number": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", @@ -2566,42 +3947,12 @@ } }, "node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", - "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", @@ -3899,17 +5250,6 @@ } } }, - "node_modules/@reown/appkit-controllers/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "optional": true, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, "node_modules/@reown/appkit-pay": { "version": "1.7.8", "resolved": "https://registry.npmjs.org/@reown/appkit-pay/-/appkit-pay-1.7.8.tgz", @@ -4273,17 +5613,6 @@ } } }, - "node_modules/@reown/appkit-utils/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "optional": true, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, "node_modules/@reown/appkit-wallet": { "version": "1.7.8", "resolved": "https://registry.npmjs.org/@reown/appkit-wallet/-/appkit-wallet-1.7.8.tgz", @@ -4599,17 +5928,6 @@ } } }, - "node_modules/@reown/appkit/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "optional": true, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -4767,6 +6085,16 @@ "@solana/kit": "^5.0" } }, + "node_modules/@solana-program/token-2022": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@solana-program/token-2022/-/token-2022-0.4.2.tgz", + "integrity": "sha512-zIpR5t4s9qEU3hZKupzIBxJ6nUV5/UVyIT400tu9vT1HMs5JHxaTTsb5GUhYjiiTvNwU0MQavbwc4Dl29L0Xvw==", + "license": "Apache-2.0", + "peerDependencies": { + "@solana/kit": "^2.1.0", + "@solana/sysvars": "^2.1.0" + } + }, "node_modules/@solana/accounts": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/@solana/accounts/-/accounts-5.5.1.tgz", @@ -5081,105 +6409,108 @@ "node": ">=5.10" } }, - "node_modules/@solana/buffer-layout-utils": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz", - "integrity": "sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==", - "license": "Apache-2.0", - "dependencies": { - "@solana/buffer-layout": "^4.0.0", - "@solana/web3.js": "^1.32.0", - "bigint-buffer": "^1.1.5", - "bignumber.js": "^9.0.1" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/@solana/codecs": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-rc.1.tgz", - "integrity": "sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.3.0.tgz", + "integrity": "sha512-JVqGPkzoeyU262hJGdH64kNLH0M+Oew2CIPOa/9tR3++q2pEd4jU2Rxdfye9sd0Ce3XJrR5AIa8ZfbyQXzjh+g==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "2.0.0-rc.1", - "@solana/codecs-data-structures": "2.0.0-rc.1", - "@solana/codecs-numbers": "2.0.0-rc.1", - "@solana/codecs-strings": "2.0.0-rc.1", - "@solana/options": "2.0.0-rc.1" + "@solana/codecs-core": "2.3.0", + "@solana/codecs-data-structures": "2.3.0", + "@solana/codecs-numbers": "2.3.0", + "@solana/codecs-strings": "2.3.0", + "@solana/options": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5" + "typescript": ">=5.3.3" } }, "node_modules/@solana/codecs-core": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-rc.1.tgz", - "integrity": "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==", + "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.0.0-rc.1" + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5" + "typescript": ">=5.3.3" } }, "node_modules/@solana/codecs-data-structures": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-rc.1.tgz", - "integrity": "sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.3.0.tgz", + "integrity": "sha512-qvU5LE5DqEdYMYgELRHv+HMOx73sSoV1ZZkwIrclwUmwTbTaH8QAJURBj0RhQ/zCne7VuLLOZFFGv6jGigWhSw==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "2.0.0-rc.1", - "@solana/codecs-numbers": "2.0.0-rc.1", - "@solana/errors": "2.0.0-rc.1" + "@solana/codecs-core": "2.3.0", + "@solana/codecs-numbers": "2.3.0", + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5" + "typescript": ">=5.3.3" } }, "node_modules/@solana/codecs-numbers": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-rc.1.tgz", - "integrity": "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==", + "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.0.0-rc.1", - "@solana/errors": "2.0.0-rc.1" + "@solana/codecs-core": "2.3.0", + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5" + "typescript": ">=5.3.3" } }, "node_modules/@solana/codecs-strings": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-rc.1.tgz", - "integrity": "sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.3.0.tgz", + "integrity": "sha512-y5pSBYwzVziXu521hh+VxqUtp0hYGTl1eWGoc1W+8mdvBdC1kTqm/X7aYQw33J42hw03JjryvYOvmGgk3Qz/Ug==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "2.0.0-rc.1", - "@solana/codecs-numbers": "2.0.0-rc.1", - "@solana/errors": "2.0.0-rc.1" + "@solana/codecs-core": "2.3.0", + "@solana/codecs-numbers": "2.3.0", + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" }, "peerDependencies": { "fastestsmallesttextencoderdecoder": "^1.0.22", - "typescript": ">=5" + "typescript": ">=5.3.3" } }, "node_modules/@solana/errors": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-rc.1.tgz", - "integrity": "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==", + "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.3.0", - "commander": "^12.1.0" + "chalk": "^5.4.1", + "commander": "^14.0.0" }, "bin": { "errors": "bin/cli.mjs" }, + "engines": { + "node": ">=20.18.0" + }, "peerDependencies": { - "typescript": ">=5" + "typescript": ">=5.3.3" } }, "node_modules/@solana/fast-stable-stringify": { @@ -5850,19 +7181,22 @@ } }, "node_modules/@solana/options": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-rc.1.tgz", - "integrity": "sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.3.0.tgz", + "integrity": "sha512-PPnnZBRCWWoZQ11exPxf//DRzN2C6AoFsDI/u2AsQfYih434/7Kp4XLpfOMT/XESi+gdBMFNNfbES5zg3wAIkw==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "2.0.0-rc.1", - "@solana/codecs-data-structures": "2.0.0-rc.1", - "@solana/codecs-numbers": "2.0.0-rc.1", - "@solana/codecs-strings": "2.0.0-rc.1", - "@solana/errors": "2.0.0-rc.1" + "@solana/codecs-core": "2.3.0", + "@solana/codecs-data-structures": "2.3.0", + "@solana/codecs-numbers": "2.3.0", + "@solana/codecs-strings": "2.3.0", + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5" + "typescript": ">=5.3.3" } }, "node_modules/@solana/plugin-core": { @@ -6759,55 +8093,6 @@ "node": ">=20" } }, - "node_modules/@solana/spl-token": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.14.tgz", - "integrity": "sha512-u09zr96UBpX4U685MnvQsNzlvw9TiY005hk1vJmJr7gMJldoPG1eYU5/wNEyOA5lkMLiR/gOi9SFD4MefOYEsA==", - "license": "Apache-2.0", - "dependencies": { - "@solana/buffer-layout": "^4.0.0", - "@solana/buffer-layout-utils": "^0.2.0", - "@solana/spl-token-group": "^0.0.7", - "@solana/spl-token-metadata": "^0.1.6", - "buffer": "^6.0.3" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@solana/web3.js": "^1.95.5" - } - }, - "node_modules/@solana/spl-token-group": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.7.tgz", - "integrity": "sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug==", - "license": "Apache-2.0", - "dependencies": { - "@solana/codecs": "2.0.0-rc.1" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@solana/web3.js": "^1.95.3" - } - }, - "node_modules/@solana/spl-token-metadata": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.6.tgz", - "integrity": "sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA==", - "license": "Apache-2.0", - "dependencies": { - "@solana/codecs": "2.0.0-rc.1" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@solana/web3.js": "^1.95.3" - } - }, "node_modules/@solana/subscribable": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/@solana/subscribable/-/subscribable-5.5.1.tgz", @@ -7483,56 +8768,6 @@ "superstruct": "^2.0.2" } }, - "node_modules/@solana/web3.js/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/web3.js/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/web3.js/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/node_modules/base-x": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", @@ -7551,15 +8786,6 @@ "base-x": "^3.0.2" } }, - "node_modules/@solana/web3.js/node_modules/commander": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", - "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", - "license": "MIT", - "engines": { - "node": ">=20" - } - }, "node_modules/@solana/web3.js/node_modules/superstruct": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", @@ -7569,12 +8795,6 @@ "node": ">=14.0.0" } }, - "node_modules/@standard-schema/utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", - "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", - "license": "MIT" - }, "node_modules/@supabase/auth-js": { "version": "2.93.3", "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.93.3.tgz", @@ -8069,9 +9289,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.19.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.30.tgz", - "integrity": "sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==", + "version": "22.19.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.19.tgz", + "integrity": "sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -8087,7 +9307,7 @@ "version": "19.2.10", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.10.tgz", "integrity": "sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -8097,7 +9317,7 @@ "version": "19.2.3", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "devOptional": true, + "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "^19.2.0" @@ -9288,17 +10508,6 @@ } } }, - "node_modules/@walletconnect/utils/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "optional": true, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, "node_modules/@walletconnect/window-getters": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.1.tgz", @@ -9374,6 +10583,18 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/agentkeepalive": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", @@ -9696,14 +10917,15 @@ } }, "node_modules/axios": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.4.tgz", - "integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.17.0.tgz", + "integrity": "sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" } }, "node_modules/axios-retry": { @@ -9783,37 +11005,6 @@ "url": "https://opencollective.com/bigjs" } }, - "node_modules/bigint-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz", - "integrity": "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "bindings": "^1.3.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "license": "MIT", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, "node_modules/bn.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", @@ -10068,6 +11259,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "license": "MIT" + }, "node_modules/charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", @@ -10104,6 +11301,15 @@ "url": "https://polar.sh/cva" } }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -10130,22 +11336,6 @@ "node": ">=6" } }, - "node_modules/cmdk": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", - "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "^1.1.1", - "@radix-ui/react-dialog": "^1.1.6", - "@radix-ui/react-id": "^1.1.0", - "@radix-ui/react-primitive": "^2.0.2" - }, - "peerDependencies": { - "react": "^18 || ^19 || ^19.0.0-rc", - "react-dom": "^18 || ^19 || ^19.0.0-rc" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -10177,12 +11367,12 @@ } }, "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "license": "MIT", "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/concat-map": { @@ -10275,7 +11465,7 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/damerau-levenshtein": { @@ -11533,13 +12723,6 @@ "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==", "license": "MIT" }, - "node_modules/fastestsmallesttextencoderdecoder": { - "version": "1.0.22", - "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", - "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", - "license": "CC0-1.0", - "peer": true - }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -11563,12 +12746,6 @@ "node": ">=16.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "license": "MIT" - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -11630,9 +12807,9 @@ "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "funding": [ { "type": "individual", @@ -11990,7 +13167,20 @@ "integrity": "sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==", "license": "MIT", "engines": { - "node": ">=16.9.0" + "node": ">=16.9.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" } }, "node_modules/humanize-ms": { @@ -12011,6 +13201,22 @@ "node": ">=20.0.0" } }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/idb-keyval": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz", @@ -13368,6 +14574,15 @@ "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", "license": "(Apache-2.0 AND MIT)" }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -13806,9 +15021,9 @@ } }, "node_modules/ox": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.11.3.tgz", - "integrity": "sha512-1bWYGk/xZel3xro3l8WGg6eq4YEKlaqvyMtVhfMFpbJzK2F6rj4EDRtqDCWVEJMkzcmEi9uW2QxsqELokOlarw==", + "version": "0.14.27", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.14.27.tgz", + "integrity": "sha512-+xhLHo/f+f4BH121/1Pomm/1vgBBda1wYiFpTvjSo8o5OcEj76Pf1hGPJiepoYMTQoTm2SKdSBvWkFWk5l07PA==", "funding": [ { "type": "github", @@ -14274,10 +15489,13 @@ "license": "MIT" }, "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } }, "node_modules/pump": { "version": "3.0.3", @@ -14410,22 +15628,6 @@ "react": "^19.2.4" } }, - "node_modules/react-hook-form": { - "version": "7.71.1", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.71.1.tgz", - "integrity": "sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18 || ^19" - } - }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -14794,6 +15996,12 @@ "node": ">=10" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, "node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", @@ -14866,12 +16074,6 @@ "node": ">= 0.4" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, "node_modules/sha.js": { "version": "2.4.12", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", @@ -15036,6 +16238,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/socket.io-client": { "version": "4.8.3", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz", @@ -15661,6 +16875,7 @@ "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -15990,9 +17205,9 @@ } }, "node_modules/viem": { - "version": "2.45.0", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.45.0.tgz", - "integrity": "sha512-iVA9qrAgRdtpWa80lCZ6Jri6XzmLOwwA1wagX2HnKejKeliFLpON0KOdyfqvcy+gUpBVP59LBxP2aKiL3aj8fg==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.52.0.tgz", + "integrity": "sha512-py2QPYe9e1f4DmPJCsXF7zHmyZ0PkJrBxdQZ5dvNXvzy3UzWkUn7dNfC0TMeNm6Qv1tKw3b6qXXExpx6L0oMbw==", "funding": [ { "type": "github", @@ -16007,8 +17222,8 @@ "@scure/bip39": "1.6.0", "abitype": "1.2.3", "isows": "1.0.7", - "ox": "0.11.3", - "ws": "8.18.3" + "ox": "0.14.27", + "ws": "8.20.1" }, "peerDependencies": { "typescript": ">=5.0.4" @@ -16061,27 +17276,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/viem/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "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/wagmi": { "version": "2.19.5", "resolved": "https://registry.npmjs.org/wagmi/-/wagmi-2.19.5.tgz", @@ -16107,444 +17301,6 @@ } } }, - "node_modules/web3": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/web3/-/web3-4.16.0.tgz", - "integrity": "sha512-SgoMSBo6EsJ5GFCGar2E/pR2lcR/xmUSuQ61iK6yDqzxmm42aPPxSqZfJz2z/UCR6pk03u77pU8TGV6lgMDdIQ==", - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "^4.7.1", - "web3-errors": "^1.3.1", - "web3-eth": "^4.11.1", - "web3-eth-abi": "^4.4.1", - "web3-eth-accounts": "^4.3.1", - "web3-eth-contract": "^4.7.2", - "web3-eth-ens": "^4.4.0", - "web3-eth-iban": "^4.0.7", - "web3-eth-personal": "^4.1.0", - "web3-net": "^4.1.0", - "web3-providers-http": "^4.2.0", - "web3-providers-ws": "^4.0.8", - "web3-rpc-methods": "^1.3.0", - "web3-rpc-providers": "^1.0.0-rc.4", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14.0.0", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-4.7.1.tgz", - "integrity": "sha512-9KSeASCb/y6BG7rwhgtYC4CvYY66JfkmGNEYb7q1xgjt9BWfkf09MJPaRyoyT5trdOxYDHkT9tDlypvQWaU8UQ==", - "license": "LGPL-3.0", - "dependencies": { - "web3-errors": "^1.3.1", - "web3-eth-accounts": "^4.3.1", - "web3-eth-iban": "^4.0.7", - "web3-providers-http": "^4.2.0", - "web3-providers-ws": "^4.0.8", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - }, - "optionalDependencies": { - "web3-providers-ipc": "^4.0.7" - } - }, - "node_modules/web3-errors": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/web3-errors/-/web3-errors-1.3.1.tgz", - "integrity": "sha512-w3NMJujH+ZSW4ltIZZKtdbkbyQEvBzyp3JRn59Ckli0Nz4VMsVq8aF1bLWM7A2kuQ+yVEm3ySeNU+7mSRwx7RQ==", - "license": "LGPL-3.0", - "dependencies": { - "web3-types": "^1.10.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-4.11.1.tgz", - "integrity": "sha512-q9zOkzHnbLv44mwgLjLXuyqszHuUgZWsQayD2i/rus2uk0G7hMn11bE2Q3hOVnJS4ws4VCtUznlMxwKQ+38V2w==", - "license": "LGPL-3.0", - "dependencies": { - "setimmediate": "^1.0.5", - "web3-core": "^4.7.1", - "web3-errors": "^1.3.1", - "web3-eth-abi": "^4.4.1", - "web3-eth-accounts": "^4.3.1", - "web3-net": "^4.1.0", - "web3-providers-ws": "^4.0.8", - "web3-rpc-methods": "^1.3.0", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth-abi": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-4.4.1.tgz", - "integrity": "sha512-60ecEkF6kQ9zAfbTY04Nc9q4eEYM0++BySpGi8wZ2PD1tw/c0SDvsKhV6IKURxLJhsDlb08dATc3iD6IbtWJmg==", - "license": "LGPL-3.0", - "dependencies": { - "abitype": "0.7.1", - "web3-errors": "^1.3.1", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth-abi/node_modules/abitype": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.7.1.tgz", - "integrity": "sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==", - "license": "MIT", - "peerDependencies": { - "typescript": ">=4.9.4", - "zod": "^3 >=3.19.1" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "node_modules/web3-eth-abi/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "optional": true, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/web3-eth-accounts": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-4.3.1.tgz", - "integrity": "sha512-rTXf+H9OKze6lxi7WMMOF1/2cZvJb2AOnbNQxPhBDssKOllAMzLhg1FbZ4Mf3lWecWfN6luWgRhaeSqO1l+IBQ==", - "license": "LGPL-3.0", - "dependencies": { - "@ethereumjs/rlp": "^4.0.1", - "crc-32": "^1.2.2", - "ethereum-cryptography": "^2.0.0", - "web3-errors": "^1.3.1", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth-contract": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-4.7.2.tgz", - "integrity": "sha512-3ETqs2pMNPEAc7BVY/C3voOhTUeJdkf2aM3X1v+edbngJLHAxbvxKpOqrcO0cjXzC4uc2Q8Zpf8n8zT5r0eLnA==", - "license": "LGPL-3.0", - "dependencies": { - "@ethereumjs/rlp": "^5.0.2", - "web3-core": "^4.7.1", - "web3-errors": "^1.3.1", - "web3-eth": "^4.11.1", - "web3-eth-abi": "^4.4.1", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth-contract/node_modules/@ethereumjs/rlp": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz", - "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", - "license": "MPL-2.0", - "bin": { - "rlp": "bin/rlp.cjs" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/web3-eth-ens": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-4.4.0.tgz", - "integrity": "sha512-DeyVIS060hNV9g8dnTx92syqvgbvPricE3MerCxe/DquNZT3tD8aVgFfq65GATtpCgDDJffO2bVeHp3XBemnSQ==", - "license": "LGPL-3.0", - "dependencies": { - "@adraffy/ens-normalize": "^1.8.8", - "web3-core": "^4.5.0", - "web3-errors": "^1.2.0", - "web3-eth": "^4.8.0", - "web3-eth-contract": "^4.5.0", - "web3-net": "^4.1.0", - "web3-types": "^1.7.0", - "web3-utils": "^4.3.0", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth-iban": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-4.0.7.tgz", - "integrity": "sha512-8weKLa9KuKRzibC87vNLdkinpUE30gn0IGY027F8doeJdcPUfsa4IlBgNC4k4HLBembBB2CTU0Kr/HAOqMeYVQ==", - "license": "LGPL-3.0", - "dependencies": { - "web3-errors": "^1.1.3", - "web3-types": "^1.3.0", - "web3-utils": "^4.0.7", - "web3-validator": "^2.0.3" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth-personal": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-4.1.0.tgz", - "integrity": "sha512-RFN83uMuvA5cu1zIwwJh9A/bAj0OBxmGN3tgx19OD/9ygeUZbifOL06jgFzN0t+1ekHqm3DXYQM8UfHpXi7yDQ==", - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "^4.6.0", - "web3-eth": "^4.9.0", - "web3-rpc-methods": "^1.3.0", - "web3-types": "^1.8.0", - "web3-utils": "^4.3.1", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-net": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-4.1.0.tgz", - "integrity": "sha512-WWmfvHVIXWEoBDWdgKNYKN8rAy6SgluZ0abyRyXOL3ESr7ym7pKWbfP4fjApIHlYTh8tNqkrdPfM4Dyi6CA0SA==", - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "^4.4.0", - "web3-rpc-methods": "^1.3.0", - "web3-types": "^1.6.0", - "web3-utils": "^4.3.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-providers-http": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-4.2.0.tgz", - "integrity": "sha512-IPMnDtHB7dVwaB7/mMxAZzyq7d5ezfO1+Vw0bNfAeIi7gaDlJiggp85SdyAfOgov8AMUA/dyiY72kQ0KmjXKvQ==", - "license": "LGPL-3.0", - "dependencies": { - "cross-fetch": "^4.0.0", - "web3-errors": "^1.3.0", - "web3-types": "^1.7.0", - "web3-utils": "^4.3.1" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-providers-http/node_modules/cross-fetch": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", - "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.7.0" - } - }, - "node_modules/web3-providers-ipc": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-4.0.7.tgz", - "integrity": "sha512-YbNqY4zUvIaK2MHr1lQFE53/8t/ejHtJchrWn9zVbFMGXlTsOAbNoIoZWROrg1v+hCBvT2c9z8xt7e/+uz5p1g==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "web3-errors": "^1.1.3", - "web3-types": "^1.3.0", - "web3-utils": "^4.0.7" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-providers-ws": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-4.0.8.tgz", - "integrity": "sha512-goJdgata7v4pyzHRsg9fSegUG4gVnHZSHODhNnn6J93ykHkBI1nz4fjlGpcQLUMi4jAMz6SHl9Ibzs2jj9xqPw==", - "license": "LGPL-3.0", - "dependencies": { - "@types/ws": "8.5.3", - "isomorphic-ws": "^5.0.0", - "web3-errors": "^1.2.0", - "web3-types": "^1.7.0", - "web3-utils": "^4.3.1", - "ws": "^8.17.1" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-providers-ws/node_modules/@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/web3-providers-ws/node_modules/isomorphic-ws": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", - "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", - "license": "MIT", - "peerDependencies": { - "ws": "*" - } - }, - "node_modules/web3-rpc-methods": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-rpc-methods/-/web3-rpc-methods-1.3.0.tgz", - "integrity": "sha512-/CHmzGN+IYgdBOme7PdqzF+FNeMleefzqs0LVOduncSaqsppeOEoskLXb2anSpzmQAP3xZJPaTrkQPWSJMORig==", - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "^4.4.0", - "web3-types": "^1.6.0", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-rpc-providers": { - "version": "1.0.0-rc.4", - "resolved": "https://registry.npmjs.org/web3-rpc-providers/-/web3-rpc-providers-1.0.0-rc.4.tgz", - "integrity": "sha512-PXosCqHW0EADrYzgmueNHP3Y5jcSmSwH+Dkqvn7EYD0T2jcsdDAIHqk6szBiwIdhumM7gv9Raprsu/s/f7h1fw==", - "license": "LGPL-3.0", - "dependencies": { - "web3-errors": "^1.3.1", - "web3-providers-http": "^4.2.0", - "web3-providers-ws": "^4.0.8", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-types": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-types/-/web3-types-1.10.0.tgz", - "integrity": "sha512-0IXoaAFtFc8Yin7cCdQfB9ZmjafrbP6BO0f0KT/khMhXKUpoJ6yShrVhiNpyRBo8QQjuOagsWzwSK2H49I7sbw==", - "license": "LGPL-3.0", - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-4.3.3.tgz", - "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", - "license": "LGPL-3.0", - "dependencies": { - "ethereum-cryptography": "^2.0.0", - "eventemitter3": "^5.0.1", - "web3-errors": "^1.3.1", - "web3-types": "^1.10.0", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-utils/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/web3-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/web3-validator/-/web3-validator-2.0.6.tgz", - "integrity": "sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==", - "license": "LGPL-3.0", - "dependencies": { - "ethereum-cryptography": "^2.0.0", - "util": "^0.12.5", - "web3-errors": "^1.2.0", - "web3-types": "^1.6.0", - "zod": "^3.21.4" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-validator/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/webauthn-p256": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/webauthn-p256/-/webauthn-p256-0.0.5.tgz", - "integrity": "sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "license": "MIT", - "dependencies": { - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.4.0" - } - }, "node_modules/webextension-polyfill": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz", @@ -16708,9 +17464,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz", + "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -16860,6 +17616,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zod": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", diff --git a/package.json b/package.json index d5c401d..6cc83cf 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,8 @@ "lint": "eslint ." }, "dependencies": { + "@circle-fin/adapter-circle-wallets": "^1.3.2", + "@circle-fin/app-kit": "^1.7.0", "@circle-fin/developer-controlled-wallets": "^10.0.1", "@radix-ui/react-alert-dialog": "^1.1.15", "@radix-ui/react-dialog": "^1.1.15", From e65e802b51acbf2e8f5dc1db4f91d3f0e5b0c7c9 Mon Sep 17 00:00:00 2001 From: Frederico Dal Grande Date: Thu, 4 Jun 2026 18:13:57 -0300 Subject: [PATCH 2/4] refactor: update transaction status handling and remove unused OpenZeppelin webhook --- app/api/circle/webhook/route.ts | 422 ++++++-------------------- app/api/openzepellin/webhook/route.ts | 83 ----- 2 files changed, 100 insertions(+), 405 deletions(-) delete mode 100644 app/api/openzepellin/webhook/route.ts diff --git a/app/api/circle/webhook/route.ts b/app/api/circle/webhook/route.ts index 37b64c8..3e0c865 100644 --- a/app/api/circle/webhook/route.ts +++ b/app/api/circle/webhook/route.ts @@ -19,23 +19,10 @@ import crypto from "crypto"; import { NextRequest, NextResponse } from "next/server"; import { supabaseAdminClient } from "@/lib/supabase/admin-client"; -import { circleDeveloperSdk } from "@/lib/circle/developer-controlled-wallets-client"; -import { convertToSmallestUnit } from "@/lib/utils/convert-to-smallest-unit"; -import { - CHAIN_IDS_TO_MESSAGE_TRANSMITTER, - CHAIN_IDS_TO_TOKEN_MESSENGER, - CHAIN_IDS_TO_USDC_ADDRESSES, - DESTINATION_DOMAINS, - SupportedChainId, -} from "@/lib/chains"; type CircleNotification = { id?: string; state?: string; - walletId?: string; - contractAddress?: string; - blockchain?: string; - amounts?: string[]; txHash?: string; [k: string]: unknown; }; @@ -102,339 +89,107 @@ async function logWebhookEvent( } } -async function updateTransactionStatus(notification: CircleNotification) { +/** + * Updates USER credit-purchase transactions when Circle confirms the on-chain transfer. + * ADMIN and bridge transactions are handled synchronously by App Kit and logged as + * complete at submission time, so they do not need webhook updates here. + */ +async function updateUserTransactionStatus(notification: CircleNotification) { const mappedStatus = mapCircleStateToStatus(notification.state); if (!mappedStatus) return; - // Find the corresponding transaction in our database using the transaction hash. - const { data: creditTransactions, error: creditTxError } = await supabaseAdminClient - .from("transactions") - // Select the fields needed to update credits - .select("id, status, user_id, credit_amount") - .eq("tx_hash", notification.txHash) - .eq("transaction_type", "USER") - .eq("direction", "credit"); + const { data: creditTransactions, error: creditTxError } = + await supabaseAdminClient + .from("transactions") + .select("id, status, user_id, credit_amount") + .eq("tx_hash", notification.txHash) + .eq("transaction_type", "USER") + .eq("direction", "credit"); if (creditTxError) { console.error("Credit transaction lookup error:", creditTxError); return; } + const statusPriority: Record = { + pending: 1, + confirmed: 2, + complete: 3, + failed: 0, + }; + for (const transaction of creditTransactions || []) { - // Skip if the status is already the one we want to set. if (transaction.status === mappedStatus) continue; - const currentStatus = transaction.status; - - // Don't downgrade status: if already confirmed it ('complete' or 'confirmed'), - // don't revert to 'pending' when Circle sends a pending notification - const statusPriority: Record = { - pending: 1, - confirmed: 2, - complete: 3, - failed: 0, // Failed can override any status - }; - - const currentPriority = statusPriority[currentStatus] || 0; + const currentPriority = statusPriority[transaction.status] || 0; const newPriority = statusPriority[mappedStatus] || 0; - // Only update if new status has higher priority (or it's a failure) - if (mappedStatus !== 'failed' && newPriority <= currentPriority) { - console.log(`Skipping status update for ${transaction.id}: '${currentStatus}' (priority ${currentPriority}) -> '${mappedStatus}' (priority ${newPriority})`); + if (mappedStatus !== "failed" && newPriority <= currentPriority) { + console.log( + `Skipping status downgrade for ${transaction.id}: '${transaction.status}' -> '${mappedStatus}'` + ); continue; } - const isSuccessfulUpdate = (mappedStatus === 'confirmed' || mappedStatus === 'complete'); - const wasAlreadyProcessed = (currentStatus === 'confirmed' || currentStatus === 'complete'); + const isSuccessfulUpdate = + mappedStatus === "confirmed" || mappedStatus === "complete"; + const wasAlreadyProcessed = + transaction.status === "confirmed" || transaction.status === "complete"; - // Only increment credits if the transaction is moving to a success state - // for the first time. This prevents double-crediting. if (isSuccessfulUpdate && !wasAlreadyProcessed) { - console.log(`Transaction ${transaction.id} confirmed. Crediting user ${transaction.user_id} with ${transaction.credit_amount} credits.`); - - const { error: creditsError } = await supabaseAdminClient.rpc("increment_credits", { - user_id_to_update: transaction.user_id, - amount_to_add: transaction.credit_amount, - }); + console.log( + `Transaction ${transaction.id} confirmed. Crediting user ${transaction.user_id} with ${transaction.credit_amount} credits.` + ); + + const { error: creditsError } = await supabaseAdminClient.rpc( + "increment_credits", + { + user_id_to_update: transaction.user_id, + amount_to_add: transaction.credit_amount, + } + ); if (creditsError) { - // Log the error but continue, so we at least update the transaction status. - console.error(`CRITICAL: Failed to increment credits for user ${transaction.user_id} on transaction ${transaction.id}. Error:`, creditsError); + console.error( + `CRITICAL: Failed to increment credits for user ${transaction.user_id} on transaction ${transaction.id}. Error:`, + creditsError + ); } else { console.log(`Successfully credited user ${transaction.user_id}.`); } } - // Update the transaction status regardless of the credit operation. const { error: updateError } = await supabaseAdminClient .from("transactions") - .update({ - status: mappedStatus, - updated_at: new Date().toISOString() - }) + .update({ status: mappedStatus, updated_at: new Date().toISOString() }) .eq("id", transaction.id); if (updateError) { - console.error(`Failed updating transaction status for ${transaction.id}:`, updateError); + console.error( + `Failed updating transaction status for ${transaction.id}:`, + updateError + ); } else { - console.log(`Updated transaction ${transaction.id} status from '${currentStatus}' to '${mappedStatus}'`); + console.log( + `Updated transaction ${transaction.id} status from '${transaction.status}' to '${mappedStatus}'` + ); } } } -async function updateAdminTransactionStatus( - transactionId: string, - notification: CircleNotification -) { - if (notification.state !== "CONFIRMED" && notification.state !== "COMPLETE") { - return; - } - - // Prepare update object - include tx_hash if available - const updateData: { status: string; updated_at: string; tx_hash?: string } = { - status: notification.state.toLowerCase(), - updated_at: new Date().toISOString() - }; - - if (notification.txHash) { - updateData.tx_hash = notification.txHash; - } - - const { data: transaction, error } = await supabaseAdminClient - .from("transactions") - .update(updateData) - .eq("circle_transaction_id", transactionId) - .neq("transaction_type", "USER") // Only update admin transactions - .select(`*, admin_wallets!source_wallet_id(circle_wallet_id, chain)`) - .single(); - - if (error) { - return; - } - - const adminWallet = Array.isArray(transaction.admin_wallets) - ? transaction.admin_wallets[0] - : transaction.admin_wallets; - - console.log(`Updated admin transaction ${transactionId} (type: ${transaction.transaction_type}) status to ${notification.state}`); - - if (notification.state === "COMPLETE" && notification.blockchain !== "ARC-TESTNET") { - return; - } - - // Only proceed with CCTP logic if the destination is an internal admin wallet - const { data: destinationWallet, error: destinationWalletError } = await supabaseAdminClient - .from("admin_wallets") - .select("id, chain, address, circle_wallet_id") - .eq("address", transaction.destination_address) - .single(); - - if (destinationWalletError || !destinationWallet) { - // This is expected for external wallet transfers - not an error - console.log(`External wallet transfer detected (destination: ${transaction.destination_address}). No CCTP bridging needed.`); - return; - } - - if (transaction.transaction_type === "CCTP_APPROVAL") { - console.log("[CCTP] Approval confirmed. Now, burning USDC from source wallet..."); - - const sourceChainKey = adminWallet.chain.replace(/-/g, '_'); - const sourceChainId = SupportedChainId[sourceChainKey as keyof typeof SupportedChainId]; - const destinationChainKey = destinationWallet.chain.replace(/-/g, '_'); - const destinationChainId = SupportedChainId[destinationChainKey as keyof typeof SupportedChainId]; - - if (sourceChainId === undefined || destinationChainId === undefined) { - throw new Error(`Unsupported chain. Source: ${adminWallet.chain}, Destination: ${destinationWallet.chain}`); - } - - const tokenMessengerAddress = CHAIN_IDS_TO_TOKEN_MESSENGER[sourceChainId]; - const usdcContractAddress = CHAIN_IDS_TO_USDC_ADDRESSES[sourceChainId]; - const destinationDomain = DESTINATION_DOMAINS[destinationChainId]; - - if (!tokenMessengerAddress || !usdcContractAddress || destinationDomain === undefined) { - throw new Error("Could not find required CCTP configuration for the given chains."); - } - - const finalDestinationAddress = destinationWallet.address; - const mintRecipientBytes32 = `0x${'0'.repeat(24)}${finalDestinationAddress.substring(2)}`; - const hookDataBytes32 = `0x${'0'.repeat(64)}`; - const amount = BigInt(convertToSmallestUnit(transaction.amount_usdc.toString())); - const maxFee = amount > 1n ? amount - 1n : 0n; - - const burnAbiParameters = [ - amount.toString(), - destinationDomain.toString(), - mintRecipientBytes32, - usdcContractAddress, - hookDataBytes32, - maxFee.toString(), - "1000" - ]; - - const burnResponse = await circleDeveloperSdk.createContractExecutionTransaction({ - walletId: adminWallet.circle_wallet_id, - abiFunctionSignature: "depositForBurn(uint256,uint32,bytes32,address,bytes32,uint256,uint32)", - abiParameters: burnAbiParameters, - contractAddress: tokenMessengerAddress, - fee: { type: "level", config: { feeLevel: "MEDIUM" } } - }); - - if (!burnResponse.data?.id) { - throw new Error("Failed to initiate burn step of CCTP transfer."); - } - - await supabaseAdminClient.from("transactions").insert({ - transaction_type: "CCTP_BURN", - circle_transaction_id: burnResponse.data.id, - source_wallet_id: transaction.source_wallet_id, - destination_address: transaction.destination_address, - amount_usdc: transaction.amount_usdc, - asset: "USDC", - chain: destinationWallet.chain, - wallet_id: transaction.destination_address, - idempotency_key: `admin:${burnResponse.data.id}`, - status: "pending" - }); - return; - } - - if (transaction.transaction_type === "CCTP_BURN") { - console.log("[CCTP] Burn confirmed. Fetching attestation via v2 API..."); - - const transactionResponse = await circleDeveloperSdk.getTransaction({ id: transaction.circle_transaction_id }); - if (!transactionResponse.data?.transaction?.txHash) { - throw new Error("Transaction hash is missing from the response."); - } - const transactionHash = transactionResponse.data.transaction.txHash as `0x${string}`; - - const sourceChainKey = transactionResponse.data.transaction.blockchain.replace(/_/g, '-'); - const sourceChainEnumKey = sourceChainKey.replace(/-/g, '_'); - const sourceChainId = SupportedChainId[sourceChainEnumKey as keyof typeof SupportedChainId]; - const sourceDomain = DESTINATION_DOMAINS[sourceChainId]; - - if (sourceDomain === undefined) { - throw new Error(`Unknown source chain for CCTP v2: ${sourceChainKey}`); - } - - const irisUrl = `https://iris-api-sandbox.circle.com/v2/messages/${sourceDomain}?transactionHash=${transactionHash}`; - let irisMessageObject: Record | null = null; - - while (!irisMessageObject) { - try { - const response = await fetch(irisUrl); - if (response.status === 404) { - console.log("[CCTP] Waiting for message to be indexed by Iris..."); - } else if (response.ok) { - const responseData = await response.json(); - if (responseData.messages && responseData.messages[0]?.status === 'complete') { - irisMessageObject = responseData.messages[0]; - break; - } else { - console.log("[CCTP] Attestation is not yet complete. Waiting..."); - } - } else { - console.error(`[CCTP] Iris API returned an error: ${response.status}`); - } - } catch (error) { - console.error("[CCTP] Error fetching from Iris API:", error); - } - await new Promise((r) => setTimeout(r, 5000)); - } - - if (!irisMessageObject) { - throw new Error("Failed to retrieve a complete attestation from the Iris API."); - } - - console.log("[CCTP] Attestation received successfully."); - const messageBytes = irisMessageObject.message; - const attestation = irisMessageObject.attestation; - - console.log("[CCTP] Relaying mint transaction via Circle Bridge Kit..."); - - const destinationChainKey = destinationWallet.chain.replace(/-/g, '_'); - const destinationChainId = SupportedChainId[destinationChainKey as keyof typeof SupportedChainId]; - const messageTransmitterAddress = CHAIN_IDS_TO_MESSAGE_TRANSMITTER[destinationChainId]; - - if (!messageTransmitterAddress) { - throw new Error(`Could not find MessageTransmitter address for chain: ${destinationWallet.chain}`); - } - - // Use Circle Wallets (Developer-Controlled Wallets) to execute receiveMessage on destination. - // This follows the Circle Wallets adapter setup for Bridge Kit: execute via Circle Wallets API. - const abiFunctionSignature = "receiveMessage(bytes,bytes)"; - const abiParameters = [messageBytes, attestation]; - - // We execute on the destination admin wallet (internal wallet check already passed). - const execResp = await circleDeveloperSdk.createContractExecutionTransaction({ - walletId: destinationWallet.circle_wallet_id ?? adminWallet.circle_wallet_id, - contractAddress: messageTransmitterAddress, - abiFunctionSignature, - abiParameters, - fee: { type: "level", config: { feeLevel: "MEDIUM" } } - }); - - if (!execResp.data?.id) { - throw new Error("Failed to relay mint via Circle Wallets."); - } - - const txHash = execResp.data.id; - - console.log(`[CCTP] Mint transaction submitted via Bridge Kit. txHash: ${txHash}`); - - // Dedupe: avoid creating multiple CCTP_MINT rows for the same burn or Circle tx. - const { data: existingMintByTxId } = await supabaseAdminClient - .from("transactions") - .select("id") - .eq("transaction_type", "CCTP_MINT") - .eq("circle_transaction_id", txHash) - .maybeSingle(); - - const { data: existingMintByBurnMeta } = await supabaseAdminClient - .from("transactions") - .select("id") - .eq("transaction_type", "CCTP_MINT") - .contains("metadata", { cctp_burn_tx_id: transaction.id }) - .maybeSingle(); - - if (existingMintByTxId || existingMintByBurnMeta) { - console.log(`[CCTP] Mint transaction already recorded. Skipping duplicate insert. txId: ${txHash}, burnId: ${transaction.id}`); - return; - } - - const { error: insertError } = await supabaseAdminClient.from("transactions").insert({ - transaction_type: "CCTP_MINT", - circle_transaction_id: txHash, - source_wallet_id: transaction.source_wallet_id, - destination_address: transaction.destination_address, - amount_usdc: transaction.amount_usdc, - asset: "USDC", - chain: destinationWallet.chain, - wallet_id: transaction.destination_address, - idempotency_key: `admin:${txHash}`, - status: "pending", - metadata: { cctp_burn_tx_id: transaction.id } - }); - - if (insertError) { - if ("code" in insertError && insertError.code === "23505") { - // Unique constraint hit (e.g., idempotency_key). Treat as success and continue. - console.log("[CCTP] Mint insert deduped by unique constraint."); - } else { - console.error(`[CCTP] Failed to insert CCTP_MINT record. Error: ${insertError.message}`); - throw insertError; - } - } - return; - } -} - -async function verifyCircleSignature(bodyString: string, signature: string, keyId: string): Promise { +async function verifyCircleSignature( + bodyString: string, + signature: string, + keyId: string +): Promise { try { const publicKey = await getCirclePublicKey(keyId); const verifier = crypto.createVerify("SHA256"); verifier.update(bodyString); verifier.end(); - const signatureUint8Array = Uint8Array.from(Buffer.from(signature, "base64")); + const signatureUint8Array = Uint8Array.from( + Buffer.from(signature, "base64") + ); return verifier.verify(publicKey, signatureUint8Array); } catch (e) { console.error("Signature verification failure:", e); @@ -446,10 +201,16 @@ async function getCirclePublicKey(keyId: string) { if (!process.env.CIRCLE_API_KEY) { throw new Error("Circle API key is not set"); } - const response = await fetch(`https://api.circle.com/v2/notifications/publicKey/${keyId}`, { - method: "GET", - headers: { Accept: "application/json", Authorization: `Bearer ${process.env.CIRCLE_API_KEY}` }, - }); + const response = await fetch( + `https://api.circle.com/v2/notifications/publicKey/${keyId}`, + { + method: "GET", + headers: { + Accept: "application/json", + Authorization: `Bearer ${process.env.CIRCLE_API_KEY}`, + }, + } + ); if (!response.ok) { throw new Error(`Failed to fetch public key: ${response.statusText}`); } @@ -458,7 +219,11 @@ async function getCirclePublicKey(keyId: string) { if (typeof rawPublicKey !== "string") { throw new Error("Invalid public key format"); } - return ["-----BEGIN PUBLIC KEY-----", ...(rawPublicKey.match(/.{1,64}/g) ?? []), "-----END PUBLIC KEY-----"].join("\n"); + return [ + "-----BEGIN PUBLIC KEY-----", + ...(rawPublicKey.match(/.{1,64}/g) ?? []), + "-----END PUBLIC KEY-----", + ].join("\n"); } export async function POST(req: NextRequest) { @@ -467,7 +232,10 @@ export async function POST(req: NextRequest) { const keyId = req.headers.get("x-circle-key-id"); if (!signature || !keyId) { - return NextResponse.json({ error: "Missing signature or keyId in headers" }, { status: 400 }); + return NextResponse.json( + { error: "Missing signature or keyId in headers" }, + { status: 400 } + ); } const rawBody = await req.text(); @@ -487,35 +255,45 @@ export async function POST(req: NextRequest) { console.log("Circle webhook notification:", body); if (!body.subscriptionId || !body.notificationId || !body.notificationType) { - return NextResponse.json({ error: "Malformed webhook payload - missing required fields" }, { status: 422 }); + return NextResponse.json( + { error: "Malformed webhook payload - missing required fields" }, + { status: 422 } + ); } const notification = body.notification; if (!notification) { - return NextResponse.json({ error: "Malformed notification payload" }, { status: 422 }); + return NextResponse.json( + { error: "Malformed notification payload" }, + { status: 422 } + ); } - const circleEventId = body.notificationId; - const circleTransactionId = notification.id; const mappedStatus = mapCircleStateToStatus(notification.state); - - await logWebhookEvent(rawBody, body, circleEventId, circleTransactionId, mappedStatus, isVerified); + await logWebhookEvent( + rawBody, + body, + body.notificationId, + notification.id, + mappedStatus, + isVerified + ); if (body.notificationType === "webhooks.test") { console.log("Received test webhook notification - validation successful"); return NextResponse.json({ received: true }, { status: 200 }); } - if (circleTransactionId) { - await updateTransactionStatus(notification); - await updateAdminTransactionStatus(circleTransactionId, notification); - } + await updateUserTransactionStatus(notification); return NextResponse.json({ received: true }, { status: 200 }); } catch (error) { console.error("Failed to process Circle webhook:", error); const message = error instanceof Error ? error.message : "Unknown error"; - return NextResponse.json({ error: `Failed to process notification: ${message}` }, { status: 500 }); + return NextResponse.json( + { error: `Failed to process notification: ${message}` }, + { status: 500 } + ); } } diff --git a/app/api/openzepellin/webhook/route.ts b/app/api/openzepellin/webhook/route.ts deleted file mode 100644 index d69dda2..0000000 --- a/app/api/openzepellin/webhook/route.ts +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Copyright 2025 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 { NextRequest, NextResponse } from "next/server"; -import { supabaseAdminClient } from "@/lib/supabase/admin-client"; - -// This interface is a simplified version of the relayer's payload. -interface RelayerNotificationPayload { - payload_type: "transaction"; - id: string; // This is the relayer's transaction ID - status: "sent" | "confirmed" | "failed"; -} - -export async function POST(req: NextRequest) { - try { - // In production, you would verify the signature from the relayer - // using the WEBHOOK_SIGNING_KEY you configured. - const body = await req.json(); - const notification = body.payload as RelayerNotificationPayload; - - console.log("Received notification from OpenZeppelin Relayer:", notification); - - // We only care about the final states: 'confirmed' or 'failed'. - if (notification.status !== "confirmed" && notification.status !== "failed") { - return NextResponse.json({ received: true }); - } - - // Find the CCTP_MINT transaction that corresponds to this relayer transaction ID. - const { data: transaction, error } = await supabaseAdminClient - .from("transactions") - .select("id, status") - .eq("circle_transaction_id", notification.id) - .eq("transaction_type", "CCTP_MINT") - .single(); - - if (error || !transaction) { - console.warn(`No matching CCTP_MINT transaction found for relayer txId: ${notification.id}`); - return NextResponse.json({ received: true }); - } - - // Determine the new status (lowercase to match transaction_status enum) - const newStatus = notification.status === "confirmed" ? "complete" : "failed"; - - // Idempotency check: If the status is already correct, do nothing. - if (transaction.status === newStatus) { - return NextResponse.json({ received: true }); - } - - // Update the transaction status to complete or failed. - const { error: updateError } = await supabaseAdminClient - .from("transactions") - .update({ status: newStatus, updated_at: new Date().toISOString() }) - .eq("id", transaction.id); - - if (updateError) { - throw new Error(`Failed to update admin transaction ${transaction.id}: ${updateError.message}`); - } - - console.log(`[CCTP] Finalized transaction ${transaction.id} with status ${newStatus}`); - - return NextResponse.json({ received: true }); - - } catch (error) { - console.error("Failed to process OpenZeppelin webhook:", error); - const message = error instanceof Error ? error.message : "Unknown error"; - return NextResponse.json({ error: message }, { status: 500 }); - } -} \ No newline at end of file From ddeae16ddb9505e0a938bd4e36e927be61d7a633 Mon Sep 17 00:00:00 2001 From: Frederico Dal Grande Date: Thu, 4 Jun 2026 18:14:20 -0300 Subject: [PATCH 3/4] refactor: integrate App Kit for wallet operations and enhance chain handling --- lib/actions/admin-wallets.ts | 321 ++++++++++++++++------------------- lib/chains.ts | 47 +++-- lib/circle/app-kit-client.ts | 34 ++++ lib/circle/permit.ts | 195 --------------------- 4 files changed, 197 insertions(+), 400 deletions(-) create mode 100644 lib/circle/app-kit-client.ts delete mode 100644 lib/circle/permit.ts diff --git a/lib/actions/admin-wallets.ts b/lib/actions/admin-wallets.ts index 56b7fec..cc2caaf 100644 --- a/lib/actions/admin-wallets.ts +++ b/lib/actions/admin-wallets.ts @@ -19,19 +19,22 @@ "use server"; import { revalidatePath } from "next/cache"; +import { createPublicClient, http, erc20Abi } from "viem"; import { Database } from "@/types/supabase"; -import { circleDeveloperSdk } from "@/lib/circle/developer-controlled-wallets-client"; -import { convertToSmallestUnit } from "@/lib/utils/convert-to-smallest-unit"; import { supabaseAdminClient } from "@/lib/supabase/admin-client"; -import { CHAIN_IDS_TO_TOKEN_MESSENGER, CHAIN_IDS_TO_USDC_ADDRESSES, SupportedChainId } from "@/lib/chains"; +import { Blockchain, BridgeChain } from "@circle-fin/app-kit"; +import { getAppKit, createAdapter } from "@/lib/circle/app-kit-client"; +import { + SupportedChainId, + CHAIN_IDS_TO_USDC_ADDRESSES, + CHAIN_DB_TO_BRIDGE_CHAIN, + CHAIN_DB_TO_RPC, +} from "@/lib/chains"; const baseUrl = process.env.NEXT_PUBLIC_VERCEL_URL ? `https://${process.env.NEXT_PUBLIC_VERCEL_URL}` : "http://localhost:3000"; -const circleApiKey = process.env.CIRCLE_API_KEY; -const circleApiBaseUrl = "https://api.circle.com"; - type WalletStatus = Database["public"]["Enums"]["admin_wallet_status"]; export interface TokenBalance { @@ -44,35 +47,16 @@ export interface TokenBalance { amount: string; } -interface AxiosErrorLike { - isAxiosError: true; - response?: { - data?: { - message?: string; - }; - }; -} - -function isAxiosError(error: unknown): error is AxiosErrorLike { - return ( - typeof error === "object" && - error !== null && - (error as AxiosErrorLike).isAxiosError === true - ); -} - /** * Creates a new Circle wallet via internal API routes and saves it to the database. */ export async function createAdminWallet(formData: FormData) { const label = formData.get("label") as string; - // Get the blockchain from the form data. const blockchain = formData.get("blockchain") as string; if (!label || label.trim().length < 3) { return { error: "Label must be at least 3 characters long." }; } - // Add a check for the blockchain if (!blockchain) { return { error: "Blockchain is a required field." }; } @@ -87,13 +71,9 @@ export async function createAdminWallet(formData: FormData) { throw new Error("Failed to create wallet set."); const createdWalletSet = await createdWalletSetResponse.json(); - // Pass the selected blockchain to the /api/wallet endpoint. const createdWalletResponse = await fetch(`${baseUrl}/api/wallet`, { method: "POST", - body: JSON.stringify({ - walletSetId: createdWalletSet.id, - blockchain, - }), + body: JSON.stringify({ walletSetId: createdWalletSet.id, blockchain }), headers: { "Content-Type": "application/json" }, }); if (!createdWalletResponse.ok) throw new Error("Failed to create wallet."); @@ -140,58 +120,67 @@ export async function updateAdminWalletStatus( } catch (error: unknown) { const message = error instanceof Error ? error.message : "An unexpected error occurred."; - console.error( - `Error updating wallet ${id} to status ${status}:`, - message - ); + console.error(`Error updating wallet ${id} to status ${status}:`, message); return { error: message }; } } /** - * Fetches the token balances for a specific Circle wallet using a direct API call. + * Fetches the USDC balance for an admin wallet by reading directly from the chain. */ export async function getWalletBalance( - walletId: string + walletAddress: string, + chainDbString: string ): Promise<{ balances?: TokenBalance[]; error?: string }> { - if (!circleApiKey) { - const message = "Circle API Key is not configured on the server."; - console.error(message); - return { error: message }; - } - try { - const url = `${circleApiBaseUrl}/v1/w3s/wallets/${walletId}/balances?includeAll=true`; - const options = { - method: "GET", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${circleApiKey}`, - }, - }; - - const response = await fetch(url, options); - const responseBody = await response.json(); - - if (!response.ok) { - throw new Error( - responseBody.message || "Failed to fetch balances from Circle API." - ); + const chainKey = chainDbString.replace(/-/g, "_"); + const chainId = + SupportedChainId[chainKey as keyof typeof SupportedChainId]; + const usdcAddress = CHAIN_IDS_TO_USDC_ADDRESSES[chainId]; + const rpcUrl = CHAIN_DB_TO_RPC[chainDbString]; + + if (!usdcAddress || !rpcUrl) { + return { error: `Unsupported chain: ${chainDbString}` }; } - const balances = responseBody.data.tokenBalances as TokenBalance[] | undefined; + const client = createPublicClient({ transport: http(rpcUrl) }); + const rawBalance = await client.readContract({ + address: usdcAddress, + abi: erc20Abi, + functionName: "balanceOf", + args: [walletAddress as `0x${string}`], + }); - return { balances: balances ?? [] }; + const decimals = 6; + const amount = (Number(rawBalance) / 10 ** decimals).toString(); + + return { + balances: [ + { + token: { + blockchain: chainDbString, + name: "USD Coin", + symbol: "USDC", + decimals, + }, + amount, + }, + ], + }; } catch (error: unknown) { const message = error instanceof Error ? error.message : "An unexpected error occurred."; - console.error(`Error fetching balance for wallet ${walletId}:`, message); + console.error( + `Error fetching on-chain balance for ${walletAddress}:`, + message + ); return { error: message }; } } /** - * Initiates a transfer from a developer-controlled admin wallet and logs the transaction. + * Transfers USDC from an admin wallet to a destination address on the same chain + * using App Kit Send. */ export async function transferFromAdminWallet( sourceCircleWalletId: string, @@ -199,7 +188,6 @@ export async function transferFromAdminWallet( amount: string ) { try { - // Fetch the source wallet's internal DB ID, chain, and address from our database. const { data: sourceWallet, error: fetchError } = await supabaseAdminClient .from("admin_wallets") .select("id, chain, address") @@ -210,62 +198,41 @@ export async function transferFromAdminWallet( throw new Error("Source wallet not found in the database."); } - // 1. Convert the chain string (e.g., "ETH-SEPOLIA") to its corresponding enum key. - const sourceChainKey = sourceWallet.chain.replace(/-/g, '_'); - const sourceChainId = SupportedChainId[sourceChainKey as keyof typeof SupportedChainId]; - - if (sourceChainId === undefined) { - throw new Error(`Unsupported source chain for transfer: ${sourceWallet.chain}`); + const bridgeChain = CHAIN_DB_TO_BRIDGE_CHAIN[sourceWallet.chain ?? ""]; + if (!bridgeChain) { + throw new Error( + `Unsupported source chain for transfer: ${sourceWallet.chain}` + ); } - // 2. Look up the correct USDC contract address for the source chain. - const usdcContractAddress = CHAIN_IDS_TO_USDC_ADDRESSES[sourceChainId]; + const kit = getAppKit(); + const adapter = createAdapter(); - if (!usdcContractAddress) { - throw new Error(`Could not find a USDC contract address for chain: ${sourceWallet.chain}`); - } - - // 3. Use the robust `createContractExecutionTransaction` to call the `transfer` function. - const response = await circleDeveloperSdk.createContractExecutionTransaction({ - walletId: sourceCircleWalletId, - contractAddress: usdcContractAddress, // The USDC contract on the source chain - abiFunctionSignature: "transfer(address,uint256)", - abiParameters: [ - destinationAddress, - convertToSmallestUnit(amount).toString(), - ], - fee: { - type: "level", - config: { - feeLevel: "HIGH", - }, + const result = await kit.send({ + from: { + adapter, + chain: bridgeChain as Blockchain, + address: sourceWallet.address, }, + to: destinationAddress, + amount, + token: "USDC", }); - const transactionData = response.data; - - if (!transactionData?.id) { - throw new Error("Failed to initiate transfer with Circle API."); - } - - // Convert chain name to numeric chain ID - const chainKey = (sourceWallet.chain || "").replace(/-/g, '_'); - const chainId = SupportedChainId[chainKey as keyof typeof SupportedChainId]; - - // Log the new transaction to the unified `transactions` table. const { error: insertError } = await supabaseAdminClient .from("transactions") .insert({ transaction_type: "ADMIN", - circle_transaction_id: transactionData.id, + circle_transaction_id: result.txHash, + tx_hash: result.txHash, source_wallet_id: sourceWallet.id, destination_address: destinationAddress, amount_usdc: Number(amount), asset: "USDC", - chain: chainId ? String(chainId) : sourceWallet.chain || "UNKNOWN", - wallet_id: sourceWallet.address, // Source wallet address, not destination - idempotency_key: `admin:${transactionData.id}`, - status: "pending" + chain: sourceWallet.chain ?? "UNKNOWN", + wallet_id: sourceWallet.address, + idempotency_key: `admin:${result.txHash}`, + status: "complete", }); if (insertError) { @@ -276,17 +243,10 @@ export async function transferFromAdminWallet( } revalidatePath("/dashboard"); - return { success: true, transactionId: transactionData.id }; + return { success: true, txHash: result.txHash }; } catch (error: unknown) { - let message = "An unexpected error occurred."; - - if (isAxiosError(error)) { - message = - error.response?.data?.message || "An unknown Circle API error occurred."; - } else if (error instanceof Error) { - message = error.message; - } - + const message = + error instanceof Error ? error.message : "An unexpected error occurred."; console.error( `Error transferring from wallet ${sourceCircleWalletId}:`, message @@ -295,18 +255,16 @@ export async function transferFromAdminWallet( } } +/** + * Bridges USDC from an admin wallet to a destination address on a different chain + * using App Kit Bridge (CCTPv2 Fast). Blocks until the full bridge is complete. + */ export async function transferFromAdminWalletCCTP( sourceCircleWalletId: string, destinationAddress: string, amount: string ) { - - console.log("[CCTP] Approving USDC transfer from source wallet..."); - - const formattedAmount = convertToSmallestUnit(amount); - try { - // Fetch the source wallet's internal DB ID, chain, and address from our database. const { data: sourceWallet, error: fetchError } = await supabaseAdminClient .from("admin_wallets") .select("id, chain, address") @@ -317,65 +275,74 @@ export async function transferFromAdminWalletCCTP( throw new Error("Source wallet not found in the database."); } - // Convert the dash-separated chain string from the DB to the underscore-separated enum key format. - const chainKey = sourceWallet.chain.replace(/-/g, '_'); - - // Get the numerical chain ID from the string stored in the database. - const sourceChainId = SupportedChainId[chainKey as keyof typeof SupportedChainId]; + const { data: destinationWallet, error: destFetchError } = + await supabaseAdminClient + .from("admin_wallets") + .select("chain") + .eq("address", destinationAddress) + .single(); - if (sourceChainId === undefined) { - throw new Error(`Unsupported source chain: ${sourceWallet.chain}. Please check the configuration.`); + if (destFetchError || !destinationWallet?.chain) { + throw new Error( + `Could not resolve destination chain for address: ${destinationAddress}` + ); } - // Look up the correct contract addresses using the chain ID. - const tokenMessengerAddress = CHAIN_IDS_TO_TOKEN_MESSENGER[sourceChainId]; - const usdcContractAddress = CHAIN_IDS_TO_USDC_ADDRESSES[sourceChainId]; + const sourceChain = CHAIN_DB_TO_BRIDGE_CHAIN[sourceWallet.chain ?? ""]; + const destinationChain = + CHAIN_DB_TO_BRIDGE_CHAIN[destinationWallet.chain]; - if (!tokenMessengerAddress || !usdcContractAddress) { - throw new Error(`Contract addresses for chain ID ${sourceChainId} are not defined.`); + if (!sourceChain) { + throw new Error( + `Unsupported source chain: ${sourceWallet.chain}` + ); + } + if (!destinationChain) { + throw new Error( + `Unsupported destination chain: ${destinationWallet.chain}` + ); } - const approvalResponse = await circleDeveloperSdk.createContractExecutionTransaction({ - walletId: sourceCircleWalletId, - abiFunctionSignature: "approve(address,uint256)", - abiParameters: [ - // Use the dynamically looked-up Token Messenger address - tokenMessengerAddress, - formattedAmount.toString() - ], - // Use the dynamically looked-up USDC contract address - contractAddress: usdcContractAddress, - fee: { - type: "level", - config: { - feeLevel: "MEDIUM", - }, + const kit = getAppKit(); + const adapter = createAdapter(); + + const result = await kit.bridge({ + from: { + adapter, + chain: sourceChain as BridgeChain, + address: sourceWallet.address, + }, + to: { + adapter, + chain: destinationChain as BridgeChain, + address: destinationAddress, }, + amount, + token: "USDC", + config: { transferSpeed: "FAST" }, }); - if (!approvalResponse.data?.id) { - throw new Error("Failed to initiate CCTP transfer with Circle API."); - } + const txHash = + result.steps?.at(-1)?.txHash ?? result.steps?.[0]?.txHash ?? sourceCircleWalletId; + const status = result.state === "success" ? "complete" : "pending"; - // Log the new transaction to the unified `transactions` table. const { error: insertError } = await supabaseAdminClient .from("transactions") .insert({ - transaction_type: "CCTP_APPROVAL", - circle_transaction_id: approvalResponse.data.id, - source_wallet_id: sourceWallet.id, // Use the internal DB ID + transaction_type: "ADMIN", + circle_transaction_id: txHash, + tx_hash: txHash, + source_wallet_id: sourceWallet.id, destination_address: destinationAddress, amount_usdc: Number(amount), asset: "USDC", - chain: String(sourceChainId), // Use numeric chain ID - wallet_id: sourceWallet.address, // Source wallet address, not destination - idempotency_key: `admin:${approvalResponse.data.id}`, - status: "pending" + chain: sourceWallet.chain ?? "UNKNOWN", + wallet_id: sourceWallet.address, + idempotency_key: `admin:${txHash}`, + status, }); if (insertError) { - // Log this as a critical error but don't fail the entire operation, - // as the on-chain transaction has already been submitted. console.error( "CRITICAL: Failed to log transaction to database:", insertError.message @@ -383,19 +350,12 @@ export async function transferFromAdminWalletCCTP( } revalidatePath("/dashboard"); - return { transactionId: approvalResponse.data.id } - } catch (error) { - let message = "An unexpected error occurred."; - - if (isAxiosError(error)) { - message = - error.response?.data?.message || "An unknown Circle API error occurred."; - } else if (error instanceof Error) { - message = error.message; - } - + return { success: true, txHash }; + } catch (error: unknown) { + const message = + error instanceof Error ? error.message : "An unexpected error occurred."; console.error( - `Error transferring from wallet ${sourceCircleWalletId}:`, + `Error bridging from wallet ${sourceCircleWalletId}:`, message ); return { error: message }; @@ -404,7 +364,6 @@ export async function transferFromAdminWalletCCTP( /** * Fetches all admin wallet addresses for filtering realtime subscriptions. - * Uses admin client to bypass RLS restrictions. */ export async function getAdminWalletAddresses(): Promise { try { @@ -413,13 +372,19 @@ export async function getAdminWalletAddresses(): Promise { .select("address"); if (error) { - console.error("[Server Action] Error fetching admin wallet addresses:", error); + console.error( + "[Server Action] Error fetching admin wallet addresses:", + error + ); return []; } - return data?.map(w => w.address) || []; + return data?.map((w) => w.address) || []; } catch (error) { - console.error("[Server Action] Unexpected error fetching admin wallet addresses:", error); + console.error( + "[Server Action] Unexpected error fetching admin wallet addresses:", + error + ); return []; } -} \ No newline at end of file +} diff --git a/lib/chains.ts b/lib/chains.ts index 85ead4b..21d7d8b 100644 --- a/lib/chains.ts +++ b/lib/chains.ts @@ -25,9 +25,6 @@ export enum SupportedChainId { ARC_TESTNET = 5042002 } -export const DEFAULT_MAX_FEE = 1000n; -export const DEFAULT_FINALITY_THRESHOLD = 2000; - export const CHAIN_TO_CHAIN_NAME: Record = { [SupportedChainId.ETH_SEPOLIA]: "Ethereum Sepolia", [SupportedChainId.AVAX_FUJI]: "Avalanche Fuji", @@ -35,6 +32,14 @@ export const CHAIN_TO_CHAIN_NAME: Record = { [SupportedChainId.ARC_TESTNET]: "Arc Testnet" }; +export const SUPPORTED_CHAINS = [ + SupportedChainId.ETH_SEPOLIA, + SupportedChainId.AVAX_FUJI, + SupportedChainId.BASE_SEPOLIA, + SupportedChainId.ARC_TESTNET +]; + +// USDC contract addresses per chain — used for on-chain balance reads. export const CHAIN_IDS_TO_USDC_ADDRESSES: Record = { [SupportedChainId.ETH_SEPOLIA]: "0x1c7d4b196cb0c7b01d743fbc6116a902379c7238", [SupportedChainId.AVAX_FUJI]: "0x5425890298aed601595a70AB815c96711a31Bc65", @@ -42,13 +47,6 @@ export const CHAIN_IDS_TO_USDC_ADDRESSES: Record = { [SupportedChainId.ARC_TESTNET]: "0x3600000000000000000000000000000000000000" }; -export const CHAIN_IDS_TO_TOKEN_MESSENGER: Record = { - [SupportedChainId.ETH_SEPOLIA]: "0x8fe6b999dc680ccfdd5bf7eb0974218be2542daa", - [SupportedChainId.AVAX_FUJI]: "0x8fe6b999dc680ccfdd5bf7eb0974218be2542daa", - [SupportedChainId.BASE_SEPOLIA]: "0x8fe6b999dc680ccfdd5bf7eb0974218be2542daa", - [SupportedChainId.ARC_TESTNET]: "0x8fe6b999dc680ccfdd5bf7eb0974218be2542daa" -}; - export const CHAIN_IDS_TO_USDC_TOKEN_ID: Record = { [SupportedChainId.ETH_SEPOLIA]: "b1698135-ebb1-5e40-9c3b-6a1213f4b754", [SupportedChainId.AVAX_FUJI]: "da27d231-a690-5521-a2f3-1873b4134155", @@ -56,23 +54,18 @@ export const CHAIN_IDS_TO_USDC_TOKEN_ID: Record = { [SupportedChainId.ARC_TESTNET]: "15dc2b5d-0994-58b0-bf8c-3a0501148ee8" }; -export const CHAIN_IDS_TO_MESSAGE_TRANSMITTER: Record = { - [SupportedChainId.ETH_SEPOLIA]: "0xe737e5cebeeba77efe34d4aa090756590b1ce275", - [SupportedChainId.AVAX_FUJI]: "0xe737e5cebeeba77efe34d4aa090756590b1ce275", - [SupportedChainId.BASE_SEPOLIA]: "0xe737e5cebeeba77efe34d4aa090756590b1ce275", - [SupportedChainId.ARC_TESTNET]: "0xe737e5cebeeba77efe34d4aa090756590b1ce275" +// Maps Circle/DB chain strings (e.g. "ARC-TESTNET") to App Kit BridgeChain identifiers. +export const CHAIN_DB_TO_BRIDGE_CHAIN: Record = { + "ARC-TESTNET": "Arc_Testnet", + "ETH-SEPOLIA": "Ethereum_Sepolia", + "BASE-SEPOLIA": "Base_Sepolia", + "AVAX-FUJI": "Avalanche_Fuji", }; -export const DESTINATION_DOMAINS: Record = { - [SupportedChainId.ETH_SEPOLIA]: 0, - [SupportedChainId.AVAX_FUJI]: 1, - [SupportedChainId.BASE_SEPOLIA]: 6, - [SupportedChainId.ARC_TESTNET]: 26 +// Public RPC endpoints used for on-chain balance reads via viem. +export const CHAIN_DB_TO_RPC: Record = { + "ARC-TESTNET": "https://rpc.testnet.arc.network/", + "ETH-SEPOLIA": "https://rpc.sepolia.org", + "BASE-SEPOLIA": "https://sepolia.base.org", + "AVAX-FUJI": "https://api.avax-test.network/ext/bc/C/rpc", }; - -export const SUPPORTED_CHAINS = [ - SupportedChainId.ETH_SEPOLIA, - SupportedChainId.AVAX_FUJI, - SupportedChainId.BASE_SEPOLIA, - SupportedChainId.ARC_TESTNET -]; diff --git a/lib/circle/app-kit-client.ts b/lib/circle/app-kit-client.ts new file mode 100644 index 0000000..432fb4c --- /dev/null +++ b/lib/circle/app-kit-client.ts @@ -0,0 +1,34 @@ +/** + * Copyright 2025 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 { createCircleWalletsAdapter } from "@circle-fin/adapter-circle-wallets"; + +let cachedKit: AppKit | null = null; + +export function getAppKit(): AppKit { + if (!cachedKit) cachedKit = new AppKit(); + return cachedKit; +} + +export function createAdapter() { + return createCircleWalletsAdapter({ + apiKey: process.env.CIRCLE_API_KEY!, + entitySecret: process.env.CIRCLE_ENTITY_SECRET!, + }); +} diff --git a/lib/circle/permit.ts b/lib/circle/permit.ts deleted file mode 100644 index e7a90e2..0000000 --- a/lib/circle/permit.ts +++ /dev/null @@ -1,195 +0,0 @@ -/** - * Copyright 2025 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 { - maxUint256, - erc20Abi, - parseErc6492Signature, - getContract, - type Address, - type PublicClient, - type Account, - type Chain, - type GetContractReturnType, - type Transport, -} from "viem"; - -interface Eip2612PermitParams { - token: GetContractReturnType< - typeof eip2612Abi, - PublicClient - >; - chain: Chain; - ownerAddress: Address; - spenderAddress: Address; - value: bigint; -} - -export async function eip2612Permit({ - token, - chain, - ownerAddress, - spenderAddress, - value, -}: Eip2612PermitParams) { - return { - types: { - // Required for compatibility with Circle PW Sign Typed Data API - EIP712Domain: [ - { name: "name", type: "string" }, - { name: "version", type: "string" }, - { name: "chainId", type: "uint256" }, - { name: "verifyingContract", type: "address" }, - ], - Permit: [ - { name: "owner", type: "address" }, - { name: "spender", type: "address" }, - { name: "value", type: "uint256" }, - { name: "nonce", type: "uint256" }, - { name: "deadline", type: "uint256" }, - ], - } as const, - primaryType: "Permit" as const, - domain: { - name: (await token.read.name()) as string, - version: (await token.read - .version() - .catch(() => token.read.VERSION().catch(() => "1"))) as string, - chainId: BigInt(chain.id), - verifyingContract: token.address, - }, - message: { - owner: ownerAddress, - spender: spenderAddress, - value, - nonce: (await token.read.nonces([ownerAddress])) as bigint, - deadline: maxUint256, - }, - }; -} - -export const eip2612Abi = [ - ...erc20Abi, - { - inputs: [ - { - internalType: "address", - name: "owner", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - name: "nonces", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - }, - { - inputs: [], - name: "version", - outputs: [{ internalType: "string", name: "", type: "string" }], - stateMutability: "view", - type: "function", - }, -]; - -interface SignPermitParams { - tokenAddress: Address; - client: PublicClient; - account: Account; - spenderAddress: Address; - permitAmount: bigint; - // Optional walletClient for fallback typed data signing if account lacks signTypedData - walletClient?: { - // Return a hex signature - signTypedData?: (args: { - account: Account; - domain: { - name: string; - version: string; - chainId: bigint; - verifyingContract: Address; - }; - types: { - EIP712Domain: ReadonlyArray<{ name: string; type: string }>; - Permit: ReadonlyArray<{ name: string; type: string }>; - }; - primaryType: "Permit"; - message: { - owner: Address; - spender: Address; - value: bigint; - nonce: bigint; - deadline: bigint; - }; - }) => Promise<`0x${string}`>; - }; -} - -export async function signPermit({ - tokenAddress, - client, - account, - spenderAddress, - permitAmount, - walletClient, -}: SignPermitParams) { - const token = getContract({ - client, - address: tokenAddress, - abi: eip2612Abi, - }); - const permitData = await eip2612Permit({ - token, - chain: client.chain, - ownerAddress: account.address, - spenderAddress, - value: permitAmount, - }); - - let wrappedPermitSignature: `0x${string}`; - - if (account.signTypedData) { - wrappedPermitSignature = (await account.signTypedData( - permitData - )) as `0x${string}`; - } else if (walletClient?.signTypedData) { - // Fallback: use walletClient signer method (pass through original account for address context) - wrappedPermitSignature = await walletClient.signTypedData({ - account, - domain: permitData.domain, - types: permitData.types, - primaryType: permitData.primaryType, - message: permitData.message, - }); - } else { - throw new Error( - "Account does not support signing typed data and no walletClient.signTypedData fallback available." - ); - } - - const { signature } = parseErc6492Signature( - wrappedPermitSignature as `0x${string}` - ); - return signature; -} From 3fe317734b55755a645375b54830d5c1e1488d90 Mon Sep 17 00:00:00 2001 From: Frederico Dal Grande Date: Thu, 4 Jun 2026 18:14:29 -0300 Subject: [PATCH 4/4] refactor: update wallet balance retrieval and enhance transfer success message format --- components/admin-wallets-table/balance-dialog.tsx | 2 +- components/admin-wallets-table/transfer-dialog.tsx | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/components/admin-wallets-table/balance-dialog.tsx b/components/admin-wallets-table/balance-dialog.tsx index dbbb781..7057af1 100644 --- a/components/admin-wallets-table/balance-dialog.tsx +++ b/components/admin-wallets-table/balance-dialog.tsx @@ -56,7 +56,7 @@ export function BalanceDialog({ wallet, onClose }: BalanceDialogProps) { if (wallet) { setIsLoading(true); setError(null); - getWalletBalance(wallet.circle_wallet_id).then((result) => { + getWalletBalance(wallet.address, wallet.chain ?? "").then((result) => { if (result.error) { setError(result.error); } else { diff --git a/components/admin-wallets-table/transfer-dialog.tsx b/components/admin-wallets-table/transfer-dialog.tsx index 92fbe01..94c147e 100644 --- a/components/admin-wallets-table/transfer-dialog.tsx +++ b/components/admin-wallets-table/transfer-dialog.tsx @@ -138,10 +138,7 @@ export function TransferDialog({ toast.error("Transfer Failed", { description: result.error }); } else { toast.success("Transfer Submitted Successfully", { - description: `Transaction ID: ${result.transactionId?.slice( - 0, - 15 - )}...`, + description: `Tx: ${result.txHash?.slice(0, 15)}...`, }); onClose(); }