diff --git a/extras/demo-anypay/.env.sample b/extras/demo-anypay/.env.sample new file mode 100644 index 000000000..9d127567d --- /dev/null +++ b/extras/demo-anypay/.env.sample @@ -0,0 +1,7 @@ +# Sequence Project Access Key (Required) +VITE_ENV= +VITE_USE_V3_API=true +VITE_USE_V3_RELAYERS=true +VITE_PROJECT_ACCESS_KEY= +VITE_API_URL=https://api.sequence.app +VITE_INDEXER_URL=https://indexer.sequence.app \ No newline at end of file diff --git a/extras/demo-anypay/.gitignore b/extras/demo-anypay/.gitignore new file mode 100644 index 000000000..39946e7b0 --- /dev/null +++ b/extras/demo-anypay/.gitignore @@ -0,0 +1,44 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# env files (can opt-in for commiting if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# env files +.env +.env.local +.env.development +.env.production +.env.test +!.env.sample diff --git a/extras/demo-anypay/Makefile b/extras/demo-anypay/Makefile new file mode 100644 index 000000000..6f64bda45 --- /dev/null +++ b/extras/demo-anypay/Makefile @@ -0,0 +1,8 @@ +cors-anywhere: + docker run -d -p 8080:8080 --dns 8.8.4.4 --name cors-anywhere testcab/cors-anywhere + +cors-anywhere-stop: + docker stop cors-anywhere + +cors-anywhere-start: + docker start cors-anywhere diff --git a/extras/demo-anypay/README.md b/extras/demo-anypay/README.md new file mode 100644 index 000000000..5d67a2069 --- /dev/null +++ b/extras/demo-anypay/README.md @@ -0,0 +1,28 @@ +# Anypay Demo App + +A simple application demonstrating Sequence Anypay intent configuration. + +## Setup + +1. Clone the `sequence-core` repo if you haven't already. +2. Install dependencies and build the core packages: + ```bash + pnpm install + pnpm build + ``` +3. Copy `.env.sample` to `.env` and add your Sequence Project Access Key: + ```bash + cp apps/demo-anypay/.env.sample apps/demo-anypay/.env + ``` +4. Run the development server: + ```bash + pnpm --filter demo-anypay dev + ``` + +## Usage + +1. Open the app in your browser. +2. Connect your wallet (e.g., Metamask). +3. Select a token from your balance list. +4. Click "Pay" or "Mock Contract Interaction". +5. Observe the generated intent configuration details. diff --git a/extras/demo-anypay/eslint.config.js b/extras/demo-anypay/eslint.config.js new file mode 100644 index 000000000..3d2c2e9d4 --- /dev/null +++ b/extras/demo-anypay/eslint.config.js @@ -0,0 +1,4 @@ +import { nextJsConfig } from '@repo/eslint-config/next-js' + +/** @type {import("eslint").Linter.Config} */ +export default nextJsConfig diff --git a/extras/demo-anypay/index.html b/extras/demo-anypay/index.html new file mode 100644 index 000000000..c5c8cabed --- /dev/null +++ b/extras/demo-anypay/index.html @@ -0,0 +1,31 @@ + + + + + + Sequence Anypay Demo + + + + + + + + + + + +
+ + + diff --git a/extras/demo-anypay/package.json b/extras/demo-anypay/package.json new file mode 100644 index 000000000..f42992743 --- /dev/null +++ b/extras/demo-anypay/package.json @@ -0,0 +1,70 @@ +{ + "name": "demo-anypay", + "version": "0.1.0", + "type": "module", + "private": true, + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "lint:fix": "eslint --fix .", + "prettier": "prettier --list-different './src/**/*.{ts,tsx}'", + "prettier:fix": "prettier --list-different --write './src/**/*.{ts,tsx}'", + "format": "pnpm run lint:fix && pnpm run prettier:fix", + "preview": "vite preview", + "prepare": "husky", + "test": "echo tests are not implemented.", + "typecheck": "tsc --noEmit", + "reinstall": "rimraf -g ./node_modules && pnpm install" + }, + "dependencies": { + "@0xsequence/api": "workspace:*", + "@0xsequence/design-system": "^2.1.6", + "@0xsequence/hooks": "^5.1.0", + "@0xsequence/indexer": "^2.3.9", + "@0xsequence/network": "^2.3.9", + "@0xsequence/wagmi-connector": "^4.0.1", + "@0xsequence/wallet-core": "workspace:*", + "@0xsequence/wallet-primitives": "workspace:*", + "@0xsequence/wallet-wdk": "workspace:*", + "@anypay/sdk": "workspace:*", + "@radix-ui/react-popover": "^1.1.6", + "@repo/eslint-config": "workspace:*", + "@repo/typescript-config": "workspace:*", + "@tanstack/react-query": "^5.69.0", + "@types/react-syntax-highlighter": "^15.5.13", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "copy-to-clipboard": "^3.3.3", + "jotai": "^2.12.2", + "lucide-react": "^0.493.0", + "motion": "^12.6.2", + "ox": "^0.6.10", + "qrcode.react": "^4.2.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router": "^7.4.0", + "react-syntax-highlighter": "^15.6.1", + "tailwindcss": "^4.0.15", + "viem": "^2.24.1", + "wagmi": "^2.14.16" + }, + "devDependencies": { + "@eslint/js": "^9.21.0", + "@tailwindcss/vite": "^4.0.15", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.21.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^15.15.0", + "husky": "^9.1.7", + "prettier": "^3.5.3", + "rimraf": "^6.0.1", + "typescript": "~5.7.2", + "typescript-eslint": "^8.24.1", + "vite": "^6.2.0", + "zod": "^3.24.2" + } +} diff --git a/extras/demo-anypay/public/favicon.ico b/extras/demo-anypay/public/favicon.ico new file mode 100644 index 000000000..bf5da566d Binary files /dev/null and b/extras/demo-anypay/public/favicon.ico differ diff --git a/extras/demo-anypay/public/icon.svg b/extras/demo-anypay/public/icon.svg new file mode 100644 index 000000000..a08c04fe2 --- /dev/null +++ b/extras/demo-anypay/public/icon.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extras/demo-anypay/src/components/AccountInfoSection.tsx b/extras/demo-anypay/src/components/AccountInfoSection.tsx new file mode 100644 index 000000000..054c2cb5b --- /dev/null +++ b/extras/demo-anypay/src/components/AccountInfoSection.tsx @@ -0,0 +1,115 @@ +import { Connector, useConnect } from 'wagmi' +import type { UseAccountReturnType } from 'wagmi' +import { Button, Text, NetworkImage } from '@0xsequence/design-system' +import { AlertTriangle } from 'lucide-react' +import { SectionHeader } from '@/components/SectionHeader' +import { Address } from 'viem' + +interface AccountInfoSectionProps { + account: { + address?: Address + chainId?: number + status: UseAccountReturnType['status'] + } + connectors: readonly Connector[] + connect: (args: { connector: Connector; chainId?: number }) => void + disconnect: () => void + connectStatus: ReturnType['status'] + connectError?: Error | null +} + +export const AccountInfoSection = ({ + account, + connectors, + connect, + disconnect, + connectStatus, + connectError, +}: AccountInfoSectionProps) => { + return ( + +
+ 1 +
+

Account

+ + } + statusPill={ +
+ + {account.status === 'connected' ? 'Connected' : 'Disconnected'} +
+ } + > + {account.status === 'connected' ? ( +
+
+ + Address: + {account.address} + + +
+
+ + Chain: +
+ + {account.chainId} +
+
+ + Status: + + {account.status} + + +
+
+ ) : ( +
+ + Select a wallet to connect: + +
+ {connectors.map((connector: Connector) => ( + + ))} +
+
+ + Status: + + {account.status} + {connectStatus === 'pending' && (Connecting...)} + + + {connectError && ( + + + {connectError.message} + + )} +
+
+ )} +
+ ) +} diff --git a/extras/demo-anypay/src/components/AdvancedControlsSection.tsx b/extras/demo-anypay/src/components/AdvancedControlsSection.tsx new file mode 100644 index 000000000..0286fdfaa --- /dev/null +++ b/extras/demo-anypay/src/components/AdvancedControlsSection.tsx @@ -0,0 +1,250 @@ +import React from 'react' +import { Button, Text, NetworkImage } from '@0xsequence/design-system' +import { Layers, Info, Loader2 } from 'lucide-react' +import { getChainInfo, getExplorerUrl } from '@/utils/formatting' +import { IntentAction } from '@/types' +import { IntentCallsPayload } from '@0xsequence/api' +import { MetaTxn } from '@anypay/sdk' +import * as chains from 'viem/chains' + +const BASE_USDC_DESTINATION_CHAIN_ID = chains.base.id +const RECIPIENT_ADDRESS = '0x750EF1D7a0b4Ab1c97B7A623D7917CcEb5ea779C' +const MOCK_CONTRACT_ADDRESS = '0x0000000000000000000000000000000000000000' +const MOCK_CHAIN_ID = chains.arbitrum.id + +interface OriginCallParamsData { + to: string | null +} + +interface CustomCallDataForExplorer { + to: string + chainId: string +} + +interface AdvancedControlsSectionProps { + accountAddress: string | undefined + intentCallsPayloads: IntentCallsPayload[] | null + originCallParams: OriginCallParamsData | null + metaTxns: MetaTxn[] | null + intentActionType: IntentAction | null + customCallData: CustomCallDataForExplorer + isManualMetaTxnEnabled: boolean + setIsManualMetaTxnEnabled: (enabled: boolean) => void + selectedMetaTxnId: string | null + setSelectedMetaTxnId: (id: string | null) => void + handleSendMetaTxn: (selectedId: string | null) => void + sendMetaTxnPending: boolean +} + +export const AdvancedControlsSection: React.FC = ({ + accountAddress, + intentCallsPayloads, + originCallParams, + metaTxns, + intentActionType, + customCallData, + isManualMetaTxnEnabled, + setIsManualMetaTxnEnabled, + selectedMetaTxnId, + setSelectedMetaTxnId, + handleSendMetaTxn, + sendMetaTxnPending, +}) => { + if (!accountAddress || !intentCallsPayloads) { + return null + } + + return ( +
+ {/* Preview calculated address */} +
+ + Calculated Intent Address (used as recipient for origin call): + + {originCallParams?.to?.toString() || 'N/A'} + + + {originCallParams?.to && metaTxns && metaTxns.length > 0 && ( +
+ + Open in explorer (Calculated Intent Address): + +
+ {[...new Set(metaTxns.map((tx: MetaTxn) => tx.chainId))] + .map((chainIdStr: string | bigint) => parseInt(chainIdStr.toString())) // Ensure string before parseInt + .map((chainId: number) => { + const explorerUrl = getExplorerUrl(chainId, originCallParams.to!) + const chainInfo = getChainInfo(chainId) + if (!explorerUrl) return null + return ( + + ) + })} +
+
+ )} + {intentCallsPayloads && intentActionType && ( +
+ + Open in Explorer: (Final Destination Address) + +
+ {(() => { + const currentAction = intentActionType + let finalDestAddress: string | undefined = undefined + let finalDestChainId: number | undefined = undefined + let labelPrefix = 'Final Destination Address' + + if (currentAction === 'pay') { + finalDestAddress = RECIPIENT_ADDRESS + finalDestChainId = BASE_USDC_DESTINATION_CHAIN_ID + labelPrefix = 'Final Donation Address' + } else if (currentAction === 'mock_interaction') { + finalDestAddress = MOCK_CONTRACT_ADDRESS + finalDestChainId = MOCK_CHAIN_ID + labelPrefix = 'Mock Target Address' + } else if (currentAction === 'custom_call') { + finalDestAddress = customCallData.to + finalDestChainId = customCallData.chainId ? parseInt(customCallData.chainId) : undefined + labelPrefix = 'Custom Call Target Address' + } + + if (finalDestAddress && finalDestChainId !== undefined) { + const explorerUrl = getExplorerUrl(finalDestChainId, finalDestAddress) + const chainInfo = getChainInfo(finalDestChainId) + if (!explorerUrl) + return ( + + Explorer URL not available for this destination. + + ) + + return ( + + ) + } + return ( + + Final destination details not available for this action. + + ) + })()} +
+
+ )} +
+ + {/* Manual Meta Transaction Controls */} +
+
+ + + Manual Meta Transaction Controls + +
+ + {isManualMetaTxnEnabled ? 'Enabled' : 'Disabled'} + +
setIsManualMetaTxnEnabled(!isManualMetaTxnEnabled)} + className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors cursor-pointer ${ + isManualMetaTxnEnabled ? 'bg-purple-600' : 'bg-gray-700' + }`} + > + +
+
+
+ {isManualMetaTxnEnabled && ( +
+
+ + Select Meta Transaction: + +
+ {metaTxns?.map((tx: MetaTxn, index: number) => ( +
setSelectedMetaTxnId(tx.id)} + className={`p-2 rounded-md cursor-pointer transition-all duration-200 ${ + selectedMetaTxnId === tx.id + ? 'bg-purple-900/50 border border-purple-500' + : 'bg-gray-700/50 border border-gray-600 hover:bg-gray-600/50' + }`} + > +
+
+ + + #{index + 1} - Chain {tx.chainId.toString()} + +
+ + ID: {tx.id} + +
+
+ ))} +
+
+ +
+ +
+
+ )} +
+ + + {selectedMetaTxnId + ? 'This will send only the selected meta transaction' + : 'This will send all meta transactions in sequence'} + +
+
+
+ ) +} diff --git a/extras/demo-anypay/src/components/ChooseActionStep.tsx b/extras/demo-anypay/src/components/ChooseActionStep.tsx new file mode 100644 index 000000000..24911bad8 --- /dev/null +++ b/extras/demo-anypay/src/components/ChooseActionStep.tsx @@ -0,0 +1,245 @@ +import React from 'react' +import { Button, Text, NetworkImage } from '@0xsequence/design-system' +import { AlertTriangle, Zap, PenSquare } from 'lucide-react' +import * as chains from 'viem/chains' +import { SectionHeader } from '@/components/SectionHeader' +import { TokenBalance } from '@anypay/sdk' +import { IntentAction } from '@/types' + +interface ChooseActionStepProps { + isAutoExecuteEnabled: boolean + setIsAutoExecuteEnabled: (enabled: boolean) => void + handleActionClick: (action: IntentAction) => void + selectedToken: TokenBalance | null + createIntentPending: boolean + intentActionType: IntentAction | null + createIntentArgs: any + showCustomCallForm: boolean + setShowCustomCallForm: (show: boolean) => void + customCallData: { + to: string + data: string + value: string + chainId: string + tokenAmount: string + tokenAddress: string + } + setCustomCallData: (data: ChooseActionStepProps['customCallData']) => void + handleCustomCallSubmit: (e: React.FormEvent) => void +} + +export const ChooseActionStep: React.FC = ({ + isAutoExecuteEnabled, + setIsAutoExecuteEnabled, + handleActionClick, + selectedToken, + createIntentPending, + intentActionType, + createIntentArgs, + showCustomCallForm, + setShowCustomCallForm, + customCallData, + setCustomCallData, + handleCustomCallSubmit, +}) => { + return ( + +
+ 3 +
+

Choose Action

+ + } + > + {/* Auto-Execute Toggle */} +
+
+
+ + + Auto-Execute + + + (Automatically commits and executes transactions when ready) + +
+
+ + {isAutoExecuteEnabled ? 'Enabled' : 'Disabled'} + +
setIsAutoExecuteEnabled(!isAutoExecuteEnabled)} + className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors cursor-pointer ${ + isAutoExecuteEnabled ? 'bg-blue-600' : 'bg-gray-700' + }`} + > + +
+
+
+
+
+ + + +
+ + {showCustomCallForm && ( +
+
+
+ + setCustomCallData({ ...customCallData, to: e.target.value })} + placeholder="0x..." + className="w-full px-3 py-2 bg-gray-700/50 border border-gray-600 rounded-md text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500" + required + /> +
+
+ + setCustomCallData({ ...customCallData, data: e.target.value })} + placeholder="0x..." + className="w-full px-3 py-2 bg-gray-700/50 border border-gray-600 rounded-md text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500" + required + /> +
+
+ + setCustomCallData({ ...customCallData, value: e.target.value })} + placeholder="0" + className="w-full px-3 py-2 bg-gray-700/50 border border-gray-600 rounded-md text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500" + required + /> +
+
+ + setCustomCallData({ ...customCallData, chainId: e.target.value })} + placeholder="8453" + className="w-full px-3 py-2 bg-gray-700/50 border border-gray-600 rounded-md text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500" + required + /> +
+
+ + setCustomCallData({ ...customCallData, tokenAmount: e.target.value })} + placeholder="0" + className="w-full px-3 py-2 bg-gray-700/50 border border-gray-600 rounded-md text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500" + required + /> +
+
+ + setCustomCallData({ ...customCallData, tokenAddress: e.target.value })} + placeholder="0x..." + className="w-full px-3 py-2 bg-gray-700/50 border border-gray-600 rounded-md text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500" + required + /> +
+
+ + +
+
+
+ )} + + {!selectedToken && ( + + + Please select a token first. + + )} +
+ ) +} diff --git a/extras/demo-anypay/src/components/CommitIntentStep.tsx b/extras/demo-anypay/src/components/CommitIntentStep.tsx new file mode 100644 index 000000000..13a798ad1 --- /dev/null +++ b/extras/demo-anypay/src/components/CommitIntentStep.tsx @@ -0,0 +1,187 @@ +import React from 'react' +import { Button, Text } from '@0xsequence/design-system' +import { IntentCallsPayload, IntentPrecondition, AnypayLifiInfo, GetIntentConfigReturn } from '@0xsequence/api' +import { Loader2, AlertCircle, Zap } from 'lucide-react' +import { SectionHeader } from '@/components/SectionHeader' + +interface CommitIntentStepProps { + intentCallsPayloads: IntentCallsPayload[] | null + intentPreconditions: IntentPrecondition[] | null + lifiInfos: AnypayLifiInfo[] | null + verificationStatus: { + success: boolean + receivedAddress?: string + calculatedAddress?: string + } | null + commitIntentConfigError: Error | null + commitIntentConfigSuccess: boolean + committedIntentAddress: string | null + isLoadingCommittedConfig: boolean + committedConfigError: Error | null + committedIntentConfigData: GetIntentConfigReturn | undefined + commitIntentConfig: (args: { + walletAddress: string | null + mainSigner: string + calls: IntentCallsPayload[] + preconditions: IntentPrecondition[] + lifiInfos: AnypayLifiInfo[] + }) => void + isCommitButtonDisabled: boolean + commitButtonText: React.ReactNode + calculatedIntentAddress: string | null + accountAddress: string | undefined +} + +export const CommitIntentStep: React.FC = ({ + intentCallsPayloads, + intentPreconditions, + lifiInfos, + verificationStatus, + commitIntentConfigError, + commitIntentConfigSuccess, + committedIntentAddress, + isLoadingCommittedConfig, + committedConfigError, + committedIntentConfigData, + commitIntentConfig, + isCommitButtonDisabled, + commitButtonText, + calculatedIntentAddress, + accountAddress, +}) => { + if (!intentCallsPayloads || !intentPreconditions) { + return null + } + + return ( + <> + +
+ 5 +
+

Commit Intent

+ + } + > +
+
+ {verificationStatus && ( +
+
+
+ + {verificationStatus.success ? 'Address Verification Successful' : 'Address Verification Failed'} + +
+
+ Calculated: + + {verificationStatus.calculatedAddress || 'N/A'} + +
+
+ Expected (from precondition): + + {verificationStatus.receivedAddress || 'N/A'} + +
+
+
+
+
+ )} + + {commitIntentConfigError && ( +
+ + Commit Error: {commitIntentConfigError.message} + +
+ )} + {commitIntentConfigSuccess && ( +
+ + Intent configuration committed successfully! + +
+ )} + + {committedIntentAddress && commitIntentConfigSuccess && ( +
+
+ + Committed Configuration Details on Database + +
+ {isLoadingCommittedConfig && ( +
+ + + Loading committed config... + +
+ )} + {committedConfigError && ( +
+ + + Error fetching config: {committedConfigError.message} + +
+ )} + {committedIntentConfigData && !isLoadingCommittedConfig && !committedConfigError && ( +
+                    {JSON.stringify(committedIntentConfigData, (_, v) => (typeof v === 'bigint' ? v.toString() : v), 2)}
+                  
+ )} +
+ )} +
+
+
+
+
+
+ + + Commit Intent Action + + (Verify and Send Transaction) + + + +
+
+
+ + ) +} diff --git a/extras/demo-anypay/src/components/Header.tsx b/extras/demo-anypay/src/components/Header.tsx new file mode 100644 index 000000000..333bc2aee --- /dev/null +++ b/extras/demo-anypay/src/components/Header.tsx @@ -0,0 +1,41 @@ +import React from 'react' +import { Link, useLocation } from 'react-router' + +export const Header: React.FC = () => { + const location = useLocation() + + const isActive = (path: string) => { + return location.pathname === path ? 'text-blue-500 font-bold' : 'text-gray-600' + } + + return ( +
+ +
+ ) +} + +export default Header diff --git a/extras/demo-anypay/src/components/IntentQuoteDisplayStep.tsx b/extras/demo-anypay/src/components/IntentQuoteDisplayStep.tsx new file mode 100644 index 000000000..f1800c331 --- /dev/null +++ b/extras/demo-anypay/src/components/IntentQuoteDisplayStep.tsx @@ -0,0 +1,495 @@ +import React from 'react' +import { Text, NetworkImage } from '@0xsequence/design-system' +import { Account, TokenBalance, MetaTxn } from '@anypay/sdk' +import { IntentPrecondition, AnypayLifiInfo, IntentCallsPayload } from '@0xsequence/api' +import { + Loader2, + AlertCircle, + AlertTriangle, + Zap, + Info, + Clipboard, + Layers, + Box, + PenSquare, + ShieldCheck, +} from 'lucide-react' +import { SectionHeader } from '@/components/SectionHeader' +import { getChainInfo } from '@/utils/formatting' +import { IntentAction } from '@/types' +import { Hex, formatUnits, isAddressEqual, zeroAddress } from 'viem' +import { Address as OxAddress } from 'ox' +import * as chains from 'viem/chains' + +// Mock Data +const BASE_USDC_DESTINATION_CHAIN_ID = chains.base.id +const RECIPIENT_ADDRESS = '0x750EF1D7a0b4Ab1c97B7A623D7917CcEb5ea779C' +const AMOUNT = 300000n +const MOCK_CONTRACT_ADDRESS = '0x0000000000000000000000000000000000000000' +const MOCK_CHAIN_ID = chains.arbitrum.id +const MOCK_TOKEN_ADDRESS = '0x0000000000000000000000000000000000000000' +const MOCK_TOKEN_AMOUNT = '3000000' + +interface IntentQuoteDisplayStepProps { + createIntentPending: boolean + createIntentError: Error | null + intentCallsPayloads: IntentCallsPayload[] | null + intentPreconditions: IntentPrecondition[] | null + metaTxns: MetaTxn[] | null + lifiInfos: AnypayLifiInfo[] | null + intentActionType: IntentAction | null + selectedToken: TokenBalance | null + account: Account | undefined + calculatedIntentAddress: string | null + customCallData: { + to: string + value: string + chainId: string + data: string + } +} + +export const IntentQuoteDisplayStep: React.FC = ({ + createIntentPending, + createIntentError, + intentCallsPayloads, + intentPreconditions, + metaTxns, + lifiInfos, + intentActionType, + selectedToken, + account, + calculatedIntentAddress, + customCallData, +}) => { + if (createIntentPending) { + return ( +
+
+
+ + + Generating intent quote... + +
+
+
+ ) + } + + if (createIntentError) { + return ( +
+
+ + + Error: {createIntentError.message} + +
+
+ ) + } + + if (!intentCallsPayloads) { + return ( +
+
+ + + Select a token and click an action above to generate the intent quote. + +
+
+ ) + } + + const primarySubtitleNode = (() => { + if (!intentCallsPayloads || !intentActionType || !selectedToken) return null + + if (intentActionType === 'pay') { + const baseChainInfo = getChainInfo(BASE_USDC_DESTINATION_CHAIN_ID) + const baseChainName = baseChainInfo?.name || `Chain ID ${BASE_USDC_DESTINATION_CHAIN_ID}` + return ( + <> + + Intent: Send {formatUnits(AMOUNT, 6)} USDC + to{' '} + + {RECIPIENT_ADDRESS} + + on {baseChainName} + + ) + } else if (intentActionType === 'mock_interaction') { + const mockChainInfo = getChainInfo(MOCK_CHAIN_ID) + const mockChainName = mockChainInfo?.name || `Chain ID ${MOCK_CHAIN_ID}` + return ( + <> + + Intent: Target{' '} + + {MOCK_CONTRACT_ADDRESS} + + on {mockChainName}. + {(MOCK_TOKEN_ADDRESS || MOCK_TOKEN_AMOUNT) && ( + + (Token:{' '} + + {MOCK_TOKEN_ADDRESS || 'N/A'} + + , Amount: {MOCK_TOKEN_AMOUNT || 'N/A'} wei) + + )} + + ) + } else if (intentActionType === 'custom_call') { + const destChainId = parseInt(customCallData.chainId) + const destChainInfo = getChainInfo(destChainId) + const destChainName = destChainInfo?.name || `Chain ID ${destChainId}` + const formattedVal = formatUnits( + BigInt(customCallData.value || '0'), + destChainInfo?.nativeCurrency.decimals || 18, + ) + const nativeSymbol = destChainInfo?.nativeCurrency.symbol || 'ETH' + + return ( + <> + + Intent: Call{' '} + + {customCallData.to} + + on {destChainName}. + {BigInt(customCallData.value || '0') > 0 && ( + + (Value:{' '} + + {formattedVal} {nativeSymbol} + + ) + + )} + + ) + } + return null + })() + + const routeSubtitleNode = (() => { + if ( + !intentCallsPayloads || + !intentActionType || + !selectedToken || + !account?.address || + !lifiInfos || + !intentPreconditions + ) + return null + + try { + const tokenName = selectedToken.contractInfo?.symbol || selectedToken.contractInfo?.name || 'Token' + const selectedTokenChainIdStr = selectedToken.chainId.toString() + const originChainInfo = getChainInfo(selectedToken.chainId) + const originChainName = originChainInfo?.name || `Chain ID ${selectedToken.chainId}` + let amountToSendFormatted = '[Amount Error]' + + const isNativeEquivalent = selectedToken.contractAddress === zeroAddress + let amountBigInt: bigint | undefined = undefined + let decimals: number | undefined = undefined + + if (isNativeEquivalent) { + const nativePrecondition = intentPreconditions.find( + (p: IntentPrecondition) => + (p.type === 'transfer-native' || p.type === 'native-balance') && p.chainId === selectedTokenChainIdStr, + ) + const nativeMinAmount = nativePrecondition?.data?.minAmount ?? nativePrecondition?.data?.min + if (nativeMinAmount !== undefined) { + amountBigInt = BigInt(nativeMinAmount) + decimals = selectedToken.contractInfo?.decimals || 18 + } + } else { + const erc20Precondition = intentPreconditions.find( + (p: IntentPrecondition) => + p.type === 'erc20-balance' && + p.chainId === selectedTokenChainIdStr && + p.data?.token && + isAddressEqual(OxAddress.from(p.data.token), OxAddress.from(selectedToken.contractAddress as Hex)), + ) + const erc20MinAmount = erc20Precondition?.data?.min + if (erc20MinAmount !== undefined) { + amountBigInt = BigInt(erc20MinAmount) + decimals = selectedToken.contractInfo?.decimals + } + } + + if (amountBigInt !== undefined && decimals !== undefined) { + amountToSendFormatted = formatUnits(amountBigInt, decimals) + } else { + console.warn('Could not determine amount to send from preconditions for subtitle.') + amountToSendFormatted = '[Unknown Amount]' + } + + return ( + <> + + + Via route: Sending{' '} + + {amountToSendFormatted} {tokenName} + + on {originChainName} to intent addr: + + {calculatedIntentAddress || 'N/A'} + + + + ) + } catch (routeError) { + console.error('Error processing route subtitle data:', routeError) + return ( + + + Error generating route summary. + + ) + } + })() + + return ( + +
+ 4 +
+

Intent Quote

+ + } + actionSubtitle={primarySubtitleNode} + subtitle={routeSubtitleNode} + > +
+ + + Intent all payloads + + (List of all payloads that are pre-authorized to be executed): + + + + {intentCallsPayloads && intentCallsPayloads.length > 0 ? ( +
+
+
+ + + Raw JSON Data + +
+
+                {JSON.stringify(intentCallsPayloads, null, 2)}
+              
+
+ {intentCallsPayloads.map((operation, index) => ( +
+
+ + Payload #{index + 1} + +
+ {operation.calls && + operation.calls.length > 0 && + operation.calls.map((call, callIndex) => ( +
+
+ + To: {' '} + {call.to} + +
+
+ + Value: + {call.value || '0'} + +
+
+ +
+ Data: +
+ {call.data || '0x'} +
+
+
+
+
+ + Chain ID: + + {operation.chainId.toString()} + + + + + {getChainInfo(parseInt(operation.chainId.toString()))?.name || 'Unknown Chain'} + +
+
+ ))} +
+ ))} +
+ ) : ( +
+ + No operations available. + +
+ )} + + {metaTxns && metaTxns.length > 0 && ( +
+ + + Meta-transactions + + (Transactions that will be relayed): + + +
+
+
+ + + Raw JSON Data + +
+
+                  {JSON.stringify(metaTxns, null, 2)}
+                
+
+ {metaTxns.map((tx, index) => ( +
+
+
+ + ID: + {tx.id || 'N/A'} + +
+
+ + Contract: + {tx.contract || 'N/A'} + +
+
+ + Chain ID: + + {tx.chainId.toString()} + + + + {getChainInfo(parseInt(tx.chainId.toString()))?.name || 'Unknown Chain'} + + +
+
+ +
+ Input Data: +
+ {tx.input || '0x'} +
+
+
+
+
+
+ ))} +
+
+ )} + + {lifiInfos && lifiInfos.length > 0 && ( +
+ + + Lifi Infos + + (Details from Lifi integration): + + +
+
+
+ + + Raw JSON Data + +
+
+                  {JSON.stringify(lifiInfos, null, 2)}
+                
+
+
+
+ )} + + {intentPreconditions && intentPreconditions.length > 0 && ( + <> + + + Preconditions + + (Conditions that are to be met for the intent to be executed): + + +
    + {intentPreconditions.map((cond, index) => ( +
  • +
    +                    {JSON.stringify(cond, (_, value) => (typeof value === 'bigint' ? value.toString() : value), 2)}
    +                  
    +
  • + ))} +
+ + )} + {!intentPreconditions?.length && ( +
+ + + No specific preconditions returned for this intent. + +
+ )} +
+
+ ) +} diff --git a/extras/demo-anypay/src/components/OriginCallStep.tsx b/extras/demo-anypay/src/components/OriginCallStep.tsx new file mode 100644 index 000000000..dc2249fa5 --- /dev/null +++ b/extras/demo-anypay/src/components/OriginCallStep.tsx @@ -0,0 +1,134 @@ +import React from 'react' +import { Button, Text, NetworkImage } from '@0xsequence/design-system' +import { Zap } from 'lucide-react' +import { SectionHeader } from '@/components/SectionHeader' +import { getChainInfo } from '@/utils/formatting' +import { IntentCallsPayload, IntentPrecondition } from '@0xsequence/api' + +interface OriginCallParamsData { + to: string | null + data: string | null + value: bigint | null + chainId: number | null + error?: string +} + +interface OriginCallStepProps { + intentCallsPayloads: IntentCallsPayload[] | null + intentPreconditions: IntentPrecondition[] | null + accountAddress: string | undefined + originCallParams: OriginCallParamsData | null + isSendButtonDisabled: boolean + sendButtonText: React.ReactNode + handleSendOriginCall: () => void +} + +export const OriginCallStep: React.FC = ({ + intentCallsPayloads, + intentPreconditions, + accountAddress, + originCallParams, + isSendButtonDisabled, + sendButtonText, + handleSendOriginCall, +}) => { + if (!intentCallsPayloads || !intentPreconditions) { + return null + } + + return ( + +
+ 6 +
+

Origin Call

+ + } + > +
+ + + Transaction Details + + (Send this transaction to execute the intent): + + +
+
+ + From: + {accountAddress ?? '...'} + +
+
+ + To: + + {originCallParams?.to ?? (originCallParams?.error ? 'Error' : 'Calculating...')} + + +
+
+ + Value: + + {originCallParams?.value?.toString() ?? (originCallParams?.error ? 'Error' : 'Calculating...')} + + +
+
+ +
+ Data: +
+ + {originCallParams?.data ?? (originCallParams?.error ? 'Error' : 'Calculating...')} + +
+
+
+
+
+ + Chain ID: + + {originCallParams?.chainId?.toString() ?? (originCallParams?.error ? 'Error' : 'Calculating...')} + + + {originCallParams?.chainId && ( + <> + + + {getChainInfo(originCallParams.chainId)?.name || 'Unknown Chain'} + + + )} +
+ {originCallParams?.error && ( +
+ + Error calculating params: {originCallParams.error} + +
+ )} +
+ +
+
+
+
+ ) +} diff --git a/extras/demo-anypay/src/components/RelayerStatusSection.tsx b/extras/demo-anypay/src/components/RelayerStatusSection.tsx new file mode 100644 index 000000000..193d7fb0c --- /dev/null +++ b/extras/demo-anypay/src/components/RelayerStatusSection.tsx @@ -0,0 +1,285 @@ +import { Text, NetworkImage } from '@0xsequence/design-system' +import { Box, Layers } from 'lucide-react' +import { SectionHeader } from '@/components/SectionHeader' +import { MetaTxn, MetaTxnStatus, OriginCallParams } from '@anypay/sdk' +import { getChainInfo, getExplorerUrlForTransaction, formatTimeSinceOrigin } from '@/utils/formatting' + +interface OriginCallStatusData { + txnHash?: string + status?: string + revertReason?: string | null + gasUsed?: number + effectiveGasPrice?: string +} + +interface RelayerStatusSectionProps { + originCallStatus: OriginCallStatusData | null + isWaitingForReceipt: boolean + metaTxns: MetaTxn[] | null + metaTxnMonitorStatuses: MetaTxnStatus + originBlockTimestamp: number | null + metaTxnBlockTimestamps: { + [key: string]: { timestamp: number | null; error?: string } + } + originCallParams: OriginCallParams | null +} + +export const RelayerStatusSection = ({ + originCallStatus, + isWaitingForReceipt, + metaTxns, + metaTxnMonitorStatuses, + originBlockTimestamp, + metaTxnBlockTimestamps, + originCallParams, +}: RelayerStatusSectionProps) => { + return ( + +
+ 7 +
+

Relayer Status

+ + } + > +
+ {/* Origin Call Status */} +
+ + + Origin Call Status + +
+
+ + Transaction Hash: + + {originCallStatus?.txnHash || 'Not sent yet'} + + {originCallStatus?.txnHash && originCallParams?.chainId && ( + + )} + +
+
+ + Status: + + {originCallStatus?.status || 'Idle'} + + {isWaitingForReceipt && (Waiting for confirmation...)} + +
+ {originCallStatus?.revertReason && ( +
+ + Revert Reason: + {originCallStatus.revertReason} + +
+ )} +
+ + Gas Used: + {originCallStatus?.gasUsed || '0'} + +
+
+ + Effective Gas Price: + {originCallStatus?.effectiveGasPrice || '0'} + +
+ {typeof originBlockTimestamp === 'number' && Number.isFinite(originBlockTimestamp) && ( +
+ + Block Timestamp: + + {new Date(originBlockTimestamp * 1000).toLocaleString()} (Epoch: {originBlockTimestamp}) + + +
+ )} +
+
+ + {/* Meta Transactions Status */} +
+ + + Meta Transactions Status + +
+ {metaTxns?.map((metaTxn: MetaTxn, index: number) => { + const operationKey = `${metaTxn.chainId}-${metaTxn.id}` + const monitorStatus = metaTxnMonitorStatuses[operationKey] + + const getStatusDisplay = () => { + if (!monitorStatus) return 'Pending' + switch (monitorStatus.status) { + case 'confirmed': + return 'Success' + case 'failed': + return 'Failed' + case 'unknown': + return 'Unknown' + default: + return 'Pending' + } + } + + const getStatusClass = () => { + if (!monitorStatus) return 'bg-yellow-900/30 text-yellow-400 border border-yellow-700/30' + switch (monitorStatus.status) { + case 'confirmed': + return 'bg-green-900/30 text-green-400 border border-green-700/30' + case 'failed': + return 'bg-red-900/30 text-red-400 border border-red-700/30' + default: + return 'bg-yellow-900/30 text-yellow-400 border border-yellow-700/30' + } + } + + return ( +
+
+ + + Meta Transaction #{index + 1} - Chain {metaTxn.chainId} + + ({getChainInfo(parseInt(metaTxn.chainId))?.name || 'Unknown Chain'}) + + +
+ {getStatusDisplay()} +
+
+
+
+ + ID: + {metaTxn.id || 'N/A'} + +
+ {monitorStatus?.status === 'confirmed' && monitorStatus.transactionHash && ( +
+ + Tx Hash: + + {String(monitorStatus.transactionHash)} + + +
+ )} + {metaTxnBlockTimestamps && metaTxnBlockTimestamps[operationKey]?.timestamp && ( +
+ + Block Timestamp: + + {new Date((metaTxnBlockTimestamps[operationKey]?.timestamp || 0) * 1000).toLocaleString()} + +
+ + (Executed:{' '} + {formatTimeSinceOrigin( + metaTxnBlockTimestamps[operationKey]?.timestamp || null, + originBlockTimestamp, + )} + ) + +
+
+ )} + {monitorStatus?.status === 'confirmed' && monitorStatus && monitorStatus.transactionHash && ( + + )} + {monitorStatus?.status === 'failed' && monitorStatus && 'reason' in monitorStatus && ( + + Error: + {String((monitorStatus as any).reason)} + + )} + {/* {monitorStatus?.status === 'confirmed' && monitorStatus.data && typeof monitorStatus.data.receipt.!== 'undefined' && ( + + Gas Used: + {String(monitorStatus.data.gasUsed)} + + )} */} + {(monitorStatus?.status === 'confirmed' || monitorStatus?.status === 'failed') && monitorStatus && ( +
+ + Meta Transaction Status Details: + +
+                          {JSON.stringify(
+                            monitorStatus,
+                            (_, value) => (typeof value === 'bigint' ? value.toString() : value),
+                            2,
+                          )}
+                        
+
+ )} +
+
+ ) + })} + {(!metaTxns || metaTxns.length === 0) && ( +
+ + No meta transactions available yet. Select a token and action first. + +
+ )} +
+
+
+
+ ) +} diff --git a/extras/demo-anypay/src/components/SectionHeader.tsx b/extras/demo-anypay/src/components/SectionHeader.tsx new file mode 100644 index 000000000..3ac720aec --- /dev/null +++ b/extras/demo-anypay/src/components/SectionHeader.tsx @@ -0,0 +1,88 @@ +import { useState, ReactNode } from 'react' +import { ChevronDown, ChevronRight } from 'lucide-react' + +interface SectionHeaderProps { + title: ReactNode + children?: ReactNode + defaultOpen?: boolean + isCollapsible?: boolean + statusPill?: ReactNode + noFrame?: boolean + className?: string + titleContainerClassName?: string + contentContainerClassName?: string + actionSubtitle?: ReactNode + subtitle?: ReactNode +} + +export const SectionHeader: React.FC = ({ + title, + children, + defaultOpen = false, + isCollapsible = false, + statusPill, + noFrame = false, + className = '', + titleContainerClassName = '', + contentContainerClassName = '', + actionSubtitle, + subtitle, +}) => { + const [isOpen, setIsOpen] = useState(defaultOpen && isCollapsible) + + const handleHeaderClick = () => { + if (isCollapsible) { + setIsOpen(!isOpen) + } + } + + const rootClasses = `${noFrame ? '' : 'border border-gray-700/50 rounded-lg'} ${className}` + + let titleEffectiveClasses = `w-full flex items-center justify-between ${titleContainerClassName}` + if (isCollapsible) { + titleEffectiveClasses += ' cursor-pointer transition-colors duration-200' + if (!noFrame) { + titleEffectiveClasses += ' hover:bg-gray-700/90' + } + } + + if (!noFrame) { + if (isCollapsible && isOpen) { + titleEffectiveClasses += ' rounded-t-lg' + } else { + titleEffectiveClasses += ' rounded-lg' + } + } + + const contentEffectiveClasses = `${contentContainerClassName} ${!noFrame && isCollapsible && isOpen ? 'rounded-b-lg' : ''}` + + return ( +
+
+
+ {typeof title === 'string' ? ( +
{title}
+ ) : ( + title + )} + {actionSubtitle && ( +
{actionSubtitle}
+ )} + {subtitle &&
{subtitle}
} +
+ {statusPill ? ( + statusPill + ) : isCollapsible ? ( + isOpen ? ( + + ) : ( + + ) + ) : null} +
+ + {isCollapsible && isOpen && children &&
{children}
} + {!isCollapsible && children &&
{children}
} +
+ ) +} diff --git a/extras/demo-anypay/src/components/SelectOriginTokenStep.tsx b/extras/demo-anypay/src/components/SelectOriginTokenStep.tsx new file mode 100644 index 000000000..4473284a6 --- /dev/null +++ b/extras/demo-anypay/src/components/SelectOriginTokenStep.tsx @@ -0,0 +1,163 @@ +import React from 'react' +import { Text, NetworkImage } from '@0xsequence/design-system' +import { Hex, zeroAddress } from 'viem' +import { TokenBalance, NativeTokenBalance } from '@anypay/sdk' +import { SectionHeader } from '@/components/SectionHeader' +import { getChainInfo, formatBalance } from '@/utils/formatting' + +interface SelectOriginTokenStepProps { + isLoadingBalances: boolean + balanceError: Error | null + sortedTokens: (TokenBalance | NativeTokenBalance)[] + selectedToken: TokenBalance | null + setSelectedToken: (token: TokenBalance | null) => void + clearIntent: () => void +} + +export const SelectOriginTokenStep: React.FC = ({ + isLoadingBalances, + balanceError, + sortedTokens, + selectedToken, + setSelectedToken, + clearIntent, +}) => { + return ( + +
+ 2 +
+

Select Origin Token

+ + } + statusPill={ +
+ 0 ? 'bg-green-400' : 'bg-red-400'} mr-2 animate-pulse`} + > + {isLoadingBalances ? 'Loading...' : sortedTokens.length > 0 ? `${sortedTokens.length} Tokens` : 'No Tokens'} +
+ } + > + {isLoadingBalances && ( + + Loading balances... + + )} + {balanceError && ( + + Error loading balances: {balanceError.message} + + )} + {!isLoadingBalances && !balanceError && sortedTokens.length === 0 && ( + + No tokens with balance > 0 found across any chain. + + )} +
+ {sortedTokens.map((token) => { + const isNative = !('contractAddress' in token) + const tokenBalance = isNative ? undefined : (token as TokenBalance) + const chainInfo = getChainInfo(token.chainId) + const nativeSymbol = chainInfo?.nativeCurrency.symbol || 'ETH' + + return ( +
{ + if (isNative) { + const nativeToken = token as NativeTokenBalance + const nativeAsTokenBalanceShape = { + ...nativeToken, + contractAddress: zeroAddress as Hex, + contractType: 'ERC20', // Mimic ERC20 for selection logic + contractInfo: { + // Basic contractInfo structure + name: chainInfo?.nativeCurrency.name || 'Native Token', + symbol: chainInfo?.nativeCurrency.symbol || 'ETH', + decimals: 18, + }, + // Ensure these fields are added to match the original cast's intent in home-index-route + blockHash: 'blockHash' in nativeToken && nativeToken.blockHash ? nativeToken.blockHash : '', + blockNumber: 'blockNumber' in nativeToken && nativeToken.blockNumber ? nativeToken.blockNumber : 0, + uniqueCollectibles: + 'uniqueCollectibles' in nativeToken && nativeToken.uniqueCollectibles + ? nativeToken.uniqueCollectibles + : [], + isSummary: + 'isSummary' in nativeToken && typeof nativeToken.isSummary === 'boolean' + ? nativeToken.isSummary + : true, + } + setSelectedToken(nativeAsTokenBalanceShape as unknown as TokenBalance) + } else { + setSelectedToken(token as TokenBalance) + } + clearIntent() + }} + className={`p-3 rounded-lg cursor-pointer transition-all duration-200 flex justify-between items-center ${selectedToken?.chainId === token.chainId && (isNative ? selectedToken?.contractAddress === zeroAddress : selectedToken?.contractAddress === (token as TokenBalance).contractAddress) ? 'bg-gradient-to-r from-blue-700 to-blue-900 hover:from-blue-600 hover:to-blue-800 shadow-lg' : 'bg-gray-700/80 hover:bg-gray-600/90 hover:shadow-md'}`} + > +
+
+
+ + {isNative ? nativeSymbol[0] : tokenBalance?.contractInfo?.symbol?.[0] || 'T'} + +
+
+ +
+
+
+ + {isNative + ? `${nativeSymbol} (${chainInfo?.name || 'Unknown Chain'})` + : tokenBalance?.contractInfo?.symbol || tokenBalance?.contractInfo?.name || 'Token'} + + {isNative && ( + + Native + + )} +
+
+ + {formatBalance(token)} + +
+ ) + })} +
+ {selectedToken && ( +
+ + Selected + + {selectedToken.contractInfo?.symbol || 'Native Token'} + + + Chain: {selectedToken.chainId} + + + Address: {selectedToken.contractAddress} + + +
+ )} +
+ ) +} diff --git a/extras/demo-anypay/src/index.css b/extras/demo-anypay/src/index.css new file mode 100644 index 000000000..8f2f9d537 --- /dev/null +++ b/extras/demo-anypay/src/index.css @@ -0,0 +1,29 @@ +@import 'tailwindcss'; +@import '@0xsequence/design-system/preset'; + +:root { + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +html, body { + @apply bg-gray-950; + margin: 0; + padding: 0; + height: auto; + min-height: 100%; +} + +body { + @apply bg-gradient-to-b from-gray-900 to-gray-950; + background-attachment: fixed; + height: auto; + min-height: 100%; +} + +#root { + height: auto; + min-height: 100%; +} diff --git a/extras/demo-anypay/src/index.tsx b/extras/demo-anypay/src/index.tsx new file mode 100644 index 000000000..ef608e853 --- /dev/null +++ b/extras/demo-anypay/src/index.tsx @@ -0,0 +1,61 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import { RouterProvider } from 'react-router' +import { SequenceHooksProvider } from '@0xsequence/hooks' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { Provider as JotaiProvider } from 'jotai' +import { router } from './routes' + +import { globalStore } from './store' + +import './index.css' +import { ThemeProvider } from '@0xsequence/design-system' +import { config } from './wagmi.config' +import { WagmiProvider } from 'wagmi' + +const queryClient = new QueryClient() +const apiUrl = import.meta.env.VITE_API_URL || 'https://api.sequence.app' +const indexerUrl = import.meta.env.VITE_INDEXER_URL || 'https://indexer.sequence.app' + +createRoot(document.getElementById('root')!).render( + + + + + + + + + + + + + , +) diff --git a/extras/demo-anypay/src/routes.tsx b/extras/demo-anypay/src/routes.tsx new file mode 100644 index 000000000..a5e03952b --- /dev/null +++ b/extras/demo-anypay/src/routes.tsx @@ -0,0 +1,25 @@ +import { createBrowserRouter } from 'react-router' +import { ErrorRoute } from './routes/error' +import { RootLayout } from './routes/root-layout' +import { HomeIndexRoute } from './routes/home/home-index-route' +import Widget from './routes/widget' + +export const router = createBrowserRouter([ + { + path: '/', + Component: RootLayout, + ErrorBoundary: ErrorRoute, + children: [ + { + index: true, + Component: HomeIndexRoute, + }, + { + path: 'widget', + Component: Widget, + }, + ], + }, +]) + +export default router diff --git a/extras/demo-anypay/src/routes/error.tsx b/extras/demo-anypay/src/routes/error.tsx new file mode 100644 index 000000000..9f80a51fe --- /dev/null +++ b/extras/demo-anypay/src/routes/error.tsx @@ -0,0 +1,11 @@ +import { Text } from '@0xsequence/design-system' + +export const ErrorRoute = () => { + return ( +
+ + Error Boundry + +
+ ) +} diff --git a/extras/demo-anypay/src/routes/home/home-index-route.tsx b/extras/demo-anypay/src/routes/home/home-index-route.tsx new file mode 100644 index 000000000..4b1f1eeba --- /dev/null +++ b/extras/demo-anypay/src/routes/home/home-index-route.tsx @@ -0,0 +1,605 @@ +import { useState, useEffect } from 'react' +import { useAccount, useConnect, useDisconnect } from 'wagmi' +import { Hex } from 'viem' +import { AbiFunction, Address } from 'ox' +import * as chains from 'viem/chains' +import { useAnyPay, useTokenBalances, TokenBalance, Account } from '@anypay/sdk' +import { Loader2 } from 'lucide-react' +import { AccountInfoSection } from '@/components/AccountInfoSection' +import { IntentAction } from '@/types' +import { SelectOriginTokenStep } from '@/components/SelectOriginTokenStep' +import { ChooseActionStep } from '@/components/ChooseActionStep' +import { IntentQuoteDisplayStep } from '@/components/IntentQuoteDisplayStep' +import { CommitIntentStep } from '@/components/CommitIntentStep' +import { OriginCallStep } from '@/components/OriginCallStep' +import { AdvancedControlsSection } from '@/components/AdvancedControlsSection' +import { RelayerStatusSection } from '@/components/RelayerStatusSection' + +// Mock Data +const MOCK_CONTRACT_ADDRESS = '0x0000000000000000000000000000000000000000' +// Mock Calldata for interaction +const MOCK_TRANSFER_DATA: Hex = `0xabcdef` +// Mock Chain ID for interaction +const MOCK_CHAIN_ID = chains.arbitrum.id +// Mock Token Address for interaction on destination chain +const MOCK_TOKEN_ADDRESS = '0x0000000000000000000000000000000000000000' +// Mock Token Amount for interaction on destination chain +const MOCK_TOKEN_AMOUNT = '3000000' + +// Chain ID for destination chain (base) +const BASE_USDC_DESTINATION_CHAIN_ID = chains.base.id +// USDC Address for interaction on destination chain (base) +const BASE_USDC_ADDRESS = '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913' +// Give Directly - recipient Address for interaction on destination chain (base) +const RECIPIENT_ADDRESS = '0x750EF1D7a0b4Ab1c97B7A623D7917CcEb5ea779C' +// Amount of USDC to transfer on destination chain (base) +const AMOUNT = 30000n // 0.03 USDC (6 decimals) + +function useHook() { + const account = useAccount() + const { connectors, connect, status: connectStatus, error: connectError } = useConnect() + const { disconnect } = useDisconnect() + const [selectedToken, setSelectedToken] = useState(null) + const [isAutoExecuteEnabled, setIsAutoExecuteEnabled] = useState(true) + const [showCustomCallForm, setShowCustomCallForm] = useState(false) + const [customCallData, setCustomCallData] = useState({ + to: '', + data: '', + value: '0', + chainId: BASE_USDC_DESTINATION_CHAIN_ID.toString(), + tokenAmount: '0', + tokenAddress: BASE_USDC_ADDRESS, + }) + + const { + metaTxns, + intentCallsPayloads, + intentPreconditions, + lifiInfos, + committedIntentAddress, + verificationStatus, + committedIntentConfig, + isLoadingCommittedConfig, + committedConfigError, + commitIntentConfig, + commitIntentConfigPending, + commitIntentConfigSuccess, + commitIntentConfigError, + commitIntentConfigArgs, + createIntent, + createIntentPending, + createIntentSuccess, + createIntentError, + createIntentArgs, + sendOriginTransaction, + isSwitchingChain, + isTransactionInProgress, + isChainSwitchRequired, + isSendingTransaction, + originCallStatus, + isEstimatingGas, + isWaitingForReceipt, + hasAutoExecuted, + updateAutoExecute, + sendMetaTxn, + sendMetaTxnPending, + sendMetaTxnSuccess, + sendMetaTxnError, + sendMetaTxnArgs, + clearIntent, + metaTxnMonitorStatuses, + calculatedIntentAddress, + updateOriginCallParams, + originCallParams, + originBlockTimestamp, + metaTxnBlockTimestamps, + } = useAnyPay({ + account: account as Account, + env: import.meta.env.VITE_ENV, + useV3Relayers: import.meta.env.VITE_USE_V3_RELAYERS, + }) + + const { sortedTokens, isLoadingBalances, balanceError } = useTokenBalances(account.address as Address.Address) + const [intentActionType, setIntentActionType] = useState(null) + const [isManualMetaTxnEnabled, setIsManualMetaTxnEnabled] = useState(false) + const [selectedMetaTxnId, setSelectedMetaTxnId] = useState(null) + + function createIntentAction(action: IntentAction) { + if (!selectedToken || !account.address) { + throw new Error('Missing selected token or account address') + } + + setIntentActionType(action) + + let destinationCall + if (action === 'pay') { + // ERC20 ABI functions + const erc20Transfer = AbiFunction.from('function transfer(address,uint256) returns (bool)') + const encodedData = AbiFunction.encodeData(erc20Transfer, [RECIPIENT_ADDRESS, AMOUNT]) as Hex + + // Ensure calldata is prefixed with 0x + const transactionData = encodedData.startsWith('0x') ? encodedData : `0x${encodedData}` + + destinationCall = { + chainId: BASE_USDC_DESTINATION_CHAIN_ID, + to: BASE_USDC_ADDRESS, + transactionData, + transactionValue: '0', + } + } else if (action === 'custom_call') { + // Handle custom call + destinationCall = { + chainId: parseInt(customCallData.chainId), + to: customCallData.to, + transactionData: customCallData.data.startsWith('0x') ? customCallData.data : `0x${customCallData.data}`, + transactionValue: customCallData.value, + } + } else if (action === 'mock_interaction') { + // Ensure mock data is prefixed with 0x + const transactionData = MOCK_TRANSFER_DATA.startsWith('0x') ? MOCK_TRANSFER_DATA : `0x${MOCK_TRANSFER_DATA}` + const destinationChainId = selectedToken.chainId || 8453 + + destinationCall = { + chainId: destinationChainId, + to: BASE_USDC_ADDRESS, + transactionData, + transactionValue: '0', + } + } else { + throw new Error('Invalid action') + } + + const args = { + userAddress: account.address, + originChainId: selectedToken.chainId || 8453, + originTokenAddress: selectedToken.contractAddress, + originTokenAmount: selectedToken.balance.toString(), + destinationChainId: + action === 'custom_call' + ? parseInt(customCallData.chainId) + : action === 'mock_interaction' + ? MOCK_CHAIN_ID + : destinationCall.chainId, + destinationToAddress: + action === 'custom_call' + ? customCallData.to + : action === 'mock_interaction' + ? MOCK_CONTRACT_ADDRESS + : destinationCall.to, + destinationTokenAddress: + action === 'custom_call' + ? customCallData.tokenAddress + : action === 'mock_interaction' + ? MOCK_TOKEN_ADDRESS + : BASE_USDC_ADDRESS, + destinationTokenAmount: + action === 'custom_call' + ? customCallData.tokenAmount + : action === 'mock_interaction' + ? MOCK_TOKEN_AMOUNT + : AMOUNT.toString(), + destinationCallData: + action === 'custom_call' + ? customCallData.data.startsWith('0x') + ? customCallData.data + : `0x${customCallData.data}` + : action === 'mock_interaction' + ? MOCK_TRANSFER_DATA + : destinationCall.transactionData, + destinationCallValue: + action === 'custom_call' + ? customCallData.value + : action === 'mock_interaction' + ? MOCK_TOKEN_AMOUNT + : destinationCall.transactionValue, + } + + return args + } + + function createIntentMutationAction(action: IntentAction) { + const args = createIntentAction(action) + createIntent(args) + } + + useEffect(() => { + if (!account.isConnected) { + setSelectedToken(null) + clearIntent() + } + }, [account.isConnected]) + + useEffect(() => { + updateAutoExecute(isAutoExecuteEnabled) + }, [isAutoExecuteEnabled]) + + const handleActionClick = (action: IntentAction) => { + clearIntent() + + setShowCustomCallForm(false) + if (action === 'custom_call') { + setShowCustomCallForm(true) + } else { + createIntentMutationAction(action) + } + } + + const handleCustomCallSubmit = (e: React.FormEvent) => { + e.preventDefault() + createIntentMutationAction('custom_call') + setShowCustomCallForm(false) + } + + useEffect(() => { + if (!selectedToken) { + updateOriginCallParams(null) + return + } + + updateOriginCallParams({ + originChainId: selectedToken.chainId, + tokenAddress: selectedToken.contractAddress, + }) + }, [selectedToken]) + + // Update button text and disabled state for commit button + const commitButtonText = commitIntentConfigPending ? ( +
+ + Committing... +
+ ) : ( + 'Commit Intent' + ) + + const isCommitButtonDisabled = Boolean( + commitIntentConfigPending || commitIntentConfigSuccess, // Disable if commit is pending OR has already succeeded + ) + + // Update button text and disabled state for send transaction button + const sendButtonText = isSwitchingChain ? ( +
+ + Switching Chain... +
+ ) : isSendingTransaction || isWaitingForReceipt ? ( +
+ + {isWaitingForReceipt ? 'Waiting...' : 'Sending...'} +
+ ) : isEstimatingGas ? ( +
+ + Estimating Gas... +
+ ) : isChainSwitchRequired ? ( + 'Switch Chain' + ) : ( + 'Send Transaction' + ) + + const isSendButtonDisabled = + !verificationStatus?.success || + isSendingTransaction || + isWaitingForReceipt || + !originCallParams || + !!originCallParams.error || + isSwitchingChain || + (isAutoExecuteEnabled && commitIntentConfigSuccess) // Disable if auto-execute is on and commit was successful + + // Effect to cleanup when account disconnects + useEffect(() => { + if (!account.isConnected) { + clearIntent() + } + }, [account.isConnected]) + + // Replace the sendMetaTxn function with a wrapper that uses the mutation + const handleSendMetaTxn = (selectedId: string | null) => { + sendMetaTxn(selectedId) + } + + function handleSendOriginCall() { + sendOriginTransaction() + } + + return { + // Account Management + account, + connectors, + connect, + disconnect, + connectStatus, + connectError, + + // Token Management + selectedToken, + setSelectedToken, + sortedTokens, + isLoadingBalances, + balanceError, + + // Intent State + intentCallsPayloads, + intentPreconditions, + metaTxns, + lifiInfos, + committedIntentAddress, + committedIntentConfig, + verificationStatus, + intentActionType, + + // Transaction State + originCallParams, + originCallStatus, + isTransactionInProgress, + isSendingTransaction, + isSwitchingChain, + isWaitingForReceipt, + isEstimatingGas, + isChainSwitchRequired, + hasAutoExecuted, + + // Auto-Execute Controls + isAutoExecuteEnabled, + setIsAutoExecuteEnabled, + + // Meta Transaction Management + isManualMetaTxnEnabled, + setIsManualMetaTxnEnabled, + selectedMetaTxnId, + setSelectedMetaTxnId, + metaTxnMonitorStatuses, + sendMetaTxnPending, + sendMetaTxnSuccess, + sendMetaTxnError, + sendMetaTxnArgs, + + // Custom Call Form + showCustomCallForm, + setShowCustomCallForm, + customCallData, + setCustomCallData, + + // Action Handlers + handleActionClick, + handleCustomCallSubmit, + handleSendOriginCall, + handleSendMetaTxn, + clearIntent, + + // Intent Mutation State + createIntentMutationAction, + createIntentPending, + createIntentSuccess, + createIntentError, + createIntentArgs, + + // Config Mutation State + commitIntentConfig, + commitIntentConfigPending, + commitIntentConfigSuccess, + commitIntentConfigError, + commitIntentConfigArgs, + isLoadingCommittedConfig, + committedConfigError, + + // UI State + sendButtonText, + isSendButtonDisabled, + commitButtonText, + isCommitButtonDisabled, + + calculatedIntentAddress, + originBlockTimestamp, + metaTxnBlockTimestamps, + } +} + +export const HomeIndexRoute = () => { + const { + // Account Management + account, + connectors, + connect, + disconnect, + connectStatus, + connectError, + + // Token Management + selectedToken, + setSelectedToken, + sortedTokens, + isLoadingBalances, + balanceError, + + // Intent State + intentCallsPayloads, + intentPreconditions, + metaTxns, + lifiInfos, + committedIntentAddress, + committedIntentConfig, + verificationStatus, + intentActionType, + + // Transaction State + originCallParams, + originCallStatus, + isWaitingForReceipt, + + // Auto-Execute Controls + isAutoExecuteEnabled, + setIsAutoExecuteEnabled, + + // Meta Transaction Management + isManualMetaTxnEnabled, + setIsManualMetaTxnEnabled, + selectedMetaTxnId, + setSelectedMetaTxnId, + metaTxnMonitorStatuses, + + // Custom Call Form + showCustomCallForm, + setShowCustomCallForm, + customCallData, + setCustomCallData, + + // Action Handlers + handleActionClick, + handleCustomCallSubmit, + handleSendOriginCall, + handleSendMetaTxn, + clearIntent, + + // Intent Mutation State + createIntentPending, + createIntentError, + createIntentArgs, + + // Config Mutation State + commitIntentConfig, + commitIntentConfigSuccess, + commitIntentConfigError, + isLoadingCommittedConfig, + committedConfigError, + // commitIntentConfigPending, + // commitIntentConfigArgs, + + // UI State + sendButtonText, + isSendButtonDisabled, + commitButtonText, + isCommitButtonDisabled, + + calculatedIntentAddress, + sendMetaTxnPending, + originBlockTimestamp, + metaTxnBlockTimestamps, + } = useHook() + + return ( +
+
+

+ Sequence Anypay Demo +

+

Connect your wallet and explore cross-chain intents

+
+ + {/* Account Info & Connect/Disconnect - Standalone Card */} + + + {/* Main Workflow Card - Container for Steps 2-6 */} + {account.status === 'connected' && ( +
+ {/* Step 2: Select Origin Token */} + + + {/* Step 3: Choose Action */} + + + {/* Step 4: Intent Quote Display */} + + + {/* Step 5: Commit Intent */} + + + {/* Step 6: Origin Call - Replace with Component */} + + + {/* Replace Preview Calculated Address and Manual Meta Txn Controls with Component */} + +
+ )} + + {account.status === 'connected' && ( + + )} +
+ ) +} diff --git a/extras/demo-anypay/src/routes/root-layout.tsx b/extras/demo-anypay/src/routes/root-layout.tsx new file mode 100644 index 000000000..1060e1eb1 --- /dev/null +++ b/extras/demo-anypay/src/routes/root-layout.tsx @@ -0,0 +1,15 @@ +import { Outlet } from 'react-router' +import { Header } from '../components/Header' + +export const RootLayout = () => { + return ( +
+
+
+
+ +
+
+
+ ) +} diff --git a/extras/demo-anypay/src/routes/widget/index.tsx b/extras/demo-anypay/src/routes/widget/index.tsx new file mode 100644 index 000000000..8833b5fd4 --- /dev/null +++ b/extras/demo-anypay/src/routes/widget/index.tsx @@ -0,0 +1,3 @@ +import Widget from './widget' + +export default Widget diff --git a/extras/demo-anypay/src/routes/widget/widget.tsx b/extras/demo-anypay/src/routes/widget/widget.tsx new file mode 100644 index 000000000..efecc7dd8 --- /dev/null +++ b/extras/demo-anypay/src/routes/widget/widget.tsx @@ -0,0 +1,54 @@ +import { AnyPayWidget } from '@anypay/sdk/widget' +import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter' +import { vscDarkPlus } from 'react-syntax-highlighter/dist/esm/styles/prism' + +export const Widget = () => { + const sequenceApiKey = import.meta.env.VITE_SEQUENCE_API_KEY + const apiUrl = import.meta.env.VITE_API_URL || 'https://api.sequence.app' + const indexerUrl = import.meta.env.VITE_INDEXER_URL || 'https://indexer.sequence.app' + + const codeExample = `import { AnyPayWidget } from '@anypay/sdk/widget' + +export const App = () => { + const sequenceApiKey = import.meta.env.VITE_SEQUENCE_API_KEY + + return ( + + ) +}` + + return ( +
+
+

AnyPay Widget Demo

+

+ This demo showcases a multi-step transfer flow using the Anypay SDK. Connect your wallet, select a token, + specify the amount and recipient, and see the transaction confirmation process in action. +

+
+ +
+

Integration Example

+
+ + {codeExample} + +
+
+ + +
+ ) +} + +export default Widget diff --git a/extras/demo-anypay/src/store.ts b/extras/demo-anypay/src/store.ts new file mode 100644 index 000000000..86042a472 --- /dev/null +++ b/extras/demo-anypay/src/store.ts @@ -0,0 +1,3 @@ +import { createStore } from 'jotai/vanilla' + +export const globalStore = createStore() diff --git a/extras/demo-anypay/src/types.ts b/extras/demo-anypay/src/types.ts new file mode 100644 index 000000000..d6ce7ec12 --- /dev/null +++ b/extras/demo-anypay/src/types.ts @@ -0,0 +1 @@ +export type IntentAction = 'pay' | 'mock_interaction' | 'custom_call' diff --git a/extras/demo-anypay/src/utils/formatting.ts b/extras/demo-anypay/src/utils/formatting.ts new file mode 100644 index 000000000..d4e9b17a7 --- /dev/null +++ b/extras/demo-anypay/src/utils/formatting.ts @@ -0,0 +1,105 @@ +import { formatUnits } from 'viem' +import * as chains from 'viem/chains' +import { TokenBalance, NativeTokenBalance } from '@anypay/sdk' + +// Helper to get chain info +export const getChainInfo = (chainId: number) => { + return Object.values(chains).find((chain) => chain.id === chainId) || null +} + +export const formatBalance = (balance: TokenBalance | NativeTokenBalance): string => { + try { + const value = BigInt(balance.balance) + let decimals: number + let isNative = false + + if ('contractAddress' in balance) { + decimals = balance.contractInfo?.decimals || 0 + } else { + decimals = 18 + isNative = true + } + + if (decimals === 0 && !isNative && value !== 0n) { + return value.toString() + } + + const formatted = formatUnits(value, decimals) + const num = parseFloat(formatted) + + if (num === 0) return '0' + // Use exponential for very small non-zero numbers + if (Math.abs(num) < 0.00001 && num !== 0) return num.toExponential(2) + + let displayStr: string + + if (Math.abs(num) < 1 && num !== 0) { + // Numbers between 0.00001 and 1 (exclusive of 0) + displayStr = num.toFixed(6) + } else if (Math.abs(num) < 1000) { + // Numbers between 1 and 1000 (exclusive) + displayStr = num.toFixed(4) + } else { + // Numbers >= 1000 or <= -1000 + displayStr = num.toLocaleString(undefined, { + minimumFractionDigits: 0, + maximumFractionDigits: 2, + }) + return parseFloat(num.toFixed(2)).toLocaleString(undefined, { + minimumFractionDigits: 0, + maximumFractionDigits: 2, + }) + } + + if (displayStr.includes('.')) { + displayStr = displayStr.replace(/0+$/, '') + displayStr = displayStr.replace(/\.$/, '') + } + return displayStr + } catch (e) { + console.error('Error formatting balance:', e, balance) + return balance.balance.toString() // Fallback to raw balance string + } +} + +// Helper to format time since origin (using the version from user's HomeIndexRoute example) +export const formatTimeSinceOrigin = (metaTxnTimestamp: number | null, originTimestamp: number | null): string => { + if (originTimestamp === null) { + return 'Waiting for origin call timestamp...' + } + if (metaTxnTimestamp === null) { + return 'Meta transaction timestamp not available' + } + if (metaTxnTimestamp < originTimestamp) { + return 'Before origin call' // Or handle as an anomaly + } + const diffSeconds = metaTxnTimestamp - originTimestamp + if (diffSeconds < 60) { + return `${diffSeconds} second${diffSeconds === 1 ? '' : 's'} after origin call` + } + const diffMinutes = Math.floor(diffSeconds / 60) + const remainingSeconds = diffSeconds % 60 + if (diffMinutes < 60) { + return `${diffMinutes} minute${diffMinutes === 1 ? '' : 's'}${remainingSeconds > 0 ? ` ${remainingSeconds}s` : ''} after origin call` + } + const diffHours = Math.floor(diffMinutes / 60) + const remainingMinutes = diffMinutes % 60 + return `${diffHours} hour${diffHours === 1 ? '' : 's'}${remainingMinutes > 0 ? ` ${remainingMinutes}m` : ''} after origin call` +} + +// Helper to get explorer URL +export const getExplorerUrl = (chainId: number, address: string): string | null => { + const chainInfo = getChainInfo(chainId) + if (chainInfo && chainInfo.blockExplorers?.default?.url) { + return `${chainInfo.blockExplorers.default.url}/address/${address}` + } + return null +} + +export const getExplorerUrlForTransaction = (chainId: number, transactionHash: string): string | null => { + const chainInfo = getChainInfo(chainId) + if (chainInfo && chainInfo.blockExplorers?.default?.url) { + return `${chainInfo.blockExplorers.default.url}/tx/${transactionHash}` + } + return null +} diff --git a/extras/demo-anypay/src/vite-env.d.ts b/extras/demo-anypay/src/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/extras/demo-anypay/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/extras/demo-anypay/src/wagmi.config.ts b/extras/demo-anypay/src/wagmi.config.ts new file mode 100644 index 000000000..e03d335e5 --- /dev/null +++ b/extras/demo-anypay/src/wagmi.config.ts @@ -0,0 +1,33 @@ +import { http, createConfig } from 'wagmi' +import * as chains from 'viem/chains' +import { injected, metaMask } from 'wagmi/connectors' +// import { sequenceWallet } from '@0xsequence/wagmi-connector' + +const projectAccessKey = import.meta.env.VITE_PROJECT_ACCESS_KEY + +if (!projectAccessKey) { + console.warn('VITE_PROJECT_ACCESS_KEY is not set in .env file. Sequence connector may not work correctly.') +} + +export const config = createConfig({ + // @ts-expect-error + chains: Object.values(chains), + connectors: [ + // sequenceWallet({ + // connectOptions: { + // app: 'Demo Anypay', + // projectAccessKey: projectAccessKey, + // }, + // defaultNetwork: chains.mainnet.id, + // }), + injected(), + metaMask(), + ], + transports: Object.values(chains).reduce( + (acc, chain) => ({ + ...acc, + [chain.id]: http(), + }), + {}, + ) as Record>, +}) diff --git a/extras/demo-anypay/tsconfig.app.json b/extras/demo-anypay/tsconfig.app.json new file mode 100644 index 000000000..f02ded376 --- /dev/null +++ b/extras/demo-anypay/tsconfig.app.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true, + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src"] +} diff --git a/extras/demo-anypay/tsconfig.json b/extras/demo-anypay/tsconfig.json new file mode 100644 index 000000000..ea9d0cd82 --- /dev/null +++ b/extras/demo-anypay/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/extras/demo-anypay/tsconfig.node.json b/extras/demo-anypay/tsconfig.node.json new file mode 100644 index 000000000..98c487be1 --- /dev/null +++ b/extras/demo-anypay/tsconfig.node.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/extras/demo-anypay/vite.config.ts b/extras/demo-anypay/vite.config.ts new file mode 100644 index 000000000..a69560ccf --- /dev/null +++ b/extras/demo-anypay/vite.config.ts @@ -0,0 +1,18 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import tailwindcss from '@tailwindcss/vite' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react(), tailwindcss()], + optimizeDeps: { + force: true, + // TODO: This shouldn't be needed, fix sdk build + include: ['@0xsequence/api', '@0xsequence/wallet-core', '@0xsequence/wallet-primitives', '@0xsequence/wallet-wdk'], + }, + resolve: { + alias: { + '@': '/src', + }, + }, +}) diff --git a/package.json b/package.json index e79a96583..90cfc2ad0 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "turbo": "^2.5.0", "typescript": "5.8.3" }, - "packageManager": "pnpm@10.8.1", + "packageManager": "pnpm@10.11.0", "engines": { "node": ">=18" } diff --git a/packages/services/api/src/api.gen.ts b/packages/services/api/src/api.gen.ts index 5366159cb..4ae4bd9ac 100644 --- a/packages/services/api/src/api.gen.ts +++ b/packages/services/api/src/api.gen.ts @@ -1,13 +1,13 @@ /* eslint-disable */ -// sequence-api v0.4.0 2409c101bc62a1b7aa797e099d913b1c4046e9f6 +// sequence-api v0.4.0 caa4bba297b152a27925e77ccdb1a62033711771 // -- -// Code generated by webrpc-gen@v0.24.0 with typescript generator. DO NOT EDIT. +// Code generated by webrpc-gen@v0.25.3 with typescript generator. DO NOT EDIT. // // webrpc-gen -schema=api.ridl -target=typescript -client -out=./clients/api.gen.ts export const WebrpcHeader = 'Webrpc' -export const WebrpcHeaderValue = 'webrpc@v0.24.0;gen-typescript@v0.16.3;sequence-api@v0.4.0' +export const WebrpcHeaderValue = 'webrpc@v0.25.3;gen-typescript@v0.17.0;sequence-api@v0.4.0' // WebRPC description and code-gen version export const WebRPCVersion = 'v1' @@ -16,7 +16,7 @@ export const WebRPCVersion = 'v1' export const WebRPCSchemaVersion = 'v0.4.0' // Schema hash generated from your RIDL schema -export const WebRPCSchemaHash = '2409c101bc62a1b7aa797e099d913b1c4046e9f6' +export const WebRPCSchemaHash = 'caa4bba297b152a27925e77ccdb1a62033711771' type WebrpcGenVersions = { webrpcGenVersion: string @@ -174,6 +174,50 @@ export interface Friend { createdAt?: string } +export interface MetaTxn { + id: string + chainId: string + walletAddress: string + contract: string + input: string +} + +export interface AnypayLifiInfo { + originToken: string + amount: string + originChainId: string + destinationChainId: string +} + +export interface Call { + to: string + value?: string + data?: string + gasLimit?: string + delegateCall?: boolean + onlyFallback?: boolean + behaviorOnError?: number +} + +export interface IntentCallsPayload { + chainId: string + space?: string + nonce?: string + calls: Array +} + +export interface IntentConfig { + id: number + configHash: string + walletAddress: string + mainSigner: string + calls: Array + preconditions: Array + anypayLifiInfo: AnypayLifiInfo + updatedAt?: string + createdAt?: string +} + export interface InviteCode { usesLeft: number ownerAccount: string @@ -206,31 +250,19 @@ export interface TupleComponent { value: any } +export interface OriginCall { + chainId: number + to: string + transactionData: string + transactionValue: string +} + export interface IntentPrecondition { type: string - chainID: string + chainId: string data: any } -export interface IntentSolution { - transactions: Array -} - -export interface Transactions { - chainID: string - transactions: Array - preconditions?: Array -} - -export interface Transaction { - delegateCall: boolean - revertOnError: boolean - gasLimit: string - target: string - value: string - data: string -} - export interface UserStorage { userAddress: string key: string @@ -481,6 +513,19 @@ export interface SwapQuote { approveData: string } +export interface SwapQuoteV2 { + currencyAddress: string + currencyBalance: string + price: string + maxPrice: string + to: string + transactionData: string + transactionValue: string + approveData: string + amount: string + amountMin: string +} + export interface CurrencyGroup { name: string tokens: Array @@ -703,11 +748,22 @@ export interface TransakChain { } export interface API { + /** + * + * Runtime + * + */ ping(headers?: object, signal?: AbortSignal): Promise version(headers?: object, signal?: AbortSignal): Promise runtimeStatus(headers?: object, signal?: AbortSignal): Promise clock(headers?: object, signal?: AbortSignal): Promise getSequenceContext(headers?: object, signal?: AbortSignal): Promise + /** + * + * Auth + * + * TODO: rename 'ewtString' arg to 'ethauthProof' + */ getAuthToken(args: GetAuthTokenArgs, headers?: object, signal?: AbortSignal): Promise getAuthToken2(args: GetAuthToken2Args, headers?: object, signal?: AbortSignal): Promise sendPasswordlessLink( @@ -721,6 +777,11 @@ export interface API { signal?: AbortSignal, ): Promise getPublicKey(args: GetPublicKeyArgs, headers?: object, signal?: AbortSignal): Promise + /** + * + * Contacts / Friends + * + */ friendList(args: FriendListArgs, headers?: object, signal?: AbortSignal): Promise getFriendByAddress( args: GetFriendByAddressArgs, @@ -735,6 +796,11 @@ export interface API { signal?: AbortSignal, ): Promise removeFriend(args: RemoveFriendArgs, headers?: object, signal?: AbortSignal): Promise + /** + * + * Chain-Utils + * + */ contractCall(args: ContractCallArgs, headers?: object, signal?: AbortSignal): Promise decodeContractCall( args: DecodeContractCallArgs, @@ -746,6 +812,11 @@ export interface API { headers?: object, signal?: AbortSignal, ): Promise + /** + * + * User Storage + * + */ userStorageFetch(args: UserStorageFetchArgs, headers?: object, signal?: AbortSignal): Promise userStorageSave(args: UserStorageSaveArgs, headers?: object, signal?: AbortSignal): Promise userStorageDelete( @@ -758,12 +829,24 @@ export interface API { headers?: object, signal?: AbortSignal, ): Promise + /** + * + * Wallet utils + * + */ getMoonpayLink(args: GetMoonpayLinkArgs, headers?: object, signal?: AbortSignal): Promise + /** + * - IsUsingGoogleMail(domain: string) => (yes: bool) + */ resolveENSAddress( args: ResolveENSAddressArgs, headers?: object, signal?: AbortSignal, ): Promise + /** + * TODO: we can add walletContext optional in the future when we need it + * NOTE: chainId can be either a number or canonical name + */ isValidSignature(args: IsValidSignatureArgs, headers?: object, signal?: AbortSignal): Promise isValidMessageSignature( args: IsValidMessageSignatureArgs, @@ -804,12 +887,21 @@ export interface API { ): Promise sardineGetEnabledTokens(headers?: object, signal?: AbortSignal): Promise sardineGetQuote(args: SardineGetQuoteArgs, headers?: object, signal?: AbortSignal): Promise + /** + * Deprecated. Use SardineGetClientToken() instead. + */ getSardineClientToken(headers?: object, signal?: AbortSignal): Promise + /** + * Deprecated. Use SardineGetNFTCheckoutToken() instead. + */ getSardineNFTCheckoutToken( args: GetSardineNFTCheckoutTokenArgs, headers?: object, signal?: AbortSignal, ): Promise + /** + * Deprecated. Use SardineGetNFTCheckoutOrderStatus() instead. + */ getSardineNFTCheckoutOrderStatus( args: GetSardineNFTCheckoutOrderStatusArgs, headers?: object, @@ -823,16 +915,39 @@ export interface API { headers?: object, signal?: AbortSignal, ): Promise + /** + * + * Price Feed + * + */ getCoinPrices(args: GetCoinPricesArgs, headers?: object, signal?: AbortSignal): Promise getCollectiblePrices( args: GetCollectiblePricesArgs, headers?: object, signal?: AbortSignal, ): Promise + /** + * + * Price Feed utils + * + */ getExchangeRate(args: GetExchangeRateArgs, headers?: object, signal?: AbortSignal): Promise + /** + * + * Util / misc + * + */ memoryStore(args: MemoryStoreArgs, headers?: object, signal?: AbortSignal): Promise memoryLoad(args: MemoryLoadArgs, headers?: object, signal?: AbortSignal): Promise + /** + * + * Legacy + * + */ getInviteInfo(headers?: object, signal?: AbortSignal): Promise + /** + * NOTE: we're still using this from SW-API to Sequence-API to claim invite code + */ isValidAccessCode( args: IsValidAccessCodeArgs, headers?: object, @@ -843,11 +958,20 @@ export interface API { headers?: object, signal?: AbortSignal, ): Promise + /** + * Utils + */ blockNumberAtTime( args: BlockNumberAtTimeArgs, headers?: object, signal?: AbortSignal, ): Promise + /** + * + * Paper + * TODO: deprecate in the future + * + */ paperSessionSecret( args: PaperSessionSecretArgs, headers?: object, @@ -858,6 +982,11 @@ export interface API { headers?: object, signal?: AbortSignal, ): Promise + /** + * + * Linked wallets (v0 -- simple support) + * + */ linkWallet(args: LinkWalletArgs, headers?: object, signal?: AbortSignal): Promise getLinkedWallets(args: GetLinkedWalletsArgs, headers?: object, signal?: AbortSignal): Promise removeLinkedWallet( @@ -865,6 +994,10 @@ export interface API { headers?: object, signal?: AbortSignal, ): Promise + /** + * NOTE: these methods are deprecated, please do not use them. We may resurface them in the future, but just wanted + * to be clear, they are not necessary for our linked wallets. + */ generateWaaSVerificationURL( args: GenerateWaaSVerificationURLArgs, headers?: object, @@ -875,11 +1008,22 @@ export interface API { headers?: object, signal?: AbortSignal, ): Promise + /** + * + * + * WaaS child wallet adoption + * + */ listAdoptedWallets( args: ListAdoptedWalletsArgs, headers?: object, signal?: AbortSignal, ): Promise + /** + * + * Currency abstraction + * + */ getSwapPermit2Price( args: GetSwapPermit2PriceArgs, headers?: object, @@ -899,7 +1043,29 @@ export interface API { getSwapPrices(args: GetSwapPricesArgs, headers?: object, signal?: AbortSignal): Promise getSwapQuote(args: GetSwapQuoteArgs, headers?: object, signal?: AbortSignal): Promise getSwapQuoteV2(args: GetSwapQuoteV2Args, headers?: object, signal?: AbortSignal): Promise - intentQuery(args: IntentQueryArgs, headers?: object, signal?: AbortSignal): Promise + getLifiChains(headers?: object, signal?: AbortSignal): Promise + getLifiTokens(args: GetLifiTokensArgs, headers?: object, signal?: AbortSignal): Promise + /** + * + * Chain abstraction + * + */ + getIntentCallsPayloads( + args: GetIntentCallsPayloadsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + commitIntentConfig( + args: CommitIntentConfigArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getIntentConfig(args: GetIntentConfigArgs, headers?: object, signal?: AbortSignal): Promise + /** + * + * Inventory, payments and management + * + */ listCurrencyGroups(headers?: object, signal?: AbortSignal): Promise addOffchainInventory( args: AddOffchainInventoryArgs, @@ -936,6 +1102,11 @@ export interface API { headers?: object, signal?: AbortSignal, ): Promise + /** + * + * Packs + * + */ savePack(args: SavePackArgs, headers?: object, signal?: AbortSignal): Promise getPack(args: GetPackArgs, headers?: object, signal?: AbortSignal): Promise deletePack(args: DeletePackArgs, headers?: object, signal?: AbortSignal): Promise @@ -1493,22 +1664,64 @@ export interface GetSwapQuoteV2Args { userAddress: string buyCurrencyAddress: string sellCurrencyAddress: string - buyAmount: string + buyAmount?: string + sellAmount?: string chainId: number includeApprove: boolean slippagePercentage?: number } export interface GetSwapQuoteV2Return { - swapQuote: SwapQuote + swapQuote: SwapQuoteV2 +} +export interface GetLifiChainsArgs {} + +export interface GetLifiChainsReturn { + chains: Array +} +export interface GetLifiTokensArgs { + chainIds: Array } -export interface IntentQueryArgs { - wallet: string + +export interface GetLifiTokensReturn { + tokens: Array +} +export interface GetIntentCallsPayloadsArgs { + userAddress: string + destinationChainId: number + destinationTokenAddress: string + destinationTokenAmount: string + destinationToAddress: string + originChainId: number + originTokenAddress: string + originTokenAmount: string + destinationCallData?: string + destinationCallValue?: string +} + +export interface GetIntentCallsPayloadsReturn { + calls: Array + preconditions: Array + metaTxns: Array + lifiInfos: Array +} +export interface CommitIntentConfigArgs { + walletAddress: string + mainSigner: string + calls: Array preconditions: Array + lifiInfos: Array } -export interface IntentQueryReturn { - solutions: Array +export interface CommitIntentConfigReturn { + config: IntentConfig +} +export interface GetIntentConfigArgs { + walletAddress: string +} + +export interface GetIntentConfigReturn { + config: IntentConfig } export interface ListCurrencyGroupsArgs {} @@ -2830,7 +3043,22 @@ export class API implements API { (res) => { return buildResponse(res).then((_data) => { return { - swapQuote: _data.swapQuote, + swapQuote: _data.swapQuote, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getLifiChains = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetLifiChains'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + chains: >_data.chains, } }) }, @@ -2840,12 +3068,72 @@ export class API implements API { ) } - intentQuery = (args: IntentQueryArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('IntentQuery'), createHTTPRequest(args, headers, signal)).then( + getLifiTokens = (args: GetLifiTokensArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetLifiTokens'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + tokens: >_data.tokens, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getIntentCallsPayloads = ( + args: GetIntentCallsPayloadsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetIntentCallsPayloads'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + calls: >_data.calls, + preconditions: >_data.preconditions, + metaTxns: >_data.metaTxns, + lifiInfos: >_data.lifiInfos, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + commitIntentConfig = ( + args: CommitIntentConfigArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('CommitIntentConfig'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + config: _data.config, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getIntentConfig = ( + args: GetIntentConfigArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetIntentConfig'), createHTTPRequest(args, headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return { - solutions: >_data.solutions, + config: _data.config, } }) }, diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index f9f90a628..3df74d4a2 100644 --- a/packages/services/identity-instrument/package.json +++ b/packages/services/identity-instrument/package.json @@ -3,6 +3,10 @@ "version": "0.0.0", "license": "Apache-2.0", "type": "module", + "publishConfig": { + "access": "public" + }, + "private": false, "scripts": { "build": "tsc", "dev": "tsc --watch", diff --git a/packages/wallet/anypay-sdk/.eslintrc.cjs b/packages/wallet/anypay-sdk/.eslintrc.cjs new file mode 100644 index 000000000..7e3f76b54 --- /dev/null +++ b/packages/wallet/anypay-sdk/.eslintrc.cjs @@ -0,0 +1,47 @@ +import js from '@eslint/js' +import eslintConfigPrettier from 'eslint-config-prettier' +import turboPlugin from 'eslint-plugin-turbo' +import tseslint from 'typescript-eslint' +import onlyWarn from 'eslint-plugin-only-warn' + +export const config = [ + js.configs.recommended, + eslintConfigPrettier, + ...tseslint.configs.recommended, + { + plugins: { + turbo: turboPlugin, + }, + rules: { + 'turbo/no-undeclared-env-vars': 'warn', + }, + }, + { + plugins: { + onlyWarn, + }, + }, + { + rules: { + // Disallow semicolons + semi: ['error', 'never'], + + // Turn off the base ESLint version of no-unused-vars + 'no-unused-vars': 'off', + + // Use @typescript-eslint/no-unused-vars + // Allow unused vars prefixed with _ + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + destructuredArrayIgnorePattern: '^_', + }, + ], + }, + }, + { + ignores: ['dist/**'], + }, +] \ No newline at end of file diff --git a/packages/wallet/anypay-sdk/.gitignore b/packages/wallet/anypay-sdk/.gitignore new file mode 100644 index 000000000..01bb5ee45 --- /dev/null +++ b/packages/wallet/anypay-sdk/.gitignore @@ -0,0 +1,5 @@ +dist +node_modules +*.env +*.cache +.turbo \ No newline at end of file diff --git a/packages/wallet/anypay-sdk/.prettierrc b/packages/wallet/anypay-sdk/.prettierrc new file mode 100644 index 000000000..ba9ced82f --- /dev/null +++ b/packages/wallet/anypay-sdk/.prettierrc @@ -0,0 +1,5 @@ +{ + "printWidth": 120, + "semi": false, + "singleQuote": true +} \ No newline at end of file diff --git a/packages/wallet/anypay-sdk/README.md b/packages/wallet/anypay-sdk/README.md new file mode 100644 index 000000000..8f68b02eb --- /dev/null +++ b/packages/wallet/anypay-sdk/README.md @@ -0,0 +1,134 @@ +# @anypay/sdk + +> Anypay SDK for sending any token from any chain. + +⚠️ This is a work in progress! + +## Installation + +```bash +npm install @anypay/sdk +``` + +## Usage + +### React Widget Component + +The easiest way to integrate Anypay is using our pre-built React widget: + +```typescript +import { AnyPayWidget } from '@anypay/sdk/widget' + +export const App = () => { + const sequenceApiKey = import.meta.env.VITE_SEQUENCE_API_KEY + + return ( + + ) +} +``` + +### Low-level API Usage + +If you need more control, you can use the low-level APIs directly: + +#### Basic Example + +```typescript +import { prepareSend } from '@anypay/sdk' +import { createWalletClient, custom } from 'viem' + +// Initialize a wallet client +const client = createWalletClient({ + account, + chain: getChainConfig(chainId), + transport: custom(window.ethereum), +}) + +// Prepare and send a transaction +const options = { + account, + originTokenAddress: '0x0000000000000000000000000000000000000000', // ETH + originChainId: 42161, // Arbitrum + originTokenAmount: '1000000000000000', + destinationChainId: 8453, // Base + recipient: '0xYourRecipientAddress', + destinationTokenAddress: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913', // USDC on Base + destinationTokenAmount: '300003', // Amount in USDC decimals (6) + sequenceApiKey: 'your-api-key', + fee: '5600000000000', + client, +} + +const { intentAddress, send } = await prepareSend(options) +console.log('Intent address:', intentAddress.toString()) + +// Send the transaction +await send() +``` + +#### Advanced Example + +```typescript +import { + getAPIClient, + getRelayer, + getIntentCallsPayloads, + calculateIntentAddress, + commitIntentConfig, + sendOriginTransaction, + getERC20TransferData, +} from '@anypay/sdk' +import { createWalletClient, http } from 'viem' +import { arbitrum } from 'viem/chains' + +async function sendCrossChainToken() { + // Initialize clients + const apiClient = getAPIClient('http://localhost:4422', process.env.SEQUENCE_API_KEY) + const originRelayer = getRelayer({ env: 'local' }, originChainId) + const destinationRelayer = getRelayer({ env: 'local' }, destinationChainId) + + // Create intent + const args = { + userAddress: account.address, + originChainId: 42161, + originTokenAddress: '0x0000000000000000000000000000000000000000', + originTokenAmount: '1000000000000000', + destinationChainId: 8453, + destinationToAddress: destinationTokenAddress, + destinationTokenAddress: destinationTokenAddress, + destinationTokenAmount: destinationTokenAmount, + destinationCallData: getERC20TransferData(recipient, BigInt(destinationTokenAmount)), + destinationCallValue: '0', + } + + const intent = await getIntentCallsPayloads(apiClient, args) + + // Calculate and commit intent + const intentAddress = calculateIntentAddress(account.address, intent.calls, intent.lifiInfos) + await commitIntentConfig(apiClient, account.address, intent.calls, intent.preconditions, intent.lifiInfos) + + // Monitor transaction status + const status = await getMetaTxStatus(relayer, metaTxId, chainId) + console.log('Transaction status:', status) +} +``` + +## Development + +```bash +# Install dependencies +pnpm install + +# Build the package +pnpm run build + +# Run tests +pnpm test +``` + +## License + +MIT License diff --git a/packages/wallet/anypay-sdk/package.json b/packages/wallet/anypay-sdk/package.json new file mode 100644 index 000000000..90721082a --- /dev/null +++ b/packages/wallet/anypay-sdk/package.json @@ -0,0 +1,95 @@ +{ + "name": "@anypay/sdk", + "version": "0.0.0", + "description": "SDK for Anypay functionality", + "type": "module", + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "private": true, + "publishConfig": { + "access": "public" + }, + "files": [ + "dist", + "src" + ], + "scripts": { + "build": "vite build && tsc -p tsconfig.build.json && tsc", + "dev": "tsc --watch", + "test": "vitest", + "clean": "rm -rf dist", + "prepare": "pnpm run clean && pnpm run build", + "lint": "turbo lint" + }, + "keywords": [ + "anypay", + "sdk", + "wallet" + ], + "author": "", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/api": "0.0.0-anypay-20250527101311", + "@0xsequence/design-system": "^2.1.6", + "@0xsequence/hooks": "^5.1.0", + "@0xsequence/indexer": "^2.3.9", + "@0xsequence/wagmi-connector": "^4.0.1", + "@0xsequence/wallet-core": "workspace:*", + "@0xsequence/wallet-primitives": "0.0.0-anypay-20250527101311", + "@tanstack/react-query": "^5.69.0", + "buffer": "^6.0.3", + "isomorphic-fetch": "^3.0.0", + "lucide-react": "^0.493.0", + "ox": "^0.7.0", + "wagmi": "^2.14.16" + }, + "peerDependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@eslint/js": "^9.17.0", + "@next/eslint-plugin-next": "^15.1.0", + "@tailwindcss/postcss": "^4.1.8", + "@types/isomorphic-fetch": "^0.0.39", + "@types/node": "^22.15.29", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.10", + "@typescript-eslint/eslint-plugin": "^7.0.0", + "@typescript-eslint/parser": "^7.0.0", + "@vitejs/plugin-react": "^4.5.1", + "autoprefixer": "^10.4.21", + "dotenv": "^16.4.7", + "eslint": "^9.15.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-only-warn": "^1.1.0", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-react": "^7.37.2", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-turbo": "^2.3.0", + "globals": "^15.12.0", + "postcss": "^8.5.4", + "prettier": "^3.2.5", + "tailwindcss": "^4.1.4", + "turbo": "^2.5.0", + "typescript": "^5.3.3", + "typescript-eslint": "^8.15.0", + "viem": "^2.28.0", + "vite": "^5.0.0", + "vite-plugin-css-injected-by-js": "^3.5.2", + "vitest": "^3.1.2" + }, + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + }, + "./widget": { + "import": "./dist/widget/widget/index.js", + "require": "./dist/widget/widget/index.js", + "types": "./dist/widget/index.d.ts" + } + } +} diff --git a/packages/wallet/anypay-sdk/postcss.config.cjs b/packages/wallet/anypay-sdk/postcss.config.cjs new file mode 100644 index 000000000..7c8d1081b --- /dev/null +++ b/packages/wallet/anypay-sdk/postcss.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + '@tailwindcss/postcss': {}, + autoprefixer: {}, + }, +} \ No newline at end of file diff --git a/packages/wallet/anypay-sdk/src/anypay.ts b/packages/wallet/anypay-sdk/src/anypay.ts new file mode 100644 index 000000000..108497d72 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/anypay.ts @@ -0,0 +1,1397 @@ +import { useState, useEffect, useMemo } from 'react' +import { useSendTransaction, useSwitchChain, useEstimateGas } from 'wagmi' +import { + GetIntentCallsPayloadsReturn, + IntentCallsPayload, + IntentPrecondition, + GetIntentConfigReturn, + AnypayLifiInfo, + GetIntentCallsPayloadsArgs, + SequenceAPIClient, +} from '@0xsequence/api' +import { useQuery, useMutation } from '@tanstack/react-query' +import { useWaitForTransactionReceipt } from 'wagmi' +import { Address } from 'ox' +import { + createPublicClient, + createWalletClient, + Hex, + http, + isAddressEqual, + zeroAddress, + Chain, + Account as AccountType, + WalletClient, + TransactionReceipt, +} from 'viem' +import { arbitrum, base, mainnet, optimism } from 'viem/chains' +import { useAPIClient, getAPIClient } from './apiClient.js' +import { useMetaTxnsMonitor, MetaTxn, MetaTxnStatus, MetaTxnStatusValue, getMetaTxStatus } from './metaTxnMonitor.js' +import { relayerSendMetaTx } from './metaTxns.js' +import { useRelayers, getRelayer, getBackupRelayer } from './relayer.js' +import { findPreconditionAddress } from './preconditions.js' +import { + calculateIntentAddress, + OriginCallParams, + commitIntentConfig, + getIntentCallsPayloads, + sendOriginTransaction, +} from './intents.js' +import { getERC20TransferData } from './encoders.js' + +export type Account = { + address: `0x${string}` + isConnected: boolean + chainId: number +} + +export type UseAnyPayConfig = { + account: Account + disableAutoExecute?: boolean + env: 'local' | 'cors-anywhere' | 'dev' | 'prod' + useV3Relayers?: boolean +} + +export type UseAnyPayReturn = { + apiClient: SequenceAPIClient + metaTxns: GetIntentCallsPayloadsReturn['metaTxns'] | null + intentCallsPayloads: GetIntentCallsPayloadsReturn['calls'] | null + intentPreconditions: GetIntentCallsPayloadsReturn['preconditions'] | null + lifiInfos: GetIntentCallsPayloadsReturn['lifiInfos'] | null + txnHash: Hex | undefined + committedIntentAddress: string | null + verificationStatus: { + success: boolean + receivedAddress?: string + calculatedAddress?: string + } | null + getRelayer: (chainId: number) => any // TODO: Add proper type + estimatedGas: bigint | undefined + isEstimateError: boolean + estimateError: Error | null + calculateIntentAddress: typeof calculateIntentAddress + committedIntentConfig: GetIntentConfigReturn | undefined + isLoadingCommittedConfig: boolean + committedConfigError: Error | null + commitIntentConfig: (args: any) => void // TODO: Add proper type + commitIntentConfigPending: boolean + commitIntentConfigSuccess: boolean + commitIntentConfigError: Error | null + commitIntentConfigArgs: any // TODO: Add proper type + getIntentCallsPayloads: (args: GetIntentCallsPayloadsArgs) => Promise + operationHashes: { [key: string]: Hex } + callIntentCallsPayload: (args: any) => void // TODO: Add proper type + sendOriginTransaction: () => Promise + switchChain: any // TODO: Add proper type + isSwitchingChain: boolean + switchChainError: Error | null + isTransactionInProgress: boolean + isChainSwitchRequired: boolean + sendTransaction: any // Update type to match the actual sendTransaction function + isSendingTransaction: boolean + originCallStatus: { + txnHash?: string + status?: string + revertReason?: string | null + gasUsed?: number + effectiveGasPrice?: string + } | null + updateOriginCallStatus: ( + hash: Hex | undefined, + status: 'success' | 'reverted' | 'pending' | 'sending', + gasUsed?: bigint, + effectiveGasPrice?: bigint, + revertReason?: string | null, + ) => void + isEstimatingGas: boolean + isAutoExecute: boolean + updateAutoExecute: (enabled: boolean) => void + receipt: any // TODO: Add proper type + isWaitingForReceipt: boolean + receiptIsSuccess: boolean + receiptIsError: boolean + receiptError: Error | null + hasAutoExecuted: boolean + sentMetaTxns: { [key: string]: number } + sendMetaTxn: (selectedId: string | null) => void + sendMetaTxnPending: boolean + sendMetaTxnSuccess: boolean + sendMetaTxnError: Error | null + sendMetaTxnArgs: { selectedId: string | null } | undefined + clearIntent: () => void + metaTxnMonitorStatuses: { [key: string]: MetaTxnStatusValue } + createIntent: (args: any) => void // TODO: Add proper type + createIntentPending: boolean + createIntentSuccess: boolean + createIntentError: Error | null + createIntentArgs: any // TODO: Add proper type + calculatedIntentAddress: Address.Address | null + originCallParams: OriginCallParams | null + updateOriginCallParams: (args: { originChainId: number; tokenAddress: string } | null) => void + originBlockTimestamp: number | null + metaTxnBlockTimestamps: { + [key: string]: { timestamp: number | null; error?: string } + } +} + +const RETRY_WINDOW_MS = 10_000 + +export const getChainConfig = (chainId: number): Chain => { + switch (chainId) { + case 1: + return mainnet + case 10: + return optimism + case 42161: + return arbitrum + case 8453: + return base + default: + throw new Error(`Unsupported chain ID: ${chainId}`) + } +} + +export function useAnyPay(config: UseAnyPayConfig): UseAnyPayReturn { + const { account, disableAutoExecute = false, env, useV3Relayers } = config + const apiClient = useAPIClient() + + const [isAutoExecute, setIsAutoExecute] = useState(!disableAutoExecute) + const [hasAutoExecuted, setHasAutoExecuted] = useState(false) + + // Track timestamps of when each meta-transaction was last sent + const [sentMetaTxns, setSentMetaTxns] = useState<{ [key: string]: number }>({}) + + // State declarations + const [metaTxns, setMetaTxns] = useState(null) + const [intentCallsPayloads, setIntentCallsPayloads] = useState(null) + const [intentPreconditions, setIntentPreconditions] = useState( + null, + ) + const [lifiInfos, setLifiInfos] = useState(null) + const [txnHash, setTxnHash] = useState() + const [committedIntentAddress, setCommittedIntentAddress] = useState(null) + // const [preconditionStatuses, setPreconditionStatuses] = useState([]) + + const [originCallParams, setOriginCallParams] = useState(null) + + const [operationHashes, setOperationHashes] = useState<{ [key: string]: Hex }>({}) + const [isTransactionInProgress, setIsTransactionInProgress] = useState(false) + const [isChainSwitchRequired, setIsChainSwitchRequired] = useState(false) + const { switchChain, isPending: isSwitchingChain, error: switchChainError } = useSwitchChain() + const { sendTransaction, isPending: isSendingTransaction } = useSendTransaction() + const [isEstimatingGas, setIsEstimatingGas] = useState(false) + const [originCallStatus, setOriginCallStatus] = useState<{ + txnHash?: string + status?: string + revertReason?: string | null + gasUsed?: number + effectiveGasPrice?: string + } | null>(null) + + const [originBlockTimestamp, setOriginBlockTimestamp] = useState(null) + const [metaTxnBlockTimestamps, setMetaTxnBlockTimestamps] = useState<{ + [key: string]: { timestamp: number | null; error?: string } + }>({}) + + const [verificationStatus, setVerificationStatus] = useState<{ + success: boolean + receivedAddress?: string + calculatedAddress?: string + } | null>(null) + + const { getRelayer } = useRelayers({ + env, + useV3Relayers, + }) + + // Add gas estimation hook with proper types + const { + data: estimatedGas, + isError: isEstimateError, + error: estimateError, + } = useEstimateGas( + originCallParams?.to && originCallParams?.chainId && !originCallParams.error + ? { + to: originCallParams.to || undefined, + data: originCallParams.data || undefined, + value: originCallParams.value || undefined, + chainId: originCallParams.chainId || undefined, + } + : undefined, + ) + + const commitIntentConfigMutation = useMutation({ + mutationFn: async (args: { + walletAddress: string + mainSigner: string + calls: IntentCallsPayload[] + preconditions: IntentPrecondition[] + lifiInfos: AnypayLifiInfo[] + }) => { + if (!apiClient) throw new Error('API client not available') + if (!args.lifiInfos) throw new Error('LifiInfos not available') + + try { + console.log('Calculating intent address...') + console.log('Main signer:', args.mainSigner) + console.log('Calls:', args.calls) + console.log('LifiInfos:', args.lifiInfos) + + const calculatedAddress = calculateIntentAddress( + args.mainSigner, + args.calls as any[], // TODO: Add proper type + args.lifiInfos as any[], // TODO: Add proper type + ) + const receivedAddress = findPreconditionAddress(args.preconditions) + + console.log('Calculated address:', calculatedAddress.toString()) + console.log('Received address:', receivedAddress) + + const isVerified = isAddressEqual(Address.from(receivedAddress), calculatedAddress) + setVerificationStatus({ + success: isVerified, + receivedAddress: receivedAddress, + calculatedAddress: calculatedAddress.toString(), + }) + + if (!isVerified) { + throw new Error('Address verification failed: Calculated address does not match received address.') + } + + // Commit the intent config + const response = await apiClient.commitIntentConfig({ + walletAddress: calculatedAddress.toString(), + mainSigner: args.mainSigner, + calls: args.calls, + preconditions: args.preconditions, + lifiInfos: args.lifiInfos, + }) + console.log('API Commit Response:', response) + return { calculatedAddress: calculatedAddress.toString(), response } + } catch (error) { + console.error('Error during commit intent mutation:', error) + if (!verificationStatus?.success && !verificationStatus?.receivedAddress) { + try { + const calculatedAddress = calculateIntentAddress( + args.mainSigner, + args.calls as any[], // TODO: Add proper type + args.lifiInfos as any[], // TODO: Add proper type + ) + const receivedAddress = findPreconditionAddress(args.preconditions) + setVerificationStatus({ + success: false, + receivedAddress: receivedAddress, + calculatedAddress: calculatedAddress.toString(), + }) + } catch (calcError) { + console.error('Error calculating addresses for verification status on failure:', calcError) + setVerificationStatus({ success: false }) + } + } + throw error + } + }, + onSuccess: (data) => { + console.log('Intent config committed successfully, Wallet Address:', data.calculatedAddress) + setCommittedIntentAddress(data.calculatedAddress) + }, + onError: (error) => { + console.error('Failed to commit intent config:', error) + setCommittedIntentAddress(null) + }, + }) + + // New Query to fetch committed intent config + const { + data: committedIntentConfig, + isLoading: isLoadingCommittedConfig, + error: committedConfigError, + } = useQuery({ + queryKey: ['getIntentConfig', committedIntentAddress], + queryFn: async () => { + if (!apiClient || !committedIntentAddress) { + throw new Error('API client or committed intent address not available') + } + console.log('Fetching intent config for address:', committedIntentAddress) + return await apiClient.getIntentConfig({ walletAddress: committedIntentAddress }) + }, + enabled: !!committedIntentAddress && !!apiClient && commitIntentConfigMutation.isSuccess, + staleTime: 1000 * 60 * 5, // 5 minutes + retry: 1, + }) + + async function getIntentCallsPayloads(args: GetIntentCallsPayloadsArgs) { + return apiClient.getIntentCallsPayloads(args) + } + + // TODO: Add type for args + const createIntentMutation = useMutation({ + mutationFn: async (args: GetIntentCallsPayloadsArgs) => { + if (!account.address) { + throw new Error('Missing selected token or account address') + } + // Reset commit state when generating a new intent + setCommittedIntentAddress(null) + setVerificationStatus(null) + + const data = await getIntentCallsPayloads(args) + + setMetaTxns(data.metaTxns) + setIntentCallsPayloads(data.calls) + setIntentPreconditions(data.preconditions) + setLifiInfos(data.lifiInfos) // Ensure lifiInfos is set here + setCommittedIntentAddress(null) + + setVerificationStatus(null) + return data + }, + onSuccess: (data) => { + console.log('Intent Config Success:', data) + if ( + data && + data.calls && + data.calls.length > 0 && + data.preconditions && + data.preconditions.length > 0 && + data.metaTxns && + data.metaTxns.length > 0 + ) { + setIntentCallsPayloads(data.calls) + setIntentPreconditions(data.preconditions) + setMetaTxns(data.metaTxns) + setLifiInfos(data.lifiInfos) + } else { + console.warn('API returned success but no operations found.') + setIntentCallsPayloads(null) + setIntentPreconditions(null) + setMetaTxns(null) + setLifiInfos(null) + } + }, + onError: (error) => { + console.error('Intent Config Error:', error) + setIntentCallsPayloads(null) + setIntentPreconditions(null) + setMetaTxns(null) + setLifiInfos(null) + }, + }) + + function callIntentCallsPayload(args: GetIntentCallsPayloadsArgs) { + createIntentMutation.mutate(args) + } + + useEffect(() => { + if (!account.isConnected) { + setIntentCallsPayloads(null) + setIntentPreconditions(null) + setMetaTxns(null) + setCommittedIntentAddress(null) + setVerificationStatus(null) + } + }, [account.isConnected]) + + function clearIntent() { + setIntentCallsPayloads(null) + setIntentPreconditions(null) + setMetaTxns(null) + setCommittedIntentAddress(null) + setVerificationStatus(null) + setOperationHashes({}) + setHasAutoExecuted(false) + } + + const updateOriginCallStatus = ( + hash: Hex | undefined, + status: 'success' | 'reverted' | 'pending' | 'sending', + gasUsed?: bigint, + effectiveGasPrice?: bigint, + revertReason?: string | null, + ) => { + setOriginCallStatus({ + txnHash: hash, + status: + status === 'success' + ? 'Success' + : status === 'reverted' + ? 'Failed' + : status === 'sending' + ? 'Sending...' + : 'Pending', + revertReason: status === 'reverted' ? revertReason || 'Transaction reverted' : undefined, + gasUsed: gasUsed ? Number(gasUsed) : undefined, + effectiveGasPrice: effectiveGasPrice?.toString(), + }) + } + + const sendOriginTransaction = async () => { + console.log('Sending origin transaction...') + console.log( + isTransactionInProgress, + originCallParams, + originCallParams?.error, + originCallParams?.to, + originCallParams?.data, + originCallParams?.value, + originCallParams?.chainId, + ) + if ( + isTransactionInProgress || // Prevent duplicate transactions + !originCallParams || + originCallParams.error || + !originCallParams.to || + originCallParams.data === null || + originCallParams.value === null || + originCallParams.chainId === null + ) { + console.error('Origin call parameters not available or invalid:', originCallParams) + updateOriginCallStatus(undefined, 'reverted', undefined, undefined, 'Origin call parameters not ready') + return + } + + // Check if we need to switch chains + if (account.chainId !== originCallParams.chainId) { + setIsChainSwitchRequired(true) + updateOriginCallStatus( + undefined, + 'pending', + undefined, + undefined, + `Switching to chain ${originCallParams.chainId}...`, + ) + + try { + console.log('Switching to chain:', originCallParams.chainId) + await switchChain({ chainId: originCallParams.chainId }) + } catch (error: unknown) { + console.error('Failed to switch chain:', error) + if ( + error instanceof Error && + (error.message.includes('User rejected') || error.message.includes('user rejected')) + ) { + setIsAutoExecute(false) + } + updateOriginCallStatus( + undefined, + 'reverted', + undefined, + undefined, + `Failed to switch chain: ${error instanceof Error ? error.message : 'Unknown error'}`, + ) + setIsChainSwitchRequired(false) + } + return // Stop execution here whether switch succeeded or failed. + } + + // Ensure only one transaction is sent at a time + if (!isTransactionInProgress) { + setIsTransactionInProgress(true) // Mark transaction as in progress + setTxnHash(undefined) + updateOriginCallStatus(undefined, 'sending') + + if (!estimatedGas && !isEstimateError) { + setIsEstimatingGas(true) + return // Wait for gas estimation + } + + if (isEstimateError) { + console.error('Gas estimation failed:', estimateError) + updateOriginCallStatus( + undefined, + 'reverted', + undefined, + undefined, + `Gas estimation failed: ${estimateError?.message}`, + ) + setIsTransactionInProgress(false) + return + } + + // Add 20% buffer to estimated gas + const gasLimit = estimatedGas ? BigInt(Math.floor(Number(estimatedGas) * 1.2)) : undefined + + sendTransaction( + { + to: originCallParams.to, + data: originCallParams.data, + value: originCallParams.value, + chainId: originCallParams.chainId, + gas: gasLimit, + }, + { + onSuccess: (hash: Hex) => { + console.log('Transaction sent, hash:', hash) + setTxnHash(hash) + setIsTransactionInProgress(false) // Reset transaction state + }, + onError: (error: unknown) => { + console.error('Transaction failed:', error) + if ( + error instanceof Error && + (error.message.includes('User rejected') || error.message.includes('user rejected')) + ) { + setIsAutoExecute(false) + } + updateOriginCallStatus( + undefined, + 'reverted', + undefined, + undefined, + error instanceof Error ? error.message : 'Unknown error', + ) + setIsTransactionInProgress(false) + }, + }, + ) + } else { + console.warn('Transaction already in progress. Skipping duplicate request.') + } + } + + // Remove the chain change effect that might be resetting state + useEffect(() => { + if (switchChainError) { + console.error('Chain switch error:', switchChainError) + updateOriginCallStatus( + undefined, + 'reverted', + undefined, + undefined, + `Chain switch failed: ${switchChainError.message || 'Unknown error'}`, + ) + setIsChainSwitchRequired(false) + } + }, [switchChainError]) + + // Reset gas estimation state when parameters change + useEffect(() => { + setIsEstimatingGas(false) + }, [originCallParams]) + + // Only update chain switch required state when needed + useEffect(() => { + if (originCallParams?.chainId && account.chainId === originCallParams.chainId) { + setIsChainSwitchRequired(false) + } + }, [account.chainId, originCallParams?.chainId]) + + // Hook to wait for transaction receipt + const { + data: receipt, + isLoading: isWaitingForReceipt, + isSuccess: receiptIsSuccess, + isError: receiptIsError, + error: receiptError, + } = useWaitForTransactionReceipt({ + hash: txnHash, + confirmations: 1, + query: { + enabled: !!txnHash, + }, + }) + + // Modify the effect that watches for transaction status + useEffect(() => { + if (!txnHash) { + // Only reset these when txnHash is cleared + if (originCallStatus?.txnHash) { + setOriginCallStatus(null) + } + setOriginBlockTimestamp(null) + if (Object.keys(sentMetaTxns).length > 0) { + setSentMetaTxns({}) + } + return + } + + if ( + originCallStatus?.txnHash === txnHash && + (originCallStatus?.status === 'Success' || originCallStatus?.status === 'Failed') && + !isWaitingForReceipt + ) { + return + } + + if (isWaitingForReceipt) { + setOriginCallStatus((prevStatus) => ({ + ...(prevStatus?.txnHash === txnHash + ? prevStatus + : { gasUsed: undefined, effectiveGasPrice: undefined, revertReason: undefined }), + txnHash, + status: 'Pending', + })) + return + } + + if (receiptIsSuccess && receipt) { + const newStatus = receipt.status === 'success' ? 'Success' : 'Failed' + setOriginCallStatus({ + txnHash: receipt.transactionHash, + status: newStatus, + gasUsed: receipt.gasUsed ? Number(receipt.gasUsed) : undefined, + effectiveGasPrice: receipt.effectiveGasPrice?.toString(), + revertReason: + receipt.status === 'reverted' + ? ((receiptError as any)?.message as string | undefined) || 'Transaction reverted by receipt' + : undefined, + }) + + if (newStatus === 'Success' && receipt.blockNumber) { + const fetchTimestamp = async () => { + try { + if (!originCallParams?.chainId) { + console.error('[AnyPay] Origin chainId not available for fetching origin block timestamp.') + setOriginBlockTimestamp(null) + return + } + const chainConfig = getChainConfig(originCallParams.chainId) + const client = createPublicClient({ + chain: chainConfig, + transport: http(), + }) + const block = await client.getBlock({ blockNumber: BigInt(receipt.blockNumber) }) + setOriginBlockTimestamp(Number(block.timestamp)) + } catch (error) { + console.error('[AnyPay] Error fetching origin block timestamp:', error) + setOriginBlockTimestamp(null) + } + } + fetchTimestamp() + } else if (newStatus !== 'Success') { + setOriginBlockTimestamp(null) + } + + if ( + newStatus === 'Success' && + metaTxns && + metaTxns.length > 0 && + isAutoExecute && + !metaTxns.some((tx) => sentMetaTxns[`${tx.chainId}-${tx.id}`]) + ) { + console.log('Origin transaction successful, auto-sending all meta transactions...') + sendMetaTxnMutation.mutate({ selectedId: null }) + } + } else if (receiptIsError) { + setOriginCallStatus({ + txnHash, + status: 'Failed', + revertReason: ((receiptError as any)?.message as string | undefined) || 'Failed to get receipt', + gasUsed: undefined, + effectiveGasPrice: undefined, + }) + setOriginBlockTimestamp(null) + } + }, [ + txnHash, + isWaitingForReceipt, + receiptIsSuccess, + receiptIsError, + receipt, + receiptError, + metaTxns, + sentMetaTxns, + isAutoExecute, + originCallParams?.chainId, + ]) + + // Modify the auto-execute effect + useEffect(() => { + const shouldAutoSend = + isAutoExecute && + commitIntentConfigMutation.isSuccess && + originCallParams?.chainId && + account.chainId === originCallParams.chainId && + !originCallParams.error && + originCallParams.to && + originCallParams.data !== null && + originCallParams.value !== null && + !isSendingTransaction && + !isWaitingForReceipt && + !txnHash && + !isChainSwitchRequired && + !originCallStatus && + !hasAutoExecuted + + if (shouldAutoSend) { + console.log('Auto-executing transaction: All conditions met.') + setHasAutoExecuted(true) + + // Set initial status + setOriginCallStatus({ + status: 'Sending...', + }) + + sendTransaction( + { + to: originCallParams.to!, + data: originCallParams.data!, + value: originCallParams.value!, + chainId: originCallParams.chainId!, + }, + { + onSuccess: (hash: Hex) => { + console.log('Auto-executed transaction sent, hash:', hash) + setTxnHash(hash) + }, + onError: (error: unknown) => { + console.error('Auto-executed transaction failed:', error) + if ( + error instanceof Error && + (error.message.includes('User rejected') || error.message.includes('user rejected')) + ) { + setIsAutoExecute(false) + } + setOriginCallStatus({ + status: 'Failed', + revertReason: error instanceof Error ? error.message : 'Unknown error', + }) + setHasAutoExecuted(false) + }, + }, + ) + } + }, [ + isAutoExecute, + commitIntentConfigMutation.isSuccess, + originCallParams, + account.chainId, + isSendingTransaction, + isWaitingForReceipt, + txnHash, + isChainSwitchRequired, + originCallStatus, + hasAutoExecuted, + sendTransaction, + ]) + + // Effect to auto-commit when intent calls payloads are ready + useEffect(() => { + if ( + isAutoExecute && + intentCallsPayloads && + intentPreconditions && + lifiInfos && + account.address && + calculatedIntentAddress && + !commitIntentConfigMutation.isPending && + !commitIntentConfigMutation.isSuccess + ) { + console.log('Auto-committing intent configuration...') + commitIntentConfigMutation.mutate({ + walletAddress: calculatedIntentAddress.toString(), + mainSigner: account.address, + calls: intentCallsPayloads, + preconditions: intentPreconditions, + lifiInfos: lifiInfos, + }) + } + }, [ + isAutoExecute, + intentCallsPayloads, + intentPreconditions, + lifiInfos, // Add lifiInfos dependency + account.address, + commitIntentConfigMutation, + commitIntentConfigMutation.isPending, + commitIntentConfigMutation.isSuccess, + ]) + + // Update the sendMetaTxn mutation + const sendMetaTxnMutation = useMutation({ + mutationFn: async ({ selectedId }: { selectedId: string | null }) => { + if (!intentCallsPayloads || !intentPreconditions || !metaTxns || !account.address || !lifiInfos) { + throw new Error('Missing required data for meta-transaction') + } + + const intentAddress = calculateIntentAddress(account.address, intentCallsPayloads as any[], lifiInfos as any[]) // TODO: Add proper type + + // If no specific ID is selected, send all meta transactions + const txnsToSend = selectedId ? [metaTxns.find((tx) => tx.id === selectedId)] : metaTxns + + if (!txnsToSend || (selectedId && !txnsToSend[0])) { + throw new Error('Meta transaction not found') + } + + const results = [] + + for (const metaTxn of txnsToSend) { + if (!metaTxn) continue + + const operationKey = `${metaTxn.chainId}-${metaTxn.id}` + const lastSentTime = sentMetaTxns[operationKey] + const now = Date.now() + + if (lastSentTime && now - lastSentTime < RETRY_WINDOW_MS) { + const timeLeft = Math.ceil((RETRY_WINDOW_MS - (now - lastSentTime)) / 1000) + console.log(`Meta transaction for ${operationKey} was sent recently. Wait ${timeLeft}s before retry`) + continue + } + + try { + const chainId = parseInt(metaTxn.chainId) + if (isNaN(chainId) || chainId <= 0) { + throw new Error(`Invalid chainId for meta transaction: ${chainId}`) + } + const chainRelayer = getRelayer(chainId) + if (!chainRelayer) { + throw new Error(`No relayer found for chainId: ${chainId}`) + } + + const relevantPreconditions = intentPreconditions.filter((p) => p.chainId && parseInt(p.chainId) === chainId) + + console.log(`Relaying meta transaction ${operationKey} to intent ${intentAddress} via relayer:`, chainRelayer) + + const { opHash } = await chainRelayer.sendMetaTxn( + metaTxn.walletAddress as Address.Address, + metaTxn.contract as Address.Address, + metaTxn.input as Hex, + BigInt(metaTxn.chainId), + undefined, + relevantPreconditions, + ) + + try { + // Fire and forget send tx to backup relayer + const backupRelayer = getBackupRelayer(chainId) + + backupRelayer + ?.sendMetaTxn( + metaTxn.walletAddress as Address.Address, + metaTxn.contract as Address.Address, + metaTxn.input as Hex, + BigInt(metaTxn.chainId), + undefined, + relevantPreconditions, + ) + .then(() => {}) + .catch(() => {}) + } catch {} + + results.push({ + operationKey, + opHash, + success: true, + }) + } catch (error: unknown) { + results.push({ + operationKey, + error: error instanceof Error ? error.message : 'Unknown error', + success: false, + }) + } + } + + return results + }, + onSuccess: (results) => { + // Update states based on results + results.forEach(({ operationKey, opHash, success }) => { + if (success && opHash) { + setSentMetaTxns((prev) => ({ + ...prev, + [operationKey]: Date.now(), + })) + + setOperationHashes((prev) => ({ + ...prev, + [operationKey]: opHash, + })) + } + }) + }, + onError: (error) => { + console.error('Error in meta-transaction process:', error) + }, + retry: 5, // Allow up to 2 retries + retryDelay: (attemptIndex) => Math.min(1000 * Math.pow(2, attemptIndex), 30000), // Exponential backoff + }) + + const [tokenAddress, setTokenAddress] = useState(null) + const [originChainId, setOriginChainId] = useState(null) + + useEffect(() => { + if ( + !intentCallsPayloads?.[0]?.chainId || + !tokenAddress || + !originChainId || + !intentPreconditions || + !account.address + ) { + setOriginCallParams(null) + return + } + + try { + const intentAddressString = calculatedIntentAddress as Address.Address + + let calcTo: Address.Address + let calcData: Hex = '0x' + let calcValue: bigint = 0n + + const recipientAddress = intentAddressString + + const isNative = tokenAddress === zeroAddress + + if (isNative) { + const nativePrecondition = intentPreconditions.find( + (p: IntentPrecondition) => + (p.type === 'transfer-native' || p.type === 'native-balance') && p.chainId === originChainId.toString(), + ) + const nativeMinAmount = nativePrecondition?.data?.minAmount ?? nativePrecondition?.data?.min + if (nativeMinAmount === undefined) { + throw new Error('Could not find native precondition (transfer-native or native-balance) or min amount') + } + calcValue = BigInt(nativeMinAmount) + calcTo = recipientAddress + } else { + const erc20Precondition = intentPreconditions.find( + (p: IntentPrecondition) => + p.type === 'erc20-balance' && + p.chainId === originChainId.toString() && + p.data?.token && + isAddressEqual(Address.from(p.data.token), Address.from(tokenAddress)), + ) + + const erc20MinAmount = erc20Precondition?.data?.min + if (erc20MinAmount === undefined) { + throw new Error('Could not find ERC20 balance precondition or min amount') + } + calcData = getERC20TransferData(recipientAddress, erc20MinAmount) + calcTo = tokenAddress as Address.Address + } + + setOriginCallParams({ + to: calcTo, + data: calcData, + value: calcValue, + chainId: originChainId, + error: undefined, + }) + } catch (error: unknown) { + console.error('Failed to calculate origin call params for UI:', error) + setOriginCallParams({ + to: null, + data: null, + value: null, + chainId: null, + error: error instanceof Error ? error.message : 'Unknown error', + }) + } + }, [intentCallsPayloads, tokenAddress, originChainId, intentPreconditions, account.address, lifiInfos]) + + // const checkPreconditionStatuses = useCallback(async () => { + // if (!intentPreconditions) return + + // const statuses = await Promise.all( + // intentPreconditions.map(async (precondition) => { + // try { + // const chainIdString = precondition.chainId + // if (!chainIdString) { + // console.warn('Precondition missing chainId:', precondition) + // return false + // } + // const chainId = parseInt(chainIdString) + // if (isNaN(chainId) || chainId <= 0) { + // console.warn('Precondition has invalid chainId:', chainIdString, precondition) + // return false + // } + + // const chainRelayer = getRelayer(chainId) + // if (!chainRelayer) { + // console.error(`No relayer found for chainId: ${chainId}`) + // return false + // } + + // return await chainRelayer.checkPrecondition(precondition) + // } catch (error) { + // console.error('Error checking precondition:', error, 'Precondition:', precondition) + // return false + // } + // }), + // ) + + // setPreconditionStatuses(statuses) + // }, [intentPreconditions, getRelayer]) + + // useEffect(() => { + // // TODO: Remove this once we have a way to check precondition statuses + // if (false) { + // checkPreconditionStatuses() + // } + // }, [intentPreconditions, checkPreconditionStatuses]) + + // Add monitoring for each meta transaction + const metaTxnMonitorStatuses = useMetaTxnsMonitor(metaTxns as unknown as MetaTxn[] | undefined, getRelayer) + + // Create a stable dependency for the meta timestamp effect + const stableMetaTxnStatusesKey = useMemo(() => { + if (!metaTxns || Object.keys(metaTxnMonitorStatuses).length === 0) { + return 'no_statuses' + } + // Sort by a stable key (e.g., id) to ensure consistent order if metaTxns array order changes + // but content is the same, though metaTxns itself is a dependency, so this might be redundant if metaTxns order is stable. + const sortedTxnIds = metaTxns.map((tx) => `${tx.chainId}-${tx.id}`).sort() + + return sortedTxnIds + .map((key) => { + const statusObj = metaTxnMonitorStatuses[key] + return `${key}:${statusObj ? statusObj.status : 'loading'}` + }) + .join(',') + }, [metaTxns, metaTxnMonitorStatuses]) + + // Effect to fetch meta-transaction block timestamps + useEffect(() => { + if (metaTxns && Object.keys(metaTxnMonitorStatuses).length > 0) { + metaTxns.forEach(async (metaTxn) => { + const operationKey = `${metaTxn.chainId}-${metaTxn.id}` + const monitorStatus = metaTxnMonitorStatuses[operationKey] + + if (metaTxnBlockTimestamps[operationKey]?.timestamp || metaTxnBlockTimestamps[operationKey]?.error) { + return // Already fetched or error recorded + } + + let validBlockNumberForApi: bigint | undefined = undefined + let transactionHashForReceipt: Hex | undefined = undefined + + if (monitorStatus?.status === 'confirmed') { + transactionHashForReceipt = monitorStatus.transactionHash as Hex + } else if (monitorStatus) { + // Potential place for a log if status is neither confirmed nor undefined, but usually not needed + } + + if (transactionHashForReceipt) { + try { + const chainId = parseInt(metaTxn.chainId) + if (isNaN(chainId) || chainId <= 0) { + console.error(`[AnyPay] MetaTxn ${operationKey}: Invalid chainId:`, metaTxn.chainId) + throw new Error(`Invalid chainId for meta transaction: ${metaTxn.chainId}`) + } + + const chainConfig = getChainConfig(chainId) + const client = createPublicClient({ + chain: chainConfig, + transport: http(), + }) + + const receipt = await client.getTransactionReceipt({ hash: transactionHashForReceipt }) + + if (receipt && typeof receipt.blockNumber === 'bigint') { + validBlockNumberForApi = receipt.blockNumber + } else { + console.warn( + `[AnyPay] MetaTxn ${operationKey}: Block number not found or invalid in fetched receipt:`, + receipt, + ) + setMetaTxnBlockTimestamps((prev) => ({ + ...prev, + [operationKey]: { timestamp: null, error: 'Block number not found in receipt' }, + })) + return + } + + if (validBlockNumberForApi !== undefined) { + const block = await client.getBlock({ blockNumber: validBlockNumberForApi }) + setMetaTxnBlockTimestamps((prev) => ({ + ...prev, + [operationKey]: { timestamp: Number(block.timestamp), error: undefined }, + })) + } + } catch (error: any) { + console.error( + `[AnyPay] MetaTxn ${operationKey}: Error fetching transaction receipt or block timestamp:`, + error, + ) + setMetaTxnBlockTimestamps((prev) => ({ + ...prev, + [operationKey]: { timestamp: null, error: error.message || 'Failed to fetch receipt/timestamp' }, + })) + } + } else if (monitorStatus?.status === 'confirmed') { + console.log( + `[AnyPay] MetaTxn ${operationKey}: Status is confirmed, but transactionHashForReceipt is undefined. Not fetching timestamp.`, + ) + } + }) + } + if (!metaTxns || metaTxns.length === 0) { + // Check if it's already empty to prevent unnecessary setState + setMetaTxnBlockTimestamps((prevTimestamps) => { + if (Object.keys(prevTimestamps).length === 0) { + // console.log('[AnyPay] MetaTxnBlockTimestamps already empty, not setting state.'); + return prevTimestamps + } + // console.log('[AnyPay] Clearing MetaTxnBlockTimestamps.'); + return {} + }) + } + }, [stableMetaTxnStatusesKey, getRelayer]) // Use stableMetaTxnStatusesKey and getRelayer + + const updateAutoExecute = (enabled: boolean) => { + setIsAutoExecute(enabled) + } + + function createIntent(args: GetIntentCallsPayloadsArgs) { + createIntentMutation.mutate(args) + } + + const calculatedIntentAddress = useMemo(() => { + if (!account.address || !intentCallsPayloads || !lifiInfos) { + return null + } + return calculateIntentAddress(account.address, intentCallsPayloads as any[], lifiInfos as any[]) // TODO: Add proper type + }, [account.address, intentCallsPayloads, lifiInfos]) + + const createIntentPending = createIntentMutation.isPending + const createIntentSuccess = createIntentMutation.isSuccess + const createIntentError = createIntentMutation.error + const createIntentArgs = createIntentMutation.variables + + function commitIntentConfig(args: { + walletAddress: string + mainSigner: string + calls: IntentCallsPayload[] + preconditions: IntentPrecondition[] + lifiInfos: AnypayLifiInfo[] + }) { + console.log('commitIntentConfig', args) + commitIntentConfigMutation.mutate(args) + } + + function updateOriginCallParams(args: { originChainId: number; tokenAddress: string } | null) { + if (!args) { + setOriginCallParams(null) + return + } + const { originChainId, tokenAddress } = args + setOriginChainId(originChainId) + setTokenAddress(tokenAddress) + } + + function sendMetaTxn(selectedId: string | null) { + sendMetaTxnMutation.mutate({ selectedId }) + } + + const commitIntentConfigPending = commitIntentConfigMutation.isPending + const commitIntentConfigSuccess = commitIntentConfigMutation.isSuccess + const commitIntentConfigError = commitIntentConfigMutation.error + const commitIntentConfigArgs = commitIntentConfigMutation.variables + + const sendMetaTxnPending = sendMetaTxnMutation.isPending + const sendMetaTxnSuccess = sendMetaTxnMutation.isSuccess + const sendMetaTxnError = sendMetaTxnMutation.error + const sendMetaTxnArgs = sendMetaTxnMutation.variables + + return { + apiClient, + metaTxns, + intentCallsPayloads, + intentPreconditions, + lifiInfos, + txnHash, + committedIntentAddress, + verificationStatus, + getRelayer, + estimatedGas, + isEstimateError, + estimateError, + calculateIntentAddress, + committedIntentConfig, + isLoadingCommittedConfig, + committedConfigError, + commitIntentConfig, + commitIntentConfigPending, + commitIntentConfigSuccess, + commitIntentConfigError, + commitIntentConfigArgs, + getIntentCallsPayloads, + operationHashes, + callIntentCallsPayload, + sendOriginTransaction, + switchChain, + isSwitchingChain, + switchChainError, + isTransactionInProgress, + isChainSwitchRequired, + sendTransaction, + isSendingTransaction, + originCallStatus, + updateOriginCallStatus, + isEstimatingGas, + isAutoExecute, + updateAutoExecute, + receipt, + isWaitingForReceipt, + receiptIsSuccess, + receiptIsError, + receiptError, + hasAutoExecuted, + sentMetaTxns, + sendMetaTxn, + sendMetaTxnPending, + sendMetaTxnSuccess, + sendMetaTxnError, + sendMetaTxnArgs, + clearIntent, + metaTxnMonitorStatuses, + createIntent, + createIntentPending, + createIntentSuccess, + createIntentError, + createIntentArgs, + calculatedIntentAddress, + originCallParams, + updateOriginCallParams, + originBlockTimestamp, + metaTxnBlockTimestamps, + } +} + +type SendOptions = { + account: AccountType + originTokenAddress: string + originChainId: number + originTokenAmount: string + destinationChainId: number + recipient: string + destinationTokenAddress: string + destinationTokenAmount: string + sequenceApiKey: string + fee: string + client?: WalletClient + dryMode?: boolean +} + +// TODO: fix up this one-click +export async function prepareSend(options: SendOptions) { + const { + account, + originTokenAddress, + originChainId, + originTokenAmount, // account balance + destinationChainId, + recipient, + destinationTokenAddress, + destinationTokenAmount, + sequenceApiKey, + fee, + client, + dryMode, + } = options + const chain = getChainConfig(originChainId) + const apiClient = getAPIClient('http://localhost:4422', sequenceApiKey) + const originRelayer = getRelayer({ env: 'local' }, originChainId) + const destinationRelayer = getRelayer({ env: 'local' }, destinationChainId) + + const mainSigner = account.address + + const args = { + userAddress: mainSigner, + originChainId, + originTokenAddress, + originTokenAmount, // max amount + destinationChainId, + destinationToAddress: destinationTokenAddress == zeroAddress ? recipient : destinationTokenAddress, + destinationTokenAddress: destinationTokenAddress, + destinationTokenAmount: destinationTokenAmount, + destinationCallData: + destinationTokenAddress !== zeroAddress ? getERC20TransferData(recipient, BigInt(destinationTokenAmount)) : '0x', + destinationCallValue: destinationTokenAddress === zeroAddress ? destinationTokenAmount : '0', + } + + console.log('Creating intent with args:', args) + const intent = await getIntentCallsPayloads(apiClient, args as any) // TODO: Add proper type + console.log('Got intent:', intent) + + if (!intent) { + throw new Error('Invalid intent') + } + + if (!intent.preconditions?.length || !intent.calls?.length || !intent.lifiInfos?.length) { + throw new Error('Invalid intent') + } + + const intentAddress = calculateIntentAddress(mainSigner, intent.calls as any[], intent.lifiInfos as any[]) // TODO: Add proper type + console.log('Calculated intent address:', intentAddress.toString()) + + await commitIntentConfig( + apiClient, + mainSigner, + intent.calls as any[], + intent.preconditions as any[], + intent.lifiInfos as any[], + ) + + console.log('Committed intent config') + + return { + intentAddress, + send: async () => { + console.log('sending origin transaction') + const originCallParams = { + to: intent.preconditions[0]!.data!.address, + data: '0x', + value: BigInt(intent.preconditions[0]!.data!.min) + BigInt(fee), + chainId: originChainId, + chain, + } + + const walletClient = + client ?? + createWalletClient({ + chain, + transport: http(), + }) + + const publicClient = createPublicClient({ + chain, + transport: http(), + }) + + if (!dryMode) { + const tx = await sendOriginTransaction(account, walletClient, originCallParams as any) // TODO: Add proper type + console.log('origin tx', tx) + // Wait for transaction receipt + const receipt = await publicClient.waitForTransactionReceipt({ hash: tx }) + console.log('receipt', receipt) + } + + await new Promise((resolve) => setTimeout(resolve, 5000)) + + const metaTx = intent.metaTxns[0]! + console.log('metaTx', metaTx) + const opHash = await relayerSendMetaTx(originRelayer, metaTx, [intent.preconditions[0]!]) + + console.log('opHash', opHash) + + // eslint-disable-next-line no-constant-condition + while (true) { + console.log('polling status', metaTx.id as `0x${string}`, BigInt(metaTx.chainId)) + const receipt = await getMetaTxStatus(originRelayer, metaTx.id, Number(metaTx.chainId)) + console.log('status', receipt) + if (receipt.status === 'confirmed') { + break + } + await new Promise((resolve) => setTimeout(resolve, 1000)) + } + + await new Promise((resolve) => setTimeout(resolve, 5000)) + const metaTx2 = intent.metaTxns[1]! + console.log('metaTx2', metaTx2) + + const opHash2 = await relayerSendMetaTx(destinationRelayer, metaTx2, [intent.preconditions[1]!]) + console.log('opHash2', opHash2) + + // eslint-disable-next-line no-constant-condition + while (true) { + console.log('polling status', metaTx2.id as `0x${string}`, BigInt(metaTx2.chainId)) + const receipt = await getMetaTxStatus(destinationRelayer, metaTx2.id, Number(metaTx2.chainId)) + console.log('receipt', receipt) + if (receipt.status === 'confirmed') { + break + } + await new Promise((resolve) => setTimeout(resolve, 1000)) + } + }, + } +} diff --git a/packages/wallet/anypay-sdk/src/apiClient.ts b/packages/wallet/anypay-sdk/src/apiClient.ts new file mode 100644 index 000000000..c53539fd1 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/apiClient.ts @@ -0,0 +1,19 @@ +import { SequenceAPIClient } from '@0xsequence/api' +import { useMemo } from 'react' +import { useConfig } from '@0xsequence/hooks' + +export { type SequenceAPIClient } + +export function getAPIClient(apiUrl: string, projectAccessKey: string, jwt?: string): SequenceAPIClient { + return new SequenceAPIClient(apiUrl, projectAccessKey, jwt) +} + +export const useAPIClient = () => { + const { projectAccessKey, jwt, env } = useConfig() + + const apiClient = useMemo(() => { + return getAPIClient(env.apiUrl, projectAccessKey, jwt) + }, [projectAccessKey, jwt, env.apiUrl]) + + return apiClient +} diff --git a/packages/wallet/anypay-sdk/src/buffer.ts b/packages/wallet/anypay-sdk/src/buffer.ts new file mode 100644 index 000000000..c8a16231c --- /dev/null +++ b/packages/wallet/anypay-sdk/src/buffer.ts @@ -0,0 +1,10 @@ +import { Buffer as BufferPolyfill } from 'buffer' + +// Polyfill Buffer globally if it doesn't exist. +// Buffer is required by some 0xsequence packages. +// This is a temporary solution. +if (typeof window !== 'undefined' && !window.Buffer) { + window.Buffer = BufferPolyfill +} + +export { BufferPolyfill as Buffer } diff --git a/packages/wallet/anypay-sdk/src/constants.ts b/packages/wallet/anypay-sdk/src/constants.ts new file mode 100644 index 000000000..6349385b6 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/constants.ts @@ -0,0 +1,3 @@ +export const ANYPAY_LIFI_SAPIENT_SIGNER_ADDRESS = '0xd7571bd1e3af468c3a49966c9a92a2e907cdfa52' +export const ANYPAY_LIFI_SAPIENT_SIGNER_LITE_ADDRESS = '0xaA3f6B332237aFb83789d3F5FBaD817EF3102648' +export const ANYPAY_LIFI_ATTESATION_SIGNER_ADDRESS = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' diff --git a/packages/wallet/anypay-sdk/src/encoders.ts b/packages/wallet/anypay-sdk/src/encoders.ts new file mode 100644 index 000000000..0b6427374 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/encoders.ts @@ -0,0 +1,7 @@ +import { Address, AbiFunction } from 'ox' +import { Hex } from 'viem' + +export function getERC20TransferData(recipient: string, amount: bigint): Hex { + const erc20Transfer = AbiFunction.from('function transfer(address,uint256) returns (bool)') + return AbiFunction.encodeData(erc20Transfer, [recipient as Address.Address, amount]) as Hex +} diff --git a/packages/wallet/anypay-sdk/src/gen/relayer.gen.ts b/packages/wallet/anypay-sdk/src/gen/relayer.gen.ts new file mode 100644 index 000000000..27d0bc315 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/gen/relayer.gen.ts @@ -0,0 +1,1920 @@ +/* eslint-disable */ +// sequence-relayer v0.4.1 62dd019c839b6a47985cf41ce45822de8b3e4896 +// -- +// Code generated by webrpc-gen@v0.24.0 with typescript generator. DO NOT EDIT. +// +// webrpc-gen -schema=relayer.ridl -target=typescript -client -out=./clients/relayer.gen.ts + +export const WebrpcHeader = 'Webrpc' + +export const WebrpcHeaderValue = 'webrpc@v0.24.0;gen-typescript@v0.16.3;sequence-relayer@v0.4.1' + +// WebRPC description and code-gen version +export const WebRPCVersion = 'v1' + +// Schema version of your RIDL schema +export const WebRPCSchemaVersion = 'v0.4.1' + +// Schema hash generated from your RIDL schema +export const WebRPCSchemaHash = '62dd019c839b6a47985cf41ce45822de8b3e4896' + +type WebrpcGenVersions = { + webrpcGenVersion: string + codeGenName: string + codeGenVersion: string + schemaName: string + schemaVersion: string +} + +export function VersionFromHeader(headers: Headers): WebrpcGenVersions { + const headerValue = headers.get(WebrpcHeader) + if (!headerValue) { + return { + webrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } + } + + return parseWebrpcGenVersions(headerValue) +} + +function parseWebrpcGenVersions(header: string): WebrpcGenVersions { + const versions = header.split(';') + if (versions.length < 3) { + return { + webrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } + } + + const [_, webrpcGenVersion] = versions[0]!.split('@') + const [codeGenName, codeGenVersion] = versions[1]!.split('@') + const [schemaName, schemaVersion] = versions[2]!.split('@') + + return { + webrpcGenVersion: webrpcGenVersion ?? '', + codeGenName: codeGenName ?? '', + codeGenVersion: codeGenVersion ?? '', + schemaName: schemaName ?? '', + schemaVersion: schemaVersion ?? '', + } +} + +// +// Types +// + +export enum ETHTxnStatus { + UNKNOWN = 'UNKNOWN', + DROPPED = 'DROPPED', + QUEUED = 'QUEUED', + SENT = 'SENT', + SUCCEEDED = 'SUCCEEDED', + PARTIALLY_FAILED = 'PARTIALLY_FAILED', + FAILED = 'FAILED', + PENDING_PRECONDITION = 'PENDING_PRECONDITION', +} + +export enum TransferType { + SEND = 'SEND', + RECEIVE = 'RECEIVE', + BRIDGE_DEPOSIT = 'BRIDGE_DEPOSIT', + BRIDGE_WITHDRAW = 'BRIDGE_WITHDRAW', + BURN = 'BURN', + UNKNOWN = 'UNKNOWN', +} + +export enum FeeTokenType { + UNKNOWN = 'UNKNOWN', + ERC20_TOKEN = 'ERC20_TOKEN', + ERC1155_TOKEN = 'ERC1155_TOKEN', +} + +export enum SortOrder { + DESC = 'DESC', + ASC = 'ASC', +} + +export interface Version { + webrpcVersion: string + schemaVersion: string + schemaHash: string + appVersion: string +} + +export interface RuntimeStatus { + healthOK: boolean + startTime: string + uptime: number + ver: string + branch: string + commitHash: string + chainID: number + useEIP1559: boolean + senders: Array + checks: RuntimeChecks +} + +export interface SenderStatus { + index: number + address: string + etherBalance: number + active: boolean +} + +export interface RuntimeChecks {} + +export interface SequenceContext { + factory: string + mainModule: string + mainModuleUpgradable: string + guestModule: string + utils: string +} + +export interface GasTank { + id: number + chainId: number + name: string + currentBalance: number + unlimited: boolean + feeMarkupFactor: number + updatedAt: string + createdAt: string +} + +export interface GasTankBalanceAdjustment { + gasTankId: number + nonce: number + amount: number + totalBalance: number + balanceTimestamp: string + createdAt: string +} + +export interface GasSponsor { + id: number + gasTankId: number + projectId: number + chainId: number + address: string + name: string + active: boolean + updatedAt: string + createdAt: string + deletedAt: string +} + +export interface GasSponsorUsage { + name: string + id: number + totalGasUsed: number + totalTxnFees: number + totalTxnFeesUsd: number + avgGasPrice: number + totalTxns: number + startTime: string + endTime: string +} + +export interface MetaTxn { + walletAddress: string + contract: string + input: string +} + +export interface MetaTxnLog { + id: number + chainId: number + projectId: number + txnHash: string + txnNonce: string + metaTxnID?: string + txnStatus: ETHTxnStatus + txnRevertReason: string + requeues: number + queuedAt: string + sentAt: string + minedAt: string + target: string + input: string + txnArgs: { [key: string]: any } + txnReceipt?: { [key: string]: any } + walletAddress: string + metaTxnNonce: string + gasLimit: number + gasPrice: string + gasUsed: number + gasEstimated: number + gasFeeMarkup?: number + usdRate: string + creditsUsed: number + cost: string + isWhitelisted: boolean + gasSponsor?: number + gasTank?: number + updatedAt: string + createdAt: string +} + +export interface MetaTxnReceipt { + id: string + status: string + revertReason?: string + index: number + logs: Array + receipts: Array + blockNumber: string + txnHash: string + txnReceipt: string +} + +export interface MetaTxnReceiptLog { + address: string + topics: Array + data: string +} + +export interface IntentPrecondition { + type: string + chainId: string + data: any +} + +export interface IntentSolution { + transactions: Array +} + +export interface Transactions { + chainID: string + transactions: Array + preconditions?: Array +} + +export interface Transaction { + delegateCall: boolean + revertOnError: boolean + gasLimit: string + target: string + value: string + data: string +} + +export interface TxnLogUser { + username: string +} + +export interface TxnLogTransfer { + transferType: TransferType + contractAddress: string + from: string + to: string + ids: Array + amounts: Array +} + +export interface SentTransactionsFilter { + pending?: boolean + failed?: boolean +} + +export interface SimulateResult { + executed: boolean + succeeded: boolean + result?: string + reason?: string + gasUsed: number + gasLimit: number +} + +export interface FeeOption { + token: FeeToken + to: string + value: string + gasLimit: number +} + +export interface FeeToken { + chainId: number + name: string + symbol: string + type: FeeTokenType + decimals?: number + logoURL: string + contractAddress?: string + tokenID?: string +} + +export interface Page { + pageSize?: number + page?: number + more?: boolean + totalRecords?: number + column?: string + before?: any + after?: any + sort?: Array +} + +export interface SortBy { + column: string + order: SortOrder +} + +export interface Relayer { + ping(headers?: object, signal?: AbortSignal): Promise + version(headers?: object, signal?: AbortSignal): Promise + runtimeStatus(headers?: object, signal?: AbortSignal): Promise + getSequenceContext(headers?: object, signal?: AbortSignal): Promise + getChainID(headers?: object, signal?: AbortSignal): Promise + sendMetaTxn(args: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise + getMetaTxnNonce(args: GetMetaTxnNonceArgs, headers?: object, signal?: AbortSignal): Promise + getMetaTxnReceipt( + args: GetMetaTxnReceiptArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + simulate(args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise + updateMetaTxnGasLimits( + args: UpdateMetaTxnGasLimitsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + feeTokens(headers?: object, signal?: AbortSignal): Promise + feeOptions(args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise + getMetaTxnNetworkFeeOptions( + args: GetMetaTxnNetworkFeeOptionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getMetaTransactions( + args: GetMetaTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getTransactionCost( + args: GetTransactionCostArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + sentTransactions(args: SentTransactionsArgs, headers?: object, signal?: AbortSignal): Promise + pendingTransactions( + args: PendingTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getGasTank(args: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise + addGasTank(args: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise + updateGasTank(args: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise + nextGasTankBalanceAdjustmentNonce( + args: NextGasTankBalanceAdjustmentNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + adjustGasTankBalance( + args: AdjustGasTankBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getGasTankBalanceAdjustment( + args: GetGasTankBalanceAdjustmentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + listGasTankBalanceAdjustments( + args: ListGasTankBalanceAdjustmentsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + listGasSponsors(args: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise + getGasSponsor(args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + addGasSponsor(args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + updateGasSponsor(args: UpdateGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + removeGasSponsor(args: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + addressGasSponsors( + args: AddressGasSponsorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getProjectBalance( + args: GetProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + adjustProjectBalance( + args: AdjustProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise +} + +export interface PingArgs {} + +export interface PingReturn { + status: boolean +} +export interface VersionArgs {} + +export interface VersionReturn { + version: Version +} +export interface RuntimeStatusArgs {} + +export interface RuntimeStatusReturn { + status: RuntimeStatus +} +export interface GetSequenceContextArgs {} + +export interface GetSequenceContextReturn { + data: SequenceContext +} +export interface GetChainIDArgs {} + +export interface GetChainIDReturn { + chainID: number +} +export interface SendMetaTxnArgs { + call: MetaTxn + quote?: string + projectID?: number + preconditions?: Array +} + +export interface SendMetaTxnReturn { + status: boolean + txnHash: string +} +export interface GetMetaTxnNonceArgs { + walletContractAddress: string + space?: string +} + +export interface GetMetaTxnNonceReturn { + nonce: string +} +export interface GetMetaTxnReceiptArgs { + metaTxID: string +} + +export interface GetMetaTxnReceiptReturn { + receipt: MetaTxnReceipt +} +export interface SimulateArgs { + wallet: string + transactions: string +} + +export interface SimulateReturn { + results: Array +} +export interface UpdateMetaTxnGasLimitsArgs { + walletAddress: string + walletConfig: any + payload: string +} + +export interface UpdateMetaTxnGasLimitsReturn { + payload: string +} +export interface FeeTokensArgs {} + +export interface FeeTokensReturn { + isFeeRequired: boolean + tokens: Array +} +export interface FeeOptionsArgs { + wallet: string + to: string + data: string + simulate?: boolean +} + +export interface FeeOptionsReturn { + options: Array + sponsored: boolean + quote?: string +} +export interface GetMetaTxnNetworkFeeOptionsArgs { + walletConfig: any + payload: string +} + +export interface GetMetaTxnNetworkFeeOptionsReturn { + options: Array +} +export interface GetMetaTransactionsArgs { + projectId: number + page?: Page +} + +export interface GetMetaTransactionsReturn { + page: Page + transactions: Array +} +export interface GetTransactionCostArgs { + projectId: number + from: string + to: string +} + +export interface GetTransactionCostReturn { + cost: number +} +export interface SentTransactionsArgs { + filter?: SentTransactionsFilter + page?: Page +} + +export interface SentTransactionsReturn { + page: Page + transactions: Array +} +export interface PendingTransactionsArgs { + page?: Page +} + +export interface PendingTransactionsReturn { + page: Page + transactions: Array +} +export interface GetGasTankArgs { + id: number +} + +export interface GetGasTankReturn { + gasTank: GasTank +} +export interface AddGasTankArgs { + name: string + feeMarkupFactor: number + unlimited?: boolean +} + +export interface AddGasTankReturn { + status: boolean + gasTank: GasTank +} +export interface UpdateGasTankArgs { + id: number + name?: string + feeMarkupFactor?: number + unlimited?: boolean +} + +export interface UpdateGasTankReturn { + status: boolean + gasTank: GasTank +} +export interface NextGasTankBalanceAdjustmentNonceArgs { + id: number +} + +export interface NextGasTankBalanceAdjustmentNonceReturn { + nonce: number +} +export interface AdjustGasTankBalanceArgs { + id: number + nonce: number + amount: number +} + +export interface AdjustGasTankBalanceReturn { + status: boolean + adjustment: GasTankBalanceAdjustment +} +export interface GetGasTankBalanceAdjustmentArgs { + id: number + nonce: number +} + +export interface GetGasTankBalanceAdjustmentReturn { + adjustment: GasTankBalanceAdjustment +} +export interface ListGasTankBalanceAdjustmentsArgs { + id: number + page?: Page +} + +export interface ListGasTankBalanceAdjustmentsReturn { + page: Page + adjustments: Array +} +export interface ListGasSponsorsArgs { + projectId: number + page?: Page +} + +export interface ListGasSponsorsReturn { + page: Page + gasSponsors: Array +} +export interface GetGasSponsorArgs { + projectId: number + id: number +} + +export interface GetGasSponsorReturn { + gasSponsor: GasSponsor +} +export interface AddGasSponsorArgs { + projectId: number + address: string + name?: string + active?: boolean +} + +export interface AddGasSponsorReturn { + status: boolean + gasSponsor: GasSponsor +} +export interface UpdateGasSponsorArgs { + projectId: number + id: number + name?: string + active?: boolean +} + +export interface UpdateGasSponsorReturn { + status: boolean + gasSponsor: GasSponsor +} +export interface RemoveGasSponsorArgs { + projectId: number + id: number +} + +export interface RemoveGasSponsorReturn { + status: boolean +} +export interface AddressGasSponsorsArgs { + address: string + page?: Page +} + +export interface AddressGasSponsorsReturn { + page: Page + gasSponsors: Array +} +export interface GetProjectBalanceArgs { + projectId: number +} + +export interface GetProjectBalanceReturn { + balance: number +} +export interface AdjustProjectBalanceArgs { + projectId: number + amount: number + identifier: string +} + +export interface AdjustProjectBalanceReturn { + balance: number +} + +// +// Client +// +export class Relayer implements Relayer { + protected hostname: string + protected fetch: Fetch + protected path = '/rpc/Relayer/' + + constructor(hostname: string, fetch: Fetch) { + this.hostname = hostname.replace(/\/*$/, '') + this.fetch = (input: RequestInfo, init?: RequestInit) => fetch(input, init) + } + + private url(name: string): string { + return this.hostname + this.path + name + } + + ping = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + version = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + version: _data.version, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getSequenceContext = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetSequenceContext'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + data: _data.data, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getChainID = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetChainID'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + chainID: _data.chainID, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sendMetaTxn = (args: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('SendMetaTxn'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + txnHash: _data.txnHash, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTxnNonce = ( + args: GetMetaTxnNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTxnNonce'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + nonce: _data.nonce, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTxnReceipt = ( + args: GetMetaTxnReceiptArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTxnReceipt'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + receipt: _data.receipt, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + simulate = (args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Simulate'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + results: >_data.results, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updateMetaTxnGasLimits = ( + args: UpdateMetaTxnGasLimitsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdateMetaTxnGasLimits'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + payload: _data.payload, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + feeTokens = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('FeeTokens'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + isFeeRequired: _data.isFeeRequired, + tokens: >_data.tokens, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + feeOptions = (args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('FeeOptions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + options: >_data.options, + sponsored: _data.sponsored, + quote: _data.quote, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTxnNetworkFeeOptions = ( + args: GetMetaTxnNetworkFeeOptionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTxnNetworkFeeOptions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + options: >_data.options, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTransactions = ( + args: GetMetaTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTransactions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + transactions: >_data.transactions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getTransactionCost = ( + args: GetTransactionCostArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetTransactionCost'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + cost: _data.cost, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sentTransactions = ( + args: SentTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SentTransactions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + transactions: >_data.transactions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + pendingTransactions = ( + args: PendingTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('PendingTransactions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + transactions: >_data.transactions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getGasTank = (args: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetGasTank'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + gasTank: _data.gasTank, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + addGasTank = (args: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('AddGasTank'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasTank: _data.gasTank, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updateGasTank = (args: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('UpdateGasTank'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasTank: _data.gasTank, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + nextGasTankBalanceAdjustmentNonce = ( + args: NextGasTankBalanceAdjustmentNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('NextGasTankBalanceAdjustmentNonce'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + nonce: _data.nonce, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + adjustGasTankBalance = ( + args: AdjustGasTankBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AdjustGasTankBalance'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + adjustment: _data.adjustment, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getGasTankBalanceAdjustment = ( + args: GetGasTankBalanceAdjustmentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetGasTankBalanceAdjustment'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + adjustment: _data.adjustment, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listGasTankBalanceAdjustments = ( + args: ListGasTankBalanceAdjustmentsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListGasTankBalanceAdjustments'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + adjustments: >_data.adjustments, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listGasSponsors = ( + args: ListGasSponsorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListGasSponsors'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + gasSponsors: >_data.gasSponsors, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getGasSponsor = (args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + gasSponsor: _data.gasSponsor, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + addGasSponsor = (args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('AddGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasSponsor: _data.gasSponsor, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updateGasSponsor = ( + args: UpdateGasSponsorArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdateGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasSponsor: _data.gasSponsor, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + removeGasSponsor = ( + args: RemoveGasSponsorArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('RemoveGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + addressGasSponsors = ( + args: AddressGasSponsorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AddressGasSponsors'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + gasSponsors: >_data.gasSponsors, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getProjectBalance = ( + args: GetProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetProjectBalance'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + balance: _data.balance, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + adjustProjectBalance = ( + args: AdjustProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AdjustProjectBalance'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + balance: _data.balance, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } +} + +const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { + const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json' } + reqHeaders[WebrpcHeader] = WebrpcHeaderValue + + return { + method: 'POST', + headers: reqHeaders, + body: JSON.stringify(body || {}), + signal, + } +} + +const buildResponse = (res: Response): Promise => { + return res.text().then((text) => { + let data + try { + data = JSON.parse(text) + } catch (error) { + let message = '' + if (error instanceof Error) { + message = error.message + } + throw WebrpcBadResponseError.new({ + status: res.status, + cause: `JSON.parse(): ${message}: response text: ${text}`, + }) + } + if (!res.ok) { + const code: number = typeof data.code === 'number' ? data.code : 0 + throw (webrpcErrorByCode[code] || WebrpcError).new(data) + } + return data + }) +} + +// +// Errors +// + +export class WebrpcError extends Error { + name: string + code: number + message: string + status: number + cause?: string + + /** @deprecated Use message instead of msg. Deprecated in webrpc v0.11.0. */ + msg: string + + constructor(name: string, code: number, message: string, status: number, cause?: string) { + super(message) + this.name = name || 'WebrpcError' + this.code = typeof code === 'number' ? code : 0 + this.message = message || `endpoint error ${this.code}` + this.msg = this.message + this.status = typeof status === 'number' ? status : 0 + this.cause = cause + Object.setPrototypeOf(this, WebrpcError.prototype) + } + + static new(payload: any): WebrpcError { + return new this(payload.error, payload.code, payload.message || payload.msg, payload.status, payload.cause) + } +} + +// Webrpc errors + +export class WebrpcEndpointError extends WebrpcError { + constructor( + name: string = 'WebrpcEndpoint', + code: number = 0, + message: string = `endpoint error`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcEndpointError.prototype) + } +} + +export class WebrpcRequestFailedError extends WebrpcError { + constructor( + name: string = 'WebrpcRequestFailed', + code: number = -1, + message: string = `request failed`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) + } +} + +export class WebrpcBadRouteError extends WebrpcError { + constructor( + name: string = 'WebrpcBadRoute', + code: number = -2, + message: string = `bad route`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) + } +} + +export class WebrpcBadMethodError extends WebrpcError { + constructor( + name: string = 'WebrpcBadMethod', + code: number = -3, + message: string = `bad method`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) + } +} + +export class WebrpcBadRequestError extends WebrpcError { + constructor( + name: string = 'WebrpcBadRequest', + code: number = -4, + message: string = `bad request`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) + } +} + +export class WebrpcBadResponseError extends WebrpcError { + constructor( + name: string = 'WebrpcBadResponse', + code: number = -5, + message: string = `bad response`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) + } +} + +export class WebrpcServerPanicError extends WebrpcError { + constructor( + name: string = 'WebrpcServerPanic', + code: number = -6, + message: string = `server panic`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) + } +} + +export class WebrpcInternalErrorError extends WebrpcError { + constructor( + name: string = 'WebrpcInternalError', + code: number = -7, + message: string = `internal error`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) + } +} + +export class WebrpcClientDisconnectedError extends WebrpcError { + constructor( + name: string = 'WebrpcClientDisconnected', + code: number = -8, + message: string = `client disconnected`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) + } +} + +export class WebrpcStreamLostError extends WebrpcError { + constructor( + name: string = 'WebrpcStreamLost', + code: number = -9, + message: string = `stream lost`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) + } +} + +export class WebrpcStreamFinishedError extends WebrpcError { + constructor( + name: string = 'WebrpcStreamFinished', + code: number = -10, + message: string = `stream finished`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) + } +} + +// Schema errors + +export class UnauthorizedError extends WebrpcError { + constructor( + name: string = 'Unauthorized', + code: number = 1000, + message: string = `Unauthorized access`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, UnauthorizedError.prototype) + } +} + +export class PermissionDeniedError extends WebrpcError { + constructor( + name: string = 'PermissionDenied', + code: number = 1001, + message: string = `Permission denied`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, PermissionDeniedError.prototype) + } +} + +export class SessionExpiredError extends WebrpcError { + constructor( + name: string = 'SessionExpired', + code: number = 1002, + message: string = `Session expired`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, SessionExpiredError.prototype) + } +} + +export class MethodNotFoundError extends WebrpcError { + constructor( + name: string = 'MethodNotFound', + code: number = 1003, + message: string = `Method not found`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, MethodNotFoundError.prototype) + } +} + +export class RequestConflictError extends WebrpcError { + constructor( + name: string = 'RequestConflict', + code: number = 1004, + message: string = `Conflict with target resource`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, RequestConflictError.prototype) + } +} + +export class AbortedError extends WebrpcError { + constructor( + name: string = 'Aborted', + code: number = 1005, + message: string = `Request aborted`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, AbortedError.prototype) + } +} + +export class GeoblockedError extends WebrpcError { + constructor( + name: string = 'Geoblocked', + code: number = 1006, + message: string = `Geoblocked region`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, GeoblockedError.prototype) + } +} + +export class RateLimitedError extends WebrpcError { + constructor( + name: string = 'RateLimited', + code: number = 1007, + message: string = `Rate-limited. Please slow down.`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, RateLimitedError.prototype) + } +} + +export class ProjectNotFoundError extends WebrpcError { + constructor( + name: string = 'ProjectNotFound', + code: number = 1008, + message: string = `Project not found`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, ProjectNotFoundError.prototype) + } +} + +export class AccessKeyNotFoundError extends WebrpcError { + constructor( + name: string = 'AccessKeyNotFound', + code: number = 1101, + message: string = `Access key not found`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, AccessKeyNotFoundError.prototype) + } +} + +export class AccessKeyMismatchError extends WebrpcError { + constructor( + name: string = 'AccessKeyMismatch', + code: number = 1102, + message: string = `Access key mismatch`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, AccessKeyMismatchError.prototype) + } +} + +export class InvalidOriginError extends WebrpcError { + constructor( + name: string = 'InvalidOrigin', + code: number = 1103, + message: string = `Invalid origin for Access Key`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, InvalidOriginError.prototype) + } +} + +export class InvalidServiceError extends WebrpcError { + constructor( + name: string = 'InvalidService', + code: number = 1104, + message: string = `Service not enabled for Access key`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, InvalidServiceError.prototype) + } +} + +export class UnauthorizedUserError extends WebrpcError { + constructor( + name: string = 'UnauthorizedUser', + code: number = 1105, + message: string = `Unauthorized user`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, UnauthorizedUserError.prototype) + } +} + +export class QuotaExceededError extends WebrpcError { + constructor( + name: string = 'QuotaExceeded', + code: number = 1200, + message: string = `Quota request exceeded`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, QuotaExceededError.prototype) + } +} + +export class QuotaRateLimitError extends WebrpcError { + constructor( + name: string = 'QuotaRateLimit', + code: number = 1201, + message: string = `Quota rate limit exceeded`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, QuotaRateLimitError.prototype) + } +} + +export class NoDefaultKeyError extends WebrpcError { + constructor( + name: string = 'NoDefaultKey', + code: number = 1300, + message: string = `No default access key found`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, NoDefaultKeyError.prototype) + } +} + +export class MaxAccessKeysError extends WebrpcError { + constructor( + name: string = 'MaxAccessKeys', + code: number = 1301, + message: string = `Access keys limit reached`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, MaxAccessKeysError.prototype) + } +} + +export class AtLeastOneKeyError extends WebrpcError { + constructor( + name: string = 'AtLeastOneKey', + code: number = 1302, + message: string = `You need at least one Access Key`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, AtLeastOneKeyError.prototype) + } +} + +export class TimeoutError extends WebrpcError { + constructor( + name: string = 'Timeout', + code: number = 1900, + message: string = `Request timed out`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, TimeoutError.prototype) + } +} + +export class InvalidArgumentError extends WebrpcError { + constructor( + name: string = 'InvalidArgument', + code: number = 2001, + message: string = `Invalid argument`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, InvalidArgumentError.prototype) + } +} + +export class UnavailableError extends WebrpcError { + constructor( + name: string = 'Unavailable', + code: number = 2002, + message: string = `Unavailable resource`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, UnavailableError.prototype) + } +} + +export class QueryFailedError extends WebrpcError { + constructor( + name: string = 'QueryFailed', + code: number = 2003, + message: string = `Query failed`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, QueryFailedError.prototype) + } +} + +export class NotFoundError extends WebrpcError { + constructor( + name: string = 'NotFound', + code: number = 3000, + message: string = `Resource not found`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, NotFoundError.prototype) + } +} + +export class InsufficientFeeError extends WebrpcError { + constructor( + name: string = 'InsufficientFee', + code: number = 3004, + message: string = `Insufficient fee`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, InsufficientFeeError.prototype) + } +} + +export enum errors { + WebrpcEndpoint = 'WebrpcEndpoint', + WebrpcRequestFailed = 'WebrpcRequestFailed', + WebrpcBadRoute = 'WebrpcBadRoute', + WebrpcBadMethod = 'WebrpcBadMethod', + WebrpcBadRequest = 'WebrpcBadRequest', + WebrpcBadResponse = 'WebrpcBadResponse', + WebrpcServerPanic = 'WebrpcServerPanic', + WebrpcInternalError = 'WebrpcInternalError', + WebrpcClientDisconnected = 'WebrpcClientDisconnected', + WebrpcStreamLost = 'WebrpcStreamLost', + WebrpcStreamFinished = 'WebrpcStreamFinished', + Unauthorized = 'Unauthorized', + PermissionDenied = 'PermissionDenied', + SessionExpired = 'SessionExpired', + MethodNotFound = 'MethodNotFound', + RequestConflict = 'RequestConflict', + Aborted = 'Aborted', + Geoblocked = 'Geoblocked', + RateLimited = 'RateLimited', + ProjectNotFound = 'ProjectNotFound', + AccessKeyNotFound = 'AccessKeyNotFound', + AccessKeyMismatch = 'AccessKeyMismatch', + InvalidOrigin = 'InvalidOrigin', + InvalidService = 'InvalidService', + UnauthorizedUser = 'UnauthorizedUser', + QuotaExceeded = 'QuotaExceeded', + QuotaRateLimit = 'QuotaRateLimit', + NoDefaultKey = 'NoDefaultKey', + MaxAccessKeys = 'MaxAccessKeys', + AtLeastOneKey = 'AtLeastOneKey', + Timeout = 'Timeout', + InvalidArgument = 'InvalidArgument', + Unavailable = 'Unavailable', + QueryFailed = 'QueryFailed', + NotFound = 'NotFound', + InsufficientFee = 'InsufficientFee', +} + +export enum WebrpcErrorCodes { + WebrpcEndpoint = 0, + WebrpcRequestFailed = -1, + WebrpcBadRoute = -2, + WebrpcBadMethod = -3, + WebrpcBadRequest = -4, + WebrpcBadResponse = -5, + WebrpcServerPanic = -6, + WebrpcInternalError = -7, + WebrpcClientDisconnected = -8, + WebrpcStreamLost = -9, + WebrpcStreamFinished = -10, + Unauthorized = 1000, + PermissionDenied = 1001, + SessionExpired = 1002, + MethodNotFound = 1003, + RequestConflict = 1004, + Aborted = 1005, + Geoblocked = 1006, + RateLimited = 1007, + ProjectNotFound = 1008, + AccessKeyNotFound = 1101, + AccessKeyMismatch = 1102, + InvalidOrigin = 1103, + InvalidService = 1104, + UnauthorizedUser = 1105, + QuotaExceeded = 1200, + QuotaRateLimit = 1201, + NoDefaultKey = 1300, + MaxAccessKeys = 1301, + AtLeastOneKey = 1302, + Timeout = 1900, + InvalidArgument = 2001, + Unavailable = 2002, + QueryFailed = 2003, + NotFound = 3000, + InsufficientFee = 3004, +} + +export const webrpcErrorByCode: { [code: number]: any } = { + [0]: WebrpcEndpointError, + [-1]: WebrpcRequestFailedError, + [-2]: WebrpcBadRouteError, + [-3]: WebrpcBadMethodError, + [-4]: WebrpcBadRequestError, + [-5]: WebrpcBadResponseError, + [-6]: WebrpcServerPanicError, + [-7]: WebrpcInternalErrorError, + [-8]: WebrpcClientDisconnectedError, + [-9]: WebrpcStreamLostError, + [-10]: WebrpcStreamFinishedError, + [1000]: UnauthorizedError, + [1001]: PermissionDeniedError, + [1002]: SessionExpiredError, + [1003]: MethodNotFoundError, + [1004]: RequestConflictError, + [1005]: AbortedError, + [1006]: GeoblockedError, + [1007]: RateLimitedError, + [1008]: ProjectNotFoundError, + [1101]: AccessKeyNotFoundError, + [1102]: AccessKeyMismatchError, + [1103]: InvalidOriginError, + [1104]: InvalidServiceError, + [1105]: UnauthorizedUserError, + [1200]: QuotaExceededError, + [1201]: QuotaRateLimitError, + [1300]: NoDefaultKeyError, + [1301]: MaxAccessKeysError, + [1302]: AtLeastOneKeyError, + [1900]: TimeoutError, + [2001]: InvalidArgumentError, + [2002]: UnavailableError, + [2003]: QueryFailedError, + [3000]: NotFoundError, + [3004]: InsufficientFeeError, +} + +export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise diff --git a/packages/wallet/anypay-sdk/src/index.ts b/packages/wallet/anypay-sdk/src/index.ts new file mode 100644 index 000000000..e30d1d0d8 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/index.ts @@ -0,0 +1,18 @@ +import './buffer' + +export * from './tokenBalances.js' +export * from './metaTxnMonitor.js' +export * from './apiClient.js' +export * from './relayer.js' +export * from './anypay.js' +export * from './encoders.js' +export * from './intents.js' +export * from './preconditions.js' +export * from './metaTxns.js' +export * from './constants.js' +export type { MetaTxn } from './metaTxnMonitor.js' +export type { RelayerConfig, Relayer } from './relayer.js' +export type { NativeTokenBalance, TokenBalance } from './tokenBalances.js' +export type { UseAnyPayConfig, Account } from './anypay.js' +export type { OriginCallParams, SendOriginCallTxArgs, GetIntentCallsPayloadsReturn } from './intents.js' +export type { RelayerOperationStatus } from './relayer.js' diff --git a/packages/wallet/anypay-sdk/src/intents.ts b/packages/wallet/anypay-sdk/src/intents.ts new file mode 100644 index 000000000..de649fa7b --- /dev/null +++ b/packages/wallet/anypay-sdk/src/intents.ts @@ -0,0 +1,406 @@ +import { SequenceAPIClient } from './apiClient.js' +import { + IntentPrecondition, + GetIntentCallsPayloadsArgs, + GetIntentCallsPayloadsReturn, + CommitIntentConfigReturn, +} from '@0xsequence/api' +import { Context as ContextLike } from '@0xsequence/wallet-primitives' +import { AbiParameters, Address, Bytes, ContractAddress, Hash, Hex } from 'ox' +import { Context, Config, Payload } from '@0xsequence/wallet-primitives' +import { ANYPAY_LIFI_SAPIENT_SIGNER_LITE_ADDRESS } from './constants.js' +import { isAddressEqual, WalletClient, Chain, Account } from 'viem' +import { findPreconditionAddress } from './preconditions.js' + +export interface AnypayLifiInfo { + originToken: Address.Address + amount: bigint + originChainId: bigint + destinationChainId: bigint +} + +export interface IntentCallsPayload extends Payload.Calls { + chainId: bigint +} + +export { type GetIntentCallsPayloadsReturn } + +export type OriginCallParams = { + to: `0x${string}` | null + data: Hex.Hex | null + value: bigint | null + chainId: number | null + error?: string +} + +export type SendOriginCallTxArgs = { + to: string + data: Hex.Hex + value: bigint + chain: Chain +} + +export async function getIntentCallsPayloads( + apiClient: SequenceAPIClient, + args: GetIntentCallsPayloadsArgs, +): Promise { + return apiClient.getIntentCallsPayloads(args as any) // TODO: Add proper type +} + +export function calculateIntentAddress( + mainSigner: string, + calls: IntentCallsPayload[], + lifiInfosArg: AnypayLifiInfo[] | null | undefined, +): `0x${string}` { + console.log('calculateIntentAddress inputs:', { + mainSigner, + calls: JSON.stringify(calls, null, 2), + lifiInfosArg: JSON.stringify(lifiInfosArg, null, 2), + }) + + const context: ContextLike.Context = { + factory: '0xBd0F8abD58B4449B39C57Ac9D5C67433239aC447' as `0x${string}`, + stage1: '0x53bA242E7C2501839DF2972c75075dc693176Cd0' as `0x${string}`, + stage2: '0xa29874c88b8Fd557e42219B04b0CeC693e1712f5' as `0x${string}`, + creationCode: + '0x603e600e3d39601e805130553df33d3d34601c57363d3d373d363d30545af43d82803e903d91601c57fd5bf3' as `0x${string}`, + } + + const coreCalls = calls.map((call) => ({ + type: 'call' as const, + chainId: BigInt(call.chainId), + space: call.space ? BigInt(call.space) : 0n, + nonce: call.nonce ? BigInt(call.nonce) : 0n, + calls: call.calls.map((call) => ({ + to: Address.from(call.to), + value: BigInt(call.value || '0'), + data: Bytes.toHex(Bytes.from((call.data as Hex.Hex) || '0x')), + gasLimit: BigInt(call.gasLimit || '0'), + delegateCall: !!call.delegateCall, + onlyFallback: !!call.onlyFallback, + behaviorOnError: (Number(call.behaviorOnError) === 0 + ? 'ignore' + : Number(call.behaviorOnError) === 1 + ? 'revert' + : 'abort') as 'ignore' | 'revert' | 'abort', + })), + })) + + //console.log('Transformed coreCalls:', JSON.stringify(coreCalls, null, 2)) + + const coreLifiInfos = lifiInfosArg?.map((info: AnypayLifiInfo) => ({ + originToken: Address.from(info.originToken), + amount: BigInt(info.amount), + originChainId: BigInt(info.originChainId), + destinationChainId: BigInt(info.destinationChainId), + })) + + console.log( + 'Transformed coreLifiInfos:', + JSON.stringify(coreLifiInfos, (_, v) => (typeof v === 'bigint' ? v.toString() : v), 2), + ) + + const calculatedAddress = calculateIntentConfigurationAddress( + Address.from(mainSigner), + coreCalls, + context, + // AnyPay.ANYPAY_LIFI_ATTESATION_SIGNER_ADDRESS, + Address.from('0x0000000000000000000000000000000000000001'), + coreLifiInfos, + ) + + console.log('Final calculated address:', calculatedAddress.toString()) + return calculatedAddress +} + +export function commitIntentConfig( + apiClient: SequenceAPIClient, + mainSigner: string, + calls: IntentCallsPayload[], + preconditions: IntentPrecondition[], + lifiInfos: AnypayLifiInfo[], +): Promise { + console.log('commitIntentConfig inputs:', { + mainSigner, + calls: JSON.stringify(calls, null, 2), + preconditions: JSON.stringify(preconditions, null, 2), + lifiInfos: JSON.stringify(lifiInfos, null, 2), + }) + + const calculatedAddress = calculateIntentAddress(mainSigner, calls, lifiInfos) + const receivedAddress = findPreconditionAddress(preconditions) + console.log('Address comparison:', { + receivedAddress, + calculatedAddress: calculatedAddress.toString(), + match: isAddressEqual(Address.from(receivedAddress), calculatedAddress), + }) + + const args = { + walletAddress: calculatedAddress.toString(), + mainSigner: mainSigner, + calls: calls, + preconditions: preconditions, + lifiInfos: lifiInfos, + } + console.log('args', args) + return apiClient.commitIntentConfig(args as any) // TODO: Add proper type +} + +export async function sendOriginTransaction( + wallet: Account, + client: WalletClient, + originParams: SendOriginCallTxArgs, +): Promise<`0x${string}`> { + const hash = await client.sendTransaction({ + account: wallet, + to: originParams.to as `0x${string}`, + data: originParams.data as `0x${string}`, + value: BigInt(originParams.value), + chain: originParams.chain, + }) + return hash +} + +export interface OriginTokenParam { + address: Address.Address + chainId: bigint +} + +export interface DestinationTokenParam { + address: Address.Address + chainId: bigint + amount: bigint +} + +export function hashIntentParams(params: { + userAddress: Address.Address + nonce: bigint + originTokens: OriginTokenParam[] + destinationCalls: Array + destinationTokens: DestinationTokenParam[] +}): string { + if (!params) throw new Error('params is nil') + if (!params.userAddress || params.userAddress === '0x0000000000000000000000000000000000000000') + throw new Error('UserAddress is zero') + if (typeof params.nonce !== 'bigint') throw new Error('Nonce is not a bigint') + if (!params.originTokens || params.originTokens.length === 0) throw new Error('OriginTokens is empty') + if (!params.destinationCalls || params.destinationCalls.length === 0) throw new Error('DestinationCalls is empty') + if (!params.destinationTokens || params.destinationTokens.length === 0) throw new Error('DestinationTokens is empty') + for (let i = 0; i < params.destinationCalls.length; i++) { + const currentCall = params.destinationCalls[i] + if (!currentCall) throw new Error(`DestinationCalls[${i}] is nil`) + if (!currentCall.calls || currentCall.calls.length === 0) { + throw new Error(`DestinationCalls[${i}] has no calls`) + } + } + + const originTokensForAbi = params.originTokens.map((token) => ({ + address: token.address, + chainId: token.chainId, + })) + + let cumulativeCallsHashBytes: Bytes.Bytes = Bytes.from(new Uint8Array(32)) + + for (let i = 0; i < params.destinationCalls.length; i++) { + const callPayload = params.destinationCalls[i]! + + const currentDestCallPayloadHashBytes = Payload.hash( + Address.from('0x0000000000000000000000000000000000000000'), + callPayload.chainId, + callPayload, + ) + + cumulativeCallsHashBytes = Hash.keccak256(Bytes.concat(cumulativeCallsHashBytes, currentDestCallPayloadHashBytes), { + as: 'Bytes', + }) + } + const cumulativeCallsHashHex = Bytes.toHex(cumulativeCallsHashBytes) + + const destinationTokensForAbi = params.destinationTokens.map((token) => ({ + address: token.address, + chainId: token.chainId, + amount: token.amount, + })) + + const abiSchema = [ + { type: 'address' }, + { type: 'uint256' }, + { + type: 'tuple[]', + components: [ + { name: 'address', type: 'address' }, + { name: 'chainId', type: 'uint256' }, + ], + }, + { + type: 'tuple[]', + components: [ + { name: 'address', type: 'address' }, + { name: 'chainId', type: 'uint256' }, + { name: 'amount', type: 'uint256' }, + ], + }, + { type: 'bytes32' }, + ] + + const encodedHex = AbiParameters.encode(abiSchema, [ + params.userAddress, + params.nonce, + originTokensForAbi, + destinationTokensForAbi, + cumulativeCallsHashHex, + ]) as Hex.Hex + + const encodedBytes = Bytes.fromHex(encodedHex) + const hashBytes = Hash.keccak256(encodedBytes) + const hashHex = Bytes.toHex(hashBytes) + + return hashHex +} + +// TODO: Add proper type +export function bigintReplacer(_key: string, value: any) { + return typeof value === 'bigint' ? value.toString() : value +} + +export function getAnypayLifiInfoHash(lifiInfos: AnypayLifiInfo[], attestationAddress: Address.Address): Hex.Hex { + if (!lifiInfos || lifiInfos.length === 0) { + throw new Error('lifiInfos is empty') + } + if (!attestationAddress || attestationAddress === '0x0000000000000000000000000000000000000000') { + throw new Error('attestationAddress is zero') + } + + const anypayLifiInfoComponents = [ + { name: 'originToken', type: 'address' }, + { name: 'amount', type: 'uint256' }, + { name: 'originChainId', type: 'uint256' }, + { name: 'destinationChainId', type: 'uint256' }, + ] + + const lifiInfosForAbi = lifiInfos.map((info) => ({ + originToken: info.originToken, + amount: info.amount, + originChainId: info.originChainId, + destinationChainId: info.destinationChainId, + })) + + const abiSchema = [ + { + type: 'tuple[]', + name: 'lifiInfos', + components: anypayLifiInfoComponents, + }, + { type: 'address', name: 'attestationAddress' }, + ] + + const encodedHex = AbiParameters.encode(abiSchema, [lifiInfosForAbi, attestationAddress]) as Hex.Hex + const encodedBytes = Bytes.fromHex(encodedHex) + const hashBytes = Hash.keccak256(encodedBytes) + return Bytes.toHex(hashBytes) +} + +export function calculateIntentConfigurationAddress( + mainSigner: Address.Address, + calls: IntentCallsPayload[], + context: Context.Context, + attestationSigner?: Address.Address, + lifiInfos?: AnypayLifiInfo[], +): Address.Address { + const config = createIntentConfiguration(mainSigner, calls, attestationSigner, lifiInfos) + + // Calculate the image hash of the configuration + const imageHash = Config.hashConfiguration(config) + + // Calculate the counterfactual address using the image hash and context + return ContractAddress.fromCreate2({ + from: context.factory, + bytecodeHash: Hash.keccak256( + Bytes.concat(Bytes.from(context.creationCode), Bytes.padLeft(Bytes.from(context.stage1), 32)), + { as: 'Bytes' }, + ), + salt: imageHash, + }) +} + +function createIntentConfiguration( + mainSigner: Address.Address, + calls: IntentCallsPayload[], + attestationSigner?: Address.Address, + lifiInfos?: AnypayLifiInfo[], +): Config.Config { + const mainSignerLeaf: Config.SignerLeaf = { + type: 'signer', + address: mainSigner, + weight: 1n, + } + + const subdigestLeaves: Config.AnyAddressSubdigestLeaf[] = calls.map((call) => { + const digest = Payload.hash(Address.from('0x0000000000000000000000000000000000000000'), call.chainId, call) + console.log('digest:', Bytes.toHex(digest)) + return { + type: 'any-address-subdigest', + digest: Bytes.toHex(digest), + } as Config.AnyAddressSubdigestLeaf + }) + + const otherLeaves: Config.Topology[] = [...subdigestLeaves] + + if (lifiInfos && lifiInfos.length > 0) { + if (attestationSigner) { + const lifiConditionLeaf: Config.SapientSignerLeaf = { + type: 'sapient-signer', + // address: ANYPAY_LIFI_SAPIENT_SIGNER_ADDRESS, + address: ANYPAY_LIFI_SAPIENT_SIGNER_LITE_ADDRESS, + weight: 1n, + imageHash: getAnypayLifiInfoHash(lifiInfos, attestationSigner), + } + otherLeaves.push(lifiConditionLeaf) + } + } + + if (otherLeaves.length === 0) { + throw new Error('Intent configuration must have at least one call or LiFi information.') + } + + let secondaryTopologyNode: Config.Topology + + if (otherLeaves.length === 1) { + secondaryTopologyNode = otherLeaves[0]! + } else { + secondaryTopologyNode = buildMerkleTreeFromMembers(otherLeaves) + } + + return { + threshold: 1n, + checkpoint: 0n, + topology: [mainSignerLeaf, secondaryTopologyNode] as Config.Node, + } +} + +// Renamed and generalized from createSubdigestTree +function buildMerkleTreeFromMembers(members: Config.Topology[]): Config.Topology { + if (members.length === 0) { + throw new Error('Cannot create a tree from empty members') + } + if (members.length === 1) { + return members[0]! // Returns a single Leaf or a Node + } + + let currentLevel = [...members] + while (currentLevel.length > 1) { + const nextLevel: Config.Topology[] = [] + for (let i = 0; i < currentLevel.length; i += 2) { + const left = currentLevel[i]! + if (i + 1 < currentLevel.length) { + const right = currentLevel[i + 1]! + nextLevel.push([left, right] as Config.Node) + } else { + // Odd one out, carries over to the next level + nextLevel.push(left) + } + } + currentLevel = nextLevel + } + return currentLevel[0]! +} diff --git a/packages/wallet/anypay-sdk/src/metaTxnMonitor.ts b/packages/wallet/anypay-sdk/src/metaTxnMonitor.ts new file mode 100644 index 000000000..5d1376ac5 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/metaTxnMonitor.ts @@ -0,0 +1,181 @@ +import { useMemo } from 'react' +import { Relayer } from '@0xsequence/wallet-core' +import { Hex } from 'viem' +import { ETHTxnStatus, MetaTxnReceipt } from './gen/relayer.gen.js' +import { Query, useQueries } from '@tanstack/react-query' + +export type MetaTxn = { + id: string + chainId: string + contract?: string | undefined + input?: string | undefined + walletAddress?: string | undefined +} + +export type MetaTxnStatusValue = { + status: string + reason?: string + receipt?: MetaTxnReceipt + transactionHash?: Hex +} + +export type MetaTxnStatus = { + [key: string]: MetaTxnStatusValue +} + +const POLL_INTERVAL = 3_000 // 3 seconds + +export async function getMetaTxStatus( + relayer: Relayer.Rpc.RpcRelayer, + metaTxId: string, + chainId: number, +): Promise { + return relayer.status(metaTxId as `0x${string}`, BigInt(chainId)) +} + +export function useMetaTxnsMonitor( + metaTxns: MetaTxn[] | undefined, + getRelayer: (chainId: number) => Relayer.Rpc.RpcRelayer, +): MetaTxnStatus { + const results = useQueries({ + queries: (metaTxns || []).map((metaTxn) => { + const opHashToPoll = metaTxn.id as Hex + + return { + queryKey: ['metaTxnStatus', metaTxn.chainId, metaTxn.id], + queryFn: async (): Promise => { + const relayer = getRelayer(parseInt(metaTxn.chainId)) + + if (!opHashToPoll) { + return { status: 'failed', reason: 'Missing operation hash for monitoring.' } + } + + if (!relayer) { + return { status: 'failed', reason: `Relayer not available for chain ${metaTxn.chainId}.` } + } + + const res = await (relayer as any).receipt(opHashToPoll, BigInt(metaTxn.chainId)) // TODO: add proper type + + console.log(`🔍 Meta transaction debug for ${opHashToPoll}:`, { + opHash: opHashToPoll, + chainId: metaTxn.chainId, + hasResponse: !!res, + hasReceipt: !!res?.receipt, + receiptStatus: res?.receipt?.status, + statusType: typeof res?.receipt?.status, + fullResponse: res, + }) + + if (!res || !res.receipt) { + console.warn(`❌ No receipt for ${opHashToPoll}:`, res) + return { status: 'unknown', reason: 'No receipt available' } + } + + const apiStatus = res.receipt.status as ETHTxnStatus + + if (!apiStatus) { + console.warn(`❌ No status in receipt for ${opHashToPoll}:`, res.receipt) + return { status: 'unknown', reason: 'Receipt status is null or undefined', receipt: res.receipt } + } + + console.log(`📊 Processing status ${apiStatus} for ${opHashToPoll}`) + let newStatusEntry: MetaTxnStatusValue + + switch (apiStatus) { + case ETHTxnStatus.QUEUED: + case ETHTxnStatus.PENDING_PRECONDITION: + case ETHTxnStatus.SENT: + newStatusEntry = { status: 'pending', receipt: res.receipt } + break + case ETHTxnStatus.SUCCEEDED: + console.log(`✅ Success for ${opHashToPoll}:`, res.receipt) + newStatusEntry = { + status: 'confirmed', + transactionHash: res.receipt.txnHash as Hex, + receipt: res.receipt, + } + break + case ETHTxnStatus.FAILED: + case ETHTxnStatus.PARTIALLY_FAILED: + newStatusEntry = { + status: 'failed', + reason: res.receipt.revertReason || 'Relayer reported failure', + receipt: res.receipt, + } + break + case ETHTxnStatus.DROPPED: + newStatusEntry = { status: 'failed', reason: 'Transaction dropped', receipt: res.receipt } + break + case ETHTxnStatus.UNKNOWN: + console.warn(`❓ Unknown status for ${opHashToPoll}:`, res.receipt) + newStatusEntry = { status: 'unknown', receipt: res.receipt } + break + default: + console.warn(`⚠️ Unexpected status "${apiStatus}" for ${opHashToPoll}:`, res.receipt) + newStatusEntry = { status: 'unknown', receipt: res.receipt, reason: `Unexpected status: ${apiStatus}` } + break + } + + console.log(`🎯 Final status for ${opHashToPoll}:`, newStatusEntry.status) + return newStatusEntry + }, + refetchInterval: (query: Query) => { + const data = query.state.data + + if (data?.status === 'confirmed' || data?.status === 'failed') { + return false + } + + if (data?.status === 'pending') { + return POLL_INTERVAL + } + + if (data?.status === 'unknown') { + return POLL_INTERVAL + } + + return POLL_INTERVAL + }, + enabled: !!metaTxn && !!metaTxn.id && !!metaTxn.chainId, + retry: (failureCount: number, error: Error) => { + if (failureCount >= 30) { + console.error(`❌ Giving up on transaction ${opHashToPoll} after 3 failed API attempts:`, error) + return false + } + return true + }, + } + }), + }) + + const statuses: MetaTxnStatus = useMemo(() => { + const newStatuses: MetaTxnStatus = {} + ;(metaTxns || []).forEach((metaTxn, index) => { + const operationKey = `${metaTxn.chainId}-${metaTxn.id}` + const queryResult = results[index] + + if (queryResult) { + if (queryResult.isLoading && queryResult.fetchStatus !== 'idle' && !queryResult.data) { + newStatuses[operationKey] = { status: 'pending' } as Relayer.OperationPendingStatus + } else if (queryResult.isError) { + newStatuses[operationKey] = { + status: 'failed', + reason: (queryResult.error as Error)?.message || 'An unknown error occurred', + } as Relayer.OperationFailedStatus + } else if (queryResult.data) { + newStatuses[operationKey] = queryResult.data as Relayer.OperationStatus + } else { + newStatuses[operationKey] = { status: 'unknown' } as Relayer.OperationUnknownStatus + } + } else { + newStatuses[operationKey] = { + status: 'failed', + reason: 'Query result unexpectedly missing', + } as Relayer.OperationFailedStatus + } + }) + return newStatuses + }, [metaTxns, results]) + + return statuses +} diff --git a/packages/wallet/anypay-sdk/src/metaTxns.ts b/packages/wallet/anypay-sdk/src/metaTxns.ts new file mode 100644 index 000000000..865f5c2b8 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/metaTxns.ts @@ -0,0 +1,21 @@ +import { IntentPrecondition } from '@0xsequence/api' +import { Relayer } from '@0xsequence/wallet-core' +import { Hex } from 'viem' +import { MetaTxn } from './metaTxnMonitor.js' + +export async function relayerSendMetaTx( + relayer: Relayer.Rpc.RpcRelayer, + metaTx: MetaTxn, + preconditions: IntentPrecondition[], +): Promise { + const { opHash } = await relayer.sendMetaTxn( + metaTx.walletAddress as `0x${string}`, + metaTx.contract as `0x${string}`, + metaTx.input as Hex, + BigInt(metaTx.chainId), + undefined, + preconditions, + ) + + return opHash +} diff --git a/packages/wallet/anypay-sdk/src/preconditions.ts b/packages/wallet/anypay-sdk/src/preconditions.ts new file mode 100644 index 000000000..8649955f4 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/preconditions.ts @@ -0,0 +1,19 @@ +import { IntentPrecondition } from '@0xsequence/api' + +export function findPreconditionAddress(preconditions: IntentPrecondition[]): string { + console.log('Finding precondition address from:', JSON.stringify(preconditions, null, 2)) + + const preconditionTypes = ['erc20-balance', 'native-balance'] as const + + for (const type of preconditionTypes) { + const precondition = preconditions.find((p) => p.type === type && p.data?.address) + if (precondition) { + console.log(`Found ${type} precondition with address:`, precondition.data.address) + return precondition.data.address + } + } + + const msg = `N/A (No ${preconditionTypes.join(' or ')} precondition with address found)` + console.log(msg) + return msg +} diff --git a/packages/wallet/anypay-sdk/src/relayer.ts b/packages/wallet/anypay-sdk/src/relayer.ts new file mode 100644 index 000000000..a6983da78 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/relayer.ts @@ -0,0 +1,174 @@ +import { Relayer } from '@0xsequence/wallet-core' +import { useMemo } from 'react' +import * as chains from 'viem/chains' +import { Chain } from 'viem' +import fetch from 'isomorphic-fetch' + +export type RelayerOperationStatus = Relayer.OperationStatus +export type Relayer = Relayer.Rpc.RpcRelayer + +// Helper to get chain info +function getChain(chainId: number): Chain { + const chain = Object.values(chains as unknown as Record).find((c: Chain) => c.id === chainId) + if (!chain) { + throw new Error(`Chain with id ${chainId} not found`) + } + return chain +} + +export type RelayerConfig = { + hostname: string + chainId: number + rpcUrl: string +} + +export type RelayerEnvConfig = { + env: 'local' | 'cors-anywhere' | 'dev' | 'prod' + useV3Relayers?: boolean +} + +export function getBackupRelayer(chainId: number): Relayer.Rpc.RpcRelayer | undefined { + if (chainId === 42161) { + return new Relayer.Rpc.RpcRelayer('https://a1b4a8c5d856.ngrok.app/', chainId, 'https://nodes.sequence.app/arbitrum') + } else if (chainId === 8453) { + return new Relayer.Rpc.RpcRelayer('https://644a6aeb891e.ngrok.app/', chainId, 'https://nodes.sequence.app/base') + } + + return undefined +} + +// TODO: add relayer url to config +function getRelayerUrl(config: RelayerEnvConfig, chainId: number): string { + let relayerUrl + if (config.env === 'local') { + // Use specific ports for different chains in local environment + if (chainId === 42161) { + // Arbitrum + relayerUrl = 'http://0.0.0.0:9997' + } else if (chainId === 10) { + // Optimism + relayerUrl = 'http://0.0.0.0:9998' + } else if (chainId === 137) { + // Polygon + relayerUrl = 'http://0.0.0.0:9999' + } else if (chainId === 8453) { + // Base + relayerUrl = 'http://0.0.0.0:9996' + } else { + // Default fallback + relayerUrl = 'http://0.0.0.0:9999' + } + + return relayerUrl + } + + // For cors-anywhere, dev, and production environments + const baseUrl = + config.env === 'cors-anywhere' + ? 'http://localhost:8080/https://' + : config.env === 'dev' && config.useV3Relayers + ? 'https://v3-' + : config.env === 'dev' + ? 'https://dev-relayer.sequence.app' + : 'https://' + + // Chain-specific relayer endpoints + if (config.env === 'dev' && config.useV3Relayers) { + if (chainId === 42161) { + // Arbitrum + relayerUrl = 'https://v3-arbitrum-relayer.sequence.app' + } else if (chainId === 8453) { + // Base + relayerUrl = 'https://v3-base-relayer.sequence.app' + } else if (chainId === 10) { + // Optimism + relayerUrl = 'https://v3-optimism-relayer.sequence.app' + } else if (chainId === 137) { + // Polygon + relayerUrl = 'https://v3-polygon-relayer.sequence.app' + } else if (chainId === 1) { + // Mainnet + relayerUrl = 'https://v3-mainnet-relayer.sequence.app' + } else { + // Fallback to general dev relayer for other chains if V3 is specified but chain not V3-supported + relayerUrl = `${baseUrl}${getChain(chainId).name}-relayer.sequence.app` + } + + return relayerUrl + } + + if (chainId === 42161) { + // Arbitrum + relayerUrl = `${baseUrl}arbitrum-relayer.sequence.app` + } else if (chainId === 10) { + // Optimism + relayerUrl = `${baseUrl}optimism-relayer.sequence.app` + } else if (chainId === 137) { + // Polygon + relayerUrl = `${baseUrl}polygon-relayer.sequence.app` + } else if (chainId === 8453) { + // Base + relayerUrl = `${baseUrl}base-relayer.sequence.app` + } else if (chainId === 43114) { + // Avalanche + relayerUrl = `${baseUrl}avalanche-relayer.sequence.app` + } else if (chainId === 56) { + // BSC + relayerUrl = `${baseUrl}bsc-relayer.sequence.app` + } else if (chainId === 1) { + // Mainnet + relayerUrl = `${baseUrl}mainnet-relayer.sequence.app` + } else { + // Default fallback + relayerUrl = `${baseUrl}relayer.sequence.app` + } + + return relayerUrl +} + +export function getRelayer(config: RelayerEnvConfig, chainId: number): Relayer.Rpc.RpcRelayer { + const chain = getChain(chainId) + + if (!chain) { + throw new Error(`Chain with id ${chainId} not found`) + } + + const rpcUrl = chain.rpcUrls.default.http[0] + if (!rpcUrl) { + throw new Error(`No RPC URL found for chain ${chainId}`) + } + + const relayerUrl = getRelayerUrl(config, chainId) + + return new Relayer.Rpc.RpcRelayer(relayerUrl, chainId, rpcUrl, fetch) +} + +export function useRelayers(config: RelayerEnvConfig): { + relayers: Map + getRelayer: (chainId: number) => Relayer.Rpc.RpcRelayer + getBackupRelayer: (chainId: number) => Relayer.Rpc.RpcRelayer | undefined +} { + const relayers = useMemo(() => { + const relayerMap = new Map() + return relayerMap + }, []) + + const getCachedRelayer = (chainId: number): Relayer.Rpc.RpcRelayer => { + let relayer = relayers.get(chainId) + + if (!relayer) { + relayer = getRelayer(config, chainId) + relayers.set(chainId, relayer) + } + + return relayer + } + + return { + relayers, + getRelayer: getCachedRelayer, + getBackupRelayer, + } +} + +export type { Relayer } diff --git a/packages/wallet/anypay-sdk/src/tokenBalances.ts b/packages/wallet/anypay-sdk/src/tokenBalances.ts new file mode 100644 index 000000000..ce4ae87f8 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/tokenBalances.ts @@ -0,0 +1,117 @@ +import { useIndexerGatewayClient } from '@0xsequence/hooks' +import { + ContractVerificationStatus, + NativeTokenBalance, + TokenBalance, + GatewayNativeTokenBalances, + GatewayTokenBalance, + GetTokenBalancesSummaryReturn, +} from '@0xsequence/indexer' +import { useQuery } from '@tanstack/react-query' +import { Address } from 'ox' +import { useMemo } from 'react' + +export { type NativeTokenBalance, type TokenBalance } + +// Default empty page info for query fallback +const defaultPage = { page: 1, pageSize: 10, more: false } + +// Type guard for native token balance +function isNativeToken(token: TokenBalance | NativeTokenBalance): boolean { + if ('contractAddress' in token) { + return false + } + return true +} + +export function useTokenBalances(address: Address.Address): { + tokenBalancesData: any // TODO: Add proper type + isLoadingBalances: boolean + balanceError: Error | null + sortedTokens: any[] // TODO: Add proper type +} { + const indexerClient = useIndexerGatewayClient() + + // Fetch token balances + const { + data: tokenBalancesData, + isLoading: isLoadingBalances, + error: balanceError, + } = useQuery({ + queryKey: ['tokenBalances', address], + queryFn: async () => { + if (!address) { + console.warn('No account address or indexer client') + return { + balances: [], + nativeBalances: [], + page: defaultPage, + } as GetTokenBalancesSummaryReturn + } + try { + const summary = await indexerClient.getTokenBalancesSummary({ + filter: { + accountAddresses: [address], + contractStatus: ContractVerificationStatus.VERIFIED, + contractTypes: ['ERC20'], + omitNativeBalances: false, + }, + }) + + return summary + } catch (error) { + console.error('Failed to fetch token balances:', error) + return { + balances: [], + nativeBalances: [], + page: defaultPage, + } as GetTokenBalancesSummaryReturn + } + }, + enabled: !!address, + staleTime: 30000, + retry: 1, + }) + + const sortedTokens = useMemo(() => { + if (!tokenBalancesData?.balances) { + return [] + } + + // Flatten both native and token balances + const nativeBalances = tokenBalancesData.nativeBalances.flatMap( + (b: any) => b.results, // TODO: Add proper type + ) + const tokenBalances = tokenBalancesData.balances.flatMap((b: any) => b.results) // TODO: Add proper type + const balances = [...nativeBalances, ...tokenBalances] + + return [...balances] + .filter((token) => { + try { + return BigInt(token.balance) > 0n + } catch { + return false + } + }) + .sort((a, b) => { + if (isNativeToken(a)) return -1 + if (isNativeToken(b)) return 1 + try { + const balanceA = BigInt(a.balance) + const balanceB = BigInt(b.balance) + if (balanceA > balanceB) return -1 + if (balanceA < balanceB) return 1 + return 0 + } catch { + return 0 + } + }) + }, [tokenBalancesData]) + + return { + tokenBalancesData, + isLoadingBalances, + balanceError, + sortedTokens, + } +} diff --git a/packages/wallet/anypay-sdk/src/types.d.ts b/packages/wallet/anypay-sdk/src/types.d.ts new file mode 100644 index 000000000..25d129784 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/types.d.ts @@ -0,0 +1,5 @@ +declare global { + interface Window { + Buffer: typeof import('buffer').Buffer + } +} diff --git a/packages/wallet/anypay-sdk/src/widget/components/ConnectWallet.tsx b/packages/wallet/anypay-sdk/src/widget/components/ConnectWallet.tsx new file mode 100644 index 000000000..3e475fe14 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/widget/components/ConnectWallet.tsx @@ -0,0 +1,66 @@ +import React from 'react' +import { useAccount, useConnect, useDisconnect } from 'wagmi' +import { injected } from 'wagmi/connectors' +// import MetaMaskFox from '../assets/MetaMask_Fox.svg' + +interface ConnectWalletProps { + onConnect: () => void +} + +export const ConnectWallet: React.FC = ({ onConnect }) => { + const { connect } = useConnect() + const { disconnect } = useDisconnect() + const { isConnected, address, connector } = useAccount() + + const handleConnect = async () => { + try { + await connect({ connector: injected() }) + console.log('Connected to MetaMask') + } catch (error) { + console.error('Failed to connect:', error) + } + } + + const handleDisconnect = () => { + disconnect() + } + + return ( +
+

Connect a Wallet

+ + {isConnected ? ( +
+
+

Connected with {connector?.name}

+

{address}

+
+
+ + +
+
+ ) : ( + + )} +
+ ) +} + +export default ConnectWallet diff --git a/packages/wallet/anypay-sdk/src/widget/components/Modal.tsx b/packages/wallet/anypay-sdk/src/widget/components/Modal.tsx new file mode 100644 index 000000000..45c504367 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/widget/components/Modal.tsx @@ -0,0 +1,32 @@ +import React from 'react' +import { X } from 'lucide-react' + +interface ModalProps { + isOpen: boolean + onClose: () => void + children: React.ReactNode +} + +export const Modal: React.FC = ({ isOpen, onClose, children }) => { + if (!isOpen) return null + + return ( +
+
+
+ +
+ +
{children}
+
+
+
+ ) +} + +export default Modal diff --git a/packages/wallet/anypay-sdk/src/widget/components/Receipt.tsx b/packages/wallet/anypay-sdk/src/widget/components/Receipt.tsx new file mode 100644 index 000000000..e3ed6c6cf --- /dev/null +++ b/packages/wallet/anypay-sdk/src/widget/components/Receipt.tsx @@ -0,0 +1,50 @@ +import React from 'react' + +interface ReceiptProps { + txHash: string + onSendAnother: () => void + onClose: () => void +} + +export const Receipt: React.FC = ({ txHash, onSendAnother, onClose }) => { + return ( +
+
+
+ + + +
+

Transaction Confirmed

+
+ + + +
+ + +
+
+ ) +} + +export default Receipt diff --git a/packages/wallet/anypay-sdk/src/widget/components/SendForm.tsx b/packages/wallet/anypay-sdk/src/widget/components/SendForm.tsx new file mode 100644 index 000000000..efae7de76 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/widget/components/SendForm.tsx @@ -0,0 +1,426 @@ +import React, { useState, useRef, useEffect } from 'react' +import { NetworkImage, TokenImage } from '@0xsequence/design-system' +import * as chains from 'viem/chains' +import { createWalletClient, custom, formatUnits, parseUnits, type Account } from 'viem' +import { ChevronDown, Loader2 } from 'lucide-react' +import { prepareSend, getChainConfig } from '../../anypay.js' +import { zeroAddress } from 'viem' + +interface Token { + id: number + name: string + symbol: string + balance: string + imageUrl: string + chainId: number + contractAddress: string + contractInfo?: { + decimals: number + symbol: string + name: string + } +} + +interface SendFormProps { + selectedToken: Token + onSend: (amount: string, recipient: string) => void + onBack: () => void + onConfirm: () => void + onComplete: () => void + account: Account + sequenceApiKey: string +} + +// Available chains +const SUPPORTED_CHAINS = [ + { id: 1, name: 'Ethereum', icon: chains.mainnet.id }, + { id: 8453, name: 'Base', icon: chains.base.id }, + { id: 10, name: 'Optimism', icon: chains.optimism.id }, + { id: 42161, name: 'Arbitrum', icon: chains.arbitrum.id }, +] + +// Available tokens +const SUPPORTED_TOKENS = [ + { + symbol: 'ETH', + name: 'Ethereum', + imageUrl: `https://assets.sequence.info/images/tokens/small/1/0x0000000000000000000000000000000000000000.webp`, + }, + { + symbol: 'USDC', + name: 'USD Coin', + imageUrl: `https://assets.sequence.info/images/tokens/small/1/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48.webp`, + }, +] + +// Helper to get chain info +const getChainInfo = (chainId: number) => { + // TODO: Add proper type + return Object.values(chains).find((chain: any) => chain.id === chainId) || null +} + +// Helper to format balance +const formatBalance = (balance: string, decimals: number = 18) => { + try { + const formatted = formatUnits(BigInt(balance), decimals) + const num = parseFloat(formatted) + if (num === 0) return '0' + if (num < 0.0001) return num.toExponential(2) + if (num < 1) return num.toFixed(6) + if (num < 1000) return num.toFixed(4) + return num.toLocaleString(undefined, { maximumFractionDigits: 2 }) + } catch (e) { + console.error('Error formatting balance:', e) + return balance + } +} + +function getDestTokenAddress(chainId: number, tokenSymbol: string) { + if (tokenSymbol === 'ETH') { + return zeroAddress + } + + if (chainId === 10) { + if (tokenSymbol === 'USDC') { + return '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85' + } + } + + if (chainId === 42161) { + if (tokenSymbol === 'USDC') { + return '0xaf88d065e77c8cC2239327C5EDb3A432268e5831' + } + } + + if (chainId === 8453) { + if (tokenSymbol === 'USDC') { + return '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' + } + } + + throw new Error(`Unsupported token symbol: ${tokenSymbol} for chainId: ${chainId}`) +} + +export const SendForm: React.FC = ({ + selectedToken, + onSend, + onBack, + onConfirm, + onComplete, + account, + sequenceApiKey, +}) => { + const [amount, setAmount] = useState('') + const [recipient, setRecipient] = useState('') + const [selectedChain, setSelectedChain] = useState( + () => (SUPPORTED_CHAINS.find((chain) => chain.id === selectedToken.chainId) || SUPPORTED_CHAINS[0])!, + ) + const [isChainDropdownOpen, setIsChainDropdownOpen] = useState(false) + const [isTokenDropdownOpen, setIsTokenDropdownOpen] = useState(false) + const [selectedDestToken, setSelectedDestToken] = useState(SUPPORTED_TOKENS[0]!) + const chainDropdownRef = useRef(null) + const tokenDropdownRef = useRef(null) + const chainInfo = getChainInfo(selectedToken.chainId) as any // TODO: Add proper type + const [isSubmitting, setIsSubmitting] = useState(false) + + const formattedBalance = formatBalance(selectedToken.balance, selectedToken.contractInfo?.decimals) + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if (chainDropdownRef.current && !chainDropdownRef.current.contains(event.target as Node)) { + setIsChainDropdownOpen(false) + } + if (tokenDropdownRef.current && !tokenDropdownRef.current.contains(event.target as Node)) { + setIsTokenDropdownOpen(false) + } + } + + document.addEventListener('mousedown', handleClickOutside) + return () => document.removeEventListener('mousedown', handleClickOutside) + }, []) + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault() + + try { + setIsSubmitting(true) + const decimals = selectedDestToken.symbol === 'ETH' ? 18 : 6 + const parsedAmount = parseUnits(amount, decimals).toString() + + const client = createWalletClient({ + account, + chain: getChainConfig(selectedToken.chainId), + transport: custom(window.ethereum), + }) + + console.log('selectedDestToken.symbol', selectedDestToken) + + const options = { + account, + originTokenAddress: selectedToken.contractAddress, + originChainId: selectedToken.chainId, + originTokenAmount: selectedToken.balance, + destinationChainId: selectedChain.id, + recipient, + destinationTokenAddress: + selectedDestToken.symbol === 'ETH' + ? zeroAddress + : getDestTokenAddress(selectedChain.id, selectedDestToken.symbol), + destinationTokenAmount: parsedAmount, + sequenceApiKey, + fee: selectedToken.symbol === 'ETH' ? parseUnits('0.0001', 18).toString() : parseUnits('0.02', 6).toString(), // TOOD: fees + client, + dryMode: false, // Set to true to skip the metamask transaction, for testing purposes + } + + console.log('options', options) + + const { intentAddress, send } = await prepareSend(options) + console.log('Intent address:', intentAddress.toString()) + + // Start the send process + onSend(amount, recipient) + + // Wait for send to complete + send().then(() => { + // Move to receipt screen + onComplete() + }) + + // Move to confirmation screen after 5 seconds + setTimeout(() => { + onConfirm() + }, 10_000) + } catch (error) { + console.error('Error in prepareSend:', error) + setIsSubmitting(false) + } + } + + return ( +
+
+
+
+ {selectedToken.contractAddress ? ( + + ) : ( + {selectedToken.symbol[0]} + )} +
+
+ +
+
+
+

From: {selectedToken.name}

+

+ on {chainInfo?.name || 'Unknown Chain'} • Balance: {formattedBalance} {selectedToken.symbol} +

+
+
+ +
+ {/* Chain Selection */} +
+ +
+ + + {isChainDropdownOpen && ( +
+ {SUPPORTED_CHAINS.map((chain) => ( + + ))} +
+ )} +
+
+ + {/* Token Selection */} +
+ +
+ + + {isTokenDropdownOpen && ( +
+ {SUPPORTED_TOKENS.map((token) => ( + + ))} +
+ )} +
+
+ + {/* Amount Input */} +
+
+ +
+
+ setAmount(e.target.value)} + placeholder="0.00" + className="block w-full pl-4 pr-12 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 bg-white text-gray-900 placeholder-gray-400 text-lg" + /> +
+ {selectedDestToken.symbol} +
+
+
+ + {/* Recipient Input */} +
+ + setRecipient(e.target.value)} + placeholder="0x..." + className="block w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 bg-white text-gray-900 placeholder-gray-400 font-mono text-sm" + /> +
+ +
+ + + +
+
+
+ ) +} + +const styles = ` + select { + appearance: none; + border: 1px solid #e5e7eb; + outline: none; + font-size: 1rem; + width: 100%; + background-color: #fff; + border-radius: 0.5rem; + padding: 0.75rem 1rem; + padding-right: 2rem; + + cursor: pointer; + transition: all 0.2s; + } + + select:hover { + border-color: #d1d5db; + } + + select:focus { + border-color: #3b82f6; + box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.1); + } + + select option { + padding: 0.75rem 1rem; + min-height: 3rem; + display: flex; + align-items: center; + padding-left: 2.75rem; + position: relative; + cursor: pointer; + } + + select option:hover { + background-color: #f3f4f6; + } + + select option:checked { + background-color: #eff6ff; + color: #1d4ed8; + } +` + +if (typeof document !== 'undefined') { + const styleTag = document.createElement('style') + styleTag.textContent = styles + document.head.appendChild(styleTag) +} + +export default SendForm diff --git a/packages/wallet/anypay-sdk/src/widget/components/TokenList.tsx b/packages/wallet/anypay-sdk/src/widget/components/TokenList.tsx new file mode 100644 index 000000000..34d0b5357 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/widget/components/TokenList.tsx @@ -0,0 +1,244 @@ +import React, { useState, useMemo } from 'react' +import { useAccount } from 'wagmi' +import { useTokenBalances } from '../../tokenBalances.js' +import { Address } from 'ox' +import { formatUnits, isAddressEqual, zeroAddress } from 'viem' +import { NetworkImage, TokenImage } from '@0xsequence/design-system' +import * as chains from 'viem/chains' +import { Search, ArrowLeft } from 'lucide-react' + +interface Token { + id: number + name: string + symbol: string + balance: string + imageUrl: string + chainId: number + contractAddress: string + contractInfo?: { + decimals: number + symbol: string + name: string + } +} + +interface TokenListProps { + onContinue: (selectedToken: Token) => void + onBack: () => void +} + +// Helper to get chain info +const getChainInfo = (chainId: number) => { + // TODO: Add proper type + return Object.values(chains).find((chain: any) => chain.id === chainId) || null +} + +// Helper to format balance +const formatBalance = (balance: string, decimals: number = 18) => { + try { + const formatted = formatUnits(BigInt(balance), decimals) + const num = parseFloat(formatted) + if (num === 0) return '0' + if (num < 0.0001) return num.toExponential(2) + if (num < 1) return num.toFixed(6) + if (num < 1000) return num.toFixed(4) + return num.toLocaleString(undefined, { maximumFractionDigits: 2 }) + } catch (e) { + console.error('Error formatting balance:', e) + return balance + } +} + +export const TokenList: React.FC = ({ onContinue, onBack }) => { + const [selectedToken, setSelectedToken] = useState(null) + const [searchQuery, setSearchQuery] = useState('') + const { address } = useAccount() + const { sortedTokens, isLoadingBalances, balanceError } = useTokenBalances(address as Address.Address) + + const handleTokenSelect = (token: any) => { + const isNative = !('contractAddress' in token) + const chainInfo = getChainInfo(token.chainId) as any // TODO: Add proper type + const contractAddress = isNative ? zeroAddress : token.contractAddress + const imageUrl = `https://assets.sequence.info/images/tokens/small/${token.chainId}/${contractAddress}.webp` + + let formattedToken: Token + if (isNative) { + formattedToken = { + id: token.chainId, + name: chainInfo?.nativeCurrency.name || 'Native Token', + symbol: chainInfo?.nativeCurrency.symbol || 'ETH', + balance: token.balance, + imageUrl, + chainId: token.chainId, + contractAddress: zeroAddress, + contractInfo: { + decimals: 18, + symbol: chainInfo?.nativeCurrency.symbol || 'ETH', + name: chainInfo?.nativeCurrency.name || 'Native Token', + }, + } + } else { + formattedToken = { + id: token.chainId, + name: token.contractInfo?.name || 'Unknown Token', + symbol: token.contractInfo?.symbol || '???', + balance: token.balance, + imageUrl, + chainId: token.chainId, + contractAddress: token.contractAddress, + contractInfo: token.contractInfo, + } + } + + setSelectedToken(formattedToken) + } + + const isTokenSelected = (token: any): boolean => { + if (!selectedToken) return false + + const isNative = !('contractAddress' in token) + return ( + selectedToken.chainId === token.chainId && + (isNative + ? selectedToken.contractAddress === zeroAddress + : isAddressEqual(Address.from(selectedToken.contractAddress), Address.from(token.contractAddress))) + ) + } + + const filteredTokens = useMemo(() => { + if (!searchQuery.trim()) return sortedTokens + + const query = searchQuery.toLowerCase().trim() + return sortedTokens.filter((token: any) => { + const isNative = !('contractAddress' in token) + const chainInfo = getChainInfo(token.chainId) as any // TODO: Add proper type + const chainName = chainInfo?.name || '' + + if (isNative) { + const nativeSymbol = chainInfo?.nativeCurrency.symbol || 'ETH' + const nativeName = chainInfo?.nativeCurrency.name || 'Native Token' + return ( + nativeSymbol.toLowerCase().includes(query) || + nativeName.toLowerCase().includes(query) || + chainName.toLowerCase().includes(query) + ) + } + + return ( + token.contractInfo?.symbol?.toLowerCase().includes(query) || + token.contractInfo?.name?.toLowerCase().includes(query) || + chainName.toLowerCase().includes(query) + ) + }) + }, [sortedTokens, searchQuery]) + + return ( +
+

Select Token

+ + {/* Search Field */} +
+
+ +
+ setSearchQuery(e.target.value)} + placeholder="Search by token name, symbol, or chain..." + className="block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 bg-white text-gray-900 placeholder-gray-500" + /> +
+ + {isLoadingBalances && ( +
+
+

Loading your token balances...

+
+ )} + + {balanceError && ( +
+

Error loading balances: {balanceError.message}

+
+ )} + + {!isLoadingBalances && !balanceError && filteredTokens.length === 0 && ( +
+

+ {searchQuery.trim() + ? 'No tokens found matching your search.' + : 'No tokens found with balance greater than 0.'} +

+
+ )} + +
+ {filteredTokens.map((token: any) => { + const isNative = !('contractAddress' in token) + const chainInfo = getChainInfo(token.chainId) as any // TODO: Add proper type + const nativeSymbol = chainInfo?.nativeCurrency.symbol || 'ETH' + const tokenSymbol = isNative ? nativeSymbol : token.contractInfo?.symbol || '???' + const contractAddress = isNative ? zeroAddress : token.contractAddress + const imageUrl = `https://assets.sequence.info/images/tokens/small/${token.chainId}/${contractAddress}.webp` + const tokenName = isNative + ? `${nativeSymbol} (${chainInfo?.name || 'Unknown Chain'})` + : token.contractInfo?.name || 'Unknown Token' + const formattedBalance = formatBalance(token.balance, isNative ? 18 : token.contractInfo?.decimals) + + return ( +
handleTokenSelect(token)} + className={`py-4 px-4 flex items-center space-x-4 cursor-pointer transition-colors ${ + isTokenSelected(token) ? 'bg-blue-50' : 'hover:bg-gray-50' + }`} + > +
+
+ {contractAddress ? ( + + ) : ( + {tokenSymbol[0]} + )} +
+
+ +
+
+ +
+

{tokenName}

+

{tokenSymbol}

+
+ +
+

{formattedBalance}

+

{tokenSymbol}

+
+
+ ) + })} +
+ +
+ + +
+
+ ) +} + +export default TokenList diff --git a/packages/wallet/anypay-sdk/src/widget/components/TransferPending.tsx b/packages/wallet/anypay-sdk/src/widget/components/TransferPending.tsx new file mode 100644 index 000000000..14dc8b5d9 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/widget/components/TransferPending.tsx @@ -0,0 +1,25 @@ +import React, { useEffect } from 'react' + +interface TransferPendingProps { + onComplete: () => void +} + +export const TransferPending: React.FC = ({ onComplete }) => { + useEffect(() => { + const timer = setTimeout(() => { + onComplete() + }, 5000) + + return () => clearTimeout(timer) + }, [onComplete]) + + return ( +
+
+

Transfer Pending

+

Waiting for confirmation...

+
+ ) +} + +export default TransferPending diff --git a/packages/wallet/anypay-sdk/src/widget/index.css b/packages/wallet/anypay-sdk/src/widget/index.css new file mode 100644 index 000000000..bd79b9b24 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/widget/index.css @@ -0,0 +1,2 @@ +@import 'tailwindcss'; +@import '@0xsequence/design-system/preset'; \ No newline at end of file diff --git a/packages/wallet/anypay-sdk/src/widget/index.tsx b/packages/wallet/anypay-sdk/src/widget/index.tsx new file mode 100644 index 000000000..a86f4b711 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/widget/index.tsx @@ -0,0 +1 @@ +export * from './widget.js' diff --git a/packages/wallet/anypay-sdk/src/widget/widget.tsx b/packages/wallet/anypay-sdk/src/widget/widget.tsx new file mode 100644 index 000000000..a0b6d7b57 --- /dev/null +++ b/packages/wallet/anypay-sdk/src/widget/widget.tsx @@ -0,0 +1,244 @@ +import { useState } from 'react' +import { useAccount, http, createConfig, WagmiProvider } from 'wagmi' +import { SequenceHooksProvider } from '@0xsequence/hooks' +import { injected, metaMask } from 'wagmi/connectors' +import { StrictMode } from 'react' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import Modal from './components/Modal.js' +import ConnectWallet from './components/ConnectWallet.js' +import TokenList from './components/TokenList.js' +import SendForm from './components/SendForm.js' +import TransferPending from './components/TransferPending.js' +import Receipt from './components/Receipt.js' +import { prepareSend } from '../anypay.js' +import { createWalletClient, custom, type WalletClient } from 'viem' +import { mainnet, base, optimism, arbitrum } from 'viem/chains' +import { parseUnits } from 'viem' +import * as chains from 'viem/chains' +import '@0xsequence/design-system/preset' +import './index.css' +import React from 'react' + +type Screen = 'connect' | 'tokens' | 'send' | 'pending' | 'receipt' + +const wagmiConfig = createConfig({ + // @ts-expect-error + chains: Object.values(chains), + connectors: [ + // sequenceWallet({ + // connectOptions: { + // app: 'Demo Anypay', + // projectAccessKey: projectAccessKey, + // }, + // defaultNetwork: chains.mainnet.id, + // }), + injected(), + metaMask(), + ], + transports: Object.values(chains as unknown as any[]).reduce( + (acc, chain) => ({ + ...acc, + [chain.id]: http(), + }), + {}, + ) as Record>, +}) + +interface Token { + id: number + name: string + symbol: string + balance: string + imageUrl: string + chainId: number + contractAddress: string + contractInfo?: { + decimals: number + symbol: string + name: string + } +} + +const getChainConfig = (chainId: number) => { + switch (chainId) { + case 1: + return mainnet + case 8453: + return base + case 10: + return optimism + case 42161: + return arbitrum + default: + throw new Error(`Unsupported chain ID: ${chainId}`) + } +} + +export type AnyPayWidgetProps = { + sequenceApiKey: string + indexerUrl?: string + apiUrl?: string +} + +const queryClient = new QueryClient() + +export const AnyPayWidget = ({ sequenceApiKey, indexerUrl, apiUrl }: AnyPayWidgetProps) => { + const { address, isConnected, chainId } = useAccount() + const [isModalOpen, setIsModalOpen] = useState(false) + const [currentScreen, setCurrentScreen] = useState('connect') + const [selectedToken, setSelectedToken] = useState(null) + const [txHash, setTxHash] = useState('') + const [walletClient, setWalletClient] = useState(null) + + const handleConnect = () => { + if (window.ethereum && address && chainId) { + const chain = getChainConfig(chainId) + const client = createWalletClient({ + account: address, + chain, + transport: custom(window.ethereum), + }) + setWalletClient(client) + } + setCurrentScreen('tokens') + } + + const handleTokenSelect = (token: Token) => { + if (window.ethereum && address) { + const chain = getChainConfig(token.chainId) + const client = createWalletClient({ + account: address, + chain, + transport: custom(window.ethereum), + }) + setWalletClient(client) + } + setSelectedToken(token) + setCurrentScreen('send') + } + + const handleSend = async (amount: string, recipient: string) => { + if (!address || !isConnected || !chainId || !selectedToken || !window.ethereum || !walletClient?.account) return + + try { + const options = { + account: walletClient.account, + originTokenAddress: selectedToken.contractAddress, + originChainId: selectedToken.chainId, + originTokenAmount: selectedToken.balance, + destinationChainId: chainId, + recipient, + destinationTokenAddress: selectedToken.contractAddress, + destinationTokenAmount: amount, + sequenceApiKey, + fee: selectedToken.symbol === 'ETH' ? parseUnits('0.0001', 18).toString() : parseUnits('0.02', 6).toString(), + client: walletClient, + } + + const { intentAddress, send } = await prepareSend(options) + console.log('Intent address:', intentAddress.toString()) + await send() + + setTxHash('0x123...') + setCurrentScreen('receipt') + } catch (error) { + console.error('Error in prepareSend:', error) + setCurrentScreen('send') + } + } + + const handleTransferComplete = () => { + setCurrentScreen('receipt') + } + + const handleSendAnother = () => { + setCurrentScreen('tokens') + } + + const handleCloseModal = () => { + setIsModalOpen(false) + setCurrentScreen('connect') + setSelectedToken(null) + setTxHash('') + } + + const handleBack = () => { + switch (currentScreen) { + case 'tokens': + setCurrentScreen('connect') + break + case 'send': + setCurrentScreen('tokens') + setSelectedToken(null) + break + case 'receipt': + setCurrentScreen('tokens') + setSelectedToken(null) + setTxHash('') + break + default: + break + } + } + + const renderScreen = () => { + switch (currentScreen) { + case 'connect': + return + case 'tokens': + return + case 'send': + return selectedToken && walletClient?.account ? ( + setCurrentScreen('pending')} + onComplete={() => setCurrentScreen('receipt')} + selectedToken={selectedToken} + account={walletClient.account} + sequenceApiKey={sequenceApiKey} + /> + ) : null + case 'pending': + return + case 'receipt': + return + default: + return null + } + } + + return ( + + + + +
+ + + + {renderScreen()} + +
+
+
+
+
+ ) +} + +export default AnyPayWidget diff --git a/packages/wallet/anypay-sdk/test/anypay_e2e.test.ts b/packages/wallet/anypay-sdk/test/anypay_e2e.test.ts new file mode 100644 index 000000000..66de1f37f --- /dev/null +++ b/packages/wallet/anypay-sdk/test/anypay_e2e.test.ts @@ -0,0 +1,173 @@ +import { describe, it, expect, vi } from 'vitest' +import { + getAPIClient, + getRelayer, + getIntentCallsPayloads, + calculateIntentAddress, + commitIntentConfig, + sendOriginTransaction, + getERC20TransferData, + relayerSendMetaTx, + getMetaTxnReceipt, + type GetIntentCallsPayloadsReturn, +} from '../src/index.js' +import { privateKeyToAccount } from 'viem/accounts' +import { createWalletClient, createPublicClient, http } from 'viem' +import { arbitrum, base, optimism } from 'viem/chains' +import 'dotenv/config' + +// Mock the hooks +vi.mock('@0xsequence/hooks', () => ({ + useIndexerGatewayClient: vi.fn(), + useQuery: vi.fn(), + useMemo: vi.fn(), +})) + +// Mock react +vi.mock('react', () => ({ + useMemo: vi.fn((fn) => fn()), +})) + +const cachedIntent = null + +type SendOptions = { + originChainId: number + destinationChainId: number + recipient: string + destinationTokenAddress: string + destinationTokenAmount: string +} + +async function prepareSend(options: SendOptions) { + const { originChainId, destinationChainId, recipient, destinationTokenAddress, destinationTokenAmount } = options + const chain = originChainId === 42161 ? arbitrum : destinationChainId === 8453 ? base : optimism + const apiClient = getAPIClient('http://localhost:4422', process.env.SEQUENCE_API_KEY as string) + const originRelayer = getRelayer({ env: 'local' }, originChainId) + const destinationRelayer = getRelayer({ env: 'local' }, destinationChainId) + + const account = privateKeyToAccount(process.env.WALLET_PRIVATE_KEY as `0x${string}`) + const mainSigner = account.address + + const args = { + userAddress: mainSigner, + originChainId, + originTokenAddress: '0x0000000000000000000000000000000000000000', + originTokenAmount: '1000000000000000', // max amount + destinationChainId, + destinationToAddress: destinationTokenAddress, + destinationTokenAddress: destinationTokenAddress, + destinationTokenAmount: destinationTokenAmount, + destinationCallData: getERC20TransferData(recipient, BigInt(destinationTokenAmount)), + destinationCallValue: '0', + } + + console.log('Creating intent with args:', JSON.stringify(args, null, 2)) + let intent: any = cachedIntent // TODO: Add proper type + if (!intent) { + intent = await getIntentCallsPayloads(apiClient, args) + } + console.log('Got intent:', JSON.stringify(intent, null, 2)) + + const intentAddress = calculateIntentAddress(mainSigner, intent.calls, intent.lifiInfos) + console.log('Calculated intent address:', intentAddress.toString()) + + if (!cachedIntent) { + await commitIntentConfig(apiClient, mainSigner, intent.calls, intent.preconditions, intent.lifiInfos) + } + + return { + intentAddress, + send: async () => { + const shouldSend = !cachedIntent + if (shouldSend) { + console.log('sending origin transaction') + const originCallParams = { + to: intent.preconditions[0].data.address, + data: '0x', + value: BigInt(intent.preconditions[0].data.min) + BigInt('5600000000000'), + chainId: originChainId, + chain, + } + + const walletClient = createWalletClient({ + chain, + transport: http(), + }) + + const publicClient = createPublicClient({ + chain, + transport: http(), + }) + + const tx = await sendOriginTransaction(account, walletClient, originCallParams as any) // TODO: Add proper type + console.log('origin tx', tx) + // Wait for transaction receipt + const receipt = await publicClient.waitForTransactionReceipt({ hash: tx }) + console.log('receipt', receipt) + + await new Promise((resolve) => setTimeout(resolve, 5000)) + } + + const metaTx = intent.metaTxns[0] + console.log('metaTx', metaTx) + const opHash = await relayerSendMetaTx(originRelayer, metaTx, [intent.preconditions[0]]) + + console.log('opHash', opHash) + + // eslint-disable-next-line no-constant-condition + while (true) { + console.log('polling status', metaTx.id as `0x${string}`, BigInt(metaTx.chainId)) + const receipt = await getMetaTxnReceipt(originRelayer, metaTx.id, Number(metaTx.chainId)) + console.log('status', receipt) + if (receipt.receipt.status === 'confirmed') { + break + } + await new Promise((resolve) => setTimeout(resolve, 1000)) + } + + await new Promise((resolve) => setTimeout(resolve, 5000)) + const metaTx2 = intent.metaTxns[1] + console.log('metaTx2', metaTx2) + + const opHash2 = await relayerSendMetaTx(destinationRelayer, metaTx2, [intent.preconditions[1]]) + console.log('opHash2', opHash2) + + // eslint-disable-next-line no-constant-condition + while (true) { + console.log('polling status', metaTx2.id as `0x${string}`, BigInt(metaTx2.chainId)) + const receipt = await getMetaTxnReceipt(destinationRelayer, metaTx2.id, Number(metaTx2.chainId)) + console.log('status', receipt) + if (receipt.receipt.status === 'confirmed') { + break + } + await new Promise((resolve) => setTimeout(resolve, 1000)) + } + }, + } +} + +describe.skip('AnyPay', () => { + it( + 'should should an e2e test', + async () => { + const recipient = '0xef180EDd4B6303a4CeBaF9b6e3a38CC39f381A99' + const destinationTokenAddress = '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913' // USDC + const destinationTokenAmount = '300003' + + const preparedSend = await prepareSend({ + originChainId: 42161, + destinationChainId: 8453, + recipient, + destinationTokenAddress, + destinationTokenAmount, + }) + + console.log('preparedSend intentAddress', preparedSend.intentAddress) // TODO: to a second send using this intentAddress as the destination address + + await preparedSend.send() + + console.log('done') + }, + 10 * 60 * 1000, + ) +}) diff --git a/packages/wallet/anypay-sdk/test/index.test.ts b/packages/wallet/anypay-sdk/test/index.test.ts new file mode 100644 index 000000000..eb9feedd5 --- /dev/null +++ b/packages/wallet/anypay-sdk/test/index.test.ts @@ -0,0 +1,34 @@ +import { describe, it, expect, vi } from 'vitest' +import type { MetaTxn } from '../src/metaTxnMonitor.js' +import * as hooks from '../src/index.js' + +// Mock the hooks module +vi.mock('../src/index.js', () => ({ + useAPIClient: vi.fn(), + useMetaTxnsMonitor: vi.fn(), + useRelayers: vi.fn(), + useTokenBalances: vi.fn(), + useAnyPay: vi.fn(), +})) + +describe('SDK Exports', () => { + it('exports all hooks', () => { + expect(hooks.useAPIClient).toBeDefined() + expect(hooks.useMetaTxnsMonitor).toBeDefined() + expect(hooks.useRelayers).toBeDefined() + expect(hooks.useTokenBalances).toBeDefined() + expect(hooks.useAnyPay).toBeDefined() + }) + + it('exports types', () => { + // Just verify the type exists by using it in a type context + const _metaTxn: MetaTxn = { + id: '123', + chainId: '1', + contract: '0x123', + input: '0x456', + walletAddress: '0x789', + } + expect(_metaTxn).toBeDefined() + }) +}) diff --git a/packages/wallet/anypay-sdk/test/intents.test.ts b/packages/wallet/anypay-sdk/test/intents.test.ts new file mode 100644 index 000000000..456599a80 --- /dev/null +++ b/packages/wallet/anypay-sdk/test/intents.test.ts @@ -0,0 +1,1032 @@ +import { Address, Bytes, Provider, Hex, RpcTransport, Secp256k1, AbiFunction, AbiParameters, Hash } from 'ox' +import { Context, Payload } from '@0xsequence/wallet-primitives' +import { Relayer } from '@0xsequence/wallet-core' +import { describe, it, expect, vi } from 'vitest' +import { isAddressEqual } from 'viem' +import { Preconditions } from '@0xsequence/wallet-core' +import { + calculateIntentConfigurationAddress, + hashIntentParams, + IntentCallsPayload, + AnypayLifiInfo, + getAnypayLifiInfoHash, +} from '../src/intents.js' +import 'dotenv/config' + +const LOCAL_RPC_URL = process.env.LOCAL_RPC_URL || 'http://localhost:8545' +const { RPC_URL, PRIVATE_KEY } = process.env +const CAN_RUN_LIVE = !!RPC_URL && !!PRIVATE_KEY + +const LocalRelayer = Relayer.Local.LocalRelayer +const { + NativeBalancePrecondition, + Erc20BalancePrecondition, + Erc20ApprovalPrecondition, + Erc721OwnershipPrecondition, + Erc721ApprovalPrecondition, + Erc1155BalancePrecondition, + Erc1155ApprovalPrecondition, +} = Preconditions + +const ERC20_IMPLICIT_MINT_CONTRACT = '0x041E0CDC028050519C8e6485B2d9840caf63773F' + +function randomAddress(): Address.Address { + return Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: Secp256k1.randomPrivateKey() })) +} + +describe('AnyPay Preconditions', () => { + const getProvider = async (): Promise<{ provider: Provider.Provider; chainId: bigint }> => { + let provider: Provider.Provider + let chainId = 1n + if (CAN_RUN_LIVE) { + provider = Provider.from(RpcTransport.fromHttp(RPC_URL!)) + chainId = BigInt(await provider.request({ method: 'eth_chainId' })) + } else { + provider = { + request: vi.fn(), + on: vi.fn(), + removeListener: vi.fn(), + call: vi.fn(), + sendTransaction: vi.fn(), + getBalance: vi.fn(), + } as unknown as Provider.Provider + } + + return { provider: provider!, chainId } + } + + const testWalletAddress = randomAddress() + const testIdentityAddress = randomAddress() + + const requireContractDeployed = async (provider: Provider.Provider, contract: Address.Address) => { + const code = await provider.request({ method: 'eth_getCode', params: [contract, 'latest'] }) + if (code === '0x') { + throw new Error(`Contract ${contract} not deployed`) + } + } + + it('should create and check native balance precondition', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + + const precondition = new NativeBalancePrecondition( + testWalletAddress, + 1000000000000000000n, // 1 ETH min + 2000000000000000000n, // 2 ETH max + ) + + const intentPrecondition = { + type: precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: precondition.address.toString(), + min: precondition.min?.toString(), + max: precondition.max?.toString(), + }), + } + + if (!CAN_RUN_LIVE) { + // Mock the balance check + ;(provider as any).request.mockResolvedValue('0x16345785d8a0000') // 1.5 ETH in hex + } + + const isValid = await relayer.checkPrecondition(intentPrecondition) + expect(isValid).toBe(true) + }) + + it('should create and check ERC20 balance precondition', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + + const precondition = new Erc20BalancePrecondition( + testWalletAddress, + ERC20_IMPLICIT_MINT_CONTRACT, + 1000000n, // 1 token min + 2000000n, // 2 tokens max + ) + + const intentPrecondition = { + type: precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: precondition.address.toString(), + token: precondition.token.toString(), + min: precondition.min?.toString(), + max: precondition.max?.toString(), + }), + } + + if (!CAN_RUN_LIVE) { + // Mock the balanceOf call + ;(provider as any).call.mockResolvedValue('0x1e8480') // 1.5 tokens in hex + } + + const isValid = await relayer.checkPrecondition(intentPrecondition) + expect(isValid).toBe(true) + }) + + it('should create and check ERC20 approval precondition', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + + const operator = randomAddress() + const precondition = new Erc20ApprovalPrecondition( + testWalletAddress, + ERC20_IMPLICIT_MINT_CONTRACT, + operator, + 1000000n, // 1 token min approval + ) + + const intentPrecondition = { + type: precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: precondition.address.toString(), + token: precondition.token.toString(), + operator: precondition.operator.toString(), + min: precondition.min.toString(), + }), + } + + if (!CAN_RUN_LIVE) { + // Mock the allowance call + ;(provider as any).call.mockResolvedValue('0x1e8480') // 1.5 tokens in hex + } + + const isValid = await relayer.checkPrecondition(intentPrecondition) + expect(isValid).toBe(true) + }) + + it('should create and check ERC721 ownership precondition', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + + const precondition = new Erc721OwnershipPrecondition( + testWalletAddress, + ERC20_IMPLICIT_MINT_CONTRACT, + 1n, // tokenId + true, // must own + ) + + const intentPrecondition = { + type: precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: precondition.address.toString(), + token: precondition.token.toString(), + tokenId: precondition.tokenId.toString(), + owned: precondition.owned, + }), + } + + if (!CAN_RUN_LIVE) { + // Mock the ownerOf call + ;(provider as any).call.mockResolvedValue( + '0x000000000000000000000000' + testWalletAddress.toString().slice(2).toLowerCase(), + ) + } + + const isValid = await relayer.checkPrecondition(intentPrecondition) + expect(isValid).toBe(true) + }) + + it('should create and check ERC721 approval precondition', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + + const operator = randomAddress() + const precondition = new Erc721ApprovalPrecondition( + testWalletAddress, + ERC20_IMPLICIT_MINT_CONTRACT, + 1n, // tokenId + operator, + ) + + const intentPrecondition = { + type: precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: precondition.address.toString(), + token: precondition.token.toString(), + tokenId: precondition.tokenId.toString(), + operator: precondition.operator.toString(), + }), + } + + if (!CAN_RUN_LIVE) { + // Mock the getApproved call + ;(provider as any).call.mockResolvedValue( + '0x000000000000000000000000' + operator.toString().slice(2).toLowerCase(), + ) + } + + const isValid = await relayer.checkPrecondition(intentPrecondition) + expect(isValid).toBe(true) + }) + + it('should create and check ERC1155 balance precondition', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + + const precondition = new Erc1155BalancePrecondition( + testWalletAddress, + ERC20_IMPLICIT_MINT_CONTRACT, + 1n, // tokenId + 1000000n, // 1 token min + 2000000n, // 2 tokens max + ) + + const intentPrecondition = { + type: precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: precondition.address.toString(), + token: precondition.token.toString(), + tokenId: precondition.tokenId.toString(), + min: precondition.min?.toString(), + max: precondition.max?.toString(), + }), + } + + if (!CAN_RUN_LIVE) { + // Mock the balanceOf call + ;(provider as any).call.mockResolvedValue('0x1e8480') // 1.5 tokens in hex + } + + const isValid = await relayer.checkPrecondition(intentPrecondition) + expect(isValid).toBe(true) + }) + + it('should create and check ERC1155 approval precondition', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + + const operator = randomAddress() + const precondition = new Erc1155ApprovalPrecondition( + testWalletAddress, + ERC20_IMPLICIT_MINT_CONTRACT, + 1n, // tokenId + operator, + 1000000n, // 1 token min approval + ) + + const intentPrecondition = { + type: precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: precondition.address.toString(), + token: precondition.token.toString(), + tokenId: precondition.tokenId.toString(), + operator: precondition.operator.toString(), + min: precondition.min.toString(), + }), + } + + if (!CAN_RUN_LIVE) { + // Mock the isApprovedForAll call + ;(provider as any).call.mockResolvedValue('0x1') // true + } + + const isValid = await relayer.checkPrecondition(intentPrecondition) + expect(isValid).toBe(true) + }) + + it('should wait for preconditions to be met before relaying transaction', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + + // Create a precondition that initially fails + const precondition = new Erc20BalancePrecondition( + testWalletAddress, + ERC20_IMPLICIT_MINT_CONTRACT, + 1000000n, // 1 token min + ) + + const intentPrecondition = { + type: precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: precondition.address.toString(), + token: precondition.token.toString(), + min: precondition.min?.toString(), + }), + } + + // Mock initial balance check to fail + let currentBalance = 0n + if (!CAN_RUN_LIVE) { + ;(provider as any).call.mockImplementation(() => { + return Bytes.toHex(Bytes.fromNumber(currentBalance)) + }) + } + + // Create a test operation + const payload: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: ERC20_IMPLICIT_MINT_CONTRACT, + value: 0n, + data: '0x' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore', + }, + ], + } + + // Create context + const context: Context.Context = { + factory: randomAddress(), + creationCode: '0x' as Hex.Hex, + stage1: '0x' as Hex.Hex, + stage2: '0x' as Hex.Hex, + } + + // Calculate intent configuration address + const configAddress = calculateIntentConfigurationAddress(testWalletAddress, [payload], context) + + // Start the relay operation with a short check interval + const relayPromise = relayer.relay( + configAddress, + Bytes.toHex( + Payload.encode( + Payload.fromCall(0n, 0n, [ + { + to: ERC20_IMPLICIT_MINT_CONTRACT, + value: 0n, + data: '0x' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore', + }, + ]), + ), + ), + chainId, + undefined, + [intentPrecondition], + 100, // Short check interval for testing + ) + + // Simulate ERC20 transfer by updating the mock balance + if (!CAN_RUN_LIVE) { + currentBalance = 1500000n // Transfer 1.5 tokens + } else { + // In live mode, we would need to actually transfer tokens here + const transferAmount = 1500000n + const erc20Transfer = AbiFunction.from('function transfer(address,uint256) returns (bool)') + const transferData = AbiFunction.encodeData(erc20Transfer, [ + testWalletAddress.toString() as Hex.Hex, + transferAmount, + ]) as Hex.Hex + await provider.request({ + method: 'eth_sendTransaction', + params: [ + { + to: ERC20_IMPLICIT_MINT_CONTRACT, + data: transferData, + }, + ], + }) + } + + // Wait for the relay to complete + const { opHash } = await relayPromise + + expect(opHash).toBeDefined() + expect(opHash).not.toBe('0x') + + // Verify the transaction was sent + if (!CAN_RUN_LIVE) { + expect((provider as any).sendTransaction).toHaveBeenCalledWith( + { + to: configAddress, + data: Bytes.toHex( + Payload.encode( + Payload.fromCall(0n, 0n, [ + { + to: ERC20_IMPLICIT_MINT_CONTRACT, + value: 0n, + data: '0x' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore', + }, + ]), + ), + ), + }, + 1n, + ) + } + }) + + if (CAN_RUN_LIVE) { + it('should create intent configuration with preconditions', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + + // Create a test operation + const payload: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: ERC20_IMPLICIT_MINT_CONTRACT, + value: 0n, + data: '0x' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore', + }, + ], + } + + // Create preconditions + const nativePrecondition = new NativeBalancePrecondition( + testWalletAddress, + 1000000000000000000n, // 1 ETH min + ) + + const erc20Precondition = new Erc20BalancePrecondition( + testWalletAddress, + ERC20_IMPLICIT_MINT_CONTRACT, + 1000000n, // 1 token min + ) + + const intentPreconditions = [ + { + type: nativePrecondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: nativePrecondition.address.toString(), + min: nativePrecondition.min?.toString(), + }), + }, + { + type: erc20Precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: erc20Precondition.address.toString(), + token: erc20Precondition.token.toString(), + min: erc20Precondition.min?.toString(), + }), + }, + ] + + // Create context + const context: Context.Context = { + factory: randomAddress(), + creationCode: Bytes.toHex(Bytes.fromHex('0x')) as Hex.Hex, + stage1: Bytes.toHex(Bytes.fromHex('0x')) as Hex.Hex, + stage2: Bytes.toHex(Bytes.fromHex('0x')) as Hex.Hex, + } + + // Calculate intent configuration address + const configAddress = calculateIntentConfigurationAddress(testWalletAddress, [payload], context) + + expect(configAddress).toBeDefined() + expect(configAddress).not.toBe(testWalletAddress) + + // Check preconditions + for (const precondition of intentPreconditions) { + const isValid = await relayer.checkPrecondition(precondition) + expect(isValid).toBe(true) + } + }) + + it('should relay transaction when preconditions are met', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + + // Create preconditions + const nativePrecondition = new NativeBalancePrecondition( + testWalletAddress, + 1000000000000000000n, // 1 ETH min + ) + + const erc20Precondition = new Erc20BalancePrecondition( + testWalletAddress, + ERC20_IMPLICIT_MINT_CONTRACT, + 1000000n, // 1 token min + ) + + const intentPreconditions = [ + { + type: nativePrecondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: nativePrecondition.address.toString(), + min: nativePrecondition.min?.toString(), + }), + }, + { + type: erc20Precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: erc20Precondition.address.toString(), + token: erc20Precondition.token.toString(), + min: erc20Precondition.min?.toString(), + }), + }, + ] + + // Create a test operation + const payload: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: ERC20_IMPLICIT_MINT_CONTRACT, + value: 0n, + data: '0x' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore', + }, + ], + } + + // Create context + const context: Context.Context = { + factory: randomAddress(), + creationCode: Bytes.toHex(Bytes.fromHex('0x')) as Hex.Hex, + stage1: Bytes.toHex(Bytes.fromHex('0x')) as Hex.Hex, + stage2: Bytes.toHex(Bytes.fromHex('0x')) as Hex.Hex, + } + + // Calculate intent configuration address + const configAddress = calculateIntentConfigurationAddress(testWalletAddress, [payload], context) + + // Mock the provider responses + if (!CAN_RUN_LIVE) { + // Mock native balance check + ;(provider as any).getBalance.mockResolvedValue(1500000000000000000n) // 1.5 ETH + // Mock ERC20 balance check + ;(provider as any).call.mockResolvedValue('0x1e8480') // 1.5 tokens + } + + // Relay transaction with preconditions + const { opHash } = await relayer.relay( + configAddress, + Bytes.toHex(Bytes.fromHex('0x')), + chainId, + undefined, // fee quote + intentPreconditions, + 1000, // check interval in ms + ) + + expect(opHash).toBeDefined() + expect(opHash).not.toBe('0x') + + // Verify the transaction was sent + if (!CAN_RUN_LIVE) { + expect((provider as any).sendTransaction).toHaveBeenCalledWith({ + to: configAddress, + data: '0x' as Hex.Hex, + }) + } + }) + } +}) + +describe('Intent Configuration Address with LifiInfo', () => { + const testContext: Context.Context = { + factory: Address.from('0x0000000000000000000000000000000000000000'), + stage1: '0x0000000000000000000000000000000000000000' as Hex.Hex, // MainModuleAddress + stage2: '0x0000000000000000000000000000000000000000' as Hex.Hex, // guestModule + creationCode: + '0x603e600e3d39601e805130553df33d3d34601c57363d3d373d363d30545af43d82803e903d91601c57fd5bf3' as Hex.Hex, + } + + const mainSigner = Address.from('0x1111111111111111111111111111111111111111') + const attestationSigner = Address.from('0x0000000000000000000000000000000000000001') + + const lifiInfos: AnypayLifiInfo[] = [ + { + originToken: Address.from('0x1111111111111111111111111111111111111111'), + amount: 100n, + originChainId: 1n, + destinationChainId: 10n, + }, + ] + + it('should calculate address for single operation with lifiInfo', () => { + const payload: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: Address.from('0x0000000000000000000000000000000000000000'), + value: 0n, + data: '0x1234' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert' as const, + }, + ], + } + + const address = calculateIntentConfigurationAddress( + mainSigner, + [payload], + testContext, + attestationSigner, + lifiInfos, + ) + + console.log('Single Operation with LifiInfo Test Address:', address) + expect(isAddressEqual(address, '0x820B2237906fEEBdB45a6Be43d33137253Eeeac5')).toBe(true) + }) + + it('should calculate address for multiple operations with lifiInfo', () => { + const payload1: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: Address.from('0x0000000000000000000000000000000000000000'), + value: 0n, + data: '0x1234' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert' as const, + }, + ], + } + + const payload2: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: Address.from('0x0000000000000000000000000000000000000000'), + value: 0n, + data: '0x5678' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert' as const, + }, + ], + } + + const address = calculateIntentConfigurationAddress( + mainSigner, + [payload1, payload2], + testContext, + attestationSigner, + lifiInfos, + ) + + console.log('Multiple Operations with LifiInfo Test Address:', address) + expect(isAddressEqual(address, '0x807f90d703db799F810a43DBcf81B09d7053e8e6')).toBe(true) + }) +}) + +describe('Intent Configuration Address', () => { + it('should calculate address for single operation', () => { + // Create context matching Go test + const context: Context.Context = { + factory: Address.from('0x0000000000000000000000000000000000000000'), + stage1: '0x0000000000000000000000000000000000000000' as Hex.Hex, + stage2: '0x0000000000000000000000000000000000000000' as Hex.Hex, + creationCode: + '0x603e600e3d39601e805130553df33d3d34601c57363d3d373d363d30545af43d82803e903d91601c57fd5bf3' as Hex.Hex, + } + + // Main signer matching Go test + const mainSigner = Address.from('0x1111111111111111111111111111111111111111') + + // Create a single operation matching Go test + const payload: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: Address.from('0x0000000000000000000000000000000000000000'), + value: 0n, + data: Bytes.toHex(Bytes.fromString('data1')) as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore' as const, + }, + ], + } + + // Calculate intent configuration address + const address = calculateIntentConfigurationAddress(mainSigner, [payload], context) + + console.log('address', address) + + // Verify the address matches Go test + expect(isAddressEqual(address, '0x95b51097940ed0f7ed5758bbd828b48e7891ec94')).toBe(true) + }) + + it('should calculate address for multiple operations', () => { + // Create context matching Go test + const context: Context.Context = { + factory: Address.from('0x0000000000000000000000000000000000000000'), + stage1: '0x0000000000000000000000000000000000000000' as Hex.Hex, + stage2: '0x0000000000000000000000000000000000000000' as Hex.Hex, + creationCode: + '0x603e600e3d39601e805130553df33d3d34601c57363d3d373d363d30545af43d82803e903d91601c57fd5bf3' as Hex.Hex, + } + + // Main signer matching Go test + const mainSigner = Address.from('0x1111111111111111111111111111111111111111') + + // Create multiple operations matching Go test + const payload1: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: Address.from('0x0000000000000000000000000000000000000000'), + value: 0n, + data: Bytes.toHex(Bytes.fromString('data1')) as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore' as const, + }, + ], + } + + const payload2: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: Address.from('0x0000000000000000000000000000000000000000'), + value: 0n, + data: Bytes.toHex(Bytes.fromString('data2')) as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore' as const, + }, + ], + } + + // Calculate intent configuration address + const address = calculateIntentConfigurationAddress(mainSigner, [payload1, payload2], context) + + console.log('address', address) + + // Verify the address matches Go test + expect(isAddressEqual(address, '0xdb59510c80765bcc1b70e36b2583786ecb990476')).toBe(true) + }) + + it('should calculate address for multi-chain intent operations', () => { + // Create context + const context: Context.Context = { + factory: '0xBd0F8abD58B4449B39C57Ac9D5C67433239aC447' as `0x${string}`, + stage1: '0x53bA242E7C2501839DF2972c75075dc693176Cd0' as `0x${string}`, + stage2: '0xa29874c88b8Fd557e42219B04b0CeC693e1712f5' as `0x${string}`, + creationCode: + '0x603e600e3d39601e805130553df33d3d34601c57363d3d373d363d30545af43d82803e903d91601c57fd5bf3' as `0x${string}`, + } + + // Main signer + const mainSigner = Address.from('0x8456195dd0793c621c7f9245edF0fEf85b1B879C') + + // Create multi-chain operations + const arbitrumPayload: IntentCallsPayload = { + chainId: 42161n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: Address.from('0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae'), + value: 16618237n, + data: '0xa6010a660000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000005801784da62343d604885e1181a759647447f13330cc2b8c925cda864b1ac1ce8fc000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e58310000000000000000000000008456195dd0793c621c7f9245edf0fef85b1b879c00000000000000000000000000000000000000000000000000000000000073ac000000000000000000000000000000000000000000000000000000000000210500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d737461726761746556324275730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086c6966692d61706900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000111111125421ca6dc452d289314280a0f8842a65000000000000000000000000111111125421ca6dc452d289314280a0f8842a650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e583100000000000000000000000000000000000000000000000000000f42af44fef500000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000020807ed2379000000000000000000000000de9e4fe32b049f821c7f3e9802381aa470ffca73000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831000000000000000000000000de9e4fe32b049f821c7f3e9802381aa470ffca730000000000000000000000001231deb6f5749ef6ce6943a275a1d3e7486f4eae00000000000000000000000000000000000000000000000000000f42af44fef500000000000000000000000000000000000000000000000000000000000075320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000ba00000000000000000000000000000000000000000000000000000000009c4160de632c3a214d5f14c1d8ddf0b92f8bcd188fee4500242668dfaa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007532000000000000000000000000111111125421ca6dc452d289314280a0f8842a650000000000002a94d114000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000077368def90800000000000000000000000000000000000000000000000000000000000000000000000000000000000000008456195dd0793c621c7f9245edf0fef85b1b879c00000000000000000000000000000000000000000000000000000000000075e80000000000000000000000008456195dd0793c621c7f9245edf0fef85b1b879c0000000000000000000000000000000000000000000000000000000000007532000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore' as const, + }, + ], + } + + const basePayload: IntentCallsPayload = { + chainId: 8453n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: Address.from('0x833589fcd6edb6e08f4c7c32d4f71b54bda02913'), + value: 0n, + data: '0xa9059cbb000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa960450000000000000000000000000000000000000000000000000000000000007530' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore' as const, + }, + ], + } + + // Calculate intent configuration address + const address = calculateIntentConfigurationAddress(mainSigner, [arbitrumPayload, basePayload], context) + + // Log the address + console.log('address', address) + + // Verify the address matches the expected value + expect(isAddressEqual(address, '0x5bd7f0269f4aa805f5a13b3104d596c151d8ec76')).toBe(true) + }) +}) + +describe('HashIntentParams', () => { + it('should error on empty fields', () => { + expect(() => + hashIntentParams({ + userAddress: Address.from('0x0000000000000000000000000000000000000000'), + nonce: 0n, + originTokens: [], + destinationCalls: [], + destinationTokens: [], + }), + ).toThrow() + }) + + it('should match hash for single call', () => { + const call = { + to: Address.from('0x1111111111111111111111111111111111111111'), + value: 123n, + data: Bytes.toHex(Bytes.fromString('data1')) as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore' as const, + } + const payload: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [call], + } + const params = { + userAddress: Address.from('0x3333333333333333333333333333333333333333'), + nonce: 0n, + originTokens: [{ address: Address.from('0x4444444444444444444444444444444444444444'), chainId: 1n }], + destinationCalls: [payload], + destinationTokens: [ + { + address: Address.from('0x4444444444444444444444444444444444444444'), + chainId: 1n, + amount: 123n, + }, + ], + } + const hash = hashIntentParams(params) + + expect(hash.toLowerCase()).toBe('0x4479e1ed63b1cf70ed13228bec79f2a1d2ffa0e9372e2afc7d82263cd8107451') + }) + + it('should match hash for multiple calls', () => { + const call1 = { + to: Address.from('0x1111111111111111111111111111111111111111'), + value: 123n, + data: Bytes.toHex(Bytes.fromString('data1')) as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore' as const, + } + const call2 = { + to: Address.from('0x5555555555555555555555555555555555555555'), + value: 456n, + data: Bytes.toHex(Bytes.fromString('data2')) as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore' as const, + } + const payload1: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [call1], + } + const payload2: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [call2], + } + const params = { + userAddress: Address.from('0x3333333333333333333333333333333333333333'), + nonce: 0n, + originTokens: [{ address: Address.from('0x4444444444444444444444444444444444444444'), chainId: 1n }], + destinationCalls: [payload1, payload2], + destinationTokens: [ + { + address: Address.from('0x4444444444444444444444444444444444444444'), + chainId: 1n, + amount: 123n, + }, + ], + } + const hash = hashIntentParams(params) + expect(hash.toLowerCase()).toBe('0x64631a48bc218cd8196dca22437223d90dc9caa8208284cdcea4b7f32bfc7cec') + }) +}) + +describe('GetAnypayLifiInfoHash', () => { + it('should match hash for single AnypayLifiInfo', () => { + const lifiInfos: AnypayLifiInfo[] = [ + { + originToken: Address.from('0x1111111111111111111111111111111111111111'), + amount: 100n, + originChainId: 1n, + destinationChainId: 10n, + }, + ] + const attestationAddress = Address.from('0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa') + + const hash = getAnypayLifiInfoHash(lifiInfos, attestationAddress) + expect(hash.toLowerCase()).toBe('0x21872bd6b64711c4a5aecba95829c612f0b50c63f1a26991c2f76cf4a754aede') + }) + + it('should match hash for multiple AnypayLifiInfo', () => { + const lifiInfos: AnypayLifiInfo[] = [ + { + originToken: Address.from('0x1111111111111111111111111111111111111111'), + amount: 100n, + originChainId: 1n, + destinationChainId: 10n, + }, + { + originToken: Address.from('0x2222222222222222222222222222222222222222'), + amount: 200n, + originChainId: 137n, + destinationChainId: 42161n, + }, + ] + const attestationAddress = Address.from('0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB') + + const hash = getAnypayLifiInfoHash(lifiInfos, attestationAddress) + expect(hash.toLowerCase()).toBe('0xd18e54455db64ba31b9f9a447e181f83977cb70b136228d64ac85d64a6aefe71') + }) + + it('should error on empty lifiInfos', () => { + const attestationAddress = Address.from('0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa') + expect(() => getAnypayLifiInfoHash([], attestationAddress)).toThrow('lifiInfos is empty') + }) + + it('should error on zero attestationAddress', () => { + const lifiInfos: AnypayLifiInfo[] = [ + { + originToken: Address.from('0x1111111111111111111111111111111111111111'), + amount: 100n, + originChainId: 1n, + destinationChainId: 10n, + }, + ] + const attestationAddress = Address.from('0x0000000000000000000000000000000000000000') + expect(() => getAnypayLifiInfoHash(lifiInfos, attestationAddress)).toThrow('attestationAddress is zero') + }) +}) diff --git a/packages/wallet/anypay-sdk/tsconfig.base.json b/packages/wallet/anypay-sdk/tsconfig.base.json new file mode 100644 index 000000000..5117f2a3d --- /dev/null +++ b/packages/wallet/anypay-sdk/tsconfig.base.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "esModuleInterop": true, + "incremental": false, + "isolatedModules": true, + "lib": ["es2022", "DOM", "DOM.Iterable"], + "module": "NodeNext", + "moduleDetection": "force", + "moduleResolution": "NodeNext", + "noUncheckedIndexedAccess": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "ES2022" + } +} diff --git a/packages/wallet/anypay-sdk/tsconfig.build.json b/packages/wallet/anypay-sdk/tsconfig.build.json new file mode 100644 index 000000000..cdcfad7dd --- /dev/null +++ b/packages/wallet/anypay-sdk/tsconfig.build.json @@ -0,0 +1,16 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist", + "declaration": true, + "emitDeclarationOnly": true, + "jsx": "react-jsx", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "target": "ES2022", + "skipLibCheck": true + }, + "include": ["src"], + "exclude": ["test", "**/*.test.ts", "**/*.test.tsx"] +} diff --git a/packages/wallet/anypay-sdk/tsconfig.json b/packages/wallet/anypay-sdk/tsconfig.json new file mode 100644 index 000000000..4aac98d79 --- /dev/null +++ b/packages/wallet/anypay-sdk/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist", + "types": ["node"] + }, + "include": ["src"], + "exclude": ["node_modules", "dist", "src/widget"] +} diff --git a/packages/wallet/anypay-sdk/turbo.json b/packages/wallet/anypay-sdk/turbo.json new file mode 100644 index 000000000..b997b7c05 --- /dev/null +++ b/packages/wallet/anypay-sdk/turbo.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://turbo.build/schema.json", + "extends": ["//"], + "ui": "tui", + "tasks": { + "build": { + "dependsOn": ["^build"] + }, + "lint": { + "dependsOn": ["^lint"] + }, + "typecheck": { + "dependsOn": ["^typecheck"] + }, + "dev": { + "cache": false, + "persistent": true + } + } +} diff --git a/packages/wallet/anypay-sdk/vite.config.ts b/packages/wallet/anypay-sdk/vite.config.ts new file mode 100644 index 000000000..aad51cad3 --- /dev/null +++ b/packages/wallet/anypay-sdk/vite.config.ts @@ -0,0 +1,45 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js' +import { resolve } from 'path' + +export default defineConfig({ + plugins: [ + react(), + cssInjectedByJsPlugin(), // inject CSS automatically + ], + build: { + lib: { + entry: { + index: './src/index.ts', + 'widget/index': './src/widget/index.tsx', + }, + formats: ['es'], + }, + rollupOptions: { + external: [ + 'react', + 'react-dom', + '@0xsequence/design-system', + 'wagmi', + 'viem', + '@0xsequence/api', + '@0xsequence/wallet-core', + '@0xsequence/wallet-primitives', + '@0xsequence/wallet-wdk', + ], + output: { + preserveModules: true, + preserveModulesRoot: 'src', + entryFileNames: '[name].js', + }, + }, + outDir: 'dist/widget', + emptyOutDir: true, + }, + optimizeDeps: { + force: true, + // TODO: This shouldn't be needed, fix sdk build + include: ['@0xsequence/api', '@0xsequence/wallet-core', '@0xsequence/wallet-primitives', '@0xsequence/wallet-wdk'], + }, +}) diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index b94bb5467..feb2dfaea 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -3,6 +3,10 @@ "version": "0.0.0", "license": "Apache-2.0", "type": "module", + "publishConfig": { + "access": "public" + }, + "private": false, "scripts": { "build": "tsc", "dev": "tsc --watch", @@ -25,6 +29,7 @@ "dependencies": { "@0xsequence/relayer": "workspace:^", "@0xsequence/wallet-primitives": "workspace:^", - "ox": "^0.7.0" + "ox": "^0.7.0", + "viem": "^2.27.2" } } diff --git a/packages/wallet/core/src/anypay/constants.ts b/packages/wallet/core/src/anypay/constants.ts new file mode 100644 index 000000000..6349385b6 --- /dev/null +++ b/packages/wallet/core/src/anypay/constants.ts @@ -0,0 +1,3 @@ +export const ANYPAY_LIFI_SAPIENT_SIGNER_ADDRESS = '0xd7571bd1e3af468c3a49966c9a92a2e907cdfa52' +export const ANYPAY_LIFI_SAPIENT_SIGNER_LITE_ADDRESS = '0xaA3f6B332237aFb83789d3F5FBaD817EF3102648' +export const ANYPAY_LIFI_ATTESATION_SIGNER_ADDRESS = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' diff --git a/packages/wallet/core/src/anypay/index.ts b/packages/wallet/core/src/anypay/index.ts new file mode 100644 index 000000000..fe73e0a8d --- /dev/null +++ b/packages/wallet/core/src/anypay/index.ts @@ -0,0 +1,2 @@ +export * from './intents.js' +export * from './constants.js' diff --git a/packages/wallet/core/src/anypay/intents.ts b/packages/wallet/core/src/anypay/intents.ts new file mode 100644 index 000000000..817111707 --- /dev/null +++ b/packages/wallet/core/src/anypay/intents.ts @@ -0,0 +1,257 @@ +import { AbiParameters, Address, Bytes, ContractAddress, Hash, Hex } from 'ox' +import { Context, Config, Payload } from '@0xsequence/wallet-primitives' +// import { ANYPAY_LIFI_SAPIENT_SIGNER_ADDRESS } from './constants.js' +import { ANYPAY_LIFI_SAPIENT_SIGNER_LITE_ADDRESS } from './constants.js' +export interface IntentCallsPayload extends Payload.Calls { + chainId: bigint +} + +export interface OriginTokenParam { + address: Address.Address + chainId: bigint +} + +export interface DestinationTokenParam { + address: Address.Address + chainId: bigint + amount: bigint +} + +export function hashIntentParams(params: { + userAddress: Address.Address + nonce: bigint + originTokens: OriginTokenParam[] + destinationCalls: Array + destinationTokens: DestinationTokenParam[] +}): string { + if (!params) throw new Error('params is nil') + if (!params.userAddress || params.userAddress === '0x0000000000000000000000000000000000000000') + throw new Error('UserAddress is zero') + if (typeof params.nonce !== 'bigint') throw new Error('Nonce is not a bigint') + if (!params.originTokens || params.originTokens.length === 0) throw new Error('OriginTokens is empty') + if (!params.destinationCalls || params.destinationCalls.length === 0) throw new Error('DestinationCalls is empty') + if (!params.destinationTokens || params.destinationTokens.length === 0) throw new Error('DestinationTokens is empty') + for (let i = 0; i < params.destinationCalls.length; i++) { + const currentCall = params.destinationCalls[i] + if (!currentCall) throw new Error(`DestinationCalls[${i}] is nil`) + if (!currentCall.calls || currentCall.calls.length === 0) { + throw new Error(`DestinationCalls[${i}] has no calls`) + } + } + + const originTokensForAbi = params.originTokens.map((token) => ({ + address: token.address, + chainId: token.chainId, + })) + + let cumulativeCallsHashBytes: Bytes.Bytes = Bytes.from(new Uint8Array(32)) + + for (let i = 0; i < params.destinationCalls.length; i++) { + const callPayload = params.destinationCalls[i]! + + const currentDestCallPayloadHashBytes = Payload.hash( + Address.from('0x0000000000000000000000000000000000000000'), + callPayload.chainId, + callPayload, + ) + + cumulativeCallsHashBytes = Hash.keccak256(Bytes.concat(cumulativeCallsHashBytes, currentDestCallPayloadHashBytes), { + as: 'Bytes', + }) + } + const cumulativeCallsHashHex = Bytes.toHex(cumulativeCallsHashBytes) + + const destinationTokensForAbi = params.destinationTokens.map((token) => ({ + address: token.address, + chainId: token.chainId, + amount: token.amount, + })) + + const abiSchema = [ + { type: 'address' }, + { type: 'uint256' }, + { + type: 'tuple[]', + components: [ + { name: 'address', type: 'address' }, + { name: 'chainId', type: 'uint256' }, + ], + }, + { + type: 'tuple[]', + components: [ + { name: 'address', type: 'address' }, + { name: 'chainId', type: 'uint256' }, + { name: 'amount', type: 'uint256' }, + ], + }, + { type: 'bytes32' }, + ] + + const encodedHex = AbiParameters.encode(abiSchema, [ + params.userAddress, + params.nonce, + originTokensForAbi, + destinationTokensForAbi, + cumulativeCallsHashHex, + ]) as Hex.Hex + + function bigintReplacer(_key: string, value: any) { + return typeof value === 'bigint' ? value.toString() : value + } + + const encodedBytes = Bytes.fromHex(encodedHex) + const hashBytes = Hash.keccak256(encodedBytes) + const hashHex = Bytes.toHex(hashBytes) + + return hashHex +} + +export interface AnypayLifiInfo { + originToken: Address.Address + amount: bigint + originChainId: bigint + destinationChainId: bigint +} + +export function getAnypayLifiInfoHash(lifiInfos: AnypayLifiInfo[], attestationAddress: Address.Address): Hex.Hex { + if (!lifiInfos || lifiInfos.length === 0) { + throw new Error('lifiInfos is empty') + } + if (!attestationAddress || attestationAddress === '0x0000000000000000000000000000000000000000') { + throw new Error('attestationAddress is zero') + } + + const anypayLifiInfoComponents = [ + { name: 'originToken', type: 'address' }, + { name: 'amount', type: 'uint256' }, + { name: 'originChainId', type: 'uint256' }, + { name: 'destinationChainId', type: 'uint256' }, + ] + + const lifiInfosForAbi = lifiInfos.map((info) => ({ + originToken: info.originToken, + amount: info.amount, + originChainId: info.originChainId, + destinationChainId: info.destinationChainId, + })) + + const abiSchema = [ + { + type: 'tuple[]', + name: 'lifiInfos', + components: anypayLifiInfoComponents, + }, + { type: 'address', name: 'attestationAddress' }, + ] + + const encodedHex = AbiParameters.encode(abiSchema, [lifiInfosForAbi, attestationAddress]) as Hex.Hex + const encodedBytes = Bytes.fromHex(encodedHex) + const hashBytes = Hash.keccak256(encodedBytes) + return Bytes.toHex(hashBytes) +} + +export function calculateIntentConfigurationAddress( + mainSigner: Address.Address, + calls: IntentCallsPayload[], + context: Context.Context, + attestationSigner?: Address.Address, + lifiInfos?: AnypayLifiInfo[], +): Address.Address { + const config = createIntentConfiguration(mainSigner, calls, attestationSigner, lifiInfos) + + // Calculate the image hash of the configuration + const imageHash = Config.hashConfiguration(config) + + // Calculate the counterfactual address using the image hash and context + return ContractAddress.fromCreate2({ + from: context.factory, + bytecodeHash: Hash.keccak256( + Bytes.concat(Bytes.from(context.creationCode), Bytes.padLeft(Bytes.from(context.stage1), 32)), + { as: 'Bytes' }, + ), + salt: imageHash, + }) +} + +function createIntentConfiguration( + mainSigner: Address.Address, + calls: IntentCallsPayload[], + attestationSigner?: Address.Address, + lifiInfos?: AnypayLifiInfo[], +): Config.Config { + const mainSignerLeaf: Config.SignerLeaf = { + type: 'signer', + address: mainSigner, + weight: 1n, + } + + const subdigestLeaves: Config.AnyAddressSubdigestLeaf[] = calls.map((call) => { + const digest = Payload.hash(Address.from('0x0000000000000000000000000000000000000000'), call.chainId, call) + console.log('digest:', Bytes.toHex(digest)) + return { + type: 'any-address-subdigest', + digest: Bytes.toHex(digest), + } as Config.AnyAddressSubdigestLeaf + }) + + let otherLeaves: Config.Topology[] = [...subdigestLeaves] + + if (lifiInfos && lifiInfos.length > 0) { + if (attestationSigner) { + const lifiConditionLeaf: Config.SapientSignerLeaf = { + type: 'sapient-signer', + // address: ANYPAY_LIFI_SAPIENT_SIGNER_ADDRESS, + address: ANYPAY_LIFI_SAPIENT_SIGNER_LITE_ADDRESS, + weight: 1n, + imageHash: getAnypayLifiInfoHash(lifiInfos, attestationSigner), + } + otherLeaves.push(lifiConditionLeaf) + } + } + + if (otherLeaves.length === 0) { + throw new Error('Intent configuration must have at least one call or LiFi information.') + } + + let secondaryTopologyNode: Config.Topology + + if (otherLeaves.length === 1) { + secondaryTopologyNode = otherLeaves[0]! + } else { + secondaryTopologyNode = buildMerkleTreeFromMembers(otherLeaves) + } + + return { + threshold: 1n, + checkpoint: 0n, + topology: [mainSignerLeaf, secondaryTopologyNode] as Config.Node, + } +} + +// Renamed and generalized from createSubdigestTree +function buildMerkleTreeFromMembers(members: Config.Topology[]): Config.Topology { + if (members.length === 0) { + throw new Error('Cannot create a tree from empty members') + } + if (members.length === 1) { + return members[0]! // Returns a single Leaf or a Node + } + + let currentLevel = [...members] + while (currentLevel.length > 1) { + const nextLevel: Config.Topology[] = [] + for (let i = 0; i < currentLevel.length; i += 2) { + const left = currentLevel[i]! + if (i + 1 < currentLevel.length) { + const right = currentLevel[i + 1]! + nextLevel.push([left, right] as Config.Node) + } else { + // Odd one out, carries over to the next level + nextLevel.push(left) + } + } + currentLevel = nextLevel + } + return currentLevel[0]! +} diff --git a/packages/wallet/core/src/index.ts b/packages/wallet/core/src/index.ts index 202084bde..6373234a0 100644 --- a/packages/wallet/core/src/index.ts +++ b/packages/wallet/core/src/index.ts @@ -1,6 +1,8 @@ export * from './wallet.js' +export * as AnyPay from './anypay/index.js' export * as Signers from './signers/index.js' export * as State from './state/index.js' export * as Relayer from './relayer/index.js' export * as Envelope from './envelope.js' +export * as Preconditions from './preconditions/index.js' diff --git a/packages/wallet/core/src/preconditions/codec.ts b/packages/wallet/core/src/preconditions/codec.ts new file mode 100644 index 000000000..a6c2a13f7 --- /dev/null +++ b/packages/wallet/core/src/preconditions/codec.ts @@ -0,0 +1,193 @@ +import { Address } from 'ox' +import { + Precondition, + NativeBalancePrecondition, + Erc20BalancePrecondition, + Erc20ApprovalPrecondition, + Erc721OwnershipPrecondition, + Erc721ApprovalPrecondition, + Erc1155BalancePrecondition, + Erc1155ApprovalPrecondition, +} from './types.js' + +export interface IntentPrecondition { + type: string + data: string +} + +export function decodePreconditions(preconditions: IntentPrecondition[]): Precondition[] { + const decodedPreconditions: Precondition[] = [] + + for (const p of preconditions) { + const decoded = decodePrecondition(p) + if (decoded) { + decodedPreconditions.push(decoded) + } + } + + return decodedPreconditions +} + +export function decodePrecondition(p: IntentPrecondition): Precondition | undefined { + if (!p) { + return undefined + } + + let precondition: Precondition | undefined + + try { + const data = JSON.parse(p.data) + + switch (p.type) { + case 'native-balance': + precondition = new NativeBalancePrecondition( + Address.from(data.address), + data.min ? BigInt(data.min) : undefined, + data.max ? BigInt(data.max) : undefined, + ) + break + + case 'erc20-balance': + precondition = new Erc20BalancePrecondition( + Address.from(data.address), + Address.from(data.token), + data.min ? BigInt(data.min) : undefined, + data.max ? BigInt(data.max) : undefined, + ) + break + + case 'erc20-approval': + precondition = new Erc20ApprovalPrecondition( + Address.from(data.address), + Address.from(data.token), + Address.from(data.operator), + BigInt(data.min), + ) + break + + case 'erc721-ownership': + precondition = new Erc721OwnershipPrecondition( + Address.from(data.address), + Address.from(data.token), + BigInt(data.tokenId), + data.owned, + ) + break + + case 'erc721-approval': + precondition = new Erc721ApprovalPrecondition( + Address.from(data.address), + Address.from(data.token), + BigInt(data.tokenId), + Address.from(data.operator), + ) + break + + case 'erc1155-balance': + precondition = new Erc1155BalancePrecondition( + Address.from(data.address), + Address.from(data.token), + BigInt(data.tokenId), + data.min ? BigInt(data.min) : undefined, + data.max ? BigInt(data.max) : undefined, + ) + break + + case 'erc1155-approval': + precondition = new Erc1155ApprovalPrecondition( + Address.from(data.address), + Address.from(data.token), + BigInt(data.tokenId), + Address.from(data.operator), + BigInt(data.min), + ) + break + + default: + return undefined + } + + const error = precondition.isValid() + if (error) { + console.warn(`Invalid precondition: ${error.message}`) + return undefined + } + + return precondition + } catch (e) { + console.warn(`Failed to decode precondition: ${e}`) + return undefined + } +} + +export function encodePrecondition(p: Precondition): string { + const data: any = {} + + switch (p.type()) { + case 'native-balance': { + const native = p as NativeBalancePrecondition + data.address = native.address.toString() + if (native.min !== undefined) data.min = native.min.toString() + if (native.max !== undefined) data.max = native.max.toString() + break + } + + case 'erc20-balance': { + const erc20 = p as Erc20BalancePrecondition + data.address = erc20.address.toString() + data.token = erc20.token.toString() + if (erc20.min !== undefined) data.min = erc20.min.toString() + if (erc20.max !== undefined) data.max = erc20.max.toString() + break + } + + case 'erc20-approval': { + const erc20 = p as Erc20ApprovalPrecondition + data.address = erc20.address.toString() + data.token = erc20.token.toString() + data.operator = erc20.operator.toString() + data.min = erc20.min.toString() + break + } + + case 'erc721-ownership': { + const erc721 = p as Erc721OwnershipPrecondition + data.address = erc721.address.toString() + data.token = erc721.token.toString() + data.tokenId = erc721.tokenId.toString() + if (erc721.owned !== undefined) data.owned = erc721.owned + break + } + + case 'erc721-approval': { + const erc721 = p as Erc721ApprovalPrecondition + data.address = erc721.address.toString() + data.token = erc721.token.toString() + data.tokenId = erc721.tokenId.toString() + data.operator = erc721.operator.toString() + break + } + + case 'erc1155-balance': { + const erc1155 = p as Erc1155BalancePrecondition + data.address = erc1155.address.toString() + data.token = erc1155.token.toString() + data.tokenId = erc1155.tokenId.toString() + if (erc1155.min !== undefined) data.min = erc1155.min.toString() + if (erc1155.max !== undefined) data.max = erc1155.max.toString() + break + } + + case 'erc1155-approval': { + const erc1155 = p as Erc1155ApprovalPrecondition + data.address = erc1155.address.toString() + data.token = erc1155.token.toString() + data.tokenId = erc1155.tokenId.toString() + data.operator = erc1155.operator.toString() + data.min = erc1155.min.toString() + break + } + } + + return JSON.stringify(data) +} diff --git a/packages/wallet/core/src/preconditions/index.ts b/packages/wallet/core/src/preconditions/index.ts new file mode 100644 index 000000000..6bb6376ef --- /dev/null +++ b/packages/wallet/core/src/preconditions/index.ts @@ -0,0 +1,3 @@ +export * from './types.js' +export * from './codec.js' +export * from './selectors.js' diff --git a/packages/wallet/core/src/preconditions/selectors.ts b/packages/wallet/core/src/preconditions/selectors.ts new file mode 100644 index 000000000..0f38b092f --- /dev/null +++ b/packages/wallet/core/src/preconditions/selectors.ts @@ -0,0 +1,41 @@ +import { Precondition, NativeBalancePrecondition, Erc20BalancePrecondition } from './types.js' +import { IntentPrecondition, decodePreconditions } from './codec.js' + +export function extractChainID(precondition: IntentPrecondition): bigint | undefined { + if (!precondition) { + return undefined + } + + try { + const data = JSON.parse(precondition.data) + return data.chainID ? BigInt(data.chainID) : undefined + } catch (e) { + return undefined + } +} + +export function extractSupportedPreconditions(preconditions: IntentPrecondition[]): Precondition[] { + if (!preconditions || preconditions.length === 0) { + return [] + } + + return decodePreconditions(preconditions) +} + +export function extractNativeBalancePreconditions(preconditions: IntentPrecondition[]): NativeBalancePrecondition[] { + if (!preconditions || preconditions.length === 0) { + return [] + } + + const decoded = decodePreconditions(preconditions) + return decoded.filter((p): p is NativeBalancePrecondition => p.type() === 'native-balance') +} + +export function extractERC20BalancePreconditions(preconditions: IntentPrecondition[]): Erc20BalancePrecondition[] { + if (!preconditions || preconditions.length === 0) { + return [] + } + + const decoded = decodePreconditions(preconditions) + return decoded.filter((p): p is Erc20BalancePrecondition => p.type() === 'erc20-balance') +} diff --git a/packages/wallet/core/src/preconditions/types.ts b/packages/wallet/core/src/preconditions/types.ts new file mode 100644 index 000000000..23a9db22c --- /dev/null +++ b/packages/wallet/core/src/preconditions/types.ts @@ -0,0 +1,201 @@ +import { Address } from 'ox' + +export interface Precondition { + type(): string + isValid(): Error | undefined +} + +export class NativeBalancePrecondition implements Precondition { + constructor( + public readonly address: Address.Address, + public readonly min?: bigint, + public readonly max?: bigint, + ) {} + + type(): string { + return 'native-balance' + } + + isValid(): Error | undefined { + if (!this.address) { + return new Error('address is required') + } + if (this.min !== undefined && this.max !== undefined && this.min > this.max) { + return new Error('min balance cannot be greater than max balance') + } + return undefined + } +} + +export class Erc20BalancePrecondition implements Precondition { + constructor( + public readonly address: Address.Address, + public readonly token: Address.Address, + public readonly min?: bigint, + public readonly max?: bigint, + ) {} + + type(): string { + return 'erc20-balance' + } + + isValid(): Error | undefined { + if (!this.address) { + return new Error('address is required') + } + if (!this.token) { + return new Error('token address is required') + } + if (this.min !== undefined && this.max !== undefined && this.min > this.max) { + return new Error('min balance cannot be greater than max balance') + } + return undefined + } +} + +export class Erc20ApprovalPrecondition implements Precondition { + constructor( + public readonly address: Address.Address, + public readonly token: Address.Address, + public readonly operator: Address.Address, + public readonly min: bigint, + ) {} + + type(): string { + return 'erc20-approval' + } + + isValid(): Error | undefined { + if (!this.address) { + return new Error('address is required') + } + if (!this.token) { + return new Error('token address is required') + } + if (!this.operator) { + return new Error('operator address is required') + } + if (this.min === undefined) { + return new Error('min approval amount is required') + } + return undefined + } +} + +export class Erc721OwnershipPrecondition implements Precondition { + constructor( + public readonly address: Address.Address, + public readonly token: Address.Address, + public readonly tokenId: bigint, + public readonly owned?: boolean, + ) {} + + type(): string { + return 'erc721-ownership' + } + + isValid(): Error | undefined { + if (!this.address) { + return new Error('address is required') + } + if (!this.token) { + return new Error('token address is required') + } + if (this.tokenId === undefined) { + return new Error('tokenId is required') + } + return undefined + } +} + +export class Erc721ApprovalPrecondition implements Precondition { + constructor( + public readonly address: Address.Address, + public readonly token: Address.Address, + public readonly tokenId: bigint, + public readonly operator: Address.Address, + ) {} + + type(): string { + return 'erc721-approval' + } + + isValid(): Error | undefined { + if (!this.address) { + return new Error('address is required') + } + if (!this.token) { + return new Error('token address is required') + } + if (this.tokenId === undefined) { + return new Error('tokenId is required') + } + if (!this.operator) { + return new Error('operator address is required') + } + return undefined + } +} + +export class Erc1155BalancePrecondition implements Precondition { + constructor( + public readonly address: Address.Address, + public readonly token: Address.Address, + public readonly tokenId: bigint, + public readonly min?: bigint, + public readonly max?: bigint, + ) {} + + type(): string { + return 'erc1155-balance' + } + + isValid(): Error | undefined { + if (!this.address) { + return new Error('address is required') + } + if (!this.token) { + return new Error('token address is required') + } + if (this.tokenId === undefined) { + return new Error('tokenId is required') + } + if (this.min !== undefined && this.max !== undefined && this.min > this.max) { + return new Error('min balance cannot be greater than max balance') + } + return undefined + } +} + +export class Erc1155ApprovalPrecondition implements Precondition { + constructor( + public readonly address: Address.Address, + public readonly token: Address.Address, + public readonly tokenId: bigint, + public readonly operator: Address.Address, + public readonly min: bigint, + ) {} + + type(): string { + return 'erc1155-approval' + } + + isValid(): Error | undefined { + if (!this.address) { + return new Error('address is required') + } + if (!this.token) { + return new Error('token address is required') + } + if (this.tokenId === undefined) { + return new Error('tokenId is required') + } + if (!this.operator) { + return new Error('operator address is required') + } + if (this.min === undefined) { + return new Error('min approval amount is required') + } + return undefined + } +} diff --git a/packages/wallet/core/src/relayer/abi.ts b/packages/wallet/core/src/relayer/abi.ts new file mode 100644 index 000000000..ccd965a81 --- /dev/null +++ b/packages/wallet/core/src/relayer/abi.ts @@ -0,0 +1,13 @@ +import { AbiFunction } from 'ox' + +// ERC20 ABI functions +export const erc20BalanceOf = AbiFunction.from('function balanceOf(address) returns (uint256)') +export const erc20Allowance = AbiFunction.from('function allowance(address,address) returns (uint256)') + +// ERC721 ABI functions +export const erc721OwnerOf = AbiFunction.from('function ownerOf(uint256) returns (address)') +export const erc721GetApproved = AbiFunction.from('function getApproved(uint256) returns (address)') + +// ERC1155 ABI functions +export const erc1155BalanceOf = AbiFunction.from('function balanceOf(address,uint256) returns (uint256)') +export const erc1155IsApprovedForAll = AbiFunction.from('function isApprovedForAll(address,address) returns (bool)') diff --git a/packages/wallet/core/src/relayer/index.ts b/packages/wallet/core/src/relayer/index.ts index a24cdf3fd..a6edf0700 100644 --- a/packages/wallet/core/src/relayer/index.ts +++ b/packages/wallet/core/src/relayer/index.ts @@ -1,4 +1,4 @@ export * from './relayer.js' export * as Local from './local.js' export * as Pk from './pk-relayer.js' -export * as Sequence from './sequence.js' +export * as Rpc from './rpc/index.js' diff --git a/packages/wallet/core/src/relayer/local.ts b/packages/wallet/core/src/relayer/local.ts index e55cd1ba9..6202626d3 100644 --- a/packages/wallet/core/src/relayer/local.ts +++ b/packages/wallet/core/src/relayer/local.ts @@ -1,11 +1,23 @@ import { Constants, Payload } from '@0xsequence/wallet-primitives' import { AbiFunction, Address, Bytes, Hex, TransactionReceipt } from 'ox' import { FeeOption, FeeQuote, OperationStatus, Relayer } from './relayer.js' +import { IntentPrecondition } from './rpc/relayer.gen.js' +import { decodePrecondition } from '../preconditions/index.js' +import { + erc20BalanceOf, + erc20Allowance, + erc721OwnerOf, + erc721GetApproved, + erc1155BalanceOf, + erc1155IsApprovedForAll, +} from './abi.js' type GenericProviderTransactionReceipt = 'success' | 'failed' | 'unknown' export interface GenericProvider { sendTransaction(args: { to: string; data: string }, chainId: bigint): Promise + getBalance(address: string): Promise + call(args: { to: string; data: string }): Promise getTransactionReceipt(txHash: string, chainId: bigint): Promise } @@ -60,6 +72,19 @@ export class LocalRelayer implements Relayer { }) return tx }, + getBalance: async (address) => { + const balance = await eth.request({ + method: 'eth_getBalance', + params: [address, 'latest'], + }) + return BigInt(balance) + }, + call: async (args) => { + return await eth.request({ + method: 'eth_call', + params: [args, 'latest'], + }) + }, getTransactionReceipt: async (txHash, chainId) => { await trySwitchChain(chainId) @@ -99,17 +124,85 @@ export class LocalRelayer implements Relayer { return Payload.decode(Bytes.fromHex(packedPayload)) } - async relay(to: Address.Address, data: Hex.Hex, chainId: bigint, _?: FeeQuote): Promise<{ opHash: Hex.Hex }> { - const txHash = await this.provider.sendTransaction( - { - to, - data, - }, - chainId, - ) - Hex.assert(txHash) + async relay( + to: Address.Address, + data: Hex.Hex, + chainId: bigint, + quote?: FeeQuote, + preconditions?: IntentPrecondition[], + checkInterval: number = 5000, + ): Promise<{ opHash: Hex.Hex }> { + // Helper function to check all preconditions + const checkAllPreconditions = async (): Promise => { + if (!preconditions || preconditions.length === 0) { + return true + } + + for (const precondition of preconditions) { + const isValid = await this.checkPrecondition(precondition) + if (!isValid) { + return false + } + } + return true + } + + // Check preconditions immediately + if (await checkAllPreconditions()) { + // If all preconditions are met, relay the transaction + const hash = Payload.hash(to, chainId, this.decodeCalls(data)) + await this.provider.sendTransaction( + { + to, + data, + }, + chainId, + ) + return { opHash: Hex.fromBytes(hash) } + } + + // If not all preconditions are met, set up event listeners and polling + return new Promise((resolve, reject) => { + let timeoutId: NodeJS.Timeout + let isResolved = false - return { opHash: txHash } + // Function to check and relay + const checkAndRelay = async () => { + try { + if (isResolved) return + + if (await checkAllPreconditions()) { + isResolved = true + clearTimeout(timeoutId) + const hash = Payload.hash(to, chainId, this.decodeCalls(data)) + await this.provider.sendTransaction( + { + to, + data, + }, + chainId, + ) + resolve({ opHash: Hex.fromBytes(hash) }) + } else { + // Schedule next check + timeoutId = setTimeout(checkAndRelay, checkInterval) + } + } catch (error) { + isResolved = true + clearTimeout(timeoutId) + reject(error) + } + } + + // Start checking + timeoutId = setTimeout(checkAndRelay, checkInterval) + + // Cleanup function + return () => { + isResolved = true + clearTimeout(timeoutId) + } + }) } async status(opHash: Hex.Hex, chainId: bigint): Promise { @@ -122,4 +215,110 @@ export class LocalRelayer implements Relayer { ? { status: 'confirmed', transactionHash: opHash } : { status: 'failed', reason: 'failed' } } + + async checkPrecondition(precondition: IntentPrecondition): Promise { + const decoded = decodePrecondition(precondition) + + if (!decoded) { + return false + } + + switch (decoded.type()) { + case 'native-balance': { + const native = decoded as any + const balance = await this.provider.getBalance(native.address.toString()) + if (native.min !== undefined && balance < native.min) { + return false + } + if (native.max !== undefined && balance > native.max) { + return false + } + return true + } + + case 'erc20-balance': { + const erc20 = decoded as any + const data = AbiFunction.encodeData(erc20BalanceOf, [erc20.address.toString()]) + const result = await this.provider.call({ + to: erc20.token.toString(), + data, + }) + const balance = BigInt(result) + if (erc20.min !== undefined && balance < erc20.min) { + return false + } + if (erc20.max !== undefined && balance > erc20.max) { + return false + } + return true + } + + case 'erc20-approval': { + const erc20 = decoded as any + const data = AbiFunction.encodeData(erc20Allowance, [erc20.address.toString(), erc20.operator.toString()]) + const result = await this.provider.call({ + to: erc20.token.toString(), + data, + }) + const allowance = BigInt(result) + return allowance >= erc20.min + } + + case 'erc721-ownership': { + const erc721 = decoded as any + const data = AbiFunction.encodeData(erc721OwnerOf, [erc721.tokenId]) + const result = await this.provider.call({ + to: erc721.token.toString(), + data, + }) + const owner = '0x' + result.slice(26) + const isOwner = owner.toLowerCase() === erc721.address.toString().toLowerCase() + return erc721.owned === undefined ? isOwner : erc721.owned === isOwner + } + + case 'erc721-approval': { + const erc721 = decoded as any + const data = AbiFunction.encodeData(erc721GetApproved, [erc721.tokenId]) + const result = await this.provider.call({ + to: erc721.token.toString(), + data, + }) + const approved = '0x' + result.slice(26) + return approved.toLowerCase() === erc721.operator.toString().toLowerCase() + } + + case 'erc1155-balance': { + const erc1155 = decoded as any + const data = AbiFunction.encodeData(erc1155BalanceOf, [erc1155.address.toString(), erc1155.tokenId]) + const result = await this.provider.call({ + to: erc1155.token.toString(), + data, + }) + const balance = BigInt(result) + if (erc1155.min !== undefined && balance < erc1155.min) { + return false + } + if (erc1155.max !== undefined && balance > erc1155.max) { + return false + } + return true + } + + case 'erc1155-approval': { + const erc1155 = decoded as any + const data = AbiFunction.encodeData(erc1155IsApprovedForAll, [ + erc1155.address.toString(), + erc1155.operator.toString(), + ]) + const result = await this.provider.call({ + to: erc1155.token.toString(), + data, + }) + return BigInt(result) === 1n + } + + default: + return false + } + } } diff --git a/packages/wallet/core/src/relayer/pk-relayer.ts b/packages/wallet/core/src/relayer/pk-relayer.ts index 86e32a6f9..b310bd7a4 100644 --- a/packages/wallet/core/src/relayer/pk-relayer.ts +++ b/packages/wallet/core/src/relayer/pk-relayer.ts @@ -1,4 +1,4 @@ -import { Payload } from '@0xsequence/wallet-primitives' +import { Payload, Precondition } from '@0xsequence/wallet-primitives' import { Address, Hex, Provider, Secp256k1, TransactionEnvelopeEip1559, TransactionReceipt } from 'ox' import { LocalRelayer } from './local.js' import { FeeOption, FeeQuote, OperationStatus, Relayer } from './relayer.js' @@ -70,6 +70,17 @@ export class PkRelayer implements Relayer { }) return tx }, + getBalance: async (address: string): Promise => { + const balanceHex = await this.provider.request({ + method: 'eth_getBalance', + params: [address as Address.Address, 'latest'], + }) + return BigInt(balanceHex) + }, + call: async (args: { to: string; data: string }): Promise => { + const callArgs = { to: args.to as `0x${string}`, data: args.data as `0x${string}` } + return await this.provider.request({ method: 'eth_call', params: [callArgs, 'latest'] }) + }, getTransactionReceipt: async (txHash: string, chainId: bigint) => { Hex.assert(txHash) @@ -107,4 +118,9 @@ export class PkRelayer implements Relayer { status(opHash: Hex.Hex, chainId: bigint): Promise { return this.relayer.status(opHash, chainId) } + + async checkPrecondition(precondition: Precondition.Precondition): Promise { + // TODO: Implement precondition check + return true + } } diff --git a/packages/wallet/core/src/relayer/relayer.ts b/packages/wallet/core/src/relayer/relayer.ts index dd38ceff9..4f1881500 100644 --- a/packages/wallet/core/src/relayer/relayer.ts +++ b/packages/wallet/core/src/relayer/relayer.ts @@ -1,5 +1,6 @@ -import { Payload } from '@0xsequence/wallet-primitives' +import { Payload, Precondition } from '@0xsequence/wallet-primitives' import { Address, Hex } from 'ox' +import { GetMetaTxnReceiptReturn } from './rpc/index.js' export interface FeeOption { token: Address.Address @@ -13,27 +14,44 @@ export interface FeeQuote { _quote: unknown } -export type OperationUknownStatus = { +export type OperationUnknownStatus = { status: 'unknown' + reason?: string +} + +export type OperationQueuedStatus = { + status: 'queued' + reason?: string } export type OperationPendingStatus = { status: 'pending' + reason?: string +} + +export type OperationPendingPreconditionStatus = { + status: 'pending-precondition' + reason?: string } export type OperationConfirmedStatus = { status: 'confirmed' transactionHash: Hex.Hex + data?: GetMetaTxnReceiptReturn } export type OperationFailedStatus = { status: 'failed' + transactionHash?: Hex.Hex reason: string + data?: GetMetaTxnReceiptReturn } export type OperationStatus = - | OperationUknownStatus + | OperationUnknownStatus + | OperationQueuedStatus | OperationPendingStatus + | OperationPendingPreconditionStatus | OperationConfirmedStatus | OperationFailedStatus @@ -49,4 +67,6 @@ export interface Relayer { relay(to: Address.Address, data: Hex.Hex, chainId: bigint, quote?: FeeQuote): Promise<{ opHash: Hex.Hex }> status(opHash: Hex.Hex, chainId: bigint): Promise + + checkPrecondition(precondition: Precondition.Precondition): Promise } diff --git a/packages/wallet/core/src/relayer/rpc/index.ts b/packages/wallet/core/src/relayer/rpc/index.ts new file mode 100644 index 000000000..307ca95e3 --- /dev/null +++ b/packages/wallet/core/src/relayer/rpc/index.ts @@ -0,0 +1,374 @@ +import { + Relayer as GenRelayer, + SendMetaTxnReturn as RpcSendMetaTxnReturn, + MetaTxn as RpcMetaTxn, + FeeTokenType, + IntentPrecondition, + GetMetaTxnReceiptReturn, +} from './relayer.gen.js' +import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../relayer.js' +import { Address, Hex, Bytes, AbiFunction } from 'ox' +import { Payload, Precondition as PrimitivePrecondition } from '@0xsequence/wallet-primitives' +import { + IntentPrecondition as RpcIntentPrecondition, + ETHTxnStatus, + FeeOption as RpcFeeOption, + FeeToken as RpcFeeToken, +} from './relayer.gen.js' +import { decodePrecondition } from '../../preconditions/index.js' +import { + erc20BalanceOf, + erc20Allowance, + erc721OwnerOf, + erc721GetApproved, + erc1155BalanceOf, + erc1155IsApprovedForAll, +} from '../abi.js' +import { PublicClient, createPublicClient, http, Chain } from 'viem' +import * as chains from 'viem/chains' + +export * from './relayer.gen.js' + +export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise + +export const getChain = (chainId: number): Chain => { + const chain = Object.values(chains).find((c: any) => typeof c === 'object' && 'id' in c && c.id === chainId) + if (!chain) { + throw new Error(`Chain with id ${chainId} not found`) + } + return chain as Chain +} + +export class RpcRelayer implements Relayer { + public readonly id: string + private client: GenRelayer + private fetch: Fetch + private provider: PublicClient + + constructor(hostname: string, chainId: number, rpcUrl: string, fetchImpl?: Fetch) { + this.id = `rpc:${hostname}` + const effectiveFetch = fetchImpl || (typeof window !== 'undefined' ? window.fetch.bind(window) : undefined) + if (!effectiveFetch) { + throw new Error('Fetch implementation is required but not available in this environment.') + } + this.fetch = effectiveFetch + this.client = new GenRelayer(hostname, this.fetch) + + // Get the chain from the chainId + const chain = getChain(chainId) + + // Create viem PublicClient with the provided RPC URL + this.provider = createPublicClient({ + chain, + transport: http(rpcUrl), + }) + } + + async feeOptions( + wallet: Address.Address, + chainId: bigint, + calls: Payload.Call[], + ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> { + const callsStruct: Payload.Calls = { type: 'call', space: 0n, nonce: 0n, calls: calls } + const data = Payload.encode(callsStruct) + + try { + const result = await this.client.feeOptions({ + wallet: wallet, + to: wallet, + data: Bytes.toHex(data), + }) + + const options = result.options.map(this.mapRpcFeeOptionToFeeOption) + const quote = result.quote ? ({ _tag: 'FeeQuote', _quote: result.quote } as FeeQuote) : undefined + + return { options, quote } + } catch (e) { + console.warn('RpcRelayer.feeOptions failed:', e) + return { options: [] } + } + } + + async sendMetaTxn( + walletAddress: Address.Address, + to: Address.Address, + data: Hex.Hex, + chainId: bigint, + quote?: FeeQuote, + preconditions?: IntentPrecondition[], + ): Promise<{ opHash: Hex.Hex }> { + console.log('sendMetaTxn', walletAddress, to, data, chainId, quote, preconditions) + const rpcCall: RpcMetaTxn = { + walletAddress: walletAddress, + contract: to, + input: data, + } + + const result: RpcSendMetaTxnReturn = await this.client.sendMetaTxn({ + call: rpcCall, + quote: quote ? JSON.stringify(quote._quote) : undefined, + preconditions: preconditions, + }) + + if (!result.status) { + console.error('RpcRelayer.relay failed', result) + throw new Error(`Relay failed: TxnHash ${result.txnHash}`) + } + + return { opHash: Hex.fromString(result.txnHash) } + } + + async relay( + to: Address.Address, + data: Hex.Hex, + chainId: bigint, + quote?: FeeQuote, + preconditions?: IntentPrecondition[], + ): Promise<{ opHash: Hex.Hex }> { + console.log('relay', to, data, chainId, quote, preconditions) + const rpcCall: RpcMetaTxn = { + walletAddress: to, + contract: to, + input: data, + } + + const result: RpcSendMetaTxnReturn = await this.client.sendMetaTxn({ + call: rpcCall, + quote: quote ? JSON.stringify(quote._quote) : undefined, + preconditions: preconditions, + }) + + if (!result.status) { + console.error('RpcRelayer.relay failed', result) + throw new Error(`Relay failed: TxnHash ${result.txnHash}`) + } + + return { opHash: Hex.fromString(result.txnHash) } + } + + async status(opHash: Hex.Hex, chainId: bigint): Promise { + try { + const cleanedOpHash = opHash.startsWith('0x') ? opHash.substring(2) : opHash + const result = await this.client.getMetaTxnReceipt({ metaTxID: cleanedOpHash }) + const receipt = result.receipt + + if (!receipt) { + console.warn(`RpcRelayer.status: receipt not found for opHash ${opHash}`) + return { status: 'unknown' } + } + + if (!receipt.status) { + console.warn(`RpcRelayer.status: receipt status not found for opHash ${opHash}`) + return { status: 'unknown' } + } + + switch (receipt.status as ETHTxnStatus) { + case ETHTxnStatus.QUEUED: + case ETHTxnStatus.PENDING_PRECONDITION: + case ETHTxnStatus.SENT: + return { status: 'pending' } + case ETHTxnStatus.SUCCEEDED: + return { status: 'confirmed', transactionHash: receipt.txnHash as Hex.Hex, data: result } + case ETHTxnStatus.FAILED: + case ETHTxnStatus.PARTIALLY_FAILED: + return { + status: 'failed', + transactionHash: receipt.txnHash ? (receipt.txnHash as Hex.Hex) : undefined, + reason: receipt.revertReason || 'Relayer reported failure', + data: result, + } + case ETHTxnStatus.DROPPED: + return { status: 'failed', reason: 'Transaction dropped' } + case ETHTxnStatus.UNKNOWN: + default: + return { status: 'unknown' } + } + } catch (error) { + console.error(`RpcRelayer.status failed for opHash ${opHash}:`, error) + return { status: 'failed', reason: 'Failed to fetch status' } + } + } + + async checkPrecondition(precondition: IntentPrecondition): Promise { + const decoded = decodePrecondition(precondition) + + if (!decoded) { + return false + } + + switch (decoded.type()) { + case 'native-balance': { + const native = decoded as any + try { + const balance = await this.provider.getBalance({ address: native.address.toString() as `0x${string}` }) + const minWei = native.min !== undefined ? BigInt(native.min) : undefined + const maxWei = native.max !== undefined ? BigInt(native.max) : undefined + + if (minWei !== undefined && maxWei !== undefined) { + return balance >= minWei && balance <= maxWei + } + if (minWei !== undefined) { + return balance >= minWei + } + if (maxWei !== undefined) { + return balance <= maxWei + } + // If no min or max specified, this is an invalid precondition + console.warn('Native balance precondition has neither min nor max specified') + return false + } catch (error) { + console.error('Error checking native balance:', error) + return false + } + } + + case 'erc20-balance': { + const erc20 = decoded as any + try { + const data = AbiFunction.encodeData(erc20BalanceOf, [erc20.address.toString()]) + const result = await this.provider.call({ + to: erc20.token.toString() as `0x${string}`, + data: data as `0x${string}`, + }) + const balance = BigInt(result.toString()) + const minWei = erc20.min !== undefined ? BigInt(erc20.min) : undefined + const maxWei = erc20.max !== undefined ? BigInt(erc20.max) : undefined + + if (minWei !== undefined && maxWei !== undefined) { + return balance >= minWei && balance <= maxWei + } + if (minWei !== undefined) { + return balance >= minWei + } + if (maxWei !== undefined) { + return balance <= maxWei + } + console.warn('ERC20 balance precondition has neither min nor max specified') + return false + } catch (error) { + console.error('Error checking ERC20 balance:', error) + return false + } + } + + case 'erc20-approval': { + const erc20 = decoded as any + try { + const data = AbiFunction.encodeData(erc20Allowance, [erc20.address.toString(), erc20.operator.toString()]) + const result = await this.provider.call({ + to: erc20.token.toString() as `0x${string}`, + data: data as `0x${string}`, + }) + const allowance = BigInt(result.toString()) + const minAllowance = BigInt(erc20.min) + return allowance >= minAllowance + } catch (error) { + console.error('Error checking ERC20 approval:', error) + return false + } + } + + case 'erc721-ownership': { + const erc721 = decoded as any + try { + const data = AbiFunction.encodeData(erc721OwnerOf, [erc721.tokenId]) + const result = await this.provider.call({ + to: erc721.token.toString() as `0x${string}`, + data: data as `0x${string}`, + }) + const resultHex = result.toString() as `0x${string}` + const owner = resultHex.slice(-40) + const isOwner = owner.toLowerCase() === erc721.address.toString().slice(2).toLowerCase() + const expectedOwnership = erc721.owned !== undefined ? erc721.owned : true + return isOwner === expectedOwnership + } catch (error) { + console.error('Error checking ERC721 ownership:', error) + return false + } + } + + case 'erc721-approval': { + const erc721 = decoded as any + try { + const data = AbiFunction.encodeData(erc721GetApproved, [erc721.tokenId]) + const result = await this.provider.call({ + to: erc721.token.toString() as `0x${string}`, + data: data as `0x${string}`, + }) + const resultHex = result.toString() as `0x${string}` + const approved = resultHex.slice(-40) + return approved.toLowerCase() === erc721.operator.toString().slice(2).toLowerCase() + } catch (error) { + console.error('Error checking ERC721 approval:', error) + return false + } + } + + case 'erc1155-balance': { + const erc1155 = decoded as any + try { + const data = AbiFunction.encodeData(erc1155BalanceOf, [erc1155.address.toString(), erc1155.tokenId]) + const result = await this.provider.call({ + to: erc1155.token.toString() as `0x${string}`, + data: data as `0x${string}`, + }) + const balance = BigInt(result.toString()) + const minWei = erc1155.min !== undefined ? BigInt(erc1155.min) : undefined + const maxWei = erc1155.max !== undefined ? BigInt(erc1155.max) : undefined + + if (minWei !== undefined && maxWei !== undefined) { + return balance >= minWei && balance <= maxWei + } + if (minWei !== undefined) { + return balance >= minWei + } + if (maxWei !== undefined) { + return balance <= maxWei + } + console.warn('ERC1155 balance precondition has neither min nor max specified') + return false + } catch (error) { + console.error('Error checking ERC1155 balance:', error) + return false + } + } + + case 'erc1155-approval': { + const erc1155 = decoded as any + try { + const data = AbiFunction.encodeData(erc1155IsApprovedForAll, [ + erc1155.address.toString(), + erc1155.operator.toString(), + ]) + const result = await this.provider.call({ + to: erc1155.token.toString() as `0x${string}`, + data: data as `0x${string}`, + }) + return BigInt(result.toString()) === 1n + } catch (error) { + console.error('Error checking ERC1155 approval:', error) + return false + } + } + + default: + return false + } + } + + private mapRpcFeeOptionToFeeOption(rpcOption: RpcFeeOption): FeeOption { + return { + token: this.mapRpcFeeTokenToAddress(rpcOption.token), + to: rpcOption.to, + value: rpcOption.value, + gasLimit: rpcOption.gasLimit, + } + } + + private mapRpcFeeTokenToAddress(rpcToken: RpcFeeToken): Address.Address { + if (rpcToken.type === FeeTokenType.ERC20_TOKEN && rpcToken.contractAddress) { + return Address.from(rpcToken.contractAddress) + } + return '0x0000000000000000000000000000000000000000' + } +} diff --git a/packages/wallet/core/src/relayer/rpc/relayer.gen.ts b/packages/wallet/core/src/relayer/rpc/relayer.gen.ts new file mode 100644 index 000000000..27d0bc315 --- /dev/null +++ b/packages/wallet/core/src/relayer/rpc/relayer.gen.ts @@ -0,0 +1,1920 @@ +/* eslint-disable */ +// sequence-relayer v0.4.1 62dd019c839b6a47985cf41ce45822de8b3e4896 +// -- +// Code generated by webrpc-gen@v0.24.0 with typescript generator. DO NOT EDIT. +// +// webrpc-gen -schema=relayer.ridl -target=typescript -client -out=./clients/relayer.gen.ts + +export const WebrpcHeader = 'Webrpc' + +export const WebrpcHeaderValue = 'webrpc@v0.24.0;gen-typescript@v0.16.3;sequence-relayer@v0.4.1' + +// WebRPC description and code-gen version +export const WebRPCVersion = 'v1' + +// Schema version of your RIDL schema +export const WebRPCSchemaVersion = 'v0.4.1' + +// Schema hash generated from your RIDL schema +export const WebRPCSchemaHash = '62dd019c839b6a47985cf41ce45822de8b3e4896' + +type WebrpcGenVersions = { + webrpcGenVersion: string + codeGenName: string + codeGenVersion: string + schemaName: string + schemaVersion: string +} + +export function VersionFromHeader(headers: Headers): WebrpcGenVersions { + const headerValue = headers.get(WebrpcHeader) + if (!headerValue) { + return { + webrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } + } + + return parseWebrpcGenVersions(headerValue) +} + +function parseWebrpcGenVersions(header: string): WebrpcGenVersions { + const versions = header.split(';') + if (versions.length < 3) { + return { + webrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } + } + + const [_, webrpcGenVersion] = versions[0]!.split('@') + const [codeGenName, codeGenVersion] = versions[1]!.split('@') + const [schemaName, schemaVersion] = versions[2]!.split('@') + + return { + webrpcGenVersion: webrpcGenVersion ?? '', + codeGenName: codeGenName ?? '', + codeGenVersion: codeGenVersion ?? '', + schemaName: schemaName ?? '', + schemaVersion: schemaVersion ?? '', + } +} + +// +// Types +// + +export enum ETHTxnStatus { + UNKNOWN = 'UNKNOWN', + DROPPED = 'DROPPED', + QUEUED = 'QUEUED', + SENT = 'SENT', + SUCCEEDED = 'SUCCEEDED', + PARTIALLY_FAILED = 'PARTIALLY_FAILED', + FAILED = 'FAILED', + PENDING_PRECONDITION = 'PENDING_PRECONDITION', +} + +export enum TransferType { + SEND = 'SEND', + RECEIVE = 'RECEIVE', + BRIDGE_DEPOSIT = 'BRIDGE_DEPOSIT', + BRIDGE_WITHDRAW = 'BRIDGE_WITHDRAW', + BURN = 'BURN', + UNKNOWN = 'UNKNOWN', +} + +export enum FeeTokenType { + UNKNOWN = 'UNKNOWN', + ERC20_TOKEN = 'ERC20_TOKEN', + ERC1155_TOKEN = 'ERC1155_TOKEN', +} + +export enum SortOrder { + DESC = 'DESC', + ASC = 'ASC', +} + +export interface Version { + webrpcVersion: string + schemaVersion: string + schemaHash: string + appVersion: string +} + +export interface RuntimeStatus { + healthOK: boolean + startTime: string + uptime: number + ver: string + branch: string + commitHash: string + chainID: number + useEIP1559: boolean + senders: Array + checks: RuntimeChecks +} + +export interface SenderStatus { + index: number + address: string + etherBalance: number + active: boolean +} + +export interface RuntimeChecks {} + +export interface SequenceContext { + factory: string + mainModule: string + mainModuleUpgradable: string + guestModule: string + utils: string +} + +export interface GasTank { + id: number + chainId: number + name: string + currentBalance: number + unlimited: boolean + feeMarkupFactor: number + updatedAt: string + createdAt: string +} + +export interface GasTankBalanceAdjustment { + gasTankId: number + nonce: number + amount: number + totalBalance: number + balanceTimestamp: string + createdAt: string +} + +export interface GasSponsor { + id: number + gasTankId: number + projectId: number + chainId: number + address: string + name: string + active: boolean + updatedAt: string + createdAt: string + deletedAt: string +} + +export interface GasSponsorUsage { + name: string + id: number + totalGasUsed: number + totalTxnFees: number + totalTxnFeesUsd: number + avgGasPrice: number + totalTxns: number + startTime: string + endTime: string +} + +export interface MetaTxn { + walletAddress: string + contract: string + input: string +} + +export interface MetaTxnLog { + id: number + chainId: number + projectId: number + txnHash: string + txnNonce: string + metaTxnID?: string + txnStatus: ETHTxnStatus + txnRevertReason: string + requeues: number + queuedAt: string + sentAt: string + minedAt: string + target: string + input: string + txnArgs: { [key: string]: any } + txnReceipt?: { [key: string]: any } + walletAddress: string + metaTxnNonce: string + gasLimit: number + gasPrice: string + gasUsed: number + gasEstimated: number + gasFeeMarkup?: number + usdRate: string + creditsUsed: number + cost: string + isWhitelisted: boolean + gasSponsor?: number + gasTank?: number + updatedAt: string + createdAt: string +} + +export interface MetaTxnReceipt { + id: string + status: string + revertReason?: string + index: number + logs: Array + receipts: Array + blockNumber: string + txnHash: string + txnReceipt: string +} + +export interface MetaTxnReceiptLog { + address: string + topics: Array + data: string +} + +export interface IntentPrecondition { + type: string + chainId: string + data: any +} + +export interface IntentSolution { + transactions: Array +} + +export interface Transactions { + chainID: string + transactions: Array + preconditions?: Array +} + +export interface Transaction { + delegateCall: boolean + revertOnError: boolean + gasLimit: string + target: string + value: string + data: string +} + +export interface TxnLogUser { + username: string +} + +export interface TxnLogTransfer { + transferType: TransferType + contractAddress: string + from: string + to: string + ids: Array + amounts: Array +} + +export interface SentTransactionsFilter { + pending?: boolean + failed?: boolean +} + +export interface SimulateResult { + executed: boolean + succeeded: boolean + result?: string + reason?: string + gasUsed: number + gasLimit: number +} + +export interface FeeOption { + token: FeeToken + to: string + value: string + gasLimit: number +} + +export interface FeeToken { + chainId: number + name: string + symbol: string + type: FeeTokenType + decimals?: number + logoURL: string + contractAddress?: string + tokenID?: string +} + +export interface Page { + pageSize?: number + page?: number + more?: boolean + totalRecords?: number + column?: string + before?: any + after?: any + sort?: Array +} + +export interface SortBy { + column: string + order: SortOrder +} + +export interface Relayer { + ping(headers?: object, signal?: AbortSignal): Promise + version(headers?: object, signal?: AbortSignal): Promise + runtimeStatus(headers?: object, signal?: AbortSignal): Promise + getSequenceContext(headers?: object, signal?: AbortSignal): Promise + getChainID(headers?: object, signal?: AbortSignal): Promise + sendMetaTxn(args: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise + getMetaTxnNonce(args: GetMetaTxnNonceArgs, headers?: object, signal?: AbortSignal): Promise + getMetaTxnReceipt( + args: GetMetaTxnReceiptArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + simulate(args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise + updateMetaTxnGasLimits( + args: UpdateMetaTxnGasLimitsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + feeTokens(headers?: object, signal?: AbortSignal): Promise + feeOptions(args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise + getMetaTxnNetworkFeeOptions( + args: GetMetaTxnNetworkFeeOptionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getMetaTransactions( + args: GetMetaTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getTransactionCost( + args: GetTransactionCostArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + sentTransactions(args: SentTransactionsArgs, headers?: object, signal?: AbortSignal): Promise + pendingTransactions( + args: PendingTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getGasTank(args: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise + addGasTank(args: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise + updateGasTank(args: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise + nextGasTankBalanceAdjustmentNonce( + args: NextGasTankBalanceAdjustmentNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + adjustGasTankBalance( + args: AdjustGasTankBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getGasTankBalanceAdjustment( + args: GetGasTankBalanceAdjustmentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + listGasTankBalanceAdjustments( + args: ListGasTankBalanceAdjustmentsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + listGasSponsors(args: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise + getGasSponsor(args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + addGasSponsor(args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + updateGasSponsor(args: UpdateGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + removeGasSponsor(args: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + addressGasSponsors( + args: AddressGasSponsorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getProjectBalance( + args: GetProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + adjustProjectBalance( + args: AdjustProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise +} + +export interface PingArgs {} + +export interface PingReturn { + status: boolean +} +export interface VersionArgs {} + +export interface VersionReturn { + version: Version +} +export interface RuntimeStatusArgs {} + +export interface RuntimeStatusReturn { + status: RuntimeStatus +} +export interface GetSequenceContextArgs {} + +export interface GetSequenceContextReturn { + data: SequenceContext +} +export interface GetChainIDArgs {} + +export interface GetChainIDReturn { + chainID: number +} +export interface SendMetaTxnArgs { + call: MetaTxn + quote?: string + projectID?: number + preconditions?: Array +} + +export interface SendMetaTxnReturn { + status: boolean + txnHash: string +} +export interface GetMetaTxnNonceArgs { + walletContractAddress: string + space?: string +} + +export interface GetMetaTxnNonceReturn { + nonce: string +} +export interface GetMetaTxnReceiptArgs { + metaTxID: string +} + +export interface GetMetaTxnReceiptReturn { + receipt: MetaTxnReceipt +} +export interface SimulateArgs { + wallet: string + transactions: string +} + +export interface SimulateReturn { + results: Array +} +export interface UpdateMetaTxnGasLimitsArgs { + walletAddress: string + walletConfig: any + payload: string +} + +export interface UpdateMetaTxnGasLimitsReturn { + payload: string +} +export interface FeeTokensArgs {} + +export interface FeeTokensReturn { + isFeeRequired: boolean + tokens: Array +} +export interface FeeOptionsArgs { + wallet: string + to: string + data: string + simulate?: boolean +} + +export interface FeeOptionsReturn { + options: Array + sponsored: boolean + quote?: string +} +export interface GetMetaTxnNetworkFeeOptionsArgs { + walletConfig: any + payload: string +} + +export interface GetMetaTxnNetworkFeeOptionsReturn { + options: Array +} +export interface GetMetaTransactionsArgs { + projectId: number + page?: Page +} + +export interface GetMetaTransactionsReturn { + page: Page + transactions: Array +} +export interface GetTransactionCostArgs { + projectId: number + from: string + to: string +} + +export interface GetTransactionCostReturn { + cost: number +} +export interface SentTransactionsArgs { + filter?: SentTransactionsFilter + page?: Page +} + +export interface SentTransactionsReturn { + page: Page + transactions: Array +} +export interface PendingTransactionsArgs { + page?: Page +} + +export interface PendingTransactionsReturn { + page: Page + transactions: Array +} +export interface GetGasTankArgs { + id: number +} + +export interface GetGasTankReturn { + gasTank: GasTank +} +export interface AddGasTankArgs { + name: string + feeMarkupFactor: number + unlimited?: boolean +} + +export interface AddGasTankReturn { + status: boolean + gasTank: GasTank +} +export interface UpdateGasTankArgs { + id: number + name?: string + feeMarkupFactor?: number + unlimited?: boolean +} + +export interface UpdateGasTankReturn { + status: boolean + gasTank: GasTank +} +export interface NextGasTankBalanceAdjustmentNonceArgs { + id: number +} + +export interface NextGasTankBalanceAdjustmentNonceReturn { + nonce: number +} +export interface AdjustGasTankBalanceArgs { + id: number + nonce: number + amount: number +} + +export interface AdjustGasTankBalanceReturn { + status: boolean + adjustment: GasTankBalanceAdjustment +} +export interface GetGasTankBalanceAdjustmentArgs { + id: number + nonce: number +} + +export interface GetGasTankBalanceAdjustmentReturn { + adjustment: GasTankBalanceAdjustment +} +export interface ListGasTankBalanceAdjustmentsArgs { + id: number + page?: Page +} + +export interface ListGasTankBalanceAdjustmentsReturn { + page: Page + adjustments: Array +} +export interface ListGasSponsorsArgs { + projectId: number + page?: Page +} + +export interface ListGasSponsorsReturn { + page: Page + gasSponsors: Array +} +export interface GetGasSponsorArgs { + projectId: number + id: number +} + +export interface GetGasSponsorReturn { + gasSponsor: GasSponsor +} +export interface AddGasSponsorArgs { + projectId: number + address: string + name?: string + active?: boolean +} + +export interface AddGasSponsorReturn { + status: boolean + gasSponsor: GasSponsor +} +export interface UpdateGasSponsorArgs { + projectId: number + id: number + name?: string + active?: boolean +} + +export interface UpdateGasSponsorReturn { + status: boolean + gasSponsor: GasSponsor +} +export interface RemoveGasSponsorArgs { + projectId: number + id: number +} + +export interface RemoveGasSponsorReturn { + status: boolean +} +export interface AddressGasSponsorsArgs { + address: string + page?: Page +} + +export interface AddressGasSponsorsReturn { + page: Page + gasSponsors: Array +} +export interface GetProjectBalanceArgs { + projectId: number +} + +export interface GetProjectBalanceReturn { + balance: number +} +export interface AdjustProjectBalanceArgs { + projectId: number + amount: number + identifier: string +} + +export interface AdjustProjectBalanceReturn { + balance: number +} + +// +// Client +// +export class Relayer implements Relayer { + protected hostname: string + protected fetch: Fetch + protected path = '/rpc/Relayer/' + + constructor(hostname: string, fetch: Fetch) { + this.hostname = hostname.replace(/\/*$/, '') + this.fetch = (input: RequestInfo, init?: RequestInit) => fetch(input, init) + } + + private url(name: string): string { + return this.hostname + this.path + name + } + + ping = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + version = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + version: _data.version, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getSequenceContext = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetSequenceContext'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + data: _data.data, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getChainID = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetChainID'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + chainID: _data.chainID, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sendMetaTxn = (args: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('SendMetaTxn'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + txnHash: _data.txnHash, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTxnNonce = ( + args: GetMetaTxnNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTxnNonce'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + nonce: _data.nonce, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTxnReceipt = ( + args: GetMetaTxnReceiptArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTxnReceipt'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + receipt: _data.receipt, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + simulate = (args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Simulate'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + results: >_data.results, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updateMetaTxnGasLimits = ( + args: UpdateMetaTxnGasLimitsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdateMetaTxnGasLimits'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + payload: _data.payload, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + feeTokens = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('FeeTokens'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + isFeeRequired: _data.isFeeRequired, + tokens: >_data.tokens, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + feeOptions = (args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('FeeOptions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + options: >_data.options, + sponsored: _data.sponsored, + quote: _data.quote, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTxnNetworkFeeOptions = ( + args: GetMetaTxnNetworkFeeOptionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTxnNetworkFeeOptions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + options: >_data.options, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTransactions = ( + args: GetMetaTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTransactions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + transactions: >_data.transactions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getTransactionCost = ( + args: GetTransactionCostArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetTransactionCost'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + cost: _data.cost, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sentTransactions = ( + args: SentTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SentTransactions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + transactions: >_data.transactions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + pendingTransactions = ( + args: PendingTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('PendingTransactions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + transactions: >_data.transactions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getGasTank = (args: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetGasTank'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + gasTank: _data.gasTank, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + addGasTank = (args: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('AddGasTank'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasTank: _data.gasTank, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updateGasTank = (args: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('UpdateGasTank'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasTank: _data.gasTank, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + nextGasTankBalanceAdjustmentNonce = ( + args: NextGasTankBalanceAdjustmentNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('NextGasTankBalanceAdjustmentNonce'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + nonce: _data.nonce, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + adjustGasTankBalance = ( + args: AdjustGasTankBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AdjustGasTankBalance'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + adjustment: _data.adjustment, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getGasTankBalanceAdjustment = ( + args: GetGasTankBalanceAdjustmentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetGasTankBalanceAdjustment'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + adjustment: _data.adjustment, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listGasTankBalanceAdjustments = ( + args: ListGasTankBalanceAdjustmentsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListGasTankBalanceAdjustments'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + adjustments: >_data.adjustments, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listGasSponsors = ( + args: ListGasSponsorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListGasSponsors'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + gasSponsors: >_data.gasSponsors, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getGasSponsor = (args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + gasSponsor: _data.gasSponsor, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + addGasSponsor = (args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('AddGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasSponsor: _data.gasSponsor, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updateGasSponsor = ( + args: UpdateGasSponsorArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdateGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasSponsor: _data.gasSponsor, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + removeGasSponsor = ( + args: RemoveGasSponsorArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('RemoveGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + addressGasSponsors = ( + args: AddressGasSponsorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AddressGasSponsors'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + gasSponsors: >_data.gasSponsors, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getProjectBalance = ( + args: GetProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetProjectBalance'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + balance: _data.balance, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + adjustProjectBalance = ( + args: AdjustProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AdjustProjectBalance'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + balance: _data.balance, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } +} + +const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { + const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json' } + reqHeaders[WebrpcHeader] = WebrpcHeaderValue + + return { + method: 'POST', + headers: reqHeaders, + body: JSON.stringify(body || {}), + signal, + } +} + +const buildResponse = (res: Response): Promise => { + return res.text().then((text) => { + let data + try { + data = JSON.parse(text) + } catch (error) { + let message = '' + if (error instanceof Error) { + message = error.message + } + throw WebrpcBadResponseError.new({ + status: res.status, + cause: `JSON.parse(): ${message}: response text: ${text}`, + }) + } + if (!res.ok) { + const code: number = typeof data.code === 'number' ? data.code : 0 + throw (webrpcErrorByCode[code] || WebrpcError).new(data) + } + return data + }) +} + +// +// Errors +// + +export class WebrpcError extends Error { + name: string + code: number + message: string + status: number + cause?: string + + /** @deprecated Use message instead of msg. Deprecated in webrpc v0.11.0. */ + msg: string + + constructor(name: string, code: number, message: string, status: number, cause?: string) { + super(message) + this.name = name || 'WebrpcError' + this.code = typeof code === 'number' ? code : 0 + this.message = message || `endpoint error ${this.code}` + this.msg = this.message + this.status = typeof status === 'number' ? status : 0 + this.cause = cause + Object.setPrototypeOf(this, WebrpcError.prototype) + } + + static new(payload: any): WebrpcError { + return new this(payload.error, payload.code, payload.message || payload.msg, payload.status, payload.cause) + } +} + +// Webrpc errors + +export class WebrpcEndpointError extends WebrpcError { + constructor( + name: string = 'WebrpcEndpoint', + code: number = 0, + message: string = `endpoint error`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcEndpointError.prototype) + } +} + +export class WebrpcRequestFailedError extends WebrpcError { + constructor( + name: string = 'WebrpcRequestFailed', + code: number = -1, + message: string = `request failed`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) + } +} + +export class WebrpcBadRouteError extends WebrpcError { + constructor( + name: string = 'WebrpcBadRoute', + code: number = -2, + message: string = `bad route`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) + } +} + +export class WebrpcBadMethodError extends WebrpcError { + constructor( + name: string = 'WebrpcBadMethod', + code: number = -3, + message: string = `bad method`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) + } +} + +export class WebrpcBadRequestError extends WebrpcError { + constructor( + name: string = 'WebrpcBadRequest', + code: number = -4, + message: string = `bad request`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) + } +} + +export class WebrpcBadResponseError extends WebrpcError { + constructor( + name: string = 'WebrpcBadResponse', + code: number = -5, + message: string = `bad response`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) + } +} + +export class WebrpcServerPanicError extends WebrpcError { + constructor( + name: string = 'WebrpcServerPanic', + code: number = -6, + message: string = `server panic`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) + } +} + +export class WebrpcInternalErrorError extends WebrpcError { + constructor( + name: string = 'WebrpcInternalError', + code: number = -7, + message: string = `internal error`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) + } +} + +export class WebrpcClientDisconnectedError extends WebrpcError { + constructor( + name: string = 'WebrpcClientDisconnected', + code: number = -8, + message: string = `client disconnected`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) + } +} + +export class WebrpcStreamLostError extends WebrpcError { + constructor( + name: string = 'WebrpcStreamLost', + code: number = -9, + message: string = `stream lost`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) + } +} + +export class WebrpcStreamFinishedError extends WebrpcError { + constructor( + name: string = 'WebrpcStreamFinished', + code: number = -10, + message: string = `stream finished`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) + } +} + +// Schema errors + +export class UnauthorizedError extends WebrpcError { + constructor( + name: string = 'Unauthorized', + code: number = 1000, + message: string = `Unauthorized access`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, UnauthorizedError.prototype) + } +} + +export class PermissionDeniedError extends WebrpcError { + constructor( + name: string = 'PermissionDenied', + code: number = 1001, + message: string = `Permission denied`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, PermissionDeniedError.prototype) + } +} + +export class SessionExpiredError extends WebrpcError { + constructor( + name: string = 'SessionExpired', + code: number = 1002, + message: string = `Session expired`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, SessionExpiredError.prototype) + } +} + +export class MethodNotFoundError extends WebrpcError { + constructor( + name: string = 'MethodNotFound', + code: number = 1003, + message: string = `Method not found`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, MethodNotFoundError.prototype) + } +} + +export class RequestConflictError extends WebrpcError { + constructor( + name: string = 'RequestConflict', + code: number = 1004, + message: string = `Conflict with target resource`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, RequestConflictError.prototype) + } +} + +export class AbortedError extends WebrpcError { + constructor( + name: string = 'Aborted', + code: number = 1005, + message: string = `Request aborted`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, AbortedError.prototype) + } +} + +export class GeoblockedError extends WebrpcError { + constructor( + name: string = 'Geoblocked', + code: number = 1006, + message: string = `Geoblocked region`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, GeoblockedError.prototype) + } +} + +export class RateLimitedError extends WebrpcError { + constructor( + name: string = 'RateLimited', + code: number = 1007, + message: string = `Rate-limited. Please slow down.`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, RateLimitedError.prototype) + } +} + +export class ProjectNotFoundError extends WebrpcError { + constructor( + name: string = 'ProjectNotFound', + code: number = 1008, + message: string = `Project not found`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, ProjectNotFoundError.prototype) + } +} + +export class AccessKeyNotFoundError extends WebrpcError { + constructor( + name: string = 'AccessKeyNotFound', + code: number = 1101, + message: string = `Access key not found`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, AccessKeyNotFoundError.prototype) + } +} + +export class AccessKeyMismatchError extends WebrpcError { + constructor( + name: string = 'AccessKeyMismatch', + code: number = 1102, + message: string = `Access key mismatch`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, AccessKeyMismatchError.prototype) + } +} + +export class InvalidOriginError extends WebrpcError { + constructor( + name: string = 'InvalidOrigin', + code: number = 1103, + message: string = `Invalid origin for Access Key`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, InvalidOriginError.prototype) + } +} + +export class InvalidServiceError extends WebrpcError { + constructor( + name: string = 'InvalidService', + code: number = 1104, + message: string = `Service not enabled for Access key`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, InvalidServiceError.prototype) + } +} + +export class UnauthorizedUserError extends WebrpcError { + constructor( + name: string = 'UnauthorizedUser', + code: number = 1105, + message: string = `Unauthorized user`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, UnauthorizedUserError.prototype) + } +} + +export class QuotaExceededError extends WebrpcError { + constructor( + name: string = 'QuotaExceeded', + code: number = 1200, + message: string = `Quota request exceeded`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, QuotaExceededError.prototype) + } +} + +export class QuotaRateLimitError extends WebrpcError { + constructor( + name: string = 'QuotaRateLimit', + code: number = 1201, + message: string = `Quota rate limit exceeded`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, QuotaRateLimitError.prototype) + } +} + +export class NoDefaultKeyError extends WebrpcError { + constructor( + name: string = 'NoDefaultKey', + code: number = 1300, + message: string = `No default access key found`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, NoDefaultKeyError.prototype) + } +} + +export class MaxAccessKeysError extends WebrpcError { + constructor( + name: string = 'MaxAccessKeys', + code: number = 1301, + message: string = `Access keys limit reached`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, MaxAccessKeysError.prototype) + } +} + +export class AtLeastOneKeyError extends WebrpcError { + constructor( + name: string = 'AtLeastOneKey', + code: number = 1302, + message: string = `You need at least one Access Key`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, AtLeastOneKeyError.prototype) + } +} + +export class TimeoutError extends WebrpcError { + constructor( + name: string = 'Timeout', + code: number = 1900, + message: string = `Request timed out`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, TimeoutError.prototype) + } +} + +export class InvalidArgumentError extends WebrpcError { + constructor( + name: string = 'InvalidArgument', + code: number = 2001, + message: string = `Invalid argument`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, InvalidArgumentError.prototype) + } +} + +export class UnavailableError extends WebrpcError { + constructor( + name: string = 'Unavailable', + code: number = 2002, + message: string = `Unavailable resource`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, UnavailableError.prototype) + } +} + +export class QueryFailedError extends WebrpcError { + constructor( + name: string = 'QueryFailed', + code: number = 2003, + message: string = `Query failed`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, QueryFailedError.prototype) + } +} + +export class NotFoundError extends WebrpcError { + constructor( + name: string = 'NotFound', + code: number = 3000, + message: string = `Resource not found`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, NotFoundError.prototype) + } +} + +export class InsufficientFeeError extends WebrpcError { + constructor( + name: string = 'InsufficientFee', + code: number = 3004, + message: string = `Insufficient fee`, + status: number = 0, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, InsufficientFeeError.prototype) + } +} + +export enum errors { + WebrpcEndpoint = 'WebrpcEndpoint', + WebrpcRequestFailed = 'WebrpcRequestFailed', + WebrpcBadRoute = 'WebrpcBadRoute', + WebrpcBadMethod = 'WebrpcBadMethod', + WebrpcBadRequest = 'WebrpcBadRequest', + WebrpcBadResponse = 'WebrpcBadResponse', + WebrpcServerPanic = 'WebrpcServerPanic', + WebrpcInternalError = 'WebrpcInternalError', + WebrpcClientDisconnected = 'WebrpcClientDisconnected', + WebrpcStreamLost = 'WebrpcStreamLost', + WebrpcStreamFinished = 'WebrpcStreamFinished', + Unauthorized = 'Unauthorized', + PermissionDenied = 'PermissionDenied', + SessionExpired = 'SessionExpired', + MethodNotFound = 'MethodNotFound', + RequestConflict = 'RequestConflict', + Aborted = 'Aborted', + Geoblocked = 'Geoblocked', + RateLimited = 'RateLimited', + ProjectNotFound = 'ProjectNotFound', + AccessKeyNotFound = 'AccessKeyNotFound', + AccessKeyMismatch = 'AccessKeyMismatch', + InvalidOrigin = 'InvalidOrigin', + InvalidService = 'InvalidService', + UnauthorizedUser = 'UnauthorizedUser', + QuotaExceeded = 'QuotaExceeded', + QuotaRateLimit = 'QuotaRateLimit', + NoDefaultKey = 'NoDefaultKey', + MaxAccessKeys = 'MaxAccessKeys', + AtLeastOneKey = 'AtLeastOneKey', + Timeout = 'Timeout', + InvalidArgument = 'InvalidArgument', + Unavailable = 'Unavailable', + QueryFailed = 'QueryFailed', + NotFound = 'NotFound', + InsufficientFee = 'InsufficientFee', +} + +export enum WebrpcErrorCodes { + WebrpcEndpoint = 0, + WebrpcRequestFailed = -1, + WebrpcBadRoute = -2, + WebrpcBadMethod = -3, + WebrpcBadRequest = -4, + WebrpcBadResponse = -5, + WebrpcServerPanic = -6, + WebrpcInternalError = -7, + WebrpcClientDisconnected = -8, + WebrpcStreamLost = -9, + WebrpcStreamFinished = -10, + Unauthorized = 1000, + PermissionDenied = 1001, + SessionExpired = 1002, + MethodNotFound = 1003, + RequestConflict = 1004, + Aborted = 1005, + Geoblocked = 1006, + RateLimited = 1007, + ProjectNotFound = 1008, + AccessKeyNotFound = 1101, + AccessKeyMismatch = 1102, + InvalidOrigin = 1103, + InvalidService = 1104, + UnauthorizedUser = 1105, + QuotaExceeded = 1200, + QuotaRateLimit = 1201, + NoDefaultKey = 1300, + MaxAccessKeys = 1301, + AtLeastOneKey = 1302, + Timeout = 1900, + InvalidArgument = 2001, + Unavailable = 2002, + QueryFailed = 2003, + NotFound = 3000, + InsufficientFee = 3004, +} + +export const webrpcErrorByCode: { [code: number]: any } = { + [0]: WebrpcEndpointError, + [-1]: WebrpcRequestFailedError, + [-2]: WebrpcBadRouteError, + [-3]: WebrpcBadMethodError, + [-4]: WebrpcBadRequestError, + [-5]: WebrpcBadResponseError, + [-6]: WebrpcServerPanicError, + [-7]: WebrpcInternalErrorError, + [-8]: WebrpcClientDisconnectedError, + [-9]: WebrpcStreamLostError, + [-10]: WebrpcStreamFinishedError, + [1000]: UnauthorizedError, + [1001]: PermissionDeniedError, + [1002]: SessionExpiredError, + [1003]: MethodNotFoundError, + [1004]: RequestConflictError, + [1005]: AbortedError, + [1006]: GeoblockedError, + [1007]: RateLimitedError, + [1008]: ProjectNotFoundError, + [1101]: AccessKeyNotFoundError, + [1102]: AccessKeyMismatchError, + [1103]: InvalidOriginError, + [1104]: InvalidServiceError, + [1105]: UnauthorizedUserError, + [1200]: QuotaExceededError, + [1201]: QuotaRateLimitError, + [1300]: NoDefaultKeyError, + [1301]: MaxAccessKeysError, + [1302]: AtLeastOneKeyError, + [1900]: TimeoutError, + [2001]: InvalidArgumentError, + [2002]: UnavailableError, + [2003]: QueryFailedError, + [3000]: NotFoundError, + [3004]: InsufficientFeeError, +} + +export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise diff --git a/packages/wallet/core/src/relayer/sequence.ts b/packages/wallet/core/src/relayer/sequence.ts index b7c0619ca..15c9eb44a 100644 --- a/packages/wallet/core/src/relayer/sequence.ts +++ b/packages/wallet/core/src/relayer/sequence.ts @@ -1,4 +1,4 @@ -import { ETHTxnStatus, Relayer as Service } from '@0xsequence/relayer' +import { ETHTxnStatus, IntentPrecondition, Relayer as Service } from '@0xsequence/relayer' import { Payload } from '@0xsequence/wallet-primitives' import { AbiFunction, Address, Bytes, Hex } from 'ox' import { FeeOption, FeeQuote, OperationStatus, Relayer } from './relayer.js' @@ -41,6 +41,11 @@ export class SequenceRelayer implements Relayer { } } + async checkPrecondition(precondition: IntentPrecondition): Promise { + // TODO: implement + return false + } + async relay(to: Address.Address, data: Hex.Hex, _chainId: bigint, quote?: FeeQuote): Promise<{ opHash: Hex.Hex }> { const walletAddress = to // TODO: pass wallet address or stop requiring it diff --git a/packages/wallet/core/test/anypay.test.ts b/packages/wallet/core/test/anypay.test.ts new file mode 100644 index 000000000..7cc0b04d8 --- /dev/null +++ b/packages/wallet/core/test/anypay.test.ts @@ -0,0 +1,1017 @@ +import { Address, Bytes, Provider, Hex, RpcTransport, Secp256k1, AbiFunction, AbiParameters, Hash } from 'ox' +import { Context, Payload } from '@0xsequence/wallet-primitives' +import { LocalRelayer } from '../src/relayer/local' +import { describe, it, expect, vi } from 'vitest' +import { isAddressEqual } from 'viem' +import { + NativeBalancePrecondition, + Erc20BalancePrecondition, + Erc20ApprovalPrecondition, + Erc721OwnershipPrecondition, + Erc721ApprovalPrecondition, + Erc1155BalancePrecondition, + Erc1155ApprovalPrecondition, +} from '../src/preconditions/types' +import { CAN_RUN_LIVE, RPC_URL } from './constants' +import { + calculateIntentConfigurationAddress, + hashIntentParams, + IntentCallsPayload, + AnypayLifiInfo, + getAnypayLifiInfoHash, +} from '../src/anypay/intents' + +const ERC20_IMPLICIT_MINT_CONTRACT = '0x041E0CDC028050519C8e6485B2d9840caf63773F' + +function randomAddress(): Address.Address { + return Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: Secp256k1.randomPrivateKey() })) +} + +describe('AnyPay Preconditions', () => { + const getProvider = async (): Promise<{ provider: Provider.Provider; chainId: bigint }> => { + let provider: Provider.Provider + let chainId = 1n + if (CAN_RUN_LIVE) { + provider = Provider.from(RpcTransport.fromHttp(RPC_URL!!)) + chainId = BigInt(await provider.request({ method: 'eth_chainId' })) + } else { + provider = { + request: vi.fn(), + on: vi.fn(), + removeListener: vi.fn(), + call: vi.fn(), + sendTransaction: vi.fn(), + getBalance: vi.fn(), + } as unknown as Provider.Provider + } + + return { provider: provider!, chainId } + } + + const testWalletAddress = randomAddress() + const testIdentityAddress = randomAddress() + + const requireContractDeployed = async (provider: Provider.Provider, contract: Address.Address) => { + const code = await provider.request({ method: 'eth_getCode', params: [contract, 'latest'] }) + if (code === '0x') { + throw new Error(`Contract ${contract} not deployed`) + } + } + + it('should create and check native balance precondition', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + + const precondition = new NativeBalancePrecondition( + testWalletAddress, + 1000000000000000000n, // 1 ETH min + 2000000000000000000n, // 2 ETH max + ) + + const intentPrecondition = { + type: precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: precondition.address.toString(), + min: precondition.min?.toString(), + max: precondition.max?.toString(), + }), + } + + if (!CAN_RUN_LIVE) { + // Mock the balance check + ;(provider as any).request.mockResolvedValue('0x16345785d8a0000') // 1.5 ETH in hex + } + + const isValid = await relayer.checkPrecondition(intentPrecondition) + expect(isValid).toBe(true) + }) + + it('should create and check ERC20 balance precondition', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + + const precondition = new Erc20BalancePrecondition( + testWalletAddress, + ERC20_IMPLICIT_MINT_CONTRACT, + 1000000n, // 1 token min + 2000000n, // 2 tokens max + ) + + const intentPrecondition = { + type: precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: precondition.address.toString(), + token: precondition.token.toString(), + min: precondition.min?.toString(), + max: precondition.max?.toString(), + }), + } + + if (!CAN_RUN_LIVE) { + // Mock the balanceOf call + ;(provider as any).call.mockResolvedValue('0x1e8480') // 1.5 tokens in hex + } + + const isValid = await relayer.checkPrecondition(intentPrecondition) + expect(isValid).toBe(true) + }) + + it('should create and check ERC20 approval precondition', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + + const operator = randomAddress() + const precondition = new Erc20ApprovalPrecondition( + testWalletAddress, + ERC20_IMPLICIT_MINT_CONTRACT, + operator, + 1000000n, // 1 token min approval + ) + + const intentPrecondition = { + type: precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: precondition.address.toString(), + token: precondition.token.toString(), + operator: precondition.operator.toString(), + min: precondition.min.toString(), + }), + } + + if (!CAN_RUN_LIVE) { + // Mock the allowance call + ;(provider as any).call.mockResolvedValue('0x1e8480') // 1.5 tokens in hex + } + + const isValid = await relayer.checkPrecondition(intentPrecondition) + expect(isValid).toBe(true) + }) + + it('should create and check ERC721 ownership precondition', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + + const precondition = new Erc721OwnershipPrecondition( + testWalletAddress, + ERC20_IMPLICIT_MINT_CONTRACT, + 1n, // tokenId + true, // must own + ) + + const intentPrecondition = { + type: precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: precondition.address.toString(), + token: precondition.token.toString(), + tokenId: precondition.tokenId.toString(), + owned: precondition.owned, + }), + } + + if (!CAN_RUN_LIVE) { + // Mock the ownerOf call + ;(provider as any).call.mockResolvedValue( + '0x000000000000000000000000' + testWalletAddress.toString().slice(2).toLowerCase(), + ) + } + + const isValid = await relayer.checkPrecondition(intentPrecondition) + expect(isValid).toBe(true) + }) + + it('should create and check ERC721 approval precondition', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + + const operator = randomAddress() + const precondition = new Erc721ApprovalPrecondition( + testWalletAddress, + ERC20_IMPLICIT_MINT_CONTRACT, + 1n, // tokenId + operator, + ) + + const intentPrecondition = { + type: precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: precondition.address.toString(), + token: precondition.token.toString(), + tokenId: precondition.tokenId.toString(), + operator: precondition.operator.toString(), + }), + } + + if (!CAN_RUN_LIVE) { + // Mock the getApproved call + ;(provider as any).call.mockResolvedValue( + '0x000000000000000000000000' + operator.toString().slice(2).toLowerCase(), + ) + } + + const isValid = await relayer.checkPrecondition(intentPrecondition) + expect(isValid).toBe(true) + }) + + it('should create and check ERC1155 balance precondition', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + + const precondition = new Erc1155BalancePrecondition( + testWalletAddress, + ERC20_IMPLICIT_MINT_CONTRACT, + 1n, // tokenId + 1000000n, // 1 token min + 2000000n, // 2 tokens max + ) + + const intentPrecondition = { + type: precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: precondition.address.toString(), + token: precondition.token.toString(), + tokenId: precondition.tokenId.toString(), + min: precondition.min?.toString(), + max: precondition.max?.toString(), + }), + } + + if (!CAN_RUN_LIVE) { + // Mock the balanceOf call + ;(provider as any).call.mockResolvedValue('0x1e8480') // 1.5 tokens in hex + } + + const isValid = await relayer.checkPrecondition(intentPrecondition) + expect(isValid).toBe(true) + }) + + it('should create and check ERC1155 approval precondition', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + + const operator = randomAddress() + const precondition = new Erc1155ApprovalPrecondition( + testWalletAddress, + ERC20_IMPLICIT_MINT_CONTRACT, + 1n, // tokenId + operator, + 1000000n, // 1 token min approval + ) + + const intentPrecondition = { + type: precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: precondition.address.toString(), + token: precondition.token.toString(), + tokenId: precondition.tokenId.toString(), + operator: precondition.operator.toString(), + min: precondition.min.toString(), + }), + } + + if (!CAN_RUN_LIVE) { + // Mock the isApprovedForAll call + ;(provider as any).call.mockResolvedValue('0x1') // true + } + + const isValid = await relayer.checkPrecondition(intentPrecondition) + expect(isValid).toBe(true) + }) + + it('should wait for preconditions to be met before relaying transaction', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + + // Create a precondition that initially fails + const precondition = new Erc20BalancePrecondition( + testWalletAddress, + ERC20_IMPLICIT_MINT_CONTRACT, + 1000000n, // 1 token min + ) + + const intentPrecondition = { + type: precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: precondition.address.toString(), + token: precondition.token.toString(), + min: precondition.min?.toString(), + }), + } + + // Mock initial balance check to fail + let currentBalance = 0n + if (!CAN_RUN_LIVE) { + ;(provider as any).call.mockImplementation(() => { + return Bytes.toHex(Bytes.fromNumber(currentBalance)) + }) + } + + // Create a test operation + const payload: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: ERC20_IMPLICIT_MINT_CONTRACT, + value: 0n, + data: '0x' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore', + }, + ], + } + + // Create context + const context: Context.Context = { + factory: randomAddress(), + creationCode: '0x' as Hex.Hex, + stage1: '0x' as Hex.Hex, + stage2: '0x' as Hex.Hex, + } + + // Calculate intent configuration address + const configAddress = calculateIntentConfigurationAddress(testWalletAddress, [payload], context) + + // Start the relay operation with a short check interval + const relayPromise = relayer.relay( + configAddress, + Bytes.toHex( + Payload.encode( + Payload.fromCall(0n, 0n, [ + { + to: ERC20_IMPLICIT_MINT_CONTRACT, + value: 0n, + data: '0x' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore', + }, + ]), + ), + ), + chainId, + undefined, + [intentPrecondition], + 100, // Short check interval for testing + ) + + // Simulate ERC20 transfer by updating the mock balance + if (!CAN_RUN_LIVE) { + currentBalance = 1500000n // Transfer 1.5 tokens + } else { + // In live mode, we would need to actually transfer tokens here + const transferAmount = 1500000n + const erc20Transfer = AbiFunction.from('function transfer(address,uint256) returns (bool)') + const transferData = AbiFunction.encodeData(erc20Transfer, [ + testWalletAddress.toString() as Hex.Hex, + transferAmount, + ]) as Hex.Hex + await provider.request({ + method: 'eth_sendTransaction', + params: [ + { + to: ERC20_IMPLICIT_MINT_CONTRACT, + data: transferData, + }, + ], + }) + } + + // Wait for the relay to complete + const { opHash } = await relayPromise + + expect(opHash).toBeDefined() + expect(opHash).not.toBe('0x') + + // Verify the transaction was sent + if (!CAN_RUN_LIVE) { + expect((provider as any).sendTransaction).toHaveBeenCalledWith( + { + to: configAddress, + data: Bytes.toHex( + Payload.encode( + Payload.fromCall(0n, 0n, [ + { + to: ERC20_IMPLICIT_MINT_CONTRACT, + value: 0n, + data: '0x' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore', + }, + ]), + ), + ), + }, + 1n, + ) + } + }) + + if (CAN_RUN_LIVE) { + it('should create intent configuration with preconditions', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + + // Create a test operation + const payload: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: ERC20_IMPLICIT_MINT_CONTRACT, + value: 0n, + data: '0x' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore', + }, + ], + } + + // Create preconditions + const nativePrecondition = new NativeBalancePrecondition( + testWalletAddress, + 1000000000000000000n, // 1 ETH min + ) + + const erc20Precondition = new Erc20BalancePrecondition( + testWalletAddress, + ERC20_IMPLICIT_MINT_CONTRACT, + 1000000n, // 1 token min + ) + + const intentPreconditions = [ + { + type: nativePrecondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: nativePrecondition.address.toString(), + min: nativePrecondition.min?.toString(), + }), + }, + { + type: erc20Precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: erc20Precondition.address.toString(), + token: erc20Precondition.token.toString(), + min: erc20Precondition.min?.toString(), + }), + }, + ] + + // Create context + const context: Context.Context = { + factory: randomAddress(), + creationCode: Bytes.toHex(Bytes.fromHex('0x')) as Hex.Hex, + stage1: Bytes.toHex(Bytes.fromHex('0x')) as Hex.Hex, + stage2: Bytes.toHex(Bytes.fromHex('0x')) as Hex.Hex, + } + + // Calculate intent configuration address + const configAddress = calculateIntentConfigurationAddress(testWalletAddress, [payload], context) + + expect(configAddress).toBeDefined() + expect(configAddress).not.toBe(testWalletAddress) + + // Check preconditions + for (const precondition of intentPreconditions) { + const isValid = await relayer.checkPrecondition(precondition) + expect(isValid).toBe(true) + } + }) + + it('should relay transaction when preconditions are met', async () => { + const { provider, chainId } = await getProvider() + const relayer = new LocalRelayer(provider as any) + await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + + // Create preconditions + const nativePrecondition = new NativeBalancePrecondition( + testWalletAddress, + 1000000000000000000n, // 1 ETH min + ) + + const erc20Precondition = new Erc20BalancePrecondition( + testWalletAddress, + ERC20_IMPLICIT_MINT_CONTRACT, + 1000000n, // 1 token min + ) + + const intentPreconditions = [ + { + type: nativePrecondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: nativePrecondition.address.toString(), + min: nativePrecondition.min?.toString(), + }), + }, + { + type: erc20Precondition.type(), + chainId: chainId.toString(), + data: JSON.stringify({ + address: erc20Precondition.address.toString(), + token: erc20Precondition.token.toString(), + min: erc20Precondition.min?.toString(), + }), + }, + ] + + // Create a test operation + const payload: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: ERC20_IMPLICIT_MINT_CONTRACT, + value: 0n, + data: '0x' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore', + }, + ], + } + + // Create context + const context: Context.Context = { + factory: randomAddress(), + creationCode: Bytes.toHex(Bytes.fromHex('0x')) as Hex.Hex, + stage1: Bytes.toHex(Bytes.fromHex('0x')) as Hex.Hex, + stage2: Bytes.toHex(Bytes.fromHex('0x')) as Hex.Hex, + } + + // Calculate intent configuration address + const configAddress = calculateIntentConfigurationAddress(testWalletAddress, [payload], context) + + // Mock the provider responses + if (!CAN_RUN_LIVE) { + // Mock native balance check + ;(provider as any).getBalance.mockResolvedValue(1500000000000000000n) // 1.5 ETH + // Mock ERC20 balance check + ;(provider as any).call.mockResolvedValue('0x1e8480') // 1.5 tokens + } + + // Relay transaction with preconditions + const { opHash } = await relayer.relay( + configAddress, + Bytes.toHex(Bytes.fromHex('0x')), + chainId, + undefined, // fee quote + intentPreconditions, + 1000, // check interval in ms + ) + + expect(opHash).toBeDefined() + expect(opHash).not.toBe('0x') + + // Verify the transaction was sent + if (!CAN_RUN_LIVE) { + expect((provider as any).sendTransaction).toHaveBeenCalledWith({ + to: configAddress, + data: '0x' as Hex.Hex, + }) + } + }) + } +}) + +describe('Intent Configuration Address with LifiInfo', () => { + const testContext: Context.Context = { + factory: Address.from('0x0000000000000000000000000000000000000000'), + stage1: '0x0000000000000000000000000000000000000000' as Hex.Hex, // MainModuleAddress + stage2: '0x0000000000000000000000000000000000000000' as Hex.Hex, // guestModule + creationCode: + '0x603e600e3d39601e805130553df33d3d34601c57363d3d373d363d30545af43d82803e903d91601c57fd5bf3' as Hex.Hex, + } + + const mainSigner = Address.from('0x1111111111111111111111111111111111111111') + const attestationSigner = Address.from('0x0000000000000000000000000000000000000001') + + const lifiInfos: AnypayLifiInfo[] = [ + { + originToken: Address.from('0x1111111111111111111111111111111111111111'), + amount: 100n, + originChainId: 1n, + destinationChainId: 10n, + }, + ] + + it('should calculate address for single operation with lifiInfo', () => { + const payload: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: Address.from('0x0000000000000000000000000000000000000000'), + value: 0n, + data: '0x1234' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert' as const, + }, + ], + } + + const address = calculateIntentConfigurationAddress( + mainSigner, + [payload], + testContext, + attestationSigner, + lifiInfos, + ) + + console.log('Single Operation with LifiInfo Test Address:', address) + expect(isAddressEqual(address, '0x820B2237906fEEBdB45a6Be43d33137253Eeeac5')).toBe(true) + }) + + it('should calculate address for multiple operations with lifiInfo', () => { + const payload1: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: Address.from('0x0000000000000000000000000000000000000000'), + value: 0n, + data: '0x1234' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert' as const, + }, + ], + } + + const payload2: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: Address.from('0x0000000000000000000000000000000000000000'), + value: 0n, + data: '0x5678' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert' as const, + }, + ], + } + + const address = calculateIntentConfigurationAddress( + mainSigner, + [payload1, payload2], + testContext, + attestationSigner, + lifiInfos, + ) + + console.log('Multiple Operations with LifiInfo Test Address:', address) + expect(isAddressEqual(address, '0x807f90d703db799F810a43DBcf81B09d7053e8e6')).toBe(true) + }) +}) + +describe('Intent Configuration Address', () => { + it('should calculate address for single operation', () => { + // Create context matching Go test + const context: Context.Context = { + factory: Address.from('0x0000000000000000000000000000000000000000'), + stage1: '0x0000000000000000000000000000000000000000' as Hex.Hex, + stage2: '0x0000000000000000000000000000000000000000' as Hex.Hex, + creationCode: + '0x603e600e3d39601e805130553df33d3d34601c57363d3d373d363d30545af43d82803e903d91601c57fd5bf3' as Hex.Hex, + } + + // Main signer matching Go test + const mainSigner = Address.from('0x1111111111111111111111111111111111111111') + + // Create a single operation matching Go test + const payload: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: Address.from('0x0000000000000000000000000000000000000000'), + value: 0n, + data: Bytes.toHex(Bytes.fromString('data1')) as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore' as const, + }, + ], + } + + // Calculate intent configuration address + const address = calculateIntentConfigurationAddress(mainSigner, [payload], context) + + console.log('address', address) + + // Verify the address matches Go test + expect(isAddressEqual(address, '0x95b51097940ed0f7ed5758bbd828b48e7891ec94')).toBe(true) + }) + + it('should calculate address for multiple operations', () => { + // Create context matching Go test + const context: Context.Context = { + factory: Address.from('0x0000000000000000000000000000000000000000'), + stage1: '0x0000000000000000000000000000000000000000' as Hex.Hex, + stage2: '0x0000000000000000000000000000000000000000' as Hex.Hex, + creationCode: + '0x603e600e3d39601e805130553df33d3d34601c57363d3d373d363d30545af43d82803e903d91601c57fd5bf3' as Hex.Hex, + } + + // Main signer matching Go test + const mainSigner = Address.from('0x1111111111111111111111111111111111111111') + + // Create multiple operations matching Go test + const payload1: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: Address.from('0x0000000000000000000000000000000000000000'), + value: 0n, + data: Bytes.toHex(Bytes.fromString('data1')) as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore' as const, + }, + ], + } + + const payload2: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: Address.from('0x0000000000000000000000000000000000000000'), + value: 0n, + data: Bytes.toHex(Bytes.fromString('data2')) as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore' as const, + }, + ], + } + + // Calculate intent configuration address + const address = calculateIntentConfigurationAddress(mainSigner, [payload1, payload2], context) + + console.log('address', address) + + // Verify the address matches Go test + expect(isAddressEqual(address, '0xdb59510c80765bcc1b70e36b2583786ecb990476')).toBe(true) + }) + + it('should calculate address for multi-chain intent operations', () => { + // Create context + const context: Context.Context = { + factory: '0xBd0F8abD58B4449B39C57Ac9D5C67433239aC447' as `0x${string}`, + stage1: '0x53bA242E7C2501839DF2972c75075dc693176Cd0' as `0x${string}`, + stage2: '0xa29874c88b8Fd557e42219B04b0CeC693e1712f5' as `0x${string}`, + creationCode: + '0x603e600e3d39601e805130553df33d3d34601c57363d3d373d363d30545af43d82803e903d91601c57fd5bf3' as `0x${string}`, + } + + // Main signer + const mainSigner = Address.from('0x8456195dd0793c621c7f9245edF0fEf85b1B879C') + + // Create multi-chain operations + const arbitrumPayload: IntentCallsPayload = { + chainId: 42161n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: Address.from('0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae'), + value: 16618237n, + data: '0xa6010a660000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000005801784da62343d604885e1181a759647447f13330cc2b8c925cda864b1ac1ce8fc000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e58310000000000000000000000008456195dd0793c621c7f9245edf0fef85b1b879c00000000000000000000000000000000000000000000000000000000000073ac000000000000000000000000000000000000000000000000000000000000210500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d737461726761746556324275730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086c6966692d61706900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000111111125421ca6dc452d289314280a0f8842a65000000000000000000000000111111125421ca6dc452d289314280a0f8842a650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e583100000000000000000000000000000000000000000000000000000f42af44fef500000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000020807ed2379000000000000000000000000de9e4fe32b049f821c7f3e9802381aa470ffca73000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831000000000000000000000000de9e4fe32b049f821c7f3e9802381aa470ffca730000000000000000000000001231deb6f5749ef6ce6943a275a1d3e7486f4eae00000000000000000000000000000000000000000000000000000f42af44fef500000000000000000000000000000000000000000000000000000000000075320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000ba00000000000000000000000000000000000000000000000000000000009c4160de632c3a214d5f14c1d8ddf0b92f8bcd188fee4500242668dfaa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007532000000000000000000000000111111125421ca6dc452d289314280a0f8842a650000000000002a94d114000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000077368def90800000000000000000000000000000000000000000000000000000000000000000000000000000000000000008456195dd0793c621c7f9245edf0fef85b1b879c00000000000000000000000000000000000000000000000000000000000075e80000000000000000000000008456195dd0793c621c7f9245edf0fef85b1b879c0000000000000000000000000000000000000000000000000000000000007532000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore' as const, + }, + ], + } + + const basePayload: IntentCallsPayload = { + chainId: 8453n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: Address.from('0x833589fcd6edb6e08f4c7c32d4f71b54bda02913'), + value: 0n, + data: '0xa9059cbb000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa960450000000000000000000000000000000000000000000000000000000000007530' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore' as const, + }, + ], + } + + // Calculate intent configuration address + const address = calculateIntentConfigurationAddress(mainSigner, [arbitrumPayload, basePayload], context) + + // Log the address + console.log('address', address) + + // Verify the address matches the expected value + expect(isAddressEqual(address, '0x5bd7f0269f4aa805f5a13b3104d596c151d8ec76')).toBe(true) + }) +}) + +describe('HashIntentParams', () => { + it('should error on empty fields', () => { + expect(() => + hashIntentParams({ + userAddress: Address.from('0x0000000000000000000000000000000000000000'), + nonce: 0n, + originTokens: [], + destinationCalls: [], + destinationTokens: [], + }), + ).toThrow() + }) + + it('should match hash for single call', () => { + const call = { + to: Address.from('0x1111111111111111111111111111111111111111'), + value: 123n, + data: Bytes.toHex(Bytes.fromString('data1')) as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore' as const, + } + const payload: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [call], + } + const params = { + userAddress: Address.from('0x3333333333333333333333333333333333333333'), + nonce: 0n, + originTokens: [{ address: Address.from('0x4444444444444444444444444444444444444444'), chainId: 1n }], + destinationCalls: [payload], + destinationTokens: [ + { address: Address.from('0x4444444444444444444444444444444444444444'), chainId: 1n, amount: 123n }, + ], + } + const hash = hashIntentParams(params) + + expect(hash.toLowerCase()).toBe('0x4479e1ed63b1cf70ed13228bec79f2a1d2ffa0e9372e2afc7d82263cd8107451') + }) + + it('should match hash for multiple calls', () => { + const call1 = { + to: Address.from('0x1111111111111111111111111111111111111111'), + value: 123n, + data: Bytes.toHex(Bytes.fromString('data1')) as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore' as const, + } + const call2 = { + to: Address.from('0x5555555555555555555555555555555555555555'), + value: 456n, + data: Bytes.toHex(Bytes.fromString('data2')) as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'ignore' as const, + } + const payload1: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [call1], + } + const payload2: IntentCallsPayload = { + chainId: 1n, + type: 'call', + space: 0n, + nonce: 0n, + calls: [call2], + } + const params = { + userAddress: Address.from('0x3333333333333333333333333333333333333333'), + nonce: 0n, + originTokens: [{ address: Address.from('0x4444444444444444444444444444444444444444'), chainId: 1n }], + destinationCalls: [payload1, payload2], + destinationTokens: [ + { address: Address.from('0x4444444444444444444444444444444444444444'), chainId: 1n, amount: 123n }, + ], + } + const hash = hashIntentParams(params) + expect(hash.toLowerCase()).toBe('0x64631a48bc218cd8196dca22437223d90dc9caa8208284cdcea4b7f32bfc7cec') + }) +}) + +describe('GetAnypayLifiInfoHash', () => { + it('should match hash for single AnypayLifiInfo', () => { + const lifiInfos: AnypayLifiInfo[] = [ + { + originToken: Address.from('0x1111111111111111111111111111111111111111'), + amount: 100n, + originChainId: 1n, + destinationChainId: 10n, + }, + ] + const attestationAddress = Address.from('0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa') + + const hash = getAnypayLifiInfoHash(lifiInfos, attestationAddress) + expect(hash.toLowerCase()).toBe('0x21872bd6b64711c4a5aecba95829c612f0b50c63f1a26991c2f76cf4a754aede') + }) + + it('should match hash for multiple AnypayLifiInfo', () => { + const lifiInfos: AnypayLifiInfo[] = [ + { + originToken: Address.from('0x1111111111111111111111111111111111111111'), + amount: 100n, + originChainId: 1n, + destinationChainId: 10n, + }, + { + originToken: Address.from('0x2222222222222222222222222222222222222222'), + amount: 200n, + originChainId: 137n, + destinationChainId: 42161n, + }, + ] + const attestationAddress = Address.from('0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB') + + const hash = getAnypayLifiInfoHash(lifiInfos, attestationAddress) + expect(hash.toLowerCase()).toBe('0xd18e54455db64ba31b9f9a447e181f83977cb70b136228d64ac85d64a6aefe71') + }) + + it('should error on empty lifiInfos', () => { + const attestationAddress = Address.from('0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa') + expect(() => getAnypayLifiInfoHash([], attestationAddress)).toThrow('lifiInfos is empty') + }) + + it('should error on zero attestationAddress', () => { + const lifiInfos: AnypayLifiInfo[] = [ + { + originToken: Address.from('0x1111111111111111111111111111111111111111'), + amount: 100n, + originChainId: 1n, + destinationChainId: 10n, + }, + ] + const attestationAddress = Address.from('0x0000000000000000000000000000000000000000') + expect(() => getAnypayLifiInfoHash(lifiInfos, attestationAddress)).toThrow('attestationAddress is zero') + }) +}) diff --git a/packages/wallet/core/test/constants.ts b/packages/wallet/core/test/constants.ts index 842c087eb..8631bbef7 100644 --- a/packages/wallet/core/test/constants.ts +++ b/packages/wallet/core/test/constants.ts @@ -13,3 +13,5 @@ export const EMITTER_EVENT_TOPICS = [ // Environment variables export const LOCAL_RPC_URL = process.env.LOCAL_RPC_URL || 'http://localhost:8545' +export const { RPC_URL, PRIVATE_KEY } = process.env +export const CAN_RUN_LIVE = !!RPC_URL && !!PRIVATE_KEY diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 0df602f18..f190c346f 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -3,6 +3,10 @@ "version": "0.0.0", "license": "Apache-2.0", "type": "module", + "publishConfig": { + "access": "public" + }, + "private": false, "scripts": { "build": "tsc", "dev": "tsc --watch" diff --git a/packages/wallet/primitives/src/constants.ts b/packages/wallet/primitives/src/constants.ts index 1df5cbfdc..9ab9d85b0 100644 --- a/packages/wallet/primitives/src/constants.ts +++ b/packages/wallet/primitives/src/constants.ts @@ -3,11 +3,11 @@ import { Abi, Address, Hex } from 'ox' export const DEFAULT_CREATION_CODE: Hex.Hex = '0x603e600e3d39601e805130553df33d3d34601c57363d3d373d363d30545af43d82803e903d91601c57fd5bf3' -export const DefaultFactory: Address.Address = '0xe068ec288d8b4Aaf7F7FC028Ce0797a7a353EF2d' -export const DefaultStage1: Address.Address = '0x302608CcdCc540761A0ec89C9d8Fa195dc8049C6' -export const DefaultStage2: Address.Address = '0x80cF586AFaCb3Cae77d84aFEBcC92382eDCF3A02' -export const DefaultGuest: Address.Address = '0x75e19AA6241D84C290658131857824B4eeF10dfF' -export const DefaultSessionManager: Address.Address = '0x81Fa4b986f958CB02A3A6c10aa38056dCd701941' +export const DefaultFactory: Address.Address = '0xBd0F8abD58B4449B39C57Ac9D5C67433239aC447' +export const DefaultStage1: Address.Address = '0x53bA242E7C2501839DF2972c75075dc693176Cd0' +export const DefaultStage2: Address.Address = '0xa29874c88b8Fd557e42219B04b0CeC693e1712f5' +export const DefaultGuest: Address.Address = '0x9cbB2a4BD361248f5020465E1Cc1Db877F9387D8' +export const DefaultSessionManager: Address.Address = '0xDfB66323C6485eE10d81A0fa60BaEbbbA732Ba0a' // ERC1271 export const IS_VALID_SIGNATURE = Abi.from([ diff --git a/packages/wallet/primitives/src/index.ts b/packages/wallet/primitives/src/index.ts index 47aa05e4e..2b4c146c5 100644 --- a/packages/wallet/primitives/src/index.ts +++ b/packages/wallet/primitives/src/index.ts @@ -4,6 +4,7 @@ export * as Constants from './constants.js' export * as Erc6492 from './erc-6492.js' export * as Payload from './payload.js' export * as Permission from './permission.js' +export * as Precondition from './precondition.js' export * as SessionConfig from './session-config.js' export * as SessionSignature from './session-signature.js' export * as Signature from './signature.js' diff --git a/packages/wallet/primitives/src/payload.ts b/packages/wallet/primitives/src/payload.ts index 362e0aab4..8674f9b3b 100644 --- a/packages/wallet/primitives/src/payload.ts +++ b/packages/wallet/primitives/src/payload.ts @@ -177,6 +177,7 @@ export function isSessionImplicitAuthorize(payload: Payload): payload is Session export function encode(payload: Calls, self?: Address.Address): Bytes.Bytes { const callsLen = payload.calls.length const nonceBytesNeeded = minBytesFor(payload.nonce) + console.log('TS encode: nonce value:', payload.nonce, 'nonceBytesNeeded:', nonceBytesNeeded) if (nonceBytesNeeded > 15) { throw new Error('Nonce is too large') } diff --git a/packages/wallet/primitives/src/precondition.ts b/packages/wallet/primitives/src/precondition.ts new file mode 100644 index 000000000..40c98dbb9 --- /dev/null +++ b/packages/wallet/primitives/src/precondition.ts @@ -0,0 +1,117 @@ +export interface Precondition { + type: string +} + +export interface NativeBalancePrecondition extends Precondition { + type: 'native-balance' + address: string + min?: bigint + max?: bigint +} + +export interface Erc20BalancePrecondition extends Precondition { + type: 'erc20-balance' + address: string + token: string + min?: bigint + max?: bigint +} + +export interface Erc20ApprovalPrecondition extends Precondition { + type: 'erc20-approval' + address: string + token: string + operator: string + min: bigint +} + +export interface Erc721OwnershipPrecondition extends Precondition { + type: 'erc721-ownership' + address: string + token: string + tokenId: bigint + owned?: boolean +} + +export interface Erc721ApprovalPrecondition extends Precondition { + type: 'erc721-approval' + address: string + token: string + tokenId: bigint + operator: string +} + +export interface Erc1155BalancePrecondition extends Precondition { + type: 'erc1155-balance' + address: string + token: string + tokenId: bigint + min?: bigint + max?: bigint +} + +export interface Erc1155ApprovalPrecondition extends Precondition { + type: 'erc1155-approval' + address: string + token: string + tokenId: bigint + operator: string + min: bigint +} + +export type AnyPrecondition = + | NativeBalancePrecondition + | Erc20BalancePrecondition + | Erc20ApprovalPrecondition + | Erc721OwnershipPrecondition + | Erc721ApprovalPrecondition + | Erc1155BalancePrecondition + | Erc1155ApprovalPrecondition + +export function isValidPreconditionType(type: string): type is AnyPrecondition['type'] { + return [ + 'native-balance', + 'erc20-balance', + 'erc20-approval', + 'erc721-ownership', + 'erc721-approval', + 'erc1155-balance', + 'erc1155-approval', + ].includes(type) +} + +export function createPrecondition(precondition: T): T { + if (!precondition || typeof precondition.type !== 'string' || !isValidPreconditionType(precondition.type)) { + throw new Error(`Invalid precondition object: missing or invalid 'type' property.`) + } + + return precondition +} + +export interface IntentPrecondition { + type: T['type'] + data: Omit + chainId?: bigint +} + +export function createIntentPrecondition( + precondition: T, + chainId?: bigint, +): IntentPrecondition { + const { type, ...data } = precondition + + if (!isValidPreconditionType(type)) { + throw new Error(`Invalid precondition type: ${type}`) + } + + const intent: IntentPrecondition = { + type: type, + data: data as Omit, + } + + if (chainId !== undefined) { + intent.chainId = chainId + } + + return intent +} diff --git a/packages/wallet/tailwind.config.js b/packages/wallet/tailwind.config.js new file mode 100644 index 000000000..2e1e4ce85 --- /dev/null +++ b/packages/wallet/tailwind.config.js @@ -0,0 +1,7 @@ +module.exports = { + content: ['./src/**/*.{jsx,tsx}'], + theme: { + extend: {}, + }, + plugins: [], +} diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 83a723b3c..8a5b7f36e 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -3,6 +3,10 @@ "version": "0.0.0", "license": "Apache-2.0", "type": "module", + "publishConfig": { + "access": "public" + }, + "private": false, "scripts": { "build": "tsc", "dev": "tsc --watch", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 855dce9df..5254143ff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,6 +27,148 @@ importers: specifier: 5.8.3 version: 5.8.3 + extras/demo-anypay: + dependencies: + '@0xsequence/api': + specifier: workspace:* + version: link:../../packages/services/api + '@0xsequence/design-system': + specifier: ^2.1.6 + version: 2.1.6(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(motion@12.7.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@0xsequence/hooks': + specifier: ^5.1.0 + version: 5.1.1(@0xsequence/api@packages+services+api)(@0xsequence/indexer@2.3.9)(@0xsequence/metadata@2.3.8)(@0xsequence/network@2.3.9(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(@tanstack/react-query@5.74.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)) + '@0xsequence/indexer': + specifier: ^2.3.9 + version: 2.3.9 + '@0xsequence/network': + specifier: ^2.3.9 + version: 2.3.9(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/wagmi-connector': + specifier: ^4.0.1 + version: 4.0.1(0xsequence@2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))(wagmi@2.15.0(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@19.0.0))(@types/react@19.1.2)(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))(zod@3.24.2)) + '@0xsequence/wallet-core': + specifier: workspace:* + version: link:../../packages/wallet/core + '@0xsequence/wallet-primitives': + specifier: workspace:* + version: link:../../packages/wallet/primitives + '@0xsequence/wallet-wdk': + specifier: workspace:* + version: link:../../packages/wallet/wdk + '@anypay/sdk': + specifier: workspace:* + version: link:../../packages/wallet/anypay-sdk + '@radix-ui/react-popover': + specifier: ^1.1.6 + version: 1.1.11(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@repo/eslint-config': + specifier: workspace:* + version: link:../../repo/eslint-config + '@repo/typescript-config': + specifier: workspace:* + version: link:../../repo/typescript-config + '@tanstack/react-query': + specifier: ^5.69.0 + version: 5.74.3(react@19.0.0) + '@types/react-syntax-highlighter': + specifier: ^15.5.13 + version: 15.5.13 + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + copy-to-clipboard: + specifier: ^3.3.3 + version: 3.3.3 + jotai: + specifier: ^2.12.2 + version: 2.12.3(@types/react@19.1.2)(react@19.0.0) + lucide-react: + specifier: ^0.493.0 + version: 0.493.0(react@19.0.0) + motion: + specifier: ^12.6.2 + version: 12.7.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + ox: + specifier: ^0.6.10 + version: 0.6.12(typescript@5.7.3)(zod@3.24.2) + qrcode.react: + specifier: ^4.2.0 + version: 4.2.0(react@19.0.0) + react: + specifier: ^19.0.0 + version: 19.0.0 + react-dom: + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + react-router: + specifier: ^7.4.0 + version: 7.5.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-syntax-highlighter: + specifier: ^15.6.1 + version: 15.6.1(react@19.0.0) + tailwindcss: + specifier: ^4.0.15 + version: 4.1.4 + viem: + specifier: ^2.24.1 + version: 2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + wagmi: + specifier: ^2.14.16 + version: 2.15.0(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@19.0.0))(@types/react@19.1.2)(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))(zod@3.24.2) + devDependencies: + '@eslint/js': + specifier: ^9.21.0 + version: 9.24.0 + '@tailwindcss/vite': + specifier: ^4.0.15 + version: 4.1.4(vite@6.3.2(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)) + '@types/react': + specifier: ^19.0.10 + version: 19.1.2 + '@types/react-dom': + specifier: ^19.0.4 + version: 19.1.2(@types/react@19.1.2) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.4.1(vite@6.3.2(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)) + eslint: + specifier: ^9.21.0 + version: 9.24.0(jiti@2.4.2) + eslint-plugin-react-hooks: + specifier: ^5.1.0 + version: 5.2.0(eslint@9.24.0(jiti@2.4.2)) + eslint-plugin-react-refresh: + specifier: ^0.4.19 + version: 0.4.19(eslint@9.24.0(jiti@2.4.2)) + globals: + specifier: ^15.15.0 + version: 15.15.0 + husky: + specifier: ^9.1.7 + version: 9.1.7 + prettier: + specifier: ^3.5.3 + version: 3.5.3 + rimraf: + specifier: ^6.0.1 + version: 6.0.1 + typescript: + specifier: ~5.7.2 + version: 5.7.3 + typescript-eslint: + specifier: ^8.24.1 + version: 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + vite: + specifier: ^6.2.0 + version: 6.3.2(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1) + zod: + specifier: ^3.24.2 + version: 3.24.2 + extras/docs: dependencies: '@repo/ui': @@ -138,7 +280,7 @@ importers: version: 4.0.0 ox: specifier: ^0.7.0 - version: 0.7.0(typescript@5.8.3) + version: 0.7.0(typescript@5.8.3)(zod@3.24.2) devDependencies: '@repo/typescript-config': specifier: workspace:^ @@ -151,7 +293,7 @@ importers: version: 5.8.3 vitest: specifier: ^3.1.2 - version: 3.1.2(@types/node@22.13.9)(happy-dom@13.10.1) + version: 3.1.2(@types/debug@4.1.12)(@types/node@22.13.9)(happy-dom@13.10.1)(jiti@2.4.2)(lightningcss@1.30.1) packages/services/indexer: devDependencies: @@ -213,6 +355,145 @@ importers: specifier: ^5.7.3 version: 5.8.3 + packages/wallet/anypay-sdk: + dependencies: + '@0xsequence/api': + specifier: 0.0.0-anypay-20250527101311 + version: 0.0.0-anypay-20250527101311 + '@0xsequence/design-system': + specifier: ^2.1.6 + version: 2.1.6(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(motion@12.7.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@0xsequence/hooks': + specifier: ^5.1.0 + version: 5.1.1(@0xsequence/api@0.0.0-anypay-20250527101311)(@0xsequence/indexer@2.3.9)(@0xsequence/metadata@2.3.8)(@0xsequence/network@2.3.9(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(@tanstack/react-query@5.74.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)) + '@0xsequence/indexer': + specifier: ^2.3.9 + version: 2.3.9 + '@0xsequence/wagmi-connector': + specifier: ^4.0.1 + version: 4.0.1(0xsequence@2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))(wagmi@2.15.0(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@19.0.0))(@types/react@19.1.2)(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))(zod@3.24.2)) + '@0xsequence/wallet-core': + specifier: workspace:* + version: link:../core + '@0xsequence/wallet-primitives': + specifier: 0.0.0-anypay-20250527101311 + version: 0.0.0-anypay-20250527101311(typescript@5.7.3)(zod@3.24.2) + '@tanstack/react-query': + specifier: ^5.69.0 + version: 5.74.3(react@19.0.0) + buffer: + specifier: ^6.0.3 + version: 6.0.3 + isomorphic-fetch: + specifier: ^3.0.0 + version: 3.0.0 + lucide-react: + specifier: ^0.493.0 + version: 0.493.0(react@19.0.0) + ox: + specifier: ^0.7.0 + version: 0.7.0(typescript@5.7.3)(zod@3.24.2) + react: + specifier: ^19.0.0 + version: 19.0.0 + react-dom: + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + wagmi: + specifier: ^2.14.16 + version: 2.15.0(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@19.0.0))(@types/react@19.1.2)(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))(zod@3.24.2) + devDependencies: + '@eslint/js': + specifier: ^9.17.0 + version: 9.24.0 + '@next/eslint-plugin-next': + specifier: ^15.1.0 + version: 15.1.0 + '@tailwindcss/postcss': + specifier: ^4.1.8 + version: 4.1.8 + '@types/isomorphic-fetch': + specifier: ^0.0.39 + version: 0.0.39 + '@types/node': + specifier: ^22.15.29 + version: 22.15.29 + '@types/react': + specifier: ^19.0.10 + version: 19.1.2 + '@types/react-dom': + specifier: ^19.0.10 + version: 19.1.2(@types/react@19.1.2) + '@typescript-eslint/eslint-plugin': + specifier: ^7.0.0 + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': + specifier: ^7.0.0 + version: 7.18.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@vitejs/plugin-react': + specifier: ^4.5.1 + version: 4.5.1(vite@5.4.19(@types/node@22.15.29)(lightningcss@1.30.1)) + autoprefixer: + specifier: ^10.4.21 + version: 10.4.21(postcss@8.5.4) + dotenv: + specifier: ^16.4.7 + version: 16.4.7 + eslint: + specifier: ^9.15.0 + version: 9.24.0(jiti@2.4.2) + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@9.24.0(jiti@2.4.2)) + eslint-plugin-only-warn: + specifier: ^1.1.0 + version: 1.1.0 + eslint-plugin-prettier: + specifier: ^5.1.3 + version: 5.4.1(eslint-config-prettier@9.1.0(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2))(prettier@3.5.3) + eslint-plugin-react: + specifier: ^7.37.2 + version: 7.37.2(eslint@9.24.0(jiti@2.4.2)) + eslint-plugin-react-hooks: + specifier: ^5.0.0 + version: 5.2.0(eslint@9.24.0(jiti@2.4.2)) + eslint-plugin-turbo: + specifier: ^2.3.0 + version: 2.3.1(eslint@9.24.0(jiti@2.4.2)) + globals: + specifier: ^15.12.0 + version: 15.15.0 + postcss: + specifier: ^8.5.4 + version: 8.5.4 + prettier: + specifier: ^3.2.5 + version: 3.5.3 + tailwindcss: + specifier: ^4.1.4 + version: 4.1.4 + turbo: + specifier: ^2.5.0 + version: 2.5.0 + typescript: + specifier: ^5.3.3 + version: 5.7.3 + typescript-eslint: + specifier: ^8.15.0 + version: 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + viem: + specifier: ^2.28.0 + version: 2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + vite: + specifier: ^5.0.0 + version: 5.4.19(@types/node@22.15.29)(lightningcss@1.30.1) + vite-plugin-css-injected-by-js: + specifier: ^3.5.2 + version: 3.5.2(vite@5.4.19(@types/node@22.15.29)(lightningcss@1.30.1)) + vitest: + specifier: ^3.1.2 + version: 3.1.2(@types/debug@4.1.12)(@types/node@22.15.29)(happy-dom@13.10.1)(jiti@2.4.2)(lightningcss@1.30.1) + packages/wallet/core: dependencies: '@0xsequence/relayer': @@ -223,7 +504,10 @@ importers: version: link:../primitives ox: specifier: ^0.7.0 - version: 0.7.0(typescript@5.8.3) + version: 0.7.0(typescript@5.8.3)(zod@3.24.2) + viem: + specifier: ^2.27.2 + version: 2.28.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.2) devDependencies: '@repo/typescript-config': specifier: workspace:^ @@ -242,13 +526,13 @@ importers: version: 5.8.3 vitest: specifier: ^3.1.2 - version: 3.1.2(@types/node@22.13.9)(happy-dom@13.10.1) + version: 3.1.2(@types/debug@4.1.12)(@types/node@22.13.9)(happy-dom@13.10.1)(jiti@2.4.2)(lightningcss@1.30.1) packages/wallet/primitives: dependencies: ox: specifier: ^0.7.0 - version: 0.7.0(typescript@5.8.3) + version: 0.7.0(typescript@5.8.3)(zod@3.24.2) devDependencies: '@repo/typescript-config': specifier: workspace:^ @@ -264,7 +548,7 @@ importers: version: link:../primitives ox: specifier: ^0.7.0 - version: 0.7.0(typescript@5.8.3) + version: 0.7.0(typescript@5.8.3)(zod@3.24.2) yargs: specifier: ^17.7.2 version: 17.7.2 @@ -286,7 +570,7 @@ importers: version: 8.2.2 esbuild: specifier: ^0.25.0 - version: 0.25.0 + version: 0.25.2 nodemon: specifier: ^3.1.0 version: 3.1.9 @@ -316,7 +600,7 @@ importers: version: 4.0.0 ox: specifier: ^0.7.0 - version: 0.7.0(typescript@5.8.3) + version: 0.7.0(typescript@5.8.3)(zod@3.24.2) uuid: specifier: ^11.1.0 version: 11.1.0 @@ -341,7 +625,7 @@ importers: version: 5.8.3 vitest: specifier: ^3.1.2 - version: 3.1.2(@types/node@22.13.9)(happy-dom@13.10.1) + version: 3.1.2(@types/debug@4.1.12)(@types/node@22.13.9)(happy-dom@13.10.1)(jiti@2.4.2)(lightningcss@1.30.1) repo/eslint-config: devDependencies: @@ -353,22 +637,22 @@ importers: version: 15.1.0 eslint: specifier: ^9.15.0 - version: 9.15.0 + version: 9.15.0(jiti@2.4.2) eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@9.15.0) + version: 9.1.0(eslint@9.15.0(jiti@2.4.2)) eslint-plugin-only-warn: specifier: ^1.1.0 version: 1.1.0 eslint-plugin-react: specifier: ^7.37.2 - version: 7.37.2(eslint@9.15.0) + version: 7.37.2(eslint@9.15.0(jiti@2.4.2)) eslint-plugin-react-hooks: specifier: ^5.0.0 - version: 5.0.0(eslint@9.15.0) + version: 5.0.0(eslint@9.15.0(jiti@2.4.2)) eslint-plugin-turbo: specifier: ^2.3.0 - version: 2.3.1(eslint@9.15.0) + version: 2.3.1(eslint@9.15.0(jiti@2.4.2)) globals: specifier: ^15.12.0 version: 15.12.0 @@ -377,7 +661,7 @@ importers: version: 5.7.3 typescript-eslint: specifier: ^8.15.0 - version: 8.15.0(eslint@9.15.0)(typescript@5.7.3) + version: 8.15.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.7.3) repo/typescript-config: {} @@ -414,12 +698,236 @@ importers: packages: + 0xsequence@2.3.8: + resolution: {integrity: sha512-7TgkvED+D6WUq2qWnO4oxKxQD0lAzBJs3m7E2Z23isMYVRyeDEDyOa/Igrfw6bfRCk5Mcrv3OG26BC6iHOsxlg==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/abi@2.3.8': + resolution: {integrity: sha512-mk3uWMWJnJZIR79qKAW080JzUfdPfvADrodWhWC//BcAzNPbcG2XlgdRE34tkg858UycV88ToQQux7wQIqe19Q==} + + '@0xsequence/abi@2.3.9': + resolution: {integrity: sha512-5bFZIerqx4VMxny5PdFAGH4uyZhzvsH3Ri1/U0Tr2a05t5jSSXM5YVCf8QzWpSS51lpPRknMrvuuBUfEcV2dgw==} + + '@0xsequence/account@2.3.8': + resolution: {integrity: sha512-LCuX2wKHF8IlGSLz/TalPoagMOF9sxFDfmF8fNquBLTz6VPR2nSbjNasX/CtR4Q1Uw9eC7cLCUMrlim+Nh/ekA==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/api@0.0.0-anypay-20250527101311': + resolution: {integrity: sha512-7MYG5Sr7Wl6GLpYLGJjK6VjODtwmbF/ydKcSR9IBPbhDF6om3ydwEgtvkkg6NhQ7kFr+n2Vmz8BE2vElRPWC3A==} + + '@0xsequence/api@2.3.8': + resolution: {integrity: sha512-KbWoD+IxMAUPabpGlVzFfRXFeFHsvlNVBa5g7P904MLud0BR0TUYN+V14M6paGec2L3WkAEesPF4bqB4Yfygxg==} + + '@0xsequence/auth@2.3.8': + resolution: {integrity: sha512-SbSt9j8gTwOPMD428WwY5vggNOwTQfLQDC7DjnZJtsiQZfkwHxT+qXMNBqlEM3HMzL6vCHgMxX5w3KDvPcojKA==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/core@2.3.8': + resolution: {integrity: sha512-SQ/LLUzm4+VzW2sd8EYhINV8Cq2vvnPvHNwCE0MAR2d1lJBAeSGFbxSL6GC5jZ0hTc60RSgM9JziGjZL9wltyA==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/core@2.3.9': + resolution: {integrity: sha512-N97jPBe//72upmkelaypiSRLhGzVIHttOxRGa2w8b3lH6lNJ6tVHYkcrCU3I8GCnnURyINbVYR+r2C2s0+2sYQ==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/design-system@2.1.6': + resolution: {integrity: sha512-XRUAKrzKZBSEkWZFBm/OJq8qaMFtfCe6/n3nhnJSefGUWOuThYbM11muKlFzpT3gD/RJhBOMR1fCOVJXsnfvUA==} + peerDependencies: + motion: '>= 12' + react: '>= 17' + react-dom: '>= 17' + + '@0xsequence/ethauth@1.0.0': + resolution: {integrity: sha512-piihXzbS8Sq7P670a+GyTm3igTJL3Ts6pqjJcC0Sv86yqeK6QD0pzJP4APP+/IQa5k+0s2l1SeZwMjR7gSPtCA==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/guard@2.3.8': + resolution: {integrity: sha512-NcCMQnXjIL6n2b+ULJBCbN0uivtcjHOJK07585hcgqVGPnT7sm4NavPHYVGDt//0nnhN7PJ+j6S6i/1MWGataw==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/hooks@5.1.1': + resolution: {integrity: sha512-M+q6g18CSVk5GRHdQbc7PMP0n3uPz/NE06K6Ul2ZhFdGgbZNRaRRINKJFYmDjzUn+6jQ3IjZEK7nYsCiDtAf0Q==} + peerDependencies: + '@0xsequence/api': ^2.3.4 + '@0xsequence/indexer': '>=2.2.13' + '@0xsequence/metadata': '>=2.2.13' + '@0xsequence/network': '>=2.2.13' + '@tanstack/react-query': '>= 5' + react: '>= 17' + react-dom: '>= 17' + viem: '>= 2.0.0' + + '@0xsequence/indexer@2.3.8': + resolution: {integrity: sha512-UtmUwhquwRxWx3+JoR7Ai0luRLWvL/jMIDNuSkE6/A87UFLzJ09GQ1VkSLSkipkYv95q1xcbAUQxjZH58JPxfg==} + + '@0xsequence/indexer@2.3.9': + resolution: {integrity: sha512-ZtiA7827BTjujOupom5dGJd4oMvfQA2HQ9orjrreZusQPmfadie9ldVrnzX19YS+AZDeCOix9qDG+cRSpYfHwQ==} + + '@0xsequence/metadata@2.3.8': + resolution: {integrity: sha512-ciWx8gHIZbMleFT2vQBHxe+id60wCG5RerPSiPuj4kJZdemrbbZ5+FcHDgyq+4bLkUUtbQ5ejZuArnFM43j0sw==} + + '@0xsequence/migration@2.3.8': + resolution: {integrity: sha512-xoIQb9PRUIJXjkJA+L9pCb99HZlhlWNQgGsJHJPezDkWuB5rtMp5OSmDq4kVM2nx4u7u0klGMeL5JneEfqcsKg==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/network@2.3.8': + resolution: {integrity: sha512-BtI++rAJ1Vn78iRSmAJFcRnNqHmHprqwH1vBOD47xumlsvfHrMdAOTL2nxpw6zB85RNXHRFbzEICNHIB2e4j3g==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/network@2.3.9': + resolution: {integrity: sha512-QFvGsfkjkuENI3yrBAil1Axm0iBK/BMO8nqEo5MZ8zxYPkOG3I4Lyjr28s4Ny2aOUzaV8I3R4udTOM+S6b5vXw==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/provider@2.3.8': + resolution: {integrity: sha512-Bej2QhHqj4Y8HBK1ZDuKhlH8bcGLeBLVIVk2TU5ElJRjge2ba2adwVaWYWMG1hFBbOGmV1wVQj9ivyA2bBp7QQ==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/relayer@2.3.8': + resolution: {integrity: sha512-Vf5zDj2d/f7C1kyO5fSfUn6LvY+Pv1oi2YQpaZ4mBCfS0kViMteMtDvuAw5PB+mWE6qak/3x2VuvchRZRRtmfQ==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/relayer@2.3.9': + resolution: {integrity: sha512-Ta9vYWfl38nNj1HVgf8igjH41oj5aY+ZK923Rio1ms5D4WWR6oSoHBBFRmbU5qT8HzTa8GWoYrxhohHcPV5S6g==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/replacer@2.3.8': + resolution: {integrity: sha512-moHJMgBDPTe3SBtjKanvqOd2JXuId/8KwNM+xBtXjkulv7LDZPKwXHH/dssgKxT22agpPYzabLj7nHo329iIZg==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/sessions@2.3.8': + resolution: {integrity: sha512-1AGXuFLLCXCH/5myQHdSt8NDg0BDndlV5VvL6cS1bYOW/tgBuLS2w8aKVVSKWkDra14mHRtI4ClsKS8+W/kDEg==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/signhub@2.3.8': + resolution: {integrity: sha512-epRJP0vU2Qd1G5Q5gw0Xze9Kc9WerD1WvfHZwNSHCUDtYkbMaYYGdmnJukUDWFR9LXQ5WMQR1TkvThc1N/yFRw==} + peerDependencies: + ethers: '>=6' + '@0xsequence/tee-verifier@0.1.1': resolution: {integrity: sha512-tBWy/P4reDHzw1dUHL7ydCKI1FKMLVBgLi6gi3b1bTl5zTaV6IZkOzTBCEsOGarfjQ4TQtXqhmoWIlvli0AMqQ==} + '@0xsequence/utils@2.3.8': + resolution: {integrity: sha512-iXAZju8GouEqFbKgG/TsPIdd/omu8xSUSuY5nQIcmgQcX9v2brRXmwXp2a2kVvHXSbcrKErhsSf5GMFYwNLrrQ==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/utils@2.3.9': + resolution: {integrity: sha512-dZI3dWkHABkRj39fp+GdieadQiXzntosrClwYKf7wT780/e6DlBMZV2tb/iI+j73Qq64+MfSheimEw7Tjk+kww==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/wagmi-connector@4.0.1': + resolution: {integrity: sha512-SKAC5Z8/0BkLQ5M2PY2bxQEj0CQlMUsmfIEGIKjqIhvmsNR+xGSDKwLG6SJ79gShEuPRhBQpLCy9ZHfT8COqoQ==} + peerDependencies: + 0xsequence: '>= 2.0.0' + ethers: '>= 6.13.0' + viem: '>= 2.0.0' + wagmi: '>= 2.0.0' + + '@0xsequence/wallet-primitives@0.0.0-anypay-20250527101311': + resolution: {integrity: sha512-uy+q2xGfHKTMMRtW2VGPHB2MCIem3SP72+/IOc606ccSLWtwPtdC70QcTujJzkLVJfAsZ/l6nFNclz8KOEeMoA==} + + '@0xsequence/wallet@2.3.8': + resolution: {integrity: sha512-HH4KiO4VYGsmQDc/thtXLrIiYtjHGOKQ+ms/u5F/SZDa8hBw+VwYElli7FEgsbg+tpUYmMlaPeKZz67Buqe9zQ==} + peerDependencies: + ethers: '>=6' + + '@adraffy/ens-normalize@1.10.1': + resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + '@adraffy/ens-normalize@1.11.0': resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.10': + resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.27.0': + resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.0': + resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.27.0': + resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.27.0': + resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime-corejs3@7.26.0': resolution: {integrity: sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==} engines: {node: '>=6.9.0'} @@ -428,6 +936,18 @@ packages: resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} + '@babel/template@7.27.0': + resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.27.0': + resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.27.0': + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + engines: {node: '>=6.9.0'} + '@changesets/apply-release-plan@7.0.10': resolution: {integrity: sha512-wNyeIJ3yDsVspYvHnEz1xQDq18D9ifed3lI+wxRQRK4pArUcuHgCTrHv0QRnnwjhVCQACxZ+CBih3wgOct6UXw==} @@ -483,159 +1003,312 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@coinbase/wallet-sdk@3.9.3': + resolution: {integrity: sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==} + + '@coinbase/wallet-sdk@4.3.0': + resolution: {integrity: sha512-T3+SNmiCw4HzDm4we9wCHCxlP0pqCiwKe4sOwPH3YAK2KSKjxPRydKu6UQJrdONFVLG7ujXvbd/6ZqmvJb8rkw==} + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@databeat/tracker@0.9.3': + resolution: {integrity: sha512-eGsiNU/CRFujcNtUUqvBiqveCs6S6SiAhalXPDodbk74d3FzvLqHDn5k6WfOEJIhrP3CbYgfMXL0nk51s/rQsg==} + + '@ecies/ciphers@0.2.3': + resolution: {integrity: sha512-tapn6XhOueMwht3E2UzY0ZZjYokdaw9XtL9kEyjhQ/Fb9vL9xTFbOaI+fV0AWvTpYu4BNloC6getKW6NtSg4mA==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} + peerDependencies: + '@noble/ciphers': ^1.0.0 + '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} - '@esbuild/aix-ppc64@0.25.0': - resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} - engines: {node: '>=18'} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.0': - resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} + '@esbuild/aix-ppc64@0.25.2': + resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.0': - resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} + '@esbuild/android-arm64@0.25.2': + resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.0': - resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} + '@esbuild/android-arm@0.25.2': + resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.0': - resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} + '@esbuild/android-x64@0.25.2': + resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.0': - resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} + '@esbuild/darwin-arm64@0.25.2': + resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.0': - resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} + '@esbuild/darwin-x64@0.25.2': + resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.0': - resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} + '@esbuild/freebsd-arm64@0.25.2': + resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.0': - resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} + '@esbuild/freebsd-x64@0.25.2': + resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.0': - resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} + '@esbuild/linux-arm64@0.25.2': + resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.0': - resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} + '@esbuild/linux-arm@0.25.2': + resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.0': - resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} + '@esbuild/linux-ia32@0.25.2': + resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.0': - resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} + '@esbuild/linux-loong64@0.25.2': + resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.0': - resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} + '@esbuild/linux-mips64el@0.25.2': + resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.0': - resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} + '@esbuild/linux-ppc64@0.25.2': + resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.0': - resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} + '@esbuild/linux-riscv64@0.25.2': + resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.0': - resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} + '@esbuild/linux-s390x@0.25.2': + resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} engines: {node: '>=18'} - cpu: [x64] + cpu: [s390x] os: [linux] - '@esbuild/netbsd-arm64@0.25.0': - resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.2': + resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.2': + resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.0': - resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.2': + resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.0': - resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} + '@esbuild/openbsd-arm64@0.25.2': + resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.0': - resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.2': + resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.0': - resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.2': + resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.0': - resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.2': + resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.0': - resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.2': + resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.0': - resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.2': + resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -654,6 +1327,22 @@ packages: resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-array@0.20.0': + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.2.1': + resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.12.0': + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.13.0': + resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.9.0': resolution: {integrity: sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -662,6 +1351,10 @@ packages: resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@9.15.0': resolution: {integrity: sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -670,14 +1363,57 @@ packages: resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@9.24.0': + resolution: {integrity: sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.2.3': resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.2.8': + resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@ethereumjs/common@3.2.0': + resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} + + '@ethereumjs/rlp@4.0.1': + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + + '@ethereumjs/tx@4.2.0': + resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} + engines: {node: '>=14'} + + '@ethereumjs/util@8.1.0': + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} + + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -698,6 +1434,10 @@ packages: resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} engines: {node: '>=18.18'} + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + engines: {node: '>=18.18'} + '@img/sharp-darwin-arm64@0.33.5': resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -807,22 +1547,137 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@lit-labs/ssr-dom-shim@1.3.0': + resolution: {integrity: sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==} + + '@lit/reactive-element@1.6.3': + resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@metamask/eth-json-rpc-provider@1.0.1': + resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} + engines: {node: '>=14.0.0'} + + '@metamask/json-rpc-engine@7.3.3': + resolution: {integrity: sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==} + engines: {node: '>=16.0.0'} + + '@metamask/json-rpc-engine@8.0.2': + resolution: {integrity: sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA==} + engines: {node: '>=16.0.0'} + + '@metamask/json-rpc-middleware-stream@7.0.2': + resolution: {integrity: sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==} + engines: {node: '>=16.0.0'} + + '@metamask/object-multiplex@2.1.0': + resolution: {integrity: sha512-4vKIiv0DQxljcXwfpnbsXcfa5glMj5Zg9mqn4xpIWqkv6uJ2ma5/GtUfLFSxhlxnR8asRMv8dDmWya1Tc1sDFA==} + engines: {node: ^16.20 || ^18.16 || >=20} + + '@metamask/onboarding@1.0.1': + resolution: {integrity: sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==} + + '@metamask/providers@16.1.0': + resolution: {integrity: sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==} + engines: {node: ^18.18 || >=20} + + '@metamask/rpc-errors@6.4.0': + resolution: {integrity: sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg==} + engines: {node: '>=16.0.0'} + + '@metamask/safe-event-emitter@2.0.0': + resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==} + + '@metamask/safe-event-emitter@3.1.2': + resolution: {integrity: sha512-5yb2gMI1BDm0JybZezeoX/3XhPDOtTbcFvpTXM9kxsoZjPZFh4XciqRbpD6N86HYZqWDhEaKUDuOyR0sQHEjMA==} + engines: {node: '>=12.0.0'} + + '@metamask/sdk-communication-layer@0.32.0': + resolution: {integrity: sha512-dmj/KFjMi1fsdZGIOtbhxdg3amxhKL/A5BqSU4uh/SyDKPub/OT+x5pX8bGjpTL1WPWY/Q0OIlvFyX3VWnT06Q==} + peerDependencies: + cross-fetch: ^4.0.0 + eciesjs: '*' + eventemitter2: ^6.4.9 + readable-stream: ^3.6.2 + socket.io-client: ^4.5.1 + + '@metamask/sdk-install-modal-web@0.32.0': + resolution: {integrity: sha512-TFoktj0JgfWnQaL3yFkApqNwcaqJ+dw4xcnrJueMP3aXkSNev2Ido+WVNOg4IIMxnmOrfAC9t0UJ0u/dC9MjOQ==} + + '@metamask/sdk@0.32.0': + resolution: {integrity: sha512-WmGAlP1oBuD9hk4CsdlG1WJFuPtYJY+dnTHJMeCyohTWD2GgkcLMUUuvu9lO1/NVzuOoSi1OrnjbuY1O/1NZ1g==} + + '@metamask/superstruct@3.2.1': + resolution: {integrity: sha512-fLgJnDOXFmuVlB38rUN5SmU7hAFQcCjrg3Vrxz67KTY7YHFnSNEKvX4avmEBdOI0yTCxZjwMCFEqsC8k2+Wd3g==} + engines: {node: '>=16.0.0'} + + '@metamask/utils@5.0.2': + resolution: {integrity: sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==} + engines: {node: '>=14.0.0'} + + '@metamask/utils@8.5.0': + resolution: {integrity: sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==} + engines: {node: '>=16.0.0'} + + '@metamask/utils@9.3.0': + resolution: {integrity: sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==} + engines: {node: '>=16.0.0'} + + '@motionone/animation@10.18.0': + resolution: {integrity: sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==} + + '@motionone/dom@10.18.0': + resolution: {integrity: sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A==} + + '@motionone/easing@10.18.0': + resolution: {integrity: sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==} + + '@motionone/generators@10.18.0': + resolution: {integrity: sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==} + + '@motionone/svelte@10.16.4': + resolution: {integrity: sha512-zRVqk20lD1xqe+yEDZhMYgftsuHc25+9JSo+r0a0OWUJFocjSV9D/+UGhX4xgJsuwB9acPzXLr20w40VnY2PQA==} + + '@motionone/types@10.17.1': + resolution: {integrity: sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==} + + '@motionone/utils@10.18.0': + resolution: {integrity: sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==} + + '@motionone/vue@10.16.4': + resolution: {integrity: sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==} + deprecated: Motion One for Vue is deprecated. Use Oku Motion instead https://oku-ui.com/motion + '@next/env@15.1.0': resolution: {integrity: sha512-UcCO481cROsqJuszPPXJnb7GGuLq617ve4xuAyyNG4VSSocJNtMU5Fsx+Lp6mlN8c7W58aZLc5y6D/2xNmaK+w==} @@ -877,14 +1732,48 @@ packages: cpu: [x64] os: [win32] + '@noble/ciphers@1.2.1': + resolution: {integrity: sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + + '@noble/curves@1.4.2': + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + + '@noble/curves@1.8.0': + resolution: {integrity: sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==} + engines: {node: ^14.21.3 || >=16} + '@noble/curves@1.8.1': resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} engines: {node: ^14.21.3 || >=16} + '@noble/curves@1.8.2': + resolution: {integrity: sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@noble/hashes@1.7.0': + resolution: {integrity: sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==} + engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.7.1': resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.7.2': + resolution: {integrity: sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==} + engines: {node: ^14.21.3 || >=16} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -897,2991 +1786,6647 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@rollup/rollup-android-arm-eabi@4.40.0': - resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.40.0': - resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} - cpu: [arm64] - os: [android] + '@paulmillr/qr@0.2.1': + resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} + deprecated: 'The package is now available as "qr": npm install qr' - '@rollup/rollup-darwin-arm64@4.40.0': - resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} - cpu: [arm64] - os: [darwin] + '@pkgr/core@0.2.7': + resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@rollup/rollup-darwin-x64@4.40.0': - resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} - cpu: [x64] - os: [darwin] + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} - '@rollup/rollup-freebsd-arm64@4.40.0': - resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} - cpu: [arm64] - os: [freebsd] + '@radix-ui/primitive@1.1.2': + resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} - '@rollup/rollup-freebsd-x64@4.40.0': - resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} - cpu: [x64] - os: [freebsd] + '@radix-ui/react-arrow@1.1.4': + resolution: {integrity: sha512-qz+fxrqgNxG0dYew5l7qR3c7wdgRu1XVUHGnGYX7rg5HM4p9SWaRmJwfgR3J0SgyUKayLmzQIun+N6rWRgiRKw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.40.0': - resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} - cpu: [arm] - os: [linux] + '@radix-ui/react-aspect-ratio@1.1.4': + resolution: {integrity: sha512-ie2mUDtM38LBqVU+Xn+GIY44tWM5yVbT5uXO+th85WZxUUsgEdWNNZWecqqGzkQ4Af+Fq1mYT6TyQ/uUf5gfcw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@rollup/rollup-linux-arm-musleabihf@4.40.0': - resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} - cpu: [arm] - os: [linux] + '@radix-ui/react-checkbox@1.2.3': + resolution: {integrity: sha512-pHVzDYsnaDmBlAuwim45y3soIN8H4R7KbkSVirGhXO+R/kO2OLCe0eucUEbddaTcdMHHdzcIGHtZSMSQlA+apw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@rollup/rollup-linux-arm64-gnu@4.40.0': - resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} - cpu: [arm64] - os: [linux] + '@radix-ui/react-collapsible@1.1.8': + resolution: {integrity: sha512-hxEsLvK9WxIAPyxdDRULL4hcaSjMZCfP7fHB0Z1uUnDoDBat1Zh46hwYfa69DeZAbJrPckjf0AGAtEZyvDyJbw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@rollup/rollup-linux-arm64-musl@4.40.0': - resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} - cpu: [arm64] - os: [linux] + '@radix-ui/react-collection@1.1.4': + resolution: {integrity: sha512-cv4vSf7HttqXilDnAnvINd53OTl1/bjUYVZrkFnA7nwmY9Ob2POUy0WY0sfqBAe1s5FyKsyceQlqiEGPYNTadg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.40.0': - resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} - cpu: [loong64] - os: [linux] + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': - resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} - cpu: [ppc64] - os: [linux] + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@rollup/rollup-linux-riscv64-gnu@4.40.0': - resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} - cpu: [riscv64] - os: [linux] + '@radix-ui/react-dialog@1.1.11': + resolution: {integrity: sha512-yI7S1ipkP5/+99qhSI6nthfo/tR6bL6Zgxi/+1UO6qPa6UeM6nlafWcQ65vB4rU2XjgjMfMhI3k9Y5MztA62VQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@rollup/rollup-linux-riscv64-musl@4.40.0': - resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} - cpu: [riscv64] - os: [linux] + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@rollup/rollup-linux-s390x-gnu@4.40.0': - resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} - cpu: [s390x] - os: [linux] + '@radix-ui/react-dismissable-layer@1.1.7': + resolution: {integrity: sha512-j5+WBUdhccJsmH5/H0K6RncjDtoALSEr6jbkaZu+bjw6hOPOhHycr6vEUujl+HBK8kjUfWcoCJXxP6e4lUlMZw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@rollup/rollup-linux-x64-gnu@4.40.0': - resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} - cpu: [x64] - os: [linux] + '@radix-ui/react-dropdown-menu@2.1.12': + resolution: {integrity: sha512-VJoMs+BWWE7YhzEQyVwvF9n22Eiyr83HotCVrMQzla/OwRovXCgah7AcaEr4hMNj4gJxSdtIbcHGvmJXOoJVHA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@rollup/rollup-linux-x64-musl@4.40.0': - resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} - cpu: [x64] - os: [linux] + '@radix-ui/react-focus-guards@1.1.2': + resolution: {integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@rollup/rollup-win32-arm64-msvc@4.40.0': - resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.40.0': - resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.40.0': - resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} - cpu: [x64] - os: [win32] - - '@scure/base@1.2.4': - resolution: {integrity: sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==} - - '@scure/bip32@1.6.2': - resolution: {integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==} - - '@scure/bip39@1.5.4': - resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} - - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - - '@tootallnate/quickjs-emscripten@0.23.0': - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - - '@turbo/gen@1.13.4': - resolution: {integrity: sha512-PK38N1fHhDUyjLi0mUjv0RbX0xXGwDLQeRSGsIlLcVpP1B5fwodSIwIYXc9vJok26Yne94BX5AGjueYsUT3uUw==} - hasBin: true - - '@turbo/workspaces@1.13.4': - resolution: {integrity: sha512-3uYg2b5TWCiupetbDFMbBFMHl33xQTvp5DNg0fZSYal73Z9AlFH9yWabHWMYw6ywmwM1evkYRpTVA2n7GgqT5A==} - hasBin: true - - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - - '@types/glob@7.2.0': - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + '@radix-ui/react-focus-scope@1.1.4': + resolution: {integrity: sha512-r2annK27lIW5w9Ho5NyQgqs0MmgZSTIKXWpVCJaLC1q2kZrZkcqnmHkCHMEmv8XLvsLlurKMPT+kbKkRkm/xVA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@types/inquirer@6.5.0': - resolution: {integrity: sha512-rjaYQ9b9y/VFGOpqBEXRavc3jh0a+e6evAbI31tMda8VlPaSy0AZJfXsvmIe3wklc7W6C3zCSfleuMXR7NOyXw==} + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@radix-ui/react-menu@2.1.12': + resolution: {integrity: sha512-+qYq6LfbiGo97Zz9fioX83HCiIYYFNs8zAsVCMQrIakoNYylIzWuoD/anAD3UzvvR6cnswmfRFJFq/zYYq/k7Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@types/minimatch@5.1.2': - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + '@radix-ui/react-popover@1.1.11': + resolution: {integrity: sha512-yFMfZkVA5G3GJnBgb2PxrrcLKm1ZLWXrbYVgdyTl//0TYEIHS9LJbnyz7WWcZ0qCq7hIlJZpRtxeSeIG5T5oJw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@radix-ui/react-popper@1.2.4': + resolution: {integrity: sha512-3p2Rgm/a1cK0r/UVkx5F/K9v/EplfjAeIFCGOPYPO4lZ0jtg4iSQXt/YGTSLWaf4x7NG6Z4+uKFcylcTZjeqDA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@types/node@20.17.6': - resolution: {integrity: sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==} + '@radix-ui/react-portal@1.1.6': + resolution: {integrity: sha512-XmsIl2z1n/TsYFLIdYam2rmFwf9OC/Sh2avkbmVMDuBZIe7hSpM0cYnWPAo7nHOVx8zTuwDZGByfcqLdnzp3Vw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@types/node@22.13.9': - resolution: {integrity: sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==} + '@radix-ui/react-presence@1.1.4': + resolution: {integrity: sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@types/prop-types@15.7.13': - resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} + '@radix-ui/react-primitive@2.1.0': + resolution: {integrity: sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@types/react-dom@18.3.0': - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + '@radix-ui/react-progress@1.1.4': + resolution: {integrity: sha512-8rl9w7lJdcVPor47Dhws9mUHRHLE+8JEgyJRdNWCpGPa6HIlr3eh+Yn9gyx1CnCLbw5naHsI2gaO9dBWO50vzw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@types/react-dom@18.3.1': - resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} + '@radix-ui/react-radio-group@1.3.4': + resolution: {integrity: sha512-N4J9QFdW5zcJNxxY/zwTXBN4Uc5VEuRM7ZLjNfnWoKmNvgrPtNNw4P8zY532O3qL6aPkaNO+gY9y6bfzmH4U1g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@types/react@18.3.0': - resolution: {integrity: sha512-DiUcKjzE6soLyln8NNZmyhcQjVv+WsUIFSqetMN0p8927OztKT4VTfFTqsbAi5oAGIcgOmOajlfBqyptDDjZRw==} + '@radix-ui/react-roving-focus@1.1.7': + resolution: {integrity: sha512-C6oAg451/fQT3EGbWHbCQjYTtbyjNO1uzQgMzwyivcHT3GKNEmu1q3UuREhN+HzHAVtv3ivMVK08QlC+PkYw9Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@types/react@18.3.1': - resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} + '@radix-ui/react-select@2.2.2': + resolution: {integrity: sha512-HjkVHtBkuq+r3zUAZ/CvNWUGKPfuicGDbgtZgiQuFmNcV5F+Tgy24ep2nsAW2nFgvhGPJVqeBZa6KyVN0EyrBA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@types/through@0.0.33': - resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} + '@radix-ui/react-slot@1.2.0': + resolution: {integrity: sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@types/tinycolor2@1.4.6': - resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} + '@radix-ui/react-switch@1.2.2': + resolution: {integrity: sha512-7Z8n6L+ifMIIYZ83f28qWSceUpkXuslI2FJ34+kDMTiyj91ENdpdQ7VCidrzj5JfwfZTeano/BnGBbu/jqa5rQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@types/yargs-parser@21.0.3': - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + '@radix-ui/react-tabs@1.1.9': + resolution: {integrity: sha512-KIjtwciYvquiW/wAFkELZCVnaNLBsYNhTNcvl+zfMAbMhRkcvNuCLXDDd22L0j7tagpzVh/QwbFpwAATg7ILPw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@types/yargs@17.0.33': - resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + '@radix-ui/react-toast@1.2.11': + resolution: {integrity: sha512-Ed2mlOmT+tktOsu2NZBK1bCSHh/uqULu1vWOkpQTVq53EoOuZUZw7FInQoDB3uil5wZc2oe0XN9a7uVZB7/6AQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@typescript-eslint/eslint-plugin@8.15.0': - resolution: {integrity: sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@radix-ui/react-tooltip@1.2.4': + resolution: {integrity: sha512-DyW8VVeeMSSLFvAmnVnCwvI3H+1tpJFHT50r+tdOoMse9XqYDBCcyux8u3G2y+LOpt7fPQ6KKH0mhs+ce1+Z5w==} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - typescript: + '@types/react': + optional: true + '@types/react-dom': optional: true - '@typescript-eslint/parser@8.15.0': - resolution: {integrity: sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - typescript: + '@types/react': optional: true - '@typescript-eslint/scope-manager@8.15.0': - resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@typescript-eslint/type-utils@8.15.0': - resolution: {integrity: sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - typescript: + '@types/react': optional: true - '@typescript-eslint/types@8.15.0': - resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@typescript-eslint/typescript-estree@8.15.0': - resolution: {integrity: sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} peerDependencies: - typescript: '*' + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - typescript: + '@types/react': optional: true - '@typescript-eslint/utils@8.15.0': - resolution: {integrity: sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - typescript: + '@types/react': optional: true - '@typescript-eslint/visitor-keys@8.15.0': - resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@vitest/expect@3.1.2': - resolution: {integrity: sha512-O8hJgr+zREopCAqWl3uCVaOdqJwZ9qaDwUP7vy3Xigad0phZe9APxKhPcDNqYYi0rX5oMvwJMSCAXY2afqeTSA==} + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - '@vitest/mocker@3.1.2': - resolution: {integrity: sha512-kOtd6K2lc7SQ0mBqYv/wdGedlqPdM/B38paPY+OwJ1XiNi44w3Fpog82UfOibmHaV9Wod18A09I9SCKLyDMqgw==} + '@radix-ui/react-visually-hidden@1.2.0': + resolution: {integrity: sha512-rQj0aAWOpCdCMRbI6pLQm8r7S2BM3YhTa0SzOYD55k+hJA8oo9J+H+9wLM9oMlZWOX/wJWPTzfDfmZkf7LvCfg==} peerDependencies: - msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - msw: + '@types/react': optional: true - vite: + '@types/react-dom': optional: true - '@vitest/pretty-format@3.1.2': - resolution: {integrity: sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w==} - - '@vitest/runner@3.1.2': - resolution: {integrity: sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g==} + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@vitest/snapshot@3.1.2': - resolution: {integrity: sha512-Q1qkpazSF/p4ApZg1vfZSQ5Yw6OCQxVMVrLjslbLFA1hMDrT2uxtqMaw8Tc/jy5DLka1sNs1Y7rBcftMiaSH/Q==} + '@rolldown/pluginutils@1.0.0-beta.9': + resolution: {integrity: sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==} - '@vitest/spy@3.1.2': - resolution: {integrity: sha512-OEc5fSXMws6sHVe4kOFyDSj/+4MSwst0ib4un0DlcYgQvRuYQ0+M2HyqGaauUMnjq87tmUaMNDxKQx7wNfVqPA==} + '@rollup/rollup-android-arm-eabi@4.40.0': + resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} + cpu: [arm] + os: [android] - '@vitest/utils@3.1.2': - resolution: {integrity: sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg==} + '@rollup/rollup-android-arm64@4.40.0': + resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} + cpu: [arm64] + os: [android] - abitype@1.0.8: - resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true + '@rollup/rollup-darwin-arm64@4.40.0': + resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} + cpu: [arm64] + os: [darwin] - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@rollup/rollup-darwin-x64@4.40.0': + resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} + cpu: [x64] + os: [darwin] - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} + '@rollup/rollup-freebsd-arm64@4.40.0': + resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} + cpu: [arm64] + os: [freebsd] - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} - engines: {node: '>=0.4.0'} - hasBin: true + '@rollup/rollup-freebsd-x64@4.40.0': + resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} + cpu: [x64] + os: [freebsd] - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} + cpu: [arm] + os: [linux] - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + '@rollup/rollup-linux-arm-musleabihf@4.40.0': + resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} + cpu: [arm] + os: [linux] - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + '@rollup/rollup-linux-arm64-gnu@4.40.0': + resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} + cpu: [arm64] + os: [linux] - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + '@rollup/rollup-linux-arm64-musl@4.40.0': + resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} + cpu: [arm64] + os: [linux] - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} + cpu: [loong64] + os: [linux] - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} + cpu: [ppc64] + os: [linux] - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} + '@rollup/rollup-linux-riscv64-gnu@4.40.0': + resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} + cpu: [riscv64] + os: [linux] - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + '@rollup/rollup-linux-riscv64-musl@4.40.0': + resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} + cpu: [riscv64] + os: [linux] - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + '@rollup/rollup-linux-s390x-gnu@4.40.0': + resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} + cpu: [s390x] + os: [linux] - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + '@rollup/rollup-linux-x64-gnu@4.40.0': + resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} + cpu: [x64] + os: [linux] - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + '@rollup/rollup-linux-x64-musl@4.40.0': + resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} + cpu: [x64] + os: [linux] - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + '@rollup/rollup-win32-arm64-msvc@4.40.0': + resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} + cpu: [arm64] + os: [win32] - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + '@rollup/rollup-win32-ia32-msvc@4.40.0': + resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} + cpu: [ia32] + os: [win32] - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + '@rollup/rollup-win32-x64-msvc@4.40.0': + resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} + cpu: [x64] + os: [win32] - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + '@safe-global/safe-apps-provider@0.18.6': + resolution: {integrity: sha512-4LhMmjPWlIO8TTDC2AwLk44XKXaK6hfBTWyljDm0HQ6TWlOEijVWNrt2s3OCVMSxlXAcEzYfqyu1daHZooTC2Q==} - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} + '@safe-global/safe-apps-sdk@9.1.0': + resolution: {integrity: sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + '@safe-global/safe-gateway-typescript-sdk@3.23.1': + resolution: {integrity: sha512-6ORQfwtEJYpalCeVO21L4XXGSdbEMfyp2hEv6cP82afKXSwvse6d3sdelgaPWUxHIsFRkWvHDdzh8IyyKHZKxw==} + engines: {node: '>=16'} - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} + '@scure/base@1.1.9': + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} + '@scure/base@1.2.4': + resolution: {integrity: sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==} - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} - array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} + '@scure/bip32@1.6.2': + resolution: {integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==} - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} + '@scure/bip39@1.3.0': + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} - asn1js@3.0.6: - resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} - engines: {node: '>=12.0.0'} + '@scure/bip39@1.5.4': + resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + '@tailwindcss/node@4.1.4': + resolution: {integrity: sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw==} - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + '@tailwindcss/node@4.1.8': + resolution: {integrity: sha512-OWwBsbC9BFAJelmnNcrKuf+bka2ZxCE2A4Ft53Tkg4uoiE67r/PMEYwCsourC26E+kmxfwE0hVzMdxqeW+xu7Q==} - basic-ftp@5.0.5: - resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} - engines: {node: '>=10.0.0'} + '@tailwindcss/oxide-android-arm64@4.1.4': + resolution: {integrity: sha512-xMMAe/SaCN/vHfQYui3fqaBDEXMu22BVwQ33veLc8ep+DNy7CWN52L+TTG9y1K397w9nkzv+Mw+mZWISiqhmlA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] - better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} + '@tailwindcss/oxide-android-arm64@4.1.8': + resolution: {integrity: sha512-Fbz7qni62uKYceWYvUjRqhGfZKwhZDQhlrJKGtnZfuNtHFqa8wmr+Wn74CTWERiW2hn3mN5gTpOoxWKk0jRxjg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} + '@tailwindcss/oxide-darwin-arm64@4.1.4': + resolution: {integrity: sha512-JGRj0SYFuDuAGilWFBlshcexev2hOKfNkoX+0QTksKYq2zgF9VY/vVMq9m8IObYnLna0Xlg+ytCi2FN2rOL0Sg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + '@tailwindcss/oxide-darwin-arm64@4.1.8': + resolution: {integrity: sha512-RdRvedGsT0vwVVDztvyXhKpsU2ark/BjgG0huo4+2BluxdXo8NDgzl77qh0T1nUxmM11eXwR8jA39ibvSTbi7A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + '@tailwindcss/oxide-darwin-x64@4.1.4': + resolution: {integrity: sha512-sdDeLNvs3cYeWsEJ4H1DvjOzaGios4QbBTNLVLVs0XQ0V95bffT3+scptzYGPMjm7xv4+qMhCDrkHwhnUySEzA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + '@tailwindcss/oxide-darwin-x64@4.1.8': + resolution: {integrity: sha512-t6PgxjEMLp5Ovf7uMb2OFmb3kqzVTPPakWpBIFzppk4JE4ix0yEtbtSjPbU8+PZETpaYMtXvss2Sdkx8Vs4XRw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + '@tailwindcss/oxide-freebsd-x64@4.1.4': + resolution: {integrity: sha512-VHxAqxqdghM83HslPhRsNhHo91McsxRJaEnShJOMu8mHmEj9Ig7ToHJtDukkuLWLzLboh2XSjq/0zO6wgvykNA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + '@tailwindcss/oxide-freebsd-x64@4.1.8': + resolution: {integrity: sha512-g8C8eGEyhHTqwPStSwZNSrOlyx0bhK/V/+zX0Y+n7DoRUzyS8eMbVshVOLJTDDC+Qn9IJnilYbIKzpB9n4aBsg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.4': + resolution: {integrity: sha512-OTU/m/eV4gQKxy9r5acuesqaymyeSCnsx1cFto/I1WhPmi5HDxX1nkzb8KYBiwkHIGg7CTfo/AcGzoXAJBxLfg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] - bytestreamjs@2.0.1: - resolution: {integrity: sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==} - engines: {node: '>=6.0.0'} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.8': + resolution: {integrity: sha512-Jmzr3FA4S2tHhaC6yCjac3rGf7hG9R6Gf2z9i9JFcuyy0u79HfQsh/thifbYTF2ic82KJovKKkIB6Z9TdNhCXQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + '@tailwindcss/oxide-linux-arm64-gnu@4.1.4': + resolution: {integrity: sha512-hKlLNvbmUC6z5g/J4H+Zx7f7w15whSVImokLPmP6ff1QqTVE+TxUM9PGuNsjHvkvlHUtGTdDnOvGNSEUiXI1Ww==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + '@tailwindcss/oxide-linux-arm64-gnu@4.1.8': + resolution: {integrity: sha512-qq7jXtO1+UEtCmCeBBIRDrPFIVI4ilEQ97qgBGdwXAARrUqSn/L9fUrkb1XP/mvVtoVeR2bt/0L77xx53bPZ/Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + '@tailwindcss/oxide-linux-arm64-musl@4.1.4': + resolution: {integrity: sha512-X3As2xhtgPTY/m5edUtddmZ8rCruvBvtxYLMw9OsZdH01L2gS2icsHRwxdU0dMItNfVmrBezueXZCHxVeeb7Aw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] - camel-case@3.0.0: - resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} + '@tailwindcss/oxide-linux-arm64-musl@4.1.8': + resolution: {integrity: sha512-O6b8QesPbJCRshsNApsOIpzKt3ztG35gfX9tEf4arD7mwNinsoCKxkj8TgEE0YRjmjtO3r9FlJnT/ENd9EVefQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] - caniuse-lite@1.0.30001701: - resolution: {integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==} + '@tailwindcss/oxide-linux-x64-gnu@4.1.4': + resolution: {integrity: sha512-2VG4DqhGaDSmYIu6C4ua2vSLXnJsb/C9liej7TuSO04NK+JJJgJucDUgmX6sn7Gw3Cs5ZJ9ZLrnI0QRDOjLfNQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] - cbor2@1.12.0: - resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==} - engines: {node: '>=18.7'} + '@tailwindcss/oxide-linux-x64-gnu@4.1.8': + resolution: {integrity: sha512-32iEXX/pXwikshNOGnERAFwFSfiltmijMIAbUhnNyjFr3tmWmMJWQKU2vNcFX0DACSXJ3ZWcSkzNbaKTdngH6g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] - chai@5.2.0: - resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} - engines: {node: '>=12'} + '@tailwindcss/oxide-linux-x64-musl@4.1.4': + resolution: {integrity: sha512-v+mxVgH2kmur/X5Mdrz9m7TsoVjbdYQT0b4Z+dr+I4RvreCNXyCFELZL/DO0M1RsidZTrm6O1eMnV6zlgEzTMQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + '@tailwindcss/oxide-linux-x64-musl@4.1.8': + resolution: {integrity: sha512-s+VSSD+TfZeMEsCaFaHTaY5YNj3Dri8rST09gMvYQKwPphacRG7wbuQ5ZJMIJXN/puxPcg/nU+ucvWguPpvBDg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] - chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} + '@tailwindcss/oxide-wasm32-wasi@4.1.4': + resolution: {integrity: sha512-2TLe9ir+9esCf6Wm+lLWTMbgklIjiF0pbmDnwmhR9MksVOq+e8aP3TSsXySnBDDvTTVd/vKu1aNttEGj3P6l8Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-wasm32-wasi@4.1.8': + resolution: {integrity: sha512-CXBPVFkpDjM67sS1psWohZ6g/2/cd+cq56vPxK4JeawelxwK4YECgl9Y9TjkE2qfF+9/s1tHHJqrC4SS6cVvSg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.4': + resolution: {integrity: sha512-VlnhfilPlO0ltxW9/BgfLI5547PYzqBMPIzRrk4W7uupgCt8z6Trw/tAj6QUtF2om+1MH281Pg+HHUJoLesmng==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + '@tailwindcss/oxide-win32-arm64-msvc@4.1.8': + resolution: {integrity: sha512-7GmYk1n28teDHUjPlIx4Z6Z4hHEgvP5ZW2QS9ygnDAdI/myh3HTHjDqtSqgu1BpRoI4OiLx+fThAyA1JePoENA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] - change-case@3.1.0: - resolution: {integrity: sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==} + '@tailwindcss/oxide-win32-x64-msvc@4.1.4': + resolution: {integrity: sha512-+7S63t5zhYjslUGb8NcgLpFXD+Kq1F/zt5Xv5qTv7HaFTG/DHyHD9GA6ieNAxhgyA4IcKa/zy7Xx4Oad2/wuhw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + '@tailwindcss/oxide-win32-x64-msvc@4.1.8': + resolution: {integrity: sha512-fou+U20j+Jl0EHwK92spoWISON2OBnCazIc038Xj2TdweYV33ZRkS9nwqiUi2d/Wba5xg5UoHfvynnb/UB49cQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} + '@tailwindcss/oxide@4.1.4': + resolution: {integrity: sha512-p5wOpXyOJx7mKh5MXh5oKk+kqcz8T+bA3z/5VWWeQwFrmuBItGwz8Y2CHk/sJ+dNb9B0nYFfn0rj/cKHZyjahQ==} + engines: {node: '>= 10'} - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + '@tailwindcss/oxide@4.1.8': + resolution: {integrity: sha512-d7qvv9PsM5N3VNKhwVUhpK6r4h9wtLkJ6lz9ZY9aeZgrUWk1Z8VPyqyDT9MZlem7GTGseRQHkeB1j3tC7W1P+A==} + engines: {node: '>= 10'} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} + '@tailwindcss/postcss@4.1.8': + resolution: {integrity: sha512-vB/vlf7rIky+w94aWMw34bWW1ka6g6C3xIOdICKX2GC0VcLtL6fhlLiafF0DVIwa9V6EHz8kbWMkS2s2QvvNlw==} - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} + '@tailwindcss/vite@4.1.4': + resolution: {integrity: sha512-4UQeMrONbvrsXKXXp/uxmdEN5JIJ9RkH7YVzs6AMxC/KC1+Np7WZBaNIco7TEjlkthqxZbt8pU/ipD+hKjm80A==} + peerDependencies: + vite: ^5.2.0 || ^6 - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + '@tanstack/query-core@5.74.3': + resolution: {integrity: sha512-Mqk+5o3qTuAiZML248XpNH8r2cOzl15+LTbUsZQEwvSvn1GU4VQhvqzAbil36p+MBxpr/58oBSnRzhrBevDhfg==} - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} + '@tanstack/react-query@5.74.3': + resolution: {integrity: sha512-QrycUn0wxjVPzITvQvOxFRdhlAwIoOQSuav7qWD4SWCoKCdLbyRZ2vji2GuBq/glaxbF4wBx3fqcYRDOt8KDTA==} + peerDependencies: + react: ^18 || ^19 - cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + '@turbo/gen@1.13.4': + resolution: {integrity: sha512-PK38N1fHhDUyjLi0mUjv0RbX0xXGwDLQeRSGsIlLcVpP1B5fwodSIwIYXc9vJok26Yne94BX5AGjueYsUT3uUw==} + hasBin: true - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + '@turbo/workspaces@1.13.4': + resolution: {integrity: sha512-3uYg2b5TWCiupetbDFMbBFMHl33xQTvp5DNg0fZSYal73Z9AlFH9yWabHWMYw6ywmwM1evkYRpTVA2n7GgqT5A==} + hasBin: true - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - concurrently@8.2.2: - resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} - engines: {node: ^14.13.0 || >=16.0.0} - hasBin: true + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - constant-case@2.0.0: - resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - core-js-pure@3.39.0: - resolution: {integrity: sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==} + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} + '@types/inquirer@6.5.0': + resolution: {integrity: sha512-rjaYQ9b9y/VFGOpqBEXRavc3jh0a+e6evAbI31tMda8VlPaSy0AZJfXsvmIe3wklc7W6C3zCSfleuMXR7NOyXw==} - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + '@types/isomorphic-fetch@0.0.39': + resolution: {integrity: sha512-I0gou/ZdA1vMG7t7gMzL7VYu2xAKU78rW9U1l10MI0nn77pEHq3tQqHQ8hMmXdMpBlkxZOorjI4sO594Z3kKJw==} - data-uri-to-buffer@6.0.2: - resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} - engines: {node: '>= 14'} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} + '@types/node@20.17.6': + resolution: {integrity: sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==} - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + '@types/node@22.13.9': + resolution: {integrity: sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==} - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + '@types/node@22.15.29': + resolution: {integrity: sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==} - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} + '@types/node@22.7.5': + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} + '@types/prop-types@15.7.13': + resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + '@types/react-dom@18.3.1': + resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + '@types/react-dom@19.1.2': + resolution: {integrity: sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==} + peerDependencies: + '@types/react': ^19.0.0 - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + '@types/react-syntax-highlighter@15.5.13': + resolution: {integrity: sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==} - degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} + '@types/react@18.3.0': + resolution: {integrity: sha512-DiUcKjzE6soLyln8NNZmyhcQjVv+WsUIFSqetMN0p8927OztKT4VTfFTqsbAi5oAGIcgOmOajlfBqyptDDjZRw==} - del@5.1.0: - resolution: {integrity: sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==} - engines: {node: '>=8'} + '@types/react@18.3.1': + resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} + '@types/react@19.1.2': + resolution: {integrity: sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==} - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} + '@types/through@0.0.33': + resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + '@types/tinycolor2@1.4.6': + resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - dot-case@2.1.1: - resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - dotenv@16.0.3: - resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} - engines: {node: '>=12'} + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} - engines: {node: '>=12'} + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + '@typescript-eslint/eslint-plugin@8.15.0': + resolution: {integrity: sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + '@typescript-eslint/eslint-plugin@8.30.1': + resolution: {integrity: sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} + '@typescript-eslint/parser@8.15.0': + resolution: {integrity: sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} + '@typescript-eslint/parser@8.30.1': + resolution: {integrity: sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' - es-abstract@1.23.5: - resolution: {integrity: sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==} - engines: {node: '>= 0.4'} + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + '@typescript-eslint/scope-manager@8.15.0': + resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + '@typescript-eslint/scope-manager@8.30.1': + resolution: {integrity: sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - es-iterator-helpers@1.2.0: - resolution: {integrity: sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==} - engines: {node: '>= 0.4'} + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - es-module-lexer@1.6.0: - resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + '@typescript-eslint/type-utils@8.15.0': + resolution: {integrity: sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + '@typescript-eslint/type-utils@8.30.1': + resolution: {integrity: sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + '@typescript-eslint/types@8.15.0': + resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + '@typescript-eslint/types@8.30.1': + resolution: {integrity: sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - esbuild@0.25.0: - resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} - engines: {node: '>=18'} - hasBin: true + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} + '@typescript-eslint/typescript-estree@8.15.0': + resolution: {integrity: sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + '@typescript-eslint/typescript-estree@8.30.1': + resolution: {integrity: sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true + '@typescript-eslint/utils@8.15.0': + resolution: {integrity: sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true + '@typescript-eslint/utils@8.30.1': + resolution: {integrity: sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '>=7.0.0' + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' - eslint-plugin-only-warn@1.1.0: - resolution: {integrity: sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==} - engines: {node: '>=6'} + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} - eslint-plugin-react-hooks@5.0.0: - resolution: {integrity: sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==} - engines: {node: '>=10'} + '@typescript-eslint/visitor-keys@8.15.0': + resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/visitor-keys@8.30.1': + resolution: {integrity: sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitejs/plugin-react@4.4.1': + resolution: {integrity: sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 - eslint-plugin-react@7.37.2: - resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==} - engines: {node: '>=4'} + '@vitejs/plugin-react@4.5.1': + resolution: {integrity: sha512-uPZBqSI0YD4lpkIru6M35sIfylLGTyhGHvDZbNLuMA73lMlwJKz5xweH7FajfcCAc2HnINciejA9qTz0dr0M7A==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 - eslint-plugin-turbo@2.3.1: - resolution: {integrity: sha512-M5MBYBkcQsv11MFHJ+6WpzLpiTBx0OApeUMAHlO4L0eHqQxY03GrmHXjXfozqB+9HwGrW9fqihBzVRllyixJDA==} + '@vitest/expect@3.1.2': + resolution: {integrity: sha512-O8hJgr+zREopCAqWl3uCVaOdqJwZ9qaDwUP7vy3Xigad0phZe9APxKhPcDNqYYi0rX5oMvwJMSCAXY2afqeTSA==} + + '@vitest/mocker@3.1.2': + resolution: {integrity: sha512-kOtd6K2lc7SQ0mBqYv/wdGedlqPdM/B38paPY+OwJ1XiNi44w3Fpog82UfOibmHaV9Wod18A09I9SCKLyDMqgw==} peerDependencies: - eslint: '>6.6.0' + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true - eslint-scope@8.2.0: - resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@vitest/pretty-format@3.1.2': + resolution: {integrity: sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w==} - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@vitest/runner@3.1.2': + resolution: {integrity: sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g==} - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@vitest/snapshot@3.1.2': + resolution: {integrity: sha512-Q1qkpazSF/p4ApZg1vfZSQ5Yw6OCQxVMVrLjslbLFA1hMDrT2uxtqMaw8Tc/jy5DLka1sNs1Y7rBcftMiaSH/Q==} - eslint@9.15.0: - resolution: {integrity: sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true + '@vitest/spy@3.1.2': + resolution: {integrity: sha512-OEc5fSXMws6sHVe4kOFyDSj/+4MSwst0ib4un0DlcYgQvRuYQ0+M2HyqGaauUMnjq87tmUaMNDxKQx7wNfVqPA==} + + '@vitest/utils@3.1.2': + resolution: {integrity: sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg==} + + '@wagmi/connectors@5.7.13': + resolution: {integrity: sha512-FHvqlECFJAoWOm1PEvVY1Zo2iy9tfE1CB97ivVjSSYb4UGAHvRxg4cb2gXTfsF7z1a3QxtU/Q0VI1m4y0NP0gg==} peerDependencies: - jiti: '*' + '@wagmi/core': 2.17.0 + typescript: '>=5.0.4' + viem: 2.x peerDependenciesMeta: - jiti: + typescript: optional: true - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@wagmi/core@2.17.0': + resolution: {integrity: sha512-MykiuU0rZUKtgVBctnOM+53zJmtodTD7rA97e7lLhXUevZcm60hUSl1BcgEIDd2wVOLEi2Xfrx641xpjruZvSA==} + peerDependencies: + '@tanstack/query-core': '>=5.0.0' + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + '@tanstack/query-core': + optional: true + typescript: + optional: true - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true + '@walletconnect/core@2.19.2': + resolution: {integrity: sha512-iu0mgLj51AXcKpdNj8+4EdNNBd/mkNjLEhZn6UMc/r7BM9WbmpPMEydA39WeRLbdLO4kbpmq4wTbiskI1rg+HA==} + engines: {node: '>=18'} - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} + '@walletconnect/environment@1.0.1': + resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + '@walletconnect/ethereum-provider@2.19.2': + resolution: {integrity: sha512-NzPzNcjMLqow6ha2nssB1ciMD0cdHZesYcHSQKjCi9waIDMov9Fr2yEJccbiVFE3cxek7f9dCPsoZez2q8ihvg==} - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + '@walletconnect/events@1.0.1': + resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + '@walletconnect/heartbeat@1.2.2': + resolution: {integrity: sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==} - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + '@walletconnect/jsonrpc-http-connection@1.0.8': + resolution: {integrity: sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==} - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + '@walletconnect/jsonrpc-provider@1.0.14': + resolution: {integrity: sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==} - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + '@walletconnect/jsonrpc-types@1.0.4': + resolution: {integrity: sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==} - expect-type@1.2.1: - resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} - engines: {node: '>=12.0.0'} + '@walletconnect/jsonrpc-utils@1.0.8': + resolution: {integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==} - extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + '@walletconnect/jsonrpc-ws-connection@1.0.16': + resolution: {integrity: sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + '@walletconnect/keyvaluestorage@1.1.1': + resolution: {integrity: sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==} + peerDependencies: + '@react-native-async-storage/async-storage': 1.x + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true - fake-indexeddb@6.0.0: - resolution: {integrity: sha512-YEboHE5VfopUclOck7LncgIqskAqnv4q0EWbYCaxKKjAvO93c+TJIaBuGy8CBFdbg9nKdpN3AuPRwVBJ4k7NrQ==} - engines: {node: '>=18'} + '@walletconnect/logger@2.1.2': + resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + '@walletconnect/modal-core@2.7.0': + resolution: {integrity: sha512-oyMIfdlNdpyKF2kTJowTixZSo0PGlCJRdssUN/EZdA6H6v03hZnf09JnwpljZNfir2M65Dvjm/15nGrDQnlxSA==} - fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} + '@walletconnect/modal-ui@2.7.0': + resolution: {integrity: sha512-gERYvU7D7K1ANCN/8vUgsE0d2hnRemfAFZ2novm9aZBg7TEd/4EgB+AqbJ+1dc7GhOL6dazckVq78TgccHb7mQ==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + '@walletconnect/modal@2.7.0': + resolution: {integrity: sha512-RQVt58oJ+rwqnPcIvRFeMGKuXb9qkgSmwz4noF8JZGUym3gUAzVs+uW2NQ1Owm9XOJAV+sANrtJ+VoVq1ftElw==} + deprecated: Please follow the migration guide on https://docs.reown.com/appkit/upgrade/wcm - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + '@walletconnect/relay-api@1.0.11': + resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==} - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + '@walletconnect/relay-auth@1.1.0': + resolution: {integrity: sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ==} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + '@walletconnect/safe-json@1.0.2': + resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} - fdir@6.4.4: - resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + '@walletconnect/sign-client@2.19.2': + resolution: {integrity: sha512-a/K5PRIFPCjfHq5xx3WYKHAAF8Ft2I1LtxloyibqiQOoUtNLfKgFB1r8sdMvXM7/PADNPe4iAw4uSE6PrARrfg==} + + '@walletconnect/time@1.0.2': + resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} + + '@walletconnect/types@2.19.2': + resolution: {integrity: sha512-/LZWhkVCUN+fcTgQUxArxhn2R8DF+LSd/6Wh9FnpjeK/Sdupx1EPS8okWG6WPAqq2f404PRoNAfQytQ82Xdl3g==} + + '@walletconnect/universal-provider@2.19.2': + resolution: {integrity: sha512-LkKg+EjcSUpPUhhvRANgkjPL38wJPIWumAYD8OK/g4OFuJ4W3lS/XTCKthABQfFqmiNbNbVllmywiyE44KdpQg==} + + '@walletconnect/utils@2.19.2': + resolution: {integrity: sha512-VU5CcUF4sZDg8a2/ov29OJzT3KfLuZqJUM0GemW30dlipI5fkpb0VPenZK7TcdLPXc1LN+Q+7eyTqHRoAu/BIA==} + + '@walletconnect/window-getters@1.0.1': + resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} + + '@walletconnect/window-metadata@1.0.1': + resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} + + abitype@1.0.8: + resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} peerDependencies: - picomatch: ^3 || ^4 + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 peerDependenciesMeta: - picomatch: + typescript: + optional: true + zod: optional: true - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} - fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} - fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} engines: {node: '>= 0.4'} - get-uri@6.0.3: - resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} - engines: {node: '>= 14'} + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + asn1js@3.0.6: + resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} + engines: {node: '>=12.0.0'} - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} - glob@11.0.1: - resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} - engines: {node: 20 || >=22} - hasBin: true + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + async-mutex@0.2.6: + resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} - globals@15.12.0: - resolution: {integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==} - engines: {node: '>=18'} + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - globby@10.0.2: - resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} - engines: {node: '>=8'} + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + engines: {node: '>=10.0.0'} - gradient-string@2.0.2: - resolution: {integrity: sha512-rEDCuqUQ4tbD78TpzsMtt5OIf0cBCSDWSJtUDaF6JsAh+k0v9r++NzxNEG87oDZx9ZwGhD8DaezR2L/yrw0Jdw==} - engines: {node: '>=10'} + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} - handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - happy-dom@13.10.1: - resolution: {integrity: sha512-9GZLEFvQL5EgfJX2zcBgu1nsPUn98JF/EiJnSfQbdxI6YEQGqpd09lXXxOmYonRBIEFz9JlGCOiPflDzgS1p8w==} - engines: {node: '>=16.0.0'} + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true - header-case@1.0.1: - resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} + bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} - engines: {node: '>= 14'} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - human-id@4.1.1: - resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} - hasBin: true + bufferutil@4.0.9: + resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} + engines: {node: '>=6.14.2'} - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + bytestreamjs@2.0.1: + resolution: {integrity: sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==} + engines: {node: '>=6.0.0'} - idb@7.1.1: - resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} - ignore-by-default@1.0.1: - resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + camel-case@3.0.0: + resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + caniuse-lite@1.0.30001701: + resolution: {integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==} - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + caniuse-lite@1.0.30001720: + resolution: {integrity: sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==} - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + cbor2@1.12.0: + resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==} + engines: {node: '>=18.7'} - inquirer@7.3.3: - resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} - engines: {node: '>=8.0.0'} + chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} + engines: {node: '>=12'} - inquirer@8.2.6: - resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} - engines: {node: '>=12.0.0'} + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + change-case@3.1.0: + resolution: {integrity: sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} - is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} - engines: {node: '>= 0.4'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} - is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} + cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} - is-lower-case@1.1.3: - resolution: {integrity: sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==} + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} - is-path-cwd@2.2.0: - resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} - is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} + comma-separated-tokens@1.0.8: + resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + concurrently@8.2.2: + resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true - is-upper-case@1.1.2: - resolution: {integrity: sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==} + constant-case@2.0.0: + resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + cookie-es@1.2.2: + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} + copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + core-js-pure@3.39.0: + resolution: {integrity: sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==} - isbinaryfile@4.0.10: - resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} - engines: {node: '>= 8.0.0'} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true - iterator.prototype@1.1.3: - resolution: {integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==} - engines: {node: '>= 0.4'} + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - jackspeak@4.1.0: - resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} - engines: {node: 20 || >=22} + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + cross-fetch@4.1.0: + resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + crossws@0.3.4: + resolution: {integrity: sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==} - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - jwt-decode@4.0.0: - resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} - engines: {node: '>=18'} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} - lefthook-darwin-arm64@1.11.10: - resolution: {integrity: sha512-Rufl8BRP77GRFtgNwW95/FHPD0VDfu5bRyzASPcyVrFczJiBK1glAHRdYrErBDNqJhEEjkyv9+EkCZS/MnDKPQ==} - cpu: [arm64] - os: [darwin] + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} - lefthook-darwin-x64@1.11.10: - resolution: {integrity: sha512-3ReMyC103S+RozcYQlej9RVa1tKr9t8/PGqXbCiWcPAgA9To3GywPk8533qzTs7Nz9fYDiqJMYyQoXovX0Q4SA==} - cpu: [x64] - os: [darwin] + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} - lefthook-freebsd-arm64@1.11.10: - resolution: {integrity: sha512-UQOdQuvoVEe0HnoVX4Uz8beegndBDKE6Igo5flV3OkrBuO1Cz7dGbTQwzsYg6gBLYUOa8Ecb3Xur80oviQqwnA==} - cpu: [arm64] - os: [freebsd] + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} - lefthook-freebsd-x64@1.11.10: - resolution: {integrity: sha512-IkoywmTzw9dKDtN34HJ8AZkbY3CGu1XpAVU08pIIvlhv0y7PlLGHYTdmx90SC1d4FhTlTMyiANgXyIaAnXjucw==} - cpu: [x64] - os: [freebsd] + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - lefthook-linux-arm64@1.11.10: - resolution: {integrity: sha512-l/lH4FSljNSIetcptPKLI5sTBpjS6dJZ4gk9oXoGM0ftvb22AlLcZI4l6NFCC1oLVWM0CbhkbStDGTI5txsVaA==} - cpu: [arm64] - os: [linux] + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - lefthook-linux-x64@1.11.10: - resolution: {integrity: sha512-yAIIP711p7t0Z9zLfPtdSx1d7pSgtnuVC5B9PANud3I0JOs82aCzmqpc9Q/zp+imWXdI2PpZlFyKx8GLrDW5BQ==} - cpu: [x64] - os: [linux] + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} - lefthook-openbsd-arm64@1.11.10: - resolution: {integrity: sha512-OAqg9BLsTaeioCJduzZrRLupA2dhTOwHOX0GkO4HTSrOD85JuEPqr5RbYoJ7zuzTQcJEXTJYzaeATM2QHjp/aQ==} - cpu: [arm64] - os: [openbsd] + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} - lefthook-openbsd-x64@1.11.10: - resolution: {integrity: sha512-EiUU3mFvqcUdnj3gt0V0gRpQQp0b70cLDSA0LgZyFMM4UimeMbA7OgNYl72RKJgrHcTPHrQc4Vj7Mowbhb/X5w==} - cpu: [x64] - os: [openbsd] + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - lefthook-windows-arm64@1.11.10: - resolution: {integrity: sha512-clKfI95dCpzxJ1zVgcuYWlSl2oNbtAALoMGqYrzJsoy+CAi+vIs54sqJoGOE60+zrVbdk65z8hriCoYNr98SgA==} - cpu: [arm64] - os: [win32] + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} - lefthook-windows-x64@1.11.10: - resolution: {integrity: sha512-zpf/0sG50xsGnwVG/a2giUbmaM/g0uIRqxN5qBbmwKCf0P4PPD2r1xiFZNDb520+tUTC1lWe0RWVoSSwZbBQRA==} - cpu: [x64] - os: [win32] + del@5.1.0: + resolution: {integrity: sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==} + engines: {node: '>=8'} - lefthook@1.11.10: - resolution: {integrity: sha512-nuiRqBADcRiU6dzwf2H1zBCsdcWGEOsxY8hqoXw5nkEuoTEYN1Bwi2vskHXjIzJ62iCOCo4FZhcHBAzT9gwL5g==} - hasBin: true + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + detect-browser@5.3.0: + resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} - lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} - log-symbols@3.0.0: - resolution: {integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==} + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + dot-case@2.1.1: + resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} - loupe@3.1.3: - resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} - lower-case-first@1.0.2: - resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} - lower-case@1.1.4: - resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} - lru-cache@11.1.0: - resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} - engines: {node: 20 || >=22} + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + eciesjs@0.4.14: + resolution: {integrity: sha512-eJAgf9pdv214Hn98FlUzclRMYWF7WfoLlkS9nWMTm1qcCwn6Ad4EGD9lr9HXMBfSrZhYQujRE+p0adPRkctC6A==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + electron-to-chromium@1.5.144: + resolution: {integrity: sha512-eJIaMRKeAzxfBSxtjYnoIAw/tdD6VIH6tHBZepZnAbE3Gyqqs5mGN87DvcldPUbVkIljTK8pY0CMcUljP64lfQ==} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} - engines: {node: 20 || >=22} + engine.io-client@6.6.3: + resolution: {integrity: sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + es-abstract@1.23.5: + resolution: {integrity: sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==} + engines: {node: '>= 0.4'} - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} - mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + es-iterator-helpers@1.2.0: + resolution: {integrity: sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + es-toolkit@1.33.0: + resolution: {integrity: sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} hasBin: true - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + esbuild@0.25.2: + resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} + engines: {node: '>=18'} hasBin: true - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} - netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} - next@15.1.0: - resolution: {integrity: sha512-QKhzt6Y8rgLNlj30izdMbxAwjHMFANnLwDwZ+WQh5sMhyt4lEBqDK9QpvWHtIM4rINKPoJ8aiRZKg5ULSybVHw==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 - babel-plugin-react-compiler: '*' - react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - sass: ^1.3.0 + eslint: '>=7.0.0' + + eslint-plugin-only-warn@1.1.0: + resolution: {integrity: sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==} + engines: {node: '>=6'} + + eslint-plugin-prettier@5.4.1: + resolution: {integrity: sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - babel-plugin-react-compiler: + '@types/eslint': optional: true - sass: + eslint-config-prettier: optional: true - no-case@2.3.2: - resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} - - node-plop@0.26.3: - resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==} - engines: {node: '>=8.9.4'} + eslint-plugin-react-hooks@5.0.0: + resolution: {integrity: sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - nodemon@3.1.9: - resolution: {integrity: sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==} + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} engines: {node: '>=10'} - hasBin: true + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + eslint-plugin-react-refresh@0.4.19: + resolution: {integrity: sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==} + peerDependencies: + eslint: '>=8.40' - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + eslint-plugin-react@7.37.2: + resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + eslint-plugin-turbo@2.3.1: + resolution: {integrity: sha512-M5MBYBkcQsv11MFHJ+6WpzLpiTBx0OApeUMAHlO4L0eHqQxY03GrmHXjXfozqB+9HwGrW9fqihBzVRllyixJDA==} + peerDependencies: + eslint: '>6.6.0' - object-inspect@1.13.3: - resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} - engines: {node: '>= 0.4'} + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + eslint-scope@8.3.0: + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + eslint@9.15.0: + resolution: {integrity: sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} + eslint@9.24.0: + resolution: {integrity: sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} - ora@4.1.1: - resolution: {integrity: sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==} - engines: {node: '>=8'} + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} - ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + eth-block-tracker@7.1.0: + resolution: {integrity: sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==} + engines: {node: '>=14.0.0'} - ox@0.7.0: - resolution: {integrity: sha512-mgRXlQdaNukQcsvGsPENGbyFvr7glob8UmOusDfWTw7A6LcjI+9OCelQ6NoAiSk6iM77R667qyUzn+n2Cr4SJw==} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true + eth-json-rpc-filters@6.0.1: + resolution: {integrity: sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==} + engines: {node: '>=14.0.0'} - p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} + eth-query@2.1.2: + resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + eth-rpc-errors@4.0.3: + resolution: {integrity: sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==} - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + ethers@6.13.5: + resolution: {integrity: sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==} + engines: {node: '>=14.0.0'} - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} + eventemitter2@6.4.9: + resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} - p-map@3.0.0: - resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} - engines: {node: '>=8'} + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} - pac-proxy-agent@7.0.2: - resolution: {integrity: sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==} - engines: {node: '>= 14'} + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} - pac-resolver@7.0.1: - resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} - engines: {node: '>= 14'} + expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + engines: {node: '>=12.0.0'} - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - package-manager-detector@0.2.8: - resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==} + extension-port-stream@3.0.0: + resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} + engines: {node: '>=12.0.0'} - param-case@2.1.1: - resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + fake-indexeddb@6.0.0: + resolution: {integrity: sha512-YEboHE5VfopUclOck7LncgIqskAqnv4q0EWbYCaxKKjAvO93c+TJIaBuGy8CBFdbg9nKdpN3AuPRwVBJ4k7NrQ==} + engines: {node: '>=18'} - pascal-case@2.0.1: - resolution: {integrity: sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - path-case@2.1.1: - resolution: {integrity: sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==} + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - path-scurry@2.0.0: - resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} - engines: {node: 20 || >=22} + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} - engines: {node: '>= 14.16'} + fault@1.0.4: + resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + fdir@6.4.4: + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} - pkijs@3.2.5: - resolution: {integrity: sha512-WX0la7n7CbnguuaIQoT4Fc0IJckPDOUldzOwlZ0nwpOcySS+Six/tXBdc0RX17J5o1To0SAr3xDJjDLsOfDFQA==} - engines: {node: '>=12.0.0'} + filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} - postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} - engines: {node: ^10 || ^12 || >=14} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - hasBin: true - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} - proxy-agent@6.4.0: - resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} - engines: {node: '>= 14'} + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + framer-motion@12.7.2: + resolution: {integrity: sha512-0vLY/JqYqieojTriuIR+UTCBVbj89eNUxXTkb01Xg8gSiTXDeuscOvoYm8vvgRGLMYGsCuJ31kDsTy081kPKFw==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true - pstree.remy@1.1.8: - resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} - pvtsutils@1.3.6: - resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} - pvutils@1.1.3: - resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} - engines: {node: '>=6.0.0'} + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] - react-dom@19.0.0: - resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} - peerDependencies: - react: ^19.0.0 + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} - react@19.0.0: - resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} - engines: {node: '>=0.10.0'} + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} - reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} - regexp.prototype.flags@1.5.3: - resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - registry-auth-token@3.3.2: - resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==} + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} - registry-url@3.1.0: - resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} - engines: {node: '>=0.10.0'} + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + get-uri@6.0.3: + resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} + engines: {node: '>= 14'} - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + glob@11.0.1: + resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} + engines: {node: 20 || >=22} hasBin: true - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} - rimraf@6.0.1: - resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} - engines: {node: 20 || >=22} - hasBin: true + globals@15.12.0: + resolution: {integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==} + engines: {node: '>=18'} - rollup@4.40.0: - resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} - run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + globby@10.0.2: + resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} + engines: {node: '>=8'} - rxjs@6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} - rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + gradient-string@2.0.2: + resolution: {integrity: sha512-rEDCuqUQ4tbD78TpzsMtt5OIf0cBCSDWSJtUDaF6JsAh+k0v9r++NzxNEG87oDZx9ZwGhD8DaezR2L/yrw0Jdw==} + engines: {node: '>=10'} - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - scheduler@0.25.0: - resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + h3@1.15.3: + resolution: {integrity: sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==} - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} hasBin: true - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} - engines: {node: '>=10'} - hasBin: true + happy-dom@13.10.1: + resolution: {integrity: sha512-9GZLEFvQL5EgfJX2zcBgu1nsPUn98JF/EiJnSfQbdxI6YEQGqpd09lXXxOmYonRBIEFz9JlGCOiPflDzgS1p8w==} + engines: {node: '>=16.0.0'} - sentence-case@2.1.1: - resolution: {integrity: sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==} + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} - sharp@0.33.5: - resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} - shell-quote@1.8.2: - resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + hast-util-parse-selector@2.2.5: + resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + hastscript@6.0.0: + resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + header-case@1.0.1: + resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} - simple-update-notifier@2.0.0: - resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} - engines: {node: '>=10'} + hey-listen@1.0.8: + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + highlightjs-vue@1.0.0: + resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} - snake-case@2.1.0: - resolution: {integrity: sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} - socks-proxy-agent@8.0.4: - resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} + https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} engines: {node: '>= 14'} - socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + human-id@4.1.1: + resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} + hasBin: true - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - spawn-command@0.0.2: - resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + idb-keyval@6.2.1: + resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} - spawndamnit@3.0.1: - resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} - std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} - engines: {node: '>= 0.4'} + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} + inquirer@7.3.3: + resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} + engines: {node: '>=8.0.0'} - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + inquirer@8.2.6: + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + engines: {node: '>=12.0.0'} - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - styled-jsx@5.1.6: - resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} - swap-case@1.1.2: - resolution: {integrity: sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==} - - term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} - tinycolor2@1.6.0: - resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - tinyglobby@0.2.13: - resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} - engines: {node: '>=12.0.0'} + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} - tinygradient@1.1.5: - resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} - tinypool@1.0.2: - resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} - engines: {node: ^18.0.0 || >=20.0.0} + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} - engines: {node: '>=14.0.0'} + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} - title-case@2.1.1: - resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + is-lower-case@1.1.3: + resolution: {integrity: sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==} - touch@3.1.1: - resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} - hasBin: true + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} - ts-api-utils@1.4.0: - resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + is-path-cwd@2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} - turbo-darwin-64@2.5.0: - resolution: {integrity: sha512-fP1hhI9zY8hv0idym3hAaXdPi80TLovmGmgZFocVAykFtOxF+GlfIgM/l4iLAV9ObIO4SUXPVWHeBZQQ+Hpjag==} - cpu: [x64] - os: [darwin] + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} - turbo-darwin-arm64@2.5.0: - resolution: {integrity: sha512-p9sYq7kXH7qeJwIQE86cOWv/xNqvow846l6c/qWc26Ib1ci5W7V0sI5thsrP3eH+VA0d+SHalTKg5SQXgNQBWA==} - cpu: [arm64] - os: [darwin] + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} - turbo-linux-64@2.5.0: - resolution: {integrity: sha512-1iEln2GWiF3iPPPS1HQJT6ZCFXynJPd89gs9SkggH2EJsj3eRUSVMmMC8y6d7bBbhBFsiGGazwFIYrI12zs6uQ==} - cpu: [x64] - os: [linux] + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} - turbo-linux-arm64@2.5.0: - resolution: {integrity: sha512-bKBcbvuQHmsX116KcxHJuAcppiiBOfivOObh2O5aXNER6mce7YDDQJy00xQQNp1DhEfcSV2uOsvb3O3nN2cbcA==} - cpu: [arm64] - os: [linux] + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} - turbo-windows-64@2.5.0: - resolution: {integrity: sha512-9BCo8oQ7BO7J0K913Czbc3tw8QwLqn2nTe4E47k6aVYkM12ASTScweXPTuaPFP5iYXAT6z5Dsniw704Ixa5eGg==} - cpu: [x64] - os: [win32] + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} - turbo-windows-arm64@2.5.0: - resolution: {integrity: sha512-OUHCV+ueXa3UzfZ4co/ueIHgeq9B2K48pZwIxKSm5VaLVuv8M13MhM7unukW09g++dpdrrE1w4IOVgxKZ0/exg==} - cpu: [arm64] - os: [win32] + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} - turbo@2.5.0: - resolution: {integrity: sha512-PvSRruOsitjy6qdqwIIyolv99+fEn57gP6gn4zhsHTEcCYgXPhv6BAxzAjleS8XKpo+Y582vTTA9nuqYDmbRuA==} - hasBin: true + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + is-upper-case@1.1.2: + resolution: {integrity: sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.3: - resolution: {integrity: sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==} - engines: {node: '>= 0.4'} + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} engines: {node: '>= 0.4'} - typescript-eslint@8.15.0: - resolution: {integrity: sha512-wY4FRGl0ZI+ZU4Jo/yjdBu0lVTSML58pu6PgGtJmCufvzfV565pUF6iACQt092uFOd49iLOTX/sEVmHtbSrS+w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} - engines: {node: '>=14.17'} - hasBin: true - - typescript@5.7.3: - resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} - engines: {node: '>=14.17'} - hasBin: true - - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} - engines: {node: '>=14.17'} - hasBin: true - - uglify-js@3.19.3: - resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} - engines: {node: '>=0.8.0'} - hasBin: true - - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - - undefsafe@2.0.5: - resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} - - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} - update-check@1.5.4: - resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - upper-case-first@1.1.2: - resolution: {integrity: sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==} + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - upper-case@1.1.3: - resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} + isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + isomorphic-fetch@3.0.0: + resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true + isows@1.0.6: + resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} + peerDependencies: + ws: '*' - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + iterator.prototype@1.1.3: + resolution: {integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==} + engines: {node: '>= 0.4'} - validate-npm-package-name@5.0.1: - resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + jackspeak@4.1.0: + resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} + engines: {node: 20 || >=22} - vite-node@3.1.2: - resolution: {integrity: sha512-/8iMryv46J3aK13iUXsei5G/A3CUlW4665THCPS+K8xAaqrVWiGB4RfXMQXCLjpK9P2eK//BczrVkn5JLAk6DA==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true - vite@6.3.2: - resolution: {integrity: sha512-ZSvGOXKGceizRQIZSz7TGJ0pS3QLlVY/9hwxVh17W3re67je1RKYzFHivZ/t0tubU78Vkyb9WnHPENSBCzbckg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true + jotai@2.12.3: + resolution: {integrity: sha512-DpoddSkmPGXMFtdfnoIHfueFeGP643nqYUWC6REjUcME+PG2UkAtYnLbffRDw3OURI9ZUTcRWkRGLsOvxuWMCg==} + engines: {node: '>=12.20.0'} peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 + '@types/react': '>=17.0.0' + react: '>=17.0.0' peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: + '@types/react': optional: true - yaml: + react: optional: true - vitest@3.1.2: - resolution: {integrity: sha512-WaxpJe092ID1C0mr+LH9MmNrhfzi8I65EX/NRU/Ld016KqQNRgxSOlGNP1hHN+a/F8L15Mh8klwaF77zR3GeDQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.1.2 - '@vitest/ui': 3.1.2 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/debug': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - which-builtin-type@1.1.4: - resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} - engines: {node: '>= 0.4'} + json-rpc-engine@6.1.0: + resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} + engines: {node: '>=10.0.0'} - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + json-rpc-random-id@1.0.1: + resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} hasBin: true - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + jwt-decode@4.0.0: + resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} + engines: {node: '>=18'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + keyvaluestorage-interface@1.0.0: + resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + lefthook-darwin-arm64@1.11.10: + resolution: {integrity: sha512-Rufl8BRP77GRFtgNwW95/FHPD0VDfu5bRyzASPcyVrFczJiBK1glAHRdYrErBDNqJhEEjkyv9+EkCZS/MnDKPQ==} + cpu: [arm64] + os: [darwin] - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + lefthook-darwin-x64@1.11.10: + resolution: {integrity: sha512-3ReMyC103S+RozcYQlej9RVa1tKr9t8/PGqXbCiWcPAgA9To3GywPk8533qzTs7Nz9fYDiqJMYyQoXovX0Q4SA==} + cpu: [x64] + os: [darwin] - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} + lefthook-freebsd-arm64@1.11.10: + resolution: {integrity: sha512-UQOdQuvoVEe0HnoVX4Uz8beegndBDKE6Igo5flV3OkrBuO1Cz7dGbTQwzsYg6gBLYUOa8Ecb3Xur80oviQqwnA==} + cpu: [arm64] + os: [freebsd] - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + lefthook-freebsd-x64@1.11.10: + resolution: {integrity: sha512-IkoywmTzw9dKDtN34HJ8AZkbY3CGu1XpAVU08pIIvlhv0y7PlLGHYTdmx90SC1d4FhTlTMyiANgXyIaAnXjucw==} + cpu: [x64] + os: [freebsd] -snapshots: + lefthook-linux-arm64@1.11.10: + resolution: {integrity: sha512-l/lH4FSljNSIetcptPKLI5sTBpjS6dJZ4gk9oXoGM0ftvb22AlLcZI4l6NFCC1oLVWM0CbhkbStDGTI5txsVaA==} + cpu: [arm64] + os: [linux] - '@0xsequence/tee-verifier@0.1.1': - dependencies: + lefthook-linux-x64@1.11.10: + resolution: {integrity: sha512-yAIIP711p7t0Z9zLfPtdSx1d7pSgtnuVC5B9PANud3I0JOs82aCzmqpc9Q/zp+imWXdI2PpZlFyKx8GLrDW5BQ==} + cpu: [x64] + os: [linux] + + lefthook-openbsd-arm64@1.11.10: + resolution: {integrity: sha512-OAqg9BLsTaeioCJduzZrRLupA2dhTOwHOX0GkO4HTSrOD85JuEPqr5RbYoJ7zuzTQcJEXTJYzaeATM2QHjp/aQ==} + cpu: [arm64] + os: [openbsd] + + lefthook-openbsd-x64@1.11.10: + resolution: {integrity: sha512-EiUU3mFvqcUdnj3gt0V0gRpQQp0b70cLDSA0LgZyFMM4UimeMbA7OgNYl72RKJgrHcTPHrQc4Vj7Mowbhb/X5w==} + cpu: [x64] + os: [openbsd] + + lefthook-windows-arm64@1.11.10: + resolution: {integrity: sha512-clKfI95dCpzxJ1zVgcuYWlSl2oNbtAALoMGqYrzJsoy+CAi+vIs54sqJoGOE60+zrVbdk65z8hriCoYNr98SgA==} + cpu: [arm64] + os: [win32] + + lefthook-windows-x64@1.11.10: + resolution: {integrity: sha512-zpf/0sG50xsGnwVG/a2giUbmaM/g0uIRqxN5qBbmwKCf0P4PPD2r1xiFZNDb520+tUTC1lWe0RWVoSSwZbBQRA==} + cpu: [x64] + os: [win32] + + lefthook@1.11.10: + resolution: {integrity: sha512-nuiRqBADcRiU6dzwf2H1zBCsdcWGEOsxY8hqoXw5nkEuoTEYN1Bwi2vskHXjIzJ62iCOCo4FZhcHBAzT9gwL5g==} + hasBin: true + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lightningcss-darwin-arm64@1.29.2: + resolution: {integrity: sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.29.2: + resolution: {integrity: sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.29.2: + resolution: {integrity: sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.29.2: + resolution: {integrity: sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.29.2: + resolution: {integrity: sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.29.2: + resolution: {integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.29.2: + resolution: {integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.29.2: + resolution: {integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.29.2: + resolution: {integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.29.2: + resolution: {integrity: sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.29.2: + resolution: {integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==} + engines: {node: '>= 12.0.0'} + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + + lit-element@3.3.3: + resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} + + lit-html@2.8.0: + resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} + + lit@2.8.0: + resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@3.0.0: + resolution: {integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==} + engines: {node: '>=8'} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + + lower-case-first@1.0.2: + resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} + + lower-case@1.1.4: + resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} + + lowlight@1.20.0: + resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.1.0: + resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lucide-react@0.493.0: + resolution: {integrity: sha512-seXg+XrQKArnZO3KvNsS6GcolPNekYHvf10e+Gn5vPsle+C+Jqq7dHJh2t4kwvofyAaKe8zTdVgKrGL0H3ecVg==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} + + mipd@0.0.7: + resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + motion-dom@12.7.2: + resolution: {integrity: sha512-7+sytBQyb9XRRH6lyLRQf+R6y2BE79J2EgTijTSxYgGt+ufpnoRDPgru9KHvA125tTHnbAXDzeTUb9OvscSitA==} + + motion-utils@12.7.2: + resolution: {integrity: sha512-XhZwqctxyJs89oX00zn3OGCuIIpVevbTa+u82usWBC6pSHUd2AoNWiYa7Du8tJxJy9TFbZ82pcn5t7NOm1PHAw==} + + motion@10.16.2: + resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} + + motion@12.7.2: + resolution: {integrity: sha512-ZFzhSCuKJYq0UdvFkEkWB6kWfiP+BjiLUkYh1ev7S48fipH0XdiCVHK1xct/zZU13AN7ESIqtm50pKsSDvRqmg==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multiformats@9.9.0: + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + + next@15.1.0: + resolution: {integrity: sha512-QKhzt6Y8rgLNlj30izdMbxAwjHMFANnLwDwZ+WQh5sMhyt4lEBqDK9QpvWHtIM4rINKPoJ8aiRZKg5ULSybVHw==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + + no-case@2.3.2: + resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + node-fetch-native@1.6.6: + resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-mock-http@1.0.0: + resolution: {integrity: sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==} + + node-plop@0.26.3: + resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==} + engines: {node: '>=8.9.4'} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + nodemon@3.1.9: + resolution: {integrity: sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==} + engines: {node: '>=10'} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + obj-multiplex@1.0.0: + resolution: {integrity: sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + + ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + + on-exit-leak-free@0.2.0: + resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@4.1.1: + resolution: {integrity: sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==} + engines: {node: '>=8'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + ox@0.6.12: + resolution: {integrity: sha512-78hziRGLj0qTDa0UW4+ynv9tW2Cp1vmCfGokL8D7kiSDh6Y0LAfHL+HaDN4l2a9jcrOG3fexTDtLNtDNkEwLtg==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.6.7: + resolution: {integrity: sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.6.9: + resolution: {integrity: sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.7.0: + resolution: {integrity: sha512-mgRXlQdaNukQcsvGsPENGbyFvr7glob8UmOusDfWTw7A6LcjI+9OCelQ6NoAiSk6iM77R667qyUzn+n2Cr4SJw==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-map@3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + pac-proxy-agent@7.0.2: + resolution: {integrity: sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@0.2.8: + resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==} + + param-case@2.1.1: + resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + + pascal-case@2.0.1: + resolution: {integrity: sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==} + + path-case@2.1.1: + resolution: {integrity: sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + + pino-abstract-transport@0.5.0: + resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + + pino-std-serializers@4.0.0: + resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + + pino@7.11.0: + resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} + hasBin: true + + pkijs@3.2.5: + resolution: {integrity: sha512-WX0la7n7CbnguuaIQoT4Fc0IJckPDOUldzOwlZ0nwpOcySS+Six/tXBdc0RX17J5o1To0SAr3xDJjDLsOfDFQA==} + engines: {node: '>=12.0.0'} + + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + + pony-cause@2.1.11: + resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} + engines: {node: '>=12.0.0'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.5.4: + resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} + engines: {node: ^10 || ^12 || >=14} + + preact@10.26.5: + resolution: {integrity: sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} + hasBin: true + + prismjs@1.27.0: + resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} + engines: {node: '>=6'} + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@5.6.0: + resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} + + proxy-agent@6.4.0: + resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} + engines: {node: '>= 14'} + + proxy-compare@2.5.1: + resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pvtsutils@1.3.6: + resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + + pvutils@1.1.3: + resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} + engines: {node: '>=6.0.0'} + + qrcode.react@4.2.0: + resolution: {integrity: sha512-QpgqWi8rD9DsS9EP3z7BT+5lY5SFhsqGjpgW5DY/i3mK4M9DTBNz3ErMi8BWYEfI3L0d8GIbGmcdFAS1uIRGjA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + qrcode@1.5.3: + resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} + engines: {node: '>=10.13.0'} + hasBin: true + + query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-dom@19.0.0: + resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + peerDependencies: + react: ^19.0.0 + + react-hook-form@7.55.0: + resolution: {integrity: sha512-XRnjsH3GVMQz1moZTW53MxfoWN7aDpUg/GpVNc4A3eXRVNdGXfbzJ4vM4aLQ8g6XCUh1nIbx70aaNCl7kxnjog==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.6.3: + resolution: {integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-router@7.5.3: + resolution: {integrity: sha512-3iUDM4/fZCQ89SXlDa+Ph3MevBrozBAI655OAfWQlTm9nBR0IKlrmNwFow5lPHttbwvITZfkeeeZFP6zt3F7pw==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-syntax-highlighter@15.6.1: + resolution: {integrity: sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==} + peerDependencies: + react: '>= 0.14.0' + + react@19.0.0: + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + engines: {node: '>=0.10.0'} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + real-require@0.1.0: + resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} + engines: {node: '>= 12.13.0'} + + reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + + refractor@3.6.0: + resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regexp.prototype.flags@1.5.3: + resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} + engines: {node: '>= 0.4'} + + registry-auth-token@3.3.2: + resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==} + + registry-url@3.1.0: + resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} + engines: {node: '>=0.10.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@6.0.1: + resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} + engines: {node: 20 || >=22} + hasBin: true + + rollup@4.40.0: + resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.25.0: + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + sentence-case@2.1.1: + resolution: {integrity: sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.2: + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + snake-case@2.1.0: + resolution: {integrity: sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==} + + socket.io-client@4.8.1: + resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socks-proxy-agent@8.0.4: + resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} + engines: {node: '>= 14'} + + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + sonic-boom@2.8.0: + resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + + spawn-command@0.0.2: + resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + + split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + superstruct@1.0.4: + resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} + engines: {node: '>=14.0.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + swap-case@1.1.2: + resolution: {integrity: sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==} + + synckit@0.11.8: + resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} + engines: {node: ^14.18.0 || >=16.0.0} + + tailwind-merge@3.2.0: + resolution: {integrity: sha512-FQT/OVqCD+7edmmJpsgCsY820RTD5AkBryuG5IUqR5YQZSdj5xlH5nLgH7YPths7WsLPSpSBNneJdM8aS8aeFA==} + + tailwindcss@4.1.4: + resolution: {integrity: sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A==} + + tailwindcss@4.1.8: + resolution: {integrity: sha512-kjeW8gjdxasbmFKpVGrGd5T4i40mV5J2Rasw48QARfYeQ8YS9x02ON9SFWax3Qf616rt4Cp3nVNIj6Hd1mP3og==} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + thread-stream@0.15.2: + resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.13: + resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + engines: {node: '>=12.0.0'} + + tinygradient@1.1.5: + resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} + + tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + + title-case@2.1.1: + resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + + touch@3.1.1: + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} + hasBin: true + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-api-utils@1.4.0: + resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + turbo-darwin-64@2.5.0: + resolution: {integrity: sha512-fP1hhI9zY8hv0idym3hAaXdPi80TLovmGmgZFocVAykFtOxF+GlfIgM/l4iLAV9ObIO4SUXPVWHeBZQQ+Hpjag==} + cpu: [x64] + os: [darwin] + + turbo-darwin-arm64@2.5.0: + resolution: {integrity: sha512-p9sYq7kXH7qeJwIQE86cOWv/xNqvow846l6c/qWc26Ib1ci5W7V0sI5thsrP3eH+VA0d+SHalTKg5SQXgNQBWA==} + cpu: [arm64] + os: [darwin] + + turbo-linux-64@2.5.0: + resolution: {integrity: sha512-1iEln2GWiF3iPPPS1HQJT6ZCFXynJPd89gs9SkggH2EJsj3eRUSVMmMC8y6d7bBbhBFsiGGazwFIYrI12zs6uQ==} + cpu: [x64] + os: [linux] + + turbo-linux-arm64@2.5.0: + resolution: {integrity: sha512-bKBcbvuQHmsX116KcxHJuAcppiiBOfivOObh2O5aXNER6mce7YDDQJy00xQQNp1DhEfcSV2uOsvb3O3nN2cbcA==} + cpu: [arm64] + os: [linux] + + turbo-stream@2.4.0: + resolution: {integrity: sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==} + + turbo-windows-64@2.5.0: + resolution: {integrity: sha512-9BCo8oQ7BO7J0K913Czbc3tw8QwLqn2nTe4E47k6aVYkM12ASTScweXPTuaPFP5iYXAT6z5Dsniw704Ixa5eGg==} + cpu: [x64] + os: [win32] + + turbo-windows-arm64@2.5.0: + resolution: {integrity: sha512-OUHCV+ueXa3UzfZ4co/ueIHgeq9B2K48pZwIxKSm5VaLVuv8M13MhM7unukW09g++dpdrrE1w4IOVgxKZ0/exg==} + cpu: [arm64] + os: [win32] + + turbo@2.5.0: + resolution: {integrity: sha512-PvSRruOsitjy6qdqwIIyolv99+fEn57gP6gn4zhsHTEcCYgXPhv6BAxzAjleS8XKpo+Y582vTTA9nuqYDmbRuA==} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.3: + resolution: {integrity: sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript-eslint@8.15.0: + resolution: {integrity: sha512-wY4FRGl0ZI+ZU4Jo/yjdBu0lVTSML58pu6PgGtJmCufvzfV565pUF6iACQt092uFOd49iLOTX/sEVmHtbSrS+w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + typescript-eslint@8.30.1: + resolution: {integrity: sha512-D7lC0kcehVH7Mb26MRQi64LMyRJsj3dToJxM1+JVTl53DQSV5/7oUGWQLcKl1C1KnoVHxMMU2FNQMffr7F3Row==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + uint8arrays@3.1.0: + resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unstorage@1.16.0: + resolution: {integrity: sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6.0.3 || ^7.0.0 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/kv': ^1.0.1 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + update-check@1.5.4: + resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} + + upper-case-first@1.1.2: + resolution: {integrity: sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==} + + upper-case@1.1.3: + resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + use-sync-external-store@1.4.0: + resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + valtio@1.11.2: + resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=16.8' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + + viem@2.23.2: + resolution: {integrity: sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + viem@2.28.0: + resolution: {integrity: sha512-Z4W5O1pe+6pirYTFm451FcZmfGAUxUWt2L/eWC+YfTF28j/8rd7q6MBAi05lMN4KhLJjhN0s5YGIPB+kf1L20g==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + vite-node@3.1.2: + resolution: {integrity: sha512-/8iMryv46J3aK13iUXsei5G/A3CUlW4665THCPS+K8xAaqrVWiGB4RfXMQXCLjpK9P2eK//BczrVkn5JLAk6DA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite-plugin-css-injected-by-js@3.5.2: + resolution: {integrity: sha512-2MpU/Y+SCZyWUB6ua3HbJCrgnF0KACAsmzOQt1UvRVJCGF6S8xdA3ZUhWcWdM9ivG4I5az8PnQmwwrkC2CAQrQ==} + peerDependencies: + vite: '>2.0.0-0' + + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vite@6.3.2: + resolution: {integrity: sha512-ZSvGOXKGceizRQIZSz7TGJ0pS3QLlVY/9hwxVh17W3re67je1RKYzFHivZ/t0tubU78Vkyb9WnHPENSBCzbckg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@3.1.2: + resolution: {integrity: sha512-WaxpJe092ID1C0mr+LH9MmNrhfzi8I65EX/NRU/Ld016KqQNRgxSOlGNP1hHN+a/F8L15Mh8klwaF77zR3GeDQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.1.2 + '@vitest/ui': 3.1.2 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + wagmi@2.15.0: + resolution: {integrity: sha512-qG+ltkSzIqjLv/27dwWzq4m3Pg8/DkgunFgn+HlpysaHnyYOtBnKKzZUVxSpeNf8teVo+aF6YjWcmtLSY7E9NQ==} + peerDependencies: + '@tanstack/react-query': '>=5.0.0' + react: '>=18' + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + webextension-polyfill@0.10.0: + resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-builtin-type@1.1.4: + resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + 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 + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + 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 + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + 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 + + ws@8.18.1: + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + 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 + + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod@3.24.2: + resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + + zustand@5.0.0: + resolution: {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 + +snapshots: + + 0xsequence@2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + dependencies: + '@0xsequence/abi': 2.3.8 + '@0xsequence/account': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/api': 2.3.8 + '@0xsequence/auth': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/core': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/guard': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/indexer': 2.3.8 + '@0xsequence/metadata': 2.3.8 + '@0xsequence/migration': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/network': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/provider': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/relayer': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/sessions': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/signhub': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/wallet': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + '@0xsequence/abi@2.3.8': {} + + '@0xsequence/abi@2.3.9': {} + + '@0xsequence/account@2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.8 + '@0xsequence/core': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/migration': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/network': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/relayer': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/sessions': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/wallet': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + '@0xsequence/api@0.0.0-anypay-20250527101311': {} + + '@0xsequence/api@2.3.8': {} + + '@0xsequence/auth@2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.8 + '@0xsequence/account': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/api': 2.3.8 + '@0xsequence/core': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/ethauth': 1.0.0(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/indexer': 2.3.8 + '@0xsequence/metadata': 2.3.8 + '@0xsequence/migration': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/network': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/sessions': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/signhub': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/wallet': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + '@0xsequence/core@2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.8 + '@0xsequence/utils': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + '@0xsequence/core@2.3.9(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.9 + '@0xsequence/utils': 2.3.9(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + '@0xsequence/design-system@2.1.6(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(motion@12.7.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-aspect-ratio': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-checkbox': 1.2.3(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-collapsible': 1.1.8(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-dialog': 1.1.11(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-dropdown-menu': 2.1.12(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-progress': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-radio-group': 1.3.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-select': 2.2.2(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-switch': 1.2.2(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-tabs': 1.1.9(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-toast': 1.2.11(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-tooltip': 1.2.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.2.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + class-variance-authority: 0.7.1 + clsx: 2.1.1 + motion: 12.7.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-hook-form: 7.55.0(react@19.0.0) + tailwind-merge: 3.2.0 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + '@0xsequence/ethauth@1.0.0(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + js-base64: 3.7.7 + + '@0xsequence/guard@2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/account': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/core': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/signhub': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + '@0xsequence/hooks@5.1.1(@0xsequence/api@0.0.0-anypay-20250527101311)(@0xsequence/indexer@2.3.9)(@0xsequence/metadata@2.3.8)(@0xsequence/network@2.3.9(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(@tanstack/react-query@5.74.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))': + dependencies: + '@0xsequence/api': 0.0.0-anypay-20250527101311 + '@0xsequence/indexer': 2.3.9 + '@0xsequence/metadata': 2.3.8 + '@0xsequence/network': 2.3.9(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@tanstack/react-query': 5.74.3(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + viem: 2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + + '@0xsequence/hooks@5.1.1(@0xsequence/api@packages+services+api)(@0xsequence/indexer@2.3.9)(@0xsequence/metadata@2.3.8)(@0xsequence/network@2.3.9(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(@tanstack/react-query@5.74.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))': + dependencies: + '@0xsequence/api': link:packages/services/api + '@0xsequence/indexer': 2.3.9 + '@0xsequence/metadata': 2.3.8 + '@0xsequence/network': 2.3.9(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@tanstack/react-query': 5.74.3(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + viem: 2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + + '@0xsequence/indexer@2.3.8': {} + + '@0xsequence/indexer@2.3.9': {} + + '@0xsequence/metadata@2.3.8': {} + + '@0xsequence/migration@2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.8 + '@0xsequence/core': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/wallet': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + '@0xsequence/network@2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/core': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/indexer': 2.3.8 + '@0xsequence/relayer': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + '@0xsequence/network@2.3.9(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/core': 2.3.9(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/indexer': 2.3.9 + '@0xsequence/relayer': 2.3.9(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.9(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + '@0xsequence/provider@2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.8 + '@0xsequence/account': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/auth': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/core': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/migration': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/network': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/relayer': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/wallet': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@databeat/tracker': 0.9.3 + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + eventemitter2: 6.4.9 + webextension-polyfill: 0.10.0 + + '@0xsequence/relayer@2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.8 + '@0xsequence/core': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + '@0xsequence/relayer@2.3.9(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.9 + '@0xsequence/core': 2.3.9(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.9(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + '@0xsequence/replacer@2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.8 + '@0xsequence/core': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + '@0xsequence/sessions@2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/core': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/migration': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/replacer': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + idb: 7.1.1 + + '@0xsequence/signhub@2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/core': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + '@0xsequence/tee-verifier@0.1.1': + dependencies: cbor2: 1.12.0 pkijs: 3.2.5 - '@adraffy/ens-normalize@1.11.0': {} + '@0xsequence/utils@2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + js-base64: 3.7.7 + + '@0xsequence/utils@2.3.9(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + js-base64: 3.7.7 + + '@0xsequence/wagmi-connector@4.0.1(0xsequence@2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))(wagmi@2.15.0(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@19.0.0))(@types/react@19.1.2)(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))(zod@3.24.2))': + dependencies: + 0xsequence: 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + viem: 2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + wagmi: 2.15.0(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@19.0.0))(@types/react@19.1.2)(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))(zod@3.24.2) + + '@0xsequence/wallet-primitives@0.0.0-anypay-20250527101311(typescript@5.7.3)(zod@3.24.2)': + dependencies: + ox: 0.7.0(typescript@5.7.3)(zod@3.24.2) + transitivePeerDependencies: + - typescript + - zod + + '@0xsequence/wallet@2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.8 + '@0xsequence/core': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/network': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/relayer': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/signhub': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.8(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + '@adraffy/ens-normalize@1.10.1': {} + + '@adraffy/ens-normalize@1.11.0': {} + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.8': {} + + '@babel/core@7.26.10': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helpers': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.27.0': + dependencies: + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.0': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.27.0': + dependencies: + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + + '@babel/parser@7.27.0': + dependencies: + '@babel/types': 7.27.0 + + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/runtime-corejs3@7.26.0': + dependencies: + core-js-pure: 3.39.0 + regenerator-runtime: 0.14.1 + + '@babel/runtime@7.26.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.27.0': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + + '@babel/traverse@7.27.0': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.27.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@changesets/apply-release-plan@7.0.10': + dependencies: + '@changesets/config': 3.1.1 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.2 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.7.1 + + '@changesets/assemble-release-plan@6.0.6': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.7.1 + + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 + + '@changesets/cli@2.29.0': + dependencies: + '@changesets/apply-release-plan': 7.0.10 + '@changesets/assemble-release-plan': 6.0.6 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.1 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.8 + '@changesets/git': 3.0.2 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + external-editor: 3.1.0 + fs-extra: 7.0.1 + mri: 1.2.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.8 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.7.1 + spawndamnit: 3.0.1 + term-size: 2.2.1 + + '@changesets/config@3.1.1': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.3': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.7.1 + + '@changesets/get-release-plan@4.0.8': + dependencies: + '@changesets/assemble-release-plan': 6.0.6 + '@changesets/config': 3.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.3 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.1': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 3.14.1 + + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.3': + dependencies: + '@changesets/git': 3.0.2 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.1 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.1.1 + prettier: 2.8.8 + + '@coinbase/wallet-sdk@3.9.3': + dependencies: + bn.js: 5.2.1 + buffer: 6.0.3 + clsx: 1.2.1 + eth-block-tracker: 7.1.0 + eth-json-rpc-filters: 6.0.1 + eventemitter3: 5.0.1 + keccak: 3.0.4 + preact: 10.26.5 + sha.js: 2.4.11 + transitivePeerDependencies: + - supports-color + + '@coinbase/wallet-sdk@4.3.0': + dependencies: + '@noble/hashes': 1.7.2 + clsx: 1.2.1 + eventemitter3: 5.0.1 + preact: 10.26.5 + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@databeat/tracker@0.9.3': + dependencies: + '@noble/hashes': 1.7.2 + + '@ecies/ciphers@0.2.3(@noble/ciphers@1.2.1)': + dependencies: + '@noble/ciphers': 1.2.1 + + '@emnapi/runtime@1.3.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.25.2': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.25.2': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.25.2': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.25.2': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.25.2': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.25.2': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.2': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.25.2': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.25.2': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.25.2': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.25.2': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.25.2': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.25.2': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.25.2': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.25.2': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.25.2': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.25.2': + optional: true + + '@esbuild/netbsd-arm64@0.25.2': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.25.2': + optional: true + + '@esbuild/openbsd-arm64@0.25.2': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.25.2': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.25.2': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.25.2': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.25.2': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.25.2': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@9.15.0(jiti@2.4.2))': + dependencies: + eslint: 9.15.0(jiti@2.4.2) + eslint-visitor-keys: 3.4.3 - '@babel/runtime-corejs3@7.26.0': + '@eslint-community/eslint-utils@4.4.1(eslint@9.24.0(jiti@2.4.2))': dependencies: - core-js-pure: 3.39.0 - regenerator-runtime: 0.14.1 + eslint: 9.24.0(jiti@2.4.2) + eslint-visitor-keys: 3.4.3 - '@babel/runtime@7.26.0': + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.19.0': dependencies: - regenerator-runtime: 0.14.1 + '@eslint/object-schema': 2.1.4 + debug: 4.3.7(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color - '@changesets/apply-release-plan@7.0.10': + '@eslint/config-array@0.20.0': dependencies: - '@changesets/config': 3.1.1 - '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.2 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - detect-indent: 6.1.0 - fs-extra: 7.0.1 - lodash.startcase: 4.4.0 - outdent: 0.5.0 - prettier: 2.8.8 - resolve-from: 5.0.0 - semver: 7.7.1 + '@eslint/object-schema': 2.1.6 + debug: 4.3.7(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color - '@changesets/assemble-release-plan@6.0.6': + '@eslint/config-helpers@0.2.1': {} + + '@eslint/core@0.12.0': dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - semver: 7.7.1 + '@types/json-schema': 7.0.15 + + '@eslint/core@0.13.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.9.0': {} + + '@eslint/eslintrc@3.2.0': + dependencies: + ajv: 6.12.6 + debug: 4.3.7(supports-color@5.5.0) + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.3.7(supports-color@5.5.0) + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.15.0': {} + + '@eslint/js@9.17.0': {} + + '@eslint/js@9.24.0': {} + + '@eslint/object-schema@2.1.4': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.2.3': + dependencies: + levn: 0.4.1 + + '@eslint/plugin-kit@0.2.8': + dependencies: + '@eslint/core': 0.13.0 + levn: 0.4.1 + + '@ethereumjs/common@3.2.0': + dependencies: + '@ethereumjs/util': 8.1.0 + crc-32: 1.2.2 + + '@ethereumjs/rlp@4.0.1': {} + + '@ethereumjs/tx@4.2.0': + dependencies: + '@ethereumjs/common': 3.2.0 + '@ethereumjs/rlp': 4.0.1 + '@ethereumjs/util': 8.1.0 + ethereum-cryptography: 2.2.1 + + '@ethereumjs/util@8.1.0': + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.2.1 + micro-ftch: 0.3.1 + + '@floating-ui/core@1.6.9': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.6.13': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@floating-ui/dom': 1.6.13 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + + '@floating-ui/utils@0.2.9': {} + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.1': {} + + '@humanwhocodes/retry@0.4.2': {} + + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.3.1 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@lit-labs/ssr-dom-shim@1.3.0': {} + + '@lit/reactive-element@1.6.3': + dependencies: + '@lit-labs/ssr-dom-shim': 1.3.0 + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.26.0 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.26.0 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@metamask/eth-json-rpc-provider@1.0.1': + dependencies: + '@metamask/json-rpc-engine': 7.3.3 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 5.0.2 + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-engine@7.3.3': + dependencies: + '@metamask/rpc-errors': 6.4.0 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-engine@8.0.2': + dependencies: + '@metamask/rpc-errors': 6.4.0 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + transitivePeerDependencies: + - supports-color - '@changesets/changelog-git@0.2.1': + '@metamask/json-rpc-middleware-stream@7.0.2': dependencies: - '@changesets/types': 6.1.0 + '@metamask/json-rpc-engine': 8.0.2 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + readable-stream: 3.6.2 + transitivePeerDependencies: + - supports-color - '@changesets/cli@2.29.0': + '@metamask/object-multiplex@2.1.0': dependencies: - '@changesets/apply-release-plan': 7.0.10 - '@changesets/assemble-release-plan': 6.0.6 - '@changesets/changelog-git': 0.2.1 - '@changesets/config': 3.1.1 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/get-release-plan': 4.0.8 - '@changesets/git': 3.0.2 - '@changesets/logger': 0.1.1 - '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.3 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@changesets/write': 0.4.0 - '@manypkg/get-packages': 1.1.3 - ansi-colors: 4.1.3 - ci-info: 3.9.0 - enquirer: 2.4.1 - external-editor: 3.1.0 - fs-extra: 7.0.1 - mri: 1.2.0 - p-limit: 2.3.0 - package-manager-detector: 0.2.8 - picocolors: 1.1.1 - resolve-from: 5.0.0 - semver: 7.7.1 - spawndamnit: 3.0.1 - term-size: 2.2.1 + once: 1.4.0 + readable-stream: 3.6.2 - '@changesets/config@3.1.1': + '@metamask/onboarding@1.0.1': dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/logger': 0.1.1 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - micromatch: 4.0.8 + bowser: 2.11.0 - '@changesets/errors@0.2.0': + '@metamask/providers@16.1.0': dependencies: - extendable-error: 0.1.7 + '@metamask/json-rpc-engine': 8.0.2 + '@metamask/json-rpc-middleware-stream': 7.0.2 + '@metamask/object-multiplex': 2.1.0 + '@metamask/rpc-errors': 6.4.0 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + detect-browser: 5.3.0 + extension-port-stream: 3.0.0 + fast-deep-equal: 3.1.3 + is-stream: 2.0.1 + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 + transitivePeerDependencies: + - supports-color - '@changesets/get-dependents-graph@2.1.3': + '@metamask/rpc-errors@6.4.0': dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.1 - semver: 7.7.1 + '@metamask/utils': 9.3.0 + fast-safe-stringify: 2.1.1 + transitivePeerDependencies: + - supports-color - '@changesets/get-release-plan@4.0.8': + '@metamask/safe-event-emitter@2.0.0': {} + + '@metamask/safe-event-emitter@3.1.2': {} + + '@metamask/sdk-communication-layer@0.32.0(cross-fetch@4.1.0)(eciesjs@0.4.14)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: - '@changesets/assemble-release-plan': 6.0.6 - '@changesets/config': 3.1.1 - '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.3 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 + bufferutil: 4.0.9 + cross-fetch: 4.1.0 + date-fns: 2.30.0 + debug: 4.4.0 + eciesjs: 0.4.14 + eventemitter2: 6.4.9 + readable-stream: 3.6.2 + socket.io-client: 4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + utf-8-validate: 5.0.10 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color - '@changesets/get-version-range-type@0.4.0': {} + '@metamask/sdk-install-modal-web@0.32.0': + dependencies: + '@paulmillr/qr': 0.2.1 - '@changesets/git@3.0.2': + '@metamask/sdk@0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@changesets/errors': 0.2.0 - '@manypkg/get-packages': 1.1.3 - is-subdir: 1.2.0 - micromatch: 4.0.8 - spawndamnit: 3.0.1 + '@babel/runtime': 7.26.0 + '@metamask/onboarding': 1.0.1 + '@metamask/providers': 16.1.0 + '@metamask/sdk-communication-layer': 0.32.0(cross-fetch@4.1.0)(eciesjs@0.4.14)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@metamask/sdk-install-modal-web': 0.32.0 + '@paulmillr/qr': 0.2.1 + bowser: 2.11.0 + cross-fetch: 4.1.0 + debug: 4.4.0 + eciesjs: 0.4.14 + eth-rpc-errors: 4.0.3 + eventemitter2: 6.4.9 + obj-multiplex: 1.0.0 + pump: 3.0.2 + readable-stream: 3.6.2 + socket.io-client: 4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + tslib: 2.8.1 + util: 0.12.5 + uuid: 8.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate - '@changesets/logger@0.1.1': + '@metamask/superstruct@3.2.1': {} + + '@metamask/utils@5.0.2': dependencies: - picocolors: 1.1.1 + '@ethereumjs/tx': 4.2.0 + '@types/debug': 4.1.12 + debug: 4.4.0 + semver: 7.7.2 + superstruct: 1.0.4 + transitivePeerDependencies: + - supports-color - '@changesets/parse@0.4.1': + '@metamask/utils@8.5.0': dependencies: - '@changesets/types': 6.1.0 - js-yaml: 3.14.1 + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.2.1 + '@noble/hashes': 1.7.2 + '@scure/base': 1.2.4 + '@types/debug': 4.1.12 + debug: 4.4.0 + pony-cause: 2.1.11 + semver: 7.7.2 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color - '@changesets/pre@2.0.2': + '@metamask/utils@9.3.0': dependencies: - '@changesets/errors': 0.2.0 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.2.1 + '@noble/hashes': 1.7.2 + '@scure/base': 1.2.4 + '@types/debug': 4.1.12 + debug: 4.4.0 + pony-cause: 2.1.11 + semver: 7.7.2 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color - '@changesets/read@0.6.3': + '@motionone/animation@10.18.0': dependencies: - '@changesets/git': 3.0.2 - '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.1 - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - p-filter: 2.1.0 - picocolors: 1.1.1 + '@motionone/easing': 10.18.0 + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + tslib: 2.8.1 - '@changesets/should-skip-package@0.1.2': + '@motionone/dom@10.18.0': dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 + '@motionone/animation': 10.18.0 + '@motionone/generators': 10.18.0 + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + hey-listen: 1.0.8 + tslib: 2.8.1 - '@changesets/types@4.1.0': {} + '@motionone/easing@10.18.0': + dependencies: + '@motionone/utils': 10.18.0 + tslib: 2.8.1 - '@changesets/types@6.1.0': {} + '@motionone/generators@10.18.0': + dependencies: + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + tslib: 2.8.1 - '@changesets/write@0.4.0': + '@motionone/svelte@10.16.4': dependencies: - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - human-id: 4.1.1 - prettier: 2.8.8 + '@motionone/dom': 10.18.0 + tslib: 2.8.1 - '@cspotcode/source-map-support@0.8.1': + '@motionone/types@10.17.1': {} + + '@motionone/utils@10.18.0': dependencies: - '@jridgewell/trace-mapping': 0.3.9 + '@motionone/types': 10.17.1 + hey-listen: 1.0.8 + tslib: 2.8.1 - '@emnapi/runtime@1.3.1': + '@motionone/vue@10.16.4': dependencies: + '@motionone/dom': 10.18.0 tslib: 2.8.1 - optional: true - '@esbuild/aix-ppc64@0.25.0': - optional: true + '@next/env@15.1.0': {} - '@esbuild/android-arm64@0.25.0': - optional: true + '@next/eslint-plugin-next@15.1.0': + dependencies: + fast-glob: 3.3.1 - '@esbuild/android-arm@0.25.0': + '@next/swc-darwin-arm64@15.1.0': optional: true - '@esbuild/android-x64@0.25.0': + '@next/swc-darwin-x64@15.1.0': optional: true - '@esbuild/darwin-arm64@0.25.0': + '@next/swc-linux-arm64-gnu@15.1.0': optional: true - '@esbuild/darwin-x64@0.25.0': + '@next/swc-linux-arm64-musl@15.1.0': optional: true - '@esbuild/freebsd-arm64@0.25.0': + '@next/swc-linux-x64-gnu@15.1.0': optional: true - '@esbuild/freebsd-x64@0.25.0': + '@next/swc-linux-x64-musl@15.1.0': optional: true - '@esbuild/linux-arm64@0.25.0': + '@next/swc-win32-arm64-msvc@15.1.0': optional: true - '@esbuild/linux-arm@0.25.0': + '@next/swc-win32-x64-msvc@15.1.0': optional: true - '@esbuild/linux-ia32@0.25.0': - optional: true + '@noble/ciphers@1.2.1': {} - '@esbuild/linux-loong64@0.25.0': - optional: true + '@noble/curves@1.2.0': + dependencies: + '@noble/hashes': 1.3.2 - '@esbuild/linux-mips64el@0.25.0': - optional: true + '@noble/curves@1.4.2': + dependencies: + '@noble/hashes': 1.4.0 - '@esbuild/linux-ppc64@0.25.0': - optional: true + '@noble/curves@1.8.0': + dependencies: + '@noble/hashes': 1.7.0 - '@esbuild/linux-riscv64@0.25.0': - optional: true + '@noble/curves@1.8.1': + dependencies: + '@noble/hashes': 1.7.1 - '@esbuild/linux-s390x@0.25.0': - optional: true + '@noble/curves@1.8.2': + dependencies: + '@noble/hashes': 1.7.2 - '@esbuild/linux-x64@0.25.0': - optional: true + '@noble/hashes@1.3.2': {} - '@esbuild/netbsd-arm64@0.25.0': - optional: true + '@noble/hashes@1.4.0': {} - '@esbuild/netbsd-x64@0.25.0': - optional: true + '@noble/hashes@1.7.0': {} - '@esbuild/openbsd-arm64@0.25.0': - optional: true + '@noble/hashes@1.7.1': {} - '@esbuild/openbsd-x64@0.25.0': - optional: true + '@noble/hashes@1.7.2': {} - '@esbuild/sunos-x64@0.25.0': - optional: true + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@paulmillr/qr@0.2.1': {} + + '@pkgr/core@0.2.7': {} + + '@radix-ui/number@1.1.1': {} + + '@radix-ui/primitive@1.1.2': {} + + '@radix-ui/react-arrow@1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-aspect-ratio@1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-checkbox@1.2.3(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.2)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-collapsible@1.1.8(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.2)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-collection@1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.2)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.2)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.1.2 + + '@radix-ui/react-context@1.1.2(@types/react@19.1.2)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.1.2 + + '@radix-ui/react-dialog@1.1.11(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-portal': 1.1.6(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.2)(react@19.0.0) + aria-hidden: 1.2.4 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.3(@types/react@19.1.2)(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-direction@1.1.1(@types/react@19.1.2)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.1.2 + + '@radix-ui/react-dismissable-layer@1.1.7(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.2)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-dropdown-menu@2.1.12(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-menu': 2.1.12(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.2)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-focus-guards@1.1.2(@types/react@19.1.2)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.1.2 + + '@radix-ui/react-focus-scope@1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.2)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-id@1.1.1(@types/react@19.1.2)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.2)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.1.2 + + '@radix-ui/react-menu@2.1.12(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-popper': 1.2.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.6(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-roving-focus': 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.2)(react@19.0.0) + aria-hidden: 1.2.4 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.3(@types/react@19.1.2)(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-popover@1.1.11(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-popper': 1.2.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.6(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.2)(react@19.0.0) + aria-hidden: 1.2.4 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.3(@types/react@19.1.2)(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-popper@1.2.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-arrow': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/rect': 1.1.1 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-portal@1.1.6(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.2)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) - '@esbuild/win32-arm64@0.25.0': - optional: true + '@radix-ui/react-presence@1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.2)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) - '@esbuild/win32-ia32@0.25.0': - optional: true + '@radix-ui/react-primitive@2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.2)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) - '@esbuild/win32-x64@0.25.0': - optional: true + '@radix-ui/react-progress@1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-radio-group@1.3.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-roving-focus': 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.2)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-roving-focus@1.1.7(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.2)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-select@2.2.2(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-popper': 1.2.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.6(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.2.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + aria-hidden: 1.2.4 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.3(@types/react@19.1.2)(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) - '@eslint-community/eslint-utils@4.4.1(eslint@9.15.0)': + '@radix-ui/react-slot@1.2.0(@types/react@19.1.2)(react@19.0.0)': dependencies: - eslint: 9.15.0 - eslint-visitor-keys: 3.4.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.1.2 - '@eslint-community/regexpp@4.12.1': {} + '@radix-ui/react-switch@1.2.2(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.2)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-tabs@1.1.9(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-roving-focus': 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.2)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-toast@1.2.11(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.6(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.2.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-tooltip@1.2.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-popper': 1.2.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.6(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.2.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) - '@eslint/config-array@0.19.0': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.2)(react@19.0.0)': dependencies: - '@eslint/object-schema': 2.1.4 - debug: 4.3.7(supports-color@5.5.0) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + react: 19.0.0 + optionalDependencies: + '@types/react': 19.1.2 - '@eslint/core@0.9.0': {} + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.2)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.2)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.2)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.1.2 - '@eslint/eslintrc@3.2.0': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.2)(react@19.0.0)': dependencies: - ajv: 6.12.6 - debug: 4.3.7(supports-color@5.5.0) - espree: 10.3.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.2)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.1.2 - '@eslint/js@9.15.0': {} + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.2)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.2)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.1.2 - '@eslint/js@9.17.0': {} + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.2)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.1.2 - '@eslint/object-schema@2.1.4': {} + '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.2)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.1.2 - '@eslint/plugin-kit@0.2.3': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.2)(react@19.0.0)': dependencies: - levn: 0.4.1 + '@radix-ui/rect': 1.1.1 + react: 19.0.0 + optionalDependencies: + '@types/react': 19.1.2 - '@humanfs/core@0.19.1': {} + '@radix-ui/react-use-size@1.1.1(@types/react@19.1.2)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.2)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.1.2 - '@humanfs/node@0.16.6': + '@radix-ui/react-visually-hidden@1.2.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) - '@humanwhocodes/module-importer@1.0.1': {} + '@radix-ui/rect@1.1.1': {} - '@humanwhocodes/retry@0.3.1': {} + '@rolldown/pluginutils@1.0.0-beta.9': {} - '@humanwhocodes/retry@0.4.1': {} + '@rollup/rollup-android-arm-eabi@4.40.0': + optional: true - '@img/sharp-darwin-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@rollup/rollup-android-arm64@4.40.0': optional: true - '@img/sharp-darwin-x64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.4 + '@rollup/rollup-darwin-arm64@4.40.0': optional: true - '@img/sharp-libvips-darwin-arm64@1.0.4': + '@rollup/rollup-darwin-x64@4.40.0': optional: true - '@img/sharp-libvips-darwin-x64@1.0.4': + '@rollup/rollup-freebsd-arm64@4.40.0': optional: true - '@img/sharp-libvips-linux-arm64@1.0.4': + '@rollup/rollup-freebsd-x64@4.40.0': optional: true - '@img/sharp-libvips-linux-arm@1.0.5': + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': optional: true - '@img/sharp-libvips-linux-s390x@1.0.4': + '@rollup/rollup-linux-arm-musleabihf@4.40.0': optional: true - '@img/sharp-libvips-linux-x64@1.0.4': + '@rollup/rollup-linux-arm64-gnu@4.40.0': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + '@rollup/rollup-linux-arm64-musl@4.40.0': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.0.4': + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': optional: true - '@img/sharp-linux-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.4 + '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': optional: true - '@img/sharp-linux-arm@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.5 + '@rollup/rollup-linux-riscv64-gnu@4.40.0': optional: true - '@img/sharp-linux-s390x@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.4 + '@rollup/rollup-linux-riscv64-musl@4.40.0': optional: true - '@img/sharp-linux-x64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.4 + '@rollup/rollup-linux-s390x-gnu@4.40.0': optional: true - '@img/sharp-linuxmusl-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@rollup/rollup-linux-x64-gnu@4.40.0': optional: true - '@img/sharp-linuxmusl-x64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@rollup/rollup-linux-x64-musl@4.40.0': optional: true - '@img/sharp-wasm32@0.33.5': - dependencies: - '@emnapi/runtime': 1.3.1 + '@rollup/rollup-win32-arm64-msvc@4.40.0': optional: true - '@img/sharp-win32-ia32@0.33.5': + '@rollup/rollup-win32-ia32-msvc@4.40.0': optional: true - '@img/sharp-win32-x64@0.33.5': + '@rollup/rollup-win32-x64-msvc@4.40.0': optional: true - '@isaacs/cliui@8.0.2': + '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)': dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod - '@jridgewell/trace-mapping@0.3.9': + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)': dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@safe-global/safe-gateway-typescript-sdk': 3.23.1 + viem: 2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod - '@manypkg/find-root@1.1.0': - dependencies: - '@babel/runtime': 7.26.0 - '@types/node': 12.20.55 - find-up: 4.1.0 - fs-extra: 8.1.0 + '@safe-global/safe-gateway-typescript-sdk@3.23.1': {} - '@manypkg/get-packages@1.1.3': - dependencies: - '@babel/runtime': 7.26.0 - '@changesets/types': 4.1.0 - '@manypkg/find-root': 1.1.0 - fs-extra: 8.1.0 - globby: 11.1.0 - read-yaml-file: 1.1.0 + '@scure/base@1.1.9': {} - '@next/env@15.1.0': {} + '@scure/base@1.2.4': {} - '@next/eslint-plugin-next@15.1.0': + '@scure/bip32@1.4.0': dependencies: - fast-glob: 3.3.1 - - '@next/swc-darwin-arm64@15.1.0': - optional: true - - '@next/swc-darwin-x64@15.1.0': - optional: true - - '@next/swc-linux-arm64-gnu@15.1.0': - optional: true - - '@next/swc-linux-arm64-musl@15.1.0': - optional: true - - '@next/swc-linux-x64-gnu@15.1.0': - optional: true - - '@next/swc-linux-x64-musl@15.1.0': - optional: true + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 - '@next/swc-win32-arm64-msvc@15.1.0': - optional: true + '@scure/bip32@1.6.2': + dependencies: + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/base': 1.2.4 - '@next/swc-win32-x64-msvc@15.1.0': - optional: true + '@scure/bip39@1.3.0': + dependencies: + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 - '@noble/curves@1.8.1': + '@scure/bip39@1.5.4': dependencies: '@noble/hashes': 1.7.1 + '@scure/base': 1.2.4 - '@noble/hashes@1.7.1': {} + '@socket.io/component-emitter@3.1.2': {} - '@nodelib/fs.scandir@2.1.5': + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.15': dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + tslib: 2.8.1 - '@nodelib/fs.stat@2.0.5': {} + '@tailwindcss/node@4.1.4': + dependencies: + enhanced-resolve: 5.18.1 + jiti: 2.4.2 + lightningcss: 1.29.2 + tailwindcss: 4.1.4 - '@nodelib/fs.walk@1.2.8': + '@tailwindcss/node@4.1.8': dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + '@ampproject/remapping': 2.3.0 + enhanced-resolve: 5.18.1 + jiti: 2.4.2 + lightningcss: 1.30.1 + magic-string: 0.30.17 + source-map-js: 1.2.1 + tailwindcss: 4.1.8 - '@rollup/rollup-android-arm-eabi@4.40.0': + '@tailwindcss/oxide-android-arm64@4.1.4': optional: true - '@rollup/rollup-android-arm64@4.40.0': + '@tailwindcss/oxide-android-arm64@4.1.8': optional: true - '@rollup/rollup-darwin-arm64@4.40.0': + '@tailwindcss/oxide-darwin-arm64@4.1.4': optional: true - '@rollup/rollup-darwin-x64@4.40.0': + '@tailwindcss/oxide-darwin-arm64@4.1.8': optional: true - '@rollup/rollup-freebsd-arm64@4.40.0': + '@tailwindcss/oxide-darwin-x64@4.1.4': optional: true - '@rollup/rollup-freebsd-x64@4.40.0': + '@tailwindcss/oxide-darwin-x64@4.1.8': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + '@tailwindcss/oxide-freebsd-x64@4.1.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.40.0': + '@tailwindcss/oxide-freebsd-x64@4.1.8': optional: true - '@rollup/rollup-linux-arm64-gnu@4.40.0': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.40.0': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.8': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + '@tailwindcss/oxide-linux-arm64-gnu@4.1.4': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + '@tailwindcss/oxide-linux-arm64-gnu@4.1.8': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.40.0': + '@tailwindcss/oxide-linux-arm64-musl@4.1.4': optional: true - '@rollup/rollup-linux-riscv64-musl@4.40.0': + '@tailwindcss/oxide-linux-arm64-musl@4.1.8': optional: true - '@rollup/rollup-linux-s390x-gnu@4.40.0': + '@tailwindcss/oxide-linux-x64-gnu@4.1.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.40.0': + '@tailwindcss/oxide-linux-x64-gnu@4.1.8': optional: true - '@rollup/rollup-linux-x64-musl@4.40.0': + '@tailwindcss/oxide-linux-x64-musl@4.1.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.40.0': + '@tailwindcss/oxide-linux-x64-musl@4.1.8': optional: true - '@rollup/rollup-win32-ia32-msvc@4.40.0': + '@tailwindcss/oxide-wasm32-wasi@4.1.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.40.0': + '@tailwindcss/oxide-wasm32-wasi@4.1.8': optional: true - '@scure/base@1.2.4': {} + '@tailwindcss/oxide-win32-arm64-msvc@4.1.4': + optional: true - '@scure/bip32@1.6.2': - dependencies: - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 - '@scure/base': 1.2.4 + '@tailwindcss/oxide-win32-arm64-msvc@4.1.8': + optional: true - '@scure/bip39@1.5.4': - dependencies: - '@noble/hashes': 1.7.1 - '@scure/base': 1.2.4 + '@tailwindcss/oxide-win32-x64-msvc@4.1.4': + optional: true - '@swc/counter@0.1.3': {} + '@tailwindcss/oxide-win32-x64-msvc@4.1.8': + optional: true - '@swc/helpers@0.5.15': - dependencies: - tslib: 2.8.1 + '@tailwindcss/oxide@4.1.4': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.4 + '@tailwindcss/oxide-darwin-arm64': 4.1.4 + '@tailwindcss/oxide-darwin-x64': 4.1.4 + '@tailwindcss/oxide-freebsd-x64': 4.1.4 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.4 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.4 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.4 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.4 + '@tailwindcss/oxide-linux-x64-musl': 4.1.4 + '@tailwindcss/oxide-wasm32-wasi': 4.1.4 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.4 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.4 + + '@tailwindcss/oxide@4.1.8': + dependencies: + detect-libc: 2.0.4 + tar: 7.4.3 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.8 + '@tailwindcss/oxide-darwin-arm64': 4.1.8 + '@tailwindcss/oxide-darwin-x64': 4.1.8 + '@tailwindcss/oxide-freebsd-x64': 4.1.8 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.8 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.8 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.8 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.8 + '@tailwindcss/oxide-linux-x64-musl': 4.1.8 + '@tailwindcss/oxide-wasm32-wasi': 4.1.8 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.8 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.8 + + '@tailwindcss/postcss@4.1.8': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.8 + '@tailwindcss/oxide': 4.1.8 + postcss: 8.5.4 + tailwindcss: 4.1.8 + + '@tailwindcss/vite@4.1.4(vite@6.3.2(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1))': + dependencies: + '@tailwindcss/node': 4.1.4 + '@tailwindcss/oxide': 4.1.4 + tailwindcss: 4.1.4 + vite: 6.3.2(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1) + + '@tanstack/query-core@5.74.3': {} + + '@tanstack/react-query@5.74.3(react@19.0.0)': + dependencies: + '@tanstack/query-core': 5.74.3 + react: 19.0.0 '@tootallnate/quickjs-emscripten@0.23.0': {} @@ -3928,6 +8473,31 @@ snapshots: semver: 7.7.1 update-check: 1.5.4 + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.7 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.27.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + + '@types/babel__traverse@7.20.7': + dependencies: + '@babel/types': 7.27.0 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + '@types/estree@1.0.6': {} '@types/estree@1.0.7': {} @@ -3935,17 +8505,25 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 22.13.9 + '@types/node': 22.15.29 + + '@types/hast@2.3.10': + dependencies: + '@types/unist': 2.0.11 '@types/inquirer@6.5.0': dependencies: '@types/through': 0.0.33 rxjs: 6.6.7 + '@types/isomorphic-fetch@0.0.39': {} + '@types/json-schema@7.0.15': {} '@types/minimatch@5.1.2': {} + '@types/ms@2.1.0': {} + '@types/node@12.20.55': {} '@types/node@20.17.6': @@ -3956,15 +8534,31 @@ snapshots: dependencies: undici-types: 6.20.0 + '@types/node@22.15.29': + dependencies: + undici-types: 6.21.0 + + '@types/node@22.7.5': + dependencies: + undici-types: 6.19.8 + '@types/prop-types@15.7.13': {} '@types/react-dom@18.3.0': dependencies: - '@types/react': 18.3.1 + '@types/react': 19.1.2 '@types/react-dom@18.3.1': dependencies: - '@types/react': 18.3.1 + '@types/react': 19.1.2 + + '@types/react-dom@19.1.2(@types/react@19.1.2)': + dependencies: + '@types/react': 19.1.2 + + '@types/react-syntax-highlighter@15.5.13': + dependencies: + '@types/react': 19.1.2 '@types/react@18.3.0': dependencies: @@ -3976,27 +8570,53 @@ snapshots: '@types/prop-types': 15.7.13 csstype: 3.1.3 + '@types/react@19.1.2': + dependencies: + csstype: 3.1.3 + '@types/through@0.0.33': dependencies: - '@types/node': 22.13.9 + '@types/node': 22.15.29 '@types/tinycolor2@1.4.6': {} + '@types/trusted-types@2.0.7': {} + + '@types/unist@2.0.11': {} + '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.33': dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.7.3))(eslint@9.15.0)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 7.18.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 9.24.0(jiti@2.4.2) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.0(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.15.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.15.0(eslint@9.15.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.15.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.7.3) '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/type-utils': 8.15.0(eslint@9.15.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.15.0(eslint@9.15.0)(typescript@5.7.3) + '@typescript-eslint/type-utils': 8.15.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.15.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.7.3) '@typescript-eslint/visitor-keys': 8.15.0 - eslint: 9.15.0 + eslint: 9.15.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -4006,70 +8626,233 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/type-utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.30.1 + eslint: 9.24.0(jiti@2.4.2) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.18.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0 + eslint: 9.24.0(jiti@2.4.2) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@typescript-eslint/scope-manager': 8.15.0 '@typescript-eslint/types': 8.15.0 '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.7.3) '@typescript-eslint/visitor-keys': 8.15.0 - debug: 4.3.7(supports-color@5.5.0) - eslint: 9.15.0 + debug: 4.4.0 + eslint: 9.15.0(jiti@2.4.2) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.30.1 + debug: 4.3.7(supports-color@5.5.0) + eslint: 9.24.0(jiti@2.4.2) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + '@typescript-eslint/scope-manager@8.15.0': dependencies: '@typescript-eslint/types': 8.15.0 '@typescript-eslint/visitor-keys': 8.15.0 - '@typescript-eslint/type-utils@8.15.0(eslint@9.15.0)(typescript@5.7.3)': + '@typescript-eslint/scope-manager@8.30.1': + dependencies: + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/visitor-keys': 8.30.1 + + '@typescript-eslint/type-utils@7.18.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + debug: 4.4.0 + eslint: 9.24.0(jiti@2.4.2) + ts-api-utils: 1.4.0(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@8.15.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.15.0(eslint@9.15.0)(typescript@5.7.3) - debug: 4.3.7(supports-color@5.5.0) - eslint: 9.15.0 + '@typescript-eslint/utils': 8.15.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.7.3) + debug: 4.4.0 + eslint: 9.15.0(jiti@2.4.2) ts-api-utils: 1.4.0(typescript@5.7.3) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.7.3) + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + debug: 4.4.0 + eslint: 9.24.0(jiti@2.4.2) + ts-api-utils: 2.1.0(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@7.18.0': {} + '@typescript-eslint/types@8.15.0': {} + '@typescript-eslint/types@8.30.1': {} + + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.3)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 1.4.0(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/typescript-estree@8.15.0(typescript@5.7.3)': dependencies: '@typescript-eslint/types': 8.15.0 '@typescript-eslint/visitor-keys': 8.15.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 ts-api-utils: 1.4.0(typescript@5.7.3) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.15.0(eslint@9.15.0)(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.30.1(typescript@5.7.3)': + dependencies: + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/visitor-keys': 8.30.1 + debug: 4.4.0 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 2.1.0(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.18.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.24.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) + eslint: 9.24.0(jiti@2.4.2) + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@8.15.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0(jiti@2.4.2)) '@typescript-eslint/scope-manager': 8.15.0 '@typescript-eslint/types': 8.15.0 '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.7.3) - eslint: 9.15.0 + eslint: 9.15.0(jiti@2.4.2) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.24.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.7.3) + eslint: 9.24.0(jiti@2.4.2) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@8.15.0': dependencies: '@typescript-eslint/types': 8.15.0 eslint-visitor-keys: 4.2.0 + '@typescript-eslint/visitor-keys@8.30.1': + dependencies: + '@typescript-eslint/types': 8.30.1 + eslint-visitor-keys: 4.2.0 + + '@vitejs/plugin-react@4.4.1(vite@6.3.2(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1))': + dependencies: + '@babel/core': 7.26.10 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 6.3.2(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-react@4.5.1(vite@5.4.19(@types/node@22.15.29)(lightningcss@1.30.1))': + dependencies: + '@babel/core': 7.26.10 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) + '@rolldown/pluginutils': 1.0.0-beta.9 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 5.4.19(@types/node@22.15.29)(lightningcss@1.30.1) + transitivePeerDependencies: + - supports-color + '@vitest/expect@3.1.2': dependencies: '@vitest/spy': 3.1.2 @@ -4077,42 +8860,472 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.2(vite@6.3.2(@types/node@22.13.9))': - dependencies: - '@vitest/spy': 3.1.2 - estree-walker: 3.0.3 - magic-string: 0.30.17 - optionalDependencies: - vite: 6.3.2(@types/node@22.13.9) + '@vitest/mocker@3.1.2(vite@5.4.19(@types/node@22.13.9)(lightningcss@1.30.1))': + dependencies: + '@vitest/spy': 3.1.2 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 5.4.19(@types/node@22.13.9)(lightningcss@1.30.1) + + '@vitest/mocker@3.1.2(vite@5.4.19(@types/node@22.15.29)(lightningcss@1.30.1))': + dependencies: + '@vitest/spy': 3.1.2 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 5.4.19(@types/node@22.15.29)(lightningcss@1.30.1) + + '@vitest/pretty-format@3.1.2': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.1.2': + dependencies: + '@vitest/utils': 3.1.2 + pathe: 2.0.3 + + '@vitest/snapshot@3.1.2': + dependencies: + '@vitest/pretty-format': 3.1.2 + magic-string: 0.30.17 + pathe: 2.0.3 + + '@vitest/spy@3.1.2': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@3.1.2': + dependencies: + '@vitest/pretty-format': 3.1.2 + loupe: 3.1.3 + tinyrainbow: 2.0.0 + + '@wagmi/connectors@5.7.13(@types/react@19.1.2)(@wagmi/core@2.17.0(@tanstack/query-core@5.74.3)(@types/react@19.1.2)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)))(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))(zod@3.24.2)': + dependencies: + '@coinbase/wallet-sdk': 4.3.0 + '@metamask/sdk': 0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@wagmi/core': 2.17.0(@tanstack/query-core@5.74.3)(@types/react@19.1.2)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)) + '@walletconnect/ethereum-provider': 2.19.2(@types/react@19.1.2)(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + cbw-sdk: '@coinbase/wallet-sdk@3.9.3' + viem: 2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - supports-color + - uploadthing + - utf-8-validate + - zod + + '@wagmi/core@2.17.0(@tanstack/query-core@5.74.3)(@types/react@19.1.2)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@5.7.3) + viem: 2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + zustand: 5.0.0(@types/react@19.1.2)(react@19.0.0)(use-sync-external-store@1.4.0(react@19.0.0)) + optionalDependencies: + '@tanstack/query-core': 5.74.3 + typescript: 5.7.3 + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + + '@walletconnect/core@2.19.2(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)': + 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(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@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.2 + '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/environment@1.0.1': + dependencies: + tslib: 1.14.1 + + '@walletconnect/ethereum-provider@2.19.2(@types/react@19.1.2)(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)': + dependencies: + '@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/modal': 2.7.0(@types/react@19.1.2)(react@19.0.0) + '@walletconnect/sign-client': 2.19.2(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@walletconnect/types': 2.19.2 + '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/events@1.0.1': + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + + '@walletconnect/heartbeat@1.2.2': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-http-connection@1.0.8': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + cross-fetch: 3.2.0 + events: 3.3.0 + transitivePeerDependencies: + - encoding + + '@walletconnect/jsonrpc-provider@1.0.14': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-types@1.0.4': + dependencies: + events: 3.3.0 + keyvaluestorage-interface: 1.0.0 + + '@walletconnect/jsonrpc-utils@1.0.8': + dependencies: + '@walletconnect/environment': 1.0.1 + '@walletconnect/jsonrpc-types': 1.0.4 + tslib: 1.14.1 + + '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@walletconnect/keyvaluestorage@1.1.1': + dependencies: + '@walletconnect/safe-json': 1.0.2 + idb-keyval: 6.2.1 + unstorage: 1.16.0(idb-keyval@6.2.1) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/logger@2.1.2': + dependencies: + '@walletconnect/safe-json': 1.0.2 + pino: 7.11.0 + + '@walletconnect/modal-core@2.7.0(@types/react@19.1.2)(react@19.0.0)': + dependencies: + valtio: 1.11.2(@types/react@19.1.2)(react@19.0.0) + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/modal-ui@2.7.0(@types/react@19.1.2)(react@19.0.0)': + dependencies: + '@walletconnect/modal-core': 2.7.0(@types/react@19.1.2)(react@19.0.0) + lit: 2.8.0 + motion: 10.16.2 + qrcode: 1.5.3 + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/modal@2.7.0(@types/react@19.1.2)(react@19.0.0)': + dependencies: + '@walletconnect/modal-core': 2.7.0(@types/react@19.1.2)(react@19.0.0) + '@walletconnect/modal-ui': 2.7.0(@types/react@19.1.2)(react@19.0.0) + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/relay-api@1.0.11': + dependencies: + '@walletconnect/jsonrpc-types': 1.0.4 + + '@walletconnect/relay-auth@1.1.0': + dependencies: + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + uint8arrays: 3.1.0 + + '@walletconnect/safe-json@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/sign-client@2.19.2(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)': + dependencies: + '@walletconnect/core': 2.19.2(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@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.2 + '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod - '@vitest/pretty-format@3.1.2': + '@walletconnect/time@1.0.2': dependencies: - tinyrainbow: 2.0.0 + tslib: 1.14.1 - '@vitest/runner@3.1.2': + '@walletconnect/types@2.19.2': dependencies: - '@vitest/utils': 3.1.2 - pathe: 2.0.3 + '@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 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/universal-provider@2.19.2(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)': + 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.2(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + '@walletconnect/types': 2.19.2 + '@walletconnect/utils': 2.19.2(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + es-toolkit: 1.33.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod - '@vitest/snapshot@3.1.2': + '@walletconnect/utils@2.19.2(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)': dependencies: - '@vitest/pretty-format': 3.1.2 - magic-string: 0.30.17 - pathe: 2.0.3 + '@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.2 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.23.2(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod - '@vitest/spy@3.1.2': + '@walletconnect/window-getters@1.0.1': dependencies: - tinyspy: 3.0.2 + tslib: 1.14.1 - '@vitest/utils@3.1.2': + '@walletconnect/window-metadata@1.0.1': dependencies: - '@vitest/pretty-format': 3.1.2 - loupe: 3.1.3 - tinyrainbow: 2.0.0 + '@walletconnect/window-getters': 1.0.1 + tslib: 1.14.1 + + abitype@1.0.8(typescript@5.7.3)(zod@3.24.2): + optionalDependencies: + typescript: 5.7.3 + zod: 3.24.2 - abitype@1.0.8(typescript@5.8.3): + abitype@1.0.8(typescript@5.8.3)(zod@3.24.2): optionalDependencies: typescript: 5.8.3 + zod: 3.24.2 acorn-jsx@5.3.2(acorn@8.14.0): dependencies: @@ -4124,6 +9337,8 @@ snapshots: acorn@8.14.0: {} + aes-js@4.0.0-beta.5: {} + agent-base@7.1.1: dependencies: debug: 4.3.7(supports-color@5.5.0) @@ -4175,6 +9390,10 @@ snapshots: argparse@2.0.1: {} + aria-hidden@1.2.4: + dependencies: + tslib: 2.8.1 + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 @@ -4245,12 +9464,30 @@ snapshots: dependencies: tslib: 2.8.1 + async-mutex@0.2.6: + dependencies: + tslib: 2.8.1 + + atomic-sleep@1.0.0: {} + + autoprefixer@10.4.21(postcss@8.5.4): + dependencies: + browserslist: 4.24.4 + caniuse-lite: 1.0.30001720 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.4 + postcss-value-parser: 4.2.0 + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 balanced-match@1.0.2: {} + base-x@5.0.1: {} + base64-js@1.5.1: {} basic-ftp@5.0.5: {} @@ -4267,6 +9504,10 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + bn.js@5.2.1: {} + + bowser@2.11.0: {} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -4280,11 +9521,31 @@ snapshots: dependencies: fill-range: 7.1.1 + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001720 + electron-to-chromium: 1.5.144 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.4) + + bs58@6.0.0: + dependencies: + base-x: 5.0.1 + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bufferutil@4.0.9: + dependencies: + node-gyp-build: 4.8.4 + busboy@1.6.0: dependencies: streamsearch: 1.1.0 @@ -4293,6 +9554,11 @@ snapshots: cac@6.7.14: {} + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -4301,6 +9567,11 @@ snapshots: get-intrinsic: 1.2.4 set-function-length: 1.2.2 + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + callsites@3.1.0: {} camel-case@3.0.0: @@ -4308,8 +9579,12 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 + camelcase@5.3.1: {} + caniuse-lite@1.0.30001701: {} + caniuse-lite@1.0.30001720: {} + cbor2@1.12.0: {} chai@5.2.0: @@ -4357,6 +9632,12 @@ snapshots: upper-case: 1.1.3 upper-case-first: 1.1.2 + character-entities-legacy@1.1.4: {} + + character-entities@1.2.4: {} + + character-reference-invalid@1.1.4: {} + chardet@0.7.0: {} check-error@2.1.1: {} @@ -4373,8 +9654,18 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chownr@3.0.0: {} + ci-info@3.9.0: {} + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + clean-stack@2.2.0: {} cli-cursor@3.1.0: @@ -4387,6 +9678,12 @@ snapshots: client-only@0.0.1: {} + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -4395,6 +9692,10 @@ snapshots: clone@1.0.4: {} + clsx@1.2.1: {} + + clsx@2.1.1: {} + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -4419,6 +9720,8 @@ snapshots: color-string: 1.9.1 optional: true + comma-separated-tokens@1.0.8: {} + commander@10.0.1: {} concat-map@0.0.1: {} @@ -4440,16 +9743,46 @@ snapshots: snake-case: 2.1.0 upper-case: 1.1.3 + convert-source-map@2.0.0: {} + + cookie-es@1.2.2: {} + + cookie@1.0.2: {} + + copy-to-clipboard@3.3.3: + dependencies: + toggle-selection: 1.0.6 + core-js-pure@3.39.0: {} + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + create-require@1.1.1: {} + cross-fetch@3.2.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-fetch@4.1.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + crossws@0.3.4: + dependencies: + uncrypto: 0.1.3 + csstype@3.1.3: {} data-uri-to-buffer@6.0.2: {} @@ -4486,6 +9819,10 @@ snapshots: dependencies: ms: 2.1.3 + decamelize@1.2.0: {} + + decode-uri-component@0.2.2: {} + deep-eql@5.0.2: {} deep-extend@0.6.0: {} @@ -4508,6 +9845,8 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + defu@6.1.4: {} + degenerator@5.0.1: dependencies: ast-types: 0.13.4 @@ -4525,13 +9864,22 @@ snapshots: rimraf: 3.0.2 slash: 3.0.0 + destr@2.0.5: {} + + detect-browser@5.3.0: {} + detect-indent@6.1.0: {} - detect-libc@2.0.3: - optional: true + detect-libc@2.0.3: {} + + detect-libc@2.0.4: {} + + detect-node-es@1.1.0: {} diff@4.0.2: {} + dijkstrajs@1.0.3: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -4548,12 +9896,59 @@ snapshots: dotenv@16.4.7: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + eastasianwidth@0.2.0: {} + eciesjs@0.4.14: + dependencies: + '@ecies/ciphers': 0.2.3(@noble/ciphers@1.2.1) + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 + + electron-to-chromium@1.5.144: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} + encode-utf8@1.0.3: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + engine.io-client@6.6.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7(supports-color@5.5.0) + engine.io-parser: 5.2.3 + ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + engine.io-parser@5.2.3: {} + + enhanced-resolve@5.18.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -4614,6 +10009,8 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} + es-errors@1.3.0: {} es-iterator-helpers@1.2.0: @@ -4640,6 +10037,10 @@ snapshots: dependencies: es-errors: 1.3.0 + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 @@ -4656,33 +10057,61 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 - esbuild@0.25.0: + es-toolkit@1.33.0: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.25.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.0 - '@esbuild/android-arm': 0.25.0 - '@esbuild/android-arm64': 0.25.0 - '@esbuild/android-x64': 0.25.0 - '@esbuild/darwin-arm64': 0.25.0 - '@esbuild/darwin-x64': 0.25.0 - '@esbuild/freebsd-arm64': 0.25.0 - '@esbuild/freebsd-x64': 0.25.0 - '@esbuild/linux-arm': 0.25.0 - '@esbuild/linux-arm64': 0.25.0 - '@esbuild/linux-ia32': 0.25.0 - '@esbuild/linux-loong64': 0.25.0 - '@esbuild/linux-mips64el': 0.25.0 - '@esbuild/linux-ppc64': 0.25.0 - '@esbuild/linux-riscv64': 0.25.0 - '@esbuild/linux-s390x': 0.25.0 - '@esbuild/linux-x64': 0.25.0 - '@esbuild/netbsd-arm64': 0.25.0 - '@esbuild/netbsd-x64': 0.25.0 - '@esbuild/openbsd-arm64': 0.25.0 - '@esbuild/openbsd-x64': 0.25.0 - '@esbuild/sunos-x64': 0.25.0 - '@esbuild/win32-arm64': 0.25.0 - '@esbuild/win32-ia32': 0.25.0 - '@esbuild/win32-x64': 0.25.0 + '@esbuild/aix-ppc64': 0.25.2 + '@esbuild/android-arm': 0.25.2 + '@esbuild/android-arm64': 0.25.2 + '@esbuild/android-x64': 0.25.2 + '@esbuild/darwin-arm64': 0.25.2 + '@esbuild/darwin-x64': 0.25.2 + '@esbuild/freebsd-arm64': 0.25.2 + '@esbuild/freebsd-x64': 0.25.2 + '@esbuild/linux-arm': 0.25.2 + '@esbuild/linux-arm64': 0.25.2 + '@esbuild/linux-ia32': 0.25.2 + '@esbuild/linux-loong64': 0.25.2 + '@esbuild/linux-mips64el': 0.25.2 + '@esbuild/linux-ppc64': 0.25.2 + '@esbuild/linux-riscv64': 0.25.2 + '@esbuild/linux-s390x': 0.25.2 + '@esbuild/linux-x64': 0.25.2 + '@esbuild/netbsd-arm64': 0.25.2 + '@esbuild/netbsd-x64': 0.25.2 + '@esbuild/openbsd-arm64': 0.25.2 + '@esbuild/openbsd-x64': 0.25.2 + '@esbuild/sunos-x64': 0.25.2 + '@esbuild/win32-arm64': 0.25.2 + '@esbuild/win32-ia32': 0.25.2 + '@esbuild/win32-x64': 0.25.2 escalade@3.2.0: {} @@ -4698,17 +10127,60 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@9.1.0(eslint@9.15.0): + eslint-config-prettier@9.1.0(eslint@9.15.0(jiti@2.4.2)): dependencies: - eslint: 9.15.0 + eslint: 9.15.0(jiti@2.4.2) + + eslint-config-prettier@9.1.0(eslint@9.24.0(jiti@2.4.2)): + dependencies: + eslint: 9.24.0(jiti@2.4.2) eslint-plugin-only-warn@1.1.0: {} - eslint-plugin-react-hooks@5.0.0(eslint@9.15.0): + eslint-plugin-prettier@5.4.1(eslint-config-prettier@9.1.0(eslint@9.24.0(jiti@2.4.2)))(eslint@9.24.0(jiti@2.4.2))(prettier@3.5.3): + dependencies: + eslint: 9.24.0(jiti@2.4.2) + prettier: 3.5.3 + prettier-linter-helpers: 1.0.0 + synckit: 0.11.8 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@9.24.0(jiti@2.4.2)) + + eslint-plugin-react-hooks@5.0.0(eslint@9.15.0(jiti@2.4.2)): + dependencies: + eslint: 9.15.0(jiti@2.4.2) + + eslint-plugin-react-hooks@5.2.0(eslint@9.24.0(jiti@2.4.2)): + dependencies: + eslint: 9.24.0(jiti@2.4.2) + + eslint-plugin-react-refresh@0.4.19(eslint@9.24.0(jiti@2.4.2)): + dependencies: + eslint: 9.24.0(jiti@2.4.2) + + eslint-plugin-react@7.37.2(eslint@9.15.0(jiti@2.4.2)): dependencies: - eslint: 9.15.0 + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.0 + eslint: 9.15.0(jiti@2.4.2) + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.values: 1.2.0 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.11 + string.prototype.repeat: 1.0.0 - eslint-plugin-react@7.37.2(eslint@9.15.0): + eslint-plugin-react@7.37.2(eslint@9.24.0(jiti@2.4.2)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -4716,7 +10188,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.0 - eslint: 9.15.0 + eslint: 9.24.0(jiti@2.4.2) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -4730,23 +10202,33 @@ snapshots: string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.3.1(eslint@9.15.0): + eslint-plugin-turbo@2.3.1(eslint@9.15.0(jiti@2.4.2)): + dependencies: + dotenv: 16.0.3 + eslint: 9.15.0(jiti@2.4.2) + + eslint-plugin-turbo@2.3.1(eslint@9.24.0(jiti@2.4.2)): dependencies: dotenv: 16.0.3 - eslint: 9.15.0 + eslint: 9.24.0(jiti@2.4.2) eslint-scope@8.2.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-scope@8.3.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@4.2.0: {} - eslint@9.15.0: + eslint@9.15.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.0 '@eslint/core': 0.9.0 @@ -4780,6 +10262,50 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 + optionalDependencies: + jiti: 2.4.2 + transitivePeerDependencies: + - supports-color + + eslint@9.24.0(jiti@2.4.2): + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.24.0(jiti@2.4.2)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.20.0 + '@eslint/config-helpers': 0.2.1 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.24.0 + '@eslint/plugin-kit': 0.2.8 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.2 + '@types/estree': 1.0.7 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.3.7(supports-color@5.5.0) + escape-string-regexp: 4.0.0 + eslint-scope: 8.3.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.4.2 transitivePeerDependencies: - supports-color @@ -4803,12 +10329,63 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 esutils@2.0.3: {} + eth-block-tracker@7.1.0: + dependencies: + '@metamask/eth-json-rpc-provider': 1.0.1 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 5.0.2 + json-rpc-random-id: 1.0.1 + pify: 3.0.0 + transitivePeerDependencies: + - supports-color + + eth-json-rpc-filters@6.0.1: + dependencies: + '@metamask/safe-event-emitter': 3.1.2 + async-mutex: 0.2.6 + eth-query: 2.1.2 + json-rpc-engine: 6.1.0 + pify: 5.0.0 + + eth-query@2.1.2: + dependencies: + json-rpc-random-id: 1.0.1 + xtend: 4.0.2 + + eth-rpc-errors@4.0.3: + dependencies: + fast-safe-stringify: 2.1.1 + + ethereum-cryptography@2.2.1: + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 + + ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): + 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(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + eventemitter2@6.4.9: {} + eventemitter3@5.0.1: {} + events@3.3.0: {} + execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -4825,6 +10402,11 @@ snapshots: extendable-error@0.1.7: {} + extension-port-stream@3.0.0: + dependencies: + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 + external-editor@3.1.0: dependencies: chardet: 0.7.0 @@ -4835,6 +10417,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-diff@1.3.0: {} + fast-glob@3.3.1: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4855,10 +10439,18 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-redact@3.5.0: {} + + fast-safe-stringify@2.1.1: {} + fastq@1.17.1: dependencies: reusify: 1.0.4 + fault@1.0.4: + dependencies: + format: 0.2.2 + fdir@6.4.4(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -4875,6 +10467,8 @@ snapshots: dependencies: to-regex-range: 5.0.1 + filter-obj@1.1.0: {} + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -4901,6 +10495,19 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + format@0.2.2: {} + + fraction.js@4.3.7: {} + + framer-motion@12.7.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + motion-dom: 12.7.2 + motion-utils: 12.7.2 + tslib: 2.8.1 + optionalDependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 @@ -4941,6 +10548,8 @@ snapshots: functions-have-names@1.2.3: {} + gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} get-intrinsic@1.2.4: @@ -4951,6 +10560,26 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-nonce@1.0.1: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-stream@6.0.1: {} get-symbol-description@1.0.2: @@ -4994,10 +10623,14 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 + globals@11.12.0: {} + globals@14.0.0: {} globals@15.12.0: {} + globals@15.15.0: {} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -5027,6 +10660,8 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + gopd@1.2.0: {} + graceful-fs@4.2.11: {} gradient-string@2.0.2: @@ -5036,6 +10671,18 @@ snapshots: graphemer@1.4.0: {} + h3@1.15.3: + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.4 + defu: 6.1.4 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.0 + radix3: 1.1.2 + ufo: 1.6.1 + uncrypto: 0.1.3 + handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -5065,6 +10712,8 @@ snapshots: has-symbols@1.0.3: {} + has-symbols@1.1.0: {} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 @@ -5073,11 +10722,27 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-parse-selector@2.2.5: {} + + hastscript@6.0.0: + dependencies: + '@types/hast': 2.3.10 + comma-separated-tokens: 1.0.8 + hast-util-parse-selector: 2.2.5 + property-information: 5.6.0 + space-separated-tokens: 1.1.5 + header-case@1.0.1: dependencies: no-case: 2.3.2 upper-case: 1.1.3 + hey-listen@1.0.8: {} + + highlight.js@10.7.3: {} + + highlightjs-vue@1.0.0: {} + http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.1 @@ -5096,10 +10761,14 @@ snapshots: human-signals@2.1.0: {} + husky@9.1.7: {} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 + idb-keyval@6.2.1: {} + idb@7.1.1: {} ieee754@1.2.1: {} @@ -5171,6 +10840,20 @@ snapshots: jsbn: 1.1.0 sprintf-js: 1.1.3 + iron-webcrypto@1.2.1: {} + + is-alphabetical@1.0.4: {} + + is-alphanumerical@1.0.4: + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 @@ -5210,6 +10893,8 @@ snapshots: dependencies: has-tostringtag: 1.0.2 + is-decimal@1.0.4: {} + is-extglob@2.1.1: {} is-finalizationregistry@1.0.2: @@ -5226,6 +10911,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-hexadecimal@1.0.4: {} + is-interactive@1.0.0: {} is-lower-case@1.1.3: @@ -5294,12 +10981,29 @@ snapshots: is-windows@1.0.2: {} + isarray@1.0.0: {} + isarray@2.0.5: {} isbinaryfile@4.0.10: {} isexe@2.0.0: {} + isomorphic-fetch@3.0.0: + dependencies: + node-fetch: 2.7.0 + whatwg-fetch: 3.6.20 + transitivePeerDependencies: + - encoding + + isows@1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + isows@1.0.6(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + iterator.prototype@1.1.3: dependencies: define-properties: 1.2.1 @@ -5312,6 +11016,15 @@ snapshots: dependencies: '@isaacs/cliui': 8.0.2 + jiti@2.4.2: {} + + jotai@2.12.3(@types/react@19.1.2)(react@19.0.0): + optionalDependencies: + '@types/react': 19.1.2 + react: 19.0.0 + + js-base64@3.7.7: {} + js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -5325,12 +11038,23 @@ snapshots: jsbn@1.1.0: {} + jsesc@3.1.0: {} + json-buffer@3.0.1: {} + json-rpc-engine@6.1.0: + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + eth-rpc-errors: 4.0.3 + + json-rpc-random-id@1.0.1: {} + json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} + json5@2.2.3: {} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 @@ -5350,10 +11074,18 @@ snapshots: jwt-decode@4.0.0: {} + keccak@3.0.4: + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.8.4 + readable-stream: 3.6.2 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 + keyvaluestorage-interface@1.0.0: {} + lefthook-darwin-arm64@1.11.10: optional: true @@ -5402,6 +11134,112 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lightningcss-darwin-arm64@1.29.2: + optional: true + + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.29.2: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.29.2: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.29.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.29.2: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.29.2: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.29.2: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.29.2: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.29.2: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.29.2: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.29.2: + dependencies: + detect-libc: 2.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.29.2 + lightningcss-darwin-x64: 1.29.2 + lightningcss-freebsd-x64: 1.29.2 + lightningcss-linux-arm-gnueabihf: 1.29.2 + lightningcss-linux-arm64-gnu: 1.29.2 + lightningcss-linux-arm64-musl: 1.29.2 + lightningcss-linux-x64-gnu: 1.29.2 + lightningcss-linux-x64-musl: 1.29.2 + lightningcss-win32-arm64-msvc: 1.29.2 + lightningcss-win32-x64-msvc: 1.29.2 + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.0.4 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + + lit-element@3.3.3: + dependencies: + '@lit-labs/ssr-dom-shim': 1.3.0 + '@lit/reactive-element': 1.6.3 + lit-html: 2.8.0 + + lit-html@2.8.0: + dependencies: + '@types/trusted-types': 2.0.7 + + lit@2.8.0: + dependencies: + '@lit/reactive-element': 1.6.3 + lit-element: 3.3.3 + lit-html: 2.8.0 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -5439,20 +11277,39 @@ snapshots: lower-case@1.1.4: {} + lowlight@1.20.0: + dependencies: + fault: 1.0.4 + highlight.js: 10.7.3 + + lru-cache@10.4.3: {} + lru-cache@11.1.0: {} + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + lru-cache@7.18.3: {} + lucide-react@0.493.0(react@19.0.0): + dependencies: + react: 19.0.0 + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 make-error@1.3.6: {} + math-intrinsics@1.1.0: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} + micro-ftch@0.3.1: {} + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -5476,20 +11333,53 @@ snapshots: minipass@7.1.2: {} + minizlib@3.0.2: + dependencies: + minipass: 7.1.2 + + mipd@0.0.7(typescript@5.7.3): + optionalDependencies: + typescript: 5.7.3 + mkdirp@0.5.6: dependencies: minimist: 1.2.8 + mkdirp@3.0.1: {} + + motion-dom@12.7.2: + dependencies: + motion-utils: 12.7.2 + + motion-utils@12.7.2: {} + + motion@10.16.2: + dependencies: + '@motionone/animation': 10.18.0 + '@motionone/dom': 10.18.0 + '@motionone/svelte': 10.16.4 + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + '@motionone/vue': 10.16.4 + + motion@12.7.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + framer-motion: 12.7.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + tslib: 2.8.1 + optionalDependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + mri@1.2.0: {} ms@2.1.3: {} + multiformats@9.9.0: {} + mute-stream@0.0.8: {} nanoid@3.3.11: {} - nanoid@3.3.7: {} - natural-compare@1.4.0: {} neo-async@2.6.2: {} @@ -5525,6 +11415,18 @@ snapshots: dependencies: lower-case: 1.1.4 + node-addon-api@2.0.2: {} + + node-fetch-native@1.6.6: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-gyp-build@4.8.4: {} + + node-mock-http@1.0.0: {} + node-plop@0.26.3: dependencies: '@babel/runtime-corejs3': 7.26.0 @@ -5539,6 +11441,8 @@ snapshots: mkdirp: 0.5.6 resolve: 1.22.8 + node-releases@2.0.19: {} + nodemon@3.1.9: dependencies: chokidar: 3.6.0 @@ -5554,10 +11458,18 @@ snapshots: normalize-path@3.0.0: {} + normalize-range@0.1.2: {} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 + obj-multiplex@1.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + readable-stream: 2.3.8 + object-assign@4.1.1: {} object-inspect@1.13.3: {} @@ -5590,6 +11502,14 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 + ofetch@1.4.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.6 + ufo: 1.6.1 + + on-exit-leak-free@0.2.0: {} + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -5634,14 +11554,84 @@ snapshots: outdent@0.5.0: {} - ox@0.7.0(typescript@5.8.3): + ox@0.6.12(typescript@5.7.3)(zod@3.24.2): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.7.3)(zod@3.24.2) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - zod + + ox@0.6.7(typescript@5.7.3)(zod@3.24.2): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.7.3)(zod@3.24.2) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - zod + + ox@0.6.9(typescript@5.7.3)(zod@3.24.2): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.7.3)(zod@3.24.2) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - zod + + ox@0.6.9(typescript@5.8.3)(zod@3.24.2): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.8.3)(zod@3.24.2) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - zod + + ox@0.7.0(typescript@5.7.3)(zod@3.24.2): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.7.3)(zod@3.24.2) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - zod + + ox@0.7.0(typescript@5.8.3)(zod@3.24.2): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@scure/bip32': 1.6.2 '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.8.3) + abitype: 1.0.8(typescript@5.8.3)(zod@3.24.2) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.8.3 @@ -5706,6 +11696,15 @@ snapshots: dependencies: callsites: 3.1.0 + parse-entities@2.0.0: + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + pascal-case@2.0.1: dependencies: camel-case: 3.0.0 @@ -5740,22 +11739,53 @@ snapshots: picomatch@4.0.2: {} + pify@3.0.0: {} + pify@4.0.1: {} + pify@5.0.0: {} + + pino-abstract-transport@0.5.0: + dependencies: + duplexify: 4.1.3 + split2: 4.2.0 + + pino-std-serializers@4.0.0: {} + + pino@7.11.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 0.2.0 + pino-abstract-transport: 0.5.0 + pino-std-serializers: 4.0.0 + process-warning: 1.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.1.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 2.8.0 + thread-stream: 0.15.2 + pkijs@3.2.5: dependencies: - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.7.2 asn1js: 3.0.6 bytestreamjs: 2.0.1 pvtsutils: 1.3.6 pvutils: 1.1.3 tslib: 2.8.1 + pngjs@5.0.0: {} + + pony-cause@2.1.11: {} + possible-typed-array-names@1.0.0: {} + postcss-value-parser@4.2.0: {} + postcss@8.4.31: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -5765,18 +11795,42 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.4: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + preact@10.26.5: {} + prelude-ls@1.2.1: {} + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + prettier@2.8.8: {} prettier@3.5.3: {} + prismjs@1.27.0: {} + + prismjs@1.30.0: {} + + process-nextick-args@2.0.1: {} + + process-warning@1.0.0: {} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 + property-information@5.6.0: + dependencies: + xtend: 4.0.2 + proxy-agent@6.4.0: dependencies: agent-base: 7.1.1 @@ -5790,10 +11844,17 @@ snapshots: transitivePeerDependencies: - supports-color + proxy-compare@2.5.1: {} + proxy-from-env@1.1.0: {} pstree.remy@1.1.8: {} + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + punycode@2.3.1: {} pvtsutils@1.3.6: @@ -5802,8 +11863,30 @@ snapshots: pvutils@1.1.3: {} + qrcode.react@4.2.0(react@19.0.0): + dependencies: + react: 19.0.0 + + qrcode@1.5.3: + dependencies: + dijkstrajs: 1.0.3 + encode-utf8: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + + query-string@7.1.3: + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + queue-microtask@1.2.3: {} + quick-format-unescaped@4.0.4: {} + + radix3@1.1.2: {} + rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -5811,12 +11894,64 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-dom@19.0.0(react@19.0.0): + react-dom@19.0.0(react@19.0.0): + dependencies: + react: 19.0.0 + scheduler: 0.25.0 + + react-hook-form@7.55.0(react@19.0.0): + dependencies: + react: 19.0.0 + + react-is@16.13.1: {} + + react-refresh@0.17.0: {} + + react-remove-scroll-bar@2.3.8(@types/react@19.1.2)(react@19.0.0): + dependencies: + react: 19.0.0 + react-style-singleton: 2.2.3(@types/react@19.1.2)(react@19.0.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.2 + + react-remove-scroll@2.6.3(@types/react@19.1.2)(react@19.0.0): + dependencies: + react: 19.0.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.1.2)(react@19.0.0) + react-style-singleton: 2.2.3(@types/react@19.1.2)(react@19.0.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.1.2)(react@19.0.0) + use-sidecar: 1.1.3(@types/react@19.1.2)(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + + react-router@7.5.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + cookie: 1.0.2 + react: 19.0.0 + set-cookie-parser: 2.7.1 + turbo-stream: 2.4.0 + optionalDependencies: + react-dom: 19.0.0(react@19.0.0) + + react-style-singleton@2.2.3(@types/react@19.1.2)(react@19.0.0): dependencies: + get-nonce: 1.0.1 react: 19.0.0 - scheduler: 0.25.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.2 - react-is@16.13.1: {} + react-syntax-highlighter@15.6.1(react@19.0.0): + dependencies: + '@babel/runtime': 7.26.0 + highlight.js: 10.7.3 + highlightjs-vue: 1.0.0 + lowlight: 1.20.0 + prismjs: 1.30.0 + react: 19.0.0 + refractor: 3.6.0 react@19.0.0: {} @@ -5827,6 +11962,16 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -5837,6 +11982,10 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.1.2: {} + + real-require@0.1.0: {} + reflect.getprototypeof@1.0.6: dependencies: call-bind: 1.0.7 @@ -5847,6 +11996,12 @@ snapshots: globalthis: 1.0.4 which-builtin-type: 1.1.4 + refractor@3.6.0: + dependencies: + hastscript: 6.0.0 + parse-entities: 2.0.0 + prismjs: 1.27.0 + regenerator-runtime@0.14.1: {} regexp.prototype.flags@1.5.3: @@ -5867,6 +12022,8 @@ snapshots: require-directory@2.1.1: {} + require-main-filename@2.0.0: {} + resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -5946,6 +12103,8 @@ snapshots: has-symbols: 1.0.3 isarray: 2.0.5 + safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} safe-regex-test@1.0.3: @@ -5954,6 +12113,8 @@ snapshots: es-errors: 1.3.0 is-regex: 1.1.4 + safe-stable-stringify@2.5.0: {} + safer-buffer@2.1.2: {} scheduler@0.25.0: {} @@ -5962,11 +12123,17 @@ snapshots: semver@7.7.1: {} + semver@7.7.2: {} + sentence-case@2.1.1: dependencies: no-case: 2.3.2 upper-case-first: 1.1.2 + set-blocking@2.0.0: {} + + set-cookie-parser@2.7.1: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -5983,6 +12150,11 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + sha.js@2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + sharp@0.33.5: dependencies: color: 4.2.3 @@ -6048,6 +12220,24 @@ snapshots: dependencies: no-case: 2.3.2 + socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7(supports-color@5.5.0) + engine.io-client: 6.6.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + socks-proxy-agent@8.0.4: dependencies: agent-base: 7.1.1 @@ -6061,10 +12251,16 @@ snapshots: ip-address: 9.0.5 smart-buffer: 4.2.0 + sonic-boom@2.8.0: + dependencies: + atomic-sleep: 1.0.0 + source-map-js@1.2.1: {} source-map@0.6.1: {} + space-separated-tokens@1.1.5: {} + spawn-command@0.0.2: {} spawndamnit@3.0.1: @@ -6072,6 +12268,10 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + split-on-first@1.1.0: {} + + split2@4.2.0: {} + sprintf-js@1.0.3: {} sprintf-js@1.1.3: {} @@ -6080,8 +12280,12 @@ snapshots: std-env@3.9.0: {} + stream-shift@1.0.3: {} + streamsearch@1.1.0: {} + strict-uri-encode@2.0.0: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -6133,6 +12337,10 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -6158,6 +12366,8 @@ snapshots: client-only: 0.0.1 react: 19.0.0 + superstruct@1.0.4: {} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -6177,8 +12387,33 @@ snapshots: lower-case: 1.1.4 upper-case: 1.1.3 + synckit@0.11.8: + dependencies: + '@pkgr/core': 0.2.7 + + tailwind-merge@3.2.0: {} + + tailwindcss@4.1.4: {} + + tailwindcss@4.1.8: {} + + tapable@2.2.1: {} + + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.2 + mkdirp: 3.0.1 + yallist: 5.0.0 + term-size@2.2.1: {} + thread-stream@0.15.2: + dependencies: + real-require: 0.1.0 + through@2.3.8: {} tinybench@2.9.0: {} @@ -6216,14 +12451,22 @@ snapshots: dependencies: is-number: 7.0.0 + toggle-selection@1.0.6: {} + touch@3.1.1: {} + tr46@0.0.3: {} + tree-kill@1.2.2: {} ts-api-utils@1.4.0(typescript@5.7.3): dependencies: typescript: 5.7.3 + ts-api-utils@2.1.0(typescript@5.7.3): + dependencies: + typescript: 5.7.3 + ts-node@10.9.2(@types/node@20.17.6)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -6244,6 +12487,8 @@ snapshots: tslib@1.14.1: {} + tslib@2.7.0: {} + tslib@2.8.1: {} turbo-darwin-64@2.5.0: @@ -6258,6 +12503,8 @@ snapshots: turbo-linux-arm64@2.5.0: optional: true + turbo-stream@2.4.0: {} + turbo-windows-64@2.5.0: optional: true @@ -6312,26 +12559,42 @@ snapshots: possible-typed-array-names: 1.0.0 reflect.getprototypeof: 1.0.6 - typescript-eslint@8.15.0(eslint@9.15.0)(typescript@5.7.3): + typescript-eslint@8.15.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.7.3))(eslint@9.15.0)(typescript@5.7.3) - '@typescript-eslint/parser': 8.15.0(eslint@9.15.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.15.0(eslint@9.15.0)(typescript@5.7.3) - eslint: 9.15.0 + '@typescript-eslint/eslint-plugin': 8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.15.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.15.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.15.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.15.0(jiti@2.4.2) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: - supports-color + typescript-eslint@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.24.0(jiti@2.4.2) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + typescript@5.5.4: {} typescript@5.7.3: {} typescript@5.8.3: {} + ufo@1.6.1: {} + uglify-js@3.19.3: optional: true + uint8arrays@3.1.0: + dependencies: + multiformats: 9.9.0 + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 @@ -6339,16 +12602,39 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 + uncrypto@0.1.3: {} + undefsafe@2.0.5: {} undici-types@6.19.8: {} undici-types@6.20.0: {} + undici-types@6.21.0: {} + universalify@0.1.2: {} universalify@2.0.1: {} + unstorage@1.16.0(idb-keyval@6.2.1): + dependencies: + anymatch: 3.1.3 + chokidar: 4.0.3 + destr: 2.0.5 + h3: 1.15.3 + lru-cache: 10.4.3 + node-fetch-native: 1.6.6 + ofetch: 1.4.1 + ufo: 1.6.1 + optionalDependencies: + idb-keyval: 6.2.1 + + update-browserslist-db@1.1.3(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + update-check@1.5.4: dependencies: registry-auth-token: 3.3.2 @@ -6364,21 +12650,140 @@ snapshots: dependencies: punycode: 2.3.1 + use-callback-ref@1.3.3(@types/react@19.1.2)(react@19.0.0): + dependencies: + react: 19.0.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.2 + + use-sidecar@1.1.3(@types/react@19.1.2)(react@19.0.0): + dependencies: + detect-node-es: 1.1.0 + react: 19.0.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.2 + + use-sync-external-store@1.2.0(react@19.0.0): + dependencies: + react: 19.0.0 + + use-sync-external-store@1.4.0(react@19.0.0): + dependencies: + react: 19.0.0 + + utf-8-validate@5.0.10: + dependencies: + node-gyp-build: 4.8.4 + util-deprecate@1.0.2: {} + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.0.10 + is-typed-array: 1.1.13 + which-typed-array: 1.1.15 + uuid@11.1.0: {} + uuid@8.3.2: {} + + uuid@9.0.1: {} + v8-compile-cache-lib@3.0.1: {} validate-npm-package-name@5.0.1: {} - vite-node@3.1.2(@types/node@22.13.9): + valtio@1.11.2(@types/react@19.1.2)(react@19.0.0): + dependencies: + proxy-compare: 2.5.1 + use-sync-external-store: 1.2.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.1.2 + react: 19.0.0 + + viem@2.23.2(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2): + 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(typescript@5.7.3)(zod@3.24.2) + isows: 1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ox: 0.6.7(typescript@5.7.3)(zod@3.24.2) + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2): + dependencies: + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.7.3)(zod@3.24.2) + isows: 1.0.6(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ox: 0.6.9(typescript@5.7.3)(zod@3.24.2) + ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.28.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.24.2): + dependencies: + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.8.3)(zod@3.24.2) + isows: 1.0.6(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ox: 0.6.9(typescript@5.8.3)(zod@3.24.2) + ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + vite-node@3.1.2(@types/node@22.13.9)(jiti@2.4.2)(lightningcss@1.30.1): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + es-module-lexer: 1.6.0 + pathe: 2.0.3 + vite: 6.3.2(@types/node@22.13.9)(jiti@2.4.2)(lightningcss@1.30.1) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite-node@3.1.2(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.3.2(@types/node@22.13.9) + vite: 6.3.2(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1) transitivePeerDependencies: - '@types/node' - jiti @@ -6393,9 +12798,33 @@ snapshots: - tsx - yaml - vite@6.3.2(@types/node@22.13.9): + vite-plugin-css-injected-by-js@3.5.2(vite@5.4.19(@types/node@22.15.29)(lightningcss@1.30.1)): dependencies: - esbuild: 0.25.0 + vite: 5.4.19(@types/node@22.15.29)(lightningcss@1.30.1) + + vite@5.4.19(@types/node@22.13.9)(lightningcss@1.30.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.4 + rollup: 4.40.0 + optionalDependencies: + '@types/node': 22.13.9 + fsevents: 2.3.3 + lightningcss: 1.30.1 + + vite@5.4.19(@types/node@22.15.29)(lightningcss@1.30.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.4 + rollup: 4.40.0 + optionalDependencies: + '@types/node': 22.15.29 + fsevents: 2.3.3 + lightningcss: 1.30.1 + + vite@6.3.2(@types/node@22.13.9)(jiti@2.4.2)(lightningcss@1.30.1): + dependencies: + esbuild: 0.25.2 fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 postcss: 8.5.3 @@ -6404,11 +12833,27 @@ snapshots: optionalDependencies: '@types/node': 22.13.9 fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.30.1 + + vite@6.3.2(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1): + dependencies: + esbuild: 0.25.2 + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.3 + rollup: 4.40.0 + tinyglobby: 0.2.13 + optionalDependencies: + '@types/node': 22.15.29 + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.30.1 - vitest@3.1.2(@types/node@22.13.9)(happy-dom@13.10.1): + vitest@3.1.2(@types/debug@4.1.12)(@types/node@22.13.9)(happy-dom@13.10.1)(jiti@2.4.2)(lightningcss@1.30.1): dependencies: '@vitest/expect': 3.1.2 - '@vitest/mocker': 3.1.2(vite@6.3.2(@types/node@22.13.9)) + '@vitest/mocker': 3.1.2(vite@5.4.19(@types/node@22.13.9)(lightningcss@1.30.1)) '@vitest/pretty-format': 3.1.2 '@vitest/runner': 3.1.2 '@vitest/snapshot': 3.1.2 @@ -6425,10 +12870,11 @@ snapshots: tinyglobby: 0.2.13 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.3.2(@types/node@22.13.9) - vite-node: 3.1.2(@types/node@22.13.9) + vite: 5.4.19(@types/node@22.13.9)(lightningcss@1.30.1) + vite-node: 3.1.2(@types/node@22.13.9)(jiti@2.4.2)(lightningcss@1.30.1) why-is-node-running: 2.3.0 optionalDependencies: + '@types/debug': 4.1.12 '@types/node': 22.13.9 happy-dom: 13.10.1 transitivePeerDependencies: @@ -6445,14 +12891,104 @@ snapshots: - tsx - yaml + vitest@3.1.2(@types/debug@4.1.12)(@types/node@22.15.29)(happy-dom@13.10.1)(jiti@2.4.2)(lightningcss@1.30.1): + dependencies: + '@vitest/expect': 3.1.2 + '@vitest/mocker': 3.1.2(vite@5.4.19(@types/node@22.15.29)(lightningcss@1.30.1)) + '@vitest/pretty-format': 3.1.2 + '@vitest/runner': 3.1.2 + '@vitest/snapshot': 3.1.2 + '@vitest/spy': 3.1.2 + '@vitest/utils': 3.1.2 + chai: 5.2.0 + debug: 4.4.0 + expect-type: 1.2.1 + magic-string: 0.30.17 + pathe: 2.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.13 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 + vite: 5.4.19(@types/node@22.15.29)(lightningcss@1.30.1) + vite-node: 3.1.2(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 22.15.29 + happy-dom: 13.10.1 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + wagmi@2.15.0(@tanstack/query-core@5.74.3)(@tanstack/react-query@5.74.3(react@19.0.0))(@types/react@19.1.2)(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))(zod@3.24.2): + dependencies: + '@tanstack/react-query': 5.74.3(react@19.0.0) + '@wagmi/connectors': 5.7.13(@types/react@19.1.2)(@wagmi/core@2.17.0(@tanstack/query-core@5.74.3)(@types/react@19.1.2)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)))(bufferutil@4.0.9)(react@19.0.0)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))(zod@3.24.2) + '@wagmi/core': 2.17.0(@tanstack/query-core@5.74.3)(@types/react@19.1.2)(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)) + react: 19.0.0 + use-sync-external-store: 1.4.0(react@19.0.0) + viem: 2.28.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@tanstack/query-core' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - immer + - ioredis + - supports-color + - uploadthing + - utf-8-validate + - zod + wcwidth@1.0.1: dependencies: defaults: 1.0.4 + webextension-polyfill@0.10.0: {} + + webidl-conversions@3.0.1: {} + webidl-conversions@7.0.0: {} + whatwg-fetch@3.6.20: {} + whatwg-mimetype@3.0.0: {} + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 @@ -6483,6 +13019,8 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.3 + which-module@2.0.1: {} + which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 @@ -6524,10 +13062,59 @@ snapshots: wrappy@1.0.2: {} + ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + + ws@8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + + ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + + ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + + xmlhttprequest-ssl@2.1.2: {} + + xtend@4.0.2: {} + + y18n@4.0.3: {} + y18n@5.0.8: {} + yallist@3.1.1: {} + + yallist@5.0.0: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + yargs-parser@21.1.1: {} + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -6541,3 +13128,11 @@ snapshots: yn@3.1.1: {} yocto-queue@0.1.0: {} + + zod@3.24.2: {} + + zustand@5.0.0(@types/react@19.1.2)(react@19.0.0)(use-sync-external-store@1.4.0(react@19.0.0)): + optionalDependencies: + '@types/react': 19.1.2 + react: 19.0.0 + use-sync-external-store: 1.4.0(react@19.0.0)