From 3bd31ba9f8b651c9e0e9b6320947014bdba8f908 Mon Sep 17 00:00:00 2001 From: Timidan Date: Fri, 24 Apr 2026 23:13:12 +0100 Subject: [PATCH 01/71] feat: add EVM and SVM earn adapters with context providers --- index.html | 2 +- package-lock.json | 12955 ++++++++++++++-- package.json | 17 +- scripts/check-family-imports.mjs | 193 + src/App.tsx | 474 +- src/chains/adapters/evmAdapter.ts | 31 + src/chains/adapters/index.ts | 22 + src/chains/adapters/types.ts | 45 + src/chains/capabilities.ts | 52 + src/chains/evm/explorer.ts | 31 + src/chains/evm/index.ts | 10 + src/chains/evm/rpc.ts | 36 + src/chains/evm/simulation.ts | 8 + src/chains/evm/wallet.ts | 16 + src/chains/providers/EvmFamilyProviders.tsx | 21 + .../providers/SolanaFamilyProviders.tsx | 33 + .../providers/StarknetFamilyProviders.tsx | 14 + src/chains/registry.ts | 7 + src/chains/starknet/starkzapClient.ts | 252 + src/chains/toolRegistry.ts | 34 + src/chains/types/evm.ts | 63 + src/chains/types/index.ts | 73 + src/chains/types/starknet.ts | 57 + src/chains/types/svm.ts | 68 + src/components/HomePage.tsx | 9 +- src/components/MobileDrawer.tsx | 87 +- src/components/Navigation.tsx | 57 +- src/components/PersistentTools.tsx | 171 +- src/components/RpcSettingsModal.tsx | 52 +- src/components/RpcSettingsSolanaPanel.tsx | 229 + src/components/RpcSettingsStarknetPanel.tsx | 201 + src/components/SimulationHistoryPage.tsx | 2 +- src/components/SimulationResultsPage.tsx | 2 +- src/components/TopBar.tsx | 9 +- .../contract/ContractAddressInput.tsx | 3 + .../integrations/IntegrationsHub.tsx | 18 +- .../integrations/lifi-earn/DepositFlow.tsx | 70 +- .../lifi-earn/IdleYieldBanner.tsx | 4 +- .../integrations/lifi-earn/LifiEarnPage.tsx | 5 +- .../integrations/lifi-earn/PositionsView.tsx | 4 +- .../integrations/lifi-earn/WithdrawFlow.tsx | 67 +- .../lifi-earn/concierge/IdleAssetsTable.tsx | 2 +- .../lifi-earn/concierge/IdleSweepPanel.tsx | 8 +- .../concierge/hooks/fetchAssetPrices.ts | 2 +- .../concierge/hooks/useIdleBalances.ts | 114 +- .../hooks/useVaultRecommendations.ts | 2 +- .../concierge/intent/IntentPanel.tsx | 5 +- .../integrations/lifi-earn/earnApi.ts | 4 +- .../lifi-earn/hooks/useTokenAllowance.ts | 47 +- .../lifi-earn/hooks/useTokenBalance.ts | 49 +- .../integrations/lifi-earn/types.ts | 8 + src/components/shared/ChainMarks.tsx | 175 + src/components/shared/FamilySelector.tsx | 63 + src/components/shared/NetworkSelector.tsx | 12 +- .../simple-grid/hooks/useSimulationState.tsx | 5 +- .../simple-grid/layout/ContractColumn.tsx | 2 +- .../useSimulationPageState.ts | 4 +- .../smart-decoder/DecoderDialogs.tsx | 3 + .../smart-decoder/useDecodeHandlers.ts | 10 +- .../TransactionReplayView.tsx | 5 +- src/components/transaction-builder/types.ts | 3 + src/components/wallet/GlobalWalletPicker.tsx | 147 + src/components/wallet/SolanaWalletConnect.tsx | 23 + src/components/wallet/bridges/EvmBridge.tsx | 41 + .../wallet/bridges/SolanaBridge.tsx | 42 + .../wallet/bridges/StarknetBridge.tsx | 206 + .../wallet/bridges/starknetLogos.ts | 21 + src/config/networkConfig.ts | 346 +- src/config/queryClient.ts | 6 + src/contexts/NetworkConfigContext.tsx | 44 + src/contexts/SimulationContext.tsx | 88 +- src/contexts/WalletManager.tsx | 206 + src/features/earn/adapter/types.ts | 245 + .../adapters/evm/EvmEarnAdapterProvider.tsx | 33 + .../earn/adapters/evm/evmEarnAdapter.ts | 120 + src/features/earn/adapters/evm/evmExplorer.ts | 15 + src/features/earn/adapters/evm/evmPrepare.ts | 212 + src/features/earn/adapters/evm/evmReads.ts | 53 + src/features/earn/adapters/evm/evmSubmit.ts | 86 + src/features/earn/adapters/evm/idleScan.ts | 119 + .../adapters/svm/SvmEarnAdapterProvider.tsx | 23 + .../earn/adapters/svm/svmEarnAdapter.stub.ts | 73 + .../earn/context/EarnAdapterContext.tsx | 69 + src/features/earn/routes/EarnFeatureRoute.tsx | 41 + src/features/earn/shared/formatUnits.ts | 22 + .../earn/shared/normalizeEarnVault.ts | 14 + .../earn/shell/UnsupportedFamilyCard.tsx | 31 + src/hooks/useActiveChainDescriptor.ts | 27 + src/hooks/useActiveChainFamily.ts | 11 + src/main.tsx | 25 +- src/routes/familyRoutes.ts | 65 + src/services/SimulationHistoryService.ts | 57 +- src/shims/tongo-sdk.ts | 12 + src/types/chain.ts | 6 + vite.config.ts | 115 +- 95 files changed, 16343 insertions(+), 2328 deletions(-) create mode 100644 scripts/check-family-imports.mjs create mode 100644 src/chains/adapters/evmAdapter.ts create mode 100644 src/chains/adapters/index.ts create mode 100644 src/chains/adapters/types.ts create mode 100644 src/chains/capabilities.ts create mode 100644 src/chains/evm/explorer.ts create mode 100644 src/chains/evm/index.ts create mode 100644 src/chains/evm/rpc.ts create mode 100644 src/chains/evm/simulation.ts create mode 100644 src/chains/evm/wallet.ts create mode 100644 src/chains/providers/EvmFamilyProviders.tsx create mode 100644 src/chains/providers/SolanaFamilyProviders.tsx create mode 100644 src/chains/providers/StarknetFamilyProviders.tsx create mode 100644 src/chains/starknet/starkzapClient.ts create mode 100644 src/chains/toolRegistry.ts create mode 100644 src/chains/types/evm.ts create mode 100644 src/chains/types/index.ts create mode 100644 src/chains/types/starknet.ts create mode 100644 src/chains/types/svm.ts create mode 100644 src/components/RpcSettingsSolanaPanel.tsx create mode 100644 src/components/RpcSettingsStarknetPanel.tsx create mode 100644 src/components/shared/ChainMarks.tsx create mode 100644 src/components/shared/FamilySelector.tsx create mode 100644 src/components/wallet/GlobalWalletPicker.tsx create mode 100644 src/components/wallet/SolanaWalletConnect.tsx create mode 100644 src/components/wallet/bridges/EvmBridge.tsx create mode 100644 src/components/wallet/bridges/SolanaBridge.tsx create mode 100644 src/components/wallet/bridges/StarknetBridge.tsx create mode 100644 src/components/wallet/bridges/starknetLogos.ts create mode 100644 src/config/queryClient.ts create mode 100644 src/contexts/WalletManager.tsx create mode 100644 src/features/earn/adapter/types.ts create mode 100644 src/features/earn/adapters/evm/EvmEarnAdapterProvider.tsx create mode 100644 src/features/earn/adapters/evm/evmEarnAdapter.ts create mode 100644 src/features/earn/adapters/evm/evmExplorer.ts create mode 100644 src/features/earn/adapters/evm/evmPrepare.ts create mode 100644 src/features/earn/adapters/evm/evmReads.ts create mode 100644 src/features/earn/adapters/evm/evmSubmit.ts create mode 100644 src/features/earn/adapters/evm/idleScan.ts create mode 100644 src/features/earn/adapters/svm/SvmEarnAdapterProvider.tsx create mode 100644 src/features/earn/adapters/svm/svmEarnAdapter.stub.ts create mode 100644 src/features/earn/context/EarnAdapterContext.tsx create mode 100644 src/features/earn/routes/EarnFeatureRoute.tsx create mode 100644 src/features/earn/shared/formatUnits.ts create mode 100644 src/features/earn/shared/normalizeEarnVault.ts create mode 100644 src/features/earn/shell/UnsupportedFamilyCard.tsx create mode 100644 src/hooks/useActiveChainDescriptor.ts create mode 100644 src/hooks/useActiveChainFamily.ts create mode 100644 src/routes/familyRoutes.ts create mode 100644 src/shims/tongo-sdk.ts diff --git a/index.html b/index.html index 6746f42..9012607 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ - + diff --git a/package-lock.json b/package-lock.json index f91a06a..e2c3e24 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "web3-toolkit", "version": "0.0.0", "dependencies": { + "@cartridge/controller": "^0.13.12", "@monaco-editor/react": "^4.7.0", "@phosphor-icons/react": "^2.1.10", "@radix-ui/react-checkbox": "^1.3.3", @@ -24,6 +25,11 @@ "@radix-ui/react-tabs": "^1.1.13", "@rainbow-me/rainbowkit": "^2.2.8", "@shazow/whatsabi": "^0.22.2", + "@solana/wallet-adapter-base": "^0.9.27", + "@solana/wallet-adapter-react": "^0.15.39", + "@solana/wallet-adapter-react-ui": "^0.9.39", + "@solana/wallet-adapter-wallets": "^0.19.38", + "@solana/web3.js": "^1.98.4", "@solidity-parser/parser": "^0.20.2", "@tanstack/react-query": "^5.87.4", "@wagmi/core": "^2.20.3", @@ -35,6 +41,7 @@ "cmdk": "^1.1.1", "dompurify": "^3.3.1", "ethers": "^5.7.2", + "ethers-v6": "npm:ethers@^6.16.0", "framer-motion": "^12.38.0", "monaco-editor": "^0.55.1", "radix-ui": "^1.4.3", @@ -45,6 +52,8 @@ "react-router-dom": "^6.28.1", "react-window": "^2.2.3", "sonner": "^2.0.7", + "starknet": "^9.4.2", + "starkzap": "^2.0.0", "tailwind-merge": "^3.4.0", "viem": "^2.37.3", "wagmi": "^2.16.9", @@ -72,6 +81,8 @@ "typescript": "~5.8.3", "typescript-eslint": "^8.39.1", "vite": "^5.4.19", + "vite-plugin-top-level-await": "^1.6.0", + "vite-plugin-wasm": "^3.6.0", "vitest": "^1.6.1" } }, @@ -155,13 +166,48 @@ "dev": true, "license": "MIT" }, + "node_modules/@avnu/avnu-sdk": { + "version": "4.1.0-rc.0", + "resolved": "https://registry.npmjs.org/@avnu/avnu-sdk/-/avnu-sdk-4.1.0-rc.0.tgz", + "integrity": "sha512-f/y2898hzhjXpPk5e2mxcyHbbbBwqq9EdJLtjku04BlgkZwk9qfviMBgRPw2oKGTbGu9nd+WSKI+rNBfLUSVCg==", + "license": "MIT", + "dependencies": { + "dayjs": "^1.11.19", + "moment": "^2.30.1", + "qs": "^6.14.1", + "zod": "^4.2.1" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "ethers": "^6.15.0", + "starknet": "^8.9.1 || ^9.0.0" + } + }, + "node_modules/@avnu/avnu-sdk/node_modules/dayjs": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", + "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", + "license": "MIT" + }, + "node_modules/@avnu/avnu-sdk/node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -209,13 +255,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -280,10 +327,11 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -298,10 +346,11 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -329,12 +378,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -382,31 +432,33 @@ } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", - "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", "debug": "^4.3.1" }, "engines": { @@ -414,13 +466,14 @@ } }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -458,6 +511,296 @@ "dev": true, "license": "(Apache-2.0 WITH LLVM-exception)" }, + "node_modules/@cartridge/controller": { + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/@cartridge/controller/-/controller-0.13.12.tgz", + "integrity": "sha512-bNhjRcIvMoi3BkaLPBXVGlHJwR7zHLaRp1SoOOeiRCXXX/Dos6eClE1T0Hy3SCBSqm16dOr2EdV518+vMEmZ6Q==", + "dependencies": { + "@cartridge/controller-wasm": "0.10.0", + "@cartridge/penpal": "^6.2.4", + "@starknet-io/get-starknet-wallet-standard": "5.0.0-beta.0", + "@starknet-io/types-js": "0.9.1", + "@turnkey/sdk-browser": "^5.15.2", + "@walletconnect/ethereum-provider": "^2.20.0", + "bs58": "^6.0.0", + "cbor-x": "^1.5.0", + "ethers": "^6.13.5", + "micro-sol-signer": "^0.5.0", + "mipd": "^0.0.7", + "open": "^10.1.0", + "starknet": "^8.5.2" + } + }, + "node_modules/@cartridge/controller-wasm": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@cartridge/controller-wasm/-/controller-wasm-0.10.0.tgz", + "integrity": "sha512-msmQFjZRRAcAbcGf0mt4z4bTvUY6H3ypgYz+imJp+S36SCabvh42vog7FttuvcVKQoVjS5hNKb3rf0YwU/plig==" + }, + "node_modules/@cartridge/controller/node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "license": "MIT" + }, + "node_modules/@cartridge/controller/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@cartridge/controller/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@cartridge/controller/node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@cartridge/controller/node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "license": "MIT" + }, + "node_modules/@cartridge/controller/node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/@cartridge/controller/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", + "dependencies": { + "base-x": "^5.0.0" + } + }, + "node_modules/@cartridge/controller/node_modules/ethers": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.16.0.tgz", + "integrity": "sha512-U1wulmetNymijEhpSEQ7Ct/P/Jw9/e7R1j5XIbPRydgV2DjLVMsULDlNksq3RQnFgKoLlZf88ijYtWEXcPa07A==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "22.7.5", + "aes-js": "4.0.0-beta.5", + "tslib": "2.7.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@cartridge/controller/node_modules/starknet": { + "version": "8.9.2", + "resolved": "https://registry.npmjs.org/starknet/-/starknet-8.9.2.tgz", + "integrity": "sha512-+dp+o2w67fV6JyVOVkYeM1Ec71aORHc/JrF4VHLlfeGee0nLilooCQLE2u6hUcSGQG2x2/fvzkxYpIN+k1JBvA==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.7.0", + "@noble/hashes": "~1.6.0", + "@scure/base": "~1.2.1", + "@scure/starknet": "1.1.0", + "@starknet-io/starknet-types-08": "npm:@starknet-io/types-js@~0.8.4", + "@starknet-io/starknet-types-09": "npm:@starknet-io/types-js@~0.9.1", + "abi-wan-kanabi": "2.2.4", + "lossless-json": "^4.2.0", + "pako": "^2.0.4", + "ts-mixer": "^6.0.3" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@cartridge/controller/node_modules/starknet/node_modules/@noble/curves": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz", + "integrity": "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.6.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@cartridge/controller/node_modules/starknet/node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz", + "integrity": "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@cartridge/controller/node_modules/starknet/node_modules/@noble/hashes": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", + "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@cartridge/controller/node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" + }, + "node_modules/@cartridge/controller/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, + "node_modules/@cartridge/controller/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "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/@cartridge/penpal": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@cartridge/penpal/-/penpal-6.2.4.tgz", + "integrity": "sha512-tdpOnSJJBFMlgLZ1+z9Ho5e6cG5EgMAb1Cmmh1lGT2tmplogU/XPMjLE6CwvKAPDoe6a38iMnbH+ySTAWWIOKA==", + "license": "MIT" + }, + "node_modules/@cbor-extract/cbor-extract-darwin-arm64": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.2.tgz", + "integrity": "sha512-ZKZ/F8US7JR92J4DMct6cLW/Y66o2K576+zjlEN/MevH70bFIsB10wkZEQPLzl2oNh2SMGy55xpJ9JoBRl5DOA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@cbor-extract/cbor-extract-darwin-x64": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.2.tgz", + "integrity": "sha512-32b1mgc+P61Js+KW9VZv/c+xRw5EfmOcPx990JbCBSkYJFY0l25VinvyyWfl+3KjibQmAcYwmyzKF9J4DyKP/Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@cbor-extract/cbor-extract-linux-arm": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.2.tgz", + "integrity": "sha512-tNg0za41TpQfkhWjptD+0gSD2fggMiDCSacuIeELyb2xZhr7PrhPe5h66Jc67B/5dmpIhI2QOUtv4SBsricyYQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@cbor-extract/cbor-extract-linux-arm64": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.2.tgz", + "integrity": "sha512-wfqgzqCAy/Vn8i6WVIh7qZd0DdBFaWBjPdB6ma+Wihcjv0gHqD/mw3ouVv7kbbUNrab6dKEx/w3xQZEdeXIlzg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@cbor-extract/cbor-extract-linux-x64": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.2.tgz", + "integrity": "sha512-rpiLnVEsqtPJ+mXTdx1rfz4RtUGYIUg2rUAZgd1KjiC1SehYUSkJN7Yh+aVfSjvCGtVP0/bfkQkXpPXKbmSUaA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@cbor-extract/cbor-extract-win32-x64": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.2.tgz", + "integrity": "sha512-dI+9P7cfWxkTQ+oE+7Aa6onEn92PHgfWXZivjNheCRmTBDBf2fx6RyTi0cmgpYLnD1KLZK9ZYrMxaPZ4oiXhGA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@coinbase/wallet-sdk": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-4.3.6.tgz", @@ -700,6 +1043,18 @@ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" }, + "node_modules/@emurgo/cardano-serialization-lib-browser": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-browser/-/cardano-serialization-lib-browser-13.2.1.tgz", + "integrity": "sha512-7RfX1gI16Vj2DgCp/ZoXqyLAakWo6+X95ku/rYGbVzuS/1etrlSiJmdbmdm+eYmszMlGQjrtOJQeVLXoj4L/Ag==", + "license": "MIT" + }, + "node_modules/@emurgo/cardano-serialization-lib-nodejs": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-13.2.0.tgz", + "integrity": "sha512-Bz1zLGEqBQ0BVkqt1OgMxdBOE3BdUWUd7Ly9Ecr/aUwkA8AV1w1XzBMe4xblmJHnB1XXNlPH4SraXCvO+q0Mig==", + "license": "MIT" + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -2015,6 +2370,16 @@ "node": ">=14" } }, + "node_modules/@fivebinaries/coin-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@fivebinaries/coin-selection/-/coin-selection-3.0.0.tgz", + "integrity": "sha512-h25Pn1ZA7oqQBQDodGAgIsQt66T2wDge9onBKNqE66WNWL0KJiKJbpij8YOLo5AAlEIg5IS7EB1QjBgDOIg6DQ==", + "license": "Apache-2.0", + "dependencies": { + "@emurgo/cardano-serialization-lib-browser": "^13.2.0", + "@emurgo/cardano-serialization-lib-nodejs": "13.2.0" + } + }, "node_modules/@floating-ui/core": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", @@ -2053,6 +2418,42 @@ "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", "license": "MIT" }, + "node_modules/@fractalwagmi/popup-connection": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@fractalwagmi/popup-connection/-/popup-connection-1.1.1.tgz", + "integrity": "sha512-hYL+45iYwNbwjvP2DxP3YzVsrAGtj/RV9LOgMpJyCxsfNoyyOoi2+YrnywKkiANingiG2kJ1nKsizbu1Bd4zZw==", + "license": "ISC", + "peerDependencies": { + "react": "^17.0.2 || ^18", + "react-dom": "^17.0.2 || ^18" + } + }, + "node_modules/@fractalwagmi/solana-wallet-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fractalwagmi/solana-wallet-adapter/-/solana-wallet-adapter-0.1.1.tgz", + "integrity": "sha512-oTZLEuD+zLKXyhZC5tDRMPKPj8iaxKLxXiCjqRfOo4xmSbS2izGRWLJbKMYYsJysn/OI3UJ3P6CWP8WUWi0dZg==", + "license": "ISC", + "dependencies": { + "@fractalwagmi/popup-connection": "^1.0.18", + "@solana/wallet-adapter-base": "^0.9.17", + "bs58": "^5.0.0" + } + }, + "node_modules/@fractalwagmi/solana-wallet-adapter/node_modules/base-x": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.1.tgz", + "integrity": "sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==", + "license": "MIT" + }, + "node_modules/@fractalwagmi/solana-wallet-adapter/node_modules/bs58": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "license": "MIT", + "dependencies": { + "base-x": "^4.0.0" + } + }, "node_modules/@gemini-wallet/core": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@gemini-wallet/core/-/core-0.2.0.tgz", @@ -2066,26 +2467,83 @@ "viem": ">=2.0.0" } }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, + "node_modules/@hpke/chacha20poly1305": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@hpke/chacha20poly1305/-/chacha20poly1305-1.8.0.tgz", + "integrity": "sha512-FcBfAQ+Y99vMNJP2yrZ9wpL8V0GOwp1+zMyzvc6alasrBygfFjFm1yeUtyADJCu/27C3Lm5mJzx6u7pwg+cX5w==", + "license": "MIT", "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" + "@hpke/common": "^1.10.0" }, "engines": { - "node": ">=18.18.0" + "node": ">=16.0.0" + } + }, + "node_modules/@hpke/common": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@hpke/common/-/common-1.10.1.tgz", + "integrity": "sha512-moJwhmtLtuxiUzzNp1jpfBfx8yefKoO9D/RCR9dmwrnc7qjJqId1rEtQz+lSlU5cabX8daToMSx/7HayXOiaFw==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@hpke/core": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@hpke/core/-/core-1.9.0.tgz", + "integrity": "sha512-pFxWl1nNJeQCSUFs7+GAblHvXBCjn9EPN65vdKlYQil2aURaRxfGMO6vBKGqm1YHTKwiAxJQNEI70PbSowMP9Q==", + "license": "MIT", + "dependencies": { + "@hpke/common": "^1.10.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@hpke/dhkem-x25519": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@hpke/dhkem-x25519/-/dhkem-x25519-1.8.0.tgz", + "integrity": "sha512-S1MWWkAfu+TFxySgv5+2P3O4Mx/jk7BsoplzQaA1s3sfUJVJ2UsZsSzSsMc+FXJumLXncoJFlO6mK6mDGspfmA==", + "license": "MIT", + "dependencies": { + "@hpke/common": "^1.10.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@hpke/dhkem-x448": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@hpke/dhkem-x448/-/dhkem-x448-1.8.0.tgz", + "integrity": "sha512-mFfnZfgp4OKkUIS/FKikfUgdnDKRy25ytCKBQiV+N+HbYy3I4v4ZCPBQ69QL+TYmKmCZJeUEnYeS5K+OBRP+Eg==", + "license": "MIT", + "dependencies": { + "@hpke/common": "^1.10.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -2208,6 +2666,160 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@keystonehq/alias-sampling": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@keystonehq/alias-sampling/-/alias-sampling-0.1.2.tgz", + "integrity": "sha512-5ukLB3bcgltgaFfQfYKYwHDUbwHicekYo53fSEa7xhVkAEqsA74kxdIwoBIURmGUtXe3EVIRm4SYlgcrt2Ri0w==", + "license": "MIT" + }, + "node_modules/@keystonehq/bc-ur-registry": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@keystonehq/bc-ur-registry/-/bc-ur-registry-0.5.4.tgz", + "integrity": "sha512-z7bZe10I5k0zz9znmDTXh+o3Rzb5XsRVpwAzexubOaLxVdZ0F7aMbe2LoEsw766Hpox/7zARi7UGmLz5C8BAzA==", + "license": "Apache-2.0", + "dependencies": { + "@ngraveio/bc-ur": "^1.1.5", + "bs58check": "^2.1.2", + "tslib": "^2.3.0" + } + }, + "node_modules/@keystonehq/bc-ur-registry-sol": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@keystonehq/bc-ur-registry-sol/-/bc-ur-registry-sol-0.9.5.tgz", + "integrity": "sha512-HZeeph9297ZHjAziE9wL/u2W1dmV0p1H9Bu9g1bLJazP4F6W2fjCK9BAoCiKEsMBqadk6KI6r6VD67fmDzWyug==", + "license": "ISC", + "dependencies": { + "@keystonehq/bc-ur-registry": "^0.7.0", + "bs58check": "^2.1.2", + "uuid": "^8.3.2" + } + }, + "node_modules/@keystonehq/bc-ur-registry-sol/node_modules/@keystonehq/bc-ur-registry": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@keystonehq/bc-ur-registry/-/bc-ur-registry-0.7.1.tgz", + "integrity": "sha512-6eVIjNt/P+BmuwcYccbPYVS85473SFNplkqWF/Vb3ePCzLX00tn0WZBO1FGpS4X4nfXtceTfvUeNvQKoTGtXrw==", + "license": "Apache-2.0", + "dependencies": { + "@ngraveio/bc-ur": "^1.1.5", + "bs58check": "^2.1.2", + "tslib": "^2.3.0" + } + }, + "node_modules/@keystonehq/sdk": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@keystonehq/sdk/-/sdk-0.19.2.tgz", + "integrity": "sha512-ilA7xAhPKvpHWlxjzv3hjMehD6IKYda4C1TeG2/DhFgX9VSffzv77Eebf8kVwzPLdYV4LjX1KQ2ZDFoN1MsSFQ==", + "license": "ISC", + "dependencies": { + "@ngraveio/bc-ur": "^1.0.0", + "qrcode.react": "^1.0.1", + "react-modal": "^3.12.1", + "react-qr-reader": "^2.2.1", + "rxjs": "^6.6.3" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@keystonehq/sol-keyring": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@keystonehq/sol-keyring/-/sol-keyring-0.20.0.tgz", + "integrity": "sha512-UBeMlecybTDQaFMI951LBEVRyZarqKHOcwWqqvphV+x7WquYz0SZ/wf/PhizV0MWoGTQwt2m5aqROzksi6svqw==", + "license": "ISC", + "dependencies": { + "@keystonehq/bc-ur-registry": "0.5.4", + "@keystonehq/bc-ur-registry-sol": "^0.9.2", + "@keystonehq/sdk": "^0.19.2", + "@solana/web3.js": "^1.36.0", + "bs58": "^5.0.0", + "uuid": "^8.3.2" + } + }, + "node_modules/@keystonehq/sol-keyring/node_modules/base-x": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.1.tgz", + "integrity": "sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==", + "license": "MIT" + }, + "node_modules/@keystonehq/sol-keyring/node_modules/bs58": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "license": "MIT", + "dependencies": { + "base-x": "^4.0.0" + } + }, + "node_modules/@ledgerhq/devices": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-8.14.1.tgz", + "integrity": "sha512-q6tOUO963tFPrsJtdzu5juC8xIAIRe6etLSZ+ZhwgUivTHNJbmFFBxMU3p19dwn8VaKRvbw0pxJv+qmokMYpRA==", + "license": "Apache-2.0", + "dependencies": { + "@ledgerhq/errors": "^6.34.0", + "@ledgerhq/logs": "^6.17.0", + "rxjs": "7.8.2", + "semver": "7.7.3" + } + }, + "node_modules/@ledgerhq/devices/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@ledgerhq/devices/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@ledgerhq/errors": { + "version": "6.34.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.34.0.tgz", + "integrity": "sha512-l16K56FzPoXBMT5J4EpnIBmRLTYkpSyYj3z4er+rmbwq0t9dDG/UaRvFeBpwB2gqGcYWcue14qF9Wkuos/43eA==", + "license": "Apache-2.0" + }, + "node_modules/@ledgerhq/hw-transport": { + "version": "6.35.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.35.1.tgz", + "integrity": "sha512-YCkk9koo0FzCzHvLVpdrQ3+EQOPMpp/fSednHhk7AiaJC/c+pX6wKevUDp1MLcq7gUHbVOXyYYpqoW6A97w8OA==", + "license": "Apache-2.0", + "dependencies": { + "@ledgerhq/devices": "8.14.1", + "@ledgerhq/errors": "^6.34.0", + "@ledgerhq/logs": "^6.17.0", + "events": "^3.3.0" + } + }, + "node_modules/@ledgerhq/hw-transport-webhid": { + "version": "6.35.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-webhid/-/hw-transport-webhid-6.35.1.tgz", + "integrity": "sha512-94/2AfTnYLW9nvddSfy6PXLdx5tQHpCL5necdgKSg5BMzq8+d9Hv3uH1qo6jSeC98M20GJpll8rRrn1n5336hg==", + "license": "Apache-2.0", + "dependencies": { + "@ledgerhq/devices": "8.14.1", + "@ledgerhq/errors": "^6.34.0", + "@ledgerhq/hw-transport": "6.35.1", + "@ledgerhq/logs": "^6.17.0" + } + }, + "node_modules/@ledgerhq/logs": { + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/logs/-/logs-6.17.0.tgz", + "integrity": "sha512-yra33g5q/AU7+PwAws+GaVpQGUuxnDREjVBnviJjcaJLVKuLzI4pnj8Bd3nY3fypM5k1yZEYKEXfUuGFUjP2+w==", + "license": "Apache-2.0" + }, "node_modules/@lit-labs/ssr-dom-shim": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.5.1.tgz", @@ -2788,6 +3400,15 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/@mobily/ts-belt": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@mobily/ts-belt/-/ts-belt-3.13.1.tgz", + "integrity": "sha512-K5KqIhPI/EoCTbA6CGbrenM9s41OouyK8A03fGJJcla/zKucsgLbz8HNbeseoLarRPgyWJsUyCYqFhI7t3Ra9Q==", + "license": "MIT", + "engines": { + "node": ">= 10.*" + } + }, "node_modules/@monaco-editor/loader": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.7.0.tgz", @@ -2811,6 +3432,21 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/@ngraveio/bc-ur": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@ngraveio/bc-ur/-/bc-ur-1.1.13.tgz", + "integrity": "sha512-j73akJMV4+vLR2yQ4AphPIT5HZmxVjn/LxpL7YHoINnXoH6ccc90Zzck6/n6a3bCXOVZwBxq+YHwbAKRV+P8Zg==", + "license": "MIT", + "dependencies": { + "@keystonehq/alias-sampling": "^0.1.1", + "assert": "^2.0.0", + "bignumber.js": "^9.0.1", + "cbor-sync": "^1.0.4", + "crc": "^3.8.0", + "jsbi": "^3.1.5", + "sha.js": "^2.4.11" + } + }, "node_modules/@noble/ciphers": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", @@ -2896,6 +3532,58 @@ "node": ">= 8" } }, + "node_modules/@particle-network/analytics": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@particle-network/analytics/-/analytics-1.0.2.tgz", + "integrity": "sha512-E4EpTRYcfNOkxj+bgNdQydBrvdLGo4HfVStZCuOr3967dYek30r6L7Nkaa9zJXRE2eGT4lPvcAXDV2WxDZl/Xg==", + "license": "Apache-2.0", + "dependencies": { + "hash.js": "^1.1.7", + "uuidv4": "^6.2.13" + } + }, + "node_modules/@particle-network/auth": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@particle-network/auth/-/auth-1.3.1.tgz", + "integrity": "sha512-hu6ie5RjjN4X+6y/vfjyCsSX3pQuS8k8ZoMb61QWwhWsnZXKzpBUVeAEk55aGfxxXY+KfBkSmZosyaZHGoHnfw==", + "license": "Apache-2.0", + "dependencies": { + "@particle-network/analytics": "^1.0.1", + "@particle-network/chains": "*", + "@particle-network/crypto": "^1.0.1", + "buffer": "^6.0.3", + "draggabilly": "^3.0.0" + } + }, + "node_modules/@particle-network/chains": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@particle-network/chains/-/chains-1.8.3.tgz", + "integrity": "sha512-WgzY2Hp3tpQYBKXF0pOFdCyJ4yekTTOCzBvBt2tvt7Wbzti2bLyRlfGZAoP57TvIMiy1S1oUfasVfM0Dqd6k5w==", + "license": "Apache-2.0" + }, + "node_modules/@particle-network/crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@particle-network/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha512-GgvHmHcFiNkCLZdcJOgctSbgvs251yp+EAdUydOE3gSoIxN6KEr/Snu9DebENhd/nFb7FDk5ap0Hg49P7pj1fg==", + "license": "Apache-2.0", + "dependencies": { + "crypto-js": "^4.1.1", + "uuidv4": "^6.2.13" + } + }, + "node_modules/@particle-network/solana-wallet": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@particle-network/solana-wallet/-/solana-wallet-1.3.2.tgz", + "integrity": "sha512-KviKVP87OtWq813y8IumM3rIQMNkTjHBaQmCUbTWGebz3csFOv54JIoy1r+3J3NnA+mBxBdZeRedZ5g+07v75w==", + "license": "Apache-2.0", + "dependencies": { + "@particle-network/auth": "^1.3.1" + }, + "peerDependencies": { + "@solana/web3.js": "^1.50.1", + "bs58": "^4.0.1" + } + }, "node_modules/@paulmillr/qr": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@paulmillr/qr/-/qr-0.2.1.tgz", @@ -2906,6 +3594,151 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.1.tgz", + "integrity": "sha512-vdG4fBF6Lkirkcl53q6eOdn3XYKt+kJTG59edgRZORlg/3atWWEReRCx5rYE1ZzTTX6vLK5zDMjHh7vbrcXGtw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "@peculiar/asn1-x509-attr": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.1.tgz", + "integrity": "sha512-WRWnKfIocHyzFYQTka8O/tXCiBquAPSrRjXbOkHbO4qdmS6loffCEGs+rby6WxxGdJCuunnhS2duHURhjyio6w==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.1.tgz", + "integrity": "sha512-+Vqw8WFxrtDIN5ehUdvlN2m73exS2JVG0UAyfVB31gIfor3zWEAQPD+K9ydCxaj3MLen9k0JhKpu9LqviuCE1g==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.1.tgz", + "integrity": "sha512-nB5jVQy3MAAWvq0KY0R2JUZG8bO/bTLpnwyOzXyEh/e54ynGTatAR+csOnXkkVD9AFZ2uL8Z7EV918+qB1qDvw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.1", + "@peculiar/asn1-pkcs8": "^2.6.1", + "@peculiar/asn1-rsa": "^2.6.1", + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.1.tgz", + "integrity": "sha512-JB5iQ9Izn5yGMw3ZG4Nw3Xn/hb/G38GYF3lf7WmJb8JZUydhVGEjK/ZlFSWhnlB7K/4oqEs8HnfFIKklhR58Tw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.1.tgz", + "integrity": "sha512-5EV8nZoMSxeWmcxWmmcolg22ojZRgJg+Y9MX2fnE2bGRo5KQLqV5IL9kdSQDZxlHz95tHvIq9F//bvL1OeNILw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.1", + "@peculiar/asn1-pfx": "^2.6.1", + "@peculiar/asn1-pkcs8": "^2.6.1", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "@peculiar/asn1-x509-attr": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.1.tgz", + "integrity": "sha512-1nVMEh46SElUt5CB3RUTV4EG/z7iYc7EoaDY5ECwganibQPkZ/Y2eMsTKB/LeyrUJ+W/tKoD9WUqIy8vB+CEdA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", + "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", + "license": "MIT", + "dependencies": { + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.1.tgz", + "integrity": "sha512-O9jT5F1A2+t3r7C4VT7LYGXqkGLK7Kj1xFpz7U0isPrubwU5PbDoyYtx6MiGst29yq7pXN5vZbQFKRCP+lLZlA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.1.tgz", + "integrity": "sha512-tlW6cxoHwgcQghnJwv3YS+9OO1737zgPogZ+CgWRUK4roEwIPzRH4JEiG770xe5HX2ATfCpmX60gurfWIF9dcQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.12.3.tgz", + "integrity": "sha512-+Mzq+W7cNEKfkNZzyLl6A6ffqc3r21HGZUezgfKxpZrkORfOqgRXnS80Zu0IV6a9Ue9QBJeKD7kN0iWfc3bhRQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.3.13", + "@peculiar/asn1-csr": "^2.3.13", + "@peculiar/asn1-ecc": "^2.3.14", + "@peculiar/asn1-pkcs9": "^2.3.13", + "@peculiar/asn1-rsa": "^2.3.13", + "@peculiar/asn1-schema": "^2.3.13", + "@peculiar/asn1-x509": "^2.3.13", + "pvtsutils": "^1.3.5", + "reflect-metadata": "^0.2.2", + "tslib": "^2.7.0", + "tsyringe": "^4.8.0" + } + }, "node_modules/@phosphor-icons/react": { "version": "2.1.10", "resolved": "https://registry.npmjs.org/@phosphor-icons/react/-/react-2.1.10.tgz", @@ -2919,6 +3752,92 @@ "react-dom": ">= 16.8" } }, + "node_modules/@project-serum/sol-wallet-adapter": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@project-serum/sol-wallet-adapter/-/sol-wallet-adapter-0.2.6.tgz", + "integrity": "sha512-cpIb13aWPW8y4KzkZAPDgw+Kb+DXjCC6rZoH74MGm3I/6e/zKyGnfAuW5olb2zxonFqsYgnv7ev8MQnvSgJ3/g==", + "license": "Apache-2.0", + "dependencies": { + "bs58": "^4.0.1", + "eventemitter3": "^4.0.7" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.5.0" + } + }, + "node_modules/@project-serum/sol-wallet-adapter/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, "node_modules/@radix-ui/number": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", @@ -6113,6 +7032,19 @@ "wagmi": "^2.9.0" } }, + "node_modules/@react-native-async-storage/async-storage": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.24.0.tgz", + "integrity": "sha512-W4/vbwUOYOjco0x3toB8QCr7EjIP6nE9G7o8PMguvvjYT5Awg09lyV4enACRx4s++PPulBiBSjL0KTFx2u0Z/g==", + "license": "MIT", + "optional": true, + "dependencies": { + "merge-options": "^3.0.4" + }, + "peerDependencies": { + "react-native": "^0.0.0-0 || >=0.60 <1.0" + } + }, "node_modules/@remix-run/router": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.21.0.tgz", @@ -6388,9 +7320,24 @@ } } }, - "node_modules/@reown/appkit-controllers/node_modules/isows": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", + "node_modules/@reown/appkit-controllers/node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/@reown/appkit-controllers/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", + "dependencies": { + "base-x": "^5.0.0" + } + }, + "node_modules/@reown/appkit-controllers/node_modules/isows": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", "funding": [ { @@ -6733,6 +7680,21 @@ } } }, + "node_modules/@reown/appkit-utils/node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/@reown/appkit-utils/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", + "dependencies": { + "base-x": "^5.0.0" + } + }, "node_modules/@reown/appkit-utils/node_modules/isows": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", @@ -7030,6 +7992,21 @@ } } }, + "node_modules/@reown/appkit/node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/@reown/appkit/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", + "dependencies": { + "base-x": "^5.0.0" + } + }, "node_modules/@reown/appkit/node_modules/isows": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", @@ -7101,6 +8078,24 @@ "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", "dev": true }, + "node_modules/@rollup/plugin-virtual": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-virtual/-/plugin-virtual-3.0.2.tgz", + "integrity": "sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, "node_modules/@rollup/pluginutils": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", @@ -7511,6 +8506,58 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@scure/starknet": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@scure/starknet/-/starknet-1.1.0.tgz", + "integrity": "sha512-83g3M6Ix2qRsPN4wqLDqiRZ2GBNbjVWfboJE/9UjfG+MHr6oDSu/CWgy8hsBSJejr09DkkL+l0Ze4KVrlCIdtQ==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.7.0", + "@noble/hashes": "~1.6.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/starknet/node_modules/@noble/curves": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz", + "integrity": "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.6.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/starknet/node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz", + "integrity": "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/starknet/node_modules/@noble/hashes": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", + "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@shazow/whatsabi": { "version": "0.22.2", "resolved": "https://registry.npmjs.org/@shazow/whatsabi/-/whatsabi-0.22.2.tgz", @@ -7657,2087 +8704,7808 @@ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "license": "MIT" }, - "node_modules/@solidity-parser/parser": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.20.2.tgz", - "integrity": "sha512-rbu0bzwNvMcwAjH86hiEAcOeRI2EeK8zCkHDrFykh/Al8mvJeFmjy3UrE7GYQjNwOgbGUUtCn5/k8CB8zIu7QA==", + "node_modules/@solana-mobile/mobile-wallet-adapter-protocol": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@solana-mobile/mobile-wallet-adapter-protocol/-/mobile-wallet-adapter-protocol-2.2.8.tgz", + "integrity": "sha512-c3FQsrM7nV62DqVaHGKtr2osE2w5gS3/wjy8ILF0zczS/s1mERX+JTmf+UHd8xgESmEj/IM7q+U2Qhrmac1PdA==", + "license": "Apache-2.0", + "dependencies": { + "@solana/codecs-strings": "^6.0.0", + "@solana/wallet-standard-features": "^1.3.0", + "@solana/wallet-standard-util": "^1.1.2", + "@wallet-standard/core": "^1.1.1", + "js-base64": "^3.7.5" + }, + "peerDependencies": { + "react-native": ">0.74" + } + }, + "node_modules/@solana-mobile/mobile-wallet-adapter-protocol-web3js": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@solana-mobile/mobile-wallet-adapter-protocol-web3js/-/mobile-wallet-adapter-protocol-web3js-2.2.8.tgz", + "integrity": "sha512-W9DbsFvl5lSOe7KT3dJX4tjbxfYIoOtOTJpvLMgkojyRU0UKChQ4vHvbOZQ3GkUJ8wOIS4qdrM0Yytd1Vy+YQQ==", + "license": "Apache-2.0", + "dependencies": { + "@solana-mobile/mobile-wallet-adapter-protocol": "^2.2.8", + "bs58": "^6.0.0", + "js-base64": "^3.7.5" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.4" + } + }, + "node_modules/@solana-mobile/mobile-wallet-adapter-protocol-web3js/node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", "license": "MIT" }, - "node_modules/@tailwindcss/node": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", - "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", - "dev": true, + "node_modules/@solana-mobile/mobile-wallet-adapter-protocol-web3js/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", "license": "MIT", "dependencies": { - "@jridgewell/remapping": "^2.3.4", - "enhanced-resolve": "^5.18.3", - "jiti": "^2.6.1", - "lightningcss": "1.30.2", - "magic-string": "^0.30.21", - "source-map-js": "^1.2.1", - "tailwindcss": "4.1.18" + "base-x": "^5.0.0" } }, - "node_modules/@tailwindcss/oxide": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", - "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" + "node_modules/@solana-mobile/wallet-adapter-mobile": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@solana-mobile/wallet-adapter-mobile/-/wallet-adapter-mobile-2.2.8.tgz", + "integrity": "sha512-ZbXY3/0+UnnyS0hvArpO1b1pYzaQAiVIp+HBUm11aLEkE5+ISvHTRPr/bCEUXZfPkez/1n9zH3H0leK25Lj6Nw==", + "license": "Apache-2.0", + "dependencies": { + "@solana-mobile/mobile-wallet-adapter-protocol": "^2.2.8", + "@solana-mobile/mobile-wallet-adapter-protocol-web3js": "^2.2.8", + "@solana-mobile/wallet-standard-mobile": "^0.5.2", + "@solana/wallet-adapter-base": "^0.9.27", + "@solana/wallet-standard-features": "^1.3.0", + "@wallet-standard/core": "^1.1.1", + "bs58": "^6.0.0", + "js-base64": "^3.7.5", + "tslib": "^2.8.1" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.18", - "@tailwindcss/oxide-darwin-arm64": "4.1.18", - "@tailwindcss/oxide-darwin-x64": "4.1.18", - "@tailwindcss/oxide-freebsd-x64": "4.1.18", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", - "@tailwindcss/oxide-linux-x64-musl": "4.1.18", - "@tailwindcss/oxide-wasm32-wasi": "4.1.18", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + "@react-native-async-storage/async-storage": "^1.17.7" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.4", + "react-native": ">0.74" } }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", - "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "base-x": "^5.0.0" } }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", - "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@solana-mobile/wallet-standard-mobile": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@solana-mobile/wallet-standard-mobile/-/wallet-standard-mobile-0.5.2.tgz", + "integrity": "sha512-orEGv4N/Ttd0umwfWUzGcEnVc9eJDTgRSEcDitvFWpIf2D968h6128L0rq9/y7sUw88Gvu/lU0euoC2ASEijqQ==", + "license": "Apache-2.0", + "dependencies": { + "@solana-mobile/mobile-wallet-adapter-protocol": "^2.2.8", + "@solana/wallet-standard-chains": "^1.1.1", + "@solana/wallet-standard-features": "^1.3.0", + "@wallet-standard/base": "^1.0.1", + "@wallet-standard/features": "^1.0.3", + "@wallet-standard/wallet": "^1.1.0", + "bs58": "^6.0.0", + "js-base64": "^3.7.5", + "qrcode": "^1.5.4", + "tslib": "^2.8.1" + }, + "optionalDependencies": { + "@react-native-async-storage/async-storage": "^1.17.7" + } + }, + "node_modules/@solana-mobile/wallet-standard-mobile/node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/@solana-mobile/wallet-standard-mobile/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "base-x": "^5.0.0" } }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", - "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@solana-mobile/wallet-standard-mobile/node_modules/qrcode": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", + "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "dijkstrajs": "^1.0.1", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, "engines": { - "node": ">= 10" + "node": ">=10.13.0" } }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", - "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@solana-program/compute-budget": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@solana-program/compute-budget/-/compute-budget-0.8.0.tgz", + "integrity": "sha512-qPKxdxaEsFxebZ4K5RPuy7VQIm/tfJLa1+Nlt3KNA8EYQkz9Xm8htdoEaXVrer9kpgzzp9R3I3Bh6omwCM06tQ==", + "license": "Apache-2.0", + "peerDependencies": { + "@solana/kit": "^2.1.0" + } + }, + "node_modules/@solana-program/stake": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@solana-program/stake/-/stake-0.2.1.tgz", + "integrity": "sha512-ssNPsJv9XHaA+L7ihzmWGYcm/+XYURQ8UA3wQMKf6ccEHyHOUgoglkkDU/BoA0+wul6HxZUN0tHFymC0qFw6sg==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" + "peerDependencies": { + "@solana/kit": "^2.1.0" } }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", - "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "node_modules/@solana-program/system": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@solana-program/system/-/system-0.7.0.tgz", + "integrity": "sha512-FKTBsKHpvHHNc1ATRm7SlC5nF/VdJtOSjldhcyfMN9R7xo712Mo2jHIzvBgn8zQO5Kg0DcWuKB7268Kv1ocicw==", + "license": "Apache-2.0", + "peerDependencies": { + "@solana/kit": "^2.1.0" } }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", - "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", - "cpu": [ - "arm64" - ], - "dev": true, + "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/@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": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/accounts/-/accounts-2.3.0.tgz", + "integrity": "sha512-QgQTj404Z6PXNOyzaOpSzjgMOuGwG8vC66jSDB+3zHaRcEPRVRd2sVSrd1U6sHtnV3aiaS6YyDuPQMheg4K2jw==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "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": ">= 10" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", - "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@solana/accounts/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", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@solana/errors": "2.3.0" + }, "engines": { - "node": ">= 10" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", - "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@solana/accounts/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", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@solana/codecs-core": "2.3.0", + "@solana/errors": "2.3.0" + }, "engines": { - "node": ">= 10" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", - "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@solana/accounts/node_modules/@solana/codecs-strings": { + "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", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@solana/codecs-core": "2.3.0", + "@solana/codecs-numbers": "2.3.0", + "@solana/errors": "2.3.0" + }, "engines": { - "node": ">= 10" + "node": ">=20.18.0" + }, + "peerDependencies": { + "fastestsmallesttextencoderdecoder": "^1.0.22", + "typescript": ">=5.3.3" } }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", - "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "dev": true, + "node_modules/@solana/accounts/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", - "optional": true, "dependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1", - "@emnapi/wasi-threads": "^1.1.0", - "@napi-rs/wasm-runtime": "^1.1.0", - "@tybys/wasm-util": "^0.10.1", - "tslib": "^2.4.0" + "chalk": "^5.4.1", + "commander": "^14.0.0" + }, + "bin": { + "errors": "bin/cli.mjs" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", - "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@solana/accounts/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">= 10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", - "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", - "cpu": [ - "x64" - ], - "dev": true, + "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", - "optional": true, - "os": [ - "win32" - ], + "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": ">= 10" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@tailwindcss/vite": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.18.tgz", - "integrity": "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==", - "dev": true, + "node_modules/@solana/addresses/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": { - "@tailwindcss/node": "4.1.18", - "@tailwindcss/oxide": "4.1.18", - "tailwindcss": "4.1.18" + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" }, "peerDependencies": { - "vite": "^5.2.0 || ^6 || ^7" + "typescript": ">=5.3.3" } }, - "node_modules/@tanstack/query-core": { - "version": "5.87.4", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.87.4.tgz", - "integrity": "sha512-uNsg6zMxraEPDVO2Bn+F3/ctHi+Zsk+MMpcN8h6P7ozqD088F6mFY5TfGM7zuyIrL7HKpDyu6QHfLWiDxh3cuw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" + "node_modules/@solana/addresses/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/@tanstack/react-query": { - "version": "5.87.4", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.87.4.tgz", - "integrity": "sha512-T5GT/1ZaNsUXf5I3RhcYuT17I4CPlbZgyLxc/ZGv7ciS6esytlbjb3DgUFO6c8JWYMDpdjSWInyGZUErgzqhcA==", + "node_modules/@solana/addresses/node_modules/@solana/codecs-strings": { + "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": { - "@tanstack/query-core": "5.87.4" + "@solana/codecs-core": "2.3.0", + "@solana/codecs-numbers": "2.3.0", + "@solana/errors": "2.3.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" + "engines": { + "node": ">=20.18.0" }, "peerDependencies": { - "react": "^18 || ^19" + "fastestsmallesttextencoderdecoder": "^1.0.22", + "typescript": ">=5.3.3" } }, - "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", - "dev": true, + "node_modules/@solana/addresses/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", - "peer": true, "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" + "chalk": "^5.4.1", + "commander": "^14.0.0" + }, + "bin": { + "errors": "bin/cli.mjs" }, "engines": { - "node": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@testing-library/dom/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, + "node_modules/@solana/addresses/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", - "peer": true, "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@testing-library/dom/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, + "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", - "peer": true, "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" + "@solana/errors": "2.3.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@testing-library/jest-dom": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", - "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", - "dev": true, + "node_modules/@solana/assertions/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": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "picocolors": "^1.1.1", - "redent": "^3.0.0" + "chalk": "^5.4.1", + "commander": "^14.0.0" + }, + "bin": { + "errors": "bin/cli.mjs" }, "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true, - "license": "MIT" + "node_modules/@solana/assertions/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "node_modules/@testing-library/react": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", - "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", - "dev": true, + "node_modules/@solana/buffer-layout": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", + "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.5" + "buffer": "~6.0.3" }, "engines": { - "node": ">=18" - }, + "node": ">=5.10" + } + }, + "node_modules/@solana/codecs": { + "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.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": { - "@testing-library/dom": "^10.0.0", - "@types/react": "^18.0.0 || ^19.0.0", - "@types/react-dom": "^18.0.0 || ^19.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "typescript": ">=5.3.3" + } + }, + "node_modules/@solana/codecs-core": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-6.8.0.tgz", + "integrity": "sha512-udFO8TrvzgROonwX3rY3E2SG675RehILNb4ZYcKlf1mL7vkDJ9bEJnBxi87AEwl8RWZFTl+MhT0MmrJnbpvdug==", + "license": "MIT", + "dependencies": { + "@solana/errors": "6.8.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.0.0" }, "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { + "typescript": { "optional": true } } }, - "node_modules/@testing-library/user-event": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", - "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", - "dev": true, + "node_modules/@solana/codecs-data-structures": { + "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.3.0", + "@solana/codecs-numbers": "2.3.0", + "@solana/errors": "2.3.0" + }, "engines": { - "node": ">=12", - "npm": ">=6" + "node": ">=20.18.0" }, "peerDependencies": { - "@testing-library/dom": ">=7.21.4" + "typescript": ">=5.3.3" } }, - "node_modules/@ts-morph/common": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.11.1.tgz", - "integrity": "sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==", - "dev": true, + "node_modules/@solana/codecs-data-structures/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": { - "fast-glob": "^3.2.7", - "minimatch": "^3.0.4", - "mkdirp": "^1.0.4", - "path-browserify": "^1.0.1" + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, + "node_modules/@solana/codecs-data-structures/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", - "peer": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@solana/codecs-core": "2.3.0", + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, + "node_modules/@solana/codecs-data-structures/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": { - "@babel/types": "^7.0.0" + "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/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "node_modules/@solana/codecs-data-structures/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, + "node_modules/@solana/codecs-numbers": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-6.8.0.tgz", + "integrity": "sha512-ebf4f1D19EAe0uhdUYOCEYnn5+EellsBxbJ42tM2yYEoIBVz5FoBBC0gSsq+UTNbQHFa7XagyBT3LewxXttiTQ==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@solana/codecs-core": "6.8.0", + "@solana/errors": "6.8.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "license": "MIT" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "node_modules/@solana/codecs-strings": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-6.8.0.tgz", + "integrity": "sha512-Rpk5NVhbKYcPnE7wz3IpTp0GVNVs0IYKdmyzByiimgPTiII8eb8ay4wQiYHGHrpYh62hD14Qy3GiGDFgipRKqA==", "license": "MIT", "dependencies": { - "@types/d3-selection": "*" + "@solana/codecs-core": "6.8.0", + "@solana/codecs-numbers": "6.8.0", + "@solana/errors": "6.8.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "fastestsmallesttextencoderdecoder": "^1.0.22", + "typescript": ">=5.0.0" + }, + "peerDependenciesMeta": { + "fastestsmallesttextencoderdecoder": { + "optional": true + }, + "typescript": { + "optional": true + } } }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "node_modules/@solana/codecs/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": { - "@types/d3-color": "*" + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@types/d3-selection": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", - "license": "MIT" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "node_modules/@solana/codecs/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": { - "@types/d3-selection": "*" + "@solana/codecs-core": "2.3.0", + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "node_modules/@solana/codecs/node_modules/@solana/codecs-strings": { + "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": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" + "@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.3.3" } }, - "node_modules/@types/debug": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", - "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "node_modules/@solana/codecs/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": { - "@types/ms": "*" + "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/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/lodash": { - "version": "4.17.24", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", - "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" + "node_modules/@solana/codecs/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "node_modules/@types/node": { - "version": "25.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", - "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", - "dev": true, + "node_modules/@solana/errors": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-6.8.0.tgz", + "integrity": "sha512-HRTrLgTn0c99GKz4v4IKgz2+6soaRY1mh2tLW4sk1Fe4Zzv85Q6ZLK1mXrVGL73z1apyHDrr9/Sd/9ZhUsUvpA==", "license": "MIT", "dependencies": { - "undici-types": "~7.19.0" + "chalk": "5.6.2", + "commander": "14.0.3" + }, + "bin": { + "errors": "bin/cli.mjs" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@types/react": { - "version": "19.1.12", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz", - "integrity": "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==", - "devOptional": true, - "dependencies": { - "csstype": "^3.0.2" + "node_modules/@solana/errors/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@types/react-dom": { - "version": "19.1.9", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz", - "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==", - "devOptional": true, + "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": { - "@types/react": "^19.0.0" + "typescript": ">=5.3.3" } }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" + "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/@types/whatwg-mimetype": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz", - "integrity": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "dev": true, + "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": { - "@types/node": "*" + "@solana/codecs-core": "2.3.0", + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.42.0.tgz", - "integrity": "sha512-Aq2dPqsQkxHOLfb2OPv43RnIvfj05nw8v/6n3B2NABIPpHnjQnaLo9QGMTvml+tv4korl/Cjfrb/BYhoL8UUTQ==", - "dev": true, + "node_modules/@solana/instructions/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": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.42.0", - "@typescript-eslint/type-utils": "8.42.0", - "@typescript-eslint/utils": "8.42.0", - "@typescript-eslint/visitor-keys": "8.42.0", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" + "@solana/errors": "2.3.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=20.18.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@solana/instructions/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-eslint/parser": "^8.42.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=5.3.3" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, + "node_modules/@solana/instructions/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", "engines": { - "node": ">= 4" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.42.0.tgz", - "integrity": "sha512-r1XG74QgShUgXph1BYseJ+KZd17bKQib/yF3SR+demvytiRXrwd12Blnz5eYGm8tXaeRdd4x88MlfwldHoudGg==", - "dev": true, + "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": { - "@typescript-eslint/scope-manager": "8.42.0", - "@typescript-eslint/types": "8.42.0", - "@typescript-eslint/typescript-estree": "8.42.0", - "@typescript-eslint/visitor-keys": "8.42.0", - "debug": "^4.3.4" + "@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": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=20.18.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=5.3.3" } }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.42.0.tgz", - "integrity": "sha512-vfVpLHAhbPjilrabtOSNcUDmBboQNrJUiNAGoImkZKnMjs2TIcWG33s4Ds0wY3/50aZmTMqJa6PiwkwezaAklg==", - "dev": true, + "node_modules/@solana/keys/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": { - "@typescript-eslint/tsconfig-utils": "^8.42.0", - "@typescript-eslint/types": "^8.42.0", - "debug": "^4.3.4" + "@solana/errors": "2.3.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=5.3.3" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.42.0.tgz", - "integrity": "sha512-51+x9o78NBAVgQzOPd17DkNTnIzJ8T/O2dmMBLoK9qbY0Gm52XJcdJcCl18ExBMiHo6jPMErUQWUv5RLE51zJw==", - "dev": true, + "node_modules/@solana/keys/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": { - "@typescript-eslint/types": "8.42.0", - "@typescript-eslint/visitor-keys": "8.42.0" + "@solana/codecs-core": "2.3.0", + "@solana/errors": "2.3.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=20.18.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.42.0.tgz", - "integrity": "sha512-kHeFUOdwAJfUmYKjR3CLgZSglGHjbNTi1H8sTYRYV2xX6eNz4RyJ2LIgsDLKf8Yi0/GL1WZAC/DgZBeBft8QAQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node_modules/@solana/keys/node_modules/@solana/codecs-strings": { + "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.3.0", + "@solana/codecs-numbers": "2.3.0", + "@solana/errors": "2.3.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "engines": { + "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "fastestsmallesttextencoderdecoder": "^1.0.22", + "typescript": ">=5.3.3" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.42.0.tgz", - "integrity": "sha512-9KChw92sbPTYVFw3JLRH1ockhyR3zqqn9lQXol3/YbI6jVxzWoGcT3AsAW0mu1MY0gYtsXnUGV/AKpkAj5tVlQ==", - "dev": true, + "node_modules/@solana/keys/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": { - "@typescript-eslint/types": "8.42.0", - "@typescript-eslint/typescript-estree": "8.42.0", - "@typescript-eslint/utils": "8.42.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" + "chalk": "^5.4.1", + "commander": "^14.0.0" }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "bin": { + "errors": "bin/cli.mjs" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "engines": { + "node": ">=20.18.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=5.3.3" } }, - "node_modules/@typescript-eslint/types": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.42.0.tgz", - "integrity": "sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw==", - "dev": true, + "node_modules/@solana/keys/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.42.0.tgz", - "integrity": "sha512-ku/uYtT4QXY8sl9EDJETD27o3Ewdi72hcXg1ah/kkUgBvAYHLwj2ofswFFNXS+FL5G+AGkxBtvGt8pFBHKlHsQ==", - "dev": true, + "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/@solana/kit/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": { - "@typescript-eslint/project-service": "8.42.0", - "@typescript-eslint/tsconfig-utils": "8.42.0", - "@typescript-eslint/types": "8.42.0", - "@typescript-eslint/visitor-keys": "8.42.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "chalk": "^5.4.1", + "commander": "^14.0.0" + }, + "bin": { + "errors": "bin/cli.mjs" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@solana/kit/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "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": ">=4.8.4 <6.0.0" + "typescript": ">=5.3.3" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, + "node_modules/@solana/options": { + "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": { - "balanced-match": "^1.0.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" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, + "node_modules/@solana/options/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": { - "brace-expansion": "^2.0.1" + "@solana/errors": "2.3.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=20.18.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/@solana/options/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": ">=10" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@typescript-eslint/utils": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.42.0.tgz", - "integrity": "sha512-JnIzu7H3RH5BrKC4NoZqRfmjqCIS1u3hGZltDYJgkVdqAezl4L9d1ZLw+36huCujtSBSAirGINF/S4UxOcR+/g==", - "dev": true, + "node_modules/@solana/options/node_modules/@solana/codecs-strings": { + "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": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.42.0", - "@typescript-eslint/types": "8.42.0", - "@typescript-eslint/typescript-estree": "8.42.0" + "@solana/codecs-core": "2.3.0", + "@solana/codecs-numbers": "2.3.0", + "@solana/errors": "2.3.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=20.18.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "fastestsmallesttextencoderdecoder": "^1.0.22", + "typescript": ">=5.3.3" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.42.0.tgz", - "integrity": "sha512-3WbiuzoEowaEn8RSnhJBrxSwX8ULYE9CXaPepS2C2W3NSA5NNIvBaslpBSBElPq0UGr0xVJlXFWOAKIkyylydQ==", - "dev": true, + "node_modules/@solana/options/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": { - "@typescript-eslint/types": "8.42.0", - "eslint-visitor-keys": "^4.2.1" + "chalk": "^5.4.1", + "commander": "^14.0.0" + }, + "bin": { + "errors": "bin/cli.mjs" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@solana/options/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@vanilla-extract/css": { - "version": "1.17.3", - "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.17.3.tgz", - "integrity": "sha512-jHivr1UPoJTX5Uel4AZSOwrCf4mO42LcdmnhJtUxZaRWhW4FviFbIfs0moAWWld7GOT+2XnuVZjjA/K32uUnMQ==", + "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": { - "@emotion/hash": "^0.9.0", - "@vanilla-extract/private": "^1.0.8", - "css-what": "^6.1.0", - "cssesc": "^3.0.0", - "csstype": "^3.0.7", - "dedent": "^1.5.3", - "deep-object-diff": "^1.1.9", - "deepmerge": "^4.2.2", - "lru-cache": "^10.4.3", - "media-query-parser": "^2.0.2", - "modern-ahocorasick": "^1.0.0", - "picocolors": "^1.0.0" + "@solana/addresses": "2.3.0", + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vanilla-extract/css/node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "node_modules/@solana/programs/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": ">=0.10.0" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vanilla-extract/css/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "node_modules/@solana/programs/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "node_modules/@vanilla-extract/dynamic": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vanilla-extract/dynamic/-/dynamic-2.1.4.tgz", - "integrity": "sha512-7+Ot7VlP3cIzhJnTsY/kBtNs21s0YD7WI1rKJJKYP56BkbDxi/wrQUWMGEczKPUDkJuFcvbye+E2ub1u/mHH9w==", - "dependencies": { - "@vanilla-extract/private": "^1.0.8" + "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/@vanilla-extract/private": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@vanilla-extract/private/-/private-1.0.9.tgz", - "integrity": "sha512-gT2jbfZuaaCLrAxwXbRgIhGhcXbRZCG3v4TTUnjw0EJ7ArdBRxkq4msNJkbuRkCgfIK5ATmprB5t9ljvLeFDEA==" + "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/@vanilla-extract/sprinkles": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/@vanilla-extract/sprinkles/-/sprinkles-1.6.4.tgz", - "integrity": "sha512-lW3MuIcdIeHKX81DzhTnw68YJdL1ial05exiuvTLJMdHXQLKcVB93AncLPajMM6mUhaVVx5ALZzNHMTrq/U9Hg==", + "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": { - "@vanilla-extract/css": "^1.0.0" + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/build-utils": { - "version": "13.16.0", - "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-13.16.0.tgz", - "integrity": "sha512-m0X81LKOvmiHviKuBkTxy74x9hbAfmiFRFM8Gvy7JpDYJKcoh0Ymj6V7bWbyHYN9QW2PIn/2EA1Ru2dIh7/1QQ==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@solana/rpc-api/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": { - "@vercel/python-analysis": "0.11.0", - "cjs-module-lexer": "1.2.3", - "es-module-lexer": "1.5.0" + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/build-utils/node_modules/es-module-lexer": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", - "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==", - "dev": true, - "license": "MIT" + "node_modules/@solana/rpc-api/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/@vercel/error-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@vercel/error-utils/-/error-utils-2.0.3.tgz", - "integrity": "sha512-CqC01WZxbLUxoiVdh9B/poPbNpY9U+tO1N9oWHwTl5YAZxcqXmmWJ8KNMFItJCUUWdY3J3xv8LvAuQv2KZ5YdQ==", - "dev": true, - "license": "Apache-2.0" + "node_modules/@solana/rpc-api/node_modules/@solana/codecs-strings": { + "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.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.3.3" + } }, - "node_modules/@vercel/nft": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-1.5.0.tgz", - "integrity": "sha512-IWTDeIoWhQ7ZtRO/JRKH+jhmeQvZYhtGPmzw/QGDY+wDCQqfm25P9yIdoAFagu4fWsK4IwZXDFIjrmp5rRm/sA==", - "dev": true, + "node_modules/@solana/rpc-api/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": { - "@mapbox/node-pre-gyp": "^2.0.0", - "@rollup/pluginutils": "^5.1.3", - "acorn": "^8.6.0", - "acorn-import-attributes": "^1.9.5", - "async-sema": "^3.1.1", - "bindings": "^1.4.0", - "estree-walker": "2.0.2", - "glob": "^13.0.0", - "graceful-fs": "^4.2.9", - "node-gyp-build": "^4.2.2", - "picomatch": "^4.0.2", - "resolve-from": "^5.0.0" + "chalk": "^5.4.1", + "commander": "^14.0.0" }, "bin": { - "nft": "out/cli.js" + "errors": "bin/cli.mjs" }, "engines": { - "node": ">=20" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/nft/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vercel/nft/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, + "node_modules/@solana/rpc-api/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", "engines": { - "node": ">=12" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@vercel/nft/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, + "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": ">=8" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/node": { - "version": "5.7.6", - "resolved": "https://registry.npmjs.org/@vercel/node/-/node-5.7.6.tgz", - "integrity": "sha512-eN292YfJfRNDybdj18xsBesjdMUo6V4nrN6BW/m143tEF4aFObPvwEc4m3izOEHwCgw4V5Egx2u4Fr4emvdB7Q==", - "dev": true, - "license": "Apache-2.0", + "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": { - "@edge-runtime/node-utils": "2.3.0", - "@edge-runtime/primitives": "4.1.0", - "@edge-runtime/vm": "3.2.0", - "@types/node": "20.11.0", - "@vercel/build-utils": "13.16.0", - "@vercel/error-utils": "2.0.3", - "@vercel/nft": "1.5.0", - "@vercel/static-config": "3.2.0", - "async-listen": "3.0.0", - "cjs-module-lexer": "1.2.3", - "edge-runtime": "2.5.9", - "es-module-lexer": "1.4.1", - "esbuild": "0.27.0", - "etag": "1.8.1", - "mime-types": "2.1.35", - "node-fetch": "2.6.9", - "path-to-regexp": "6.1.0", - "path-to-regexp-updated": "npm:path-to-regexp@6.3.0", - "ts-morph": "12.0.0", - "tsx": "4.21.0", - "typescript": "npm:typescript@5.9.3", - "undici": "5.28.4" + "@solana/errors": "2.3.0", + "@solana/rpc-spec-types": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/node/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz", - "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==", - "cpu": [ - "ppc64" - ], - "dev": true, + "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", - "optional": true, - "os": [ - "aix" - ], "engines": { - "node": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/node/node_modules/@esbuild/android-arm": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz", - "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@solana/rpc-spec/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", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "chalk": "^5.4.1", + "commander": "^14.0.0" + }, + "bin": { + "errors": "bin/cli.mjs" + }, "engines": { - "node": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/node/node_modules/@esbuild/android-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz", - "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@solana/rpc-spec/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@vercel/node/node_modules/@esbuild/android-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz", - "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==", - "cpu": [ - "x64" - ], - "dev": true, + "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", - "optional": true, - "os": [ - "android" - ], + "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": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/node/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz", - "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==", - "cpu": [ - "arm64" - ], - "dev": true, + "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", - "optional": true, - "os": [ - "darwin" - ], + "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": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/node/node_modules/@esbuild/darwin-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz", - "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==", - "cpu": [ - "x64" - ], - "dev": true, + "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", - "optional": true, - "os": [ - "darwin" - ], + "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": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3", + "ws": "^8.18.0" } }, - "node_modules/@vercel/node/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz", - "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@solana/rpc-subscriptions-channel-websocket/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", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "chalk": "^5.4.1", + "commander": "^14.0.0" + }, + "bin": { + "errors": "bin/cli.mjs" + }, "engines": { - "node": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/node/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz", - "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@solana/rpc-subscriptions-channel-websocket/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=18" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@vercel/node/node_modules/@esbuild/linux-arm": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz", - "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==", - "cpu": [ - "arm" - ], - "dev": true, + "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", - "optional": true, - "os": [ - "linux" - ], + "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": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/node/node_modules/@esbuild/linux-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz", - "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@solana/rpc-subscriptions-spec/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", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "chalk": "^5.4.1", + "commander": "^14.0.0" + }, + "bin": { + "errors": "bin/cli.mjs" + }, "engines": { - "node": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/node/node_modules/@esbuild/linux-ia32": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz", - "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@solana/rpc-subscriptions-spec/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@vercel/node/node_modules/@esbuild/linux-loong64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz", - "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==", - "cpu": [ - "loong64" - ], - "dev": true, + "node_modules/@solana/rpc-subscriptions/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", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "chalk": "^5.4.1", + "commander": "^14.0.0" + }, + "bin": { + "errors": "bin/cli.mjs" + }, "engines": { - "node": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/node/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz", - "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==", - "cpu": [ - "mips64el" - ], - "dev": true, + "node_modules/@solana/rpc-subscriptions/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@vercel/node/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz", - "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==", - "cpu": [ - "ppc64" - ], - "dev": true, + "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", - "optional": true, - "os": [ - "linux" - ], + "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": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/node/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz", - "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==", - "cpu": [ - "riscv64" - ], - "dev": true, + "node_modules/@solana/rpc-transformers/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", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "chalk": "^5.4.1", + "commander": "^14.0.0" + }, + "bin": { + "errors": "bin/cli.mjs" + }, "engines": { - "node": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/node/node_modules/@esbuild/linux-s390x": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz", - "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==", - "cpu": [ - "s390x" - ], - "dev": true, + "node_modules/@solana/rpc-transformers/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@vercel/node/node_modules/@esbuild/linux-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz", - "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==", - "cpu": [ - "x64" - ], - "dev": true, + "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", - "optional": true, - "os": [ - "linux" - ], + "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": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/node/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz", - "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@solana/rpc-transport-http/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", - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "chalk": "^5.4.1", + "commander": "^14.0.0" + }, + "bin": { + "errors": "bin/cli.mjs" + }, "engines": { - "node": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/node/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz", - "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@solana/rpc-transport-http/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], "engines": { - "node": ">=18" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@vercel/node/node_modules/@esbuild/sunos-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz", - "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==", - "cpu": [ - "x64" - ], - "dev": true, + "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", - "optional": true, - "os": [ - "sunos" - ], + "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": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/node/node_modules/@esbuild/win32-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz", - "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@solana/rpc-types/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", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@solana/errors": "2.3.0" + }, "engines": { - "node": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/node/node_modules/@esbuild/win32-ia32": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz", - "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@solana/rpc-types/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", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@solana/codecs-core": "2.3.0", + "@solana/errors": "2.3.0" + }, "engines": { - "node": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/node/node_modules/@esbuild/win32-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz", - "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@solana/rpc-types/node_modules/@solana/codecs-strings": { + "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", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@solana/codecs-core": "2.3.0", + "@solana/codecs-numbers": "2.3.0", + "@solana/errors": "2.3.0" + }, "engines": { - "node": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "fastestsmallesttextencoderdecoder": "^1.0.22", + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/node/node_modules/@types/node": { - "version": "20.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.0.tgz", - "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==", - "dev": true, + "node_modules/@solana/rpc-types/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": { - "undici-types": "~5.26.4" + "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/@vercel/node/node_modules/esbuild": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz", - "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==", - "dev": true, - "hasInstallScript": true, + "node_modules/@solana/rpc-types/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, "engines": { - "node": ">=18" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.0", - "@esbuild/android-arm": "0.27.0", - "@esbuild/android-arm64": "0.27.0", - "@esbuild/android-x64": "0.27.0", - "@esbuild/darwin-arm64": "0.27.0", - "@esbuild/darwin-x64": "0.27.0", - "@esbuild/freebsd-arm64": "0.27.0", - "@esbuild/freebsd-x64": "0.27.0", - "@esbuild/linux-arm": "0.27.0", - "@esbuild/linux-arm64": "0.27.0", - "@esbuild/linux-ia32": "0.27.0", - "@esbuild/linux-loong64": "0.27.0", - "@esbuild/linux-mips64el": "0.27.0", - "@esbuild/linux-ppc64": "0.27.0", - "@esbuild/linux-riscv64": "0.27.0", - "@esbuild/linux-s390x": "0.27.0", - "@esbuild/linux-x64": "0.27.0", - "@esbuild/netbsd-arm64": "0.27.0", - "@esbuild/netbsd-x64": "0.27.0", - "@esbuild/openbsd-arm64": "0.27.0", - "@esbuild/openbsd-x64": "0.27.0", - "@esbuild/openharmony-arm64": "0.27.0", - "@esbuild/sunos-x64": "0.27.0", - "@esbuild/win32-arm64": "0.27.0", - "@esbuild/win32-ia32": "0.27.0", - "@esbuild/win32-x64": "0.27.0" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@vercel/node/node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dev": true, + "node_modules/@solana/rpc/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": { - "whatwg-url": "^5.0.0" + "chalk": "^5.4.1", + "commander": "^14.0.0" + }, + "bin": { + "errors": "bin/cli.mjs" }, "engines": { - "node": "4.x || >=6.0.0" + "node": ">=20.18.0" }, "peerDependencies": { - "encoding": "^0.1.0" + "typescript": ">=5.3.3" + } + }, + "node_modules/@solana/rpc/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@vercel/node/node_modules/typescript": { - "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", - "tsserver": "bin/tsserver" + "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": ">=14.17" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/node/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vercel/python-analysis": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@vercel/python-analysis/-/python-analysis-0.11.0.tgz", - "integrity": "sha512-gsoj+nscmNm0xDh+tRhECRhit2VlAVaD7jc9h93sN6rDEBDxPo7eLEgIJFzVDaAItxERZ9Od2IK/04fB9vFy+g==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@solana/signers/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": { - "@bytecodealliance/preview2-shim": "0.17.6", - "@renovatebot/pep440": "4.2.1", - "fs-extra": "11.1.1", - "js-yaml": "4.1.1", - "minimatch": "10.1.1", - "smol-toml": "1.5.2", - "zod": "3.22.4" + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/python-analysis/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "dev": true, - "license": "BlueOak-1.0.0", + "node_modules/@solana/signers/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": { - "@isaacs/brace-expansion": "^5.0.0" + "chalk": "^5.4.1", + "commander": "^14.0.0" + }, + "bin": { + "errors": "bin/cli.mjs" }, "engines": { - "node": "20 || >=22" + "node": ">=20.18.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/python-analysis/node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "dev": true, + "node_modules/@solana/signers/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, "funding": { - "url": "https://github.com/sponsors/colinhacks" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@vercel/static-config": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vercel/static-config/-/static-config-3.2.0.tgz", - "integrity": "sha512-UpOEIgWxWx0M+mDe1IMdHS6JuWM/L5nNIJ4ixX8v9JgBAejymo88OkgnmfLCNMem0Wd+b5vcQPWLdZybCndlsA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "ajv": "8.6.3", - "json-schema-to-ts": "1.6.4", - "ts-morph": "12.0.0" - } - }, - "node_modules/@vercel/static-config/node_modules/ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", - "dev": true, + "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": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "@solana/errors": "2.3.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vercel/static-config/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "dev": true, + "node_modules/@solana/subscribable/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": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" + "chalk": "^5.4.1", + "commander": "^14.0.0" + }, + "bin": { + "errors": "bin/cli.mjs" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=20.18.0" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + "typescript": ">=5.3.3" } }, - "node_modules/@vitest/expect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz", - "integrity": "sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==", - "dev": true, - "dependencies": { - "@vitest/spy": "1.6.1", - "@vitest/utils": "1.6.1", - "chai": "^4.3.10" + "node_modules/@solana/subscribable/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@vitest/runner": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz", - "integrity": "sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==", - "dev": true, + "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": { - "@vitest/utils": "1.6.1", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" + "@solana/accounts": "2.3.0", + "@solana/codecs": "2.3.0", + "@solana/errors": "2.3.0", + "@solana/rpc-types": "2.3.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dev": true, + "node_modules/@solana/sysvars/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": { - "yocto-queue": "^1.0.0" + "chalk": "^5.4.1", + "commander": "^14.0.0" + }, + "bin": { + "errors": "bin/cli.mjs" }, "engines": { - "node": ">=18" + "node": ">=20.18.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", - "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", - "dev": true, + "node_modules/@solana/sysvars/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", "engines": { - "node": ">=12.20" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@vitest/snapshot": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz", - "integrity": "sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==", - "dev": true, + "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": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" + "@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" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vitest/spy": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz", - "integrity": "sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==", - "dev": true, + "node_modules/@solana/transaction-confirmation/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": { - "tinyspy": "^2.2.0" + "@solana/errors": "2.3.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@vitest/utils": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz", - "integrity": "sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==", - "dev": true, + "node_modules/@solana/transaction-confirmation/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": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" + "@solana/codecs-core": "2.3.0", + "@solana/errors": "2.3.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@wagmi/connectors": { - "version": "5.9.9", - "resolved": "https://registry.npmjs.org/@wagmi/connectors/-/connectors-5.9.9.tgz", - "integrity": "sha512-6+eqU7P2OtxU2PkIw6kHojfYYUJykYG2K5rSkzVh29RDCAjhJqGEZW5f1b8kV5rUBORip1NpST8QTBNi96JHGQ==", + "node_modules/@solana/transaction-confirmation/node_modules/@solana/codecs-strings": { + "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": { - "@base-org/account": "1.1.1", - "@coinbase/wallet-sdk": "4.3.6", - "@gemini-wallet/core": "0.2.0", - "@metamask/sdk": "0.32.0", - "@safe-global/safe-apps-provider": "0.18.6", - "@safe-global/safe-apps-sdk": "9.1.0", - "@walletconnect/ethereum-provider": "2.21.1", - "cbw-sdk": "npm:@coinbase/wallet-sdk@3.9.3" + "@solana/codecs-core": "2.3.0", + "@solana/codecs-numbers": "2.3.0", + "@solana/errors": "2.3.0" }, - "funding": { - "url": "https://github.com/sponsors/wevm" + "engines": { + "node": ">=20.18.0" }, "peerDependencies": { - "@wagmi/core": "2.20.3", - "typescript": ">=5.0.4", - "viem": "2.x" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "fastestsmallesttextencoderdecoder": "^1.0.22", + "typescript": ">=5.3.3" } }, - "node_modules/@wagmi/core": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/@wagmi/core/-/core-2.20.3.tgz", - "integrity": "sha512-gsbuHnWxf0AYZISvR8LvF/vUCIq6/ZwT5f5/FKd6wLA7Wq05NihCvmQpIgrcVbpSJPL67wb6S8fXm3eJGJA1vQ==", + "node_modules/@solana/transaction-confirmation/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": { - "eventemitter3": "5.0.1", - "mipd": "0.0.7", - "zustand": "5.0.0" + "chalk": "^5.4.1", + "commander": "^14.0.0" }, - "funding": { - "url": "https://github.com/sponsors/wevm" + "bin": { + "errors": "bin/cli.mjs" }, - "peerDependencies": { - "@tanstack/query-core": ">=5.0.0", - "typescript": ">=5.0.4", - "viem": "2.x" + "engines": { + "node": ">=20.18.0" }, - "peerDependenciesMeta": { - "@tanstack/query-core": { - "optional": true - }, - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@wagmi/core/node_modules/zustand": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.0.tgz", - "integrity": "sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==", + "node_modules/@solana/transaction-confirmation/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", "engines": { - "node": ">=12.20.0" - }, - "peerDependencies": { - "@types/react": ">=18.0.0", - "immer": ">=9.0.6", - "react": ">=18.0.0", - "use-sync-external-store": ">=1.2.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - }, - "use-sync-external-store": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@walletconnect/core": { - "version": "2.21.1", - "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.1.tgz", - "integrity": "sha512-Tp4MHJYcdWD846PH//2r+Mu4wz1/ZU/fr9av1UWFiaYQ2t2TPLDiZxjLw54AAEpMqlEHemwCgiRiAmjR1NDdTQ==", - "license": "Apache-2.0", + "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": { - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-provider": "1.0.14", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/jsonrpc-ws-connection": "1.0.16", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "@walletconnect/relay-api": "1.0.11", - "@walletconnect/relay-auth": "1.1.0", - "@walletconnect/safe-json": "1.0.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.1", - "@walletconnect/utils": "2.21.1", - "@walletconnect/window-getters": "1.0.1", - "es-toolkit": "1.33.0", - "events": "3.3.0", - "uint8arrays": "3.1.0" + "@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": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@walletconnect/environment": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.1.tgz", - "integrity": "sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==", + "node_modules/@solana/transaction-messages/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": { - "tslib": "1.14.1" - } - }, - "node_modules/@walletconnect/environment/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@walletconnect/ethereum-provider": { - "version": "2.21.1", - "resolved": "https://registry.npmjs.org/@walletconnect/ethereum-provider/-/ethereum-provider-2.21.1.tgz", - "integrity": "sha512-SSlIG6QEVxClgl1s0LMk4xr2wg4eT3Zn/Hb81IocyqNSGfXpjtawWxKxiC5/9Z95f1INyBD6MctJbL/R1oBwIw==", - "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit": "1.7.8", - "@walletconnect/jsonrpc-http-connection": "1.0.8", - "@walletconnect/jsonrpc-provider": "1.0.14", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/sign-client": "2.21.1", - "@walletconnect/types": "2.21.1", - "@walletconnect/universal-provider": "2.21.1", - "@walletconnect/utils": "2.21.1", - "events": "3.3.0" + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@walletconnect/events": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@walletconnect/events/-/events-1.0.1.tgz", - "integrity": "sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==", + "node_modules/@solana/transaction-messages/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": { - "keyvaluestorage-interface": "^1.0.0", - "tslib": "1.14.1" + "@solana/codecs-core": "2.3.0", + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@walletconnect/events/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@walletconnect/heartbeat": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@walletconnect/heartbeat/-/heartbeat-1.2.2.tgz", - "integrity": "sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==", + "node_modules/@solana/transaction-messages/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": { - "@walletconnect/events": "^1.0.1", - "@walletconnect/time": "^1.0.2", - "events": "^3.3.0" + "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/@walletconnect/jsonrpc-http-connection": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.8.tgz", - "integrity": "sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==", + "node_modules/@solana/transaction-messages/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", - "dependencies": { - "@walletconnect/jsonrpc-utils": "^1.0.6", - "@walletconnect/safe-json": "^1.0.1", - "cross-fetch": "^3.1.4", - "events": "^3.3.0" + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@walletconnect/jsonrpc-http-connection/node_modules/cross-fetch": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", - "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "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": { - "node-fetch": "^2.7.0" + "@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/@walletconnect/jsonrpc-provider": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.14.tgz", - "integrity": "sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==", + "node_modules/@solana/transactions/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": { - "@walletconnect/jsonrpc-utils": "^1.0.8", - "@walletconnect/safe-json": "^1.0.2", - "events": "^3.3.0" + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@walletconnect/jsonrpc-types": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.4.tgz", - "integrity": "sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==", + "node_modules/@solana/transactions/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": { - "events": "^3.3.0", - "keyvaluestorage-interface": "^1.0.0" + "@solana/codecs-core": "2.3.0", + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@walletconnect/jsonrpc-utils": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz", - "integrity": "sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==", + "node_modules/@solana/transactions/node_modules/@solana/codecs-strings": { + "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": { - "@walletconnect/environment": "^1.0.1", - "@walletconnect/jsonrpc-types": "^1.0.3", - "tslib": "1.14.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.3.3" } }, - "node_modules/@walletconnect/jsonrpc-utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@walletconnect/jsonrpc-ws-connection": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.16.tgz", - "integrity": "sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==", + "node_modules/@solana/transactions/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": { - "@walletconnect/jsonrpc-utils": "^1.0.6", - "@walletconnect/safe-json": "^1.0.2", - "events": "^3.3.0", - "ws": "^7.5.1" + "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/@walletconnect/jsonrpc-ws-connection/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "node_modules/@solana/transactions/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", "engines": { - "node": ">=8.3.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@walletconnect/keyvaluestorage": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", - "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", - "license": "MIT", + "node_modules/@solana/wallet-adapter-alpha": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-alpha/-/wallet-adapter-alpha-0.1.14.tgz", + "integrity": "sha512-ZSEvQmTdkiXPeHWIHbvdU4yDC5PfyTqG/1ZKIf2Uo6c+HslMkYer7mf9HUqJJ80dU68XqBbzBlIv34LCDVWijw==", + "license": "Apache-2.0", "dependencies": { - "@walletconnect/safe-json": "^1.0.1", - "idb-keyval": "^6.2.1", - "unstorage": "^1.9.0" + "@solana/wallet-adapter-base": "^0.9.27" }, - "peerDependencies": { - "@react-native-async-storage/async-storage": "1.x" + "engines": { + "node": ">=20" }, - "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { - "optional": true - } + "peerDependencies": { + "@solana/web3.js": "^1.98.0" } }, - "node_modules/@walletconnect/logger": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@walletconnect/logger/-/logger-2.1.2.tgz", - "integrity": "sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==", - "license": "MIT", + "node_modules/@solana/wallet-adapter-avana": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-avana/-/wallet-adapter-avana-0.1.17.tgz", + "integrity": "sha512-I3h+dPWVTEylOWoY2qxyI7mhcn3QNL+tkYLrZLi3+PBaoz79CVIVFi3Yb4NTKYDP+hz7/Skm/ZsomSY5SJua5A==", + "license": "Apache-2.0", "dependencies": { - "@walletconnect/safe-json": "^1.0.2", - "pino": "7.11.0" + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" } }, - "node_modules/@walletconnect/relay-api": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@walletconnect/relay-api/-/relay-api-1.0.11.tgz", - "integrity": "sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==", - "license": "MIT", + "node_modules/@solana/wallet-adapter-base": { + "version": "0.9.27", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-base/-/wallet-adapter-base-0.9.27.tgz", + "integrity": "sha512-kXjeNfNFVs/NE9GPmysBRKQ/nf+foSaq3kfVSeMcO/iVgigyRmB551OjU3WyAolLG/1jeEfKLqF9fKwMCRkUqg==", + "license": "Apache-2.0", "dependencies": { - "@walletconnect/jsonrpc-types": "^1.0.2" + "@solana/wallet-standard-features": "^1.3.0", + "@wallet-standard/base": "^1.1.0", + "@wallet-standard/features": "^1.1.0", + "eventemitter3": "^5.0.1" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" } }, - "node_modules/@walletconnect/relay-auth": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@walletconnect/relay-auth/-/relay-auth-1.1.0.tgz", - "integrity": "sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ==", - "license": "MIT", + "node_modules/@solana/wallet-adapter-base-ui": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-base-ui/-/wallet-adapter-base-ui-0.1.6.tgz", + "integrity": "sha512-OuxLBOXA2z3dnmuGP0agEb7xhsT3+Nttd+gAkSLgJRX2vgNEAy3Fvw8IKPXv1EE2vRdw/U6Rq0Yjpp3McqVZhw==", + "license": "Apache-2.0", "dependencies": { - "@noble/curves": "1.8.0", - "@noble/hashes": "1.7.0", - "@walletconnect/safe-json": "^1.0.1", - "@walletconnect/time": "^1.0.2", - "uint8arrays": "^3.0.0" + "@solana/wallet-adapter-react": "^0.15.39" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0", + "react": "*" } }, - "node_modules/@walletconnect/relay-auth/node_modules/@noble/hashes": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.0.tgz", - "integrity": "sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==", - "license": "MIT", + "node_modules/@solana/wallet-adapter-bitkeep": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-bitkeep/-/wallet-adapter-bitkeep-0.3.24.tgz", + "integrity": "sha512-LQvS9pr/Qm95w8XFAvxqgYKVndgifwlQYV1+Exc0XMnbxpw40blMTMKxSfiiPq78e3Zi2XWRApQyqtFUafOK5g==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, "engines": { - "node": "^14.21.3 || >=16" + "node": ">=20" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "peerDependencies": { + "@solana/web3.js": "^1.98.0" } }, - "node_modules/@walletconnect/safe-json": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.2.tgz", - "integrity": "sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==", - "license": "MIT", + "node_modules/@solana/wallet-adapter-bitpie": { + "version": "0.5.22", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-bitpie/-/wallet-adapter-bitpie-0.5.22.tgz", + "integrity": "sha512-S1dSg041f8CKqzy7HQy/BPhY56ZZiZeanmdx4S6fMDpf717sgkCa7jBjLFtx8ugZzO/VpYQJtRXtKEtHpx0X0A==", + "license": "Apache-2.0", "dependencies": { - "tslib": "1.14.1" + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" } }, - "node_modules/@walletconnect/safe-json/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@walletconnect/sign-client": { - "version": "2.21.1", - "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.1.tgz", - "integrity": "sha512-QaXzmPsMnKGV6tc4UcdnQVNOz4zyXgarvdIQibJ4L3EmLat73r5ZVl4c0cCOcoaV7rgM9Wbphgu5E/7jNcd3Zg==", - "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", + "node_modules/@solana/wallet-adapter-clover": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-clover/-/wallet-adapter-clover-0.4.23.tgz", + "integrity": "sha512-0PIAP0g1CmSLyphwXLHjePpKiB1dg+veWIbkziIdLHwSsLq6aBr2FimC/ljrbtqrduL1bH7sphNZOGE0IF0JtQ==", "license": "Apache-2.0", "dependencies": { - "@walletconnect/core": "2.21.1", - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-utils": "1.0.8", + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-coin98": { + "version": "0.5.24", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-coin98/-/wallet-adapter-coin98-0.5.24.tgz", + "integrity": "sha512-lEHk2L00PitymreyACv5ShGyyeG/NLhryohcke4r/8yDL3m2XTOeyzkhd1/6mDWavMhno1WNivHxByNHDSQhEw==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27", + "bs58": "^6.0.0", + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-coin98/node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/@solana/wallet-adapter-coin98/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", + "dependencies": { + "base-x": "^5.0.0" + } + }, + "node_modules/@solana/wallet-adapter-coinbase": { + "version": "0.1.23", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-coinbase/-/wallet-adapter-coinbase-0.1.23.tgz", + "integrity": "sha512-vCJi/clbq1VVgydPFnHGAc2jdEhDAClYmhEAR4RJp9UHBg+MEQUl1WW8PVIREY5uOzJHma0qEiyummIfyt0b4A==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-coinhub": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-coinhub/-/wallet-adapter-coinhub-0.3.22.tgz", + "integrity": "sha512-an/0FyUIY5xWfPYcOxjaVV11IbCCeErURbw+nHyWV89kw/CuiaYwaWXxATGdj8XJjg/UPsPbiLAGyKkdOMjjfw==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-fractal": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-fractal/-/wallet-adapter-fractal-0.1.12.tgz", + "integrity": "sha512-gu9deyHxwrRfBt6VqaCVIN7FmViZn47NwORuja4wc95OX2ZxsjGE6hEs1bJsfy7uf/CsUjwDe1V309r7PlKz8g==", + "license": "Apache-2.0", + "dependencies": { + "@fractalwagmi/solana-wallet-adapter": "^0.1.1", + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-huobi": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-huobi/-/wallet-adapter-huobi-0.1.19.tgz", + "integrity": "sha512-wLv2E/VEYhgVot7qyRop2adalHyw0Y+Rb1BG9RkFUa3paZUZEsIozBK3dBScTwSCJpmLCjzTVWZEvtHOfVLLSw==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-hyperpay": { + "version": "0.1.18", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-hyperpay/-/wallet-adapter-hyperpay-0.1.18.tgz", + "integrity": "sha512-On95zV7Dq5UTqYAtLFvttwDgPVz0a2iWl1XZ467YYXbvXPWSxkQmvPD0jHPUvHepGw60Hf5p0qkylyYANIAgoQ==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-keystone": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-keystone/-/wallet-adapter-keystone-0.1.19.tgz", + "integrity": "sha512-u7YmrQCrdZHI2hwJpX3rAiYuUdK0UIFX6m8+LSDOlA2bijlPJuTeH416aqqjueJTpvuZHowOPmV/no46PBqG0Q==", + "license": "Apache-2.0", + "dependencies": { + "@keystonehq/sol-keyring": "^0.20.0", + "@solana/wallet-adapter-base": "^0.9.27", + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-krystal": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-krystal/-/wallet-adapter-krystal-0.1.16.tgz", + "integrity": "sha512-crAVzzPzMo63zIH0GTHDqYjIrjGFhrAjCntOV2hMjebMGSAmaUPTJKRi+vgju2Ons2Ktva7tRwiVaJxD8370DA==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-ledger": { + "version": "0.9.29", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-ledger/-/wallet-adapter-ledger-0.9.29.tgz", + "integrity": "sha512-1feOHQGdMOPtXtXBCuUuHlsoco2iqDNcUTbHW+Bj+3ItXGJctwMicSSWgfATEAFNUanvOB+kKZ4N3B1MQrP/9w==", + "license": "Apache-2.0", + "dependencies": { + "@ledgerhq/devices": "^8.4.5", + "@ledgerhq/hw-transport": "^6.31.5", + "@ledgerhq/hw-transport-webhid": "^6.30.1", + "@solana/wallet-adapter-base": "^0.9.27", + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-mathwallet": { + "version": "0.9.22", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-mathwallet/-/wallet-adapter-mathwallet-0.9.22.tgz", + "integrity": "sha512-5ePUe4lyTbwHlXQJwNrXRXDfyouAeIbfBTkJxcAWVivlVQcxcnE7BOwsCjImVaGNh4MumMLblxd2ywoSVDNf/g==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-neko": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-neko/-/wallet-adapter-neko-0.2.16.tgz", + "integrity": "sha512-0l/s+NJUGkyVm24nHF0aPsTMo9lsdw21PO+obDszJziZZmiKrI1l1WmhCDwYwAllY0nQjaxQ0tJBYy066pmnVg==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-nightly": { + "version": "0.1.20", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-nightly/-/wallet-adapter-nightly-0.1.20.tgz", + "integrity": "sha512-37kRXzZ+54JhT21Cp3lC0O+hg9ZBC4epqkwNbev8piNnZUghKdsvsG5RjbsngVY6572jPlFGiuniDmb0vUSs3A==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-nufi": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-nufi/-/wallet-adapter-nufi-0.1.21.tgz", + "integrity": "sha512-up9V4BfWl/oR0rIDQio1JD2oic+isHPk5DI4sUUxBPmWF/BYlpDVxwEfL7Xjg+jBfeiYGn0sVjTvaHY4/qUZAw==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-onto": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-onto/-/wallet-adapter-onto-0.1.11.tgz", + "integrity": "sha512-fyTJ5xFaYD8/Izu8q+oGD9iXZvg7ljLxi/JkVwN/HznVdac95ee1fvthkF3PPRmWGZeA7O/kYAxdQMXxlwy+xw==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-particle": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-particle/-/wallet-adapter-particle-0.1.16.tgz", + "integrity": "sha512-uB2FFN2SqV0cJQTvQ+pyVL6OXwGMhbz5KuWU14pcZWqfrOxs+L4grksLwMCGw+yBw/+jydLGMTUWntuEm6r7ag==", + "license": "Apache-2.0", + "dependencies": { + "@particle-network/solana-wallet": "^1.3.2", + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-phantom": { + "version": "0.9.29", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-phantom/-/wallet-adapter-phantom-0.9.29.tgz", + "integrity": "sha512-nAFvjtX2S1aRLzi70CSLajsmixGxev+1O1GzGzety4eyfv2AYxTHEuDIJySugcMTtSTleVpOMhHXjzlUkxuf1w==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-react": { + "version": "0.15.39", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-react/-/wallet-adapter-react-0.15.39.tgz", + "integrity": "sha512-WXtlo88ith5m22qB+qiGw301/Zb9r5pYr4QdXWmlXnRNqwST5MGmJWhG+/RVrzc+OG7kSb3z1gkVNv+2X/Y0Gg==", + "license": "Apache-2.0", + "dependencies": { + "@solana-mobile/wallet-adapter-mobile": "^2.2.0", + "@solana/wallet-adapter-base": "^0.9.27", + "@solana/wallet-standard-wallet-adapter-react": "^1.1.4" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0", + "react": "*" + } + }, + "node_modules/@solana/wallet-adapter-react-ui": { + "version": "0.9.39", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-react-ui/-/wallet-adapter-react-ui-0.9.39.tgz", + "integrity": "sha512-B6GdOobwVuIgEX1qjcbTQEeo+0UGs3WPuBeUlR0dDCzQh9J3IAWRRyL/47FYSHYRp26LAu4ImWy4+M2TFD5OJg==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27", + "@solana/wallet-adapter-base-ui": "^0.1.6", + "@solana/wallet-adapter-react": "^0.15.39" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0", + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@solana/wallet-adapter-safepal": { + "version": "0.5.22", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-safepal/-/wallet-adapter-safepal-0.5.22.tgz", + "integrity": "sha512-K1LlQIPoKgg3rdDIVUtMV218+uUM1kCtmuVKq2N+e+ZC8zK05cW3w7++nakDtU97AOmg+y4nsSFRCFsWBWmhTw==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-saifu": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-saifu/-/wallet-adapter-saifu-0.1.19.tgz", + "integrity": "sha512-RWguxtKSXTZUNlc7XTUuMi78QBjy5rWcg7Fis3R8rfMtCBZIUZ/0nPb/wZbRfTk3OqpvnwRQl89TC9d2P7/SvA==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-salmon": { + "version": "0.1.18", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-salmon/-/wallet-adapter-salmon-0.1.18.tgz", + "integrity": "sha512-YN2/j5MsaurrlVIijlYA7SfyJU6IClxfmbUjQKEuygq0eP6S7mIAB/LK7qK2Ut3ll5vyTq/5q9Gejy6zQEaTMg==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27", + "salmon-adapter-sdk": "^1.1.1" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-sky": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-sky/-/wallet-adapter-sky-0.1.19.tgz", + "integrity": "sha512-jJBAg5TQLyPUSFtjne3AGxUgGV8cxMicJCdDFG6HalNK6N9jAB9eWfPxwsGRKv2RijXVtzo3/ejzcKrGp3oAuQ==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-solflare": { + "version": "0.6.33", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-solflare/-/wallet-adapter-solflare-0.6.33.tgz", + "integrity": "sha512-eYDjpXMF+LyfWf5jG89IqJG2ehaEsWvv7P3y3NjPmhCqe0WjfFc2EwED19G4R0JUqdhnY5zFj+gn3pJ3ystGhg==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27", + "@solflare-wallet/sdk": "^1.4.2" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-solong": { + "version": "0.9.22", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-solong/-/wallet-adapter-solong-0.9.22.tgz", + "integrity": "sha512-lGTwQmHQrSTQp3OkYUbfzeFCDGi60ScOpgfC0IOZNSfWl7jwG5tnRXAJ4A1RG9Val9XcVe5b2biur2hyEMJlSQ==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-spot": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-spot/-/wallet-adapter-spot-0.1.19.tgz", + "integrity": "sha512-p7UgT+4+2r82YIJ+NsniNrXKSaYNgrM43FHkjdVVmEw69ZGvSSXJ3x108bCE9pshy6ldl+sb7VhJGg+uQ/OF9g==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-tokenary": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-tokenary/-/wallet-adapter-tokenary-0.1.16.tgz", + "integrity": "sha512-7FrDcRrXogCn13Ni2vwA1K/74RMLq+n37+j5fW0KtU2AEA6QVPqPgl/o0rRRgwdaG1q6EM3BXfgscYkmMTlxQQ==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-tokenpocket": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-tokenpocket/-/wallet-adapter-tokenpocket-0.4.23.tgz", + "integrity": "sha512-5/sgNj+WK0I+0+pMB8CmTPhRbImXJ8ZcqfO8+i2uHbmKwU+zddPFDT4Fin/Gm9AX/n//M+5bxhhN4FpnA9oM8w==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-torus": { + "version": "0.11.32", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-torus/-/wallet-adapter-torus-0.11.32.tgz", + "integrity": "sha512-LHvCNIL3tvD3q3EVJ1VrcvqIz7JbLBJcvpi5+PwG6DQzrRLHJ7oxOHFwc1SUX41WwifQHKI+lXWlTrVpIOgDOA==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27", + "@toruslabs/solana-embed": "^2.1.0", + "assert": "^2.1.0", + "crypto-browserify": "^3.12.1", + "process": "^0.11.10", + "stream-browserify": "^3.0.0" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-trezor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-trezor/-/wallet-adapter-trezor-0.1.6.tgz", + "integrity": "sha512-jItXhzaNq/UxSSPKVxgrUamx4mr2voMDjcEBHVUqOQhcujmzoPpBSahWKgpsDIegeX6zDCmuTAULnTpLs6YuzA==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27", + "@trezor/connect-web": "^9.5.5", + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-trust": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-trust/-/wallet-adapter-trust-0.1.17.tgz", + "integrity": "sha512-raVtYoemFxrmsq8xtxhp3mD1Hke7CJuPqZsYr20zODjM1H2N+ty6zQa7z9ApJtosYNHAGek5S1/+n4/gnrC4nQ==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-unsafe-burner": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-unsafe-burner/-/wallet-adapter-unsafe-burner-0.1.11.tgz", + "integrity": "sha512-VyRQ2xRbVcpRSPTv+qyxOYFtWHxrVlLiH2nIuqIRCZcmGkFmxr+egwMjCCIURS6KCX7Ye3AbHK8IWJX6p9yuFQ==", + "license": "Apache-2.0", + "dependencies": { + "@noble/curves": "^1.9.1", + "@solana/wallet-adapter-base": "^0.9.27", + "@solana/wallet-standard-features": "^1.3.0", + "@solana/wallet-standard-util": "^1.1.2" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-unsafe-burner/node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@solana/wallet-adapter-unsafe-burner/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@solana/wallet-adapter-walletconnect": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-walletconnect/-/wallet-adapter-walletconnect-0.1.21.tgz", + "integrity": "sha512-OE2ZZ60RbeobRsCa2gTD7IgXqofSa5B+jBLUu0DO8TVeRWro40JKYJuUedthALjO5oLelWSpcds+i7PRL+RQcQ==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27", + "@walletconnect/solana-adapter": "^0.0.8" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-wallets": { + "version": "0.19.38", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-wallets/-/wallet-adapter-wallets-0.19.38.tgz", + "integrity": "sha512-uwWP3DZe8uG9X80SMHo8+NvXaat8ChBnZExTcvQVQhxhvzsYdS04YyVhCiU0zFyPpmkZuBCsArHXDQnFr1XhjA==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-alpha": "^0.1.14", + "@solana/wallet-adapter-avana": "^0.1.17", + "@solana/wallet-adapter-bitkeep": "^0.3.24", + "@solana/wallet-adapter-bitpie": "^0.5.22", + "@solana/wallet-adapter-clover": "^0.4.23", + "@solana/wallet-adapter-coin98": "^0.5.24", + "@solana/wallet-adapter-coinbase": "^0.1.23", + "@solana/wallet-adapter-coinhub": "^0.3.22", + "@solana/wallet-adapter-fractal": "^0.1.12", + "@solana/wallet-adapter-huobi": "^0.1.19", + "@solana/wallet-adapter-hyperpay": "^0.1.18", + "@solana/wallet-adapter-keystone": "^0.1.19", + "@solana/wallet-adapter-krystal": "^0.1.16", + "@solana/wallet-adapter-ledger": "^0.9.29", + "@solana/wallet-adapter-mathwallet": "^0.9.22", + "@solana/wallet-adapter-neko": "^0.2.16", + "@solana/wallet-adapter-nightly": "^0.1.20", + "@solana/wallet-adapter-nufi": "^0.1.21", + "@solana/wallet-adapter-onto": "^0.1.11", + "@solana/wallet-adapter-particle": "^0.1.16", + "@solana/wallet-adapter-phantom": "^0.9.29", + "@solana/wallet-adapter-safepal": "^0.5.22", + "@solana/wallet-adapter-saifu": "^0.1.19", + "@solana/wallet-adapter-salmon": "^0.1.18", + "@solana/wallet-adapter-sky": "^0.1.19", + "@solana/wallet-adapter-solflare": "^0.6.33", + "@solana/wallet-adapter-solong": "^0.9.22", + "@solana/wallet-adapter-spot": "^0.1.19", + "@solana/wallet-adapter-tokenary": "^0.1.16", + "@solana/wallet-adapter-tokenpocket": "^0.4.23", + "@solana/wallet-adapter-torus": "^0.11.32", + "@solana/wallet-adapter-trezor": "^0.1.6", + "@solana/wallet-adapter-trust": "^0.1.17", + "@solana/wallet-adapter-unsafe-burner": "^0.1.11", + "@solana/wallet-adapter-walletconnect": "^0.1.21", + "@solana/wallet-adapter-xdefi": "^0.1.11" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-adapter-xdefi": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-xdefi/-/wallet-adapter-xdefi-0.1.11.tgz", + "integrity": "sha512-WzhzhNtA4ECX9ZMyAyZV8TciuwvbW8VoJWwF+hdts5xHfnitRJDR/17Br6CQH0CFKkqymVHCMWOBIWEjmp+3Rw==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0" + } + }, + "node_modules/@solana/wallet-standard-chains": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@solana/wallet-standard-chains/-/wallet-standard-chains-1.1.1.tgz", + "integrity": "sha512-Us3TgL4eMVoVWhuC4UrePlYnpWN+lwteCBlhZDUhFZBJ5UMGh94mYPXno3Ho7+iHPYRtuCi/ePvPcYBqCGuBOw==", + "license": "Apache-2.0", + "dependencies": { + "@wallet-standard/base": "^1.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@solana/wallet-standard-features": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@solana/wallet-standard-features/-/wallet-standard-features-1.3.0.tgz", + "integrity": "sha512-ZhpZtD+4VArf6RPitsVExvgkF+nGghd1rzPjd97GmBximpnt1rsUxMOEyoIEuH3XBxPyNB6Us7ha7RHWQR+abg==", + "license": "Apache-2.0", + "dependencies": { + "@wallet-standard/base": "^1.1.0", + "@wallet-standard/features": "^1.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@solana/wallet-standard-util": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@solana/wallet-standard-util/-/wallet-standard-util-1.1.2.tgz", + "integrity": "sha512-rUXFNP4OY81Ddq7qOjQV4Kmkozx4wjYAxljvyrqPx8Ycz0FYChG/hQVWqvgpK3sPsEaO/7ABG1NOACsyAKWNOA==", + "license": "Apache-2.0", + "dependencies": { + "@noble/curves": "^1.8.0", + "@solana/wallet-standard-chains": "^1.1.1", + "@solana/wallet-standard-features": "^1.3.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@solana/wallet-standard-wallet-adapter-react": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@solana/wallet-standard-wallet-adapter-react/-/wallet-standard-wallet-adapter-react-1.1.4.tgz", + "integrity": "sha512-xa4KVmPgB7bTiWo4U7lg0N6dVUtt2I2WhEnKlIv0jdihNvtyhOjCKMjucWet6KAVhir6I/mSWrJk1U9SvVvhCg==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-standard-wallet-adapter-base": "^1.1.4", + "@wallet-standard/app": "^1.1.0", + "@wallet-standard/base": "^1.1.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/wallet-adapter-base": "*", + "react": "*" + } + }, + "node_modules/@solana/wallet-standard-wallet-adapter-react/node_modules/@solana/wallet-standard-wallet-adapter-base": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@solana/wallet-standard-wallet-adapter-base/-/wallet-standard-wallet-adapter-base-1.1.4.tgz", + "integrity": "sha512-Q2Rie9YaidyFA4UxcUIxUsvynW+/gE2noj/Wmk+IOwDwlVrJUAXCvFaCNsPDSyKoiYEKxkSnlG13OA1v08G4iw==", + "license": "Apache-2.0", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.23", + "@solana/wallet-standard-chains": "^1.1.1", + "@solana/wallet-standard-features": "^1.3.0", + "@solana/wallet-standard-util": "^1.1.2", + "@wallet-standard/app": "^1.1.0", + "@wallet-standard/base": "^1.1.0", + "@wallet-standard/features": "^1.1.0", + "@wallet-standard/wallet": "^1.1.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.98.0", + "bs58": "^6.0.0" + } + }, + "node_modules/@solana/web3.js": { + "version": "1.98.4", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.4.tgz", + "integrity": "sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.0", + "@noble/curves": "^1.4.2", + "@noble/hashes": "^1.4.0", + "@solana/buffer-layout": "^4.0.1", + "@solana/codecs-numbers": "^2.1.0", + "agentkeepalive": "^4.5.0", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.1", + "node-fetch": "^2.7.0", + "rpc-websockets": "^9.0.2", + "superstruct": "^2.0.2" + } + }, + "node_modules/@solana/web3.js/node_modules/@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/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@solana/web3.js/node_modules/superstruct": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", + "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@solflare-wallet/sdk": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@solflare-wallet/sdk/-/sdk-1.4.2.tgz", + "integrity": "sha512-jrseNWipwl9xXZgrzwZF3hhL0eIVxuEtoZOSLmuPuef7FgHjstuTtNJAeT4icA7pzdDV4hZvu54pI2r2f7SmrQ==", + "license": "Apache-2.0", + "dependencies": { + "bs58": "^5.0.0", + "eventemitter3": "^5.0.1", + "uuid": "^9.0.0" + }, + "peerDependencies": { + "@solana/web3.js": "*" + } + }, + "node_modules/@solflare-wallet/sdk/node_modules/base-x": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.1.tgz", + "integrity": "sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==", + "license": "MIT" + }, + "node_modules/@solflare-wallet/sdk/node_modules/bs58": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "license": "MIT", + "dependencies": { + "base-x": "^4.0.0" + } + }, + "node_modules/@solflare-wallet/sdk/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@solidity-parser/parser": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.20.2.tgz", + "integrity": "sha512-rbu0bzwNvMcwAjH86hiEAcOeRI2EeK8zCkHDrFykh/Al8mvJeFmjy3UrE7GYQjNwOgbGUUtCn5/k8CB8zIu7QA==", + "license": "MIT" + }, + "node_modules/@starknet-io/get-starknet-wallet-standard": { + "version": "5.0.0-beta.0", + "resolved": "https://registry.npmjs.org/@starknet-io/get-starknet-wallet-standard/-/get-starknet-wallet-standard-5.0.0-beta.0.tgz", + "integrity": "sha512-1QBmWnd76KzKwnVlRXLh58wtd1e0P5fyOhs0bCCjivTpGJ2nUPRvTgmzVJStNBcuQ7617UfB5qIyBnkig31TmQ==", + "license": "MIT", + "dependencies": { + "@starknet-io/types-js": "^0.7.10", + "@wallet-standard/base": "^1.1.0", + "@wallet-standard/features": "^1.1.0", + "ox": "^0.4.4" + } + }, + "node_modules/@starknet-io/get-starknet-wallet-standard/node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@starknet-io/get-starknet-wallet-standard/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@starknet-io/get-starknet-wallet-standard/node_modules/@scure/bip32": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@starknet-io/get-starknet-wallet-standard/node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@starknet-io/get-starknet-wallet-standard/node_modules/@starknet-io/types-js": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@starknet-io/types-js/-/types-js-0.7.10.tgz", + "integrity": "sha512-1VtCqX4AHWJlRRSYGSn+4X1mqolI1Tdq62IwzoU2vUuEE72S1OlEeGhpvd6XsdqXcfHmVzYfj8k1XtKBQqwo9w==", + "license": "MIT" + }, + "node_modules/@starknet-io/get-starknet-wallet-standard/node_modules/ox": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.4.4.tgz", + "integrity": "sha512-oJPEeCDs9iNiPs6J0rTx+Y0KGeCGyCAA3zo94yZhm8G5WpOxrwUtn2Ie/Y8IyARSqqY/j9JTKA3Fc1xs1DvFnw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@starknet-io/starknet-types-010": { + "name": "@starknet-io/types-js", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@starknet-io/types-js/-/types-js-0.10.0.tgz", + "integrity": "sha512-7ALSydz6pq3YIOpq5a7OkkxqwJciMc9Nlph0OGjhcC3xX0xH30XgizmziLyYVN10oO9+BJk8M9KbJjpzdbtRSw==", + "license": "MIT" + }, + "node_modules/@starknet-io/starknet-types-08": { + "name": "@starknet-io/types-js", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@starknet-io/types-js/-/types-js-0.8.4.tgz", + "integrity": "sha512-0RZ3TZHcLsUTQaq1JhDSCM8chnzO4/XNsSCozwDET64JK5bjFDIf2ZUkta+tl5Nlbf4usoU7uZiDI/Q57kt2SQ==", + "license": "MIT" + }, + "node_modules/@starknet-io/starknet-types-09": { + "name": "@starknet-io/types-js", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@starknet-io/types-js/-/types-js-0.9.2.tgz", + "integrity": "sha512-vWOc0FVSn+RmabozIEWcEny1I73nDGTvOrLYJsR1x7LGA3AZmqt4i/aW69o/3i2NN5CVP8Ok6G1ayRQJKye3Wg==", + "license": "MIT" + }, + "node_modules/@starknet-io/types-js": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@starknet-io/types-js/-/types-js-0.9.1.tgz", + "integrity": "sha512-ngLjOFuWOI4EFij8V+nl5tgHVACr6jqgLNUQbgD+AgnTcAN33SemBPXDIsovwK1Mz1U04Cz3qjDOnTq7067ZQw==", + "license": "MIT" + }, + "node_modules/@stellar/js-xdr": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-3.1.2.tgz", + "integrity": "sha512-VVolPL5goVEIsvuGqDc5uiKxV03lzfWdvYg1KikvwheDmTBO68CKDji3bAZ/kppZrx5iTA8z3Ld5yuytcvhvOQ==", + "license": "Apache-2.0" + }, + "node_modules/@stellar/stellar-base": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-14.1.0.tgz", + "integrity": "sha512-A8kFli6QGy22SRF45IjgPAJfUNGjnI+R7g4DF5NZYVsD1kGf7B4ITyc4OPclLV9tqNI4/lXxafGEw0JEUbHixw==", + "license": "Apache-2.0", + "dependencies": { + "@noble/curves": "^1.9.6", + "@stellar/js-xdr": "^3.1.2", + "base32.js": "^0.1.0", + "bignumber.js": "^9.3.1", + "buffer": "^6.0.3", + "sha.js": "^2.4.12" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@stellar/stellar-base/node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@stellar/stellar-base/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@stellar/stellar-sdk": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-14.2.0.tgz", + "integrity": "sha512-7nh2ogzLRMhfkIC0fGjn1LHUzk3jqVw8tjAuTt5ADWfL9CSGBL18ILucE9igz2L/RU2AZgeAvhujAnW91Ut/oQ==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@stellar/stellar-base": "^14.0.1", + "axios": "^1.12.2", + "bignumber.js": "^9.3.1", + "eventsource": "^2.0.2", + "feaxios": "^0.0.23", + "randombytes": "^2.1.0", + "toml": "^3.0.0", + "urijs": "^1.19.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@swc/core": { + "version": "1.15.30", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.30.tgz", + "integrity": "sha512-R8VQbQY1BZcbIF2p3gjlTCwAQzx1A194ugWfwld5y+WgVVWqVKm7eURGGOVbQVubgKWzidP2agomBbg96rZilQ==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.26" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.15.30", + "@swc/core-darwin-x64": "1.15.30", + "@swc/core-linux-arm-gnueabihf": "1.15.30", + "@swc/core-linux-arm64-gnu": "1.15.30", + "@swc/core-linux-arm64-musl": "1.15.30", + "@swc/core-linux-ppc64-gnu": "1.15.30", + "@swc/core-linux-s390x-gnu": "1.15.30", + "@swc/core-linux-x64-gnu": "1.15.30", + "@swc/core-linux-x64-musl": "1.15.30", + "@swc/core-win32-arm64-msvc": "1.15.30", + "@swc/core-win32-ia32-msvc": "1.15.30", + "@swc/core-win32-x64-msvc": "1.15.30" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.15.30", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.30.tgz", + "integrity": "sha512-VvpP+vq08HmGYewMWvrdsxh9s2lthz/808zXm8Yu5kaqeR8Yia2b0eYXleHQ3VAjoStUDk6LzTheBW9KXYQdMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.15.30", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.30.tgz", + "integrity": "sha512-WiJA0hiZI3nwQAO6mu5RqigtWGDtth4Hiq6rbZxAaQyhIcqKIg5IoMRc1Y071lrNJn29eEDMC86Rq58xgUxlDg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.15.30", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.30.tgz", + "integrity": "sha512-YANuFUo48kIT6plJgCD0keae9HFXfjxsbvsgevqc0hr/07X/p7sAWTFOGYEc2SXcASaK7UvuQqzlbW8pr7R79g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.15.30", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.30.tgz", + "integrity": "sha512-VndG8jaR4ugY6u+iVOT0Q+d2fZd7sLgjPgN8W/Le+3EbZKl+cRfFxV7Eoz4gfLqhmneZPdcIzf9T3LkgkmqNLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.15.30", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.30.tgz", + "integrity": "sha512-1SYGs2l0Yyyi0pR/P/NKz/x0kqxkoiw+BXeJjLUdecSk/KasncWlJrc6hOvFSgKHOBrzgM5jwuluKtlT8dnrcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-ppc64-gnu": { + "version": "1.15.30", + "resolved": "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.30.tgz", + "integrity": "sha512-TXREtiXeRhbfDFbmhnkIsXpKfzbfT73YkV2ZF6w0sfxgjC5zI2ZAbaCOq25qxvegofj2K93DtOpm9RLaBgqR2g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-s390x-gnu": { + "version": "1.15.30", + "resolved": "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.30.tgz", + "integrity": "sha512-DCR2YYeyd6DQE4OuDhImouuNcjXEiEdnn1Y0DyGteugPEDvVuvYk8Xddi+4o2SgWH6jiW8/I+3emZvbep1NC+g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.15.30", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.30.tgz", + "integrity": "sha512-5Pizw3NgfOJ5BJOBK8TIRa59xFW2avESTOBDPTAYwZYa1JNDs+KMF9lUfjJiJLM5HiMs/wPheA9eiT0q9m2AoA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.15.30", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.30.tgz", + "integrity": "sha512-qyqydP/wyH8alcIP4a2hnGSjHLJjm9H7yDFup+CPy9oTahFgLLwnNcv5UHXqO2Qs3AIND+cls5f/Bb6hqpxdgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.15.30", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.30.tgz", + "integrity": "sha512-CaQENgDHVGOg1mSF5sQVgvfFHG9kjMor2rkLMLeLOkfZYNj13ppnJ9+lfaBZLZUMMbnlGQnavCJb8PVBUOso7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.15.30", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.30.tgz", + "integrity": "sha512-30VdLeGk6fugiUs/kUdJ/pAg7z/zpvVbR11RH60jZ0Z42WIeIniYx0rLEWN7h/pKJ3CopqsQ3RsogCAkRKiA2g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.15.30", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.30.tgz", + "integrity": "sha512-4iObHPR+Q4oDY110EF5SF5eIaaVJNpMdG9C0q3Q92BsJ5y467uHz7sYQhP60WYlLFsLQ1el2YrIPUItUAQGOKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.21.tgz", + "integrity": "sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@swc/types": { + "version": "0.1.26", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.26.tgz", + "integrity": "sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@swc/wasm": { + "version": "1.15.30", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.15.30.tgz", + "integrity": "sha512-Z/27kZFJpKzmTgcOAlMrQZ3WEZOJDqk879wSY9SEuLtMVHxEZ9t4R3rGNUGj9e7ldY6GP6DCvN7Q0m7UTrhToA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.18.tgz", + "integrity": "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "tailwindcss": "4.1.18" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.87.4", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.87.4.tgz", + "integrity": "sha512-uNsg6zMxraEPDVO2Bn+F3/ctHi+Zsk+MMpcN8h6P7ozqD088F6mFY5TfGM7zuyIrL7HKpDyu6QHfLWiDxh3cuw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.87.4", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.87.4.tgz", + "integrity": "sha512-T5GT/1ZaNsUXf5I3RhcYuT17I4CPlbZgyLxc/ZGv7ciS6esytlbjb3DgUFO6c8JWYMDpdjSWInyGZUErgzqhcA==", + "dependencies": { + "@tanstack/query-core": "5.87.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", + "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@toruslabs/base-controllers": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@toruslabs/base-controllers/-/base-controllers-5.11.0.tgz", + "integrity": "sha512-5AsGOlpf3DRIsd6PzEemBoRq+o2OhgSFXj5LZD6gXcBlfe0OpF+ydJb7Q8rIt5wwpQLNJCs8psBUbqIv7ukD2w==", + "license": "ISC", + "dependencies": { + "@ethereumjs/util": "^9.0.3", + "@toruslabs/broadcast-channel": "^10.0.2", + "@toruslabs/http-helpers": "^6.1.1", + "@toruslabs/openlogin-jrpc": "^8.3.0", + "@toruslabs/openlogin-utils": "^8.2.1", + "async-mutex": "^0.5.0", + "bignumber.js": "^9.1.2", + "bowser": "^2.11.0", + "jwt-decode": "^4.0.0", + "loglevel": "^1.9.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" + } + }, + "node_modules/@toruslabs/base-controllers/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/@toruslabs/base-controllers/node_modules/@ethereumjs/util": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-9.1.0.tgz", + "integrity": "sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==", + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/rlp": "^5.0.2", + "ethereum-cryptography": "^2.2.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@toruslabs/base-controllers/node_modules/async-mutex": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", + "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@toruslabs/broadcast-channel": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@toruslabs/broadcast-channel/-/broadcast-channel-10.0.2.tgz", + "integrity": "sha512-aZbKNgV/OhiTKSdxBTGO86xRdeR7Ct1vkB8yeyXRX32moARhZ69uJQL49jKh4cWKV3VeijrL9XvKdn5bzgHQZg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.0", + "@toruslabs/eccrypto": "^4.0.0", + "@toruslabs/metadata-helpers": "^5.1.0", + "loglevel": "^1.9.1", + "oblivious-set": "1.4.0", + "socket.io-client": "^4.7.5", + "unload": "^2.4.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + } + }, + "node_modules/@toruslabs/constants": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@toruslabs/constants/-/constants-13.4.0.tgz", + "integrity": "sha512-CjmnMQ5Oj0bqSBGkhv7Xm3LciGJDHwe4AJ1LF6mijlP+QcCnUM5I6kVp60j7zZ/r0DT7nIEiuHHHczGpCZor0A==", + "license": "MIT", + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" + } + }, + "node_modules/@toruslabs/eccrypto": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@toruslabs/eccrypto/-/eccrypto-4.0.0.tgz", + "integrity": "sha512-Z3EINkbsgJx1t6jCDVIJjLSUEGUtNIeDjhMWmeDGOWcP/+v/yQ1hEvd1wfxEz4q5WqIHhevacmPiVxiJ4DljGQ==", + "license": "CC0-1.0", + "dependencies": { + "elliptic": "^6.5.4" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + } + }, + "node_modules/@toruslabs/http-helpers": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@toruslabs/http-helpers/-/http-helpers-6.1.1.tgz", + "integrity": "sha512-bJYOaltRzklzObhRdutT1wau17vXyrCCBKJOeN46F1t99MUXi5udQNeErFOcr9qBsvrq2q67eVBkU5XOeBMX5A==", + "license": "MIT", + "dependencies": { + "lodash.merge": "^4.6.2", + "loglevel": "^1.9.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "^7.x", + "@sentry/types": "^7.x" + }, + "peerDependenciesMeta": { + "@sentry/types": { + "optional": true + } + } + }, + "node_modules/@toruslabs/metadata-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@toruslabs/metadata-helpers/-/metadata-helpers-5.1.0.tgz", + "integrity": "sha512-7fdqKuWUaJT/ng+PlqrA4XKkn8Dij4JJozfv/4gHTi0f/6JFncpzIces09jTV70hCf0JIsTCvIDlzKOdJ+aeZg==", + "license": "MIT", + "dependencies": { + "@toruslabs/eccrypto": "^4.0.0", + "@toruslabs/http-helpers": "^6.1.0", + "elliptic": "^6.5.5", + "ethereum-cryptography": "^2.1.3", + "json-stable-stringify": "^1.1.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" + } + }, + "node_modules/@toruslabs/metadata-helpers/node_modules/bn.js": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "license": "MIT" + }, + "node_modules/@toruslabs/metadata-helpers/node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/@toruslabs/openlogin-jrpc": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@toruslabs/openlogin-jrpc/-/openlogin-jrpc-8.3.0.tgz", + "integrity": "sha512-1OdSkUXGXJobkkMIJHuf+XzwmUB4ROy6uQfPEJ3NXvNj84+N4hNpvC4JPg7VoWBHdfCba9cv6QnQsVArlwai4A==", + "license": "ISC", + "dependencies": { + "end-of-stream": "^1.4.4", + "events": "^3.3.0", + "fast-safe-stringify": "^2.1.1", + "once": "^1.4.0", + "pump": "^3.0.0", + "readable-stream": "^4.5.2" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" + } + }, + "node_modules/@toruslabs/openlogin-jrpc/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@toruslabs/openlogin-utils": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@toruslabs/openlogin-utils/-/openlogin-utils-8.2.1.tgz", + "integrity": "sha512-NSOtj61NZe7w9qbd92cYwMlE/1UwPGtDH02NfUjoEEc3p1yD5U2cLZjdSwsnAgjGNgRqVomXpND4hii12lI/ew==", + "license": "ISC", + "dependencies": { + "@toruslabs/constants": "^13.2.0", + "base64url": "^3.0.1", + "color": "^4.2.3" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" + } + }, + "node_modules/@toruslabs/solana-embed": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@toruslabs/solana-embed/-/solana-embed-2.1.0.tgz", + "integrity": "sha512-rgZniKy+yuqJp8/Z/RcqzhTL4iCH+4nP55XD5T2nEIajAClsmonsGp24AUqYwEqu+7x2hjumZEh+12rUv+Ippw==", + "deprecated": "This sdk is now deprecated. Please use @web3auth/ws-embed instead", + "license": "ISC", + "dependencies": { + "@solana/web3.js": "^1.91.4", + "@toruslabs/base-controllers": "^5.5.5", + "@toruslabs/http-helpers": "^6.1.1", + "@toruslabs/openlogin-jrpc": "^8.1.1", + "eth-rpc-errors": "^4.0.3", + "fast-deep-equal": "^3.1.3", + "lodash-es": "^4.17.21", + "loglevel": "^1.9.1", + "pump": "^3.0.0" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" + } + }, + "node_modules/@trezor/analytics": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.5.0.tgz", + "integrity": "sha512-evILW5XJEmfPlf0TY1duOLtGJ47pdGeSKVE3P75ODEUsRNxtPVqlkOUBPmYpCxPnzS8XDmkatT8lf9/DF0G6nA==", + "license": "See LICENSE.md in repo root", + "dependencies": { + "@trezor/env-utils": "1.5.0", + "@trezor/utils": "9.5.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/blockchain-link": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.6.2.tgz", + "integrity": "sha512-HMz+Dm6nMflqRkaebMqpv3uNnVkRrb6lD2HKTHNBGhjVbqf0wRzJ8JoQ08wn/sF00ljJZz8pGnpcMYHJNxE+wQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@solana-program/compute-budget": "^0.8.0", + "@solana-program/stake": "^0.2.1", + "@solana-program/token": "^0.5.1", + "@solana-program/token-2022": "^0.4.2", + "@solana/kit": "^2.3.0", + "@solana/rpc-types": "^2.3.0", + "@stellar/stellar-sdk": "14.2.0", + "@trezor/blockchain-link-types": "1.5.1", + "@trezor/blockchain-link-utils": "1.5.2", + "@trezor/env-utils": "1.5.0", + "@trezor/utils": "9.5.0", + "@trezor/utxo-lib": "2.5.0", + "@trezor/websocket-client": "1.3.0", + "@types/web": "^0.0.197", + "crypto-browserify": "3.12.0", + "socks-proxy-agent": "8.0.5", + "stream-browserify": "^3.0.0", + "xrpl": "4.4.3" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/blockchain-link-types": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.5.1.tgz", + "integrity": "sha512-Idavz6LwLBW8sXc69fh5AJEnl666EDl2Nt3io7updvBgOR0/P12I900DgjNhCKtiWuv66A33/5RE7zLcj3lfnw==", + "license": "See LICENSE.md in repo root", + "dependencies": { + "@trezor/utils": "9.5.0", + "@trezor/utxo-lib": "2.5.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/blockchain-link-utils": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.5.2.tgz", + "integrity": "sha512-OSS5OEE98FMnYfjoEALPjBt7ebjC/FKnq3HOolHdEWXBpVlXZNN2+Vo1R9J6WbZUU087sHuUTJJy/GJYWY13Tg==", + "license": "See LICENSE.md in repo root", + "dependencies": { + "@mobily/ts-belt": "^3.13.1", + "@stellar/stellar-sdk": "14.2.0", + "@trezor/env-utils": "1.5.0", + "@trezor/protobuf": "1.5.2", + "@trezor/utils": "9.5.0", + "xrpl": "4.4.3" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/blockchain-link-utils/node_modules/@trezor/protobuf": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.5.2.tgz", + "integrity": "sha512-zViaL1jKue8DUTVEDg0C/lMipqNMd/Z3kr29/+MeZOoupjaXIQ2Lqp3WAMe8hvNTKKX8aNQH9JrbapJ6w9FMXw==", + "license": "See LICENSE.md in repo root", + "dependencies": { + "@trezor/schema-utils": "1.4.0", + "long": "5.2.5", + "protobufjs": "7.4.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/blockchain-link-utils/node_modules/protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@trezor/blockchain-link/node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@trezor/connect": { + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.7.3.tgz", + "integrity": "sha512-oAOfvJHT8tPqOXTmCOhn8uTZcoqSDuWAiWXQegx7C46tq+NLg+enkYXxUYEHq/9PmfZAOrUT9VMxZDsXM2thkA==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@ethereumjs/common": "^10.1.0", + "@ethereumjs/tx": "^10.1.0", + "@fivebinaries/coin-selection": "3.0.0", + "@mobily/ts-belt": "^3.13.1", + "@noble/hashes": "^1.6.1", + "@scure/bip39": "^1.5.1", + "@solana-program/compute-budget": "^0.8.0", + "@solana-program/system": "^0.7.0", + "@solana-program/token": "^0.5.1", + "@solana-program/token-2022": "^0.4.2", + "@solana/kit": "^2.3.0", + "@trezor/blockchain-link": "2.6.2", + "@trezor/blockchain-link-types": "1.5.1", + "@trezor/blockchain-link-utils": "1.5.2", + "@trezor/connect-analytics": "1.4.0", + "@trezor/connect-common": "0.5.1", + "@trezor/crypto-utils": "1.2.0", + "@trezor/device-authenticity": "1.1.2", + "@trezor/device-utils": "1.2.0", + "@trezor/env-utils": "^1.5.0", + "@trezor/protobuf": "1.5.3", + "@trezor/protocol": "1.3.1", + "@trezor/schema-utils": "1.4.0", + "@trezor/transport": "1.6.3", + "@trezor/type-utils": "1.2.0", + "@trezor/utils": "9.5.0", + "@trezor/utxo-lib": "2.5.0", + "blakejs": "^1.2.1", + "bs58": "^6.0.0", + "bs58check": "^4.0.0", + "cbor": "^10.0.10", + "cross-fetch": "^4.0.0", + "jws": "^4.0.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/connect-analytics": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@trezor/connect-analytics/-/connect-analytics-1.4.0.tgz", + "integrity": "sha512-hy2J2oeIhRC/e1bOWXo5dsVMVnDwO2UKnxhR6FD8PINR3jgM6PWAXc6k33WJsBcyiTzwMP7/xPysLcgNJH5o4w==", + "license": "See LICENSE.md in repo root", + "dependencies": { + "@trezor/analytics": "1.5.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/connect-common": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.5.1.tgz", + "integrity": "sha512-wdpVCwdylBh4SBO5Ys40tB/d59UlfjmxgBHDkkLgaR+JcqkthCfiw5VlUrV9wu65lquejAZhA5KQL4mUUUhCow==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@trezor/env-utils": "1.5.0", + "@trezor/type-utils": "1.2.0", + "@trezor/utils": "9.5.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/connect-web": { + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/@trezor/connect-web/-/connect-web-9.7.3.tgz", + "integrity": "sha512-oTI/v9sUJMvLZgLa0seSGyPaumXydRYeAT4OVTQxIaEiL1hOA0yH+UvEfT4WKwxbxOtOqWosD8chP3uuWSArcg==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@trezor/connect": "9.7.3", + "@trezor/connect-common": "0.5.1", + "@trezor/utils": "9.5.0", + "@trezor/websocket-client": "1.3.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/connect/node_modules/@ethereumjs/common": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-10.1.1.tgz", + "integrity": "sha512-NefPzPlrJ9w+NWVe06P+sHZQU98E1AEU9vhiHJEVT2wEcNBC1YX6hON9+smrfbn86C4U1pb2zbvjhkF+n/LKBw==", + "license": "MIT", + "dependencies": { + "@ethereumjs/util": "^10.1.1", + "eventemitter3": "^5.0.1" + } + }, + "node_modules/@trezor/connect/node_modules/@ethereumjs/rlp": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-10.1.1.tgz", + "integrity": "sha512-jbnWTEwcpoY+gE0r+wxfDG9zgiu54DcTcwnc9sX3DsqKR4l5K7x2V8mQL3Et6hURa4DuT9g7z6ukwpBLFchszg==", + "license": "MPL-2.0", + "bin": { + "rlp": "bin/rlp.cjs" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@trezor/connect/node_modules/@ethereumjs/tx": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-10.1.1.tgz", + "integrity": "sha512-Kz8GWIKQjEQB60ko9hsYDX3rZMHZZOTcmm6OFl855Lu3padVnf5ZactUKM6nmWPsumHED5bWDjO32novZd1zyw==", + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/common": "^10.1.1", + "@ethereumjs/rlp": "^10.1.1", + "@ethereumjs/util": "^10.1.1", + "@noble/curves": "^2.0.1", + "@noble/hashes": "^2.0.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@trezor/connect/node_modules/@ethereumjs/tx/node_modules/@noble/hashes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@trezor/connect/node_modules/@ethereumjs/util": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-10.1.1.tgz", + "integrity": "sha512-r2EhaeEmLZXVs1dT2HJFQysAkr63ZWATu/9tgYSp1IlvjvwyC++DLg5kCDwMM49HBq3sOAhrPnXkoqf9DV2gbw==", + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/rlp": "^10.1.1", + "@noble/curves": "^2.0.1", + "@noble/hashes": "^2.0.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@trezor/connect/node_modules/@ethereumjs/util/node_modules/@noble/hashes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@trezor/connect/node_modules/@noble/curves": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.2.0.tgz", + "integrity": "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "2.2.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@trezor/connect/node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@trezor/connect/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@trezor/connect/node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@trezor/connect/node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/@trezor/connect/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", + "dependencies": { + "base-x": "^5.0.0" + } + }, + "node_modules/@trezor/connect/node_modules/bs58check": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-4.0.0.tgz", + "integrity": "sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.2.0", + "bs58": "^6.0.0" + } + }, + "node_modules/@trezor/crypto-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@trezor/crypto-utils/-/crypto-utils-1.2.0.tgz", + "integrity": "sha512-9i1NrfW1IE6JO910ut7xrx4u5LxE++GETbpJhWLj4P5xpuGDDSDLEn/MXaYisls2DpE897aOrGPaa1qyt8V6tw==", + "license": "SEE LICENSE IN LICENSE.md", + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/device-authenticity": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@trezor/device-authenticity/-/device-authenticity-1.1.2.tgz", + "integrity": "sha512-313uSXYR4XKDv3CjtCpgHA+yEe9xxqN7EFl/D68FEn70SPsuWI0+2zUvjPPh6TIOh/EcLv7hCO/QTHUAGd7ZWQ==", + "license": "See LICENSE.md in repo root", + "dependencies": { + "@noble/curves": "^2.0.1", + "@trezor/crypto-utils": "1.2.0", + "@trezor/protobuf": "1.5.2", + "@trezor/schema-utils": "1.4.0", + "@trezor/utils": "9.5.0" + } + }, + "node_modules/@trezor/device-authenticity/node_modules/@noble/curves": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.2.0.tgz", + "integrity": "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "2.2.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@trezor/device-authenticity/node_modules/@noble/hashes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@trezor/device-authenticity/node_modules/@trezor/protobuf": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.5.2.tgz", + "integrity": "sha512-zViaL1jKue8DUTVEDg0C/lMipqNMd/Z3kr29/+MeZOoupjaXIQ2Lqp3WAMe8hvNTKKX8aNQH9JrbapJ6w9FMXw==", + "license": "See LICENSE.md in repo root", + "dependencies": { + "@trezor/schema-utils": "1.4.0", + "long": "5.2.5", + "protobufjs": "7.4.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/device-authenticity/node_modules/protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@trezor/device-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@trezor/device-utils/-/device-utils-1.2.0.tgz", + "integrity": "sha512-Aqp7pIooFTx21zRUtTI6i1AS4d9Lrx7cclvksh2nJQF9WJvbzuCXshEGkLoOsHwhQrCl3IXfbGuMdA12yDenPA==", + "license": "See LICENSE.md in repo root" + }, + "node_modules/@trezor/env-utils": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.5.0.tgz", + "integrity": "sha512-u1TN7dMQ5Qhpbae08Z4JJmI9fQrbbJ4yj8eIAsuzMQn6vb+Sg9vbntl+IDsZ1G9WeI73uHTLu1wWMmAgiujH8w==", + "license": "See LICENSE.md in repo root", + "dependencies": { + "ua-parser-js": "^2.0.4" + }, + "peerDependencies": { + "expo-constants": "*", + "expo-localization": "*", + "react-native": "*", + "tslib": "^2.6.2" + }, + "peerDependenciesMeta": { + "expo-constants": { + "optional": true + }, + "expo-localization": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@trezor/env-utils/node_modules/ua-parser-js": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-2.0.9.tgz", + "integrity": "sha512-OsqGhxyo/wGdLSXMSJxuMGN6H4gDnKz6Fb3IBm4bxZFMnyy0sdf6MN96Ie8tC6z/btdO+Bsy8guxlvLdwT076w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "AGPL-3.0-or-later", + "dependencies": { + "detect-europe-js": "^0.1.2", + "is-standalone-pwa": "^0.1.1", + "ua-is-frozen": "^0.1.2" + }, + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@trezor/protobuf": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.5.3.tgz", + "integrity": "sha512-ZYQtapkT2NaiVrAgb91Zprnk3uhl2Wca0bsnJcWgE7vwzqKegjrSorRnkZLqLTKTbCaT6sgkCYtM2hPl4Hqw5Q==", + "license": "See LICENSE.md in repo root", + "dependencies": { + "@trezor/schema-utils": "1.4.0", + "long": "5.2.5", + "protobufjs": "7.5.5" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/protocol": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@trezor/protocol/-/protocol-1.3.1.tgz", + "integrity": "sha512-uNJ83n38+BM+AJKsWza1ocvQ206d6NXJQ8/g+DelPLTj5c37Rj6hFiY5Nb5zgM7DBnq6T8Aa2K8t4TVCzHT1qg==", + "license": "See LICENSE.md in repo root", + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/schema-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@trezor/schema-utils/-/schema-utils-1.4.0.tgz", + "integrity": "sha512-K7upSeh7VDrORaIC4KAxYVW93XNlohmUnH5if/5GKYmTdQSRp1nBkO6Jm+Z4hzIthdnz/1aLgnbeN3bDxWLRxA==", + "license": "See LICENSE.md in repo root", + "dependencies": { + "@sinclair/typebox": "^0.33.7", + "ts-mixer": "^6.0.3" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/schema-utils/node_modules/@sinclair/typebox": { + "version": "0.33.22", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.33.22.tgz", + "integrity": "sha512-auUj4k+f4pyrIVf4GW5UKquSZFHJWri06QgARy9C0t9ZTjJLIuNIrr1yl9bWcJWJ1Gz1vOvYN1D+QPaIlNMVkQ==", + "license": "MIT" + }, + "node_modules/@trezor/transport": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.6.3.tgz", + "integrity": "sha512-GEi9KfiJsBgT/MCGNDIn9RDeXceLaAPjJT/GCayirXaCr3KnlpZCs6LGYkrjqapxiBm73nxM+BctKBKhpUl2cQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@trezor/protobuf": "1.5.3", + "@trezor/protocol": "1.3.1", + "@trezor/type-utils": "1.2.0", + "@trezor/utils": "9.5.0", + "cross-fetch": "^4.0.0", + "usb": "^2.15.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/type-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@trezor/type-utils/-/type-utils-1.2.0.tgz", + "integrity": "sha512-+E2QntxkyQuYfQQyl8RvT01tq2i5Dp/LFUOXuizF+KVOqsZBjBY43j5hewcCO3+MokD7deDiPyekbUEN5/iVlw==", + "license": "See LICENSE.md in repo root" + }, + "node_modules/@trezor/utils": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.5.0.tgz", + "integrity": "sha512-kdyMyDbxzvOZmwBNvTjAK+C/kzyOz8T4oUbFvq+KaXn5mBFf1uf8rq5X2HkxgdYRPArtHS3PxLKsfkNCdhCYtQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "bignumber.js": "^9.3.1" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/utxo-lib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-2.5.0.tgz", + "integrity": "sha512-Fa2cZh0037oX6AHNLfpFIj65UR/OoX0ZJTocFuQASe77/1PjZHysf6BvvGfmzuFToKfrAQ+DM/1Sx+P/vnyNmA==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@trezor/utils": "9.5.0", + "bech32": "^2.0.0", + "bip66": "^2.0.0", + "bitcoin-ops": "^1.4.1", + "blake-hash": "^2.0.0", + "blakejs": "^1.2.1", + "bn.js": "^5.2.2", + "bs58": "^6.0.0", + "bs58check": "^4.0.0", + "cashaddrjs": "0.4.4", + "create-hmac": "^1.1.7", + "int64-buffer": "^1.1.0", + "pushdata-bitcoin": "^1.0.1", + "tiny-secp256k1": "^1.1.7", + "typeforce": "^1.18.0", + "varuint-bitcoin": "2.0.0", + "wif": "^5.0.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/utxo-lib/node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/@trezor/utxo-lib/node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", + "license": "MIT" + }, + "node_modules/@trezor/utxo-lib/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", + "dependencies": { + "base-x": "^5.0.0" + } + }, + "node_modules/@trezor/utxo-lib/node_modules/bs58check": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-4.0.0.tgz", + "integrity": "sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.2.0", + "bs58": "^6.0.0" + } + }, + "node_modules/@trezor/websocket-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@trezor/websocket-client/-/websocket-client-1.3.0.tgz", + "integrity": "sha512-9KQSaVc3NtmM6rFFj1e+9bM0C5mVKVidbnxlfzuBJu7G2YMRdIdLPcAXhvmRZjs40uzDuBeApK+p547kODz2ug==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@trezor/utils": "9.5.0", + "ws": "^8.18.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.11.1.tgz", + "integrity": "sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.7", + "minimatch": "^3.0.4", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@turnkey/api-key-stamper": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@turnkey/api-key-stamper/-/api-key-stamper-0.6.5.tgz", + "integrity": "sha512-dSINHLIzYVw+ZNLwjM1wnEYFkYHPjQDSi43opCUhvow/ws6Fsn6gWkYpzbH+6Ej3rvSJTuaTwsld+dsTG/3HnA==", + "license": "Apache-2.0", + "dependencies": { + "@noble/curves": "^1.3.0", + "@turnkey/crypto": "2.8.14", + "@turnkey/encoding": "0.6.0", + "sha256-uint8array": "^0.10.7" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@turnkey/crypto": { + "version": "2.8.14", + "resolved": "https://registry.npmjs.org/@turnkey/crypto/-/crypto-2.8.14.tgz", + "integrity": "sha512-UZU+DEwhSUyyMHC9VZbp5av8NY/IJsfJ+g1E4dndQjMSAJd5NPKGS7sItlBy1ifN6wBb9JP5AcvmcfCdCfj9bw==", + "license": "Apache-2.0", + "dependencies": { + "@noble/ciphers": "1.3.0", + "@noble/curves": "1.9.0", + "@noble/hashes": "1.8.0", + "@peculiar/x509": "1.12.3", + "@turnkey/encoding": "0.6.0", + "@turnkey/sdk-types": "0.14.0", + "borsh": "2.0.0", + "cbor-js": "0.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@turnkey/crypto/node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@turnkey/crypto/node_modules/@noble/curves": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.0.tgz", + "integrity": "sha512-7YDlXiNMdO1YZeH6t/kvopHHbIZzlxrCV9WLqCY6QhcXOoXiNCMDqJIglZ9Yjx5+w7Dz30TITFrlTjnRg7sKEg==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@turnkey/crypto/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@turnkey/crypto/node_modules/borsh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/borsh/-/borsh-2.0.0.tgz", + "integrity": "sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==", + "license": "Apache-2.0" + }, + "node_modules/@turnkey/encoding": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@turnkey/encoding/-/encoding-0.6.0.tgz", + "integrity": "sha512-IC8qXvy36+iGAeiaVIuJvB35uU2Ld/RAWI/DRTKS+ttBej0GXhOn48Ouu5mlca4jt8ZEuwXmDVv74A8uBQclsA==", + "license": "Apache-2.0", + "dependencies": { + "bs58": "6.0.0", + "bs58check": "4.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@turnkey/encoding/node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/@turnkey/encoding/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", + "dependencies": { + "base-x": "^5.0.0" + } + }, + "node_modules/@turnkey/encoding/node_modules/bs58check": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-4.0.0.tgz", + "integrity": "sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.2.0", + "bs58": "^6.0.0" + } + }, + "node_modules/@turnkey/http": { + "version": "3.18.1", + "resolved": "https://registry.npmjs.org/@turnkey/http/-/http-3.18.1.tgz", + "integrity": "sha512-KXhDAtohx3PPRigdU0qjdgSTuomD0xl3mONly5hn8/jgrp0Gs7BKXv0OGiw/3Sj02IPmlza3SRWBKGtWyGwNmg==", + "license": "Apache-2.0", + "dependencies": { + "@turnkey/api-key-stamper": "0.6.5", + "@turnkey/encoding": "0.6.0", + "@turnkey/webauthn-stamper": "0.6.0", + "cross-fetch": "^3.1.5" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@turnkey/http/node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/@turnkey/iframe-stamper": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@turnkey/iframe-stamper/-/iframe-stamper-2.11.0.tgz", + "integrity": "sha512-Iyf4W4S4Hx/RVsXl07PkRTh3g5Ca+vpN6SdUbRy8lt9IQZAJel/vxAk9XMyB7utX9TJx+icSjNYHvC0XGqJ47A==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@turnkey/indexed-db-stamper": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@turnkey/indexed-db-stamper/-/indexed-db-stamper-1.2.6.tgz", + "integrity": "sha512-RSlCpH96e46PYgc029/TK3nE/HOW4QgKo9bXIYjoUR8J7+xkq+0Z0wjHrp27Yn3PbW8743hEppqK9jxsYc8ptA==", + "license": "Apache-2.0", + "dependencies": { + "@turnkey/api-key-stamper": "0.6.5", + "@turnkey/encoding": "0.6.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@turnkey/sdk-browser": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/@turnkey/sdk-browser/-/sdk-browser-5.16.1.tgz", + "integrity": "sha512-AXBUJVW83nZKnSVNUH235dbsu4S+a4F0Swo25Fm/gHWKPVh4nvpT/Pr2cr6PVh3UR15p787AVUkxO9ZgtNclPw==", + "license": "Apache-2.0", + "dependencies": { + "@turnkey/api-key-stamper": "0.6.5", + "@turnkey/crypto": "2.8.14", + "@turnkey/encoding": "0.6.0", + "@turnkey/http": "3.18.1", + "@turnkey/iframe-stamper": "2.11.0", + "@turnkey/indexed-db-stamper": "1.2.6", + "@turnkey/sdk-types": "0.14.0", + "@turnkey/wallet-stamper": "1.1.16", + "@turnkey/webauthn-stamper": "0.6.0", + "buffer": "^6.0.3", + "cross-fetch": "^3.1.5", + "hpke-js": "^1.6.5" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@turnkey/sdk-browser/node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/@turnkey/sdk-types": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@turnkey/sdk-types/-/sdk-types-0.14.0.tgz", + "integrity": "sha512-FLN4p3Jc3rBMvM17tgFrO4VpqkQN0RgWtLknqcqpLuNgTJ7oqgvzm42YIrzvBlW6DPsnFjVZMzc4yCfaRN7Lmg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@turnkey/wallet-stamper": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@turnkey/wallet-stamper/-/wallet-stamper-1.1.16.tgz", + "integrity": "sha512-IdgoIRQr5RoiHAPnVag2QyaYg6cmmkZQs1rOig57/tQ/fXdPsC1+2660RisIAvv69ZFrArG8Z8wHaGSQMkStlw==", + "license": "Apache-2.0", + "dependencies": { + "@turnkey/crypto": "2.8.14", + "@turnkey/encoding": "0.6.0" + }, + "optionalDependencies": { + "viem": "^2.21.35" + } + }, + "node_modules/@turnkey/webauthn-stamper": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@turnkey/webauthn-stamper/-/webauthn-stamper-0.6.0.tgz", + "integrity": "sha512-jdN17QEnn7RBykEOhtKIialWmDjnDAH8DzbyITwn8jsKcwT1TBNYge89hTUTjbdsDLBAqQw8cHujPdy0RaAqvw==", + "license": "Apache-2.0", + "dependencies": { + "sha256-uint8array": "^0.10.7" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.19.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz", + "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==", + "dev": true, + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "license": "MIT" + }, + "node_modules/@types/w3c-web-usb": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.14.tgz", + "integrity": "sha512-Qu3Nn6JFuF4+sHKYl+IcX9vYiI40ogleXzFFSxoE1W94rG98o/kXs8uJ0QSfFzuwBCZWlGfUGpPkgwuuX4PchA==", + "license": "MIT" + }, + "node_modules/@types/web": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.197.tgz", + "integrity": "sha512-V4sOroWDADFx9dLodWpKm298NOJ1VJ6zoDVgaP+WBb/utWxqQ6gnMzd9lvVDAr/F3ibiKaxH9i45eS0gQPSTaQ==", + "license": "Apache-2.0" + }, + "node_modules/@types/whatwg-mimetype": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz", + "integrity": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.42.0.tgz", + "integrity": "sha512-Aq2dPqsQkxHOLfb2OPv43RnIvfj05nw8v/6n3B2NABIPpHnjQnaLo9QGMTvml+tv4korl/Cjfrb/BYhoL8UUTQ==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.42.0", + "@typescript-eslint/type-utils": "8.42.0", + "@typescript-eslint/utils": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.42.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.42.0.tgz", + "integrity": "sha512-r1XG74QgShUgXph1BYseJ+KZd17bKQib/yF3SR+demvytiRXrwd12Blnz5eYGm8tXaeRdd4x88MlfwldHoudGg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.42.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.42.0.tgz", + "integrity": "sha512-vfVpLHAhbPjilrabtOSNcUDmBboQNrJUiNAGoImkZKnMjs2TIcWG33s4Ds0wY3/50aZmTMqJa6PiwkwezaAklg==", + "dev": true, + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.42.0", + "@typescript-eslint/types": "^8.42.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.42.0.tgz", + "integrity": "sha512-51+x9o78NBAVgQzOPd17DkNTnIzJ8T/O2dmMBLoK9qbY0Gm52XJcdJcCl18ExBMiHo6jPMErUQWUv5RLE51zJw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.42.0.tgz", + "integrity": "sha512-kHeFUOdwAJfUmYKjR3CLgZSglGHjbNTi1H8sTYRYV2xX6eNz4RyJ2LIgsDLKf8Yi0/GL1WZAC/DgZBeBft8QAQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.42.0.tgz", + "integrity": "sha512-9KChw92sbPTYVFw3JLRH1ockhyR3zqqn9lQXol3/YbI6jVxzWoGcT3AsAW0mu1MY0gYtsXnUGV/AKpkAj5tVlQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0", + "@typescript-eslint/utils": "8.42.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.42.0.tgz", + "integrity": "sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.42.0.tgz", + "integrity": "sha512-ku/uYtT4QXY8sl9EDJETD27o3Ewdi72hcXg1ah/kkUgBvAYHLwj2ofswFFNXS+FL5G+AGkxBtvGt8pFBHKlHsQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/project-service": "8.42.0", + "@typescript-eslint/tsconfig-utils": "8.42.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.42.0.tgz", + "integrity": "sha512-JnIzu7H3RH5BrKC4NoZqRfmjqCIS1u3hGZltDYJgkVdqAezl4L9d1ZLw+36huCujtSBSAirGINF/S4UxOcR+/g==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.42.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.42.0.tgz", + "integrity": "sha512-3WbiuzoEowaEn8RSnhJBrxSwX8ULYE9CXaPepS2C2W3NSA5NNIvBaslpBSBElPq0UGr0xVJlXFWOAKIkyylydQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.42.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vanilla-extract/css": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.17.3.tgz", + "integrity": "sha512-jHivr1UPoJTX5Uel4AZSOwrCf4mO42LcdmnhJtUxZaRWhW4FviFbIfs0moAWWld7GOT+2XnuVZjjA/K32uUnMQ==", + "dependencies": { + "@emotion/hash": "^0.9.0", + "@vanilla-extract/private": "^1.0.8", + "css-what": "^6.1.0", + "cssesc": "^3.0.0", + "csstype": "^3.0.7", + "dedent": "^1.5.3", + "deep-object-diff": "^1.1.9", + "deepmerge": "^4.2.2", + "lru-cache": "^10.4.3", + "media-query-parser": "^2.0.2", + "modern-ahocorasick": "^1.0.0", + "picocolors": "^1.0.0" + } + }, + "node_modules/@vanilla-extract/css/node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vanilla-extract/css/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/@vanilla-extract/dynamic": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vanilla-extract/dynamic/-/dynamic-2.1.4.tgz", + "integrity": "sha512-7+Ot7VlP3cIzhJnTsY/kBtNs21s0YD7WI1rKJJKYP56BkbDxi/wrQUWMGEczKPUDkJuFcvbye+E2ub1u/mHH9w==", + "dependencies": { + "@vanilla-extract/private": "^1.0.8" + } + }, + "node_modules/@vanilla-extract/private": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@vanilla-extract/private/-/private-1.0.9.tgz", + "integrity": "sha512-gT2jbfZuaaCLrAxwXbRgIhGhcXbRZCG3v4TTUnjw0EJ7ArdBRxkq4msNJkbuRkCgfIK5ATmprB5t9ljvLeFDEA==" + }, + "node_modules/@vanilla-extract/sprinkles": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@vanilla-extract/sprinkles/-/sprinkles-1.6.4.tgz", + "integrity": "sha512-lW3MuIcdIeHKX81DzhTnw68YJdL1ial05exiuvTLJMdHXQLKcVB93AncLPajMM6mUhaVVx5ALZzNHMTrq/U9Hg==", + "peerDependencies": { + "@vanilla-extract/css": "^1.0.0" + } + }, + "node_modules/@vercel/build-utils": { + "version": "13.16.0", + "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-13.16.0.tgz", + "integrity": "sha512-m0X81LKOvmiHviKuBkTxy74x9hbAfmiFRFM8Gvy7JpDYJKcoh0Ymj6V7bWbyHYN9QW2PIn/2EA1Ru2dIh7/1QQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@vercel/python-analysis": "0.11.0", + "cjs-module-lexer": "1.2.3", + "es-module-lexer": "1.5.0" + } + }, + "node_modules/@vercel/build-utils/node_modules/es-module-lexer": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", + "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vercel/error-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vercel/error-utils/-/error-utils-2.0.3.tgz", + "integrity": "sha512-CqC01WZxbLUxoiVdh9B/poPbNpY9U+tO1N9oWHwTl5YAZxcqXmmWJ8KNMFItJCUUWdY3J3xv8LvAuQv2KZ5YdQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@vercel/nft": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-1.5.0.tgz", + "integrity": "sha512-IWTDeIoWhQ7ZtRO/JRKH+jhmeQvZYhtGPmzw/QGDY+wDCQqfm25P9yIdoAFagu4fWsK4IwZXDFIjrmp5rRm/sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^2.0.0", + "@rollup/pluginutils": "^5.1.3", + "acorn": "^8.6.0", + "acorn-import-attributes": "^1.9.5", + "async-sema": "^3.1.1", + "bindings": "^1.4.0", + "estree-walker": "2.0.2", + "glob": "^13.0.0", + "graceful-fs": "^4.2.9", + "node-gyp-build": "^4.2.2", + "picomatch": "^4.0.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "nft": "out/cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vercel/nft/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vercel/nft/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@vercel/nft/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@vercel/node": { + "version": "5.7.6", + "resolved": "https://registry.npmjs.org/@vercel/node/-/node-5.7.6.tgz", + "integrity": "sha512-eN292YfJfRNDybdj18xsBesjdMUo6V4nrN6BW/m143tEF4aFObPvwEc4m3izOEHwCgw4V5Egx2u4Fr4emvdB7Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@edge-runtime/node-utils": "2.3.0", + "@edge-runtime/primitives": "4.1.0", + "@edge-runtime/vm": "3.2.0", + "@types/node": "20.11.0", + "@vercel/build-utils": "13.16.0", + "@vercel/error-utils": "2.0.3", + "@vercel/nft": "1.5.0", + "@vercel/static-config": "3.2.0", + "async-listen": "3.0.0", + "cjs-module-lexer": "1.2.3", + "edge-runtime": "2.5.9", + "es-module-lexer": "1.4.1", + "esbuild": "0.27.0", + "etag": "1.8.1", + "mime-types": "2.1.35", + "node-fetch": "2.6.9", + "path-to-regexp": "6.1.0", + "path-to-regexp-updated": "npm:path-to-regexp@6.3.0", + "ts-morph": "12.0.0", + "tsx": "4.21.0", + "typescript": "npm:typescript@5.9.3", + "undici": "5.28.4" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz", + "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/android-arm": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz", + "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/android-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz", + "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/android-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz", + "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz", + "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/darwin-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz", + "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz", + "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz", + "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-arm": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz", + "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz", + "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-ia32": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz", + "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-loong64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz", + "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz", + "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz", + "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz", + "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-s390x": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz", + "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz", + "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz", + "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz", + "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/sunos-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz", + "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/win32-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz", + "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/win32-ia32": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz", + "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/win32-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz", + "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@types/node": { + "version": "20.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.0.tgz", + "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@vercel/node/node_modules/esbuild": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz", + "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.0", + "@esbuild/android-arm": "0.27.0", + "@esbuild/android-arm64": "0.27.0", + "@esbuild/android-x64": "0.27.0", + "@esbuild/darwin-arm64": "0.27.0", + "@esbuild/darwin-x64": "0.27.0", + "@esbuild/freebsd-arm64": "0.27.0", + "@esbuild/freebsd-x64": "0.27.0", + "@esbuild/linux-arm": "0.27.0", + "@esbuild/linux-arm64": "0.27.0", + "@esbuild/linux-ia32": "0.27.0", + "@esbuild/linux-loong64": "0.27.0", + "@esbuild/linux-mips64el": "0.27.0", + "@esbuild/linux-ppc64": "0.27.0", + "@esbuild/linux-riscv64": "0.27.0", + "@esbuild/linux-s390x": "0.27.0", + "@esbuild/linux-x64": "0.27.0", + "@esbuild/netbsd-arm64": "0.27.0", + "@esbuild/netbsd-x64": "0.27.0", + "@esbuild/openbsd-arm64": "0.27.0", + "@esbuild/openbsd-x64": "0.27.0", + "@esbuild/openharmony-arm64": "0.27.0", + "@esbuild/sunos-x64": "0.27.0", + "@esbuild/win32-arm64": "0.27.0", + "@esbuild/win32-ia32": "0.27.0", + "@esbuild/win32-x64": "0.27.0" + } + }, + "node_modules/@vercel/node/node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@vercel/node/node_modules/typescript": { + "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", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@vercel/node/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vercel/python-analysis": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@vercel/python-analysis/-/python-analysis-0.11.0.tgz", + "integrity": "sha512-gsoj+nscmNm0xDh+tRhECRhit2VlAVaD7jc9h93sN6rDEBDxPo7eLEgIJFzVDaAItxERZ9Od2IK/04fB9vFy+g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@bytecodealliance/preview2-shim": "0.17.6", + "@renovatebot/pep440": "4.2.1", + "fs-extra": "11.1.1", + "js-yaml": "4.1.1", + "minimatch": "10.1.1", + "smol-toml": "1.5.2", + "zod": "3.22.4" + } + }, + "node_modules/@vercel/python-analysis/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vercel/python-analysis/node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@vercel/static-config": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vercel/static-config/-/static-config-3.2.0.tgz", + "integrity": "sha512-UpOEIgWxWx0M+mDe1IMdHS6JuWM/L5nNIJ4ixX8v9JgBAejymo88OkgnmfLCNMem0Wd+b5vcQPWLdZybCndlsA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "ajv": "8.6.3", + "json-schema-to-ts": "1.6.4", + "ts-morph": "12.0.0" + } + }, + "node_modules/@vercel/static-config/node_modules/ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@vercel/static-config/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz", + "integrity": "sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==", + "dev": true, + "dependencies": { + "@vitest/spy": "1.6.1", + "@vitest/utils": "1.6.1", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz", + "integrity": "sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==", + "dev": true, + "dependencies": { + "@vitest/utils": "1.6.1", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz", + "integrity": "sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz", + "integrity": "sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==", + "dev": true, + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz", + "integrity": "sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@wagmi/connectors": { + "version": "5.9.9", + "resolved": "https://registry.npmjs.org/@wagmi/connectors/-/connectors-5.9.9.tgz", + "integrity": "sha512-6+eqU7P2OtxU2PkIw6kHojfYYUJykYG2K5rSkzVh29RDCAjhJqGEZW5f1b8kV5rUBORip1NpST8QTBNi96JHGQ==", + "license": "MIT", + "dependencies": { + "@base-org/account": "1.1.1", + "@coinbase/wallet-sdk": "4.3.6", + "@gemini-wallet/core": "0.2.0", + "@metamask/sdk": "0.32.0", + "@safe-global/safe-apps-provider": "0.18.6", + "@safe-global/safe-apps-sdk": "9.1.0", + "@walletconnect/ethereum-provider": "2.21.1", + "cbw-sdk": "npm:@coinbase/wallet-sdk@3.9.3" + }, + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "@wagmi/core": "2.20.3", + "typescript": ">=5.0.4", + "viem": "2.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@wagmi/core": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/@wagmi/core/-/core-2.20.3.tgz", + "integrity": "sha512-gsbuHnWxf0AYZISvR8LvF/vUCIq6/ZwT5f5/FKd6wLA7Wq05NihCvmQpIgrcVbpSJPL67wb6S8fXm3eJGJA1vQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "5.0.1", + "mipd": "0.0.7", + "zustand": "5.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "@tanstack/query-core": ">=5.0.0", + "typescript": ">=5.0.4", + "viem": "2.x" + }, + "peerDependenciesMeta": { + "@tanstack/query-core": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@wagmi/core/node_modules/zustand": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.0.tgz", + "integrity": "sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + }, + "node_modules/@wallet-standard/app": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@wallet-standard/app/-/app-1.1.0.tgz", + "integrity": "sha512-3CijvrO9utx598kjr45hTbbeeykQrQfKmSnxeWOgU25TOEpvcipD/bYDQWIqUv1Oc6KK4YStokSMu/FBNecGUQ==", + "license": "Apache-2.0", + "dependencies": { + "@wallet-standard/base": "^1.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wallet-standard/base": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@wallet-standard/base/-/base-1.1.0.tgz", + "integrity": "sha512-DJDQhjKmSNVLKWItoKThJS+CsJQjR9AOBOirBVT1F9YpRyC9oYHE+ZnSf8y8bxUphtKqdQMPVQ2mHohYdRvDVQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=16" + } + }, + "node_modules/@wallet-standard/core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@wallet-standard/core/-/core-1.1.1.tgz", + "integrity": "sha512-5Xmjc6+Oe0hcPfVc5n8F77NVLwx1JVAoCVgQpLyv/43/bhtIif+Gx3WUrDlaSDoM8i2kA2xd6YoFbHCxs+e0zA==", + "license": "Apache-2.0", + "dependencies": { + "@wallet-standard/app": "^1.1.0", + "@wallet-standard/base": "^1.1.0", + "@wallet-standard/errors": "^0.1.1", + "@wallet-standard/features": "^1.1.0", + "@wallet-standard/wallet": "^1.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wallet-standard/errors": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@wallet-standard/errors/-/errors-0.1.1.tgz", + "integrity": "sha512-V8Ju1Wvol8i/VDyQOHhjhxmMVwmKiwyxUZBnHhtiPZJTWY0U/Shb2iEWyGngYEbAkp2sGTmEeNX1tVyGR7PqNw==", + "license": "Apache-2.0", + "dependencies": { + "chalk": "^5.4.1", + "commander": "^13.1.0" + }, + "bin": { + "errors": "bin/cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wallet-standard/errors/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@wallet-standard/errors/node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@wallet-standard/features": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@wallet-standard/features/-/features-1.1.0.tgz", + "integrity": "sha512-hiEivWNztx73s+7iLxsuD1sOJ28xtRix58W7Xnz4XzzA/pF0+aicnWgjOdA10doVDEDZdUuZCIIqG96SFNlDUg==", + "license": "Apache-2.0", + "dependencies": { + "@wallet-standard/base": "^1.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wallet-standard/wallet": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@wallet-standard/wallet/-/wallet-1.1.0.tgz", + "integrity": "sha512-Gt8TnSlDZpAl+RWOOAB/kuvC7RpcdWAlFbHNoi4gsXsfaWa1QCT6LBcfIYTPdOZC9OVZUDwqGuGAcqZejDmHjg==", + "license": "Apache-2.0", + "dependencies": { + "@wallet-standard/base": "^1.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@walletconnect/core": { + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.1.tgz", + "integrity": "sha512-Tp4MHJYcdWD846PH//2r+Mu4wz1/ZU/fr9av1UWFiaYQ2t2TPLDiZxjLw54AAEpMqlEHemwCgiRiAmjR1NDdTQ==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.16", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.1", + "@walletconnect/utils": "2.21.1", + "@walletconnect/window-getters": "1.0.1", + "es-toolkit": "1.33.0", + "events": "3.3.0", + "uint8arrays": "3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@walletconnect/environment": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.1.tgz", + "integrity": "sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==", + "license": "MIT", + "dependencies": { + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/environment/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@walletconnect/ethereum-provider": { + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/@walletconnect/ethereum-provider/-/ethereum-provider-2.21.1.tgz", + "integrity": "sha512-SSlIG6QEVxClgl1s0LMk4xr2wg4eT3Zn/Hb81IocyqNSGfXpjtawWxKxiC5/9Z95f1INyBD6MctJbL/R1oBwIw==", + "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit": "1.7.8", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/sign-client": "2.21.1", + "@walletconnect/types": "2.21.1", + "@walletconnect/universal-provider": "2.21.1", + "@walletconnect/utils": "2.21.1", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/events": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@walletconnect/events/-/events-1.0.1.tgz", + "integrity": "sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==", + "license": "MIT", + "dependencies": { + "keyvaluestorage-interface": "^1.0.0", + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/events/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@walletconnect/heartbeat": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@walletconnect/heartbeat/-/heartbeat-1.2.2.tgz", + "integrity": "sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==", + "license": "MIT", + "dependencies": { + "@walletconnect/events": "^1.0.1", + "@walletconnect/time": "^1.0.2", + "events": "^3.3.0" + } + }, + "node_modules/@walletconnect/jsonrpc-http-connection": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.8.tgz", + "integrity": "sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==", + "license": "MIT", + "dependencies": { + "@walletconnect/jsonrpc-utils": "^1.0.6", + "@walletconnect/safe-json": "^1.0.1", + "cross-fetch": "^3.1.4", + "events": "^3.3.0" + } + }, + "node_modules/@walletconnect/jsonrpc-http-connection/node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/@walletconnect/jsonrpc-provider": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.14.tgz", + "integrity": "sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==", + "license": "MIT", + "dependencies": { + "@walletconnect/jsonrpc-utils": "^1.0.8", + "@walletconnect/safe-json": "^1.0.2", + "events": "^3.3.0" + } + }, + "node_modules/@walletconnect/jsonrpc-types": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.4.tgz", + "integrity": "sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==", + "license": "MIT", + "dependencies": { + "events": "^3.3.0", + "keyvaluestorage-interface": "^1.0.0" + } + }, + "node_modules/@walletconnect/jsonrpc-utils": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz", + "integrity": "sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==", + "license": "MIT", + "dependencies": { + "@walletconnect/environment": "^1.0.1", + "@walletconnect/jsonrpc-types": "^1.0.3", + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/jsonrpc-utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@walletconnect/jsonrpc-ws-connection": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.16.tgz", + "integrity": "sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==", + "license": "MIT", + "dependencies": { + "@walletconnect/jsonrpc-utils": "^1.0.6", + "@walletconnect/safe-json": "^1.0.2", + "events": "^3.3.0", + "ws": "^7.5.1" + } + }, + "node_modules/@walletconnect/jsonrpc-ws-connection/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@walletconnect/keyvaluestorage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", + "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "license": "MIT", + "dependencies": { + "@walletconnect/safe-json": "^1.0.1", + "idb-keyval": "^6.2.1", + "unstorage": "^1.9.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": "1.x" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@walletconnect/logger": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@walletconnect/logger/-/logger-2.1.2.tgz", + "integrity": "sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==", + "license": "MIT", + "dependencies": { + "@walletconnect/safe-json": "^1.0.2", + "pino": "7.11.0" + } + }, + "node_modules/@walletconnect/relay-api": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@walletconnect/relay-api/-/relay-api-1.0.11.tgz", + "integrity": "sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==", + "license": "MIT", + "dependencies": { + "@walletconnect/jsonrpc-types": "^1.0.2" + } + }, + "node_modules/@walletconnect/relay-auth": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@walletconnect/relay-auth/-/relay-auth-1.1.0.tgz", + "integrity": "sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ==", + "license": "MIT", + "dependencies": { + "@noble/curves": "1.8.0", + "@noble/hashes": "1.7.0", + "@walletconnect/safe-json": "^1.0.1", + "@walletconnect/time": "^1.0.2", + "uint8arrays": "^3.0.0" + } + }, + "node_modules/@walletconnect/relay-auth/node_modules/@noble/hashes": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.0.tgz", + "integrity": "sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/safe-json": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.2.tgz", + "integrity": "sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==", + "license": "MIT", + "dependencies": { + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/safe-json/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@walletconnect/sign-client": { + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.1.tgz", + "integrity": "sha512-QaXzmPsMnKGV6tc4UcdnQVNOz4zyXgarvdIQibJ4L3EmLat73r5ZVl4c0cCOcoaV7rgM9Wbphgu5E/7jNcd3Zg==", + "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/core": "2.21.1", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.1", + "@walletconnect/utils": "2.21.1", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/solana-adapter": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@walletconnect/solana-adapter/-/solana-adapter-0.0.8.tgz", + "integrity": "sha512-Qb7MT8SdkeBldfUCmF+rYW6vL98mxPuT1yAwww5X2vpx7xEPZvFCoAKnyT5fXu0v56rMxhW3MGejnHyyYdDY7Q==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit": "1.7.2", + "@walletconnect/universal-provider": "2.19.0", + "@walletconnect/utils": "2.19.0", + "bs58": "6.0.0" + }, + "peerDependencies": { + "@solana/wallet-adapter-base": "0.x", + "@solana/web3.js": "1.x" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@noble/curves": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", + "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.7.1" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@noble/hashes": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", + "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@reown/appkit/-/appkit-1.7.2.tgz", + "integrity": "sha512-oo/evAyVxwc33i8ZNQ0+A/VE6vyTyzL3NBJmAe3I4vobgQeiobxMM0boKyLRMMbJggPn8DtoAAyG4GfpKaUPzQ==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.7.2", + "@reown/appkit-controllers": "1.7.2", + "@reown/appkit-polyfills": "1.7.2", + "@reown/appkit-scaffold-ui": "1.7.2", + "@reown/appkit-ui": "1.7.2", + "@reown/appkit-utils": "1.7.2", + "@reown/appkit-wallet": "1.7.2", + "@walletconnect/types": "2.19.1", + "@walletconnect/universal-provider": "2.19.1", + "bs58": "6.0.0", + "valtio": "1.13.2", + "viem": ">=2.23.11" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit-common": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.7.2.tgz", + "integrity": "sha512-DZkl3P5+Iw3TmsitWmWxYbuSCox8iuzngNp/XhbNDJd7t4Cj4akaIUxSEeCajNDiGHlu4HZnfyM1swWsOJ0cOw==", + "license": "Apache-2.0", + "dependencies": { + "big.js": "6.2.2", + "dayjs": "1.11.13", + "viem": ">=2.23.11" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit-controllers": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@reown/appkit-controllers/-/appkit-controllers-1.7.2.tgz", + "integrity": "sha512-KCN/VOg+bgwaX5kcxcdN8Xq8YXnchMeZOvmbCltPEFDzaLRUWmqk9tNu1OVml0434iGMNo6hcVimIiwz6oaL3Q==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.7.2", + "@reown/appkit-wallet": "1.7.2", + "@walletconnect/universal-provider": "2.19.1", + "valtio": "1.13.2", + "viem": ">=2.23.11" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit-controllers/node_modules/@walletconnect/core": { + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.19.1.tgz", + "integrity": "sha512-rMvpZS0tQXR/ivzOxN1GkHvw3jRRMlI/jRX5g7ZteLgg2L0ZcANsFvAU5IxILxIKcIkTCloF9TcfloKVbK3qmw==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.16", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.1", + "@walletconnect/utils": "2.19.1", + "@walletconnect/window-getters": "1.0.1", + "es-toolkit": "1.33.0", + "events": "3.3.0", + "uint8arrays": "3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit-controllers/node_modules/@walletconnect/sign-client": { + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.19.1.tgz", + "integrity": "sha512-OgBHRPo423S02ceN3lAzcZ3MYb1XuLyTTkKqLmKp/icYZCyRzm3/ynqJDKndiBLJ5LTic0y07LiZilnliYqlvw==", + "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/core": "2.19.1", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.1", + "@walletconnect/utils": "2.19.1", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit-controllers/node_modules/@walletconnect/universal-provider": { + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.19.1.tgz", + "integrity": "sha512-4rdLvJ2TGDIieNWW3sZw2MXlX65iHpTuKb5vyvUHQtjIVNLj+7X/09iUAI/poswhtspBK0ytwbH+AIT/nbGpjg==", + "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/sign-client": "2.19.1", + "@walletconnect/types": "2.19.1", + "@walletconnect/utils": "2.19.1", + "es-toolkit": "1.33.0", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit-controllers/node_modules/@walletconnect/utils": { + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.19.1.tgz", + "integrity": "sha512-aOwcg+Hpph8niJSXLqkU25pmLR49B8ECXp5gFQDW5IeVgXHoOoK7w8a79GBhIBheMLlIt1322sTKQ7Rq5KzzFg==", + "license": "Apache-2.0", + "dependencies": { + "@noble/ciphers": "1.2.1", + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.1", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "bs58": "6.0.0", + "detect-browser": "5.3.0", + "elliptic": "6.6.1", + "query-string": "7.1.3", + "uint8arrays": "3.1.0", + "viem": "2.23.2" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit-controllers/node_modules/@walletconnect/utils/node_modules/viem": { + "version": "2.23.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.2.tgz", + "integrity": "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@scure/bip32": "1.6.2", + "@scure/bip39": "1.5.4", + "abitype": "1.0.8", + "isows": "1.0.6", + "ox": "0.6.7", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit-polyfills": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@reown/appkit-polyfills/-/appkit-polyfills-1.7.2.tgz", + "integrity": "sha512-TxCVSh9dV2tf1u+OzjzLjAwj7WHhBFufHlJ36tDp5vjXeUUne8KvYUS85Zsyg4Y9Yeh+hdSIOdL2oDCqlRxCmw==", + "license": "Apache-2.0", + "dependencies": { + "buffer": "6.0.3" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit-scaffold-ui": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@reown/appkit-scaffold-ui/-/appkit-scaffold-ui-1.7.2.tgz", + "integrity": "sha512-2Aifk5d23e40ijUipsN3qAMIB1Aphm2ZgsRQ+UvKRb838xR1oRs+MOsfDWgXhnccXWKbjPqyapZ25eDFyPYPNw==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.7.2", + "@reown/appkit-controllers": "1.7.2", + "@reown/appkit-ui": "1.7.2", + "@reown/appkit-utils": "1.7.2", + "@reown/appkit-wallet": "1.7.2", + "lit": "3.1.0" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit-ui": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@reown/appkit-ui/-/appkit-ui-1.7.2.tgz", + "integrity": "sha512-fZv8K7Df6A/TlTIWD/9ike1HwK56WfzYpHN1/yqnR/BnyOb3CKroNQxmRTmjeLlnwKWkltlOf3yx+Y6ucKMk6Q==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.7.2", + "@reown/appkit-controllers": "1.7.2", + "@reown/appkit-wallet": "1.7.2", + "lit": "3.1.0", + "qrcode": "1.5.3" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit-utils": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@reown/appkit-utils/-/appkit-utils-1.7.2.tgz", + "integrity": "sha512-Z3gQnMPQopBdf1XEuptbf+/xVl9Hy0+yoK3K9pBb2hDdYNqJgJ4dXComhlRT8LjXFCQe1ZW0pVZTXmGQvOZ/OQ==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.7.2", + "@reown/appkit-controllers": "1.7.2", + "@reown/appkit-polyfills": "1.7.2", + "@reown/appkit-wallet": "1.7.2", + "@walletconnect/logger": "2.1.2", + "@walletconnect/universal-provider": "2.19.1", + "valtio": "1.13.2", + "viem": ">=2.23.11" + }, + "peerDependencies": { + "valtio": "1.13.2" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit-utils/node_modules/@walletconnect/core": { + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.19.1.tgz", + "integrity": "sha512-rMvpZS0tQXR/ivzOxN1GkHvw3jRRMlI/jRX5g7ZteLgg2L0ZcANsFvAU5IxILxIKcIkTCloF9TcfloKVbK3qmw==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.16", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.1", + "@walletconnect/utils": "2.19.1", + "@walletconnect/window-getters": "1.0.1", + "es-toolkit": "1.33.0", + "events": "3.3.0", + "uint8arrays": "3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit-utils/node_modules/@walletconnect/sign-client": { + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.19.1.tgz", + "integrity": "sha512-OgBHRPo423S02ceN3lAzcZ3MYb1XuLyTTkKqLmKp/icYZCyRzm3/ynqJDKndiBLJ5LTic0y07LiZilnliYqlvw==", + "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/core": "2.19.1", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.1", + "@walletconnect/utils": "2.19.1", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit-utils/node_modules/@walletconnect/universal-provider": { + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.19.1.tgz", + "integrity": "sha512-4rdLvJ2TGDIieNWW3sZw2MXlX65iHpTuKb5vyvUHQtjIVNLj+7X/09iUAI/poswhtspBK0ytwbH+AIT/nbGpjg==", + "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/sign-client": "2.19.1", + "@walletconnect/types": "2.19.1", + "@walletconnect/utils": "2.19.1", + "es-toolkit": "1.33.0", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit-utils/node_modules/@walletconnect/utils": { + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.19.1.tgz", + "integrity": "sha512-aOwcg+Hpph8niJSXLqkU25pmLR49B8ECXp5gFQDW5IeVgXHoOoK7w8a79GBhIBheMLlIt1322sTKQ7Rq5KzzFg==", + "license": "Apache-2.0", + "dependencies": { + "@noble/ciphers": "1.2.1", + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.1", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "bs58": "6.0.0", + "detect-browser": "5.3.0", + "elliptic": "6.6.1", + "query-string": "7.1.3", + "uint8arrays": "3.1.0", + "viem": "2.23.2" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit-utils/node_modules/@walletconnect/utils/node_modules/viem": { + "version": "2.23.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.2.tgz", + "integrity": "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@scure/bip32": "1.6.2", + "@scure/bip39": "1.5.4", + "abitype": "1.0.8", + "isows": "1.0.6", + "ox": "0.6.7", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit-wallet": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@reown/appkit-wallet/-/appkit-wallet-1.7.2.tgz", + "integrity": "sha512-WQ0ykk5TwsjOcUL62ajT1bhZYdFZl0HjwwAH9LYvtKYdyZcF0Ps4+y2H4HHYOc03Q+LKOHEfrFztMBLXPTxwZA==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.7.2", + "@reown/appkit-polyfills": "1.7.2", + "@walletconnect/logger": "2.1.2", + "zod": "3.22.4" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit/node_modules/@walletconnect/core": { + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.19.1.tgz", + "integrity": "sha512-rMvpZS0tQXR/ivzOxN1GkHvw3jRRMlI/jRX5g7ZteLgg2L0ZcANsFvAU5IxILxIKcIkTCloF9TcfloKVbK3qmw==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.16", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.1", + "@walletconnect/utils": "2.19.1", + "@walletconnect/window-getters": "1.0.1", + "es-toolkit": "1.33.0", + "events": "3.3.0", + "uint8arrays": "3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit/node_modules/@walletconnect/sign-client": { + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.19.1.tgz", + "integrity": "sha512-OgBHRPo423S02ceN3lAzcZ3MYb1XuLyTTkKqLmKp/icYZCyRzm3/ynqJDKndiBLJ5LTic0y07LiZilnliYqlvw==", + "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/core": "2.19.1", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.1", + "@walletconnect/utils": "2.19.1", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit/node_modules/@walletconnect/universal-provider": { + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.19.1.tgz", + "integrity": "sha512-4rdLvJ2TGDIieNWW3sZw2MXlX65iHpTuKb5vyvUHQtjIVNLj+7X/09iUAI/poswhtspBK0ytwbH+AIT/nbGpjg==", + "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/sign-client": "2.19.1", + "@walletconnect/types": "2.19.1", + "@walletconnect/utils": "2.19.1", + "es-toolkit": "1.33.0", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit/node_modules/@walletconnect/utils": { + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.19.1.tgz", + "integrity": "sha512-aOwcg+Hpph8niJSXLqkU25pmLR49B8ECXp5gFQDW5IeVgXHoOoK7w8a79GBhIBheMLlIt1322sTKQ7Rq5KzzFg==", + "license": "Apache-2.0", + "dependencies": { + "@noble/ciphers": "1.2.1", + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.1", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "bs58": "6.0.0", + "detect-browser": "5.3.0", + "elliptic": "6.6.1", + "query-string": "7.1.3", + "uint8arrays": "3.1.0", + "viem": "2.23.2" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@reown/appkit/node_modules/@walletconnect/utils/node_modules/viem": { + "version": "2.23.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.2.tgz", + "integrity": "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@scure/bip32": "1.6.2", + "@scure/bip39": "1.5.4", + "abitype": "1.0.8", + "isows": "1.0.6", + "ox": "0.6.7", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@scure/bip32": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", + "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@scure/bip39": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", + "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.4" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@walletconnect/core": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.19.0.tgz", + "integrity": "sha512-AEoyICLHQEnjijZr9XsL4xtFhC5Cmu0RsEGxAxmwxbfGvAcYcSCNp1fYq0Q6nHc8jyoPOALpwySTle300Y1vxw==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.16", + "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.1", - "@walletconnect/utils": "2.21.1", + "@walletconnect/types": "2.19.0", + "@walletconnect/utils": "2.19.0", + "@walletconnect/window-getters": "1.0.1", + "events": "3.3.0", + "lodash.isequal": "4.5.0", + "uint8arrays": "3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@walletconnect/core/node_modules/@walletconnect/types": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.19.0.tgz", + "integrity": "sha512-Ttse3p3DCdFQ/TRQrsPMQJzFr7cb/2AF5ltLPzXRNMmapmGydc6WO8QU7g/tGEB3RT9nHcLY2aqlwsND9sXMxA==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@walletconnect/sign-client": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.19.0.tgz", + "integrity": "sha512-+GkuJzPK9SPq+RZgdKHNOvgRagxh/hhYWFHOeSiGh3DyAQofWuFTq4UrN/MPjKOYswSSBKfIa+iqKYsi4t8zLQ==", + "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/core": "2.19.0", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.0", + "@walletconnect/utils": "2.19.0", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@walletconnect/sign-client/node_modules/@walletconnect/types": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.19.0.tgz", + "integrity": "sha512-Ttse3p3DCdFQ/TRQrsPMQJzFr7cb/2AF5ltLPzXRNMmapmGydc6WO8QU7g/tGEB3RT9nHcLY2aqlwsND9sXMxA==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@walletconnect/types": { + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.19.1.tgz", + "integrity": "sha512-XWWGLioddH7MjxhyGhylL7VVariVON2XatJq/hy0kSGJ1hdp31z194nHN5ly9M495J9Hw8lcYjGXpsgeKvgxzw==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@walletconnect/universal-provider": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.19.0.tgz", + "integrity": "sha512-e9JvadT5F8QwdLmd7qBrmACq04MT7LQEe1m3X2Fzvs3DWo8dzY8QbacnJy4XSv5PCdxMWnua+2EavBk8nrI9QA==", + "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/sign-client": "2.19.0", + "@walletconnect/types": "2.19.0", + "@walletconnect/utils": "2.19.0", + "events": "3.3.0", + "lodash": "4.17.21" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@walletconnect/universal-provider/node_modules/@walletconnect/types": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.19.0.tgz", + "integrity": "sha512-Ttse3p3DCdFQ/TRQrsPMQJzFr7cb/2AF5ltLPzXRNMmapmGydc6WO8QU7g/tGEB3RT9nHcLY2aqlwsND9sXMxA==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@walletconnect/utils": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.19.0.tgz", + "integrity": "sha512-LZ0D8kevknKfrfA0Sq3Hf3PpmM8oWyNfsyWwFR51t//2LBgtN2Amz5xyoDDJcjLibIbKAxpuo/i0JYAQxz+aPA==", + "license": "Apache-2.0", + "dependencies": { + "@noble/ciphers": "1.2.1", + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.19.0", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "detect-browser": "5.3.0", + "elliptic": "6.6.1", + "query-string": "7.1.3", + "uint8arrays": "3.1.0", + "viem": "2.23.2" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/@walletconnect/utils/node_modules/@walletconnect/types": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.19.0.tgz", + "integrity": "sha512-Ttse3p3DCdFQ/TRQrsPMQJzFr7cb/2AF5ltLPzXRNMmapmGydc6WO8QU7g/tGEB3RT9nHcLY2aqlwsND9sXMxA==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", "events": "3.3.0" } }, + "node_modules/@walletconnect/solana-adapter/node_modules/@walletconnect/utils/node_modules/viem": { + "version": "2.23.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.2.tgz", + "integrity": "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@scure/bip32": "1.6.2", + "@scure/bip39": "1.5.4", + "abitype": "1.0.8", + "isows": "1.0.6", + "ox": "0.6.7", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/abitype": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", + "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/@walletconnect/solana-adapter/node_modules/bn.js": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "license": "MIT" + }, + "node_modules/@walletconnect/solana-adapter/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", + "dependencies": { + "base-x": "^5.0.0" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/isows": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", + "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/lit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.0.tgz", + "integrity": "sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit/reactive-element": "^2.0.0", + "lit-element": "^4.0.0", + "lit-html": "^3.1.0" + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/@walletconnect/solana-adapter/node_modules/ox": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", + "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@walletconnect/solana-adapter/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "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/@walletconnect/solana-adapter/node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/@walletconnect/time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@walletconnect/time/-/time-1.0.2.tgz", @@ -9888,6 +16656,21 @@ } } }, + "node_modules/@walletconnect/utils/node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/@walletconnect/utils/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", + "dependencies": { + "base-x": "^5.0.0" + } + }, "node_modules/@walletconnect/utils/node_modules/isows": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", @@ -10014,6 +16797,30 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, + "node_modules/@xrplf/isomorphic": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@xrplf/isomorphic/-/isomorphic-1.0.1.tgz", + "integrity": "sha512-0bIpgx8PDjYdrLFeC3csF305QQ1L7sxaWnL5y71mCvhenZzJgku9QsA+9QCXBC1eNYtxWO/xR91zrXJy2T/ixg==", + "license": "ISC", + "dependencies": { + "@noble/hashes": "^1.0.0", + "eventemitter3": "5.0.1", + "ws": "^8.13.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@xrplf/secret-numbers": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@xrplf/secret-numbers/-/secret-numbers-2.0.0.tgz", + "integrity": "sha512-z3AOibRTE9E8MbjgzxqMpG1RNaBhQ1jnfhNCa1cGf2reZUJzPMYs4TggQTc7j8+0WyV3cr7y/U8Oz99SXIkN5Q==", + "license": "ISC", + "dependencies": { + "@xrplf/isomorphic": "^1.0.1", + "ripple-keypairs": "^2.0.0" + } + }, "node_modules/@xyflow/react": { "version": "12.10.2", "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.10.2.tgz", @@ -10084,6 +16891,102 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/abi-wan-kanabi": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/abi-wan-kanabi/-/abi-wan-kanabi-2.2.4.tgz", + "integrity": "sha512-0aA81FScmJCPX+8UvkXLki3X1+yPQuWxEkqXBVKltgPAK79J+NB+Lp5DouMXa7L6f+zcRlIA/6XO7BN/q9fnvg==", + "license": "ISC", + "dependencies": { + "ansicolors": "^0.3.2", + "cardinal": "^2.1.1", + "fs-extra": "^10.0.0", + "yargs": "^17.7.2" + }, + "bin": { + "generate": "dist/generate.js" + } + }, + "node_modules/abi-wan-kanabi/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/abi-wan-kanabi/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/abi-wan-kanabi/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/abi-wan-kanabi/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/abi-wan-kanabi/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/abi-wan-kanabi/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/abitype": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.1.0.tgz", @@ -10104,6 +17007,18 @@ } } }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -10156,11 +17071,22 @@ "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, "engines": { "node": ">= 14" } }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -10210,6 +17136,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", + "license": "MIT" + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -10251,6 +17183,50 @@ "dequal": "^2.0.3" } }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "license": "MIT" + }, + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -10289,7 +17265,8 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, "node_modules/atomic-sleep": { "version": "1.0.0", @@ -10316,13 +17293,14 @@ } }, "node_modules/axios": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", - "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.2.tgz", + "integrity": "sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==", + "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" } }, "node_modules/balanced-match": { @@ -10332,10 +17310,22 @@ "dev": true }, "node_modules/base-x": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", - "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", - "license": "MIT" + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base32.js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.1.0.tgz", + "integrity": "sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } }, "node_modules/base64-js": { "version": "1.5.1", @@ -10357,6 +17347,15 @@ ], "license": "MIT" }, + "node_modules/base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/baseline-browser-mapping": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", @@ -10385,6 +17384,15 @@ "require-from-string": "^2.0.2" } }, + "node_modules/big-integer": { + "version": "1.6.36", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", + "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, "node_modules/big.js": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz", @@ -10398,53 +17406,245 @@ "url": "https://opencollective.com/bigjs" } }, + "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==", - "dev": true, "license": "MIT", "dependencies": { "file-uri-to-path": "1.0.0" } }, + "node_modules/bip66": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-2.0.0.tgz", + "integrity": "sha512-kBG+hSpgvZBrkIm9dt5T1Hd/7xGCPEX2npoxAWZfsK1FvjgaxySEh2WizjyIstWXriKo9K9uJ4u0OnsyLDUPXQ==", + "license": "MIT" + }, + "node_modules/bitcoin-ops": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz", + "integrity": "sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==", + "license": "MIT" + }, + "node_modules/blake-hash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/blake-hash/-/blake-hash-2.0.0.tgz", + "integrity": "sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/blake-hash/node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "license": "MIT" + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "license": "MIT" + }, "node_modules/bn.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==" }, + "node_modules/borsh": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", + "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", + "license": "Apache-2.0", + "dependencies": { + "bn.js": "^5.2.0", + "bs58": "^4.0.0", + "text-encoding-utf-8": "^1.0.2" + } + }, "node_modules/bowser": { "version": "2.14.1", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", "license": "MIT" }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "license": "MIT", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", + "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", + "license": "MIT", + "dependencies": { + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.5.tgz", + "integrity": "sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==", + "license": "ISC", + "dependencies": { + "bn.js": "^5.2.2", + "browserify-rsa": "^4.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.6.1", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.9", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/browserify-sign/node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/browserify-sign/node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "license": "MIT" + }, + "node_modules/browserify-sign/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, + "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/browserify-sign/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" + "safe-buffer": "~5.1.0" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" }, "node_modules/browserslist": { "version": "4.26.3", @@ -10480,12 +17680,23 @@ } }, "node_modules/bs58": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", - "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "license": "MIT", "dependencies": { - "base-x": "^5.0.0" + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "license": "MIT", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" } }, "node_modules/buffer": { @@ -10512,6 +17723,18 @@ "ieee754": "^1.2.1" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "license": "MIT" + }, "node_modules/bufferutil": { "version": "4.0.9", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz", @@ -10524,6 +17747,21 @@ "node": ">=6.14.2" } }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -10617,6 +17855,83 @@ } ] }, + "node_modules/cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", + "license": "MIT", + "dependencies": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + }, + "bin": { + "cdl": "bin/cdl.js" + } + }, + "node_modules/cashaddrjs": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cashaddrjs/-/cashaddrjs-0.4.4.tgz", + "integrity": "sha512-xZkuWdNOh0uq/mxJIng6vYWfTowZLd9F4GMAlp2DwFHlcCqCm91NtuAc47RuV4L7r4PYcY5p6Cr2OKNb4hnkWA==", + "license": "MIT", + "dependencies": { + "big-integer": "1.6.36" + } + }, + "node_modules/cbor": { + "version": "10.0.12", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-10.0.12.tgz", + "integrity": "sha512-exQDevYd7ZQLP4moMQcZkKCVZsXLAtUSflObr3xTh4xzFIv/xBCdvCd6L259kQOUP2kcTC0jvC6PpZIf/WmRXA==", + "license": "MIT", + "dependencies": { + "nofilter": "^3.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cbor-extract": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.2.tgz", + "integrity": "sha512-hlSxxI9XO2yQfe9g6msd3g4xCfDqK5T5P0fRMLuaLHhxn4ViPrm+a+MUfhrvH2W962RGxcBwEGzLQyjbDG1gng==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.1.1" + }, + "bin": { + "download-cbor-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@cbor-extract/cbor-extract-darwin-arm64": "2.2.2", + "@cbor-extract/cbor-extract-darwin-x64": "2.2.2", + "@cbor-extract/cbor-extract-linux-arm": "2.2.2", + "@cbor-extract/cbor-extract-linux-arm64": "2.2.2", + "@cbor-extract/cbor-extract-linux-x64": "2.2.2", + "@cbor-extract/cbor-extract-win32-x64": "2.2.2" + } + }, + "node_modules/cbor-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cbor-js/-/cbor-js-0.1.0.tgz", + "integrity": "sha512-7sQ/TvDZPl7csT1Sif9G0+MA0I0JOVah8+wWlJVQdVEgIbCzlN/ab3x+uvMNsc34TUvO6osQTAmB2ls80JX6tw==", + "license": "MIT" + }, + "node_modules/cbor-sync": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cbor-sync/-/cbor-sync-1.0.4.tgz", + "integrity": "sha512-GWlXN4wiz0vdWWXBU71Dvc1q3aBo0HytqwAZnXF1wOwjqNnDWA1vZ1gDMFLlqohak31VQzmhiYfiCX5QSSfagA==", + "license": "MIT" + }, + "node_modules/cbor-x": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/cbor-x/-/cbor-x-1.6.4.tgz", + "integrity": "sha512-UGKHjp6RHC6QuZ2yy5LCKm7MojM4716DwoSaqwQpaH4DvZvbBTGcoDNTiG9Y2lByXZYFEs9WRkS5tLl96IrF1Q==", + "license": "MIT", + "optionalDependencies": { + "cbor-extract": "^2.2.2" + } + }, "node_modules/cbw-sdk": { "name": "@coinbase/wallet-sdk", "version": "3.9.3", @@ -10715,6 +18030,20 @@ "node": ">=18" } }, + "node_modules/cipher-base": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", + "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cjs-module-lexer": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", @@ -10783,6 +18112,19 @@ "dev": true, "license": "MIT" }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -10799,10 +18141,21 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -10810,6 +18163,15 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -10860,6 +18222,15 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "license": "MIT", + "dependencies": { + "buffer": "^5.1.0" + } + }, "node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", @@ -10872,6 +18243,73 @@ "node": ">=0.8" } }, + "node_modules/crc/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "license": "MIT" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, "node_modules/cross-fetch": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", @@ -10904,6 +18342,38 @@ "uncrypto": "^0.1.3" } }, + "node_modules/crypto-browserify": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", + "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, "node_modules/css-tree": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", @@ -10974,9 +18444,10 @@ } }, "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" }, "node_modules/cuer": { "version": "0.0.2", @@ -11267,6 +18738,34 @@ "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.9.tgz", "integrity": "sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==" }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -11284,16 +18783,58 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/defu": { "version": "6.1.7", "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", "license": "MIT" }, + "node_modules/delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -11313,8 +18854,18 @@ "resolved": "https://registry.npmjs.org/derive-valtio/-/derive-valtio-0.1.0.tgz", "integrity": "sha512-OCg2UsLbXK7GmmpzMXhYkdO64vhJ1ROUUGaTFyHjVwEdMEcTTRj7W1TxLbSBxdY8QLBPCcp66MTyaSy0RpO17A==", "license": "MIT", - "peerDependencies": { - "valtio": "*" + "peerDependencies": { + "valtio": "*" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "node_modules/destr": { @@ -11329,11 +18880,31 @@ "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==", "license": "MIT" }, + "node_modules/detect-europe-js": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/detect-europe-js/-/detect-europe-js-0.1.2.tgz", + "integrity": "sha512-lgdERlL3u0aUdHocoouzT10d9I89VVhk0qNRmll7mXdGfJT1/wqZ2ZLA4oJAjeACPY5fT1wsbq2AT+GkuInsow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "license": "MIT" + }, "node_modules/detect-libc": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8" } @@ -11352,20 +18923,29 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "license": "MIT" + }, "node_modules/dijkstrajs": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", "license": "MIT" }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/dompurify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", @@ -11375,6 +18955,16 @@ "@types/trusted-types": "^2.0.7" } }, + "node_modules/draggabilly": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/draggabilly/-/draggabilly-3.0.0.tgz", + "integrity": "sha512-aEs+B6prbMZQMxc9lgTpCBfyCUhRur/VFucHhIOvlvvdARTj7TcDmX/cdOUtqbjJJUh7+agyJXR5Z6IFe1MxwQ==", + "license": "MIT", + "dependencies": { + "get-size": "^3.0.0", + "unidragger": "^3.0.0" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -11400,6 +18990,15 @@ "stream-shift": "^1.0.2" } }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/eciesjs": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.18.tgz", @@ -11643,6 +19242,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -11663,6 +19263,21 @@ "benchmarks" ] }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "license": "MIT" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", + "license": "MIT", + "dependencies": { + "es6-promise": "^4.0.3" + } + }, "node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", @@ -11705,7 +19320,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, "engines": { "node": ">=6" } @@ -11848,6 +19462,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -12071,6 +19698,128 @@ "@ethersproject/wordlists": "5.7.0" } }, + "node_modules/ethers-v6": { + "name": "ethers", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.16.0.tgz", + "integrity": "sha512-U1wulmetNymijEhpSEQ7Ct/P/Jw9/e7R1j5XIbPRydgV2DjLVMsULDlNksq3RQnFgKoLlZf88ijYtWEXcPa07A==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "22.7.5", + "aes-js": "4.0.0-beta.5", + "tslib": "2.7.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers-v6/node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "license": "MIT" + }, + "node_modules/ethers-v6/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethers-v6/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethers-v6/node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/ethers-v6/node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "license": "MIT" + }, + "node_modules/ethers-v6/node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" + }, + "node_modules/ethers-v6/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, + "node_modules/ethers-v6/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "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/ev-emitter": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ev-emitter/-/ev-emitter-2.1.2.tgz", + "integrity": "sha512-jQ5Ql18hdCQ4qS+RCrbLfz1n+Pags27q5TwMKvZyhp5hh2UULUYZUy1keqj6k6SYsdqIYjnmz7xyyEY0V67B8Q==", + "license": "MIT" + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/eventemitter2": { "version": "6.4.9", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", @@ -12091,6 +19840,31 @@ "node": ">=0.8.x" } }, + "node_modules/eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==", + "license": "BSD-3-Clause" + }, "node_modules/extension-port-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/extension-port-stream/-/extension-port-stream-3.0.0.tgz", @@ -12104,6 +19878,14 @@ "node": ">=12.0.0" } }, + "node_modules/eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "engines": { + "node": "> 0.1.90" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -12140,8 +19922,7 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -12164,6 +19945,12 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "license": "MIT" }, + "node_modules/fast-stable-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz", + "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==", + "license": "MIT" + }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -12173,6 +19960,15 @@ "reusify": "^1.0.4" } }, + "node_modules/feaxios": { + "version": "0.0.23", + "resolved": "https://registry.npmjs.org/feaxios/-/feaxios-0.0.23.tgz", + "integrity": "sha512-eghR0A21fvbkcQBgZuMfQhrXxJzC0GNUGC9fXhBge33D+mFDTwl0aJ35zoQQn575BhyjQitRc5N4f+L4cP708g==", + "license": "MIT", + "dependencies": { + "is-retry-allowed": "^3.0.0" + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -12189,7 +19985,6 @@ "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==", - "dev": true, "license": "MIT" }, "node_modules/fill-range": { @@ -12283,9 +20078,10 @@ } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -12440,6 +20236,12 @@ "node": ">= 0.4" } }, + "node_modules/get-size": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-size/-/get-size-3.0.0.tgz", + "integrity": "sha512-Y8aiXLq4leR7807UY0yuKEwif5s3kbVp1nTv+i4jBeoUzByTLKkLWu/HorS6/pB+7gsB0o7OTogC8AoOOeT0Hw==", + "license": "MIT" + }, "node_modules/get-tsconfig": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", @@ -12548,8 +20350,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphemer": { "version": "1.4.0", @@ -12638,6 +20439,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hash-base": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", + "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", @@ -12668,6 +20482,22 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/hpke-js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/hpke-js/-/hpke-js-1.8.0.tgz", + "integrity": "sha512-N0PFQlUQsIPS9++nUNn2ZsxTPSv8pONyyrXIGZl0iiherRfS0XW1SvTd+RmepD0TN1S9zzTJkEutMIWWYt0/4w==", + "license": "MIT", + "dependencies": { + "@hpke/chacha20poly1305": "^1.8.0", + "@hpke/common": "^1.10.0", + "@hpke/core": "^1.9.0", + "@hpke/dhkem-x25519": "^1.8.0", + "@hpke/dhkem-x448": "^1.8.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", @@ -12708,6 +20538,15 @@ "node": ">= 14" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -12795,6 +20634,12 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/int64-buffer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-1.1.0.tgz", + "integrity": "sha512-94smTCQOvigN4d/2R/YDjz8YVG0Sufvv2aAh8P5m42gwhCsDAJqnbNOrxJsrADuAFAA69Q/ptGzxvNcNuIJcvw==", + "license": "MIT" + }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -12804,6 +20649,15 @@ "loose-envify": "^1.0.0" } }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/iron-webcrypto": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", @@ -12829,6 +20683,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "license": "MIT" + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -12841,6 +20701,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -12890,6 +20765,40 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -12899,6 +20808,16 @@ "node": ">=0.12.0" } }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -12924,6 +20843,38 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-retry-allowed": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-3.0.0.tgz", + "integrity": "sha512-9xH0xvoggby+u0uGF7cZXdrutWiBiaFG8ZT4YFPXL8NzkyAwX3AKGLeFQLvzDpM430+nDFBZ1LHkie/8ocL06A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-standalone-pwa": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-standalone-pwa/-/is-standalone-pwa-0.1.1.tgz", + "integrity": "sha512-9Cbovsa52vNQCjdXOzeQq5CnCbAcRk05aU62K20WO372NrTv0NxibLFCK6lQ4/iZEFdEA3p3t2VNOn8AJ53F5g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "license": "MIT" + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -12951,6 +20902,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -12963,6 +20929,15 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, "node_modules/isows": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz", @@ -12977,6 +20952,74 @@ "ws": "*" } }, + "node_modules/jayson": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.3.0.tgz", + "integrity": "sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==", + "license": "MIT", + "dependencies": { + "@types/connect": "^3.4.33", + "@types/node": "^12.12.54", + "@types/ws": "^7.4.4", + "commander": "^2.20.3", + "delay": "^5.0.0", + "es6-promisify": "^5.0.0", + "eyes": "^0.1.8", + "isomorphic-ws": "^4.0.1", + "json-stringify-safe": "^5.0.1", + "stream-json": "^1.9.1", + "uuid": "^8.3.2", + "ws": "^7.5.10" + }, + "bin": { + "jayson": "bin/jayson.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jayson/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "license": "MIT" + }, + "node_modules/jayson/node_modules/@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/jayson/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/jayson/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/jiti": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", @@ -12987,6 +21030,12 @@ "jiti": "lib/jiti-cli.mjs" } }, + "node_modules/js-base64": { + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.8.tgz", + "integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==", + "license": "BSD-3-Clause" + }, "node_modules/js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", @@ -13010,6 +21059,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbi": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.2.5.tgz", + "integrity": "sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ==", + "license": "Apache-2.0" + }, "node_modules/jsdom": { "version": "27.0.1", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.0.1.tgz", @@ -13157,12 +21212,37 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/json-stable-stringify": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", + "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -13179,7 +21259,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -13188,6 +21267,51 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "license": "Public Domain", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jsqr": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsqr/-/jsqr-1.4.0.tgz", + "integrity": "sha512-dxLob7q65Xg2DvstYkRpkYtmKm2sPJ9oFhrhmudT1dZvNFFTlroai3AWSpLey/w5vMcLBXRgOJsbXpdN9HzU/A==", + "license": "Apache-2.0" + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/keccak": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", @@ -13560,11 +21684,42 @@ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/loglevel": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/long": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.5.tgz", + "integrity": "sha512-e0r9YBBgNCq1D1o5Dp8FMH0N5hsFtXDBiVa0qoJPHpakvZkmDKPRoGffZJII/XsHvj9An9blm+cRJ01yQqU+Dw==", + "license": "Apache-2.0" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -13577,6 +21732,12 @@ "loose-envify": "cli.js" } }, + "node_modules/lossless-json": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lossless-json/-/lossless-json-4.3.0.tgz", + "integrity": "sha512-ToxOC+SsduRmdSuoLZLYAr5zy1Qu7l5XhmPWM3zefCZ5IcrzW/h108qbJUKfOlDlhvhjUK84+8PSVX0kxnit0g==", + "license": "MIT" + }, "node_modules/loupe": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", @@ -13595,17 +21756,6 @@ "yallist": "^3.0.2" } }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "lz-string": "bin/bin.js" - } - }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -13636,6 +21786,17 @@ "node": ">= 0.4" } }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, "node_modules/mdn-data": { "version": "2.12.2", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", @@ -13651,6 +21812,19 @@ "@babel/runtime": "^7.12.5" } }, + "node_modules/merge-options": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", + "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -13672,6 +21846,45 @@ "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", "license": "MIT" }, + "node_modules/micro-packed": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/micro-packed/-/micro-packed-0.7.3.tgz", + "integrity": "sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg==", + "license": "MIT", + "dependencies": { + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/micro-sol-signer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/micro-sol-signer/-/micro-sol-signer-0.5.0.tgz", + "integrity": "sha512-4D5mGHuWuAC1w7HXXs+mlugw9n0hk3Gk0pFjQYkzE6zbvwEEioyb6l8375hivcqD6830/tCDCyQv+i3jfVFC+w==", + "license": "MIT", + "dependencies": { + "@noble/curves": "^1.8.0", + "@noble/hashes": "^1.7.0", + "@scure/base": "^1.2.1", + "micro-packed": "~0.7.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/micro-sol-signer/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -13685,6 +21898,25 @@ "node": ">=8.6" } }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "license": "MIT" + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -13814,6 +22046,15 @@ "resolved": "https://registry.npmjs.org/modern-ahocorasick/-/modern-ahocorasick-1.1.0.tgz", "integrity": "sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==" }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/monaco-editor": { "version": "0.55.1", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz", @@ -13869,6 +22110,12 @@ "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", "license": "(Apache-2.0 AND MIT)" }, + "node_modules/nan": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.26.2.tgz", + "integrity": "sha512-0tTvBTYkt3tdGw22nrAy50x7gpbGCCFH3AFcyS5WiUu7Eu4vWlri1woE6qHBSfy11vksDqkiwjOnlR7WV8G1Hw==", + "license": "MIT" + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -13935,6 +22182,21 @@ "node-gyp-build-test": "build-test.js" } }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", + "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, "node_modules/node-mock-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", @@ -13947,6 +22209,15 @@ "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", "dev": true }, + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "license": "MIT", + "engines": { + "node": ">=12.19" + } + }, "node_modules/nopt": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", @@ -13983,40 +22254,115 @@ "readable-stream": "^2.3.3" } }, - "node_modules/obj-multiplex/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" + "node_modules/obj-multiplex/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/obj-multiplex/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/obj-multiplex/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/obj-multiplex/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, - "node_modules/obj-multiplex/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/obj-multiplex/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/obj-multiplex/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/oblivious-set": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.4.0.tgz", + "integrity": "sha512-szyd0ou0T8nsAqHtprRcP3WidfsN1TnAR5yWXf2mFCEr5ek3LEOkT6EZ/92Xfs74HIdyhG5WkGxIssMU0jBaeg==", "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" + "engines": { + "node": ">=16" } }, "node_modules/ofetch": { @@ -14045,6 +22391,24 @@ "wrappy": "1" } }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -14184,6 +22548,12 @@ "node": ">=6" } }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "license": "(MIT AND Zlib)" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -14196,6 +22566,22 @@ "node": ">=6" } }, + "node_modules/parse-asn1": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.9.tgz", + "integrity": "sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==", + "license": "ISC", + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "pbkdf2": "^3.1.5", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/parse-ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", @@ -14313,6 +22699,23 @@ "node": "*" } }, + "node_modules/pbkdf2": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", + "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", + "license": "MIT", + "dependencies": { + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "ripemd160": "^2.0.3", + "safe-buffer": "^5.2.1", + "sha.js": "^2.4.12", + "to-buffer": "^1.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -14515,6 +22918,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -14527,6 +22939,47 @@ "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==", "license": "MIT" }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/protobufjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.5.tgz", + "integrity": "sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/proxy-compare": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-2.6.0.tgz", @@ -14534,9 +22987,33 @@ "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==" + "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/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "license": "MIT" }, "node_modules/pump": { "version": "3.0.4", @@ -14557,6 +23034,33 @@ "node": ">=6" } }, + "node_modules/pushdata-bitcoin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz", + "integrity": "sha512-hw7rcYTJRAl4olM8Owe8x0fBuJJ+WGbMhQuLWOXEMN3PxPCKQHRkhfL+XG0+iXUmSHjkMmb3Ba55Mt21cZc9kQ==", + "license": "MIT", + "dependencies": { + "bitcoin-ops": "^1.3.0" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/qr": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/qr/-/qr-0.5.1.tgz", @@ -14565,6 +23069,12 @@ "node": ">= 20.19.0" } }, + "node_modules/qr.js": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/qr.js/-/qr.js-0.0.0.tgz", + "integrity": "sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==", + "license": "MIT" + }, "node_modules/qrcode": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", @@ -14583,6 +23093,35 @@ "node": ">=10.13.0" } }, + "node_modules/qrcode.react": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-1.0.1.tgz", + "integrity": "sha512-8d3Tackk8IRLXTo67Y+c1rpaiXjoz/Dd2HpcMdW//62/x8J1Nbho14Kh8x974t9prsLHN6XqVgcnRiBGFptQmg==", + "license": "ISC", + "dependencies": { + "loose-envify": "^1.4.0", + "prop-types": "^15.6.0", + "qr.js": "0.0.0" + }, + "peerDependencies": { + "react": "^15.5.3 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/query-string": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", @@ -14797,6 +23336,25 @@ "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", "license": "MIT" }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, "node_modules/react": { "version": "19.1.1", "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", @@ -14836,13 +23394,42 @@ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", "license": "MIT" }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "license": "MIT" + }, + "node_modules/react-modal": { + "version": "3.16.3", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.3.tgz", + "integrity": "sha512-yCYRJB5YkeQDQlTt17WGAgFJ7jr2QYcWa1SHqZ3PluDmnKJ/7+tVU+E6uKyZ0nODaeEj+xCpK4LcSnKXLMC0Nw==", + "license": "MIT", + "dependencies": { + "exenv": "^1.2.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19", + "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-qr-reader": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-qr-reader/-/react-qr-reader-2.2.1.tgz", + "integrity": "sha512-EL5JEj53u2yAOgtpAKAVBzD/SiKWn0Bl7AZy6ZrSf1lub7xHwtaXe6XSx36Wbhl1VMGmvmrwYMRwO1aSCT2fwA==", "license": "MIT", - "peer": true + "dependencies": { + "jsqr": "^1.2.0", + "prop-types": "^15.7.2", + "webrtc-adapter": "^7.2.1" + }, + "peerDependencies": { + "react": "~16", + "react-dom": "~16" + } }, "node_modules/react-refresh": { "version": "0.17.0", @@ -15019,6 +23606,21 @@ "node": ">=8" } }, + "node_modules/redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", + "license": "MIT", + "dependencies": { + "esprima": "~4.0.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -15073,6 +23675,117 @@ "node": ">=0.10.0" } }, + "node_modules/ripemd160": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", + "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", + "license": "MIT", + "dependencies": { + "hash-base": "^3.1.2", + "inherits": "^2.0.4" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ripemd160/node_modules/hash-base": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", + "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ripemd160/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/ripemd160/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/ripemd160/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/ripemd160/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/ripemd160/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/ripple-address-codec": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-5.0.0.tgz", + "integrity": "sha512-de7osLRH/pt5HX2xw2TRJtbdLLWHu0RXirpQaEeCnWKY5DYHykh3ETSkofvm0aX0LJiV7kwkegJxQkmbO94gWw==", + "license": "ISC", + "dependencies": { + "@scure/base": "^1.1.3", + "@xrplf/isomorphic": "^1.0.0" + }, + "engines": { + "node": ">= 16" + } + }, + "node_modules/ripple-binary-codec": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-2.7.0.tgz", + "integrity": "sha512-gEBqan5muVp+q7jgZ6aUniSyN+e4FKRzn9uFAeFSIW7IgvkezP1cUolNtpahQ+jvaSK/33hxZA7wNmn1mc330g==", + "license": "ISC", + "dependencies": { + "@xrplf/isomorphic": "^1.0.1", + "bignumber.js": "^9.0.0", + "ripple-address-codec": "^5.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/ripple-keypairs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-2.0.0.tgz", + "integrity": "sha512-b5rfL2EZiffmklqZk1W+dvSy97v3V/C7936WxCCgDynaGPp7GE6R2XO7EU9O2LlM/z95rj870IylYnOQs+1Rag==", + "license": "ISC", + "dependencies": { + "@noble/curves": "^1.0.0", + "@xrplf/isomorphic": "^1.0.0", + "ripple-address-codec": "^5.0.0" + }, + "engines": { + "node": ">= 16" + } + }, "node_modules/rollup": { "version": "4.50.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.0.tgz", @@ -15113,6 +23826,56 @@ "fsevents": "~2.3.2" } }, + "node_modules/rpc-websockets": { + "version": "9.3.8", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-9.3.8.tgz", + "integrity": "sha512-7r+fm4tSJmLf9GvZfL1DJ1SJwpagpp6AazqM0FUaeV7CA+7+NYINSk1syWa4tU/6OF2CyBicLtzENGmXRJH6wQ==", + "license": "LGPL-3.0-only", + "dependencies": { + "@swc/helpers": "^0.5.11", + "@types/uuid": "^10.0.0", + "@types/ws": "^8.2.2", + "buffer": "^6.0.3", + "eventemitter3": "^5.0.1", + "uuid": "^11.0.0", + "ws": "^8.5.0" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/kozjak" + }, + "optionalDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^6.0.0" + } + }, + "node_modules/rpc-websockets/node_modules/utf-8-validate": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-6.0.6.tgz", + "integrity": "sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/rpc-websockets/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, "node_modules/rrweb-cssom": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", @@ -15120,6 +23883,31 @@ "dev": true, "license": "MIT" }, + "node_modules/rtcpeerconnection-shim": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/rtcpeerconnection-shim/-/rtcpeerconnection-shim-1.2.15.tgz", + "integrity": "sha512-C6DxhXt7bssQ1nHb154lqeL0SXz5Dx4RczXZu2Aa/L1NJFnEVDxFwCBo3fqtuljhHIGceg5JKBV4XJ0gW5JKyw==", + "license": "BSD-3-Clause", + "dependencies": { + "sdp": "^2.6.0" + }, + "engines": { + "node": ">=6.0.0", + "npm": ">=3.10.0" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -15143,6 +23931,24 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -15195,6 +24001,25 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "node_modules/salmon-adapter-sdk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/salmon-adapter-sdk/-/salmon-adapter-sdk-1.1.1.tgz", + "integrity": "sha512-28ysSzmDjx2AbotxSggqdclh9MCwlPJUldKkCph48oS5Xtwu0QOg8T9ZRHS2Mben4Y8sTq6VvxXznKssCYFBJA==", + "license": "Apache-2.0", + "dependencies": { + "@project-serum/sol-wallet-adapter": "^0.2.6", + "eventemitter3": "^4.0.7" + }, + "peerDependencies": { + "@solana/web3.js": "^1.44.3" + } + }, + "node_modules/salmon-adapter-sdk/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -15218,6 +24043,12 @@ "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, + "node_modules/sdp": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/sdp/-/sdp-2.12.0.tgz", + "integrity": "sha512-jhXqQAQVM+8Xj5EjJGVweuEzgtGWb3tmEEpl3CLP3cStInSbVHSg0QWOGQzNq8pSID4JkpeV2mPqlMDLrm0/Vw==", + "license": "MIT" + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -15270,6 +24101,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sha256-uint8array": { + "version": "0.10.7", + "resolved": "https://registry.npmjs.org/sha256-uint8array/-/sha256-uint8array-0.10.7.tgz", + "integrity": "sha512-1Q6JQU4tX9NqsDGodej6pkrUVQVNapLZnvkwIhddH/JqzBZF1fSaxSWNY6sziXBE8aEa2twtGkXUrwzGeZCMpQ==", + "license": "MIT" + }, "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", @@ -15297,6 +24134,78 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -15315,6 +24224,25 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, "node_modules/smol-toml": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.5.2.tgz", @@ -15356,6 +24284,34 @@ "node": ">=10.0.0" } }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/sonic-boom": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", @@ -15384,29 +24340,257 @@ "node": ">=0.10.0" } }, - "node_modules/split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "node_modules/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/starknet": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/starknet/-/starknet-9.4.2.tgz", + "integrity": "sha512-NFtg077DjddHUSh8sLZ5uB149LEF4NR90FuJ0oF7+zhce7l0oG9Ubqr3H4+jHm/ghHtV+yjlv1UhEoo4SBfILA==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.7.0", + "@noble/hashes": "~1.6.0", + "@scure/base": "~1.2.1", + "@scure/starknet": "1.1.0", + "@starknet-io/get-starknet-wallet-standard": "^5.0.0", + "@starknet-io/starknet-types-010": "npm:@starknet-io/types-js@0.10.0", + "@starknet-io/starknet-types-09": "npm:@starknet-io/types-js@~0.9.1", + "abi-wan-kanabi": "2.2.4", + "lossless-json": "^4.2.0", + "pako": "^2.0.4", + "ts-mixer": "^6.0.3" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/starknet/node_modules/@noble/curves": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz", + "integrity": "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.6.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/starknet/node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz", + "integrity": "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/starknet/node_modules/@noble/hashes": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", + "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/starknet/node_modules/@scure/bip32": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/starknet/node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/starknet/node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/starknet/node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/starknet/node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/starknet/node_modules/@starknet-io/get-starknet-wallet-standard": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@starknet-io/get-starknet-wallet-standard/-/get-starknet-wallet-standard-5.0.0.tgz", + "integrity": "sha512-isDNGDlp16W24HE4IuweYXLDRZN0JbsDnazAieeKXE87Mn+jqhsjgTsMxcwWTjX7v906Bjz39FiDjGUddnr36g==", "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "@starknet-io/types-js": "^0.7.10", + "@wallet-standard/base": "^1.1.0", + "@wallet-standard/features": "^1.1.0", + "ox": "^0.4.4" } }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "license": "ISC", - "engines": { - "node": ">= 10.x" + "node_modules/starknet/node_modules/@starknet-io/types-js": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@starknet-io/types-js/-/types-js-0.7.10.tgz", + "integrity": "sha512-1VtCqX4AHWJlRRSYGSn+4X1mqolI1Tdq62IwzoU2vUuEE72S1OlEeGhpvd6XsdqXcfHmVzYfj8k1XtKBQqwo9w==", + "license": "MIT" + }, + "node_modules/starknet/node_modules/ox": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.4.4.tgz", + "integrity": "sha512-oJPEeCDs9iNiPs6J0rTx+Y0KGeCGyCAA3zo94yZhm8G5WpOxrwUtn2Ie/Y8IyARSqqY/j9JTKA3Fc1xs1DvFnw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true + "node_modules/starkzap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/starkzap/-/starkzap-2.0.0.tgz", + "integrity": "sha512-U2REwOLCVUftw8SZZCqR2rxR3v1t+SvXXfWDI2PyU8PpmeN6oSahBqOUTgkNefEo1hXx8ZnU5BIsl7ArntWseg==", + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@avnu/avnu-sdk": "^4.1.0-rc.0", + "starknet": "^9.2.1" + }, + "peerDependencies": { + "@cartridge/controller": "^0.13.9", + "@fatsolutions/tongo-sdk": "^1.3.2", + "@hyperlane-xyz/registry": "^19.4.0", + "@hyperlane-xyz/sdk": "^14.4.0", + "@hyperlane-xyz/utils": "^14.4.0", + "@solana/web3.js": "^1.98.4", + "ethers": "^6.16.0" + }, + "peerDependenciesMeta": { + "@cartridge/controller": { + "optional": true + }, + "@ethersproject/shims": { + "optional": true + }, + "@fatsolutions/tongo-sdk": { + "optional": true + }, + "@hyperlane-xyz/registry": { + "optional": true + }, + "@hyperlane-xyz/sdk": { + "optional": true + }, + "@hyperlane-xyz/utils": { + "optional": true + }, + "@solana/web3.js": { + "optional": true + }, + "ethers": { + "optional": true + }, + "fast-text-encoding": { + "optional": true + }, + "react-native-get-random-values": { + "optional": true + } + } }, "node_modules/state-local": { "version": "1.0.7", @@ -15420,6 +24604,31 @@ "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", "dev": true }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-chain": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", + "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", + "license": "BSD-3-Clause" + }, + "node_modules/stream-json": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz", + "integrity": "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==", + "license": "BSD-3-Clause", + "dependencies": { + "stream-chain": "^2.2.5" + } + }, "node_modules/stream-shift": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", @@ -15599,6 +24808,11 @@ "node": ">=18" } }, + "node_modules/text-encoding-utf-8": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", + "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==" + }, "node_modules/thread-stream": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz", @@ -15624,6 +24838,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tiny-secp256k1": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.7.tgz", + "integrity": "sha512-eb+F6NabSnjbLwNoC+2o5ItbmP1kg7HliWue71JgLegQt6A5mTN8YbvTLCazdlg6e5SV6A+r8OGvZYskdlmhqQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.3.0", + "bn.js": "^4.11.8", + "create-hmac": "^1.1.7", + "elliptic": "^6.4.0", + "nan": "^2.13.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/tiny-secp256k1/node_modules/bn.js": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "license": "MIT" + }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -15674,6 +24911,12 @@ "node": ">=8.0" } }, + "node_modules/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", + "license": "MIT" + }, "node_modules/tough-cookie": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", @@ -15722,6 +24965,12 @@ "typescript": ">=4.8.4" } }, + "node_modules/ts-mixer": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", + "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==", + "license": "MIT" + }, "node_modules/ts-morph": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-12.0.0.tgz", @@ -16249,6 +25498,24 @@ "@esbuild/win32-x64": "0.27.7" } }, + "node_modules/tsyringe": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", + "license": "MIT", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, "node_modules/tw-animate-css": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", @@ -16294,11 +25561,17 @@ "node": ">= 0.4" } }, + "node_modules/typeforce": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", + "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==", + "license": "MIT" + }, "node_modules/typescript": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "devOptional": true, + "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -16330,6 +25603,26 @@ "typescript": ">=4.8.4 <6.0.0" } }, + "node_modules/ua-is-frozen": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ua-is-frozen/-/ua-is-frozen-0.1.2.tgz", + "integrity": "sha512-RwKDW2p3iyWn4UbaxpP2+VxwqXh0jpvdxsYpZ5j/MLLiQOfbsV5shpgQiw93+KMYQPcteeMQ289MaAFzs3G9pw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "license": "MIT" + }, "node_modules/ua-parser-js": { "version": "1.0.41", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz", @@ -16361,6 +25654,15 @@ "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", "license": "MIT" }, + "node_modules/uint8array-tools": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/uint8array-tools/-/uint8array-tools-0.0.8.tgz", + "integrity": "sha512-xS6+s8e0Xbx++5/0L+yyexukU7pz//Yg6IHg3BKhXotg1JcYtgxVcUctQ0HxLByiJzpAkNFawz1Nz5Xadzo82g==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/uint8arrays": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", @@ -16393,19 +25695,35 @@ "version": "7.19.2", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", - "dev": true, "license": "MIT" }, + "node_modules/unidragger": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/unidragger/-/unidragger-3.0.1.tgz", + "integrity": "sha512-RngbGSwBFmqGBWjkaH+yB677uzR95blSQyxq6hYbrQCejH3Mx1nm8DVOuh3M9k2fQyTstWUG5qlgCnNqV/9jVw==", + "license": "MIT", + "dependencies": { + "ev-emitter": "^2.0.0" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 10.0.0" } }, + "node_modules/unload": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/unload/-/unload-2.4.1.tgz", + "integrity": "sha512-IViSAm8Z3sRBYA+9wc0fLQmU9Nrxb16rcDmIiR6Y9LJSZzI7QY5QsDhqPpKOjAn0O9/kfK1TfNEMMAGPTIraPw==", + "license": "Apache-2.0", + "funding": { + "url": "https://github.com/sponsors/pubkey" + } + }, "node_modules/unstorage": { "version": "1.17.5", "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz", @@ -16550,6 +25868,36 @@ "punycode": "^2.1.0" } }, + "node_modules/urijs": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", + "license": "MIT" + }, + "node_modules/usb": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/usb/-/usb-2.17.0.tgz", + "integrity": "sha512-UuFgrlglgDn5ll6d5l7kl3nDb2Yx43qLUGcDq+7UNLZLtbNug0HZBb2Xodhgx2JZB1LqvU+dOGqLEeYUeZqsHg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@types/w3c-web-usb": "^1.0.6", + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.5.0" + }, + "engines": { + "node": ">=12.22.0 <13.0 || >=14.17.0" + } + }, + "node_modules/usb/node_modules/node-addon-api": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.7.0.tgz", + "integrity": "sha512-9MdFxmkKaOYVTV+XVRG8ArDwwQ77XIgIPyKASB1k3JPq3M8fGQQQE3YpMOrKm6g//Ktx8ivZr8xo1Qmtqub+GA==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, "node_modules/use-callback-ref": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", @@ -16639,6 +25987,23 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/uuidv4": { + "version": "6.2.13", + "resolved": "https://registry.npmjs.org/uuidv4/-/uuidv4-6.2.13.tgz", + "integrity": "sha512-AXyzMjazYB3ovL3q051VLH06Ixj//Knx7QnUSi1T//Ie3io6CpsPu9nVMOx5MoLWh6xV0B9J0hIaxungxXUbPQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT", + "dependencies": { + "@types/uuid": "8.3.4", + "uuid": "8.3.2" + } + }, + "node_modules/uuidv4/node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "license": "MIT" + }, "node_modules/valtio": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/valtio/-/valtio-1.13.2.tgz", @@ -16674,6 +26039,15 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/varuint-bitcoin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-2.0.0.tgz", + "integrity": "sha512-6QZbU/rHO2ZQYpWFDALCDSRsXbAs1VOEmXAxtbtjLtKuMJ/FQ8YbhfxlaiKv5nklci0M6lZtlZyxo9Q+qNnyog==", + "license": "MIT", + "dependencies": { + "uint8array-tools": "^0.0.8" + } + }, "node_modules/viem": { "version": "2.37.3", "resolved": "https://registry.npmjs.org/viem/-/viem-2.37.3.tgz", @@ -16874,6 +26248,46 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/vite-plugin-top-level-await": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-plugin-top-level-await/-/vite-plugin-top-level-await-1.6.0.tgz", + "integrity": "sha512-bNhUreLamTIkoulCR9aDXbTbhLk6n1YE8NJUTTxl5RYskNRtzOR0ASzSjBVRtNdjIfngDXo11qOsybGLNsrdww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/plugin-virtual": "^3.0.2", + "@swc/core": "^1.12.14", + "@swc/wasm": "^1.12.14", + "uuid": "10.0.0" + }, + "peerDependencies": { + "vite": ">=2.8" + } + }, + "node_modules/vite-plugin-top-level-await/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vite-plugin-wasm": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/vite-plugin-wasm/-/vite-plugin-wasm-3.6.0.tgz", + "integrity": "sha512-mL/QPziiIA4RAA6DkaZZzOstdwbW5jO4Vz7Zenj0wieKWBlNvIvX5L5ljum9lcUX0ShNfBgCNLKTjNkRVVqcsw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "vite": "^2 || ^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, "node_modules/vitest": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz", @@ -17098,6 +26512,15 @@ } } }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/webextension-polyfill": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz", @@ -17110,6 +26533,20 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "license": "BSD-2-Clause" }, + "node_modules/webrtc-adapter": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/webrtc-adapter/-/webrtc-adapter-7.7.1.tgz", + "integrity": "sha512-TbrbBmiQBL9n0/5bvDdORc6ZfRY/Z7JnEj+EYOD1ghseZdpJ+nF2yx14k3LgQKc7JZnG7HAcL+zHnY25So9d7A==", + "license": "BSD-3-Clause", + "dependencies": { + "rtcpeerconnection-shim": "^1.2.15", + "sdp": "^2.12.0" + }, + "engines": { + "node": ">=6.0.0", + "npm": ">=3.10.0" + } + }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", @@ -17202,6 +26639,40 @@ "node": ">=8" } }, + "node_modules/wif": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/wif/-/wif-5.0.0.tgz", + "integrity": "sha512-iFzrC/9ne740qFbNjTZ2FciSRJlHIXoxqk/Y5EnE08QOXu1WjJyCCswwDTYbohAOEnlCtLaAAQBhyaLRFh2hMA==", + "license": "MIT", + "dependencies": { + "bs58check": "^4.0.0" + } + }, + "node_modules/wif/node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/wif/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", + "dependencies": { + "base-x": "^5.0.0" + } + }, + "node_modules/wif/node_modules/bs58check": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-4.0.0.tgz", + "integrity": "sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.2.0", + "bs58": "^6.0.0" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -17252,6 +26723,21 @@ } } }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/xml-name-validator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", @@ -17277,6 +26763,27 @@ "node": ">=0.4.0" } }, + "node_modules/xrpl": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-4.4.3.tgz", + "integrity": "sha512-vi2OjuNkiaP8nv1j+nqHp8GZwwEjO6Y8+j/OuVMg6M4LwXEwyHdIj33dlg7cyY1Lw5+jb9HqFOQvABhaywVbTQ==", + "license": "ISC", + "dependencies": { + "@scure/bip32": "^1.3.1", + "@scure/bip39": "^1.2.1", + "@xrplf/isomorphic": "^1.0.1", + "@xrplf/secret-numbers": "^2.0.0", + "bignumber.js": "^9.0.0", + "eventemitter3": "^5.0.1", + "fast-json-stable-stringify": "^2.1.0", + "ripple-address-codec": "^5.0.0", + "ripple-binary-codec": "^2.5.0", + "ripple-keypairs": "^2.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 1dab314..bd07153 100644 --- a/package.json +++ b/package.json @@ -16,9 +16,11 @@ "probe:testnets": "node scripts/testnet-probe.js", "simulator:server": "node scripts/simulator-bridge.mjs", "preview": "vite preview", - "check:inline-copy": "node scripts/check-inline-copy.mjs" + "check:inline-copy": "node scripts/check-inline-copy.mjs", + "check:family-imports": "node scripts/check-family-imports.mjs" }, "dependencies": { + "@cartridge/controller": "^0.13.12", "@monaco-editor/react": "^4.7.0", "@phosphor-icons/react": "^2.1.10", "@radix-ui/react-checkbox": "^1.3.3", @@ -35,6 +37,11 @@ "@radix-ui/react-tabs": "^1.1.13", "@rainbow-me/rainbowkit": "^2.2.8", "@shazow/whatsabi": "^0.22.2", + "@solana/wallet-adapter-base": "^0.9.27", + "@solana/wallet-adapter-react": "^0.15.39", + "@solana/wallet-adapter-react-ui": "^0.9.39", + "@solana/wallet-adapter-wallets": "^0.19.38", + "@solana/web3.js": "^1.98.4", "@solidity-parser/parser": "^0.20.2", "@tanstack/react-query": "^5.87.4", "@wagmi/core": "^2.20.3", @@ -46,6 +53,7 @@ "cmdk": "^1.1.1", "dompurify": "^3.3.1", "ethers": "^5.7.2", + "ethers-v6": "npm:ethers@^6.16.0", "framer-motion": "^12.38.0", "monaco-editor": "^0.55.1", "radix-ui": "^1.4.3", @@ -56,6 +64,8 @@ "react-router-dom": "^6.28.1", "react-window": "^2.2.3", "sonner": "^2.0.7", + "starknet": "^9.4.2", + "starkzap": "^2.0.0", "tailwind-merge": "^3.4.0", "viem": "^2.37.3", "wagmi": "^2.16.9", @@ -83,6 +93,9 @@ "typescript": "~5.8.3", "typescript-eslint": "^8.39.1", "vite": "^5.4.19", + "vite-plugin-top-level-await": "^1.6.0", + "vite-plugin-wasm": "^3.6.0", "vitest": "^1.6.1" - } + }, + "overrides": {} } diff --git a/scripts/check-family-imports.mjs b/scripts/check-family-imports.mjs new file mode 100644 index 0000000..41a2787 --- /dev/null +++ b/scripts/check-family-imports.mjs @@ -0,0 +1,193 @@ +#!/usr/bin/env node +/** + * Family-import boundary checker. + * + * Rule: generic modules (code that is NOT family-scoped) must not import + * family-specific libraries. EVM libraries (viem, wagmi, @wagmi/core, ethers, + * @rainbow-me/rainbowkit, @wagmi/connectors) should only appear inside: + * - src/chains/evm/** (the EVM facade) + * - src/chains/adapters/evmAdapter.ts + * - EVM feature code (src/components/**, src/utils/** etc.) + * + * Files that must stay EVM-clean are listed in GENERIC_GLOBS below. They + * form the surface the app shell walks through before choosing a family. + * + * Run: node scripts/check-family-imports.mjs + * + * Exits 1 on any violation, 0 when clean. + */ + +import { readdir, readFile, stat } from "node:fs/promises"; +import { relative, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +const ROOT = fileURLToPath(new URL("..", import.meta.url)); +const SRC = join(ROOT, "src"); + +/** + * Directories whose contents are "generic" β€” must not pull in family-specific + * SDKs. Everything else is considered family-scoped (by convention today; + * Phase 4+ will tighten it further). + */ +const GENERIC_DIRS = [ + "chains", // EXCEPT chains/evm/**, chains/adapters/evmAdapter.ts + "routes", + "features", // feature shells, EXCEPT features/*/adapters/** and features/*/simulator/** +]; + +/** + * Additional generic files at the app-shell level. These drive the family + * boundary and must stay EVM-clean so they can render Starknet / Solana + * routes without eagerly loading EVM libraries. + */ +const GENERIC_FILES = [ + "App.tsx", + "main.tsx", + "components/Navigation.tsx", + "components/PersistentTools.tsx", + "components/MobileDrawer.tsx", + "components/HomePage.tsx", + "components/shared/FamilySelector.tsx", + "hooks/useActiveChainFamily.ts", + "hooks/useActiveChainDescriptor.ts", +]; + +/** Paths inside GENERIC_DIRS allowed to import family-specific libraries. */ +const GENERIC_ALLOWLIST = [ + "chains/evm", + "chains/starknet", + "chains/adapters/evmAdapter.ts", + // Family wallet providers β€” one file per family. + "chains/providers", +]; + +/** Path segments that, when present, mark a file as family-scoped + * (i.e. allowed to import EVM SDKs even inside a generic dir). */ +const GENERIC_ALLOWLIST_SEGMENTS = [ + "adapters/evm", + "adapters/svm", + "simulator", +]; + +const FORBIDDEN_MODULES = [ + // EVM + "viem", + "wagmi", + "@wagmi/core", + "@wagmi/connectors", + "ethers", + "@rainbow-me/rainbowkit", + // Starknet + "starknet", + "starkzap", + "@cartridge/controller", + // Solana + "@solana/wallet-adapter-base", + "@solana/wallet-adapter-react", + "@solana/wallet-adapter-react-ui", + "@solana/wallet-adapter-wallets", + "@solana/web3.js", +]; + +const FORBIDDEN_RE = new RegExp( + `(?:import|require)\\s*(?:[\\s\\S]*?from\\s*)?['"](?:${FORBIDDEN_MODULES + .map((m) => m.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&")) + .join("|")})(?:/[^'"]*)?['"]`, +); + +async function* walk(dir) { + const entries = await readdir(dir, { withFileTypes: true }); + for (const entry of entries) { + const path = join(dir, entry.name); + if (entry.isDirectory()) { + if (entry.name === "node_modules" || entry.name.startsWith(".")) continue; + yield* walk(path); + } else if (/\.(ts|tsx|mts|cts|js|jsx|mjs|cjs)$/.test(entry.name)) { + yield path; + } + } +} + +function isAllowlisted(relPath) { + if ( + GENERIC_ALLOWLIST.some( + (allowed) => relPath === allowed || relPath.startsWith(`${allowed}/`), + ) + ) { + return true; + } + return GENERIC_ALLOWLIST_SEGMENTS.some((seg) => + relPath.split("/").join("/").includes(`${seg}/`), + ); +} + +async function collectGenericFiles() { + const files = new Set(); + + for (const dir of GENERIC_DIRS) { + const abs = join(SRC, dir); + try { + await stat(abs); + } catch { + continue; + } + for await (const file of walk(abs)) { + const rel = relative(SRC, file); + if (!isAllowlisted(rel)) files.add(file); + } + } + + for (const rel of GENERIC_FILES) { + files.add(join(SRC, rel)); + } + + return [...files]; +} + +async function main() { + const files = await collectGenericFiles(); + const violations = []; + + for (const file of files) { + let text; + try { + text = await readFile(file, "utf8"); + } catch { + continue; // file may not exist (GENERIC_FILES is aspirational) + } + const lines = text.split(/\r?\n/); + for (let i = 0; i < lines.length; i++) { + if (FORBIDDEN_RE.test(lines[i])) { + violations.push({ + file: relative(ROOT, file), + line: i + 1, + text: lines[i].trim(), + }); + } + } + } + + if (violations.length > 0) { + console.error( + `\nβœ— Family-import boundary violation${violations.length === 1 ? "" : "s"} (${violations.length}):\n`, + ); + for (const v of violations) { + console.error(` ${v.file}:${v.line}`); + console.error(` ${v.text}`); + } + console.error( + `\nGeneric modules must not import EVM-specific libraries (${FORBIDDEN_MODULES.join(", ")}).`, + ); + console.error("Route those imports through src/chains/evm/* instead.\n"); + process.exit(1); + } + + console.log( + `βœ“ Family-import boundary clean (${files.length} generic files checked).`, + ); +} + +main().catch((err) => { + console.error("check-family-imports failed:", err); + process.exit(1); +}); diff --git a/src/App.tsx b/src/App.tsx index 22732d3..8f140fb 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,13 +1,16 @@ -import React, { Suspense, useState } from "react"; +import React, { Suspense, useEffect, useState } from "react"; import { Routes, Route, Navigate, useLocation } from "react-router-dom"; import { cn } from "@/lib/utils"; import "./App.css"; -import { useApplyRainbowKitTheme } from "./config/rainbowkit"; import LoadingSpinner from "./components/shared/LoadingSpinner"; import PersistentTools from "./components/PersistentTools"; import { ToolkitProvider } from "./contexts/ToolkitContext"; import { SimulationProvider } from "./contexts/SimulationContext"; import { DebugProvider } from "./contexts/DebugContext"; +import { + WalletManagerProvider, + useWalletManager, +} from "./contexts/WalletManager"; import Navigation from "./components/Navigation"; import ErrorBoundary from "./components/ErrorBoundary"; import { NotificationProvider } from "./components/NotificationManager"; @@ -20,23 +23,226 @@ import ConstellationBackground from "./components/ConstellationBackground"; import HomePage from "./components/HomePage"; import MobileDrawer from "./components/MobileDrawer"; import { useBreakpoint } from "./hooks/useBreakpoint"; +import { FAMILY_PREFIXES, parseFamilyFromPath, resolveLegacyRedirect } from "./routes/familyRoutes"; + +// Provider + bridge are a matched pair per family. Both are lazy so their +// module graphs only load once the user activates that family. +const EvmFamilyProviders = React.lazy( + () => import("./chains/providers/EvmFamilyProviders"), +); +const StarknetFamilyProviders = React.lazy( + () => import("./chains/providers/StarknetFamilyProviders"), +); +const SolanaFamilyProviders = React.lazy( + () => import("./chains/providers/SolanaFamilyProviders"), +); +const EvmBridge = React.lazy( + () => import("./components/wallet/bridges/EvmBridge"), +); +const StarknetBridge = React.lazy( + () => import("./components/wallet/bridges/StarknetBridge"), +); +const SolanaBridge = React.lazy( + () => import("./components/wallet/bridges/SolanaBridge"), +); const SimulationResultsPage = React.lazy(() => import("./components/SimulationResultsPage")); const RpcSettingsModal = React.lazy(() => import("./components/RpcSettingsModal")); const StorageManagerModal = React.lazy(() => import("./components/StorageManagerModal")); -function App() { +/** + * Conditionally wraps children with the family providers the user has + * activated. First activation per family triggers a one-time subtree + * remount as the provider inserts itself above Routes β€” accepted tradeoff + * for preserving chunk isolation on inactive families. + */ +const FamilyProviderStack: React.FC<{ children: React.ReactNode }> = ({ + children, +}) => { + const { activeFamilies } = useWalletManager(); + if (activeFamilies.size === 0) return <>{children}; + + let node: React.ReactNode = children; + if (activeFamilies.has("svm")) { + node = ( + + + {node} + + ); + } + if (activeFamilies.has("starknet")) { + node = ( + + + {node} + + ); + } + if (activeFamilies.has("evm")) { + node = ( + + + {node} + + ); + } + + return ( + }> + {node} + + ); +}; + +interface FamilyShellProps { + isMobile: boolean; + showRpcSetupGate: boolean; + onOpenRpcModal: () => void; + onAcknowledgeDefaults: () => void; +} + +const FamilyShell: React.FC = ({ + isMobile, + showRpcSetupGate, + onOpenRpcModal, + onAcknowledgeDefaults, +}) => { + const location = useLocation(); + + return ( +
+ {!isMobile && } + +
+ + } /> + +
+ + {showRpcSetupGate && ( +
+
+

+ Connection required +

+

+ Pick an RPC provider or confirm public defaults +

+

+ To run reads, writes, and simulations reliably, choose your RPC (Alchemy, Infura, or custom). + If you prefer, you can continue with the built-in public endpoints, but they may be rate-limited. +

+
+ + +
+
+
+ )} +
+ ); +}; + +function AppInner() { const [isRpcModalOpen, setIsRpcModalOpen] = useState(false); const [isStorageModalOpen, setIsStorageModalOpen] = useState(false); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const location = useLocation(); const { isMobile } = useBreakpoint(); const { config, hasAcknowledgedDefaults, acknowledgeDefaults } = useNetworkConfig(); + const { activateFamily } = useWalletManager(); + + // Visiting a family's route ensures its provider is mounted so tools can + // resolve native SDK hooks without requiring an explicit picker click. + useEffect(() => { + const family = parseFamilyFromPath(location.pathname); + if (family) activateFamily(family); + }, [location.pathname, activateFamily]); const isSimulationPage = location.pathname.startsWith("/simulation/"); const isHomePage = location.pathname === "/"; - - useApplyRainbowKitTheme(); + const legacyRedirectTarget = resolveLegacyRedirect({ + pathname: location.pathname, + search: location.search, + hash: location.hash, + }); const hasUserOverride = (config.rpcMode === "CUSTOM" && config.customRpcUrl?.trim()) || @@ -45,166 +251,106 @@ function App() { const showRpcSetupGate = !hasUserOverride && !hasAcknowledgedDefaults; + const shellProps: FamilyShellProps = { + isMobile, + showRpcSetupGate, + onOpenRpcModal: () => setIsRpcModalOpen(true), + onAcknowledgeDefaults: acknowledgeDefaults, + }; + + return ( + <> + + + setIsRpcModalOpen(true)} + onOpenStorageManager={() => setIsStorageModalOpen(true)} + onToggleMobileMenu={() => setIsMobileMenuOpen((v) => !v)} + isMobileMenuOpen={isMobileMenuOpen} + /> + + {isMobile && ( + + )} + + + {legacyRedirectTarget ? ( + + ) : isSimulationPage ? ( + }> + + } /> + + + ) : isHomePage ? ( + + } /> + + ) : ( + + } + /> + } + /> + } + /> + } + /> + + )} + + +
+ +
+ + {isRpcModalOpen && ( + + setIsRpcModalOpen(false)} + /> + + )} + + {isStorageModalOpen && ( + + setIsStorageModalOpen(false)} + /> + + )} + + ); +} + +function App() { return ( - - - - - - - - {/* Global top bar β€” visible on every route */} - setIsRpcModalOpen(true)} - onOpenStorageManager={() => setIsStorageModalOpen(true)} - onToggleMobileMenu={() => setIsMobileMenuOpen((v) => !v)} - isMobileMenuOpen={isMobileMenuOpen} - /> - - {isMobile && ( - - )} - - {isSimulationPage ? ( - }> - - } /> - - - ) : isHomePage ? ( - - } /> - - ) : ( -
- {!isMobile && } - -
- - } /> - -
- - {showRpcSetupGate && ( -
-
-

- Connection required -

-

- Pick an RPC provider or confirm public defaults -

-

- To run reads, writes, and simulations reliably, choose your RPC (Alchemy, Infura, or custom). - If you prefer, you can continue with the built-in public endpoints, but they may be rate-limited. -

-
- - -
-
-
- )} -
- )} - - {/* Global footer β€” EDB status at far right */} -
- -
- - {isRpcModalOpen && ( - - setIsRpcModalOpen(false)} - /> - - )} - - {isStorageModalOpen && ( - - setIsStorageModalOpen(false)} - /> - - )} -
-
-
-
-
+ + + + + + + + + + + + + ); } diff --git a/src/chains/adapters/evmAdapter.ts b/src/chains/adapters/evmAdapter.ts new file mode 100644 index 0000000..adbbec2 --- /dev/null +++ b/src/chains/adapters/evmAdapter.ts @@ -0,0 +1,31 @@ +import type { EvmChainDescriptor } from "../types"; +import { DEFAULT_FAMILY_CAPABILITIES } from "../capabilities"; +import type { + AddressParseResult, + ChainAdapter, + FamilyAddress, +} from "./types"; +import { parseAddress as parseEvmAddress, isAddress as isEvmAddress } from "../types/evm"; + +export const evmAdapter: ChainAdapter = { + family: "evm", + capabilities: DEFAULT_FAMILY_CAPABILITIES.evm, + + parseAddress(input: string): AddressParseResult { + const trimmed = input.trim(); + if (!isEvmAddress(trimmed)) { + return { ok: false, error: "Expected a 0x-prefixed 20-byte EVM address" }; + } + return { ok: true, address: parseEvmAddress(trimmed) }; + }, + + formatAddress( + address: FamilyAddress, + options?: { compact?: boolean }, + ): string { + if (options?.compact) { + return `${address.slice(0, 6)}…${address.slice(-4)}`; + } + return address; + }, +}; diff --git a/src/chains/adapters/index.ts b/src/chains/adapters/index.ts new file mode 100644 index 0000000..260c896 --- /dev/null +++ b/src/chains/adapters/index.ts @@ -0,0 +1,22 @@ +import type { ChainFamily } from "../types"; +import type { AdapterRegistry, ChainAdapter } from "./types"; +import { evmAdapter } from "./evmAdapter"; + +// Generic code treats a null adapter as "family not ready" β€” hide tools, +// render a placeholder shell. +const REGISTRY: AdapterRegistry = { + evm: evmAdapter, + starknet: null, + svm: null, +}; + +export function getAdapter(family: ChainFamily): ChainAdapter | null { + return REGISTRY[family]; +} + +export function isFamilySupported(family: ChainFamily): boolean { + return REGISTRY[family] !== null; +} + +export { evmAdapter }; +export type { ChainAdapter } from "./types"; diff --git a/src/chains/adapters/types.ts b/src/chains/adapters/types.ts new file mode 100644 index 0000000..9e44538 --- /dev/null +++ b/src/chains/adapters/types.ts @@ -0,0 +1,45 @@ +// ChainAdapter is the boundary between generic HexKit code and +// family-specific implementations. Generic code calls getAdapter(family) +// instead of branching on family literals, and capabilities are the gate β€” +// if adapter.capabilities lacks one, the UI hides the tool. +import type { + ChainDescriptor, + ChainFamily, + EvmChainDescriptor, + StarknetChainDescriptor, + SvmChainDescriptor, +} from "../types"; +import type { ChainCapability } from "../capabilities"; +import type { Address as EvmAddress } from "../types/evm"; +import type { StarknetAddress } from "../types/starknet"; +import type { PublicKey as SvmPublicKey } from "../types/svm"; + +// Extend when a new family is added. +export type FamilyAddress = + T extends EvmChainDescriptor ? EvmAddress : + T extends StarknetChainDescriptor ? StarknetAddress : + T extends SvmChainDescriptor ? SvmPublicKey : + never; + +export type AddressParseResult = + | { ok: true; address: FamilyAddress } + | { ok: false; error: string }; + +// Family-discriminated so TypeScript rejects passing a Starknet session +// into an EVM-typed slot. +export type WalletSession = { + chainFamily: T["chainFamily"]; + address: FamilyAddress; + disconnect: () => Promise; +}; + +export interface ChainAdapter { + readonly family: T["chainFamily"]; + readonly capabilities: ReadonlySet; + parseAddress(input: string): AddressParseResult; + formatAddress(address: FamilyAddress, options?: { compact?: boolean }): string; +} + +export type AdapterRegistry = { + [F in ChainFamily]: ChainAdapter | null; +}; diff --git a/src/chains/capabilities.ts b/src/chains/capabilities.ts new file mode 100644 index 0000000..077083e --- /dev/null +++ b/src/chains/capabilities.ts @@ -0,0 +1,52 @@ +import type { ChainFamily } from "./types"; + +export type ChainCapability = + /** Wallet connection is available for this chain. */ + | "wallet" + /** Read calls against deployed contracts/programs. */ + | "contract-read" + /** Signed writes (transactions / instructions) via a connected wallet. */ + | "contract-write" + /** Replay a prior on-chain transaction/signature through a simulator. */ + | "tx-replay" + /** Local/remote simulation of a pending transaction. */ + | "simulation" + /** Source-level step debugger. EVM-only via EDB today. */ + | "debug" + /** Contract/class/program source lookup + ABI/IDL fetch. */ + | "source-lookup" + /** Compare two contract code artifacts (bytecode, class hash, program). */ + | "bytecode-diff" + /** Solidity-style storage-layout decoding. EVM-only. */ + | "storage-layout" + /** Function-selector / signature / typed-data tools. */ + | "signature-tools" + /** LI.FI Earn / yield integrations. */ + | "earn"; + +export const DEFAULT_FAMILY_CAPABILITIES: Record> = { + evm: new Set([ + "wallet", + "contract-read", + "contract-write", + "tx-replay", + "simulation", + "debug", + "source-lookup", + "bytecode-diff", + "storage-layout", + "signature-tools", + "earn", + ]), + starknet: new Set(), + // `earn` only, so /solana/integrations/lifi-earn reaches the SVM stub's + // "coming soon" card. Real capabilities land with the real SVM adapter. + svm: new Set(["earn"]), +}; + +export function familyHasCapability( + family: ChainFamily, + capability: ChainCapability, +): boolean { + return DEFAULT_FAMILY_CAPABILITIES[family].has(capability); +} diff --git a/src/chains/evm/explorer.ts b/src/chains/evm/explorer.ts new file mode 100644 index 0000000..c4effb9 --- /dev/null +++ b/src/chains/evm/explorer.ts @@ -0,0 +1,31 @@ +import type { EvmChainDescriptor } from "../types"; +import { + getExplorerUrl as getLegacyExplorerUrl, + getExplorerBaseUrlFromApiUrl, + getChainById, +} from "../registry"; + +export interface EvmExplorerClient { + readonly baseUrl: string; + readonly apiUrl: string | null; + urlFor(type: "tx" | "address" | "block", identifier: string): string; +} + +export function createEvmExplorerClient( + descriptor: EvmChainDescriptor, +): EvmExplorerClient { + const chainId = descriptor.chainId as number; + const legacy = getChainById(chainId); + const baseUrl = legacy?.explorerUrl ?? legacy?.blockExplorer ?? ""; + const apiUrl = legacy?.apiUrl ?? null; + + return { + baseUrl, + apiUrl, + urlFor(type, identifier) { + return getLegacyExplorerUrl(chainId, type, identifier); + }, + }; +} + +export { getExplorerBaseUrlFromApiUrl }; diff --git a/src/chains/evm/index.ts b/src/chains/evm/index.ts new file mode 100644 index 0000000..1778a3f --- /dev/null +++ b/src/chains/evm/index.ts @@ -0,0 +1,10 @@ +// EVM family barrel. The family-import boundary (enforced by +// scripts/check-family-imports.mjs) is: files under `src/chains/evm/*` +// may import viem/wagmi/ethers/RainbowKit; generic code consumes this +// barrel instead. +export * from "./rpc"; +export * from "./explorer"; +export * from "./wallet"; +export * from "./simulation"; + +export { evmAdapter } from "../adapters/evmAdapter"; diff --git a/src/chains/evm/rpc.ts b/src/chains/evm/rpc.ts new file mode 100644 index 0000000..4aeed0f --- /dev/null +++ b/src/chains/evm/rpc.ts @@ -0,0 +1,36 @@ +// Wraps the existing providerPool so adapter-routed callers don't touch +// ethers directly. Feature code can keep importing providerPool during +// the migration. +import type { ethers } from "ethers"; +import { getSharedProvider } from "../../utils/providerPool"; +import type { Chain } from "../../types"; +import type { EvmChainDescriptor } from "../types"; + +export interface EvmRpcClient { + readonly provider: ethers.providers.JsonRpcProvider; +} + +function descriptorToLegacyChain(descriptor: EvmChainDescriptor, legacy: Chain): Chain { + return { + id: descriptor.chainId as number, + chainFamily: "evm", + chainKey: descriptor.key, + name: descriptor.name, + rpcUrl: legacy.rpcUrl, + explorerUrl: legacy.explorerUrl, + blockExplorer: legacy.blockExplorer, + apiUrl: legacy.apiUrl, + explorers: legacy.explorers, + nativeCurrency: legacy.nativeCurrency, + }; +} + +export function createEvmRpcClient( + descriptor: EvmChainDescriptor, + legacy: Chain, +): EvmRpcClient { + const chain = descriptorToLegacyChain(descriptor, legacy); + return { + provider: getSharedProvider(chain), + }; +} diff --git a/src/chains/evm/simulation.ts b/src/chains/evm/simulation.ts new file mode 100644 index 0000000..686a123 --- /dev/null +++ b/src/chains/evm/simulation.ts @@ -0,0 +1,8 @@ +// Re-exports so adapter-routed callers don't reach into +// src/utils/transaction-simulation directly. +export { + simulateTransaction, + replayTransactionWithSimulator, +} from "../../utils/transactionSimulation"; + +export type { SimulationResult } from "../../types/transaction"; diff --git a/src/chains/evm/wallet.ts b/src/chains/evm/wallet.ts new file mode 100644 index 0000000..2ae234a --- /dev/null +++ b/src/chains/evm/wallet.ts @@ -0,0 +1,16 @@ +import type { EvmChainDescriptor } from "../types"; +import type { Address } from "../types/evm"; +import type { WalletSession } from "../adapters/types"; + +export type EvmWalletSession = WalletSession; + +export function buildEvmWalletSession( + address: Address, + disconnect: () => Promise, +): EvmWalletSession { + return { + chainFamily: "evm", + address, + disconnect, + }; +} diff --git a/src/chains/providers/EvmFamilyProviders.tsx b/src/chains/providers/EvmFamilyProviders.tsx new file mode 100644 index 0000000..0e6d044 --- /dev/null +++ b/src/chains/providers/EvmFamilyProviders.tsx @@ -0,0 +1,21 @@ +import type { ReactNode } from "react"; +import { + RpcAwareWagmiProvider, + RainbowKitProvider, + web3ToolkitTheme, +} from "../../config/rainbowkit"; +import { useApplyRainbowKitTheme } from "../../config/rainbowkit"; + +export function EvmFamilyProviders({ children }: { children: ReactNode }) { + useApplyRainbowKitTheme(); + + return ( + + + {children} + + + ); +} + +export default EvmFamilyProviders; diff --git a/src/chains/providers/SolanaFamilyProviders.tsx b/src/chains/providers/SolanaFamilyProviders.tsx new file mode 100644 index 0000000..5f7ea51 --- /dev/null +++ b/src/chains/providers/SolanaFamilyProviders.tsx @@ -0,0 +1,33 @@ +// Provider stays mounted for the session once activated; the WalletManager +// decides when to mount it. autoConnect is enabled so previously-used wallets +// are restored from the SDK's own localStorage on remount. +import { useMemo, type ReactNode } from "react"; +import { ConnectionProvider, WalletProvider } from "@solana/wallet-adapter-react"; +import { WalletModalProvider } from "@solana/wallet-adapter-react-ui"; +import { + PhantomWalletAdapter, + SolflareWalletAdapter, +} from "@solana/wallet-adapter-wallets"; +import { useNetworkConfig } from "@/contexts/NetworkConfigContext"; +import "@solana/wallet-adapter-react-ui/styles.css"; + +export function SolanaFamilyProviders({ children }: { children: ReactNode }) { + const { resolveSolanaRpc } = useNetworkConfig(); + // ConnectionProvider accepts a new endpoint without re-mounting, so + // wallet-adapter's selection state survives RPC provider changes. + const endpoint = resolveSolanaRpc("mainnet-beta").url; + const wallets = useMemo( + () => [new PhantomWalletAdapter(), new SolflareWalletAdapter()], + [], + ); + + return ( + + + {children} + + + ); +} + +export default SolanaFamilyProviders; diff --git a/src/chains/providers/StarknetFamilyProviders.tsx b/src/chains/providers/StarknetFamilyProviders.tsx new file mode 100644 index 0000000..2e39366 --- /dev/null +++ b/src/chains/providers/StarknetFamilyProviders.tsx @@ -0,0 +1,14 @@ +/** + * Starkzap-backed Starknet shell. Starkzap doesn't use a React provider + * context β€” connection state lives in the `StarkzapClient` singleton, which + * the StarknetBridge subscribes to. This wrapper stays for symmetry with + * the EVM and Solana families (and so the FamilyProviderStack composition + * in App.tsx treats all three uniformly), but it's a straight pass-through. + */ +import type { ReactNode } from "react"; + +export function StarknetFamilyProviders({ children }: { children: ReactNode }) { + return <>{children}; +} + +export default StarknetFamilyProviders; diff --git a/src/chains/registry.ts b/src/chains/registry.ts index 7780501..3d6ad2f 100644 --- a/src/chains/registry.ts +++ b/src/chains/registry.ts @@ -6,6 +6,7 @@ */ import type { Chain, ExplorerAPI } from "../types"; +import { toEvmChainKey } from "./types/evm"; // ── Explorer API configs for chains that have them ────────────────────────── @@ -401,6 +402,8 @@ function makeChain(id: number, name: string, nativeCurrency: Chain["nativeCurren const explorer = EXPLORER_APIS[id]; return { id, + chainFamily: "evm", + chainKey: toEvmChainKey(id), name, rpcUrl, nativeCurrency, @@ -493,9 +496,13 @@ export const CHAIN_REGISTRY: Chain[] = [ // ── Lookup helpers ─────────────────────────────────────────────────────────── const CHAIN_BY_ID = new Map(CHAIN_REGISTRY.map((c) => [c.id, c])); +const CHAIN_BY_KEY = new Map(CHAIN_REGISTRY.map((c) => [c.chainKey, c])); export const getChainById = (id: number): Chain | undefined => CHAIN_BY_ID.get(id); +/** Look up an EVM chain by its canonical cross-family key (`evm:${id}`). */ +export const getChainByKey = (key: Chain["chainKey"]): Chain | undefined => CHAIN_BY_KEY.get(key); + /** IDs of testnet chains */ const TESTNET_IDS = new Set([11155111, 84532, 17000, 4202, 80002, 421614, 11155420, 97]); diff --git a/src/chains/starknet/starkzapClient.ts b/src/chains/starknet/starkzapClient.ts new file mode 100644 index 0000000..b143505 --- /dev/null +++ b/src/chains/starknet/starkzapClient.ts @@ -0,0 +1,252 @@ +/** + * Starkzap-backed Starknet wallet client. One SDK instance handles Cartridge + * natively via `sdk.connectCartridge()`; Argent X / Braavos browser + * extensions are wrapped in a `WalletInterface` adapter so both flows share + * the same pipeline. Pattern mirrors market-zap (onlyoneAlexia/market-zap). + * Singleton; the StarknetBridge subscribes for state changes. + */ +import { StarkZap, type WalletInterface } from "starkzap"; +import type { Account, Call, Signature } from "starknet"; +import { RpcProvider } from "starknet"; +import { networkConfigManager } from "@/config/networkConfig"; + +export type StarknetNetwork = "mainnet" | "sepolia"; +export type StarknetProviderId = "argentX" | "braavos" | "cartridge"; + +export interface StarknetConnectionState { + address: string | null; + provider: StarknetProviderId | null; + connecting: boolean; + network: StarknetNetwork; +} + +interface StarknetWindowWallet { + account?: Account; + selectedAddress?: string; + enable: (options?: { starknetVersion?: string }) => Promise; +} + +const STORAGE_KEY = "hexkit.starknet.lastProvider"; + +const WINDOW_KEYS: Record<"argentX" | "braavos", string> = { + argentX: "starknet_argentX", + braavos: "starknet_braavos", +}; + +const DISPLAY_NAMES: Record<"argentX" | "braavos", string> = { + argentX: "Argent X", + braavos: "Braavos", +}; + +function getInjected(providerId: "argentX" | "braavos"): StarknetWindowWallet | null { + const obj = (window as unknown as Record)[WINDOW_KEYS[providerId]]; + if (obj && typeof obj === "object" && typeof (obj as StarknetWindowWallet).enable === "function") { + return obj as StarknetWindowWallet; + } + return null; +} + +async function waitForInjected( + providerId: "argentX" | "braavos", + { timeoutMs = 3000, intervalMs = 200 } = {}, +): Promise { + const existing = getInjected(providerId); + if (existing) return existing; + const deadline = Date.now() + timeoutMs; + return new Promise((resolve) => { + const timer = setInterval(() => { + const w = getInjected(providerId); + if (w || Date.now() >= deadline) { + clearInterval(timer); + resolve(w); + } + }, intervalMs); + }); +} + +function adaptInjectedAccount(account: Account, rpc: RpcProvider): WalletInterface { + // Minimal WalletInterface adapter around a raw starknet.js Account. + // Starkzap expects this shape; browser wallets handle fee estimation + // themselves so we forward calls as-is without resourceBounds. + return { + address: account.address, + getAccount: () => account, + getProvider: () => rpc, + execute: async (calls: Call[]) => { + const result: any = await account.execute(calls as any); + const txHash = + result.hash ?? + result.transactionHash ?? + result.transaction_hash ?? + (typeof result === "string" ? result : ""); + if (!txHash) throw new Error("No transaction hash returned from wallet"); + return { + transactionHash: txHash, + wait: async () => { + const receipt: any = await rpc.waitForTransaction(txHash); + if (receipt.finality_status === "REJECTED" || receipt.finalityStatus === "REJECTED") { + throw new Error("Transaction rejected before block inclusion"); + } + const execStatus = receipt.execution_status ?? receipt.executionStatus; + if (execStatus === "REVERTED") { + throw new Error(receipt.revert_reason ?? receipt.revertReason ?? "Transaction reverted"); + } + }, + } as any; + }, + signMessage: async (typedData: any): Promise => account.signMessage(typedData) as any, + preflight: async () => ({ ok: true }) as any, + ensureReady: async () => {}, + disconnect: async () => {}, + } as unknown as WalletInterface; +} + +class StarkzapClient { + private sdk: StarkZap | null = null; + private sdkRpcUrl: string | null = null; + private wallet: WalletInterface | null = null; + private state: StarknetConnectionState = { + address: null, + provider: null, + connecting: false, + network: "mainnet", + }; + private listeners = new Set<(s: StarknetConnectionState) => void>(); + + constructor(network: StarknetNetwork = "mainnet") { + this.state.network = network; + } + + /** Rebuild the SDK when the resolved RPC URL changes. */ + private getSdk(): StarkZap { + const { url } = networkConfigManager.resolveStarknetRpc(this.state.network); + if (!this.sdk || this.sdkRpcUrl !== url) { + this.sdk = new StarkZap({ network: this.state.network, rpcUrl: url }); + this.sdkRpcUrl = url; + } + return this.sdk; + } + + currentRpcUrl(): string { + return networkConfigManager.resolveStarknetRpc(this.state.network).url; + } + + /** Drop the current SDK + wallet so the next connect uses a fresh RPC URL. */ + async reset(): Promise { + await this.disconnect(); + this.sdk = null; + this.sdkRpcUrl = null; + } + + subscribe(fn: (s: StarknetConnectionState) => void): () => void { + this.listeners.add(fn); + fn(this.state); + return () => this.listeners.delete(fn); + } + + private emit() { + this.listeners.forEach((fn) => fn({ ...this.state })); + } + + private setState(patch: Partial) { + this.state = { ...this.state, ...patch }; + this.emit(); + } + + private rememberProvider(id: StarknetProviderId) { + try { + window.localStorage.setItem(STORAGE_KEY, id); + } catch {} + } + + private forgetProvider() { + try { + window.localStorage.removeItem(STORAGE_KEY); + } catch {} + } + + /** Connect via Cartridge Controller (Starkzap native path). */ + async connectCartridge(options?: { + policies?: Array<{ target: string; method: string }>; + preset?: string; + url?: string; + }): Promise { + this.setState({ connecting: true }); + try { + const sdk = this.getSdk(); + const w = await sdk.connectCartridge({ + ...(options ?? {}), + // Cartridge handles fees via its own controller session. + feeMode: "user_pays", + }); + this.wallet = w; + this.rememberProvider("cartridge"); + this.setState({ + address: w.address.toString(), + provider: "cartridge", + connecting: false, + }); + } catch (err) { + this.setState({ connecting: false }); + throw err; + } + } + + /** Connect via an injected browser wallet (Argent X or Braavos). */ + async connectBrowserWallet(providerId: "argentX" | "braavos"): Promise { + this.setState({ connecting: true }); + try { + const injected = await waitForInjected(providerId); + if (!injected) { + throw new Error( + `${DISPLAY_NAMES[providerId]} extension not detected. Install it and refresh the page.`, + ); + } + if (!injected.account || !injected.selectedAddress) { + await injected.enable(); + } + if (!injected.account || !injected.selectedAddress) { + throw new Error("Wallet connection was rejected or failed"); + } + const sdk = this.getSdk(); + const rpc = sdk.getProvider() as unknown as RpcProvider; + // Network check deferred to the tool layer β€” connecting the wallet + // shouldn't fail just because the user is on a chain we haven't + // primed for yet. Tools that need a specific chain can read + // `wallet.getProvider().getChainId()` and prompt to switch. + this.wallet = adaptInjectedAccount(injected.account, rpc); + this.rememberProvider(providerId); + this.setState({ + address: injected.selectedAddress, + provider: providerId, + connecting: false, + }); + } catch (err) { + this.setState({ connecting: false }); + throw err; + } + } + + async disconnect(): Promise { + if (this.wallet) { + try { + await this.wallet.disconnect(); + } catch {} + } + this.wallet = null; + this.forgetProvider(); + this.setState({ address: null, provider: null, connecting: false }); + } + +} + +let singleton: StarkzapClient | null = null; + +export function getStarkzapClient(): StarkzapClient { + if (!singleton) { + singleton = new StarkzapClient(); + } + return singleton; +} + +export type { StarkzapClient }; diff --git a/src/chains/toolRegistry.ts b/src/chains/toolRegistry.ts new file mode 100644 index 0000000..714719d --- /dev/null +++ b/src/chains/toolRegistry.ts @@ -0,0 +1,34 @@ +// Canonical tool registry β€” Navigation, PersistentTools, and MobileDrawer +// all filter this list by capability before matching routes, which is what +// keeps the family boundary authoritative. +import type { ChainCapability } from "./capabilities"; + +export interface ToolEntry { + id: string; + /** Tool path without family prefix (e.g. "/builder"). */ + path: string; + /** When true, any path starting with `path` matches. */ + prefix?: boolean; + capability: ChainCapability; +} + +export const TOOL_REGISTRY: ReadonlyArray = [ + { id: "database", path: "/database", capability: "signature-tools" }, + { id: "builder", path: "/builder", capability: "simulation" }, + { id: "simulations", path: "/simulations", capability: "simulation" }, + { id: "explorer", path: "/explorer", capability: "source-lookup" }, + { id: "integrations", path: "/integrations", prefix: true, capability: "earn" }, +]; + +export function findToolForPath(strippedPath: string): ToolEntry | undefined { + return TOOL_REGISTRY.find((tool) => + tool.prefix ? strippedPath.startsWith(tool.path) : tool.path === strippedPath, + ); +} + +export function isToolAllowed( + tool: ToolEntry, + capabilities: ReadonlySet, +): boolean { + return capabilities.has(tool.capability); +} diff --git a/src/chains/types/evm.ts b/src/chains/types/evm.ts new file mode 100644 index 0000000..694cef7 --- /dev/null +++ b/src/chains/types/evm.ts @@ -0,0 +1,63 @@ +declare const hexBrand: unique symbol; +declare const addressBrand: unique symbol; +declare const selectorBrand: unique symbol; +declare const calldataBrand: unique symbol; +declare const abiBrand: unique symbol; +declare const chainIdBrand: unique symbol; + +export type Hex = `0x${string}` & { readonly [hexBrand]: "EvmHex" }; +export type Address = Hex & { readonly [addressBrand]: "EvmAddress" }; +export type Selector = Hex & { readonly [selectorBrand]: "EvmSelector4Byte" }; +export type Calldata = Hex & { readonly [calldataBrand]: "EvmCalldata" }; +export type Abi = readonly unknown[] & { readonly [abiBrand]: "EvmAbi" }; +export type EvmChainId = number & { readonly [chainIdBrand]: "EvmChainId" }; + +const HEX_RE = /^0x[0-9a-fA-F]*$/; +const ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/; +const SELECTOR_RE = /^0x[0-9a-fA-F]{8}$/; + +export function isHex(input: unknown): input is Hex { + return typeof input === "string" && HEX_RE.test(input); +} + +export function isAddress(input: unknown): input is Address { + return typeof input === "string" && ADDRESS_RE.test(input); +} + +export function isSelector(input: unknown): input is Selector { + return typeof input === "string" && SELECTOR_RE.test(input); +} + +export function parseHex(input: string): Hex { + if (!HEX_RE.test(input)) throw new Error(`Invalid EVM hex: ${input}`); + return input as Hex; +} + +export function parseAddress(input: string): Address { + if (!ADDRESS_RE.test(input)) throw new Error(`Invalid EVM address: ${input}`); + return input as unknown as Address; +} + +export function parseSelector(input: string): Selector { + if (!SELECTOR_RE.test(input)) throw new Error(`Invalid EVM 4-byte selector: ${input}`); + return input as unknown as Selector; +} + +export function parseCalldata(input: string): Calldata { + return parseHex(input) as unknown as Calldata; +} + +export function parseAbi(input: readonly unknown[]): Abi { + return input as Abi; +} + +export function parseEvmChainId(input: number): EvmChainId { + if (!Number.isInteger(input) || input <= 0) throw new Error(`Invalid EVM chain ID: ${input}`); + return input as EvmChainId; +} + +export type EvmChainKey = `evm:${number}`; + +export function toEvmChainKey(chainId: number): EvmChainKey { + return `evm:${chainId}` as EvmChainKey; +} diff --git a/src/chains/types/index.ts b/src/chains/types/index.ts new file mode 100644 index 0000000..1303e60 --- /dev/null +++ b/src/chains/types/index.ts @@ -0,0 +1,73 @@ +import type { EvmChainId, EvmChainKey } from "./evm"; +import type { StarknetChainId, StarknetChainKey } from "./starknet"; +import type { SvmChainKey, SvmCluster } from "./svm"; +import { toEvmChainKey } from "./evm"; +import { toStarknetChainKey } from "./starknet"; +import { toSvmChainKey } from "./svm"; + +export * as Evm from "./evm"; +export * as Starknet from "./starknet"; +export * as Svm from "./svm"; + +export type ChainFamily = "evm" | "starknet" | "svm"; + +export type ChainKey = EvmChainKey | StarknetChainKey | SvmChainKey; + +export interface BaseChainDescriptor { + key: ChainKey; + chainFamily: ChainFamily; + name: string; + shortName?: string; + testnet?: boolean; + nativeCurrency?: { name: string; symbol: string; decimals: number }; +} + +export interface EvmChainDescriptor extends BaseChainDescriptor { + chainFamily: "evm"; + key: EvmChainKey; + chainId: EvmChainId; +} + +export interface StarknetChainDescriptor extends BaseChainDescriptor { + chainFamily: "starknet"; + key: StarknetChainKey; + chainId: StarknetChainId; +} + +export interface SvmChainDescriptor extends BaseChainDescriptor { + chainFamily: "svm"; + key: SvmChainKey; + cluster: SvmCluster; +} + +export type ChainDescriptor = + | EvmChainDescriptor + | StarknetChainDescriptor + | SvmChainDescriptor; + +export function isEvmChain(chain: ChainDescriptor): chain is EvmChainDescriptor { + return chain.chainFamily === "evm"; +} + +export function isStarknetChain(chain: ChainDescriptor): chain is StarknetChainDescriptor { + return chain.chainFamily === "starknet"; +} + +export function isSvmChain(chain: ChainDescriptor): chain is SvmChainDescriptor { + return chain.chainFamily === "svm"; +} + +export function parseChainKey(input: string): ChainKey { + if (!input.includes(":")) throw new Error(`Invalid ChainKey: ${input}`); + const [family] = input.split(":", 1); + if (family !== "evm" && family !== "starknet" && family !== "svm") { + throw new Error(`Unknown chain family in ChainKey: ${input}`); + } + return input as ChainKey; +} + +export function chainKeyFamily(key: ChainKey): ChainFamily { + return key.split(":", 1)[0] as ChainFamily; +} + +export { toEvmChainKey, toStarknetChainKey, toSvmChainKey }; diff --git a/src/chains/types/starknet.ts b/src/chains/types/starknet.ts new file mode 100644 index 0000000..4b00346 --- /dev/null +++ b/src/chains/types/starknet.ts @@ -0,0 +1,57 @@ +declare const feltBrand: unique symbol; +declare const classHashBrand: unique symbol; +declare const entrypointBrand: unique symbol; +declare const starknetAddressBrand: unique symbol; + +export type Felt = string & { readonly [feltBrand]: "StarknetFelt" }; +export type ClassHash = Felt & { readonly [classHashBrand]: "StarknetClassHash" }; +export type EntrypointSelector = Felt & { readonly [entrypointBrand]: "StarknetEntrypointSelector" }; +export type StarknetAddress = Felt & { readonly [starknetAddressBrand]: "StarknetAddress" }; +export type StarknetCalldata = readonly Felt[]; + +export type StarknetChainId = + | "0x534e5f4d41494e" + | "0x534e5f5345504f4c4941"; + +export const STARKNET_MAINNET_ID: StarknetChainId = "0x534e5f4d41494e"; +export const STARKNET_SEPOLIA_ID: StarknetChainId = "0x534e5f5345504f4c4941"; + +const FELT_RE = /^0x[0-9a-fA-F]+$/; +const FELT_MAX = 2n ** 252n; + +export function isFelt(input: unknown): input is Felt { + if (typeof input !== "string" || !FELT_RE.test(input)) return false; + try { + return BigInt(input) < FELT_MAX; + } catch { + return false; + } +} + +export function parseFelt(input: string): Felt { + if (!FELT_RE.test(input)) throw new Error(`Invalid Starknet felt: ${input}`); + if (BigInt(input) >= FELT_MAX) throw new Error(`Starknet felt out of range: ${input}`); + return input as Felt; +} + +export function parseStarknetAddress(input: string): StarknetAddress { + return parseFelt(input) as unknown as StarknetAddress; +} + +export function parseClassHash(input: string): ClassHash { + return parseFelt(input) as unknown as ClassHash; +} + +export function parseEntrypointSelector(input: string): EntrypointSelector { + return parseFelt(input) as unknown as EntrypointSelector; +} + +export function parseStarknetCalldata(input: readonly string[]): StarknetCalldata { + return input.map(parseFelt); +} + +export type StarknetChainKey = `starknet:${StarknetChainId}`; + +export function toStarknetChainKey(chainId: StarknetChainId): StarknetChainKey { + return `starknet:${chainId}` as StarknetChainKey; +} diff --git a/src/chains/types/svm.ts b/src/chains/types/svm.ts new file mode 100644 index 0000000..d912a2c --- /dev/null +++ b/src/chains/types/svm.ts @@ -0,0 +1,68 @@ +declare const publicKeyBrand: unique symbol; +declare const programIdBrand: unique symbol; +declare const instructionDataBrand: unique symbol; +declare const txSignatureBrand: unique symbol; + +export type PublicKey = string & { readonly [publicKeyBrand]: "SvmPublicKey" }; +export type ProgramId = PublicKey & { readonly [programIdBrand]: "SvmProgramId" }; +export type InstructionData = Uint8Array & { readonly [instructionDataBrand]: "SvmInstructionData" }; +export type TransactionSignature = string & { readonly [txSignatureBrand]: "SvmTransactionSignature" }; + +export interface AccountMeta { + pubkey: PublicKey; + isSigner: boolean; + isWritable: boolean; +} + +export type SvmCluster = "mainnet-beta" | "devnet" | "testnet"; + +export const SVM_MAINNET: SvmCluster = "mainnet-beta"; +export const SVM_DEVNET: SvmCluster = "devnet"; +export const SVM_TESTNET: SvmCluster = "testnet"; + +// Base58 alphabet (Bitcoin variant β€” no 0, O, I, l) +const BASE58_RE = /^[1-9A-HJ-NP-Za-km-z]+$/; +// ed25519 public keys and Solana signatures both serialize to base58; pubkeys +// are 32 bytes β†’ 43–44 base58 chars, signatures are 64 bytes β†’ 87–88. +const PUBKEY_LEN = { min: 32, max: 44 } as const; +const SIG_LEN = { min: 86, max: 88 } as const; + +export function isPublicKey(input: unknown): input is PublicKey { + return ( + typeof input === "string" + && input.length >= PUBKEY_LEN.min + && input.length <= PUBKEY_LEN.max + && BASE58_RE.test(input) + ); +} + +export function parsePublicKey(input: string): PublicKey { + if (!isPublicKey(input)) throw new Error(`Invalid Solana public key: ${input}`); + return input as PublicKey; +} + +export function parseProgramId(input: string): ProgramId { + return parsePublicKey(input) as unknown as ProgramId; +} + +export function parseInstructionData(input: Uint8Array): InstructionData { + return input as InstructionData; +} + +export function parseTransactionSignature(input: string): TransactionSignature { + if ( + typeof input !== "string" + || input.length < SIG_LEN.min + || input.length > SIG_LEN.max + || !BASE58_RE.test(input) + ) { + throw new Error(`Invalid Solana transaction signature: ${input}`); + } + return input as TransactionSignature; +} + +export type SvmChainKey = `svm:${SvmCluster}`; + +export function toSvmChainKey(cluster: SvmCluster): SvmChainKey { + return `svm:${cluster}` as SvmChainKey; +} diff --git a/src/components/HomePage.tsx b/src/components/HomePage.tsx index 9a544fa..ae8ce5b 100644 --- a/src/components/HomePage.tsx +++ b/src/components/HomePage.tsx @@ -1,12 +1,13 @@ import React from "react"; import { useNavigate } from "react-router-dom"; import { Database, Wrench, Code, Command as CommandIcon, MagnifyingGlass, Stack } from "@phosphor-icons/react"; +import { buildFamilyPath } from "../routes/familyRoutes"; const QUICK_ACTIONS = [ - { label: "Signature Database", icon: Database, route: "/database" }, - { label: "Transaction Utils", icon: Wrench, route: "/builder" }, - { label: "Source Tools", icon: Code, route: "/explorer" }, - { label: "Integrations", icon: Stack, route: "/integrations" }, + { label: "Signature Database", icon: Database, route: buildFamilyPath("evm", "/database") }, + { label: "Transaction Utils", icon: Wrench, route: buildFamilyPath("evm", "/builder") }, + { label: "Source Tools", icon: Code, route: buildFamilyPath("evm", "/explorer") }, + { label: "Integrations", icon: Stack, route: buildFamilyPath("evm", "/integrations") }, ] as const; const HomePage: React.FC = () => { diff --git a/src/components/MobileDrawer.tsx b/src/components/MobileDrawer.tsx index 8fe1c58..edb090a 100644 --- a/src/components/MobileDrawer.tsx +++ b/src/components/MobileDrawer.tsx @@ -1,18 +1,32 @@ -import React from "react"; +import React, { useMemo } from "react"; import { useLocation, useNavigate } from "react-router-dom"; import { Sheet, SheetContent, SheetHeader, SheetTitle } from "./ui/sheet"; import { Database, Wrench, Code, MagnifyingGlass, CaretRight, Stack } from "@phosphor-icons/react"; +import type { IconProps } from "@phosphor-icons/react"; import { cn } from "@/lib/utils"; +import { useActiveChainFamily } from "../hooks/useActiveChainFamily"; +import { buildFamilyPath, stripFamilyPrefix } from "../routes/familyRoutes"; +import { DEFAULT_FAMILY_CAPABILITIES } from "../chains/capabilities"; +import { TOOL_REGISTRY, isToolAllowed } from "../chains/toolRegistry"; interface MobileDrawerProps { open: boolean; onOpenChange: (open: boolean) => void; } -const TOOLS = [ - { +interface DrawerTool { + id: string; + route: string; + label: string; + icon: React.FC; + subTabs: { id: string; label: string; paramKey: string }[]; +} + +/** Display metadata per tool id. The authoritative list + capability gates + * live in TOOL_REGISTRY; we filter below by active family capabilities. */ +const TOOL_DISPLAY: Record> = { + database: { id: "database", - route: "/database", label: "Signature Database", icon: Database, subTabs: [ @@ -23,9 +37,8 @@ const TOOLS = [ { id: "cache", label: "Cache", paramKey: "tab" }, ], }, - { + builder: { id: "builder", - route: "/builder", label: "Transaction Utils", icon: Wrench, subTabs: [ @@ -33,9 +46,8 @@ const TOOLS = [ { id: "simulation", label: "Simulation (EDB)", paramKey: "mode" }, ], }, - { + explorer: { id: "explorer", - route: "/explorer", label: "Source Tools", icon: Code, subTabs: [ @@ -44,29 +56,48 @@ const TOOLS = [ { id: "storage", label: "Storage", paramKey: "tool" }, ], }, - { + integrations: { id: "integrations", - route: "/integrations", label: "Integrations", icon: Stack, subTabs: [ { id: "lifi-earn", label: "LI.FI Earn", paramKey: "route" }, ], }, -]; +}; -function getActiveToolId(pathname: string): string { - if (pathname.startsWith("/builder") || pathname.startsWith("/simulations")) return "builder"; - if (pathname.startsWith("/database")) return "database"; - if (pathname.startsWith("/explorer")) return "explorer"; - if (pathname.startsWith("/integrations")) return "integrations"; +function getActiveToolId(strippedPath: string): string { + if (strippedPath.startsWith("/builder") || strippedPath.startsWith("/simulations")) return "builder"; + if (strippedPath.startsWith("/database")) return "database"; + if (strippedPath.startsWith("/explorer")) return "explorer"; + if (strippedPath.startsWith("/integrations")) return "integrations"; return "database"; } const MobileDrawer: React.FC = ({ open, onOpenChange }) => { const location = useLocation(); const navigate = useNavigate(); - const activeToolId = getActiveToolId(location.pathname); + const family = useActiveChainFamily(); + const strippedPath = useMemo(() => stripFamilyPrefix(location.pathname), [location.pathname]); + const familyCapabilities = DEFAULT_FAMILY_CAPABILITIES[family]; + + // Build the family-filtered tool list from the shared registry. Any tool + // whose capability is not in the active family's set is hidden here, so + // non-EVM drawer cannot navigate into EVM-only tools. + const tools = useMemo( + () => + TOOL_REGISTRY + .filter((entry) => isToolAllowed(entry, familyCapabilities)) + .map((entry) => { + const display = TOOL_DISPLAY[entry.id]; + if (!display) return null; + return { ...display, route: entry.path }; + }) + .filter((t): t is DrawerTool => t !== null), + [familyCapabilities], + ); + + const activeToolId = getActiveToolId(strippedPath); const handleSearch = () => { onOpenChange(false); @@ -75,19 +106,20 @@ const MobileDrawer: React.FC = ({ open, onOpenChange }) => { ); }; - const handleToolClick = (route: string) => { - navigate(route); + const handleToolClick = (tool: DrawerTool) => { + navigate(buildFamilyPath(family, tool.route)); onOpenChange(false); }; const handleSubTabClick = ( - tool: (typeof TOOLS)[number], + tool: DrawerTool, subId: string, paramKey: string ) => { - // Route-based sub-tabs navigate to a sub-path (e.g. /integrations/lifi-earn) + const familyToolRoute = buildFamilyPath(family, tool.route); + // Route-based sub-tabs navigate to a sub-path (e.g. /evm/integrations/lifi-earn) if (paramKey === "route") { - navigate(`${tool.route}/${subId}`); + navigate(`${familyToolRoute}/${subId}`); onOpenChange(false); return; } @@ -95,7 +127,7 @@ const MobileDrawer: React.FC = ({ open, onOpenChange }) => { const params = new URLSearchParams(); params.set(paramKey, subId); navigate( - { pathname: tool.route, search: `?${params.toString()}` }, + { pathname: familyToolRoute, search: `?${params.toString()}` }, { replace: true } ); onOpenChange(false); @@ -129,14 +161,19 @@ const MobileDrawer: React.FC = ({ open, onOpenChange }) => {
+ )} + + {form.mode === "ALCHEMY_KEY" && ( +
+ +
+ save({ alchemyKey: e.target.value })} + placeholder="Enter API key…" + className="flex-1" + /> + +
+
+ )} + + {form.mode === "TRITON_URL" && ( +
+
+ + setForm((p) => ({ ...p, tritonMainnet: e.target.value }))} + onBlur={(e) => validateAndSaveUrl("tritonMainnet", e.target.value)} + placeholder="https://your-triton-endpoint…" + className={cn("flex-1", urlError.tritonMainnet && "border-destructive")} + /> + {urlError.tritonMainnet && ( +

{urlError.tritonMainnet}

+ )} +
+
+ + setForm((p) => ({ ...p, tritonDevnet: e.target.value }))} + onBlur={(e) => validateAndSaveUrl("tritonDevnet", e.target.value)} + placeholder="https://your-triton-devnet-endpoint…" + className={cn("flex-1", urlError.tritonDevnet && "border-destructive")} + /> + {urlError.tritonDevnet && ( +

{urlError.tritonDevnet}

+ )} +
+
+ )} + + {form.mode === "CUSTOM_URL" && ( +
+
+ + setForm((p) => ({ ...p, customMainnet: e.target.value }))} + onBlur={(e) => validateAndSaveUrl("customMainnet", e.target.value)} + placeholder="https://your-solana-rpc.example.com" + className={cn("flex-1", urlError.customMainnet && "border-destructive")} + /> + {urlError.customMainnet && ( +

{urlError.customMainnet}

+ )} +
+
+ + setForm((p) => ({ ...p, customDevnet: e.target.value }))} + onBlur={(e) => validateAndSaveUrl("customDevnet", e.target.value)} + placeholder="https://your-solana-devnet-rpc.example.com" + className={cn("flex-1", urlError.customDevnet && "border-destructive")} + /> + {urlError.customDevnet && ( +

{urlError.customDevnet}

+ )} +
+

+ Custom URLs must be hosted on an origin allowed by the page CSP. +

+
+ )} + + ); +}; + +export default RpcSettingsSolanaPanel; diff --git a/src/components/RpcSettingsStarknetPanel.tsx b/src/components/RpcSettingsStarknetPanel.tsx new file mode 100644 index 0000000..0728c3c --- /dev/null +++ b/src/components/RpcSettingsStarknetPanel.tsx @@ -0,0 +1,201 @@ +import React, { useEffect, useState } from "react"; +import { + networkConfigManager, + isValidRpcUrl, + type StarknetRpcMode, + type StarknetNetwork, +} from "../config/networkConfig"; +import { Tabs, TabsList, TabsTrigger } from "./ui/tabs"; +import { Input } from "./ui/input"; +import { Label } from "./ui/label"; +import { Button } from "./ui/button"; +import { Eye, EyeSlash } from "@phosphor-icons/react"; +import { cn } from "@/lib/utils"; + +interface FormState { + mode: StarknetRpcMode; + alchemyKey: string; + infuraProjectId: string; + customUrlMainnet: string; + customUrlSepolia: string; +} + +export const RpcSettingsStarknetPanel: React.FC<{ isOpen: boolean }> = ({ + isOpen, +}) => { + const [form, setForm] = useState({ + mode: "CARTRIDGE_DEFAULT", + alchemyKey: "", + infuraProjectId: "", + customUrlMainnet: "", + customUrlSepolia: "", + }); + const [showAlchemy, setShowAlchemy] = useState(false); + const [showInfura, setShowInfura] = useState(false); + const [customError, setCustomError] = useState< + Partial> + >({}); + + useEffect(() => { + if (!isOpen) return; + const c = networkConfigManager.getConfig().starknet; + setForm({ + mode: c?.mode ?? "CARTRIDGE_DEFAULT", + alchemyKey: c?.alchemyKey ?? "", + infuraProjectId: c?.infuraProjectId ?? "", + customUrlMainnet: c?.customUrls?.mainnet ?? "", + customUrlSepolia: c?.customUrls?.sepolia ?? "", + }); + setCustomError({}); + }, [isOpen]); + + const save = (patch: Partial) => { + const next = { ...form, ...patch }; + setForm(next); + const customUrls: { mainnet?: string; sepolia?: string } = {}; + if (next.customUrlMainnet.trim()) customUrls.mainnet = next.customUrlMainnet.trim(); + if (next.customUrlSepolia.trim()) customUrls.sepolia = next.customUrlSepolia.trim(); + networkConfigManager.saveStarknetConfig({ + mode: next.mode, + alchemyKey: next.alchemyKey.trim() || undefined, + infuraProjectId: next.infuraProjectId.trim() || undefined, + customUrls, + }); + }; + + const validateAndSaveCustom = (network: StarknetNetwork, value: string) => { + const trimmed = value.trim(); + if (trimmed && !isValidRpcUrl(trimmed)) { + setCustomError((prev) => ({ ...prev, [network]: "Invalid RPC URL." })); + return; + } + setCustomError((prev) => ({ ...prev, [network]: undefined })); + save( + network === "mainnet" + ? { customUrlMainnet: trimmed } + : { customUrlSepolia: trimmed }, + ); + }; + + return ( +
+ save({ mode: v as StarknetRpcMode })}> + + + Cartridge + + + Alchemy + + + Infura + + + Custom + + + + + {form.mode === "CARTRIDGE_DEFAULT" && ( +

+ Using Cartridge's free public RPC. No configuration needed. +

+ )} + + {form.mode === "ALCHEMY_KEY" && ( +
+ +
+ save({ alchemyKey: e.target.value })} + placeholder="Enter API key…" + className="flex-1" + /> + +
+

+ Applies to both Starknet mainnet and Sepolia. +

+
+ )} + + {form.mode === "INFURA_KEY" && ( +
+ +
+ save({ infuraProjectId: e.target.value })} + placeholder="Enter Project ID…" + className="flex-1" + /> + +
+
+ )} + + {form.mode === "CUSTOM_URL" && ( +
+
+ + + setForm((p) => ({ ...p, customUrlMainnet: e.target.value })) + } + onBlur={(e) => validateAndSaveCustom("mainnet", e.target.value)} + placeholder="https://your-starknet-rpc.example.com" + className={cn("flex-1", customError.mainnet && "border-destructive")} + /> + {customError.mainnet && ( +

{customError.mainnet}

+ )} +
+
+ + + setForm((p) => ({ ...p, customUrlSepolia: e.target.value })) + } + onBlur={(e) => validateAndSaveCustom("sepolia", e.target.value)} + placeholder="https://your-starknet-sepolia-rpc.example.com" + className={cn("flex-1", customError.sepolia && "border-destructive")} + /> + {customError.sepolia && ( +

{customError.sepolia}

+ )} +
+

+ Custom URLs must be hosted on an origin allowed by the page CSP. +

+
+ )} +
+ ); +}; + +export default RpcSettingsStarknetPanel; diff --git a/src/components/SimulationHistoryPage.tsx b/src/components/SimulationHistoryPage.tsx index 25df900..5547c87 100644 --- a/src/components/SimulationHistoryPage.tsx +++ b/src/components/SimulationHistoryPage.tsx @@ -352,7 +352,7 @@ const SimulationHistoryPage: React.FC = () => { // Handle new simulation const handleNewSimulation = useCallback(() => { clearSimulation(); - navigate('/builder'); + navigate('/evm/builder'); }, [clearSimulation, navigate]); // Unique networks for filter dropdown diff --git a/src/components/SimulationResultsPage.tsx b/src/components/SimulationResultsPage.tsx index 0880d73..ddd5e19 100644 --- a/src/components/SimulationResultsPage.tsx +++ b/src/components/SimulationResultsPage.tsx @@ -69,7 +69,7 @@ const SimulationResultsPage: React.FC = (props) => { Simulations are stored in your browser's IndexedDB and may have been cleared.

-
+ +
= ({ )} - + + ); + })} + + ); +}; + +export default FamilySelector; diff --git a/src/components/shared/NetworkSelector.tsx b/src/components/shared/NetworkSelector.tsx index d1f96f7..8ea3384 100644 --- a/src/components/shared/NetworkSelector.tsx +++ b/src/components/shared/NetworkSelector.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from "react"; import { CaretDown, Globe, Check } from "@phosphor-icons/react"; import type { Chain } from "../../types"; -import ChainIcon, { type ChainKey } from "../icons/ChainIcon"; +import ChainIcon, { type ChainKey as ChainIconKey } from "../icons/ChainIcon"; import { CHAIN_REGISTRY, isTestnet } from "../../chains/registry"; import { Popover, @@ -12,8 +12,8 @@ import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; -// Map chain IDs to their ChainKey icon identifiers -const CHAIN_KEY_MAP: Record = { +// Map chain IDs to their icon identifiers +const CHAIN_ICON_KEY_MAP: Record = { 1: "ETH", 10: "OP", 137: "POLY", 8453: "BASE", 42161: "ARB", 56: "BSC", 100: "GNO", 1135: "LISK", 43114: "AVAX", // Testnets inherit parent chain icon @@ -30,7 +30,7 @@ export interface ExtendedChain extends Partial { isTestnet?: boolean; category?: "mainnet" | "testnet" | "local"; color?: string; - chainKey?: ChainKey; + iconKey?: ChainIconKey; } // Comprehensive network list derived from the unified chain registry. @@ -41,7 +41,7 @@ export const EXTENDED_NETWORKS: ExtendedChain[] = CHAIN_REGISTRY.map((chain) => blockExplorer: chain.blockExplorer || chain.explorerUrl, isTestnet: isTestnet(chain.id), category: isTestnet(chain.id) ? "testnet" as const : "mainnet" as const, - chainKey: CHAIN_KEY_MAP[chain.id], + iconKey: CHAIN_ICON_KEY_MAP[chain.id], })); export interface NetworkSelectorProps { @@ -92,7 +92,7 @@ const NetworkSelector: React.FC = ({ if (!network) { return ; } - return ; + return ; }; const handleSelectNetwork = (network: ExtendedChain) => { diff --git a/src/components/simple-grid/hooks/useSimulationState.tsx b/src/components/simple-grid/hooks/useSimulationState.tsx index 1f9d05c..9da3b03 100644 --- a/src/components/simple-grid/hooks/useSimulationState.tsx +++ b/src/components/simple-grid/hooks/useSimulationState.tsx @@ -172,12 +172,15 @@ export function useSimulationState(deps: UseSimulationStateDeps) { else if (isERC777) detectedTokenType = "ERC777"; else if (isERC4626) detectedTokenType = "ERC4626"; + const networkIdForCtx = selectedNetwork?.id || 1; const contractContextToSave = { + chainFamily: 'evm' as const, + chainKey: `evm:${networkIdForCtx}` as const, address: contractAddress || transaction.to || "", name: contractInfo?.name || contractName || undefined, abi: parsedAbi, abiSource: abiSource || undefined, - networkId: selectedNetwork?.id || 1, + networkId: networkIdForCtx, networkName: selectedNetwork?.name || "Ethereum", simulationOrigin: 'manual' as const, selectedFunction: selectedFunctionObj?.name || undefined, diff --git a/src/components/simple-grid/layout/ContractColumn.tsx b/src/components/simple-grid/layout/ContractColumn.tsx index f0f93e3..e65266a 100644 --- a/src/components/simple-grid/layout/ContractColumn.tsx +++ b/src/components/simple-grid/layout/ContractColumn.tsx @@ -61,7 +61,7 @@ export default function ContractColumn(): React.ReactElement { type="button" variant="icon-borderless" size="icon-inline" - onClick={() => navigate("/simulations")} + onClick={() => navigate("/evm/simulations")} title="Simulation History" aria-label="Simulation History" className="cursor-pointer opacity-50 hover:opacity-100 transition-opacity" diff --git a/src/components/simulation-results/useSimulationPageState.ts b/src/components/simulation-results/useSimulationPageState.ts index eeda6ff..dadcbaa 100644 --- a/src/components/simulation-results/useSimulationPageState.ts +++ b/src/components/simulation-results/useSimulationPageState.ts @@ -189,7 +189,7 @@ export function useSimulationPageState(props: SimulationResultsPageProps) { } } - navigate('/builder?mode=simulation&replay=txhash'); + navigate('/evm/builder?mode=simulation&replay=txhash'); }, [onReSimulate, navigate, result, contractContext, contextSimulationId, id]); const handleExportTestData = useCallback(() => { @@ -724,7 +724,7 @@ export function useSimulationPageState(props: SimulationResultsPageProps) { const handleBack = useCallback(() => { clearSimulation(); - navigate("/builder"); + navigate("/evm/builder"); }, [navigate, clearSimulation]); const handleToggleFilter = useCallback( diff --git a/src/components/smart-decoder/DecoderDialogs.tsx b/src/components/smart-decoder/DecoderDialogs.tsx index 5ca7d83..47f8a3f 100644 --- a/src/components/smart-decoder/DecoderDialogs.tsx +++ b/src/components/smart-decoder/DecoderDialogs.tsx @@ -27,6 +27,7 @@ import { type ExtendedChain, EXTENDED_NETWORKS } from '../shared/NetworkSelector import ContractAddressInput from '../contract/ContractAddressInput'; import type { Chain } from '../../types'; import { getChainById } from '../../utils/chains'; +import { toEvmChainKey } from '../../chains/types/evm'; import { ETHERSCAN_INSTANCES, BLOCKSCOUT_INSTANCES, type ContractConfirmationState } from './types'; import '../../styles/SignatureDatabase.css'; @@ -36,6 +37,8 @@ const extendedToChain = (ext: ExtendedChain): Chain => { if (registry) return registry; return { id: ext.id, + chainFamily: 'evm', + chainKey: toEvmChainKey(ext.id), name: ext.name, rpcUrl: ext.rpcUrl ?? '', explorerUrl: ext.blockExplorer, diff --git a/src/components/smart-decoder/useDecodeHandlers.ts b/src/components/smart-decoder/useDecodeHandlers.ts index bcdcd5d..471643c 100644 --- a/src/components/smart-decoder/useDecodeHandlers.ts +++ b/src/components/smart-decoder/useDecodeHandlers.ts @@ -12,6 +12,7 @@ import { parseFunctionSignatureParameters } from '../../utils/solidityTypes'; import { resolveContractContext, type ProxyInfo } from '../../utils/resolver'; import type { Chain } from '../../types'; import { getChainById } from '../../utils/chains'; +import { toEvmChainKey } from '../../chains/types/evm'; import type { ExtendedChain } from '../shared/NetworkSelector'; import type { @@ -336,7 +337,14 @@ export function useDecodeHandlers(deps: DecodeHandlersDeps) { if (lookupMode === 'single' && selectedLookupNetwork) { addDecodingStep(' Resolving contract (ABI + proxy detection)...'); const resolvedChain = getChainById(selectedLookupNetwork.id); - const chain: Chain = resolvedChain || { id: selectedLookupNetwork.id, name: selectedLookupNetwork.name, rpcUrl: '', nativeCurrency: { name: 'ETH', symbol: 'ETH', decimals: 18 } }; + const chain: Chain = resolvedChain || { + id: selectedLookupNetwork.id, + chainFamily: 'evm', + chainKey: toEvmChainKey(selectedLookupNetwork.id), + name: selectedLookupNetwork.name, + rpcUrl: '', + nativeCurrency: { name: 'ETH', symbol: 'ETH', decimals: 18 }, + }; const ctx = await resolveContractContext(contractAddress.trim(), chain, { abi: true, proxy: true, onProgress: (step, detail) => { addDecodingStep(` ${step}${detail ? ` (${detail})` : ''}`); } }); if (ctx.proxyInfo?.isProxy) { setProxyInfo(ctx.proxyInfo); diff --git a/src/components/transaction-builder/TransactionReplayView.tsx b/src/components/transaction-builder/TransactionReplayView.tsx index 2a22ad9..c0febce 100644 --- a/src/components/transaction-builder/TransactionReplayView.tsx +++ b/src/components/transaction-builder/TransactionReplayView.tsx @@ -425,10 +425,13 @@ export const TransactionReplayView: React.FC<{ }; const calldata = simulation.data; + const networkIdForCtx = selectedNetwork?.id || 1; const contractContext = { + chainFamily: 'evm' as const, + chainKey: `evm:${networkIdForCtx}` as const, address: simulation.to || "", abi: null as any[] | null, - networkId: selectedNetwork?.id || 1, + networkId: networkIdForCtx, networkName: selectedNetwork?.name || "Unknown", simulationOrigin: 'tx-hash-replay' as const, replayTxHash: trimmedHash, diff --git a/src/components/transaction-builder/types.ts b/src/components/transaction-builder/types.ts index 3a89116..9afcee6 100644 --- a/src/components/transaction-builder/types.ts +++ b/src/components/transaction-builder/types.ts @@ -1,6 +1,7 @@ import React from "react"; import { EXTENDED_NETWORKS, type ExtendedChain } from "../shared/NetworkSelector"; import { SUPPORTED_CHAINS } from "../../utils/chains"; +import { toEvmChainKey } from "../../chains/types/evm"; import type { Chain } from "../../types"; import type { SimulationCallNode } from "../../utils/simulationArtifacts"; @@ -106,6 +107,8 @@ export const mapExtendedToChain = (network: ExtendedChain): Chain => { if (supported) return supported; return { id: network.id, + chainFamily: "evm", + chainKey: toEvmChainKey(network.id), name: network.name, rpcUrl: network.rpcUrl ?? "", explorerUrl: network.blockExplorer, diff --git a/src/components/wallet/GlobalWalletPicker.tsx b/src/components/wallet/GlobalWalletPicker.tsx new file mode 100644 index 0000000..e9fb50e --- /dev/null +++ b/src/components/wallet/GlobalWalletPicker.tsx @@ -0,0 +1,147 @@ +/** + * Global wallet picker rendered in the TopBar. Reads manager state only β€” + * imports zero family SDKs. Clicking "Connect " delegates to + * `manager.connect(family)`, which activates that family's provider (lazy + * mount) and asks its bridge to open the SDK-specific picker UI. + */ +import { useState, useRef, useEffect } from "react"; +import { Wallet } from "@phosphor-icons/react"; +import { Button } from "../ui/button"; +import { + useWalletManager, + type FamilyConnection, +} from "@/contexts/WalletManager"; +import type { ChainFamily } from "@/chains/types"; +import { CHAIN_MARKS } from "../shared/ChainMarks"; +import { cn } from "@/lib/utils"; + +// Picker uses short "EVM" rather than "Ethereum" to keep rows compact. +const FAMILY_LABELS: Record = { + evm: "EVM", + starknet: "Starknet", + svm: "Solana", +}; + +const FAMILY_ORDER: ChainFamily[] = ["evm", "starknet", "svm"]; + +function truncate(address: string): string { + if (address.length <= 12) return address; + return `${address.slice(0, 6)}…${address.slice(-4)}`; +} + +function connectedCount( + connections: Record, +): number { + return FAMILY_ORDER.reduce( + (n, f) => n + (connections[f] ? 1 : 0), + 0, + ); +} + +export function GlobalWalletPicker({ className }: { className?: string }) { + const { connections, connect, disconnect } = useWalletManager(); + const [open, setOpen] = useState(false); + const wrapRef = useRef(null); + + useEffect(() => { + if (!open) return; + const onDocClick = (e: MouseEvent) => { + if (!wrapRef.current) return; + if (!wrapRef.current.contains(e.target as Node)) setOpen(false); + }; + document.addEventListener("mousedown", onDocClick); + return () => document.removeEventListener("mousedown", onDocClick); + }, [open]); + + const total = connectedCount(connections); + + return ( +
+ + + {open && ( +
+
+ Wallets +
+
    + {FAMILY_ORDER.map((family) => { + const conn = connections[family]; + const Icon = CHAIN_MARKS[family]; + return ( +
  • +
    + + + +
    + + {FAMILY_LABELS[family]} + + {conn ? ( + + {truncate(conn.address)} + {conn.connectorName ? ` Β· ${conn.connectorName}` : ""} + + ) : ( + + Not connected + + )} +
    +
    + {conn ? ( + + ) : ( + + )} +
  • + ); + })} +
+
+ Connect multiple at once β€” tools use the matching chain's wallet. +
+
+ )} +
+ ); +} + +export default GlobalWalletPicker; diff --git a/src/components/wallet/SolanaWalletConnect.tsx b/src/components/wallet/SolanaWalletConnect.tsx new file mode 100644 index 0000000..736bd19 --- /dev/null +++ b/src/components/wallet/SolanaWalletConnect.tsx @@ -0,0 +1,23 @@ +import React from "react"; +import { WalletMultiButton } from "@solana/wallet-adapter-react-ui"; +import { cn } from "@/lib/utils"; + +export const SolanaWalletConnect: React.FC<{ className?: string }> = ({ className }) => { + return ( +
+ +
+ ); +}; + +export default SolanaWalletConnect; diff --git a/src/components/wallet/bridges/EvmBridge.tsx b/src/components/wallet/bridges/EvmBridge.tsx new file mode 100644 index 0000000..4e57210 --- /dev/null +++ b/src/components/wallet/bridges/EvmBridge.tsx @@ -0,0 +1,41 @@ +/** + * Mounted inside . Reads wagmi + RainbowKit state and + * forwards it to the WalletManager. Registers imperative handles so the + * top-bar picker can open the RainbowKit modal and disconnect. + */ +import { useEffect } from "react"; +import { useAccount, useDisconnect } from "wagmi"; +import { useConnectModal } from "@rainbow-me/rainbowkit"; +import { useWalletManager } from "@/contexts/WalletManager"; + +export function EvmBridge() { + const manager = useWalletManager(); + const { address, chainId, connector, isConnected } = useAccount(); + const { disconnect } = useDisconnect(); + const { openConnectModal } = useConnectModal(); + + useEffect(() => { + manager.registerBridge("evm", { + openPicker: () => openConnectModal?.(), + disconnect: () => disconnect(), + }); + return () => manager.unregisterBridge("evm"); + }, [manager, openConnectModal, disconnect]); + + useEffect(() => { + if (isConnected && address) { + manager.updateConnection("evm", { + address, + chainId: chainId ?? null, + connectorId: connector?.id ?? null, + connectorName: connector?.name ?? null, + }); + } else { + manager.updateConnection("evm", null); + } + }, [manager, isConnected, address, chainId, connector]); + + return null; +} + +export default EvmBridge; diff --git a/src/components/wallet/bridges/SolanaBridge.tsx b/src/components/wallet/bridges/SolanaBridge.tsx new file mode 100644 index 0000000..6baf311 --- /dev/null +++ b/src/components/wallet/bridges/SolanaBridge.tsx @@ -0,0 +1,42 @@ +/** + * Mounted inside . Reads @solana/wallet-adapter-react + * state and forwards it to the WalletManager. Uses the wallet-adapter-react- + * ui modal for picker UX β€” the bridge only toggles visibility. + */ +import { useEffect } from "react"; +import { useWallet } from "@solana/wallet-adapter-react"; +import { useWalletModal } from "@solana/wallet-adapter-react-ui"; +import { useWalletManager } from "@/contexts/WalletManager"; + +export function SolanaBridge() { + const manager = useWalletManager(); + const { publicKey, connected, wallet, disconnect } = useWallet(); + const { setVisible } = useWalletModal(); + + useEffect(() => { + manager.registerBridge("svm", { + openPicker: () => setVisible(true), + disconnect: () => { + void disconnect(); + }, + }); + return () => manager.unregisterBridge("svm"); + }, [manager, setVisible, disconnect]); + + useEffect(() => { + if (connected && publicKey) { + manager.updateConnection("svm", { + address: publicKey.toBase58(), + chainId: null, + connectorId: wallet?.adapter.name ?? null, + connectorName: wallet?.adapter.name ?? null, + }); + } else { + manager.updateConnection("svm", null); + } + }, [manager, connected, publicKey, wallet]); + + return null; +} + +export default SolanaBridge; diff --git a/src/components/wallet/bridges/StarknetBridge.tsx b/src/components/wallet/bridges/StarknetBridge.tsx new file mode 100644 index 0000000..fa38a35 --- /dev/null +++ b/src/components/wallet/bridges/StarknetBridge.tsx @@ -0,0 +1,206 @@ +/** + * Starknet bridge β€” subscribes to the Starkzap client and forwards state to + * the WalletManager. Owns the picker modal for Argent X / Braavos / + * Cartridge. Pattern follows market-zap (onlyoneAlexia/market-zap). + */ +import { useCallback, useEffect, useRef, useState } from "react"; +import { X, Warning } from "@phosphor-icons/react"; +import { + getStarkzapClient, + type StarknetProviderId, +} from "@/chains/starknet/starkzapClient"; +import { useWalletManager } from "@/contexts/WalletManager"; +import { useNetworkConfig } from "@/contexts/NetworkConfigContext"; +import { ARGENT_X_LOGO, BRAAVOS_LOGO, CARTRIDGE_LOGO } from "./starknetLogos"; + +const PROVIDERS: { + id: StarknetProviderId; + label: string; + description: string; + logo: string; + bg: string; +}[] = [ + { + id: "argentX", + label: "Argent X", + description: "Browser extension", + logo: ARGENT_X_LOGO, + bg: "#000", + }, + { + id: "braavos", + label: "Braavos", + description: "Browser extension", + logo: BRAAVOS_LOGO, + bg: "#0a0a0c", + }, + { + id: "cartridge", + label: "Cartridge", + description: "Social login Β· Google, passkeys, Discord", + logo: CARTRIDGE_LOGO, + bg: "#0a0a0c", + }, +]; + +export function StarknetBridge() { + const manager = useWalletManager(); + const client = getStarkzapClient(); + const { resolveStarknetRpc } = useNetworkConfig(); + const [pickerOpen, setPickerOpen] = useState(false); + const [busy, setBusy] = useState(null); + const [error, setError] = useState(null); + + // Reset the Starkzap client when the resolved RPC URL changes (user + // switched provider in Settings). Keyed off URL, not configVersion, to + // avoid thrashing on every keystroke while the user types a key. + const lastUrlRef = useRef(client.currentRpcUrl()); + const currentUrl = resolveStarknetRpc("mainnet").url; + useEffect(() => { + if (currentUrl !== lastUrlRef.current) { + lastUrlRef.current = currentUrl; + void client.reset(); + } + }, [currentUrl, client]); + + useEffect(() => { + return client.subscribe((s) => { + if (s.address && s.provider) { + const entry = PROVIDERS.find((p) => p.id === s.provider); + manager.updateConnection("starknet", { + address: s.address, + chainId: s.network, + connectorId: s.provider, + connectorName: entry?.label ?? s.provider, + }); + } else { + manager.updateConnection("starknet", null); + } + }); + }, [client, manager]); + + useEffect(() => { + manager.registerBridge("starknet", { + openPicker: () => { + setError(null); + setPickerOpen(true); + }, + disconnect: () => { + void client.disconnect(); + }, + }); + return () => manager.unregisterBridge("starknet"); + }, [manager, client]); + + const handleSelect = useCallback( + async (id: StarknetProviderId) => { + setBusy(id); + setError(null); + try { + if (id === "cartridge") { + await client.connectCartridge(); + } else { + await client.connectBrowserWallet(id); + } + setPickerOpen(false); + } catch (err) { + setError(err instanceof Error ? err.message : "Connection failed"); + } finally { + setBusy(null); + } + }, + [client], + ); + + if (!pickerOpen) return null; + + return ( +
!busy && setPickerOpen(false)} + data-testid="starknet-picker" + > +
e.stopPropagation()} + > +
+
+
Connect a Starknet wallet
+
+ Powered by Starkzap +
+
+ +
+ +
+ +
    + {PROVIDERS.map(({ id, label, description, logo, bg }) => { + const isBusy = busy === id; + return ( +
  • + +
  • + ); + })} +
+ + {error && ( +
+ + {error} +
+ )} + +
+ By connecting you agree to the wallet provider's terms. +
+
+
+ ); +} + +export default StarknetBridge; diff --git a/src/components/wallet/bridges/starknetLogos.ts b/src/components/wallet/bridges/starknetLogos.ts new file mode 100644 index 0000000..8eab491 --- /dev/null +++ b/src/components/wallet/bridges/starknetLogos.ts @@ -0,0 +1,21 @@ +/** + * Official wallet brand marks as data URIs. Inlining keeps the picker a + * single lazy chunk β€” no extra asset requests. + * + * - Argent X: from starknetkit@3.4.3 (y.argentX.dark in + * dist/index-40f0fb49.js). 40x40 black-filled rounded square + * with the white A glyph + sparkle. + * - Braavos: from starknetkit@3.4.3 (y.braavos.dark). 500x500 yellow + * gradient mountain β€” transparent bg. + * - Cartridge: from starknetkit@3.4.3 (ControllerConnector). 800x800 + * dark-gray cartridge body (#191A1A) with amber (#FBCB4A) + * detail β€” the canonical Cartridge Controller mark. + */ +export const ARGENT_X_LOGO = + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTIzLjgxMyA1Ljk2NjFIMTYuMTE5MUMxNS44NjIgNS45NjYxIDE1LjY1NiA2LjE4NTMzIDE1LjY1MDQgNi40NTc4MkMxNS40OTQ5IDE0LjExNzQgMTEuNzE0NyAyMS4zODcyIDUuMjA4MTcgMjYuNTM2NUM1LjAwMTYgMjYuNjk5OCA0Ljk1NDU0IDI3LjAwNyA1LjEwNTU2IDI3LjIyODJMOS42MDcxNSAzMy44MjY1QzkuNzYwMjkgMzQuMDUxMSAxMC4wNTg3IDM0LjEwMTcgMTAuMjY4NyAzMy45MzY4QzE0LjMzNzEgMzAuNzM4MSAxNy42MDk1IDI2Ljg3OTUgMTkuOTY2MSAyMi42MDI1QzIyLjMyMjYgMjYuODc5NSAyNS41OTUyIDMwLjczODEgMjkuNjYzNiAzMy45MzY4QzI5Ljg3MzQgMzQuMTAxNyAzMC4xNzE4IDM0LjA1MTEgMzAuMzI1MiAzMy44MjY1TDM0LjgyNjggMjcuMjI4MkMzNC45Nzc2IDI3LjAwNyAzNC45MzA1IDI2LjY5OTggMzQuNzI0MSAyNi41MzY1QzI4LjIxNzQgMjEuMzg3MiAyNC40MzcyIDE0LjExNzQgMjQuMjgxOSA2LjQ1NzgyQzI0LjI3NjMgNi4xODUzMyAyNC4wNzAxIDUuOTY2MSAyMy44MTMgNS45NjYxWiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTM0LjU4OTQgMTAuNzg2NEwzMy43NjI4IDguMjE1ODFDMzMuNTk0NyA3LjY5Mzk1IDMzLjE4NTIgNy4yODc0NCAzMi42NjQgNy4xMjY3MkwzMC4wOTgxIDYuMzMyNTlDMjkuNzQ0IDYuMjIyOTEgMjkuNzQwMiA1LjcxOTAyIDMwLjA5MzQgNS42MDQ2M0wzMi42NDYxIDQuNzcyNjdDMzMuMTY0NiA0LjYwMzQ1IDMzLjU2OTQgNC4xOTAzMiAzMy43MjkxIDMuNjY2NTZMMzQuNTE3IDEuMDgzNzJDMzQuNjI2IDAuNzI2MzYgMzUuMTI2NiAwLjcyMjU3MSAzNS4yNDEyIDEuMDc4MDZMMzYuMDY3NyAzLjY0ODU4QzM2LjIzNTggNC4xNzA0NSAzNi42NDUzIDQuNTc2OTggMzcuMTY2NSA0LjczODY0TDM5LjczMjQgNS41MzE4M0M0MC4wODY1IDUuNjQxNSA0MC4wOTAzIDYuMTQ1NCAzOS43MzcyIDYuMjYwNzRMMzcuMTg0NCA3LjA5MjY5QzM2LjY2NTkgNy4yNjA5NiAzNi4yNjExIDcuNjc0MSAzNi4xMDE1IDguMTk4ODFMMzUuMzEzNSAxMC43ODA3QzM1LjIwNDUgMTEuMTM4MSAzNC43MDM5IDExLjE0MTggMzQuNTg5NCAxMC43ODY0WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg=="; + +export const BRAAVOS_LOGO = + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAwIiBoZWlnaHQ9IjUwMCIgdmlld0JveD0iMCAwIDUwMCA1MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik0zMjMuNDQgNDEuMzg4NkMzMjQuMTk4IDQyLjY3MjggMzIzLjE5NSA0NC4yNjAzIDMyMS43MDQgNDQuMjYwM0MyOTEuNTEgNDQuMjYwMyAyNjYuOTY1IDY4LjE2NTYgMjY2LjM4OSA5Ny44NzFDMjU2LjA1IDk1Ljk0MDcgMjQ1LjMzNyA5NS43OTU2IDIzNC43NTQgOTcuNTc4N0MyMzQuMDIzIDY4LjAwOSAyMDkuNTQgNDQuMjYwMyAxNzkuNDQ1IDQ0LjI2MDNDMTc3Ljk1MyA0NC4yNjAzIDE3Ni45NDkgNDIuNjcxNiAxNzcuNzA3IDQxLjM4NjVDMTkyLjMyMyAxNi42MzMgMjE5LjQ4MyAwIDI1MC41NzMgMEMyODEuNjY0IDAgMzA4LjgyNCAxNi42MzM5IDMyMy40NCA0MS4zODg2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzIzMjRfNjE4NjkpIi8+CjxwYXRoIGQ9Ik00MTguNzU2IDIyNi44OTRDNDI2LjM3IDIyOS4yIDQzMy41ODEgMjIyLjUxNyA0MzEuMDM2IDIxNC45NzlDNDA0LjUwNyAxMzYuNDAxIDMxNi41MzUgMTA0LjM1OCAyNTAuMTU5IDEwNC4zNThDMTgzLjY3NCAxMDQuMzU4IDkzLjczOTEgMTM3LjQxOCA2OS4zMDUxIDIxNS4zMzFDNjYuOTU3NCAyMjIuODE4IDc0LjE0NjUgMjI5LjI3NSA4MS42NDc5IDIyNi45NzdMMjQ0LjI1IDE3Ny4xNTFDMjQ3LjU2OSAxNzYuMTM0IDI1MS4xMTYgMTc2LjEyOCAyNTQuNDM5IDE3Ny4xMzVMNDE4Ljc1NiAyMjYuODk0WiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzIzMjRfNjE4NjkpIi8+CjxwYXRoIGQ9Ik02OS43MTY1IDIzOS40MjZMMjQ0LjM3IDE4Ni40NTZDMjQ3LjY2OSAxODUuNDU2IDI1MS4xOTEgMTg1LjQ1MyAyNTQuNDkyIDE4Ni40NDhMNDMwLjIzMiAyMzkuNDUyQzQ0NC43NiAyNDMuODMzIDQ1NC43MDEgMjU3LjIxNiA0NTQuNzAxIDI3Mi4zOVY0MzAuNDgxQzQ1NC4wMjggNDY5LjA3IDQxOS4zNjIgNTAwIDM4MC43ODYgNTAwSDMxNi43MTJDMzEwLjM3OSA1MDAgMzA1LjI1IDQ5NC44NzcgMzA1LjI1IDQ4OC41NDNWNDMzLjExNUMzMDUuMjUgNDExLjI4OSAzMTguMTY3IDM5MS41MzUgMzM4LjE1NSAzODIuNzkyQzM2NC45NDkgMzcxLjA3MSAzOTYuNjQ2IDM1NS4yMTggNDAyLjYwOCAzMjMuNDA2QzQwNC41MzIgMzEzLjEzOCAzOTcuODM3IDMwMy4yMzQgMzg3LjU5NSAzMDEuMTk4QzM2MS42OTkgMjk2LjA1MSAzMzIuOTg5IDI5OC4wMzkgMzA4LjcxMSAzMDguODk4QzI4MS4xNSAzMjEuMjI1IDI3My45NCAzNDEuNzMxIDI3MS4yNzEgMzY5LjI3TDI2OC4wMzYgMzk4LjkzOEMyNjcuMDQ3IDQwOC4wMDUgMjU4LjU0NiA0MTQuOTUyIDI0OS40MjkgNDE0Ljk1MkMyMzkuOTk4IDQxNC45NTIgMjMyLjkyNiA0MDcuNzY5IDIzMS45MDMgMzk4LjM4OEwyMjguNzI4IDM2OS4yN0MyMjYuNDQyIDM0NS42ODEgMjIyLjI5OCAzMjIuNzY3IDE5Ny45MTIgMzExLjg2QzE3MC4wOTUgMjk5LjQxOSAxNDIuMTQxIDI5NS4yODcgMTEyLjQwNCAzMDEuMTk4QzEwMi4xNjIgMzAzLjIzNCA5NS40NjcgMzEzLjEzOCA5Ny4zOTEzIDMyMy40MDZDMTAzLjQwNSAzNTUuNDk1IDEzNC44NTQgMzcwLjk4NSAxNjEuODQ0IDM4Mi43OTJDMTgxLjgzMyAzOTEuNTM1IDE5NC43NSA0MTEuMjg5IDE5NC43NSA0MzMuMTE1VjQ4OC41MzNDMTk0Ljc1IDQ5NC44NjcgMTg5LjYyMiA1MDAgMTgzLjI4OSA1MDBIMTE5LjIxNEM4MC42Mzc0IDUwMCA0NS45NzE2IDQ2OS4wNyA0NS4yOTc5IDQzMC40ODFWMjcyLjM0OUM0NS4yOTc5IDI1Ny4xOTQgNTUuMjE0MiAyNDMuODI0IDY5LjcxNjUgMjM5LjQyNloiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcl8yMzI0XzYxODY5KSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzIzMjRfNjE4NjkiIHgxPSIyNDUuOTg2IiB5MT0iLTI3IiB4Mj0iNDI1LjQ5NiIgeTI9IjUwMi4zNzYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iI0Y1RDQ1RSIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRjk2MDAiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDFfbGluZWFyXzIzMjRfNjE4NjkiIHgxPSIyNDUuOTg2IiB5MT0iLTI3IiB4Mj0iNDI1LjQ5NiIgeTI9IjUwMi4zNzYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iI0Y1RDQ1RSIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRjk2MDAiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDJfbGluZWFyXzIzMjRfNjE4NjkiIHgxPSIyNDUuOTg2IiB5MT0iLTI3IiB4Mj0iNDI1LjQ5NiIgeTI9IjUwMi4zNzYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iI0Y1RDQ1RSIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRjk2MDAiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4="; + +export const CARTRIDGE_LOGO = + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAwIiBoZWlnaHQ9IjgwMCIgdmlld0JveD0iMCAwIDgwMCA4MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik00NjkuMjM2IDcwQzQ4Mi4zOSA3MCA0OTMuMDUzIDgwLjY2MyA0OTMuMDUzIDkzLjgxNjRWMTQ3LjE0N0g1MTUuMzM4QzUzNS4zNjMgMTQ3LjE0NyA1NTguNTU2IDE1My43OCA1NzIuOTE4IDE2MC42MDNMNzMwLjQyIDIyNi42NzFDNzcxLjc4NyAyNDcuMTc3IDc4OS45OTMgMjg2LjI5NiA3ODkuOTkzIDMyMi4wMzZWNTg1Ljg2NUM3OTAuMDM4IDU5Ny4wOTYgNzkwLjE2MSA2MjYuOTk2IDc2NC4yMzEgNjUyLjgyM0w3MTQuNzYgNzAyLjA5NUM3MDQuNjAxIDcxMi4yNzUgNjkyLjEyMyA3MjAuNjUyIDY3Ni4yODQgNzI0Ljg3OUM2NjQuMzkgNzI4LjA1NCA2NDcuNzUyIDcyNy45MjkgNjQ3Ljc1MiA3MjcuOTI5SDQ4MC43MjFDNDc0LjA5NCA3MjcuOTI5IDQ2OC43MjEgNzIyLjU1NiA0NjguNzIxIDcxNS45MjlWNjY4LjM4OEgzMjguNTg2QzMyOC41NTcgNzIyLjU2OSAzMjMuMTg2IDcyNy45MjkgMzE2LjU2MSA3MjcuOTI5SDE1Mi4yNDZDMTQ3LjE3MiA3MjcuOTY2IDEyMy43MTQgNzI0Ljg3OSAxMjMuNzE0IDcyNC44NzlDMTA3Ljg3MyA3MjAuNjUxIDk1LjM5MzggNzEyLjI3MiA4NS4zNTI5IDcwMi4yMUwzNS42NyA2NTIuNzI1QzkuODYyNDIgNjI2Ljc4IDEwLjAwNTUgNTk3LjE4NSAxMC4wMDU1IDU4NS44NjVWMzIyLjAzNkMxMC4wMDU1IDI4Ni40MyAyOC4xNjYyIDI0Ny4xOTkgNjcuODk3NyAyMjcuNTA1TDIyNy4wODEgMTYwLjYwM0MyNDEuNDQzIDE1My43OCAyNjQuNjM2IDE0OC45NjkgMjg0LjY2IDE0Ny4xNDdIMzA2Ljk0MlY5My44MTY0QzMwNi45NDIgODAuNjYzIDMxNy42MDUgNzAgMzMwLjc1OCA3MEg0NjkuMjM2WiIgZmlsbD0iIzE5MUExQSIvPgo8cGF0aCBkPSJNMzY2LjQ4MyAxMjkuNTRINDMzLjUxMlYyMDYuNjg3SDM2Ni40ODNWMTI5LjU0WiIgZmlsbD0iI0ZCQ0I0QSIvPgo8cGF0aCBkPSJNMjY5LjAxIDYwMi40MjlIMTQ0LjAwOEMxMzUuNzY4IDYwMi40MjkgMTM1Ljc2OCA1OTQuMTQ2IDEzNS43NjggNTk0LjE0NlYyODAuODVDMTM1Ljc2OCAyNzIuNjQ0IDE0NC4wMDggMjcyLjY0NCAxNDQuMDA4IDI3Mi42NDRIMzY2LjQ4M1YyMDYuNjg3SDI4NC42OUMyNjguMTM0IDIwNi42ODcgMjUxLjU3OSAyMTQuODkzIDI1MS41NzkgMjE0Ljg5M0w5NC4zNDE0IDI4MC44NUM3Ny43ODYxIDI4OS4wNTcgNjkuNTQ2OSAzMDUuNjIzIDY5LjU0NjkgMzIyLjAzNVY1ODUuODYzQzY5LjU0NjkgNTk0LjE0NyA3Ny43ODYxIDYxMC42MzYgNzcuNzg2MSA2MTAuNjM2TDEyNy40NTIgNjYwLjEwNEMxMzUuNjkxIDY2OC4zODcgMTUyLjI0NyA2NjguMzg3IDE1Mi4yNDcgNjY4LjM4N0gyNjkuMDI5QzI2OS4wNDYgNjI0LjY1NSAyNjkuMDU0IDYwMi44ODcgMjY5LjA1NCA2MDIuODg3SDUyOC4wMTNWNjY4LjM4N0g2NDcuNzUzQzY2NC4zMDggNjY4LjM4NyA2NzIuNTQ3IDY2MC4xMDQgNjcyLjU0NyA2NjAuMTA0TDcyMi4yMTMgNjEwLjYzNkM3MzAuNDUzIDYwMi40MjkgNzMwLjQ1MyA1ODUuODYzIDczMC40NTMgNTg1Ljg2M1YzMjIuMDM1QzczMC40NTMgMzA1LjU0NiA3MDUuNjU4IDI4MC44NSA3MDUuNjU4IDI4MC44NUw1NDguNDIxIDIxNC44OTNDNTMxLjg2NSAyMDYuNjg3IDUxNS4zMSAyMDYuNjg3IDUxNS4zMSAyMDYuNjg3SDQzMy41MTJWMjcyLjY0NEg2NTYuMDY5QzY2NC4zMDggMjcyLjY0NCA2NjQuMzA4IDI4MC44NSA2NjQuMzA4IDI4MC44NVY1OTQuMTQ2QzY2NC4zMDggNjAyLjQyOSA2NTYuMDY5IDYwMi40MjkgNjU2LjA2OSA2MDIuNDI5SDUyOC4yNjJWNTM3LjM5NkgyNjkuMDc1QzI2OS4wMTcgNTk2LjkxMiAyNjkuMDEgNjAyLjQyOSAyNjkuMDEgNjAyLjQyOVoiIGZpbGw9IiNGQkNCNEEiLz4KPHBhdGggZD0iTTI2OS4wMDkgNDM2LjE3Mkg1MjguMjYyVjM3MC42ODFIMjY5LjA3NVYzNzcuMzczQzI2OS4wMDkgNDM2Ljc4OCAyNjkuMDA5IDQzNi4xNzIgMjY5LjAwOSA0MzYuMTcyWiIgZmlsbD0iI0ZCQ0I0QSIvPgo8L3N2Zz4="; diff --git a/src/config/networkConfig.ts b/src/config/networkConfig.ts index 117654d..4652639 100644 --- a/src/config/networkConfig.ts +++ b/src/config/networkConfig.ts @@ -17,6 +17,39 @@ export type ExplorerKeyMode = 'default' | 'personal'; export type AbiSourceType = 'sourcify' | 'etherscan' | 'blockscout'; +// ── Non-EVM families ────────────────────────────────────────────────────── + +export type StarknetNetwork = 'mainnet' | 'sepolia'; +export type SolanaCluster = 'mainnet-beta' | 'devnet'; + +export type StarknetRpcMode = + | 'CARTRIDGE_DEFAULT' + | 'ALCHEMY_KEY' + | 'INFURA_KEY' + | 'CUSTOM_URL'; + +export type SolanaRpcMode = + | 'PUBLIC_DEFAULT' + | 'HELIUS_KEY' + | 'TRITON_URL' + | 'ALCHEMY_KEY' + | 'CUSTOM_URL'; + +export interface StarknetRpcConfig { + mode: StarknetRpcMode; + alchemyKey?: string; + infuraProjectId?: string; + customUrls?: Partial>; +} + +export interface SolanaRpcConfig { + mode: SolanaRpcMode; + heliusKey?: string; + alchemyKey?: string; + tritonUrls?: Partial>; + customUrls?: Partial>; +} + interface ChainOverride { customRpcUrl?: string; etherscanApiKey?: string; @@ -44,6 +77,10 @@ export interface NetworkConfig { // Per-chain overrides (optional) chainOverrides?: Record; + // Non-EVM RPC config + starknet?: StarknetRpcConfig; + solana?: SolanaRpcConfig; + // Version for future migrations version: number; } @@ -55,14 +92,31 @@ export interface RpcResolution { note?: string; } +export interface StarknetRpcResolution { + url: string; + source: 'cartridge' | 'alchemy' | 'infura' | 'custom'; + isDefault: boolean; + note?: string; +} + +export interface SolanaRpcResolution { + url: string; + source: 'public' | 'helius' | 'triton' | 'alchemy' | 'custom'; + isDefault: boolean; + note?: string; +} + const STORAGE_KEY = 'web3-toolkit:network-config'; const LOCAL_SECRETS_KEY = 'web3-toolkit:secrets'; const SESSION_SECRETS_KEY = 'web3-toolkit:session-secrets'; const LEGACY_SESSION_SECRETS_KEY = 'web3-toolkit:secrets'; -const CONFIG_VERSION = 3; +const CONFIG_VERSION = 4; const DEFAULT_SOURCE_PRIORITY: AbiSourceType[] = ['etherscan', 'sourcify', 'blockscout']; const LEGACY_SOURCE_PRIORITY: AbiSourceType[] = ['sourcify', 'etherscan', 'blockscout']; +const DEFAULT_STARKNET_RPC: StarknetRpcConfig = { mode: 'CARTRIDGE_DEFAULT' }; +const DEFAULT_SOLANA_RPC: SolanaRpcConfig = { mode: 'PUBLIC_DEFAULT' }; + // Old storage keys for migration const OLD_RPC_SETTINGS_KEY = 'web3-toolkit:user-rpc-settings'; const OLD_UNIVERSAL_API_KEYS_KEY = 'web3-toolkit-universal-api-keys'; @@ -76,12 +130,21 @@ const SECRET_FIELDS = [ ] as const; type SecretField = (typeof SECRET_FIELDS)[number]; +// Nested secret paths for non-EVM family RPC configs β€” kept separate from +// SECRET_FIELDS because the shape is a subtree, not a flat field. +interface NestedSecrets { + starknet?: Partial>; + solana?: Partial>; +} + const DEFAULT_CONFIG: NetworkConfig = { rpcMode: 'DEFAULT', etherscanKeyMode: 'default', rememberPersonalEtherscanKey: false, sourcePriority: DEFAULT_SOURCE_PRIORITY, allowPublicRpcFallback: false, + starknet: { ...DEFAULT_STARKNET_RPC }, + solana: { ...DEFAULT_SOLANA_RPC }, version: CONFIG_VERSION, }; @@ -104,22 +167,28 @@ function migrateConfigShape(config: NetworkConfig): NetworkConfig { if (!config.sourcePriority || matchesSourcePriority(config.sourcePriority, LEGACY_SOURCE_PRIORITY)) { migrated.sourcePriority = [...DEFAULT_SOURCE_PRIORITY]; } + if (!migrated.starknet) { + migrated.starknet = { ...DEFAULT_STARKNET_RPC }; + } + if (!migrated.solana) { + migrated.solana = { ...DEFAULT_SOLANA_RPC }; + } return migrated; } -function parseStoredSecrets( - raw: string | null -): Partial> { +type StoredSecrets = Partial> & NestedSecrets; + +function parseStoredSecrets(raw: string | null): StoredSecrets { if (!raw) { return {}; } try { - return JSON.parse(raw) as Partial>; + return JSON.parse(raw) as StoredSecrets; } catch { try { const decoded = decodeURIComponent(escape(atob(raw))); - return JSON.parse(decoded) as Partial>; + return JSON.parse(decoded) as StoredSecrets; } catch { return {}; } @@ -129,7 +198,7 @@ function parseStoredSecrets( function readSecretsFromStorage( storage: Storage | undefined, storageKey: string -): Partial> { +): StoredSecrets { if (!storage) { return {}; } @@ -144,7 +213,7 @@ function readSecretsFromStorage( function writeSecretsToStorage( storage: Storage | undefined, storageKey: string, - secrets: Partial> + secrets: StoredSecrets ): void { if (!storage) { return; @@ -163,14 +232,14 @@ function writeSecretsToStorage( } function splitSecretsByStorage( - secrets: Partial>, + secrets: StoredSecrets, config: Pick ): { - localSecrets: Partial>; - sessionSecrets: Partial>; + localSecrets: StoredSecrets; + sessionSecrets: StoredSecrets; } { - const localSecrets: Partial> = {}; - const sessionSecrets: Partial> = {}; + const localSecrets: StoredSecrets = {}; + const sessionSecrets: StoredSecrets = {}; for (const field of SECRET_FIELDS) { const value = secrets[field]?.trim(); @@ -186,15 +255,42 @@ function splitSecretsByStorage( localSecrets[field] = value; } + // Non-EVM family keys always live in localStorage (BYOK, device-local). + if (secrets.starknet && Object.values(secrets.starknet).some(v => v)) { + localSecrets.starknet = { ...secrets.starknet }; + } + if (secrets.solana && Object.values(secrets.solana).some(v => v)) { + localSecrets.solana = { ...secrets.solana }; + } + return { localSecrets, sessionSecrets }; } /** Extract secret fields from a config object */ -function extractSecrets(config: NetworkConfig): Partial> { - const secrets: Partial> = {}; +function extractSecrets( + config: NetworkConfig +): Partial> & NestedSecrets { + const secrets: Partial> & NestedSecrets = {}; for (const field of SECRET_FIELDS) { if (config[field]) secrets[field] = config[field]; } + // Nested: starknet/solana per-provider keys. + const starknetKey = config.starknet?.alchemyKey?.trim(); + const starknetInfura = config.starknet?.infuraProjectId?.trim(); + if (starknetKey || starknetInfura) { + secrets.starknet = { + ...(starknetKey ? { alchemyKey: starknetKey } : {}), + ...(starknetInfura ? { infuraProjectId: starknetInfura } : {}), + }; + } + const heliusKey = config.solana?.heliusKey?.trim(); + const solanaAlchemy = config.solana?.alchemyKey?.trim(); + if (heliusKey || solanaAlchemy) { + secrets.solana = { + ...(heliusKey ? { heliusKey } : {}), + ...(solanaAlchemy ? { alchemyKey: solanaAlchemy } : {}), + }; + } return secrets; } @@ -215,22 +311,39 @@ function stripSecrets(config: NetworkConfig): NetworkConfig { } clean.chainOverrides = Object.keys(cleanOverrides).length > 0 ? cleanOverrides : undefined; } + // Strip nested Starknet/Solana provider keys from the persisted blob. + if (clean.starknet) { + const { alchemyKey: _sk, infuraProjectId: _si, ...restStarknet } = clean.starknet; + clean.starknet = restStarknet; + } + if (clean.solana) { + const { heliusKey: _sh, alchemyKey: _sa, ...restSolana } = clean.solana; + clean.solana = restSolana; + } return clean; } -function readSecrets(): Partial> { +function readSecrets(): StoredSecrets { if (typeof window === 'undefined') { return {}; } + const local = readSecretsFromStorage(window.localStorage, LOCAL_SECRETS_KEY); + const session = readSecretsFromStorage(window.sessionStorage, SESSION_SECRETS_KEY); return { - ...readSecretsFromStorage(window.localStorage, LOCAL_SECRETS_KEY), - ...readSecretsFromStorage(window.sessionStorage, SESSION_SECRETS_KEY), + ...local, + ...session, + ...(local.starknet || session.starknet + ? { starknet: { ...local.starknet, ...session.starknet } } + : {}), + ...(local.solana || session.solana + ? { solana: { ...local.solana, ...session.solana } } + : {}), }; } function writeSecrets( - secrets: Partial>, + secrets: StoredSecrets, config: Pick ): void { if (typeof window === 'undefined') { @@ -261,8 +374,8 @@ function migrateSecretsToMemory(): void { LEGACY_SESSION_SECRETS_KEY ); const localSecrets = readSecretsFromStorage(window.localStorage, LOCAL_SECRETS_KEY); - const embeddedSecrets = parsedConfig ? extractSecrets(parsedConfig) : {}; - const mergedSecrets = { + const embeddedSecrets: StoredSecrets = parsedConfig ? extractSecrets(parsedConfig) : {}; + const mergedSecrets: StoredSecrets = { ...localSecrets, ...legacySessionSecrets, ...embeddedSecrets, @@ -284,9 +397,10 @@ function migrateSecretsToMemory(): void { } if (parsedConfig) { + const reassembled = mergeNestedSecrets(effectiveConfig, mergedSecrets); window.localStorage.setItem( STORAGE_KEY, - JSON.stringify(stripSecrets({ ...effectiveConfig, ...mergedSecrets })) + JSON.stringify(stripSecrets(reassembled)) ); } } @@ -395,6 +509,21 @@ function migrateFromOldSettings(): NetworkConfig | null { return migrated; } +function mergeNestedSecrets( + config: NetworkConfig, + secrets: StoredSecrets +): NetworkConfig { + const { starknet: starknetSecrets, solana: solanaSecrets, ...flat } = secrets; + const next: NetworkConfig = { ...config, ...flat }; + if (starknetSecrets && Object.values(starknetSecrets).some(v => v)) { + next.starknet = { ...(next.starknet ?? DEFAULT_STARKNET_RPC), ...starknetSecrets }; + } + if (solanaSecrets && Object.values(solanaSecrets).some(v => v)) { + next.solana = { ...(next.solana ?? DEFAULT_SOLANA_RPC), ...solanaSecrets }; + } + return next; +} + function readConfig(): NetworkConfig { if (typeof window === 'undefined') return { ...DEFAULT_CONFIG }; @@ -407,26 +536,23 @@ function readConfig(): NetworkConfig { // Even with no config blob, persisted secrets may exist const secrets = readSecrets(); return { - ...DEFAULT_CONFIG, - ...secrets, + ...mergeNestedSecrets(DEFAULT_CONFIG, secrets), ...(secrets.etherscanApiKey ? { etherscanKeyMode: 'personal' as const } : {}), }; } try { const parsed = migrateConfigShape(JSON.parse(raw) as NetworkConfig); - // Merge persisted secrets on top const secrets = readSecrets(); + const merged = mergeNestedSecrets({ ...DEFAULT_CONFIG, ...parsed }, secrets); return { - ...DEFAULT_CONFIG, - ...parsed, - ...secrets, + ...merged, ...(!parsed.etherscanKeyMode && secrets.etherscanApiKey ? { etherscanKeyMode: 'personal' as const } : {}), }; } catch { - return { ...DEFAULT_CONFIG, ...readSecrets() }; + return mergeNestedSecrets(DEFAULT_CONFIG, readSecrets()); } } @@ -530,6 +656,39 @@ export const networkConfigManager = { }); }, + /** + * Merge-update the Starknet subtree without clobbering other fields. + * Use this instead of `saveConfig({ starknet })` when writing partial + * Starknet config β€” the top-level shallow-merge in `saveConfig` would + * otherwise replace the whole subtree. + */ + saveStarknetConfig(patch: Partial): void { + const current = readConfig(); + const merged: StarknetRpcConfig = { + ...(current.starknet ?? DEFAULT_STARKNET_RPC), + ...patch, + ...(patch.customUrls + ? { customUrls: { ...current.starknet?.customUrls, ...patch.customUrls } } + : {}), + }; + writeConfig({ ...current, starknet: merged }); + }, + + saveSolanaConfig(patch: Partial): void { + const current = readConfig(); + const merged: SolanaRpcConfig = { + ...(current.solana ?? DEFAULT_SOLANA_RPC), + ...patch, + ...(patch.customUrls + ? { customUrls: { ...current.solana?.customUrls, ...patch.customUrls } } + : {}), + ...(patch.tritonUrls + ? { tritonUrls: { ...current.solana?.tritonUrls, ...patch.tritonUrls } } + : {}), + }; + writeConfig({ ...current, solana: merged }); + }, + resolveRpcUrl(chainId: number, defaultUrl?: string): RpcResolution { const config = readConfig(); const fallbackUrl = defaultUrl || PUBLIC_RPC_FALLBACKS[chainId] || ''; @@ -657,6 +816,135 @@ export const networkConfigManager = { }; }, + resolveStarknetRpc(network: StarknetNetwork): StarknetRpcResolution { + const { starknet = DEFAULT_STARKNET_RPC } = readConfig(); + const cartridgeUrl = `https://api.cartridge.gg/x/starknet/${network}`; + + switch (starknet.mode) { + case 'ALCHEMY_KEY': { + const key = starknet.alchemyKey?.trim(); + if (key) { + // v0_9 pinned; bump if Alchemy deprecates. + const segment = network === 'mainnet' ? 'starknet-mainnet' : 'starknet-sepolia'; + return { + url: `https://${segment}.g.alchemy.com/starknet/version/rpc/v0_9/${key}`, + source: 'alchemy', + isDefault: false, + }; + } + return { + url: cartridgeUrl, + source: 'cartridge', + isDefault: true, + note: 'Alchemy selected but no API key. Falling back to Cartridge default.', + }; + } + case 'INFURA_KEY': { + const projectId = starknet.infuraProjectId?.trim(); + if (projectId) { + const segment = network === 'mainnet' ? 'starknet-mainnet' : 'starknet-sepolia'; + return { + url: `https://${segment}.infura.io/v3/${projectId}`, + source: 'infura', + isDefault: false, + }; + } + return { + url: cartridgeUrl, + source: 'cartridge', + isDefault: true, + note: 'Infura selected but no Project ID. Falling back to Cartridge default.', + }; + } + case 'CUSTOM_URL': { + const custom = starknet.customUrls?.[network]?.trim(); + if (custom) { + return { url: normalizeUrl(custom), source: 'custom', isDefault: false }; + } + return { + url: cartridgeUrl, + source: 'cartridge', + isDefault: true, + note: 'Custom URL selected but not configured. Falling back to Cartridge default.', + }; + } + case 'CARTRIDGE_DEFAULT': + default: + return { url: cartridgeUrl, source: 'cartridge', isDefault: true }; + } + }, + + resolveSolanaRpc(cluster: SolanaCluster): SolanaRpcResolution { + const { solana = DEFAULT_SOLANA_RPC } = readConfig(); + const publicUrl = cluster === 'mainnet-beta' + ? 'https://api.mainnet-beta.solana.com' + : 'https://api.devnet.solana.com'; + + switch (solana.mode) { + case 'HELIUS_KEY': { + const key = solana.heliusKey?.trim(); + if (key) { + const host = cluster === 'mainnet-beta' ? 'mainnet' : 'devnet'; + return { + url: `https://${host}.helius-rpc.com/?api-key=${key}`, + source: 'helius', + isDefault: false, + }; + } + return { + url: publicUrl, + source: 'public', + isDefault: true, + note: 'Helius selected but no API key. Falling back to public RPC.', + }; + } + case 'ALCHEMY_KEY': { + const key = solana.alchemyKey?.trim(); + if (key) { + const host = cluster === 'mainnet-beta' ? 'solana-mainnet' : 'solana-devnet'; + return { + url: `https://${host}.g.alchemy.com/v2/${key}`, + source: 'alchemy', + isDefault: false, + }; + } + return { + url: publicUrl, + source: 'public', + isDefault: true, + note: 'Alchemy selected but no API key. Falling back to public RPC.', + }; + } + case 'TRITON_URL': { + const url = solana.tritonUrls?.[cluster]?.trim(); + if (url) { + return { url: normalizeUrl(url), source: 'triton', isDefault: false }; + } + return { + url: publicUrl, + source: 'public', + isDefault: true, + note: 'Triton selected but no URL. Falling back to public RPC.', + }; + } + case 'CUSTOM_URL': { + const url = solana.customUrls?.[cluster]?.trim(); + if (url) { + return { url: normalizeUrl(url), source: 'custom', isDefault: false }; + } + return { + url: publicUrl, + source: 'public', + isDefault: true, + note: 'Custom URL selected but not configured. Falling back to public RPC.', + }; + } + case 'PUBLIC_DEFAULT': + default: + return { url: publicUrl, source: 'public', isDefault: true }; + } + }, + getEtherscanApiKey(chainId?: number): string | undefined { const config = readConfig(); if (config.etherscanKeyMode !== 'personal') { diff --git a/src/config/queryClient.ts b/src/config/queryClient.ts new file mode 100644 index 0000000..b8de23c --- /dev/null +++ b/src/config/queryClient.ts @@ -0,0 +1,6 @@ +// Split from config/rainbowkit so importers don't transitively load the +// wagmi/RainbowKit module graph on non-EVM routes. +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; + +export const queryClient = new QueryClient(); +export { QueryClientProvider }; diff --git a/src/contexts/NetworkConfigContext.tsx b/src/contexts/NetworkConfigContext.tsx index ee5fc11..f0315ea 100644 --- a/src/contexts/NetworkConfigContext.tsx +++ b/src/contexts/NetworkConfigContext.tsx @@ -21,6 +21,12 @@ import { type NetworkConfig, type RpcProviderMode, type RpcResolution, + type SolanaCluster, + type SolanaRpcConfig, + type SolanaRpcResolution, + type StarknetNetwork, + type StarknetRpcConfig, + type StarknetRpcResolution, networkConfigManager, } from '../config/networkConfig'; @@ -33,6 +39,8 @@ interface NetworkConfigContextValue { // RPC resolution resolveRpcUrl: (chainId: number, defaultUrl?: string) => RpcResolution; + resolveStarknetRpc: (network: StarknetNetwork) => StarknetRpcResolution; + resolveSolanaRpc: (cluster: SolanaCluster) => SolanaRpcResolution; getRpcMode: () => RpcProviderMode; isFallbackAllowed: () => boolean; @@ -49,6 +57,8 @@ interface NetworkConfigContextValue { // Config mutations saveConfig: (config: Partial) => void; + saveStarknetConfig: (patch: Partial) => void; + saveSolanaConfig: (patch: Partial) => void; reset: () => void; // Setup acknowledgment (for UX gate) @@ -133,6 +143,20 @@ export const NetworkConfigProvider: React.FC = ({ [configVersion] ); + const resolveStarknetRpc = useCallback( + (network: StarknetNetwork): StarknetRpcResolution => { + return networkConfigManager.resolveStarknetRpc(network); + }, + [configVersion] + ); + + const resolveSolanaRpc = useCallback( + (cluster: SolanaCluster): SolanaRpcResolution => { + return networkConfigManager.resolveSolanaRpc(cluster); + }, + [configVersion] + ); + const getRpcMode = useCallback((): RpcProviderMode => { return networkConfigManager.getRpcMode(); }, [configVersion]); @@ -176,6 +200,18 @@ export const NetworkConfigProvider: React.FC = ({ setConfigVersion((prev) => prev + 1); }, []); + const saveStarknetConfig = useCallback((patch: Partial) => { + networkConfigManager.saveStarknetConfig(patch); + setConfig(networkConfigManager.getConfig()); + setConfigVersion((prev) => prev + 1); + }, []); + + const saveSolanaConfig = useCallback((patch: Partial) => { + networkConfigManager.saveSolanaConfig(patch); + setConfig(networkConfigManager.getConfig()); + setConfigVersion((prev) => prev + 1); + }, []); + const reset = useCallback(() => { networkConfigManager.reset(); setConfig(networkConfigManager.getConfig()); @@ -188,6 +224,8 @@ export const NetworkConfigProvider: React.FC = ({ config, configVersion, resolveRpcUrl, + resolveStarknetRpc, + resolveSolanaRpc, getRpcMode, isFallbackAllowed, getEtherscanApiKey, @@ -196,6 +234,8 @@ export const NetworkConfigProvider: React.FC = ({ isAlchemyAvailable, isInfuraAvailable, saveConfig, + saveStarknetConfig, + saveSolanaConfig, reset, hasAcknowledgedDefaults, acknowledgeDefaults, @@ -204,6 +244,8 @@ export const NetworkConfigProvider: React.FC = ({ config, configVersion, resolveRpcUrl, + resolveStarknetRpc, + resolveSolanaRpc, getRpcMode, isFallbackAllowed, getEtherscanApiKey, @@ -212,6 +254,8 @@ export const NetworkConfigProvider: React.FC = ({ isAlchemyAvailable, isInfuraAvailable, saveConfig, + saveStarknetConfig, + saveSolanaConfig, reset, hasAcknowledgedDefaults, acknowledgeDefaults, diff --git a/src/contexts/SimulationContext.tsx b/src/contexts/SimulationContext.tsx index 9a02a69..4b91bc3 100644 --- a/src/contexts/SimulationContext.tsx +++ b/src/contexts/SimulationContext.tsx @@ -3,6 +3,10 @@ import type { SimulationResult } from "../types/transaction"; import type { TraceContract } from "../utils/traceAddressCollector"; import type { DecodedTraceRow } from "../utils/traceDecoder"; import { buildOpcodeTraceFromSnapshots } from "../utils/simulationArtifacts"; +import type { EvmChainKey } from "../chains/types/evm"; +import { toEvmChainKey } from "../chains/types/evm"; +import type { StarknetChainId, StarknetChainKey } from "../chains/types/starknet"; +import type { SvmChainKey, SvmCluster } from "../chains/types/svm"; /** * Metadata from decoded trace that needs to persist across page refreshes. @@ -47,12 +51,23 @@ function stripHeavyTraceDataForRuntime(result: SimulationResult): SimulationResu return stripped as SimulationResult; } -export interface SimulationContractContext { +// Starknet/Svm branches are scaffolds β€” EVM is the only one consumers +// currently exercise, the public SimulationContractContext alias points +// at EvmSimulationContractContext. +export interface BaseSimulationContractContext { + simulationOrigin?: 'manual' | 'tx-hash-replay'; + debugEnabled?: boolean; + sourceTexts?: Record; +} + +export interface EvmSimulationContractContext extends BaseSimulationContractContext { + chainFamily: 'evm'; + chainKey: EvmChainKey; address: string; name?: string; // Contract name from verification or metadata abi: any[] | null; abiSource?: string; // Source that provided the ABI (e.g., "etherscan", "sourcify", "blockscout") - networkId: number; + networkId: number; // legacy alias for chainId β€” retained during migration networkName: string; // Re-simulation support: store function selection and args selectedFunction?: string; // Function name that was called @@ -62,7 +77,6 @@ export interface SimulationContractContext { fromAddress?: string; // Sender address used in simulation ethValue?: string; // ETH value if any blockOverride?: string; // Block number override for simulation - debugEnabled?: boolean; // Whether simulation was run with live debug session enabled // Token detection info to preserve tokenType?: "ERC20" | "ERC721" | "ERC1155" | "ERC777" | "ERC4626" | null; tokenSymbol?: string; @@ -77,14 +91,67 @@ export interface SimulationContractContext { selectors?: string[]; abi?: any[]; }>; // For Diamond (EIP-2535) contracts - // Simulation origin: how this simulation was created - simulationOrigin?: 'manual' | 'tx-hash-replay'; // Replay metadata (only set when simulationOrigin === 'tx-hash-replay') replayTxHash?: string; // The original transaction hash that was replayed // Trace contracts: resolved sources for all contracts in the trace traceContracts?: Map; - // Source texts from decoded trace (EDB artifacts) - filename to source code - sourceTexts?: Record; +} + +export interface StarknetSimulationContractContext extends BaseSimulationContractContext { + chainFamily: 'starknet'; + chainKey: StarknetChainKey; + starknetChainId: StarknetChainId; + contractAddress: string; + classHash?: string; + abi?: unknown[] | null; + entrypoint?: string; + calldata?: string[]; + accountAddress?: string; + maxFee?: string; + nonce?: string; +} + +export interface SvmSimulationContractContext extends BaseSimulationContractContext { + chainFamily: 'svm'; + chainKey: SvmChainKey; + cluster: SvmCluster; + programId: string; + idl?: unknown | null; + instructionName?: string; + instructionData?: string; + accounts?: Array<{ pubkey: string; isSigner?: boolean; isWritable?: boolean }>; + payer?: string; + recentBlockhash?: string; + computeUnitLimit?: number; +} + +/** Cross-family simulation context union. Narrow with isEvmContext/isStarknetContext/isSvmContext. */ +export type AnyChainSimulationContractContext = + | EvmSimulationContractContext + | StarknetSimulationContractContext + | SvmSimulationContractContext; + +// Alias to EVM branch so existing consumers keep compiling without forcing +// narrowing. Switch to AnyChainSimulationContractContext once adapters +// narrow at their own boundary. +export type SimulationContractContext = EvmSimulationContractContext; + +export function isEvmContext( + ctx: AnyChainSimulationContractContext | null | undefined, +): ctx is EvmSimulationContractContext { + return !!ctx && ctx.chainFamily === 'evm'; +} + +export function isStarknetContext( + ctx: AnyChainSimulationContractContext | null | undefined, +): ctx is StarknetSimulationContractContext { + return !!ctx && ctx.chainFamily === 'starknet'; +} + +export function isSvmContext( + ctx: AnyChainSimulationContractContext | null | undefined, +): ctx is SvmSimulationContractContext { + return !!ctx && ctx.chainFamily === 'svm'; } interface SetSimulationOptions { @@ -162,7 +229,12 @@ export const SimulationProvider: React.FC<{ children: React.ReactNode }> = ({ setCurrentSimulation(nextResult); if (contractCtx) { - setContractContext(contractCtx); + // Defensive backfill: legacy contexts (from IndexedDB rows predating the + // chainFamily/chainKey migration) may lack these fields. Stamp them as + // EVM at the boundary so downstream code can trust the discriminator. + const chainFamily = contractCtx.chainFamily ?? 'evm'; + const chainKey = contractCtx.chainKey ?? toEvmChainKey(contractCtx.networkId ?? 1); + setContractContext({ ...contractCtx, chainFamily, chainKey }); } setDecodedTraceRowsState(null); setDecodedTraceMetaState(null); diff --git a/src/contexts/WalletManager.tsx b/src/contexts/WalletManager.tsx new file mode 100644 index 0000000..31fb724 --- /dev/null +++ b/src/contexts/WalletManager.tsx @@ -0,0 +1,206 @@ +/** + * Global wallet manager β€” state-only, no SDK imports. Each family's Bridge + * component forwards connection changes here via `updateConnection` and + * registers imperative handles so the top-bar picker can drive the SDK + * without importing it. + */ +import { + createContext, + useCallback, + useContext, + useMemo, + useRef, + useState, + type ReactNode, +} from "react"; +import type { ChainFamily } from "../chains/types"; + +export interface FamilyConnection { + address: string; + chainId?: string | number | null; + connectorId?: string | null; + connectorName?: string | null; +} + +export interface FamilyBridgeHandles { + /** Open the family's wallet picker UI (wagmi's RainbowKit modal, or our + * custom list). The bridge decides how to render it. */ + openPicker: () => void; + /** Disconnect the currently-connected wallet for this family. */ + disconnect: () => void; +} + +interface WalletManagerState { + activeFamilies: ReadonlySet; + connections: Readonly>; +} + +interface WalletManagerContextValue extends WalletManagerState { + /** Ensures the family's provider is mounted. Called by the picker before + * triggering connect so the bridge exists to receive the request. */ + activateFamily: (family: ChainFamily) => void; + /** Connect a family's wallet. Activates the family first, then opens the + * picker (bridge-side) on next tick so the SDK provider has mounted. */ + connect: (family: ChainFamily) => void; + disconnect: (family: ChainFamily) => void; + /** Used by Bridge components only. */ + registerBridge: (family: ChainFamily, handles: FamilyBridgeHandles) => void; + unregisterBridge: (family: ChainFamily) => void; + /** Used by Bridge components only. */ + updateConnection: ( + family: ChainFamily, + connection: FamilyConnection | null, + ) => void; +} + +const WalletManagerContext = createContext( + null, +); + +const STORAGE_KEY = "hexkit.wallet.activeFamilies"; +const FAMILIES: readonly ChainFamily[] = ["evm", "starknet", "svm"]; + +function readPersistedFamilies(): Set { + try { + const raw = window.localStorage.getItem(STORAGE_KEY); + if (!raw) return new Set(); + const parsed = JSON.parse(raw); + if (!Array.isArray(parsed)) return new Set(); + return new Set(parsed.filter((f): f is ChainFamily => + FAMILIES.includes(f as ChainFamily), + )); + } catch { + return new Set(); + } +} + +function writePersistedFamilies(families: ReadonlySet) { + try { + window.localStorage.setItem(STORAGE_KEY, JSON.stringify([...families])); + } catch { + // quota/private-mode β€” non-fatal + } +} + +const emptyConnections: Record = { + evm: null, + starknet: null, + svm: null, +}; + +export function WalletManagerProvider({ children }: { children: ReactNode }) { + const [activeFamilies, setActiveFamilies] = useState>(() => + readPersistedFamilies(), + ); + const [connections, setConnections] = + useState>(emptyConnections); + + const bridgesRef = useRef>>( + {}, + ); + // Connect intents that arrive before the bridge has lazy-loaded. Flushed + // when registerBridge fires. + const pendingConnectRef = useRef>(new Set()); + + const activateFamily = useCallback((family: ChainFamily) => { + setActiveFamilies((prev) => { + if (prev.has(family)) return prev; + const next = new Set(prev); + next.add(family); + writePersistedFamilies(next); + return next; + }); + }, []); + + const connect = useCallback( + (family: ChainFamily) => { + activateFamily(family); + const bridge = bridgesRef.current[family]; + if (bridge) { + bridge.openPicker(); + } else { + pendingConnectRef.current.add(family); + } + }, + [activateFamily], + ); + + const disconnect = useCallback((family: ChainFamily) => { + const bridge = bridgesRef.current[family]; + if (bridge) bridge.disconnect(); + }, []); + + const registerBridge = useCallback( + (family: ChainFamily, handles: FamilyBridgeHandles) => { + bridgesRef.current[family] = handles; + if (pendingConnectRef.current.has(family)) { + pendingConnectRef.current.delete(family); + handles.openPicker(); + } + }, + [], + ); + + const unregisterBridge = useCallback((family: ChainFamily) => { + delete bridgesRef.current[family]; + }, []); + + const updateConnection = useCallback( + (family: ChainFamily, connection: FamilyConnection | null) => { + setConnections((prev) => { + // Shallow compare β€” SDKs re-emit identical state on focus/visibility. + const existing = prev[family]; + if ( + existing?.address === connection?.address && + existing?.chainId === connection?.chainId && + existing?.connectorId === connection?.connectorId && + existing?.connectorName === connection?.connectorName + ) { + return prev; + } + return { ...prev, [family]: connection }; + }); + }, + [], + ); + + const value = useMemo( + () => ({ + activeFamilies, + connections, + activateFamily, + connect, + disconnect, + registerBridge, + unregisterBridge, + updateConnection, + }), + [ + activeFamilies, + connections, + activateFamily, + connect, + disconnect, + registerBridge, + unregisterBridge, + updateConnection, + ], + ); + + return ( + + {children} + + ); +} + +export function useWalletManager(): WalletManagerContextValue { + const ctx = useContext(WalletManagerContext); + if (!ctx) { + throw new Error( + "useWalletManager must be used inside ", + ); + } + return ctx; +} + diff --git a/src/features/earn/adapter/types.ts b/src/features/earn/adapter/types.ts new file mode 100644 index 0000000..da1ed07 --- /dev/null +++ b/src/features/earn/adapter/types.ts @@ -0,0 +1,245 @@ +// EarnAdapter port: SDK-neutral contract between the Earn shell and +// family-specific drivers. Shells see prepared steps and execution +// results; they never hold wallet-library objects. +import type { + ChainDescriptor, + ChainFamily, + EvmChainDescriptor, + SvmChainDescriptor, +} from "../../../chains/types"; +import type { + Address as EvmAddress, + Calldata as EvmCalldata, + EvmChainId, + Hex as EvmHex, +} from "../../../chains/types/evm"; +import type { + PublicKey as SvmPublicKey, + TransactionSignature as SvmTransactionSignature, +} from "../../../chains/types/svm"; +import type { EarnVault } from "../../../components/integrations/lifi-earn/types"; + +/** A vault guaranteed to carry the chainKey of the descriptor it's scoped to. */ +export type EarnVaultFor = EarnVault & { + chainKey: T["key"]; +}; + +export type WalletAddressFor = + T extends EvmChainDescriptor ? EvmAddress : + T extends SvmChainDescriptor ? SvmPublicKey : + never; + +/** + * A family-typed token reference. EVM tokens carry a contract address; + * Solana tokens carry a mint + optional ATA. Deliberately *not* unified β€” + * pretending EVM and SPL tokens share a model hides real differences. + */ +export type EarnAssetRef = + T extends EvmChainDescriptor ? { + kind: "native" | "erc20"; + chainKey: T["key"]; + address: EvmAddress; + symbol: string; + decimals: number; + logoURI?: string; + } : + T extends SvmChainDescriptor ? { + kind: "native" | "spl"; + chainKey: T["key"]; + mint: SvmPublicKey; + symbol: string; + decimals: number; + logoURI?: string; + ata?: SvmPublicKey | null; + } : + never; + +export interface IdleAsset { + chain: T; + owner: WalletAddressFor; + token: EarnAssetRef; + amountRaw: bigint; + amountDecimal: string; + amountUsd: number | null; +} + +export type TxIdFor = + T extends EvmChainDescriptor ? EvmHex : + T extends SvmChainDescriptor ? SvmTransactionSignature : + never; + +/** + * Serializable transaction envelope. `submitTx` accepts it, so the shell + * never holds wallet-SDK objects. EVM carries the raw tx fields; SVM + * carries a base64-serialized transaction + version flag, which is how + * `@solana/wallet-adapter` accepts pre-signed payloads. + */ +export type PreparedTxEnvelope = + T extends EvmChainDescriptor ? { + family: "evm"; + chainId: EvmChainId; + to: EvmAddress; + data?: EvmCalldata; + value?: bigint; + gasLimit?: bigint; + } : + T extends SvmChainDescriptor ? { + family: "svm"; + cluster: T["cluster"]; + serializedTransactionBase64: string; + version: "legacy" | "v0"; + } : + never; + +export interface PreparedTx { + /** Unique id within a PreparedEarnAction β€” for UI keying and progress. */ + id: string; + chain: T; + kind: + | "approval" + | "swap" + | "bridge" + | "deposit" + | "withdraw" + | "ata-create" + | "other"; + title: string; + summary?: string; + request: PreparedTxEnvelope; +} + +export interface ExecutionResult { + chain: T; + txId: TxIdFor; + status: "submitted" | "confirmed" | "failed"; + explorerUrl: string | null; + rawReceipt?: unknown; +} + +/** + * A prepared user action β€” e.g. a deposit consisting of (approval, deposit). + * The shell renders `steps` sequentially, letting the adapter decide the + * multi-tx choreography without exposing SDK primitives. + */ +export interface PreparedEarnAction { + type: "deposit" | "withdraw"; + chain: T; + vault: EarnVaultFor; + assetIn: EarnAssetRef; + assetOut?: EarnAssetRef; + amountInRaw: bigint; + amountOutRaw?: bigint | null; + amountOutMinRaw?: bigint | null; + amountInUsd?: number | null; + amountOutUsd?: number | null; + priceImpactBps?: number | null; + steps: PreparedTx[]; +} + +export interface FetchIdleBalancesArgs { + owner: WalletAddressFor; + vaults: readonly EarnVaultFor[]; + signal?: AbortSignal; +} + +export interface FetchTokenBalanceArgs { + chain: T; + owner: WalletAddressFor; + token: EarnAssetRef; + signal?: AbortSignal; +} + +export interface FetchTokenAllowanceArgs { + chain: T; + owner: WalletAddressFor; + token: EarnAssetRef; + spender: WalletAddressFor; + signal?: AbortSignal; +} + +export interface PrepareDepositArgs { + owner: WalletAddressFor; + receiver?: WalletAddressFor; + vault: EarnVaultFor; + tokenIn: EarnAssetRef; + amountInRaw: bigint; + simulate?: boolean; +} + +export interface PrepareWithdrawArgs { + owner: WalletAddressFor; + receiver?: WalletAddressFor; + vault: EarnVaultFor; + shareToken: EarnAssetRef; + tokenOut: EarnAssetRef; + amountInRaw: bigint; + simulate?: boolean; +} + +interface BaseEarnAdapter { + readonly family: T["chainFamily"]; + readonly supported: boolean; + readonly unsupportedReason?: string; + + fetchIdleBalances(args: FetchIdleBalancesArgs): Promise[]>; + fetchTokenBalance(args: FetchTokenBalanceArgs): Promise; + + prepareDeposit(args: PrepareDepositArgs): Promise>; + prepareWithdraw(args: PrepareWithdrawArgs): Promise>; + + submitTx(tx: PreparedTx): Promise>; + waitForTx( + tx: ExecutionResult, + options?: { timeoutMs?: number }, + ): Promise>; + + explorerTxUrl(chain: T, txId: TxIdFor): string | null; +} + +/** + * EVM-shaped adapter β€” requires explicit allowance checking for ERC20 + * spending. The shell renders an approval step before deposit when needed. + */ +export interface AllowanceEarnAdapter + extends BaseEarnAdapter { + readonly approvalModel: "allowance"; + fetchTokenAllowance(args: FetchTokenAllowanceArgs): Promise; +} + +/** + * SVM-shaped adapter β€” no allowance step; ATA creation is rolled into + * `prepareDeposit`. Shell code that branches on approval skips the step + * entirely for this family. + */ +export interface NoApprovalEarnAdapter + extends BaseEarnAdapter { + readonly approvalModel: "none"; + fetchTokenAllowance?: never; +} + +export type EarnAdapter = + | AllowanceEarnAdapter + | NoApprovalEarnAdapter; + +export type AnyEarnAdapter = EarnAdapter; + +/** + * Registry shape per family. Null = adapter not registered / not supported. + * Phase 5a exposes only EVM; Phase 5d adds an SVM stub; Phase 5e fills it in. + */ +export interface EarnAdapterRegistry { + readonly evm: EarnAdapter | null; + readonly starknet: null; + readonly svm: EarnAdapter | null; +} + +export function adapterFamilyLabel(family: ChainFamily): string { + switch (family) { + case "evm": + return "EVM"; + case "starknet": + return "Starknet"; + case "svm": + return "Solana"; + } +} diff --git a/src/features/earn/adapters/evm/EvmEarnAdapterProvider.tsx b/src/features/earn/adapters/evm/EvmEarnAdapterProvider.tsx new file mode 100644 index 0000000..d12a465 --- /dev/null +++ b/src/features/earn/adapters/evm/EvmEarnAdapterProvider.tsx @@ -0,0 +1,33 @@ +import { useMemo, type ReactNode } from "react"; +import { useAccount, useConfig } from "wagmi"; +import { EarnAdapterProvider } from "../../context/EarnAdapterContext"; +import { buildEvmEarnAdapter } from "./evmEarnAdapter"; + +interface EvmEarnAdapterProviderProps { + children: ReactNode; +} + +export function EvmEarnAdapterProvider({ children }: EvmEarnAdapterProviderProps) { + const { address, isConnected } = useAccount(); + const config = useConfig(); + + const adapter = useMemo( + () => + buildEvmEarnAdapter({ + connectedAddress: address ?? null, + config, + }), + [address, config], + ); + + return ( + + {children} + + ); +} diff --git a/src/features/earn/adapters/evm/evmEarnAdapter.ts b/src/features/earn/adapters/evm/evmEarnAdapter.ts new file mode 100644 index 0000000..5019e1f --- /dev/null +++ b/src/features/earn/adapters/evm/evmEarnAdapter.ts @@ -0,0 +1,120 @@ +// Adapter closure captures the wagmi config the provider injects. Safe +// because wagmi config is stable for a mount lifetime; a family switch +// re-mounts the provider which builds a fresh adapter. +import type { Config } from "wagmi"; +import type { EvmChainDescriptor } from "../../../../chains/types"; +import type { + AllowanceEarnAdapter, + EarnAdapter, + ExecutionResult, + FetchIdleBalancesArgs, + FetchTokenAllowanceArgs, + FetchTokenBalanceArgs, + IdleAsset, + PreparedEarnAction, + PreparedTx, + PrepareDepositArgs, + PrepareWithdrawArgs, +} from "../../adapter/types"; +import type { Hex } from "../../../../chains/types/evm"; +import { fetchEvmTokenAllowance, fetchEvmTokenBalance } from "./evmReads"; +import { evmExplorerTxUrl } from "./evmExplorer"; +import { prepareEvmDeposit, prepareEvmWithdraw } from "./evmPrepare"; +import { submitEvmTx, waitForEvmTxReceipt } from "./evmSubmit"; + +export interface EvmEarnAdapterDeps { + /** Connected wallet address, if any. Null when disconnected. */ + connectedAddress: string | null; + /** wagmi config used for sendTransaction / waitForTransactionReceipt. + * Null means the provider was mounted outside a WagmiProvider β€” only + * the read methods remain functional. */ + config: Config | null; +} + +export function buildEvmEarnAdapter( + deps: EvmEarnAdapterDeps, +): EarnAdapter { + const { config } = deps; + + const requireConfig = (method: string): Config => { + if (!config) { + throw new Error( + `[EvmEarnAdapter.${method}] wagmi config unavailable β€” did the family provider mount outside a WagmiProvider?`, + ); + } + return config; + }; + + const adapter: AllowanceEarnAdapter = { + family: "evm", + supported: true, + approvalModel: "allowance", + + async fetchIdleBalances( + _args: FetchIdleBalancesArgs, + ): Promise[]> { + // Today the shell calls adapters/evm/idleScan.ts directly via the + // concierge hook. When shell files move into src/features/earn/shell, + // this method becomes the entry point and returns the family-typed + // IdleAsset. Explicitly not-yet wired to avoid a type-shape split + // while the legacy shape is still in use. + throw new Error( + "[EvmEarnAdapter.fetchIdleBalances] not wired β€” the concierge hook still calls scanEvmChainBalances directly. Route through here once IdleAsset replaces the legacy shape.", + ); + }, + + async fetchTokenBalance( + args: FetchTokenBalanceArgs, + ): Promise { + return fetchEvmTokenBalance( + args.chain.chainId as number, + args.token.address, + args.owner, + ); + }, + + async fetchTokenAllowance( + args: FetchTokenAllowanceArgs, + ): Promise { + return fetchEvmTokenAllowance( + args.chain.chainId as number, + args.token.address, + args.owner, + args.spender, + ); + }, + + prepareDeposit( + args: PrepareDepositArgs, + ): Promise> { + return prepareEvmDeposit(args); + }, + + prepareWithdraw( + args: PrepareWithdrawArgs, + ): Promise> { + return prepareEvmWithdraw(args); + }, + + async submitTx( + tx: PreparedTx, + ): Promise> { + const cfg = requireConfig("submitTx"); + return submitEvmTx({ config: cfg }, tx); + }, + + async waitForTx( + result: ExecutionResult, + options, + ): Promise> { + const cfg = requireConfig("waitForTx"); + return waitForEvmTxReceipt({ config: cfg }, result, options); + }, + + explorerTxUrl(chain, txId) { + return evmExplorerTxUrl(chain, txId as Hex); + }, + }; + + return adapter; +} diff --git a/src/features/earn/adapters/evm/evmExplorer.ts b/src/features/earn/adapters/evm/evmExplorer.ts new file mode 100644 index 0000000..183fe50 --- /dev/null +++ b/src/features/earn/adapters/evm/evmExplorer.ts @@ -0,0 +1,15 @@ +import { getChainById, getExplorerUrl } from "../../../../chains/registry"; +import type { EvmChainDescriptor } from "../../../../chains/types"; +import type { Hex } from "../../../../chains/types/evm"; + +/** Resolve an explorer URL for a confirmed tx. Returns null when the chain + * has no explorer configured. */ +export function evmExplorerTxUrl( + chain: EvmChainDescriptor, + txId: Hex, +): string | null { + const chainId = chain.chainId as number; + const legacy = getChainById(chainId); + if (!legacy?.explorerUrl) return null; + return getExplorerUrl(chainId, "tx", txId); +} diff --git a/src/features/earn/adapters/evm/evmPrepare.ts b/src/features/earn/adapters/evm/evmPrepare.ts new file mode 100644 index 0000000..970b3f6 --- /dev/null +++ b/src/features/earn/adapters/evm/evmPrepare.ts @@ -0,0 +1,212 @@ +// Prepares a deposit/withdraw into a PreparedEarnAction: [optional ERC20 +// approve, Composer tx]. ERC20 gets an approve step prepended when the live +// allowance for `estimate.approvalAddress` is below amountIn. Native tokens +// never approve. The swap-then-deposit two-step DepositFlow uses for +// non-underlying tokens is not modelled here β€” it stays shell-local. +import { ethers } from "ethers"; +import type { EvmChainDescriptor } from "../../../../chains/types"; +import { + parseEvmChainId, + parseAddress, + parseCalldata, +} from "../../../../chains/types/evm"; +import type { Address } from "../../../../chains/types/evm"; +import type { + EarnAssetRef, + EarnVaultFor, + PreparedEarnAction, + PreparedTx, + PreparedTxEnvelope, + PrepareDepositArgs, + PrepareWithdrawArgs, +} from "../../adapter/types"; +import { fetchComposerQuote } from "../../../../components/integrations/lifi-earn/earnApi"; +import { fetchEvmTokenAllowance } from "./evmReads"; +import { isNativeToken } from "../../../../utils/addressConstants"; + +const ERC20_APPROVE_IFACE = new ethers.utils.Interface([ + "function approve(address spender, uint256 amount) returns (bool)", +]); + +function buildApprovalTx( + chain: EvmChainDescriptor, + tokenAddress: Address, + spender: Address, +): PreparedTx { + const data = ERC20_APPROVE_IFACE.encodeFunctionData("approve", [ + spender, + ethers.constants.MaxUint256, + ]) as `0x${string}`; + + const envelope: PreparedTxEnvelope = { + family: "evm", + chainId: parseEvmChainId(chain.chainId as number), + to: tokenAddress, + data: parseCalldata(data), + }; + + return { + id: "approval", + chain, + kind: "approval", + title: "Approve token", + summary: "ERC20 approve for the LI.FI Composer spender", + request: envelope, + }; +} + +function composerToEnvelope( + chain: EvmChainDescriptor, + req: { to: string; data: string; value?: string; gasLimit?: string }, +): PreparedTxEnvelope { + return { + family: "evm", + chainId: parseEvmChainId(chain.chainId as number), + to: parseAddress(req.to), + data: parseCalldata(req.data), + value: req.value ? BigInt(req.value) : undefined, + gasLimit: req.gasLimit ? BigInt(req.gasLimit) : undefined, + }; +} + +/** + * Fetch a Composer quote and (optionally) prepend an approval step, yielding + * a PreparedEarnAction ready for the shell to walk with submitTx. + */ +export async function prepareEvmDeposit( + args: PrepareDepositArgs, +): Promise> { + const { vault, tokenIn, amountInRaw, owner, receiver } = args; + const chain = args.vault.chainKey.startsWith("evm:") + ? ({ + chainFamily: "evm", + key: vault.chainKey, + chainId: parseEvmChainId(vault.chainId), + name: vault.network, + } as EvmChainDescriptor) + : null; + if (!chain) throw new Error(`prepareEvmDeposit: non-EVM vault chainKey ${vault.chainKey}`); + + const toAddress = receiver ?? owner; + + const quote = await fetchComposerQuote({ + fromChain: vault.chainId, + toChain: vault.chainId, + fromToken: tokenIn.kind === "native" ? tokenIn.address : tokenIn.address, + toToken: vault.address, + fromAddress: owner, + toAddress, + fromAmount: amountInRaw.toString(), + underlyingSymbols: vault.underlyingTokens?.map((t) => t.symbol), + }); + + const steps: PreparedTx[] = []; + + // ERC20s need an allowance check against the composer-supplied spender. + // Native-token inputs skip this entirely. + if (!isNativeToken(tokenIn.address)) { + const spenderStr = quote.estimate.approvalAddress; + const spender = parseAddress(spenderStr); + + const currentAllowance = await fetchEvmTokenAllowance( + vault.chainId, + tokenIn.address, + owner, + spenderStr, + ); + + if (currentAllowance < amountInRaw) { + steps.push(buildApprovalTx(chain, parseAddress(tokenIn.address), spender)); + } + } + + steps.push({ + id: "deposit", + chain, + kind: "deposit", + title: `Deposit ${tokenIn.symbol} into ${vault.name ?? "vault"}`, + summary: "LI.FI Composer transaction", + request: composerToEnvelope(chain, quote.transactionRequest), + }); + + return { + type: "deposit", + chain, + vault: vault as EarnVaultFor, + assetIn: tokenIn as EarnAssetRef, + amountInRaw, + amountOutRaw: quote.estimate.toAmount ? BigInt(quote.estimate.toAmount) : null, + amountOutMinRaw: quote.estimate.toAmountMin + ? BigInt(quote.estimate.toAmountMin) + : null, + steps, + }; +} + +export async function prepareEvmWithdraw( + args: PrepareWithdrawArgs, +): Promise> { + const { vault, shareToken, tokenOut, amountInRaw, owner, receiver } = args; + const chain = vault.chainKey.startsWith("evm:") + ? ({ + chainFamily: "evm", + key: vault.chainKey, + chainId: parseEvmChainId(vault.chainId), + name: vault.network, + } as EvmChainDescriptor) + : null; + if (!chain) throw new Error(`prepareEvmWithdraw: non-EVM vault chainKey ${vault.chainKey}`); + + const toAddress = receiver ?? owner; + + const quote = await fetchComposerQuote({ + fromChain: vault.chainId, + toChain: vault.chainId, + // shares become the input; the underlying token is the output + fromToken: shareToken.address, + toToken: tokenOut.address, + fromAddress: owner, + toAddress, + fromAmount: amountInRaw.toString(), + underlyingSymbols: vault.underlyingTokens?.map((t) => t.symbol), + }); + + const steps: PreparedTx[] = []; + + // Some vaults require approving the share token to the composer before + // withdrawing. Always check; skip if unnecessary. + const spenderStr = quote.estimate.approvalAddress; + const spender = parseAddress(spenderStr); + const currentAllowance = await fetchEvmTokenAllowance( + vault.chainId, + shareToken.address, + owner, + spenderStr, + ); + if (currentAllowance < amountInRaw) { + steps.push(buildApprovalTx(chain, parseAddress(shareToken.address), spender)); + } + + steps.push({ + id: "withdraw", + chain, + kind: "withdraw", + title: `Withdraw to ${tokenOut.symbol}`, + summary: "LI.FI Composer withdraw transaction", + request: composerToEnvelope(chain, quote.transactionRequest), + }); + + return { + type: "withdraw", + chain, + vault: vault as EarnVaultFor, + assetIn: shareToken as EarnAssetRef, + assetOut: tokenOut as EarnAssetRef, + amountInRaw, + amountOutRaw: quote.estimate.toAmount ? BigInt(quote.estimate.toAmount) : null, + amountOutMinRaw: quote.estimate.toAmountMin + ? BigInt(quote.estimate.toAmountMin) + : null, + steps, + }; +} diff --git a/src/features/earn/adapters/evm/evmReads.ts b/src/features/earn/adapters/evm/evmReads.ts new file mode 100644 index 0000000..d804413 --- /dev/null +++ b/src/features/earn/adapters/evm/evmReads.ts @@ -0,0 +1,53 @@ +// Bare async variants of useTokenBalance / useTokenAllowance so the adapter +// can call them outside of render. +import { ethers } from "ethers"; +import { networkConfigManager } from "../../../../config/networkConfig"; +import { SUPPORTED_CHAINS } from "../../../../utils/chains"; +import { isNativeToken } from "../../../../utils/addressConstants"; + +const ERC20_BALANCE_ABI = [ + "function balanceOf(address owner) view returns (uint256)", +]; +const ERC20_ALLOWANCE_ABI = [ + "function allowance(address owner, address spender) view returns (uint256)", +]; + +function providerFor(chainId: number): ethers.providers.JsonRpcProvider { + const chain = SUPPORTED_CHAINS.find((c) => c.id === chainId); + if (!chain) throw new Error(`Chain ${chainId} not supported`); + + const resolution = networkConfigManager.resolveRpcUrl(chainId, chain.rpcUrl); + if (!resolution.url) { + throw new Error( + `No RPC URL configured for chain ${chainId}. Set a custom RPC or enable the public fallback in Network Settings.`, + ); + } + return new ethers.providers.JsonRpcProvider(resolution.url); +} + +export async function fetchEvmTokenBalance( + chainId: number, + tokenAddress: string, + owner: string, +): Promise { + const provider = providerFor(chainId); + if (isNativeToken(tokenAddress)) { + const raw = await provider.getBalance(owner); + return BigInt(raw.toString()); + } + const contract = new ethers.Contract(tokenAddress, ERC20_BALANCE_ABI, provider); + const raw: ethers.BigNumber = await contract.balanceOf(owner); + return BigInt(raw.toString()); +} + +export async function fetchEvmTokenAllowance( + chainId: number, + tokenAddress: string, + owner: string, + spender: string, +): Promise { + const provider = providerFor(chainId); + const contract = new ethers.Contract(tokenAddress, ERC20_ALLOWANCE_ABI, provider); + const raw: ethers.BigNumber = await contract.allowance(owner, spender); + return BigInt(raw.toString()); +} diff --git a/src/features/earn/adapters/evm/evmSubmit.ts b/src/features/earn/adapters/evm/evmSubmit.ts new file mode 100644 index 0000000..a4684a7 --- /dev/null +++ b/src/features/earn/adapters/evm/evmSubmit.ts @@ -0,0 +1,86 @@ +// Wraps @wagmi/core's send + waitForReceipt so the EarnAdapter surfaces an +// SDK-neutral ExecutionResult. The provider injects Config via buildEvmEarnAdapter. +import type { Config } from "wagmi"; +import { + sendTransaction, + waitForTransactionReceipt, + switchChain as wagmiSwitchChain, + getAccount, +} from "@wagmi/core"; +import type { EvmChainDescriptor } from "../../../../chains/types"; +import type { + PreparedTx, + ExecutionResult, +} from "../../adapter/types"; +import type { Hex } from "../../../../chains/types/evm"; +import { evmExplorerTxUrl } from "./evmExplorer"; + +export interface EvmSubmitDeps { + config: Config; + /** How long to wait for receipt confirmation before timing out. */ + receiptTimeoutMs?: number; +} + +/** + * Submit a prepared EVM transaction. Ensures the wallet is on the right + * chain before sending; returns an ExecutionResult once the tx is broadcast + * (status "submitted"). Callers should call `waitForEvmTxReceipt` next to + * block on confirmation. + */ +export async function submitEvmTx( + deps: EvmSubmitDeps, + tx: PreparedTx, +): Promise> { + if (tx.request.family !== "evm") { + throw new Error(`submitEvmTx: expected EVM envelope, got ${tx.request.family}`); + } + + const envelope = tx.request; + const chainId = envelope.chainId as number; + + // If the wallet's current chain doesn't match the tx's chain, switch. + // wagmi's switchChain is idempotent β€” no-op when already on the right chain. + const acct = getAccount(deps.config); + if (acct.chainId !== chainId) { + await wagmiSwitchChain(deps.config, { chainId }); + } + + const hash = await sendTransaction(deps.config, { + chainId, + to: envelope.to, + data: envelope.data, + value: envelope.value, + gas: envelope.gasLimit, + }); + + return { + chain: tx.chain, + txId: hash as unknown as Hex, + status: "submitted", + explorerUrl: evmExplorerTxUrl(tx.chain, hash as unknown as Hex), + }; +} + +/** + * Block on receipt. Updates the ExecutionResult's status to "confirmed" or + * "failed" based on receipt.status, and attaches the raw receipt for + * callers that want to inspect gasUsed / logs. + */ +export async function waitForEvmTxReceipt( + deps: EvmSubmitDeps, + result: ExecutionResult, + options?: { timeoutMs?: number }, +): Promise> { + const chainId = result.chain.chainId as number; + const receipt = await waitForTransactionReceipt(deps.config, { + chainId, + hash: result.txId as unknown as `0x${string}`, + timeout: options?.timeoutMs ?? deps.receiptTimeoutMs ?? 120_000, + }); + + return { + ...result, + status: receipt.status === "success" ? "confirmed" : "failed", + rawReceipt: receipt, + }; +} diff --git a/src/features/earn/adapters/evm/idleScan.ts b/src/features/earn/adapters/evm/idleScan.ts new file mode 100644 index 0000000..5f3045a --- /dev/null +++ b/src/features/earn/adapters/evm/idleScan.ts @@ -0,0 +1,119 @@ +// Multicall ERC20 balances + native balance for one EVM chain. Returns the +// legacy IdleAsset shape (string amounts, numeric chainId) because the +// concierge shell still consumes it that way; migrate to IdleAsset when +// the shell moves under features/earn/shell. +import { createPublicClient, http, erc20Abi, formatUnits } from "viem"; +import { CHAIN_REGISTRY } from "../../../../utils/chains"; +import { networkConfigManager } from "../../../../config/networkConfig"; +import { isNativeToken, MULTICALL3_ADDRESS } from "../../../../utils/addressConstants"; +import type { EarnToken } from "../../../../components/integrations/lifi-earn/types"; +import type { IdleAsset } from "../../../../components/integrations/lifi-earn/concierge/types"; + +function withTimeout(promise: Promise, ms: number): Promise { + return new Promise((resolve, reject) => { + const t = setTimeout(() => reject(new Error(`timeout ${ms}ms`)), ms); + promise.then( + (v) => { + clearTimeout(t); + resolve(v); + }, + (e) => { + clearTimeout(t); + reject(e); + }, + ); + }); +} + +function toIdleAsset( + chainId: number, + chainName: string, + token: EarnToken, + raw: bigint, +): IdleAsset { + return { + chainId, + chainName, + token, + amountRaw: raw.toString(), + amountDecimal: formatUnits(raw, token.decimals), + amountUsd: null, + }; +} + +export interface ScanSingleChainArgs { + chainId: number; + address: `0x${string}`; + tokens: EarnToken[]; + timeoutMs: number; +} + +/** + * Scan one EVM chain for non-zero balances of the given tokens. Uses a + * single multicall for ERC20s plus a parallel native balance fetch. + * Returns an empty array when the chain's RPC is unreachable. + */ +export async function scanEvmChainBalances( + args: ScanSingleChainArgs, +): Promise { + const { chainId, address, tokens, timeoutMs } = args; + + const chainMeta = CHAIN_REGISTRY.find((c) => c.id === chainId); + if (!chainMeta) return []; + + const resolution = networkConfigManager.resolveRpcUrl(chainId, chainMeta.rpcUrl); + const rpcUrl = resolution.url; + if (!rpcUrl) return []; + + const client = createPublicClient({ transport: http(rpcUrl) }); + + const erc20s = tokens.filter((t) => !isNativeToken(t.address)); + const nativeTokenMeta = tokens.find((t) => isNativeToken(t.address)); + + const multicallCalls = erc20s.map((tok) => ({ + address: tok.address as `0x${string}`, + abi: erc20Abi, + functionName: "balanceOf" as const, + args: [address] as const, + })); + + const [erc20Results, nativeBalance] = await Promise.all([ + multicallCalls.length > 0 + ? withTimeout( + client.multicall({ + contracts: multicallCalls, + allowFailure: true, + multicallAddress: MULTICALL3_ADDRESS, + }), + timeoutMs, + ) + : Promise.resolve([] as { status: "success" | "failure"; result?: bigint }[]), + withTimeout(client.getBalance({ address }), timeoutMs), + ]); + + const assets: IdleAsset[] = []; + + erc20Results.forEach((r, i) => { + if (r.status !== "success") return; + const raw = r.result as bigint; + if (raw === 0n) return; + const tok = erc20s[i]; + assets.push(toIdleAsset(chainId, chainMeta.name, tok, raw)); + }); + + if ((nativeBalance as bigint) > 0n) { + const nativeTok: EarnToken = nativeTokenMeta ?? { + address: "0x0000000000000000000000000000000000000000", + symbol: chainMeta.nativeCurrency.symbol, + decimals: chainMeta.nativeCurrency.decimals, + name: chainMeta.nativeCurrency.name, + chainId, + logoURI: "", + }; + assets.push( + toIdleAsset(chainId, chainMeta.name, nativeTok, nativeBalance as bigint), + ); + } + + return assets; +} diff --git a/src/features/earn/adapters/svm/SvmEarnAdapterProvider.tsx b/src/features/earn/adapters/svm/SvmEarnAdapterProvider.tsx new file mode 100644 index 0000000..ddc9362 --- /dev/null +++ b/src/features/earn/adapters/svm/SvmEarnAdapterProvider.tsx @@ -0,0 +1,23 @@ +import type { ReactNode } from "react"; +import { EarnAdapterProvider } from "../../context/EarnAdapterContext"; +import { buildSvmEarnAdapterStub } from "./svmEarnAdapter.stub"; + +interface SvmEarnAdapterProviderProps { + children: ReactNode; +} + +export function SvmEarnAdapterProvider({ children }: SvmEarnAdapterProviderProps) { + const adapter = buildSvmEarnAdapterStub(); + + return ( + + {children} + + ); +} diff --git a/src/features/earn/adapters/svm/svmEarnAdapter.stub.ts b/src/features/earn/adapters/svm/svmEarnAdapter.stub.ts new file mode 100644 index 0000000..6e41da0 --- /dev/null +++ b/src/features/earn/adapters/svm/svmEarnAdapter.stub.ts @@ -0,0 +1,73 @@ +// Stub until LI.FI's Composer returns SVM vault routes. Replace this file +// with a real implementation; keep the module path so the provider wiring +// doesn't change. +import type { SvmChainDescriptor } from "../../../../chains/types"; +import type { + EarnAdapter, + ExecutionResult, + FetchIdleBalancesArgs, + FetchTokenBalanceArgs, + IdleAsset, + PreparedEarnAction, + PreparedTx, + PrepareDepositArgs, + PrepareWithdrawArgs, + NoApprovalEarnAdapter, +} from "../../adapter/types"; + +const STUB_REASON = + "Solana vault support isn't shipping yet. LI.FI Earn currently indexes EVM pools only; this surface will light up when Solana routes land."; + +const notSupported = (method: string): Error => + new Error(`[SvmEarnAdapter.${method}] ${STUB_REASON}`); + +export function buildSvmEarnAdapterStub(): EarnAdapter { + const adapter: NoApprovalEarnAdapter = { + family: "svm", + supported: false, + unsupportedReason: STUB_REASON, + approvalModel: "none", + + async fetchIdleBalances( + _args: FetchIdleBalancesArgs, + ): Promise[]> { + throw notSupported("fetchIdleBalances"); + }, + + async fetchTokenBalance( + _args: FetchTokenBalanceArgs, + ): Promise { + throw notSupported("fetchTokenBalance"); + }, + + async prepareDeposit( + _args: PrepareDepositArgs, + ): Promise> { + throw notSupported("prepareDeposit"); + }, + + async prepareWithdraw( + _args: PrepareWithdrawArgs, + ): Promise> { + throw notSupported("prepareWithdraw"); + }, + + async submitTx( + _tx: PreparedTx, + ): Promise> { + throw notSupported("submitTx"); + }, + + async waitForTx( + result: ExecutionResult, + ): Promise> { + return result; + }, + + explorerTxUrl() { + return null; + }, + }; + + return adapter; +} diff --git a/src/features/earn/context/EarnAdapterContext.tsx b/src/features/earn/context/EarnAdapterContext.tsx new file mode 100644 index 0000000..70bf933 --- /dev/null +++ b/src/features/earn/context/EarnAdapterContext.tsx @@ -0,0 +1,69 @@ +// useEarnAdapter has a no-provider fallback that returns an unsupported +// value, so the shell renders cleanly under any family route even before +// its provider is wired. +import { createContext, useContext, type ReactNode } from "react"; +import type { ChainFamily } from "../../../chains/types"; +import { useActiveChainFamily } from "../../../hooks/useActiveChainFamily"; +import type { AnyEarnAdapter } from "../adapter/types"; +import { adapterFamilyLabel } from "../adapter/types"; + +export interface EarnAdapterContextValue { + family: ChainFamily; + adapter: AnyEarnAdapter | null; + supported: boolean; + connectedAddress: string | null; + isConnected: boolean; + unsupportedReason: string | null; +} + +const EarnAdapterContext = createContext(null); + +export interface EarnAdapterProviderProps { + family: ChainFamily; + adapter: AnyEarnAdapter | null; + connectedAddress?: string | null; + isConnected?: boolean; + unsupportedReason?: string | null; + children: ReactNode; +} + +export function EarnAdapterProvider({ + family, + adapter, + connectedAddress = null, + isConnected = false, + unsupportedReason = null, + children, +}: EarnAdapterProviderProps) { + return ( + + {children} + + ); +} + +export function useEarnAdapter(): EarnAdapterContextValue { + const activeFamily = useActiveChainFamily(); + const ctx = useContext(EarnAdapterContext); + if (ctx) return ctx; + + return { + family: activeFamily, + adapter: null, + supported: false, + connectedAddress: null, + isConnected: false, + unsupportedReason: `${adapterFamilyLabel( + activeFamily, + )} vaults are not supported for this family yet.`, + }; +} diff --git a/src/features/earn/routes/EarnFeatureRoute.tsx b/src/features/earn/routes/EarnFeatureRoute.tsx new file mode 100644 index 0000000..8036c3d --- /dev/null +++ b/src/features/earn/routes/EarnFeatureRoute.tsx @@ -0,0 +1,41 @@ +import React, { Suspense } from "react"; +import LoadingSpinner from "../../../components/shared/LoadingSpinner"; +import { useActiveChainFamily } from "../../../hooks/useActiveChainFamily"; +import { EarnAdapterProvider } from "../context/EarnAdapterContext"; +import { EvmEarnAdapterProvider } from "../adapters/evm/EvmEarnAdapterProvider"; +import { SvmEarnAdapterProvider } from "../adapters/svm/SvmEarnAdapterProvider"; +import { UnsupportedFamilyCard } from "../shell/UnsupportedFamilyCard"; + +const LifiEarnPage = React.lazy( + () => import("../../../components/integrations/lifi-earn/LifiEarnPage"), +); + +export const EarnFeatureRoute: React.FC = () => { + const family = useActiveChainFamily(); + + if (family === "evm") { + return ( + + }> + + + + ); + } + + if (family === "svm") { + return ( + + + + ); + } + + return ( + + + + ); +}; + +export default EarnFeatureRoute; diff --git a/src/features/earn/shared/formatUnits.ts b/src/features/earn/shared/formatUnits.ts new file mode 100644 index 0000000..508e1a1 --- /dev/null +++ b/src/features/earn/shared/formatUnits.ts @@ -0,0 +1,22 @@ +/** + * Local formatUnits β€” replaces a thin viem import so Earn shell code stays + * off any family-specific SDK. Mirrors viem's semantics closely: it turns a + * raw bigint into a decimal string without trailing zeros being aggressive, + * using exactly `decimals` fractional digits of precision then returning the + * same shape viem would (no scientific notation, no locale formatting). + * + * Callers should NOT use this for user-facing display formatting β€” it's a + * bigint β†’ string converter. Display formatting is the consumer's job. + */ + +export function formatUnits(raw: bigint, decimals: number): string { + if (decimals === 0) return raw.toString(); + const negative = raw < 0n; + const abs = negative ? -raw : raw; + const asStr = abs.toString(); + const pad = asStr.padStart(decimals + 1, "0"); + const whole = pad.slice(0, pad.length - decimals); + const fraction = pad.slice(pad.length - decimals).replace(/0+$/, ""); + const body = fraction.length > 0 ? `${whole}.${fraction}` : whole; + return negative ? `-${body}` : body; +} diff --git a/src/features/earn/shared/normalizeEarnVault.ts b/src/features/earn/shared/normalizeEarnVault.ts new file mode 100644 index 0000000..7b449e2 --- /dev/null +++ b/src/features/earn/shared/normalizeEarnVault.ts @@ -0,0 +1,14 @@ +// Single swap-point for mapping an EarnVault to a family-scoped ChainKey. +// When LI.FI adds SVM pools, map them here to `svm:${cluster}` β€” nowhere +// else in the codebase. +import type { EarnVault } from "../../../components/integrations/lifi-earn/types"; +import { toEvmChainKey } from "../../../chains/types/evm"; + +export function normalizeEarnVault(raw: EarnVault): EarnVault { + if (raw.chainKey) return raw; + return { ...raw, chainKey: toEvmChainKey(raw.chainId) }; +} + +export function normalizeEarnVaults(raw: readonly EarnVault[]): EarnVault[] { + return raw.map(normalizeEarnVault); +} diff --git a/src/features/earn/shell/UnsupportedFamilyCard.tsx b/src/features/earn/shell/UnsupportedFamilyCard.tsx new file mode 100644 index 0000000..69f4737 --- /dev/null +++ b/src/features/earn/shell/UnsupportedFamilyCard.tsx @@ -0,0 +1,31 @@ +import React from "react"; +import { Lightning } from "@phosphor-icons/react"; +import { useEarnAdapter } from "../context/EarnAdapterContext"; +import { adapterFamilyLabel } from "../adapter/types"; + +export const UnsupportedFamilyCard: React.FC = () => { + const { family, unsupportedReason } = useEarnAdapter(); + + return ( +
+
+ +
+

+ {adapterFamilyLabel(family)} +

+

+ LI.FI Earn not available here +

+

+ {unsupportedReason ?? + `${adapterFamilyLabel(family)} vaults are not supported yet.`} +

+

+ EVM vaults continue to work on the /evm route. +

+
+ ); +}; + +export default UnsupportedFamilyCard; diff --git a/src/hooks/useActiveChainDescriptor.ts b/src/hooks/useActiveChainDescriptor.ts new file mode 100644 index 0000000..a89384e --- /dev/null +++ b/src/hooks/useActiveChainDescriptor.ts @@ -0,0 +1,27 @@ +import { useMemo } from "react"; +import type { ChainDescriptor, EvmChainDescriptor } from "../chains/types"; +import { useActiveChainFamily } from "./useActiveChainFamily"; +import { CHAIN_REGISTRY } from "../chains/registry"; +import { toEvmChainKey, parseEvmChainId } from "../chains/types/evm"; + +// Returns Ethereum mainnet for the EVM family and null for the rest. +// Tools that need the user's selected network still go through +// ExtendedChain / NetworkSelector β€” the descriptor becomes load-bearing +// once adapters expose createRpcClient / createExplorerClient. +export function useActiveChainDescriptor(): ChainDescriptor | null { + const family = useActiveChainFamily(); + + return useMemo(() => { + if (family !== "evm") return null; + const mainnet = CHAIN_REGISTRY.find((chain) => chain.id === 1); + if (!mainnet) return null; + const descriptor: EvmChainDescriptor = { + chainFamily: "evm", + key: toEvmChainKey(mainnet.id), + chainId: parseEvmChainId(mainnet.id), + name: mainnet.name, + nativeCurrency: mainnet.nativeCurrency, + }; + return descriptor; + }, [family]); +} diff --git a/src/hooks/useActiveChainFamily.ts b/src/hooks/useActiveChainFamily.ts new file mode 100644 index 0000000..69e2fb6 --- /dev/null +++ b/src/hooks/useActiveChainFamily.ts @@ -0,0 +1,11 @@ +import { useLocation } from "react-router-dom"; +import { useMemo } from "react"; +import type { ChainFamily } from "../chains/types"; +import { DEFAULT_FAMILY, parseFamilyFromPath } from "../routes/familyRoutes"; + +// Falls back to DEFAULT_FAMILY for `/`, `/simulation/:id`, and legacy +// flat paths that the redirect hasn't replaced yet. +export function useActiveChainFamily(): ChainFamily { + const { pathname } = useLocation(); + return useMemo(() => parseFamilyFromPath(pathname) ?? DEFAULT_FAMILY, [pathname]); +} diff --git a/src/main.tsx b/src/main.tsx index 0e82b2f..b1aaa11 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -8,28 +8,21 @@ import App from "./App.tsx"; // Configure Monaco CDN once at app startup configureMonacoCdn(); -import { - queryClient, - RainbowKitProvider, - QueryClientProvider, - web3ToolkitTheme, - RpcAwareWagmiProvider -} from './config/rainbowkit'; + +// wagmi + RainbowKit are scoped to /evm/* via EvmFamilyProviders; imported +// separately from QueryClient so main.tsx doesn't transitively load them. +import { queryClient, QueryClientProvider } from "./config/queryClient"; import { NetworkConfigProvider } from "./contexts/NetworkConfigContext"; createRoot(document.getElementById("root")!).render( - - - - - - - - - + + + + + diff --git a/src/routes/familyRoutes.ts b/src/routes/familyRoutes.ts new file mode 100644 index 0000000..7cd5a2e --- /dev/null +++ b/src/routes/familyRoutes.ts @@ -0,0 +1,65 @@ +import type { ChainFamily } from "../chains/types"; + +export const FAMILY_PREFIXES: Record = { + evm: "/evm", + starknet: "/starknet", + svm: "/solana", +}; + +export const DEFAULT_FAMILY: ChainFamily = "evm"; + +// Legacy flat paths redirect to /evm/. Keep in sync with TOOL_REGISTRY. +export const LEGACY_EVM_PATHS = [ + "/builder", + "/database", + "/explorer", + "/integrations", + "/simulations", +] as const; + +export function parseFamilyFromPath(pathname: string): ChainFamily | null { + for (const family of Object.keys(FAMILY_PREFIXES) as ChainFamily[]) { + const prefix = FAMILY_PREFIXES[family]; + if (pathname === prefix || pathname.startsWith(`${prefix}/`)) { + return family; + } + } + return null; +} + +export function stripFamilyPrefix(pathname: string): string { + const family = parseFamilyFromPath(pathname); + if (!family) return pathname; + const prefix = FAMILY_PREFIXES[family]; + const rest = pathname.slice(prefix.length); + return rest.length === 0 ? "/" : rest; +} + +export function buildFamilyPath(family: ChainFamily, path: string): string { + const prefix = FAMILY_PREFIXES[family]; + if (path === "/" || path === "") return prefix; + const normalized = path.startsWith("/") ? path : `/${path}`; + return `${prefix}${normalized}`; +} + +// Shape matches react-router's `To` so it can be passed to { + const cursorReq = store.openCursor(); + cursorReq.onsuccess = (ev) => { + const cursor = (ev.target as IDBRequest).result; + if (!cursor) return; + const row = cursor.value; + if (!row.chainFamily) { + row.chainFamily = 'evm'; + row.chainKey = `evm:${row.networkId ?? 1}`; + row.schemaVersion = ROW_SCHEMA_VERSION; + cursor.update(row); + } + cursor.continue(); + }; + }; + backfill(simStore); + backfill(metaStore); + } + } }; }).then(() => this.migrateMetaStore()); @@ -394,10 +443,16 @@ class SimulationHistoryService { const networkId = contractContext?.networkId || result.chainId || 1; const networkName = contractContext?.networkName || result.networkName || 'Unknown'; + const chainFamily: 'evm' | 'starknet' | 'svm' = contractContext?.chainFamily ?? 'evm'; + const chainKey: string = contractContext?.chainKey ?? `evm:${networkId}`; + const simulation: StoredSimulation = { id, timestamp: Date.now(), status, + schemaVersion: ROW_SCHEMA_VERSION, + chainFamily, + chainKey, from: contractContext?.fromAddress || result.from || '0x0000000000000000000000000000000000000000', to: contractContext?.address || result.to || '', functionName, diff --git a/src/shims/tongo-sdk.ts b/src/shims/tongo-sdk.ts new file mode 100644 index 0000000..3728744 --- /dev/null +++ b/src/shims/tongo-sdk.ts @@ -0,0 +1,12 @@ +/** + * Stub for the starkzap@2 optional peer dep `@fatsolutions/tongo-sdk`. The + * confidential-payments module in starkzap imports `Account` from this SDK; + * we don't use confidential payments, so the code path never runs β€” but + * Rollup needs the symbol to resolve at build time. + */ +export class Account { + constructor() { + throw new Error("tongo-sdk not installed (confidential payments disabled)"); + } +} +export default { Account }; diff --git a/src/types/chain.ts b/src/types/chain.ts index e6e260e..5aa2866 100644 --- a/src/types/chain.ts +++ b/src/types/chain.ts @@ -1,3 +1,5 @@ +import type { EvmChainKey } from "../chains/types/evm"; + export interface ExplorerAPI { name: string; url: string; @@ -6,8 +8,12 @@ export interface ExplorerAPI { export type ExplorerSource = 'sourcify' | 'blockscout' | 'etherscan'; +// Legacy EVM-only chain shape. chainFamily + chainKey added so generic +// code can route by family without breaking the numeric-id consumers. export interface Chain { id: number; + chainFamily: 'evm'; + chainKey: EvmChainKey; name: string; rpcUrl: string; explorerUrl?: string; diff --git a/vite.config.ts b/vite.config.ts index 7339f40..8346f24 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,9 +1,67 @@ import { defineConfig, loadEnv, type Plugin } from "vite"; import react from "@vitejs/plugin-react"; import tailwindcss from "@tailwindcss/vite"; +import wasm from "vite-plugin-wasm"; import path from "path"; +import fs from "node:fs"; import { handleEtherscanLookup } from "./api/explorer/etherscanShared"; +/** + * Routes `import "ethers"` from inside starkzap@2 and its @avnu/avnu-sdk + * dep to the ethers@6 alias package. Our app code keeps resolving ethers + * to v5 (20+ files depend on it); starkzap@2's swap/bridge paths get the + * v6 APIs (`toBeHex`, `parseUnits`) they need to build. + * + * Matches on the owning package name by walking the importer path up to + * its nearest package.json, which survives pnpm's .pnpm virtual store, + * Windows backslashes, and symlinked workspaces β€” all of which defeat a + * naive `importer.includes("/node_modules/pkg/")` match. + */ +const REDIRECT_PACKAGES = new Set(["starkzap", "@avnu/avnu-sdk"]); + +function starkzapEthersV6(): Plugin { + const packageNameCache = new Map(); + + function packageNameFor(filePath: string): string | null { + const normalized = filePath.split(path.sep).join("/"); + let dir = path.dirname(normalized); + while (true) { + const cached = packageNameCache.get(dir); + if (cached !== undefined) return cached; + try { + const { name } = JSON.parse( + fs.readFileSync(path.join(dir, "package.json"), "utf8"), + ) as { name?: string }; + const resolved = typeof name === "string" ? name : null; + packageNameCache.set(dir, resolved); + return resolved; + } catch { + // no package.json here (or malformed) β€” walk up + } + const parent = path.dirname(dir); + if (parent === dir) { + packageNameCache.set(dir, null); + return null; + } + dir = parent; + } + } + + return { + name: "starkzap-ethers-v6", + enforce: "pre", + async resolveId(source, importer) { + if (source !== "ethers" || !importer) return null; + const owner = packageNameFor(importer); + if (owner && REDIRECT_PACKAGES.has(owner)) { + const v6 = await this.resolve("ethers-v6", importer, { skipSelf: true }); + if (v6) return v6; + } + return null; + }, + }; +} + /** * Injects the EDB bridge origin into the CSP connect-src at build time. * Set VITE_SIMULATOR_BRIDGE_URL in your Vercel env vars and the CSP @@ -149,6 +207,13 @@ export default defineConfig(({ mode }) => { include: "**/*.{jsx,tsx}", }), tailwindcss(), + // wasm() handles @cartridge/controller's WASM module. Do NOT add + // vite-plugin-top-level-await β€” its transform rewrites `export + // function foo()` to an assignment without reordering preceding + // `foo.something = ...` statements, breaking wagmi's `injected.type` + // pattern at runtime. Native TLA support via `build.target: esnext`. + wasm(), + starkzapEthersV6(), injectBridgeCsp(), devExplorerProxy(), llmProxyPlugin(env), @@ -162,9 +227,49 @@ export default defineConfig(({ mode }) => { "process.env": "{}", }, optimizeDeps: { - include: ["ethers", "buffer"], + // Pre-bundle these so CJS deps get ESM-normalized interop in dev. + // @avnu/avnu-sdk reaches into `dayjs`, `qs`, `moment`, `zod` (all CJS) + // and `ethers` (esbuild plugin below redirects this subtree to v6). + include: [ + "ethers", + "ethers-v6", + "buffer", + "@avnu/avnu-sdk", + "dayjs", + "qs", + "moment", + "zod", + ], + // starkzap itself stays excluded β€” its Cartridge module uses WASM + // + top-level await, which esbuild's pre-bundler can't normalize. + exclude: ["starkzap"], + esbuildOptions: { + // Mirror `starkzapEthersV6` at the esbuild layer so pre-bundle of + // @avnu/avnu-sdk resolves ethers to v6 (Rollup-style resolveId + // hooks don't fire during Vite's esbuild pre-bundle). + plugins: [ + { + name: "avnu-ethers-v6-esbuild", + setup(build) { + build.onResolve({ filter: /^ethers$/ }, async (args) => { + if (!args.importer.includes("/@avnu/avnu-sdk/")) return; + const resolved = await build.resolve("ethers-v6", { + resolveDir: args.resolveDir, + kind: args.kind, + }); + if (resolved.errors.length === 0) return resolved; + }); + }, + }, + ], + }, }, build: { + // es2022 is the lowest ECMAScript target that preserves native + // top-level await in the emitted output. Lets us ship without + // vite-plugin-top-level-await (whose transform breaks wagmi β€” see + // plugin list above). + target: "es2022", chunkSizeWarningLimit: 1200, rollupOptions: { output: { @@ -177,6 +282,7 @@ export default defineConfig(({ mode }) => { "@reown/appkit-controllers", ], ethers: ["ethers"], + starkzap: ["starkzap", "@avnu/avnu-sdk", "ethers-v6"], }, }, }, @@ -185,6 +291,13 @@ export default defineConfig(({ mode }) => { alias: { buffer: "buffer", "@": path.resolve(__dirname, "./src"), + // starkzap@2 pulls `Account` from tongo-sdk for its confidential- + // payments module. We don't use that feature; point at a stub so + // the build can resolve the symbol. + "@fatsolutions/tongo-sdk": path.resolve( + __dirname, + "./src/shims/tongo-sdk.ts", + ), }, }, server: { From ec71696d2c40a33089273164f374d1ec6e5f930f Mon Sep 17 00:00:00 2001 From: Timidan Date: Fri, 24 Apr 2026 23:39:36 +0100 Subject: [PATCH 02/71] chore(starknet-sim): mount engine as gitlink, wire proxies and dev server Branched from feat/phase4-wallet-gate so all Starknet wallet work is already in place. Engine repo Timidan/starknet-sim is consumed as a bare gitlink at starknet-sim/ (matching edb/), with no .gitmodules entry; the gitlink SHA is the contract. - vercel.json: /api/starknet-sim and /api/starknet-sim/:path* route to api/starknet-sim-proxy.ts - api/starknet-sim-proxy.ts: fork of api/edb-proxy.ts with the STARKNET_SIM_BRIDGE_URL / STARKNET_SIM_API_KEY / STARKNET_SIM_CORS_ALLOWED_ORIGINS env surface, upstream header allowlist, 50 MB body cap, SSE pass-through, no etherscan-key injection - vite.config.ts: injectBridgeCsp now splices both VITE_SIMULATOR_BRIDGE_URL and VITE_STARKNET_SIM_BRIDGE_URL origins; new /api/starknet-sim dev proxy rewrites to :5790 and injects X-API-Key server-side - src/utils/env.ts: getStarknetSimBridgeUrl() helper mirrors getSimulatorBridgeUrl() - package.json: starknet-sim:build and starknet-sim:server scripts - .env.example: documents the four new env vars - starknet-sim/ gitlink at engine commit 1497f0d46cae (initial scaffold) --- .env.example | 10 ++ api/starknet-sim-proxy.ts | 200 ++++++++++++++++++++++++++++++++++++++ package.json | 2 + src/utils/env.ts | 18 ++++ starknet-sim | 1 + vercel.json | 8 ++ vite.config.ts | 50 +++++++--- 7 files changed, 276 insertions(+), 13 deletions(-) create mode 100644 api/starknet-sim-proxy.ts create mode 160000 starknet-sim diff --git a/.env.example b/.env.example index 6a9964e..21c2fcc 100644 --- a/.env.example +++ b/.env.example @@ -14,6 +14,16 @@ VITE_WALLETCONNECT_PROJECT_ID=your-walletconnect-project-id # EDB_API_KEY β€” Secret key that the Vercel proxy injects into bridge requests # EDB_CORS_ALLOWED_ORIGINS β€” Comma-separated extra origins for the edb proxy (e.g. https://yourdomain.com) +# Starknet Simulator Bridge (client-side override β€” defaults to /api/starknet-sim) +# For local dev, Vite proxies /api/starknet-sim to http://127.0.0.1:5790 automatically. +# Set to "disabled" to turn off the Starknet sim integration entirely. +# VITE_STARKNET_SIM_BRIDGE_URL=/api/starknet-sim + +# Starknet Simulator Bridge (server-side, used by the Vercel proxy) +# STARKNET_SIM_BRIDGE_URL β€” Full URL of the bridge (e.g. https://sim-sn.your-domain:5790) +# STARKNET_SIM_API_KEY β€” Secret key injected by the Vercel proxy as X-API-Key +# STARKNET_SIM_CORS_ALLOWED_ORIGINS β€” Comma-separated extra origins for the starknet-sim proxy + # Etherscan # ETHERSCAN_API_KEY β€” Default server-side explorer key used by the Etherscan-family proxy diff --git a/api/starknet-sim-proxy.ts b/api/starknet-sim-proxy.ts new file mode 100644 index 0000000..ff33777 --- /dev/null +++ b/api/starknet-sim-proxy.ts @@ -0,0 +1,200 @@ +import type { VercelRequest, VercelResponse } from "@vercel/node"; + +export const config = { + api: { bodyParser: false }, + maxDuration: 300, +}; + +const MAX_BODY_BYTES = 50 * 1024 * 1024; // 50 MB β€” matches EDB +const FETCH_TIMEOUT_MS = 120_000; +const ALLOWED_METHODS = new Set(["GET", "POST", "OPTIONS", "HEAD"]); + +const DEFAULT_ALLOWED_ORIGINS = new Set([ + "http://localhost:5173", + "http://127.0.0.1:5173", + "http://localhost:4173", + "http://127.0.0.1:4173", +]); + +function resolveAllowedOrigin( + origin: string | undefined, + host?: string, +): string | null { + if (!origin) return null; + if (DEFAULT_ALLOWED_ORIGINS.has(origin)) return origin; + if (host && origin === `https://${host}`) return origin; + const extra = process.env.STARKNET_SIM_CORS_ALLOWED_ORIGINS; + if (extra) { + const list = extra + .split(",") + .map((s) => s.trim()) + .filter(Boolean); + if (list.includes(origin)) return origin; + } + return null; +} + +function applyCors(req: VercelRequest, res: VercelResponse) { + const origin = + typeof req.headers.origin === "string" ? req.headers.origin : undefined; + const host = + typeof req.headers.host === "string" ? req.headers.host : undefined; + const allowed = resolveAllowedOrigin(origin, host); + if (allowed) { + res.setHeader("Access-Control-Allow-Origin", allowed); + res.setHeader("Vary", "Origin"); + res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS, HEAD"); + res.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); + res.setHeader("Access-Control-Max-Age", "600"); + } +} + +function getRawBody(req: VercelRequest): Promise { + return new Promise((resolve, reject) => { + const chunks: Buffer[] = []; + let total = 0; + req.on("data", (chunk: Buffer) => { + total += chunk.length; + if (total > MAX_BODY_BYTES) { + req.destroy(); + reject(new Error("body_too_large")); + return; + } + chunks.push(chunk); + }); + req.on("end", () => resolve(Buffer.concat(chunks))); + req.on("error", reject); + }); +} + +export default async function handler(req: VercelRequest, res: VercelResponse) { + applyCors(req, res); + + const bridgeUrl = process.env.STARKNET_SIM_BRIDGE_URL; + const apiKey = process.env.STARKNET_SIM_API_KEY; + + if (!bridgeUrl || !apiKey) { + return res.status(503).json({ error: "bridge_not_configured" }); + } + + if (req.method === "OPTIONS") { + res.status(204).end(); + return; + } + + const reqOrigin = + typeof req.headers.origin === "string" ? req.headers.origin : undefined; + const reqHost = + typeof req.headers.host === "string" ? req.headers.host : undefined; + if (reqOrigin && !resolveAllowedOrigin(reqOrigin, reqHost)) { + return res.status(403).json({ error: "origin_required" }); + } + + if (!ALLOWED_METHODS.has(req.method || "GET")) { + return res.status(405).json({ error: "method_not_allowed" }); + } + + const pathParam = req.query?.path; + const subPath = Array.isArray(pathParam) + ? pathParam.join("/") + : typeof pathParam === "string" + ? pathParam + : ""; + + const parts = subPath ? subPath.split("/") : []; + for (const seg of parts) { + if (seg === "." || seg === ".." || /[^a-zA-Z0-9_\-:.]/.test(seg)) { + return res.status(400).json({ error: "invalid_path" }); + } + } + + const target = `${bridgeUrl.replace(/\/+$/, "")}/${subPath}`; + + const upstreamHeaders: Record = { + "X-API-Key": apiKey, + }; + const ct = req.headers["content-type"]; + if (ct) upstreamHeaders["Content-Type"] = Array.isArray(ct) ? ct[0] : ct; + const accept = req.headers["accept"]; + if (accept) upstreamHeaders["Accept"] = Array.isArray(accept) ? accept[0] : accept; + const acceptEncoding = req.headers["accept-encoding"]; + if (acceptEncoding) + upstreamHeaders["Accept-Encoding"] = Array.isArray(acceptEncoding) + ? acceptEncoding[0] + : acceptEncoding; + + try { + const rawBody = + req.method !== "GET" && req.method !== "HEAD" + ? await getRawBody(req) + : undefined; + + // SSE path (Sprint 3 step-through) β€” no hard timeout, abort on client disconnect + const isSSE = /^step\/[^/]+\/events$/.test(subPath); + const controller = new AbortController(); + + if (isSSE) { + req.on("close", () => controller.abort()); + } else { + const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS); + req.on("close", () => clearTimeout(timer)); + } + + const upstream = await fetch(target, { + method: req.method || "GET", + headers: upstreamHeaders, + body: rawBody, + signal: controller.signal, + redirect: "error", + }); + + const contentType = upstream.headers.get("content-type") || ""; + if (contentType.includes("text/event-stream") && upstream.body) { + res.setHeader("Content-Type", "text/event-stream"); + res.setHeader("Cache-Control", "no-cache"); + res.setHeader("Connection", "keep-alive"); + res.setHeader("X-Accel-Buffering", "no"); + + const reader = upstream.body.getReader(); + const decoder = new TextDecoder(); + try { + for (;;) { + const { done, value } = await reader.read(); + if (done) break; + res.write(decoder.decode(value, { stream: true })); + } + } catch { + // client disconnected or upstream closed + } finally { + reader.cancel().catch(() => {}); + res.end(); + } + return; + } + + res.status(upstream.status); + + const upstreamContentType = upstream.headers.get("content-type"); + if (upstreamContentType) res.setHeader("content-type", upstreamContentType); + const upstreamVary = upstream.headers.get("vary"); + if (upstreamVary) { + const existing = res.getHeader("Vary"); + res.setHeader( + "Vary", + existing ? `${existing}, ${upstreamVary}` : upstreamVary, + ); + } + + const buf = Buffer.from(await upstream.arrayBuffer()); + res.send(buf); + } catch (err: unknown) { + if (err instanceof Error && err.message === "body_too_large") { + return res.status(413).json({ error: "body_too_large" }); + } + if (err instanceof Error && err.name === "AbortError") { + return res.status(504).json({ error: "bridge_timeout" }); + } + console.error("[starknet-sim] upstream error:", err); + res.status(502).json({ error: "bridge_unreachable" }); + } +} diff --git a/package.json b/package.json index bd07153..245a60e 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,8 @@ "qa:live:matrix": "node scripts/perf/live-qa-matrix.mjs", "probe:testnets": "node scripts/testnet-probe.js", "simulator:server": "node scripts/simulator-bridge.mjs", + "starknet-sim:build": "cargo build --release --manifest-path starknet-sim/Cargo.toml", + "starknet-sim:server": "./starknet-sim/target/release/starknet-sim-bridge", "preview": "vite preview", "check:inline-copy": "node scripts/check-inline-copy.mjs", "check:family-imports": "node scripts/check-family-imports.mjs" diff --git a/src/utils/env.ts b/src/utils/env.ts index f150a6d..702b7ed 100644 --- a/src/utils/env.ts +++ b/src/utils/env.ts @@ -31,6 +31,24 @@ export const getSimulatorBridgeUrl = () => { return value; }; +export const getStarknetSimBridgeUrl = () => { + const value = readEnv( + ["VITE_STARKNET_SIM_BRIDGE_URL"], + "/api/starknet-sim" + ); + + if (!value) { + return ""; + } + + const normalized = value.trim().toLowerCase(); + if (["disabled", "disable", "off", "false", "none"].includes(normalized)) { + return ""; + } + + return value; +}; + /** Returns default headers for bridge requests. API key is injected server-side by the proxy. */ export const getBridgeHeaders = (extra?: Record): Record => { return { 'Content-Type': 'application/json', ...extra }; diff --git a/starknet-sim b/starknet-sim new file mode 160000 index 0000000..1497f0d --- /dev/null +++ b/starknet-sim @@ -0,0 +1 @@ +Subproject commit 1497f0d46cae3e2657bd7ed81a006fe7e9c7f62f diff --git a/vercel.json b/vercel.json index 533b97e..b658045 100644 --- a/vercel.json +++ b/vercel.json @@ -8,6 +8,14 @@ "source": "/api/edb/:path*", "destination": "/api/edb-proxy?path=:path*" }, + { + "source": "/api/starknet-sim", + "destination": "/api/starknet-sim-proxy" + }, + { + "source": "/api/starknet-sim/:path*", + "destination": "/api/starknet-sim-proxy?path=:path*" + }, { "source": "/api/sourcify/repository/:path*", "destination": "https://repo.sourcify.dev/:path*" diff --git a/vite.config.ts b/vite.config.ts index 8346f24..5783cdd 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -63,25 +63,34 @@ function starkzapEthersV6(): Plugin { } /** - * Injects the EDB bridge origin into the CSP connect-src at build time. - * Set VITE_SIMULATOR_BRIDGE_URL in your Vercel env vars and the CSP - * automatically allows connections to that origin. + * Injects bridge origins into the CSP connect-src at build time. + * - VITE_SIMULATOR_BRIDGE_URL for the EDB bridge + * - VITE_STARKNET_SIM_BRIDGE_URL for the Starknet sim bridge + * A value of "disabled" skips injection for that bridge. */ function injectBridgeCsp(): Plugin { return { name: "inject-bridge-csp", transformIndexHtml(html) { - const bridgeUrl = process.env.VITE_SIMULATOR_BRIDGE_URL; - if (!bridgeUrl || bridgeUrl === "disabled") return html; - try { - const origin = new URL(bridgeUrl).origin; - return html.replace( - /(connect-src\s[^"]*?)(;)/, - `$1 ${origin} wss://${new URL(bridgeUrl).host}$2`, - ); - } catch { - return html; + const origins: string[] = []; + for (const envVar of [ + "VITE_SIMULATOR_BRIDGE_URL", + "VITE_STARKNET_SIM_BRIDGE_URL", + ]) { + const value = process.env[envVar]; + if (!value || value === "disabled") continue; + try { + const parsed = new URL(value); + origins.push(parsed.origin, `wss://${parsed.host}`); + } catch { + // Relative paths like "/api/starknet-sim" don't need CSP changes + } } + if (origins.length === 0) return html; + return html.replace( + /(connect-src\s[^"]*?)(;)/, + `$1 ${origins.join(" ")}$2`, + ); }, }; } @@ -328,6 +337,21 @@ export default defineConfig(({ mode }) => { }); }, }, + // Proxy for Starknet simulator bridge β€” mirrors the EDB proxy: strips + // /api/starknet-sim, forwards to STARKNET_SIM_BRIDGE_URL (defaults to + // the local binary on :5790), injects X-API-Key server-side. + "/api/starknet-sim": { + target: env.STARKNET_SIM_BRIDGE_URL || "http://127.0.0.1:5790", + changeOrigin: true, + secure: true, + rewrite: (path) => path.replace(/^\/api\/starknet-sim/, ""), + configure: (proxy) => { + const apiKey = env.STARKNET_SIM_API_KEY || ""; + proxy.on("proxyReq", (proxyReq) => { + if (apiKey) proxyReq.setHeader("X-API-Key", apiKey); + }); + }, + }, // Proxy for Sourcify Repository API (must be BEFORE the general /api/sourcify) // repo.sourcify.dev now 307-redirects to sourcify.dev/server/repository, // so target the new location directly to avoid redirect/CORS issues. From 3c737a4e0cc5069fc36984e26aeda47266bac737 Mon Sep 17 00:00:00 2001 From: Timidan Date: Fri, 24 Apr 2026 23:49:58 +0100 Subject: [PATCH 03/71] =?UTF-8?q?feat(=C2=A78,=C2=A79):=20browser=20simula?= =?UTF-8?q?tor=20client,=20types,=20footer=20status?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - src/chains/starknet/simulatorTypes.ts: canonical type mirrors of the bridge JSON schemas (SimulateRequest/Response, FunctionInvocation recursive tree, FeeEstimate, StateDiff, BridgeErrorEnvelope, health/version shapes) - src/chains/starknet/simulatorClient.ts: StarknetSimulator class with health/version/simulate/trace/estimate-fee; AbortController timeouts (60s default, 3s for /health), bridge-envelope error mapping, self-disable when VITE_STARKNET_SIM_BRIDGE_URL=disabled - src/components/StarknetSimBridgeStatus.tsx: footer dot polling /health every 12s with a 3s timeout, reuses existing .edb-status-indicator CSS classes; surfaces git_sha in tooltip - starknet-sim gitlink bumped to c2e0ae4 (auth middleware, rate limiter, route skeleton returning NOT_IMPLEMENTED for Β§2/Β§3 endpoints) The footer component is not yet mounted in the layout; the active phase4 wallet work owns the footer container and isn't on origin yet. Mounting is a one-line drop-in next to EdbBridgeStatus once phase4 merges. --- src/chains/starknet/simulatorClient.ts | 159 ++++++++++++++++++ src/chains/starknet/simulatorTypes.ts | 183 +++++++++++++++++++++ src/components/StarknetSimBridgeStatus.tsx | 114 +++++++++++++ starknet-sim | 2 +- 4 files changed, 457 insertions(+), 1 deletion(-) create mode 100644 src/chains/starknet/simulatorClient.ts create mode 100644 src/chains/starknet/simulatorTypes.ts create mode 100644 src/components/StarknetSimBridgeStatus.tsx diff --git a/src/chains/starknet/simulatorClient.ts b/src/chains/starknet/simulatorClient.ts new file mode 100644 index 0000000..1c9319a --- /dev/null +++ b/src/chains/starknet/simulatorClient.ts @@ -0,0 +1,159 @@ +import { getBridgeHeaders, getStarknetSimBridgeUrl } from "@/utils/env"; +import type { + BridgeErrorEnvelope, + HealthResponse, + SimulateRequest, + SimulateResponse, + VersionResponse, +} from "./simulatorTypes"; + +const DEFAULT_TIMEOUT_MS = 60_000; +const HEALTH_TIMEOUT_MS = 3_000; + +export class StarknetSimulatorBridgeError extends Error { + code: string; + status: number; + + constructor(code: string, message: string, status: number) { + super(message); + this.name = "StarknetSimulatorBridgeError"; + this.code = code; + this.status = status; + } +} + +export class StarknetSimulator { + private readonly base: string; + + constructor(baseUrl?: string) { + this.base = (baseUrl ?? getStarknetSimBridgeUrl()).replace(/\/+$/, ""); + } + + /** Whether the bridge is configured (client not in "disabled" mode). */ + get isConfigured(): boolean { + return this.base.length > 0; + } + + async health(signal?: AbortSignal): Promise { + return this.request("GET", "/health", undefined, { + signal, + timeoutMs: HEALTH_TIMEOUT_MS, + }); + } + + async version(signal?: AbortSignal): Promise { + return this.request("GET", "/version", undefined, { + signal, + }); + } + + async simulate( + req: SimulateRequest, + opts?: { signal?: AbortSignal; timeoutMs?: number }, + ): Promise { + return this.request("POST", "/simulate", req, opts); + } + + async trace( + txHash: string, + opts?: { signal?: AbortSignal; timeoutMs?: number }, + ): Promise { + return this.request( + "POST", + `/trace/${encodeURIComponent(txHash)}`, + {}, + opts, + ); + } + + async estimateFee( + req: SimulateRequest, + opts?: { signal?: AbortSignal; timeoutMs?: number }, + ): Promise { + return this.request("POST", "/estimate-fee", req, opts); + } + + private async request( + method: "GET" | "POST", + path: string, + body?: unknown, + opts?: { signal?: AbortSignal; timeoutMs?: number }, + ): Promise { + if (!this.isConfigured) { + throw new StarknetSimulatorBridgeError( + "BRIDGE_DISABLED", + "Starknet simulator bridge is disabled", + 0, + ); + } + const controller = new AbortController(); + const timeoutMs = opts?.timeoutMs ?? DEFAULT_TIMEOUT_MS; + const timer = setTimeout(() => controller.abort(), timeoutMs); + if (opts?.signal) { + opts.signal.addEventListener("abort", () => controller.abort(), { + once: true, + }); + } + + const url = `${this.base}${path}`; + try { + const res = await fetch(url, { + method, + headers: getBridgeHeaders(), + body: body !== undefined && method === "POST" ? JSON.stringify(body) : undefined, + signal: controller.signal, + credentials: "same-origin", + }); + const text = await res.text(); + const parsed = tryParseJson(text); + if (!res.ok) { + if (isBridgeEnvelope(parsed)) { + throw new StarknetSimulatorBridgeError( + parsed.error.code, + parsed.error.message, + res.status, + ); + } + throw new StarknetSimulatorBridgeError( + "HTTP_ERROR", + `HTTP ${res.status}`, + res.status, + ); + } + return parsed as T; + } catch (err) { + if (err instanceof StarknetSimulatorBridgeError) throw err; + if (err instanceof Error && err.name === "AbortError") { + throw new StarknetSimulatorBridgeError( + "CLIENT_TIMEOUT", + `Request to ${path} timed out after ${timeoutMs} ms`, + 0, + ); + } + throw new StarknetSimulatorBridgeError( + "NETWORK_ERROR", + err instanceof Error ? err.message : String(err), + 0, + ); + } finally { + clearTimeout(timer); + } + } +} + +function tryParseJson(text: string): unknown { + try { + return JSON.parse(text); + } catch { + return text; + } +} + +function isBridgeEnvelope(value: unknown): value is BridgeErrorEnvelope { + return ( + !!value && + typeof value === "object" && + "error" in (value as Record) && + typeof (value as { error: unknown }).error === "object" + ); +} diff --git a/src/chains/starknet/simulatorTypes.ts b/src/chains/starknet/simulatorTypes.ts new file mode 100644 index 0000000..46aa60f --- /dev/null +++ b/src/chains/starknet/simulatorTypes.ts @@ -0,0 +1,183 @@ +// Canonical type mirrors of the bridge JSON schemas. See +// starknet-sim/crates/bridge/src/http/*.rs for the authoritative shapes and +// tasks/starknet-research/02-simulator-architecture.md for the rationale. + +export type BlockIdTag = "latest"; +export type BlockId = + | { tag: BlockIdTag } + | { blockNumber: number } + | { blockHash: string }; + +export type SimulationFlag = "SKIP_VALIDATE" | "SKIP_FEE_CHARGE"; + +export type StarknetTxVersion = "0x1" | "0x2" | "0x3"; + +export interface ResourceBounds { + maxAmount: string; + maxPricePerUnit: string; +} + +export interface InvokeV3 { + type: "INVOKE"; + version: "0x3"; + senderAddress: string; + calldata: string[]; + signature: string[]; + nonce: string; + resourceBounds: { + l1Gas: ResourceBounds; + l2Gas: ResourceBounds; + }; + tip?: string; + paymasterData?: string[]; + nonceDataAvailabilityMode?: "L1" | "L2"; + feeDataAvailabilityMode?: "L1" | "L2"; +} + +export type StarknetTx = InvokeV3; + +export interface EnrichFlags { + decodeCalldata?: boolean; + decodeEvents?: boolean; + includeStorageReads?: boolean; +} + +export interface SimulateRequest { + blockId: BlockId; + transactions: StarknetTx[]; + simulationFlags?: SimulationFlag[]; + enrich?: EnrichFlags; +} + +export interface ExecutionResources { + steps: number; + memoryHoles: number; + builtinInstanceCounter: Record; + l1Gas: number; + l1DataGas: number; + l2Gas: number; +} + +export interface FeeEstimate { + l1GasConsumed: string; + l1DataGasConsumed: string; + l2GasConsumed: string; + overallFee: string; + unit: "WEI" | "FRI"; +} + +export interface GasPrice { + priceInWei: string; + priceInFri: string; +} + +export interface BlockContext { + blockNumber: number; + blockHash: string; + timestamp: number; + sequencerAddress: string; + starknetVersion: string; + l1GasPrice: GasPrice; + l1DataGasPrice: GasPrice; +} + +export interface StateDiff { + storageDiffs: Array<{ + address: string; + storageEntries: Array<{ key: string; value: string }>; + }>; + nonces: Array<{ contractAddress: string; nonce: string }>; + deployedContracts: Array<{ address: string; classHash: string }>; + declaredClasses: Array<{ classHash: string; compiledClassHash: string }>; + replacedClasses: Array<{ contractAddress: string; classHash: string }>; +} + +export interface SimulationEvent { + fromAddress: string; + keys: string[]; + data: string[]; + decoded?: { name: string; args: Record }; +} + +export interface L2ToL1Message { + fromAddress: string; + toAddress: string; + payload: string[]; +} + +export interface FunctionInvocation { + contractAddress: string; + entryPointSelector: string; + calldata: string[]; + callerAddress: string; + classHash: string; + entryPointType: "EXTERNAL" | "L1_HANDLER" | "CONSTRUCTOR"; + callType: "CALL" | "DELEGATE" | "LIBRARY_CALL"; + result: string[]; + calls: FunctionInvocation[]; + events: SimulationEvent[]; + messages: L2ToL1Message[]; + executionResources: ExecutionResources; + decodedEntryPoint?: { name: string }; +} + +export type SimulationStatus = "SUCCEEDED" | "REVERTED"; + +export interface SimulationResult { + status: SimulationStatus; + transactionHash: string; + executionResources: ExecutionResources; + feeEstimate: FeeEstimate; + validateInvocation: FunctionInvocation | null; + executeInvocation: FunctionInvocation | null; + feeTransferInvocation: FunctionInvocation | null; + stateDiff: StateDiff; + events: SimulationEvent[]; + messagesToL1: L2ToL1Message[]; + revertReason: string | null; + revertReasonDecoded: string | null; +} + +export interface SimulateResponse { + simId: string; + blockContext: BlockContext; + results: SimulationResult[]; +} + +export interface HealthResponse { + status: "ok"; + bridge_version: string; + git_sha: string; + bind_addr: string; +} + +export interface VersionResponse { + bridge_version: string; + bridge_git_sha: string; + pathfinder_rev: string | null; + blockifier_rev: string | null; + starknet_rpc_version: string; +} + +export type BridgeErrorCode = + | "UNAUTHORIZED" + | "SIMULATION_FAILED" + | "BLOCK_NOT_FOUND" + | "TX_NOT_FOUND" + | "INVALID_TRANSACTION" + | "STATE_UNAVAILABLE" + | "NOT_IMPLEMENTED" + | "RATE_LIMITED" + | "TIMEOUT" + | "PENDING_UNSUPPORTED" + | "STALE_FORK" + | "BLOCKIFIER_PANIC"; + +export interface BridgeErrorBody { + code: BridgeErrorCode; + message: string; +} + +export interface BridgeErrorEnvelope { + error: BridgeErrorBody; +} diff --git a/src/components/StarknetSimBridgeStatus.tsx b/src/components/StarknetSimBridgeStatus.tsx new file mode 100644 index 0000000..13ecf15 --- /dev/null +++ b/src/components/StarknetSimBridgeStatus.tsx @@ -0,0 +1,114 @@ +import React, { useCallback, useEffect, useMemo, useState } from "react"; +import { getStarknetSimBridgeUrl, getBridgeHeaders } from "../utils/env"; + +type BridgeStatus = "checking" | "connected" | "disconnected" | "disabled"; + +interface HealthPayload { + status?: string; + bridge_version?: string; + git_sha?: string; +} + +interface Props { + className?: string; +} + +const HEALTH_POLL_INTERVAL_MS = 12_000; +const HEALTH_TIMEOUT_MS = 3_000; + +const StarknetSimBridgeStatus: React.FC = ({ className = "" }) => { + const bridgeBaseUrl = useMemo(() => { + const configured = getStarknetSimBridgeUrl(); + return configured ? configured.replace(/\/+$/, "") : ""; + }, []); + + const [status, setStatus] = useState( + bridgeBaseUrl ? "checking" : "disabled", + ); + const [gitSha, setGitSha] = useState(null); + const [lastError, setLastError] = useState(null); + + const runHealthCheck = useCallback(async () => { + if (!bridgeBaseUrl) { + setStatus("disabled"); + setGitSha(null); + setLastError(null); + return; + } + + setStatus((prev) => (prev === "connected" ? "connected" : "checking")); + + const controller = new AbortController(); + const timer = window.setTimeout(() => controller.abort(), HEALTH_TIMEOUT_MS); + + try { + const response = await fetch(`${bridgeBaseUrl}/health`, { + method: "GET", + headers: getBridgeHeaders(), + cache: "no-store", + signal: controller.signal, + }); + if (!response.ok) throw new Error(`HTTP ${response.status}`); + + const payload = (await response.json()) as HealthPayload; + if (payload.status !== "ok") throw new Error("unhealthy response"); + + setStatus("connected"); + setGitSha(payload.git_sha ?? null); + setLastError(null); + } catch (error: unknown) { + const reason = + error instanceof Error + ? error.name === "AbortError" + ? "timeout" + : error.message + : "unreachable"; + setStatus("disconnected"); + setGitSha(null); + setLastError(reason); + } finally { + window.clearTimeout(timer); + } + }, [bridgeBaseUrl]); + + useEffect(() => { + void runHealthCheck(); + if (!bridgeBaseUrl) return; + const interval = window.setInterval(() => { + void runHealthCheck(); + }, HEALTH_POLL_INTERVAL_MS); + return () => window.clearInterval(interval); + }, [bridgeBaseUrl, runHealthCheck]); + + const statusText = + status === "connected" + ? "Live" + : status === "disconnected" + ? "Down" + : status === "disabled" + ? "Off" + : "Check"; + + const tooltip = + status === "connected" + ? `Starknet sim bridge connected${gitSha ? ` Β· ${gitSha}` : ""}` + : status === "disabled" + ? "Starknet sim bridge disabled via environment" + : `Starknet sim bridge unreachable${lastError ? ` (${lastError})` : ""}`; + + return ( + + ); +}; + +export default StarknetSimBridgeStatus; diff --git a/starknet-sim b/starknet-sim index 1497f0d..c2e0ae4 160000 --- a/starknet-sim +++ b/starknet-sim @@ -1 +1 @@ -Subproject commit 1497f0d46cae3e2657bd7ed81a006fe7e9c7f62f +Subproject commit c2e0ae478eebfdfb19a3e208fc43760ce72a1699 From 0292bb7d86b09270506c037a3bcce0044544b6f6 Mon Sep 17 00:00:00 2001 From: Timidan Date: Fri, 24 Apr 2026 23:54:34 +0100 Subject: [PATCH 04/71] chore(starknet-sim): bump gitlink to include metrics exporter + docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Engine commits since the previous bump: - 678d022 feat(Β§12): Prometheus metrics exporter, API and operations docs - c2e0ae4 feat(Β§1,Β§4): auth middleware, rate limiter, route skeleton Metrics exporter binds to METRICS_BIND_ADDR (default 127.0.0.1:9090) β€” a new env var the deploy runbook (starknet-sim/docs/OPERATIONS.md) documents; no web-toolkit config change required. --- starknet-sim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/starknet-sim b/starknet-sim index c2e0ae4..678d022 160000 --- a/starknet-sim +++ b/starknet-sim @@ -1 +1 @@ -Subproject commit c2e0ae478eebfdfb19a3e208fc43760ce72a1699 +Subproject commit 678d0226880c6ff3e9b10ea4b0a318f3ca8b2a77 From e2b4dbf78bc04ca46924a0641be86e7f18869737 Mon Sep 17 00:00:00 2001 From: Timidan Date: Sat, 25 Apr 2026 00:11:00 +0100 Subject: [PATCH 05/71] =?UTF-8?q?feat(=C2=A79,=C2=A710):=20mount=20SN-SIM?= =?UTF-8?q?=20status,=20wire=20/starknet/simulations=20route?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - src/App.tsx: StarknetSimBridgeStatus mounts next to EdbBridgeStatus in the footer - src/chains/capabilities.ts: starknet capability set now includes 'simulation' and 'tx-replay' so PersistentTools resolves /starknet/simulations (capability filter was previously empty) - src/components/PersistentTools.tsx: lazy-load StarknetSimulationsPage; new SimulationsDispatch wrapper routes the 'simulations' tool entry by family (starknet β†’ trace view backed by starknet-sim bridge, evm β†’ existing SimulationHistoryPage) - src/components/starknet/StarknetSimulationsPage.tsx: two-tab shell (Trace | Synthetic β€” Sprint 2) - src/components/starknet/TxTraceView.tsx: felt-validated hash input, trace button, summary card (fee/resources/version), invocation tree, state diff tabs; surfaces StarknetSimulatorBridgeError codes; shows an 'sim disabled' hint when VITE_STARKNET_SIM_BRIDGE_URL=disabled - src/components/starknet/InvocationTree.tsx: recursive collapsible tree with MAX_DEPTH=256 clamp, short-addr and short-selector helpers, decodedEntryPoint preferred over raw selector when enrichment is present - src/components/starknet/StateDiffTabs.tsx: storage | nonces | classes; counts in tab labels; empty-hint fallbacks --- src/App.tsx | 2 + src/chains/capabilities.ts | 7 +- src/components/PersistentTools.tsx | 13 +- src/components/starknet/InvocationTree.tsx | 95 +++++++++++ .../starknet/StarknetSimulationsPage.tsx | 55 +++++++ src/components/starknet/StateDiffTabs.tsx | 109 ++++++++++++ src/components/starknet/TxTraceView.tsx | 155 ++++++++++++++++++ 7 files changed, 434 insertions(+), 2 deletions(-) create mode 100644 src/components/starknet/InvocationTree.tsx create mode 100644 src/components/starknet/StarknetSimulationsPage.tsx create mode 100644 src/components/starknet/StateDiffTabs.tsx create mode 100644 src/components/starknet/TxTraceView.tsx diff --git a/src/App.tsx b/src/App.tsx index 8f140fb..70bd9e3 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -19,6 +19,7 @@ import { useNetworkConfig } from "./contexts/NetworkConfigContext"; import { Button } from "./components/ui/button"; import TopBar from "./components/TopBar"; import EdbBridgeStatus from "./components/EdbBridgeStatus"; +import StarknetSimBridgeStatus from "./components/StarknetSimBridgeStatus"; import ConstellationBackground from "./components/ConstellationBackground"; import HomePage from "./components/HomePage"; import MobileDrawer from "./components/MobileDrawer"; @@ -313,6 +314,7 @@ function AppInner() {
+
{isRpcModalOpen && ( diff --git a/src/chains/capabilities.ts b/src/chains/capabilities.ts index 077083e..4857196 100644 --- a/src/chains/capabilities.ts +++ b/src/chains/capabilities.ts @@ -38,7 +38,12 @@ export const DEFAULT_FAMILY_CAPABILITIES: Record(), + // `simulation` and `tx-replay` unlock /starknet/simulations so the + // Starknet sim bridge can trace landed mainnet txs. The bridge itself + // (Timidan/starknet-sim gitlink) is the backing executor. `wallet` stays + // off here β€” wallet connection for Starknet is owned by the + // bridges/StarknetBridge picker, not the generic capability gate. + starknet: new Set(["simulation", "tx-replay"]), // `earn` only, so /solana/integrations/lifi-earn reaches the SVM stub's // "coming soon" card. Real capabilities land with the real SVM adapter. svm: new Set(["earn"]), diff --git a/src/components/PersistentTools.tsx b/src/components/PersistentTools.tsx index 4e18471..6e5617b 100644 --- a/src/components/PersistentTools.tsx +++ b/src/components/PersistentTools.tsx @@ -13,13 +13,24 @@ interface ToolRoute extends ToolEntry { const TransactionBuilderHub = React.lazy(() => import("./TransactionBuilderHub")); const SignatureDatabase = React.lazy(() => import("./SignatureDatabase")); const SimulationHistoryPage = React.lazy(() => import("./SimulationHistoryPage")); +const StarknetSimulationsPage = React.lazy( + () => import("./starknet/StarknetSimulationsPage"), +); const SourceTools = React.lazy(() => import("./explorer/SourceTools")); const IntegrationsHub = React.lazy(() => import("./integrations/IntegrationsHub")); +// Dispatches the simulations route by family: Starknet gets the trace view +// backed by the starknet-sim bridge; EVM keeps its history-backed page. +const SimulationsDispatch: React.FC = () => { + const family = useActiveChainFamily(); + if (family === "starknet") return ; + return ; +}; + const TOOL_RENDERERS: Record React.ReactElement> = { database: () => , builder: () => , - simulations: () => , + simulations: () => , explorer: () => , integrations: () => , }; diff --git a/src/components/starknet/InvocationTree.tsx b/src/components/starknet/InvocationTree.tsx new file mode 100644 index 0000000..9fad7fa --- /dev/null +++ b/src/components/starknet/InvocationTree.tsx @@ -0,0 +1,95 @@ +import React, { useState } from "react"; +import type { FunctionInvocation } from "@/chains/starknet/simulatorTypes"; + +const MAX_DEPTH = 256; + +interface Props { + node: FunctionInvocation; + depth?: number; +} + +function shortAddress(addr: string): string { + if (addr.length < 18) return addr; + return `${addr.slice(0, 10)}…${addr.slice(-6)}`; +} + +function shortSelector(selector: string): string { + if (selector.length < 18) return selector; + return `${selector.slice(0, 10)}…`; +} + +const InvocationTree: React.FC = ({ node, depth = 0 }) => { + const [open, setOpen] = useState(depth < 2); + + if (depth >= MAX_DEPTH) { + return ( +
+ … tree depth clamp ({MAX_DEPTH}) reached +
+ ); + } + + const hasChildren = node.calls.length > 0; + const label = + node.decodedEntryPoint?.name ?? shortSelector(node.entryPointSelector); + + return ( +
+ + + {open && ( +
+ {node.calldata.length > 0 && ( +
+ calldata[{node.calldata.length}]:{" "} + + {node.calldata.slice(0, 8).join(" Β· ")} + {node.calldata.length > 8 && " …"} + +
+ )} + {node.result.length > 0 && ( +
+ result[{node.result.length}]:{" "} + + {node.result.slice(0, 8).join(" Β· ")} + {node.result.length > 8 && " …"} + +
+ )} + {node.events.length > 0 && ( +
+ events[{node.events.length}] +
+ )} + {hasChildren && ( +
+ {node.calls.map((child, i) => ( + + ))} +
+ )} +
+ )} +
+ ); +}; + +export default InvocationTree; diff --git a/src/components/starknet/StarknetSimulationsPage.tsx b/src/components/starknet/StarknetSimulationsPage.tsx new file mode 100644 index 0000000..bdbfc97 --- /dev/null +++ b/src/components/starknet/StarknetSimulationsPage.tsx @@ -0,0 +1,55 @@ +import React, { useState } from "react"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "../ui/tabs"; +import { Card, CardContent, CardHeader, CardTitle } from "../ui/card"; +import TxTraceView from "./TxTraceView"; + +type TabId = "trace" | "synthetic"; + +const StarknetSimulationsPage: React.FC = () => { + const [tab, setTab] = useState("trace"); + + return ( +
+
+

+ Starknet simulations +

+

+ Trace landed transactions and synthetic simulations via the + starknet-sim + bridge. +

+
+ + setTab(v as TabId)}> + + + By transaction hash + + + Synthetic (Sprint 2) + + + + + + + + + + + Coming in Sprint 2 + + + Synthetic simulation builds INVOKE v3 calldata and simulates + against any block without broadcasting. Lands with the + override-aware state reader. + + + + +
+ ); +}; + +export default StarknetSimulationsPage; diff --git a/src/components/starknet/StateDiffTabs.tsx b/src/components/starknet/StateDiffTabs.tsx new file mode 100644 index 0000000..96043a8 --- /dev/null +++ b/src/components/starknet/StateDiffTabs.tsx @@ -0,0 +1,109 @@ +import React from "react"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "../ui/tabs"; +import type { StateDiff } from "@/chains/starknet/simulatorTypes"; + +interface Props { + diff: StateDiff; +} + +const EmptyHint: React.FC<{ label: string }> = ({ label }) => ( +

No {label} changed.

+); + +const StateDiffTabs: React.FC = ({ diff }) => { + const storageCount = diff.storageDiffs.reduce( + (acc, d) => acc + d.storageEntries.length, + 0, + ); + const nonceCount = diff.nonces.length; + const classCount = diff.declaredClasses.length + diff.replacedClasses.length; + + return ( + + + + Storage ({storageCount}) + + + Nonces ({nonceCount}) + + + Classes ({classCount}) + + + + + {diff.storageDiffs.length === 0 && } + {diff.storageDiffs.map((d) => ( +
+
+ {d.address} +
+ + + {d.storageEntries.map((e) => ( + + + + + ))} + +
{e.key}{e.value}
+
+ ))} +
+ + + {nonceCount === 0 && } + + + {diff.nonces.map((n) => ( + + + + + ))} + +
+ {n.contractAddress} + {n.nonce}
+
+ + + {classCount === 0 && } + {diff.declaredClasses.length > 0 && ( +
+
Declared
+
    + {diff.declaredClasses.map((c) => ( +
  • + {c.classHash} Β· compiled {c.compiledClassHash} +
  • + ))} +
+
+ )} + {diff.replacedClasses.length > 0 && ( +
+
Replaced
+
    + {diff.replacedClasses.map((c) => ( +
  • + {c.contractAddress} β†’ {c.classHash} +
  • + ))} +
+
+ )} +
+
+ ); +}; + +export default StateDiffTabs; diff --git a/src/components/starknet/TxTraceView.tsx b/src/components/starknet/TxTraceView.tsx new file mode 100644 index 0000000..b318e2c --- /dev/null +++ b/src/components/starknet/TxTraceView.tsx @@ -0,0 +1,155 @@ +import React, { useCallback, useMemo, useState } from "react"; +import { Input } from "../ui/input"; +import { Button } from "../ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "../ui/card"; +import { Badge } from "../ui/badge"; +import InvocationTree from "./InvocationTree"; +import StateDiffTabs from "./StateDiffTabs"; +import { + StarknetSimulator, + StarknetSimulatorBridgeError, +} from "@/chains/starknet/simulatorClient"; +import type { SimulateResponse } from "@/chains/starknet/simulatorTypes"; + +const FELT_HEX = /^0x[0-9a-fA-F]{1,64}$/; + +const TxTraceView: React.FC = () => { + const simulator = useMemo(() => new StarknetSimulator(), []); + const [hash, setHash] = useState(""); + const [pending, setPending] = useState(false); + const [error, setError] = useState(null); + const [response, setResponse] = useState(null); + + const valid = FELT_HEX.test(hash.trim()); + + const runTrace = useCallback(async () => { + setError(null); + setResponse(null); + if (!valid) { + setError("Transaction hash must be 0x-prefixed hex, ≀ 64 nibbles."); + return; + } + setPending(true); + try { + const res = await simulator.trace(hash.trim()); + setResponse(res); + } catch (err) { + if (err instanceof StarknetSimulatorBridgeError) { + setError(`${err.code}: ${err.message}`); + } else { + setError(err instanceof Error ? err.message : String(err)); + } + } finally { + setPending(false); + } + }, [simulator, hash, valid]); + + const result = response?.results?.[0]; + + return ( +
+ + + Trace a landed transaction + + +
+ setHash(e.target.value)} + placeholder="0x... transaction hash" + spellCheck={false} + className="font-mono text-xs" + disabled={pending} + onKeyDown={(e) => { + if (e.key === "Enter" && valid && !pending) void runTrace(); + }} + /> + +
+ {!simulator.isConfigured && ( +

+ Starknet sim bridge is disabled (VITE_STARKNET_SIM_BRIDGE_URL). + Set it in .env to enable tracing. +

+ )} + {error && ( +

{error}

+ )} +
+
+ + {result && response && ( + <> + + + Summary + + {result.status} + + + +
+
Block
+
+ #{response.blockContext.blockNumber}{" "} + + {response.blockContext.blockHash.slice(0, 12)}… + +
+
Starknet version
+
+ {response.blockContext.starknetVersion} +
+
Overall fee
+
+ {result.feeEstimate.overallFee} {result.feeEstimate.unit} +
+
Steps
+
+ {result.executionResources.steps.toLocaleString()} +
+
L1/L2 gas
+
+ {result.executionResources.l1Gas.toLocaleString()} /{" "} + {result.executionResources.l2Gas.toLocaleString()} +
+
+ {result.revertReasonDecoded && ( +

+ {result.revertReasonDecoded} +

+ )} +
+
+ + {result.executeInvocation && ( + + + Invocation tree + + + + + + )} + + + + State diff + + + + + + + )} +
+ ); +}; + +export default TxTraceView; From 198f3fa43a10655f199efe2b45a5c5a9de0be92f Mon Sep 17 00:00:00 2001 From: Timidan Date: Sat, 25 Apr 2026 00:13:18 +0100 Subject: [PATCH 06/71] chore(starknet-sim): bump gitlink + document RPC v0.10 env pattern - gitlink bumped to 3ebbc7d (engine): /version now self-reports RPC v0.10 and docs point at the Alchemy v0_10 URL shape - .env.example: documents STARKNET_RPC_URL/_SEPOLIA_URL/_FALLBACK_URL with the v0_10 path so operators paste the right shape The real API key lives only in the droplet env file (and each developer's local .env, which is gitignored). --- starknet-sim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/starknet-sim b/starknet-sim index 678d022..3ebbc7d 160000 --- a/starknet-sim +++ b/starknet-sim @@ -1 +1 @@ -Subproject commit 678d0226880c6ff3e9b10ea4b0a318f3ca8b2a77 +Subproject commit 3ebbc7d3ded37ba4d39513149e8e5232380d4d67 From 5b6bf538ee98ff95415da5749fe73256347c1a46 Mon Sep 17 00:00:00 2001 From: Timidan Date: Sat, 25 Apr 2026 00:23:33 +0100 Subject: [PATCH 07/71] =?UTF-8?q?chore(starknet-sim):=20bump=20gitlink=20?= =?UTF-8?q?=E2=80=94=20fork-head=20/health,=20/block=20resolver?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Engine at 4803136: RPC client + BlockPin + v0.10 Alchemy integration. - /health now returns chain_id, spec_version, fork_head (block number/hash/timestamp/l1 gas prices), rpc_latency_ms - /block/:id resolves 'latest', 0x-hex hash, or decimal number; rejects 'pending' with 400 - MSRV bumped from 1.85 to 1.86 (reqwest transitives need icu_* crates at 1.86); rust-toolchain.toml and CI pinned No web-toolkit code change beyond the gitlink. --- starknet-sim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/starknet-sim b/starknet-sim index 3ebbc7d..4803136 160000 --- a/starknet-sim +++ b/starknet-sim @@ -1 +1 @@ -Subproject commit 3ebbc7d3ded37ba4d39513149e8e5232380d4d67 +Subproject commit 4803136eac4722af34a9351996c8186b0efc8dab From 309cee9380f82c372ebe912f254aacfa1e22cf9f Mon Sep 17 00:00:00 2001 From: Timidan Date: Sat, 25 Apr 2026 00:38:21 +0100 Subject: [PATCH 08/71] =?UTF-8?q?chore(starknet-sim):=20bump=20gitlink=20?= =?UTF-8?q?=E2=80=94=20blockifier=20StateReader=20impl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Engine at 91f185e: RpcForkStateReader satisfies blockifier's StateReader trait (blockifier 0.18.0-rc.1). Verified live against Alchemy mainnet — reads class hash, storage, nonce; caches per-session. Sierra→CASM compilation (get_compiled_class) stays stubbed until §3 executor integration. MSRV bumped to 1.89 — required by blockifier's transitive cairo-lang-*/apollo crates. No web-toolkit code change beyond the gitlink. --- starknet-sim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/starknet-sim b/starknet-sim index 4803136..91f185e 160000 --- a/starknet-sim +++ b/starknet-sim @@ -1 +1 @@ -Subproject commit 4803136eac4722af34a9351996c8186b0efc8dab +Subproject commit 91f185e0d7809583ed1872f08ad32b04702531d0 From 09e10805b318018a3a1c356c2ab220eb1cd06d25 Mon Sep 17 00:00:00 2001 From: Timidan Date: Sat, 25 Apr 2026 03:49:07 +0100 Subject: [PATCH 09/71] =?UTF-8?q?chore(starknet-sim):=20bump=20gitlink=20?= =?UTF-8?q?=E2=80=94=20Cairo=200=20class=20loader?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Engine at 3c932f4: get_compiled_class now succeeds for legacy (pre-Sierra) mainnet contracts. Cairo 1 still gates on §3 executor integration. --- starknet-sim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/starknet-sim b/starknet-sim index 91f185e..3c932f4 160000 --- a/starknet-sim +++ b/starknet-sim @@ -1 +1 @@ -Subproject commit 91f185e0d7809583ed1872f08ad32b04702531d0 +Subproject commit 3c932f4319a4e51cd8c09282aea47cd9755778b3 From 279d9b3488f18a24880daf5d880c8d7c763c2716 Mon Sep 17 00:00:00 2001 From: Timidan Date: Sat, 25 Apr 2026 05:39:28 +0100 Subject: [PATCH 10/71] =?UTF-8?q?chore(starknet-sim):=20bump=20gitlink=20?= =?UTF-8?q?=E2=80=94=20=C2=A73=20executor=20wiring?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Engine at 99752f3: /simulate, /trace/:tx_hash, and /estimate-fee now return real blockifier execution results. Cairo 1 class loading shipped (Sierra → CASM via cairo-lang-starknet-classes). Verified live against Alchemy mainnet — synthetic INVOKE v3 against latest block runs end-to-end through the executor pipeline. --- .gitignore | 20 ++++++++++++++++---- starknet-sim | 2 +- tsconfig.app.json | 10 +++++++++- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 7b8edfe..8441f67 100644 --- a/.gitignore +++ b/.gitignore @@ -61,11 +61,23 @@ edb # Misc *.pdf -*test* -*Test* -*TEST* /tmp video/out .superpowers /docs -@docs \ No newline at end of file +@docs + +# Tests — run via vitest locally, never committed. +**/*.test.ts +**/*.test.tsx +**/*.test.js +**/*.test.jsx +**/*.spec.ts +**/*.spec.tsx +**/*.spec.js +**/*.spec.jsx +**/__tests__/ +**/__mocks__/ +**/test-fixtures/ +/tests/ +/test-results/ \ No newline at end of file diff --git a/starknet-sim b/starknet-sim index 3c932f4..99752f3 160000 --- a/starknet-sim +++ b/starknet-sim @@ -1 +1 @@ -Subproject commit 3c932f4319a4e51cd8c09282aea47cd9755778b3 +Subproject commit 99752f3fb97e5fe0d25464a4625eb7633c9b2b66 diff --git a/tsconfig.app.json b/tsconfig.app.json index 6c28874..b02f28e 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -29,5 +29,13 @@ "noFallthroughCasesInSwitch": true, "noUncheckedSideEffectImports": true }, - "include": ["src"] + "include": ["src"], + "exclude": [ + "src/**/*.test.ts", + "src/**/*.test.tsx", + "src/**/*.spec.ts", + "src/**/*.spec.tsx", + "src/**/__tests__/**", + "src/**/__mocks__/**" + ] } From 35ed4373fcb054737ee2577a3f9e4c30586920c7 Mon Sep 17 00:00:00 2001 From: Timidan Date: Sat, 25 Apr 2026 06:20:17 +0100 Subject: [PATCH 11/71] =?UTF-8?q?chore(starknet-sim):=20bump=20gitlink=20?= =?UTF-8?q?=E2=80=94=20\xA75=20enrichment=20+=20\xA711=20fixtures=20+=20l2?= =?UTF-8?q?=5Fgas=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Engine at e496ff5: enrichment layer (revert decoder, resource analyzer, ABI lookup), golden trace harness over 6 mainnet INVOKE v3 fixtures (all 6 pass structurally), and a real bug fix in block_context.rs where L1 gas price was being copied into the L2 GasPriceVector slot (masked by the synthetic fixture's relaxed bounds; surfaced by real mainnet txs). --- starknet-sim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/starknet-sim b/starknet-sim index 99752f3..e496ff5 160000 --- a/starknet-sim +++ b/starknet-sim @@ -1 +1 @@ -Subproject commit 99752f3fb97e5fe0d25464a4625eb7633c9b2b66 +Subproject commit e496ff5f4e8d55acdc464a5d221667b7d72355a0 From ddff0db5dd0b182dbb6354b3f8469c014ec4afb0 Mon Sep 17 00:00:00 2001 From: Timidan Date: Sat, 25 Apr 2026 13:40:16 +0100 Subject: [PATCH 12/71] feat(hexkit-starknet-sim): React port of the sample sim UI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ports the static docs/sample-sim-ui.html mock into a real React component tree under src/components/starknet-simulation-results/. Drop-in for HexKit's existing simulation-results shell. Components - StarknetSimulationResults — top-level shell with header (3-step status timeline + compact stats row + status pill + INVOKE v3 chip), 8-tab nav, URL-hash deep-link (#frame=N), keyboard shortcuts (b/space/arrows/n/o/j/k for prev/next/step-in/step-out/tree-nav), Re-simulate + Explain transaction buttons. - CallTreeTab — Walnut-style tree with filter input, frame # badges, per-frame visual share bars (subtree-size proxy), event badges, decoded selectors via the bridge's decodedSelector field (ABI cache wins, hardcoded std-lib table is fallback). Right rail: Frame detail (decoded calldata + retdata + frame-local events) + Cairo source pane (Cairo/Sierra/CASM tier toggle). - TokenFlowTab — u256 amount decoder (low+high felt packing) + per-token decimals (STRK/ETH/USDC/USDT) + ERC721 / ERC1155 detection. Per-token aggregate chips above the per-event rows. - EventsTab — dense table with decoded event names (Transfer / TransferSingle / Approval / etc.). - StateDiffTab — canonical envelope from bridge: 4-card summary header, storage writes grouped by contract via rowSpan, nonce updates, optional class-hash-updates section. - ResourcesTab — gas waterfall (L1/L1Data/L2 bars), builtins distribution chart, per-frame compute heatmap (clickable, jumps back to Call tree + selects the frame). - DevInfoTab — block context / fee estimate / execution resources raw key-value tables. Other - decoders.ts: KNOWN_SELECTORS / KNOWN_EVENTS / KNOWN_CONTRACTS / TOKEN_META static tables + selectorName / eventName / contractLabel / shortHex / decodeU256 / formatTokenAmount / walkInvocations / countSubtree / subtreeEventCount / stripSystemArgs helpers, all reusable across the tabs. - StarknetSimDemoPage — paste-in /simulate JSON OR Load-sample fixture from the github raw URL. Drives StarknetSimulationResults with optional onResimulate / onExplainTransaction / onExplainFrame hooks for the LLM affordances. - App.tsx wires /starknet-sim-demo as a top-level lazy route that bypasses FamilyShell. - simulatorTypes.ts: synced StateDiff field names with the bridge's canonical envelope (storageDiffs / nonceUpdates / classHashUpdates / declaredClasses / summary). Added decodedSelector to FunctionInvocation. Removed unused fields (transactionHash, deployedContracts, replacedClasses, top-level events / messagesToL1). Verified end-to-end via playwriter: dev-server route serves, all 86 frames render with bridge-decoded selectors, tabs switch, frame selection persists to URL hash. --- src/App.tsx | 12 + src/chains/starknet/simulatorTypes.ts | 29 +- .../CallTreeTab.tsx | 461 ++++++++++++++++++ .../DevInfoTab.tsx | 60 +++ .../starknet-simulation-results/EventsTab.tsx | 63 +++ .../ResourcesTab.tsx | 108 ++++ .../StarknetSimDemoPage.tsx | 86 ++++ .../StarknetSimulationResults.tsx | 315 ++++++++++++ .../StateDiffTab.tsx | 121 +++++ .../TokenFlowTab.tsx | 148 ++++++ .../starknet-simulation-results/decoders.ts | 121 +++++ .../starknet-simulation-results/index.ts | 3 + src/components/starknet/InvocationTree.tsx | 2 +- src/components/starknet/StateDiffTabs.tsx | 10 +- src/components/starknet/TxTraceView.tsx | 6 +- starknet-sim | 2 +- 16 files changed, 1527 insertions(+), 20 deletions(-) create mode 100644 src/components/starknet-simulation-results/CallTreeTab.tsx create mode 100644 src/components/starknet-simulation-results/DevInfoTab.tsx create mode 100644 src/components/starknet-simulation-results/EventsTab.tsx create mode 100644 src/components/starknet-simulation-results/ResourcesTab.tsx create mode 100644 src/components/starknet-simulation-results/StarknetSimDemoPage.tsx create mode 100644 src/components/starknet-simulation-results/StarknetSimulationResults.tsx create mode 100644 src/components/starknet-simulation-results/StateDiffTab.tsx create mode 100644 src/components/starknet-simulation-results/TokenFlowTab.tsx create mode 100644 src/components/starknet-simulation-results/decoders.ts create mode 100644 src/components/starknet-simulation-results/index.ts diff --git a/src/App.tsx b/src/App.tsx index 70bd9e3..f580a98 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -22,6 +22,11 @@ import EdbBridgeStatus from "./components/EdbBridgeStatus"; import StarknetSimBridgeStatus from "./components/StarknetSimBridgeStatus"; import ConstellationBackground from "./components/ConstellationBackground"; import HomePage from "./components/HomePage"; +const StarknetSimDemoPage = React.lazy(() => + import("./components/starknet-simulation-results/StarknetSimDemoPage").then((m) => ({ + default: m.StarknetSimDemoPage, + })), +); import MobileDrawer from "./components/MobileDrawer"; import { useBreakpoint } from "./hooks/useBreakpoint"; import { FAMILY_PREFIXES, parseFamilyFromPath, resolveLegacyRedirect } from "./routes/familyRoutes"; @@ -239,6 +244,7 @@ function AppInner() { const isSimulationPage = location.pathname.startsWith("/simulation/"); const isHomePage = location.pathname === "/"; + const isStarknetSimDemo = location.pathname.startsWith("/starknet-sim-demo"); const legacyRedirectTarget = resolveLegacyRedirect({ pathname: location.pathname, search: location.search, @@ -286,6 +292,12 @@ function AppInner() { } /> + ) : isStarknetSimDemo ? ( + }> + + } /> + + ) : isHomePage ? ( } /> diff --git a/src/chains/starknet/simulatorTypes.ts b/src/chains/starknet/simulatorTypes.ts index 46aa60f..4d43d83 100644 --- a/src/chains/starknet/simulatorTypes.ts +++ b/src/chains/starknet/simulatorTypes.ts @@ -86,10 +86,15 @@ export interface StateDiff { address: string; storageEntries: Array<{ key: string; value: string }>; }>; - nonces: Array<{ contractAddress: string; nonce: string }>; - deployedContracts: Array<{ address: string; classHash: string }>; + nonceUpdates: Array<{ contractAddress: string; nonce: string }>; + classHashUpdates: Array<{ contractAddress: string; classHash: string }>; declaredClasses: Array<{ classHash: string; compiledClassHash: string }>; - replacedClasses: Array<{ contractAddress: string; classHash: string }>; + summary: { + contractsTouched: number; + storageWrites: number; + nonceUpdates: number; + classHashUpdates: number; + }; } export interface SimulationEvent { @@ -108,32 +113,32 @@ export interface L2ToL1Message { export interface FunctionInvocation { contractAddress: string; entryPointSelector: string; + /** Sprint 4 ABI decoder — bridge resolves selector → function name from + * the loaded class's ABI (covers contract-specific entrypoints, not just + * the std-lib KNOWN_SELECTORS table). Null when the class wasn't loaded + * during execution (revert paths, predecessor frames). */ + decodedSelector?: string | null; calldata: string[]; callerAddress: string; - classHash: string; - entryPointType: "EXTERNAL" | "L1_HANDLER" | "CONSTRUCTOR"; - callType: "CALL" | "DELEGATE" | "LIBRARY_CALL"; + classHash: string | null; + entryPointType: string; + callType: string; result: string[]; calls: FunctionInvocation[]; events: SimulationEvent[]; messages: L2ToL1Message[]; - executionResources: ExecutionResources; - decodedEntryPoint?: { name: string }; } export type SimulationStatus = "SUCCEEDED" | "REVERTED"; export interface SimulationResult { status: SimulationStatus; - transactionHash: string; executionResources: ExecutionResources; feeEstimate: FeeEstimate; validateInvocation: FunctionInvocation | null; executeInvocation: FunctionInvocation | null; feeTransferInvocation: FunctionInvocation | null; - stateDiff: StateDiff; - events: SimulationEvent[]; - messagesToL1: L2ToL1Message[]; + stateDiff: StateDiff | null; revertReason: string | null; revertReasonDecoded: string | null; } diff --git a/src/components/starknet-simulation-results/CallTreeTab.tsx b/src/components/starknet-simulation-results/CallTreeTab.tsx new file mode 100644 index 0000000..8f14a91 --- /dev/null +++ b/src/components/starknet-simulation-results/CallTreeTab.tsx @@ -0,0 +1,461 @@ +import { useMemo, useState } from "react"; +import type { FunctionInvocation, SimulationResult } from "@/chains/starknet/simulatorTypes"; +import { + selectorName, + contractLabel, + shortHex, + countSubtree, + subtreeEventCount, + stripSystemArgs, + eventName, +} from "./decoders"; + +interface Props { + result: SimulationResult; + frames: FunctionInvocation[]; + selectedFrame: FunctionInvocation | null; + setSelectedFrame: (f: FunctionInvocation) => void; + onExplainFrame?: (f: FunctionInvocation) => void; +} + +export function CallTreeTab({ result, frames, selectedFrame, setSelectedFrame, onExplainFrame }: Props) { + const [stripSys, setStripSys] = useState(true); + const [onlyEvents, setOnlyEvents] = useState(false); + const [showResources, setShowResources] = useState(true); + const [filter, setFilter] = useState(""); + + const stats = useMemo(() => { + let totalEvents = 0; + let maxDepth = 0; + const uniqContracts = new Set(); + const uniqClasses = new Set(); + let decoded = 0; + function walk(n: FunctionInvocation, depth = 1) { + totalEvents += (n.events || []).length; + maxDepth = Math.max(maxDepth, depth); + uniqContracts.add(n.contractAddress); + if (n.classHash) uniqClasses.add(n.classHash); + if (selectorName(n)) decoded++; + for (const c of n.calls || []) walk(c, depth + 1); + } + for (const top of [result.validateInvocation, result.executeInvocation, result.feeTransferInvocation]) { + if (top) walk(top); + } + return { totalEvents, maxDepth, uniqContracts: uniqContracts.size, uniqClasses: uniqClasses.size, decoded }; + }, [result]); + + const sections: Array<[string, FunctionInvocation | null, string]> = [ + ["__validate__", result.validateInvocation, "border-amber-800/60 bg-amber-950/20"], + ["__execute__", result.executeInvocation, "border-emerald-800/60 bg-emerald-950/20"], + ["__fee_transfer__", result.feeTransferInvocation, "border-zinc-800 bg-zinc-950/40"], + ]; + + return ( +
+
+
+
+
Call tree
+
+ {frames.length} frames Β· max depth {stats.maxDepth} Β· {stats.totalEvents} events +
+
+
+ setFilter(e.target.value.toLowerCase().trim())} + /> + + + +
+
+ +
+ + + + +
+ +
+ {sections.map(([label, node, cls]) => + node ? ( +
+
+ {label} + {subtreeEventCount(node) ? ( + + {subtreeEventCount(node)} events + + ) : null} +
+ +
+ ) : null, + )} +
+
+ + {/* Right rail: Frame detail + source pane */} +
+ + +
+
+ ); +} + +function Card({ label, value, tone }: { label: string; value: string; tone?: "ok" | "err" }) { + const c = tone === "ok" ? "text-emerald-300" : tone === "err" ? "text-red-300" : "text-zinc-200"; + return ( +
+
{label}
+
{value}
+
+ ); +} + +interface NodeProps { + ci: FunctionInvocation; + depth: number; + frames: FunctionInvocation[]; + filter: string; + onlyEvents: boolean; + stripSys: boolean; + showResources: boolean; + totalFrames: number; + selectedFrame: FunctionInvocation | null; + onSelect: (f: FunctionInvocation) => void; +} + +function CallNode(props: NodeProps) { + const { ci, depth, frames, filter, onlyEvents, stripSys, showResources, totalFrames, selectedFrame, onSelect } = props; + + if (onlyEvents && subtreeEventCount(ci) === 0) return null; + + if (filter) { + const matches = (n: FunctionInvocation): boolean => { + const sn = (selectorName(n) || "").toLowerCase(); + const cl = (contractLabel(n.contractAddress) || "").toLowerCase(); + if (sn.includes(filter) || cl.includes(filter)) return true; + if (n.contractAddress.toLowerCase().includes(filter)) return true; + if (n.entryPointSelector.toLowerCase().includes(filter)) return true; + return (n.calls || []).some(matches); + }; + if (!matches(ci)) return null; + } + + const sel = selectorName(ci); + const labelKnown = contractLabel(ci.contractAddress); + const isLib = ci.callType === "Delegate" || ci.callType === "Library"; + const evtCount = subtreeEventCount(ci); + const calldata = stripSys ? stripSystemArgs(ci.calldata) : ci.calldata; + const subtreeSize = countSubtree(ci); + const sharePct = Math.min(100, Math.round((subtreeSize / totalFrames) * 100)); + const fnum = frames.indexOf(ci); + const isSelected = ci === selectedFrame; + + const barColor = sharePct > 50 ? "bg-red-500" : sharePct > 20 ? "bg-amber-500" : "bg-emerald-500"; + + return ( +
+ { + e.preventDefault(); + onSelect(ci); + }} + > + #{fnum >= 0 ? fnum : "?"} + + {ci.callType} + + {sel ? ( + + {sel} + () + + ) : ( + + {shortHex(ci.entryPointSelector)} + + )} + on + {labelKnown ? ( + <> + {labelKnown} + {shortHex(ci.contractAddress)} + + ) : ( + {shortHex(ci.contractAddress)} + )} + {evtCount ? ( + + {evtCount} evt + + ) : null} + {ci.calls.length ? ( + {ci.calls.length}↳ + ) : null} + {showResources ? ( + + + + + {sharePct}% + + ) : null} + +
+
+ calldata:{" "} + + [{calldata.slice(0, 4).map((f) => shortHex(f)).join(", ")} + {calldata.length > 4 && ( + , …+{calldata.length - 4} + )} + ] + +
+
+ retdata:{" "} + + {(ci.result || []).length === 0 ? ( + empty + ) : ( + <> + [{(ci.result || []).slice(0, 4).map((f) => shortHex(f)).join(", ")} + {(ci.result || []).length > 4 && ( + , …+{(ci.result || []).length - 4} + )} + ] + + )} + +
+
+ {ci.calls && ci.calls.length ? ( +
+ {ci.calls.map((c, i) => ( + + ))} +
+ ) : null} +
+ ); +} + +function FrameDetailPane({ + frame, + stripSys, + onExplain, +}: { + frame: FunctionInvocation | null; + stripSys: boolean; + onExplain?: (f: FunctionInvocation) => void; +}) { + if (!frame) { + return ( +
+
Selected frame
+
+ Click a frame in the tree to see decoded calldata, retdata, and emitted events. +
+
+ ); + } + const sel = selectorName(frame); + const lbl = contractLabel(frame.contractAddress); + const calldata = stripSys ? stripSystemArgs(frame.calldata) : frame.calldata; + return ( +
+
+
Selected frame
+ {onExplain && ( + + )} +
+
+
+ + {frame.callType} + + + {frame.entryPointType} + + {sel ? ( + {sel}() + ) : ( + {shortHex(frame.entryPointSelector)} + )} +
+
+
+ contract:{" "} + {lbl ? {lbl} : null}{" "} + {frame.contractAddress} +
+
+ classHash:{" "} + {frame.classHash || "β€”"} +
+
+ caller:{" "} + {shortHex(frame.callerAddress)} +
+
+ + + + + {frame.events && frame.events.length ? ( +
+
+ {frame.events.length} event{frame.events.length === 1 ? "" : "s"} from this frame +
+
+ {frame.events.map((ev, i) => { + const ename = eventName(ev); + return ( +
+ [{i}]{" "} + {ename ? ( + {ename} + ) : ( + {shortHex(ev.keys[0])} + )}{" "} + data:[ + {(ev.data || []).slice(0, 4).map((d) => shortHex(d)).join(", ")} + {(ev.data || []).length > 4 ? ", …" : ""}] +
+ ); + })} +
+
+ ) : null} +
+
+ ); +} + +function DataBlock({ label, items }: { label: string; items: string[] }) { + return ( +
+
{label}
+
+ {items.length === 0 ? ( +
empty
+ ) : ( + items.map((f, i) => ( +
+ [{i}] {f} +
+ )) + )} +
+
+ ); +} + +function SourcePane({ frame }: { frame: FunctionInvocation | null }) { + const sel = selectorName(frame); + const fname = sel || "unknown_entrypoint"; + return ( +
+
+
Cairo source
+
+ Cairo + Sierra + CASM +
+
+
+        {`// contract: ${frame ? contractLabel(frame.contractAddress) || shortHex(frame.contractAddress) : "β€”"}
+// class:    ${shortHex(frame?.classHash)}
+// source:   unverified β€” placeholder rendering
+
+#[external(v0)]
+fn ${fname}(/* see decoded calldata in pane above */) {
+    // Source unavailable. cairo-annotations plumbing lands when classes
+    // are verified upstream.
+}`}
+      
+
+ ); +} diff --git a/src/components/starknet-simulation-results/DevInfoTab.tsx b/src/components/starknet-simulation-results/DevInfoTab.tsx new file mode 100644 index 0000000..25e5974 --- /dev/null +++ b/src/components/starknet-simulation-results/DevInfoTab.tsx @@ -0,0 +1,60 @@ +import type { SimulateResponse, SimulationResult } from "@/chains/starknet/simulatorTypes"; +import { shortHex } from "./decoders"; + +export function DevInfoTab({ response, result }: { response: SimulateResponse; result: SimulationResult }) { + const ctx = response.blockContext; + const blockRows: Array<[string, string]> = [ + ["Block number", ctx.blockNumber.toLocaleString()], + ["Block hash", ctx.blockHash], + ["Parent (timestamp)", `${new Date(ctx.timestamp * 1000).toUTCString()} (${ctx.timestamp})`], + ["Sequencer", shortHex(ctx.sequencerAddress)], + ["Starknet version", ctx.starknetVersion], + ["L1 gas price (wei)", ctx.l1GasPrice?.priceInWei || "β€”"], + ["L1 gas price (fri)", ctx.l1GasPrice?.priceInFri || "β€”"], + ["L1 data gas (wei)", ctx.l1DataGasPrice?.priceInWei || "β€”"], + ["L1 data gas (fri)", ctx.l1DataGasPrice?.priceInFri || "β€”"], + ]; + const fee = result.feeEstimate; + const feeRows: Array<[string, string]> = [ + ["Overall fee", fee.overallFee], + ["L1 gas consumed", fee.l1GasConsumed], + ["L1 data gas consumed", fee.l1DataGasConsumed], + ["L2 gas consumed", fee.l2GasConsumed], + ["Unit", fee.unit], + ]; + const res = result.executionResources; + const resRows: Array<[string, string]> = [ + ["Steps", res.steps?.toLocaleString() ?? "β€”"], + ["Memory holes", res.memoryHoles?.toLocaleString() ?? "β€”"], + ["L1 gas", res.l1Gas?.toLocaleString() ?? "β€”"], + ["L1 data gas", res.l1DataGas?.toLocaleString() ?? "β€”"], + ["L2 gas", res.l2Gas?.toLocaleString() ?? "β€”"], + ["Builtins", Object.entries(res.builtinInstanceCounter || {}).map(([k, v]) => `${k}=${v}`).join(" Β· ")], + ]; + + return ( +
+
+
+
+
+ ); +} + +function Section({ title, rows }: { title: string; rows: Array<[string, string]> }) { + return ( +
+
{title}
+ + + {rows.map(([k, v]) => ( + + + + + ))} + +
{k}{v || "β€”"}
+
+ ); +} diff --git a/src/components/starknet-simulation-results/EventsTab.tsx b/src/components/starknet-simulation-results/EventsTab.tsx new file mode 100644 index 0000000..c761508 --- /dev/null +++ b/src/components/starknet-simulation-results/EventsTab.tsx @@ -0,0 +1,63 @@ +import type { SimulationResult } from "@/chains/starknet/simulatorTypes"; +import { walkInvocations, eventName, contractLabel, shortHex } from "./decoders"; + +export function EventsTab({ result }: { result: SimulationResult }) { + const rows: Array<{ from: string; keys: string[]; data: string[] }> = []; + for (const f of walkInvocations(result)) { + for (const e of f.events || []) { + rows.push({ from: e.fromAddress, keys: e.keys, data: e.data }); + } + } + return ( +
+
Emitted events ({rows.length})
+ {rows.length === 0 ? ( +
No events emitted.
+ ) : ( + + + + + + + + + + + + {rows.map((r, i) => { + const name = eventName({ fromAddress: r.from, keys: r.keys, data: r.data }); + const fromLbl = contractLabel(r.from); + return ( + + + + + + + + ); + })} + +
#Decoded nameFromKeysData
{i} + {name ? ( + + {name} + + ) : ( + {shortHex(r.keys[0])} + )} + + {fromLbl ? {fromLbl} : null} + {shortHex(r.from)} + + {r.keys.slice(1).map((k) => shortHex(k)).join(" Β· ") || ( + β€” + )} + + [{r.data.length} felt{r.data.length === 1 ? "" : "s"}] +
+ )} +
+ ); +} diff --git a/src/components/starknet-simulation-results/ResourcesTab.tsx b/src/components/starknet-simulation-results/ResourcesTab.tsx new file mode 100644 index 0000000..c74e795 --- /dev/null +++ b/src/components/starknet-simulation-results/ResourcesTab.tsx @@ -0,0 +1,108 @@ +import type { FunctionInvocation, SimulationResult } from "@/chains/starknet/simulatorTypes"; +import { selectorName, shortHex, countSubtree } from "./decoders"; + +export function ResourcesTab({ + result, + frames, + onJumpToFrame, +}: { + result: SimulationResult; + frames: FunctionInvocation[]; + onJumpToFrame: (f: FunctionInvocation) => void; +}) { + const res = result.executionResources; + const gasRows = [ + { label: "L1 gas", val: res.l1Gas, color: "bg-blue-500" }, + { label: "L1 data gas", val: res.l1DataGas, color: "bg-cyan-500" }, + { label: "L2 gas", val: res.l2Gas, color: "bg-violet-500" }, + ]; + const gasMax = Math.max(...gasRows.map((r) => r.val), 1); + + const builtinRows = Object.entries(res.builtinInstanceCounter || {}).sort((a, b) => b[1] - a[1]); + const builtinMax = Math.max(...builtinRows.map(([, v]) => v), 1); + + const heatItems = frames.map((f) => ({ ci: f, share: countSubtree(f) })); + const heatMax = Math.max(...heatItems.map((h) => h.share), 1); + + return ( +
+
+
Gas waterfall
+
+ {gasRows.map((r) => ( +
+
+ {r.label} + {r.val.toLocaleString()} +
+
+
+
+
+ ))} +
+
+ +
+
Builtins distribution
+ {builtinRows.length === 0 ? ( +
No builtins recorded.
+ ) : ( +
+ {builtinRows.map(([k, v]) => ( +
+
+ {k} + {v.toLocaleString()} +
+
+
+
+
+ ))} +
+ )} +
+ +
+
+
Per-frame compute share
+ + heatmap = subtree size / total β€” synthetic until per-call resources land + +
+
+ {heatItems.map((h, i) => { + const pct = Math.round((h.share / heatMax) * 100); + const sel = selectorName(h.ci) || shortHex(h.ci.entryPointSelector); + const intensity = + pct > 75 + ? "bg-red-700/70" + : pct > 50 + ? "bg-orange-600/70" + : pct > 25 + ? "bg-amber-600/60" + : "bg-zinc-700/60"; + return ( + + ); + })} +
+
+
+ ); +} diff --git a/src/components/starknet-simulation-results/StarknetSimDemoPage.tsx b/src/components/starknet-simulation-results/StarknetSimDemoPage.tsx new file mode 100644 index 0000000..f606495 --- /dev/null +++ b/src/components/starknet-simulation-results/StarknetSimDemoPage.tsx @@ -0,0 +1,86 @@ +// Demo page that loads the same fixture the docs/sample-sim-ui.html mock +// uses and renders it through the React port. Lets us verify the components +// produce identical output to the static mock β€” and serves as a paste-in +// scratchpad: drop any /simulate response JSON into the textarea to render. + +import { useState } from "react"; +import type { SimulateResponse } from "@/chains/starknet/simulatorTypes"; +import { StarknetSimulationResults } from "./StarknetSimulationResults"; + +const STARTER_HINT = + "// Paste a /simulate JSON response here, or click 'Load sample' to fetch\n// docs/sample-sim-response.json from starknet-sim/."; + +export function StarknetSimDemoPage() { + const [raw, setRaw] = useState(STARTER_HINT); + const [response, setResponse] = useState(null); + const [error, setError] = useState(null); + + const loadSample = async () => { + try { + const r = await fetch( + "https://raw.githubusercontent.com/Timidan/starknet-sim/main/docs/sample-sim-response.json", + ); + const text = await r.text(); + setRaw(text); + const parsed = JSON.parse(text) as SimulateResponse; + setResponse(parsed); + setError(null); + } catch (e) { + setError(`Failed to fetch sample: ${e instanceof Error ? e.message : String(e)}`); + } + }; + + const parseRaw = () => { + try { + const parsed = JSON.parse(raw) as SimulateResponse; + setResponse(parsed); + setError(null); + } catch (e) { + setError(`JSON parse error: ${e instanceof Error ? e.message : String(e)}`); + } + }; + + return ( +
+
+
+
+

Starknet sim β€” React demo

+
+ + +
+
+